diff --git a/app/controllers/filters/save_toggle_refreshes_controller.rb b/app/controllers/filters/save_toggle_refreshes_controller.rb new file mode 100644 index 000000000..2c09e8e10 --- /dev/null +++ b/app/controllers/filters/save_toggle_refreshes_controller.rb @@ -0,0 +1,7 @@ +class Filters::SaveToggleRefreshesController < ApplicationController + include FilterScoped + + def create + turbo_stream.replace("filter-toggle", partial: "filters/filter_toggle", locals: { filter: @filter }) + end +end diff --git a/app/javascript/controllers/filter_settings_controller.js b/app/javascript/controllers/filter_settings_controller.js index 6646cfba7..73ec2fb4b 100644 --- a/app/javascript/controllers/filter_settings_controller.js +++ b/app/javascript/controllers/filter_settings_controller.js @@ -1,9 +1,11 @@ import { Controller } from "@hotwired/stimulus" import { debounce } from "helpers/timing_helpers"; +import { post } from "@rails/request.js" export default class extends Controller { static classes = ["filtersSet"] - static targets = ["field"] + static targets = ["field", "form"] + static values = { refreshSaveToggleUrl: String } initialize() { this.debouncedChange = debounce(this.change.bind(this), 50) @@ -15,6 +17,7 @@ export default class extends Controller { change() { this.#toggleFiltersSetClass() + this.#refreshSaveToggleButton() } async fieldTargetConnected(field) { @@ -42,4 +45,24 @@ export default class extends Controller { const comboboxContainer = field.closest("[data-combobox-default-value-value]") return comboboxContainer?.dataset?.comboboxDefaultValueValue } + + #refreshSaveToggleButton() { + post(this.refreshSaveToggleUrlValue, { + body: this.#collectFilterFormData(), + responseKind: "turbo-stream" + }) + } + + #collectFilterFormData() { + const formData = new FormData() + + this.formTargets.forEach(form => { + const hiddenFields = form.querySelectorAll('input[type="hidden"]:not([disabled])[name]') + hiddenFields.forEach(field => { + formData.append(field.name, field.value) + }) + }) + + return formData + } } diff --git a/app/views/filters/_settings.html.erb b/app/views/filters/_settings.html.erb index 66e856160..2b2e3e09e 100644 --- a/app/views/filters/_settings.html.erb +++ b/app/views/filters/_settings.html.erb @@ -1,7 +1,7 @@ <% cache user_filtering do %> <%= tag.aside id: "filter-settings", class: class_names("filters flex align-center gap-half justify-center center margin-block-end", { "filters--expanded": user_filtering.expanded? }), - data: { controller: "toggle-class filter-settings", toggle_class_toggle_class: "filters--expanded", filter_settings_filters_set_class: "filters--has-filters-set" } do %> + data: { controller: "toggle-class filter-settings", toggle_class_toggle_class: "filters--expanded", filter_settings_filters_set_class: "filters--has-filters-set", filter_settings_refresh_save_toggle_url_value: save_toggle_refresh_path } do %>