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