diff --git a/app/views/spree/admin/orders/_bulk_actions.html.haml b/app/views/spree/admin/orders/_bulk_actions.html.haml index 7351399aa7..7616334c1f 100644 --- a/app/views/spree/admin/orders/_bulk_actions.html.haml +++ b/app/views/spree/admin/orders/_bulk_actions.html.haml @@ -3,13 +3,13 @@ %span{ "data-controller": "checked-feedback", "data-checked-feedback-translation-value": "spree.admin.orders.index.selected" } = t("spree.admin.orders.index.selected", count: 0) - %button.plain.ofn-drop-down.disabled{ "data-checked-target": "disable" } + %div.plain.ofn-drop-down.disabled{ "data-checked-target": "disable", "data-controller": "dropdown", "data-action": "click->dropdown#toggle" } %span{ class: 'icon-reorder' } ="#{t('admin.actions')}".html_safe - %span.toggle-off.icon-caret-up - %span.toggle-on.icon-caret-down + %span + %i{ "data-dropdown-target": "arrow", "data-expanded-class": "icon-caret-up", "data-collapsed-class": "icon-caret-down" } - %div.menu.dropdown-content + %div.menu{ "data-dropdown-target": "menu" } %div.menu_item %span.name{ "data-controller": "modal-link", "data-action": "click->modal-link#open", "data-modal-link-target-value": "resend_confirmation" } = t('spree.admin.orders.index.resend_confirmation') diff --git a/app/webpacker/controllers/dropdown_controller.js b/app/webpacker/controllers/dropdown_controller.js index f84dca2ec3..19a3dc8b7a 100644 --- a/app/webpacker/controllers/dropdown_controller.js +++ b/app/webpacker/controllers/dropdown_controller.js @@ -4,10 +4,20 @@ export default class extends Controller { static targets = ["arrow", "menu"]; connect() { + this.collapsedClasses = this.arrowTarget.dataset.collapsedClass.split(" "); + this.expandedClasses = this.arrowTarget.dataset.expandedClass.split(" "); this.#hide(); + document.addEventListener("click", this.#onBodyClick.bind(this)); + } + + disconnect() { + document.removeEventListener("click", this.#onBodyClick); } toggle() { + if (this.element.classList.contains("disabled")) { + return; + } if (this.menuTarget.classList.contains("hidden")) { this.#show(); } else { @@ -15,14 +25,20 @@ export default class extends Controller { } } + #onBodyClick(event) { + if (!this.element.contains(event.target)) { + this.#hide(); + } + } + #show() { this.menuTarget.classList.remove("hidden"); - this.arrowTarget.classList.remove(this.arrowTarget.dataset.collapsedClass); - this.arrowTarget.classList.add(this.arrowTarget.dataset.expandedClass); + this.arrowTarget.classList.remove(...this.collapsedClasses); + this.arrowTarget.classList.add(...this.expandedClasses); } #hide() { this.menuTarget.classList.add("hidden"); - this.arrowTarget.classList.remove(this.arrowTarget.dataset.expandedClass); - this.arrowTarget.classList.add(this.arrowTarget.dataset.collapsedClass); + this.arrowTarget.classList.remove(...this.expandedClasses); + this.arrowTarget.classList.add(...this.collapsedClasses); } } diff --git a/app/webpacker/css/admin/dropdown.scss b/app/webpacker/css/admin/dropdown.scss index d3eab51beb..64c98e7ddf 100644 --- a/app/webpacker/css/admin/dropdown.scss +++ b/app/webpacker/css/admin/dropdown.scss @@ -20,14 +20,6 @@ .dropdown-content { display: inline-block; } - - .toggle-off { - display: inline-block; - } - - .toggle-on { - display: none; - } } } diff --git a/spec/javascripts/stimulus/dropdown_controller_test.js b/spec/javascripts/stimulus/dropdown_controller_test.js index c2e3079075..2f1bceaf4d 100644 --- a/spec/javascripts/stimulus/dropdown_controller_test.js +++ b/spec/javascripts/stimulus/dropdown_controller_test.js @@ -13,9 +13,9 @@ describe("Dropdown controller", () => { describe("Controller", () => { beforeEach(() => { - document.body.innerHTML = `