diff --git a/app/views/admin/products_v3/_table.html.haml b/app/views/admin/products_v3/_table.html.haml index faf517bd3e..df1108a4df 100644 --- a/app/views/admin/products_v3/_table.html.haml +++ b/app/views/admin/products_v3/_table.html.haml @@ -106,7 +106,7 @@ = variant.on_demand ? t(:on_demand) : variant.on_hand %div.on-hand__popout{ style: 'display: none;', 'data-controller': 'toggle-control', 'data-popout-target': "dialog" } .field - = variant_form.number_field :on_hand, 'aria-label': t('admin.products_page.columns.on_hand'), 'data-toggle-control-target': 'control', disabled: variant_form.object.on_demand + = variant_form.number_field :on_hand, min: 0, 'aria-label': t('admin.products_page.columns.on_hand'), 'data-toggle-control-target': 'control', disabled: variant_form.object.on_demand = error_message_on variant, :on_hand .field.checkbox = variant_form.label :on_demand do diff --git a/app/webpacker/controllers/popout_controller.js b/app/webpacker/controllers/popout_controller.js index 0e430ce1a9..49530e7e26 100644 --- a/app/webpacker/controllers/popout_controller.js +++ b/app/webpacker/controllers/popout_controller.js @@ -42,6 +42,12 @@ export default class PopoutController extends Controller { close() { // Close if not already closed if (this.dialogTarget.style.display != "none") { + // Check every element for browser-side validation, before the fields get hidden. + if (!this.#enabledDisplayElements().every((element) => element.reportValidity())) { + // If any fail, don't close + return; + } + // Update button to represent any changes this.buttonTarget.innerText = this.#displayValue(); this.buttonTarget.classList.toggle("changed", this.#isChanged()); diff --git a/spec/javascripts/stimulus/popout_controller_test.js b/spec/javascripts/stimulus/popout_controller_test.js index 60b6f8ce89..c90e6a90ab 100644 --- a/spec/javascripts/stimulus/popout_controller_test.js +++ b/spec/javascripts/stimulus/popout_controller_test.js @@ -16,7 +16,7 @@ describe("PopoutController", () => {