diff --git a/app/views/line_items/_line_item_fields.html.erb b/app/views/line_items/_line_item_fields.html.erb
index 9526fd8..cea0e13 100644
--- a/app/views/line_items/_line_item_fields.html.erb
+++ b/app/views/line_items/_line_item_fields.html.erb
@@ -23,9 +23,10 @@
- <%= f.number_field :unit_price,
- step: 0.01,
+ <%= f.text_field :unit_price,
class: "price-field",
+ inputmode: "decimal",
+ autocomplete: "off",
no_label: true,
disabled: readonly %>
|
diff --git a/assets/javascripts/blur.js b/assets/javascripts/blur.js
new file mode 100644
index 0000000..6983eb6
--- /dev/null
+++ b/assets/javascripts/blur.js
@@ -0,0 +1,33 @@
+function evaluateMathExpression(expr) {
+ if (!expr) return null;
+
+ // allow only digits, decimal, operators, parentheses, spaces
+ if (!/^[0-9+\-*/().\s]+$/.test(expr)) {
+ return null;
+ }
+
+ try {
+ return Function('"use strict"; return (' + expr + ')')();
+ } catch {
+ return null;
+ }
+}
+
+document.addEventListener("blur", function(e) {
+
+ if (!e.target.classList.contains("price-field")) return;
+
+ const field = e.target;
+ const value = field.value.trim();
+
+ const result = evaluateMathExpression(value);
+
+ if (result !== null && !isNaN(result)) {
+ field.value = Number(result).toFixed(2);
+ }
+
+ if (typeof updateLineItemTotals === "function") {
+ updateLineItemTotals();
+ }
+
+}, true);
\ No newline at end of file
diff --git a/lib/redmine_qbo_line_items/hooks/view_hook_listener.rb b/lib/redmine_qbo_line_items/hooks/view_hook_listener.rb
index 5a4b076..f4fbba9 100644
--- a/lib/redmine_qbo_line_items/hooks/view_hook_listener.rb
+++ b/lib/redmine_qbo_line_items/hooks/view_hook_listener.rb
@@ -19,6 +19,7 @@ module RedmineQboLineItems
javascript_include_tag( 'nested_form_controller', plugin: :redmine_qbo_lineitems),
javascript_include_tag("line_items", plugin: :redmine_qbo_lineitems),
javascript_include_tag("autocomplete", plugin: :redmine_qbo_lineitems),
+ javascript_include_tag("blur", plugin: :redmine_qbo_lineitems),
stylesheet_link_tag("line_items", plugin: :redmine_qbo_lineitems)
])
end