From 7a916c295acf7643e0cfa7123922c22012fe4a6b Mon Sep 17 00:00:00 2001 From: Jorge Manrubia Date: Thu, 18 Sep 2025 16:24:25 +0200 Subject: [PATCH] Controlling the manage filter section with JS too --- app/assets/stylesheets/filters.css | 8 +++++ .../controllers/combobox_controller.js | 5 ++- .../controllers/filter_settings_controller.js | 36 +++++++++++++++++++ app/models/user/filtering.rb | 2 +- app/views/filters/_settings.html.erb | 2 +- .../filters/settings/_indexed_by.html.erb | 6 ++-- app/views/filters/settings/_manage.html.erb | 4 +-- .../filters/settings/_sorted_by.html.erb | 7 ++-- 8 files changed, 59 insertions(+), 11 deletions(-) create mode 100644 app/javascript/controllers/filter_settings_controller.js diff --git a/app/assets/stylesheets/filters.css b/app/assets/stylesheets/filters.css index 85721621e..a2141bbc6 100644 --- a/app/assets/stylesheets/filters.css +++ b/app/assets/stylesheets/filters.css @@ -138,5 +138,13 @@ display: block; } } + + .filters__manage { + display: none; + } + + .filters--has-filters-set .filters__manage { + display: inline-flex; + } } diff --git a/app/javascript/controllers/combobox_controller.js b/app/javascript/controllers/combobox_controller.js index 054f44c2f..7b6ab78ff 100644 --- a/app/javascript/controllers/combobox_controller.js +++ b/app/javascript/controllers/combobox_controller.js @@ -2,7 +2,10 @@ import { Controller } from "@hotwired/stimulus" export default class extends Controller { static targets = [ "label", "item", "hiddenField" ] - static values = { selectPropertyName: { type: String, default: "aria-checked" } } + static values = { + selectPropertyName: { type: String, default: "aria-checked" }, + defaultValue: String + } connect() { this.labelTarget.textContent = this.#selectedLabel diff --git a/app/javascript/controllers/filter_settings_controller.js b/app/javascript/controllers/filter_settings_controller.js new file mode 100644 index 000000000..ad7a709c0 --- /dev/null +++ b/app/javascript/controllers/filter_settings_controller.js @@ -0,0 +1,36 @@ +import { Controller } from "@hotwired/stimulus" + +export default class extends Controller { + static classes = ["filtersSet"] + static targets = ["field"] + + connect() { + this.change() + } + + change() { + this.#toggleFiltersSetClass() + } + + #toggleFiltersSetClass(shouldAdd) { + this.element.classList.toggle(this.filtersSetClass, this.#hasFiltersSet) + } + + get #hasFiltersSet() { + return this.fieldTargets.some(field => this.#isFieldSet(field)) + } + + #isFieldSet(field) { + const value = field.value?.trim() + + if (!value) return false + + const defaultValue = this.#defaultValueForField(field) + return defaultValue ? value !== defaultValue : true + } + + #defaultValueForField(field) { + const comboboxContainer = field.closest("[data-combobox-default-value]") + return comboboxContainer?.dataset?.comboboxDefaultValue + } +} diff --git a/app/models/user/filtering.rb b/app/models/user/filtering.rb index d0fddc962..9aecb8a24 100644 --- a/app/models/user/filtering.rb +++ b/app/models/user/filtering.rb @@ -3,7 +3,7 @@ class User::Filtering attr_reader :user, :filter, :expanded - delegate :as_params, :any?, :single_collection, to: :filter + delegate :as_params, :single_collection, to: :filter delegate :only_closed?, to: :filter def initialize(user, filter, expanded: false) diff --git a/app/views/filters/_settings.html.erb b/app/views/filters/_settings.html.erb index 6b2278817..66e856160 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", toggle_class_toggle_class: "filters--expanded" } do %> + data: { controller: "toggle-class filter-settings", toggle_class_toggle_class: "filters--expanded", filter_settings_filters_set_class: "filters--has-filters-set" } do %>
<%= render "filters/settings/terms", user_filtering: user_filtering %> <%= render "filters/settings/controls", user_filtering: user_filtering %> diff --git a/app/views/filters/settings/_indexed_by.html.erb b/app/views/filters/settings/_indexed_by.html.erb index 4f6ca033c..6ed39ef9b 100644 --- a/app/views/filters/settings/_indexed_by.html.erb +++ b/app/views/filters/settings/_indexed_by.html.erb @@ -1,13 +1,13 @@ <% filter = user_filtering.filter %> <%= tag.div class: class_names("quick-filter position-relative"), - data: { controller: "dialog combobox", action: "keydown.esc->dialog#close click@document->dialog#closeOnClickOutside", filter_show: user_filtering.show_indexed_by?, turbo_action: "advance" } do %> + data: { controller: "dialog combobox", action: "keydown.esc->dialog#close click@document->dialog#closeOnClickOutside", filter_show: user_filtering.show_indexed_by?, turbo_action: "advance", combobox_default_value: "all" } do %> - <%= hidden_field_tag :indexed_by, nil, data: { combobox_target: "hiddenField" } %> + <%= hidden_field_tag :indexed_by, nil, data: { combobox_target: "hiddenField", filter_settings_target: "field" } %> <%= filter_dialog "Filter by…" do %> Filter by… @@ -15,7 +15,7 @@