From 717f921a737f96765d0d3811b9bc479555841a47 Mon Sep 17 00:00:00 2001 From: Jorge Manrubia Date: Fri, 19 Sep 2025 18:37:02 +0200 Subject: [PATCH] Refresh save filter toggle when changing filter --- .../save_toggle_refreshes_controller.rb | 7 ++++++ .../controllers/filter_settings_controller.js | 25 ++++++++++++++++++- app/views/filters/_settings.html.erb | 2 +- app/views/filters/settings/_controls.html.erb | 2 +- app/views/filters/settings/_terms.html.erb | 2 +- config/routes.rb | 8 +++++- 6 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 app/controllers/filters/save_toggle_refreshes_controller.rb 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 %>
<%= render "filters/settings/terms", user_filtering: user_filtering %> <%= render "filters/settings/controls", user_filtering: user_filtering %> diff --git a/app/views/filters/settings/_controls.html.erb b/app/views/filters/settings/_controls.html.erb index d9d8c25c4..7470f4fa4 100644 --- a/app/views/filters/settings/_controls.html.erb +++ b/app/views/filters/settings/_controls.html.erb @@ -1,5 +1,5 @@ <%= form_with url: cards_path, method: :get, class: "flex-inline center align-center gap-half", - data: { controller: "form", turbo_frame: "card_columns", turbo_action: "advance" } do |form| %> + data: { controller: "form", turbo_frame: "card_columns", turbo_action: "advance", filter_settings_target: "form" } do |form| %> <%= hidden_field_tag :expand_all, true, disabled: !user_filtering.expanded?, data: { toggle_enable_target: "element" } %> <% user_filtering.filter.collections.each do |collection| %> <%= filter_hidden_field_tag "collection_ids[]", collection.id %> diff --git a/app/views/filters/settings/_terms.html.erb b/app/views/filters/settings/_terms.html.erb index 914bcd43c..12b522d20 100644 --- a/app/views/filters/settings/_terms.html.erb +++ b/app/views/filters/settings/_terms.html.erb @@ -1,6 +1,6 @@ <% filter = user_filtering.filter %> -<%= form_with url: cards_path, method: :get, class: "", data: { controller: "form", turbo_frame: "card_columns", action: "input->form#debouncedSubmit" } do |form| %> +<%= form_with url: cards_path, method: :get, class: "", data: { controller: "form", turbo_frame: "card_columns", action: "input->form#debouncedSubmit", filter_settings_target: "form" } do |form| %> <% filter.as_params.except(:terms).each do |key, value| %> <%= filter_hidden_field_tag key, value %> <% end %> diff --git a/config/routes.rb b/config/routes.rb index 608b2aafd..0823de4ee 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -81,7 +81,13 @@ Rails.application.routes.draw do resources :queries end - resources :filters + resources :filters do + scope module: :filters do + collection do + resource :save_toggle_refresh, only: :create + end + end + end resources :events, only: :index namespace :events do