diff --git a/app/views/admin/order_cycles/checkout_options.html.haml b/app/views/admin/order_cycles/checkout_options.html.haml index 4c3dc61cbc..32eb731895 100644 --- a/app/views/admin/order_cycles/checkout_options.html.haml +++ b/app/views/admin/order_cycles/checkout_options.html.haml @@ -22,16 +22,22 @@ %th{ colspan: 2 }= t('.shipping_methods') - @order_cycle.distributors.each do |distributor| - distributor_shipping_methods = @order_cycle.attachable_distributor_shipping_methods.where("distributor_id = ?", distributor.id).includes(:shipping_method) - %tr - %td + %tr{ "data-controller": "select-all" } + %td.text-center + - if distributor_shipping_methods.many? + %label + = check_box_tag nil, nil, nil, { "data-action": "change->select-all#toggleAll", "data-select-all-target": "all" } + = t(".select_all") %td %em= distributor.name - distributor_shipping_methods.each do |distributor_shipping_method| %p - %label{ class: ("disabled" unless distributor_shipping_method.shipping_method.frontend?) } + %label{ class: ("disabled" if distributor_shipping_methods.one? || !distributor_shipping_method.shipping_method.frontend?) } = check_box_tag "order_cycle[selected_distributor_shipping_method_ids][]", - distributor_shipping_method.id, @order_cycle.distributor_shipping_methods.include?(distributor_shipping_method), - id: "order_cycle_selected_distributor_shipping_method_ids_#{distributor_shipping_method.id}" + distributor_shipping_method.id, + @order_cycle.distributor_shipping_methods.include?(distributor_shipping_method), + id: "order_cycle_selected_distributor_shipping_method_ids_#{distributor_shipping_method.id}", + data: ({ "action" => "change->select-all#toggleCheckbox", "select-all-target" => "checkbox" } if distributor_shipping_method.shipping_method.frontend?) = distributor_shipping_method.shipping_method.name - distributor.shipping_methods.backend.each do |shipping_method| %label.disabled diff --git a/app/webpacker/controllers/select_all_controller.js b/app/webpacker/controllers/select_all_controller.js new file mode 100644 index 0000000000..30a00aee79 --- /dev/null +++ b/app/webpacker/controllers/select_all_controller.js @@ -0,0 +1,19 @@ +import { Controller } from "stimulus"; + +export default class extends Controller { + static targets = ["all", "checkbox"]; + + connect() { + this.toggleCheckbox() + } + + toggleAll() { + this.checkboxTargets.forEach(checkbox => { + checkbox.checked = this.allTarget.checked; + }); + } + + toggleCheckbox() { + this.allTarget.checked = this.checkboxTargets.every(checkbox => checkbox.checked); + } +} diff --git a/spec/javascripts/stimulus/select_all_controller_test.js b/spec/javascripts/stimulus/select_all_controller_test.js new file mode 100644 index 0000000000..f7a17b884f --- /dev/null +++ b/spec/javascripts/stimulus/select_all_controller_test.js @@ -0,0 +1,113 @@ +/** + * @jest-environment jsdom + */ + +import { Application } from "stimulus"; +import select_all_controller from "../../../app/webpacker/controllers/select_all_controller"; + +describe("SelectAllController", () => { + beforeAll(() => { + const application = Application.start(); + application.register("select-all", select_all_controller); + }); + + beforeEach(() => { + document.body.innerHTML = ` +