From 0995eee074e26b42aa6acf72537aab8ac194b989 Mon Sep 17 00:00:00 2001 From: Jose Farias Date: Mon, 18 Nov 2024 11:34:44 -0600 Subject: [PATCH] Turn filter chips into links --- app/helpers/filters_helper.rb | 5 ++--- .../controllers/filter_form_controller.js | 21 ------------------- app/models/filter/params.rb | 7 +++++++ app/views/bubbles/_filters.html.erb | 18 ++++++++-------- test/models/filter_test.rb | 16 ++++++++++++++ 5 files changed, 34 insertions(+), 33 deletions(-) diff --git a/app/helpers/filters_helper.rb b/app/helpers/filters_helper.rb index 2434df901..e16c63c69 100644 --- a/app/helpers/filters_helper.rb +++ b/app/helpers/filters_helper.rb @@ -1,7 +1,6 @@ module FiltersHelper - def filter_chip_tag(text, name:, value:) - tag.button class: "btn txt-small btn--remove", data: { action: "filter-form#removeFilter form#submit", filter_form_target: "chip" } do - concat hidden_field_tag(name, value, id: nil) + def filter_chip_tag(text, name:, value:, filter:) + link_to bubbles_path(**filter.params_without(name, value)), class: "btn txt-small btn--remove" do concat tag.span(text) concat image_tag("close.svg", aria: { hidden: true }, size: 24) end diff --git a/app/javascript/controllers/filter_form_controller.js b/app/javascript/controllers/filter_form_controller.js index 3e54f5837..30610f450 100644 --- a/app/javascript/controllers/filter_form_controller.js +++ b/app/javascript/controllers/filter_form_controller.js @@ -1,17 +1,6 @@ import { Controller } from "@hotwired/stimulus" export default class extends Controller { - static targets = [ "chip" ] - - connect() { - this.chipTargets.forEach(button => this.#showChip(button)) - } - - removeFilter(event) { - event.preventDefault() - this.#hideChip(event.target.closest("button")) - } - clearCategory({ params: { name } }) { name.split(",").forEach(name => { this.element.querySelectorAll(`input[name="${name}"]`).forEach(input => { @@ -19,14 +8,4 @@ export default class extends Controller { }) }) } - - #showChip(button) { - button.querySelector("input").disabled = false - button.hidden = false - } - - #hideChip(button) { - button.querySelector("input").disabled = true - button.hidden = true - } } diff --git a/app/models/filter/params.rb b/app/models/filter/params.rb index 71be9eb85..69cd07bb4 100644 --- a/app/models/filter/params.rb +++ b/app/models/filter/params.rb @@ -24,4 +24,11 @@ module Filter::Params params[:filter_id] = id if persisted? end end + + def params_without(name, value) + to_params.tap do |params| + params[name].delete(value) if params[name].is_a?(Array) + params.delete(name) if params[name] == value + end + end end diff --git a/app/views/bubbles/_filters.html.erb b/app/views/bubbles/_filters.html.erb index e03c698bf..6e9d6592f 100644 --- a/app/views/bubbles/_filters.html.erb +++ b/app/views/bubbles/_filters.html.erb @@ -10,33 +10,33 @@ Filter - <%= form_with url: bubbles_path, method: :get, class: "flex-inline center align-center gap-half", data: { controller: "form" } do %> - <%= filter_chip_tag filter.indexed_by.humanize, name: "indexed_by", value: filter.indexed_by unless filter.default_indexed_by? %> +
+ <%= filter_chip_tag filter.indexed_by.humanize, name: :indexed_by, value: filter.indexed_by, filter: filter unless filter.default_indexed_by? %> <% filter.tags.each do |tag| %> - <%= filter_chip_tag tag.hashtag, name: "tag_ids[]", value: tag.id %> + <%= filter_chip_tag tag.hashtag, name: :tag_ids, value: tag.id, filter: filter %> <% end %> <% filter.assignees.each do |assignee| %> - <%= filter_chip_tag "for #{assignee.name}", name: "assignee_ids[]", value: assignee.id %> + <%= filter_chip_tag "for #{assignee.name}", name: :assignee_ids, value: assignee.id, filter: filter %> <% end %> <% if filter.assignments.present? %> - <%= filter_chip_tag filter.assignments.humanize, name: "assignments", value: filter.assignments %> + <%= filter_chip_tag filter.assignments.humanize, name: :assignments, value: filter.assignments, filter: filter %> <% end %> <% filter.assigners.each do |assigner| %> - <%= filter_chip_tag "by #{assigner.name}", name: "assigner_ids[]", value: assigner.id %> + <%= filter_chip_tag "by #{assigner.name}", name: :assigner_ids, value: assigner.id, filter: filter %> <% end %> <% filter.buckets.each do |bucket| %> - <%= filter_chip_tag "in #{bucket.name}", name: "bucket_ids[]", value: bucket.id %> + <%= filter_chip_tag "in #{bucket.name}", name: :bucket_ids, value: bucket.id, filter: filter %> <% end %> <% filter.terms.each do |term| %> - <%= filter_chip_tag %Q("#{term}"), name: "terms[]", value: term %> + <%= filter_chip_tag %Q("#{term}"), name: :terms, value: term, filter: filter %> <% end %> - <% end %> +
diff --git a/test/models/filter_test.rb b/test/models/filter_test.rb index 3b1ec136b..49d7c3167 100644 --- a/test/models/filter_test.rb +++ b/test/models/filter_test.rb @@ -99,4 +99,20 @@ class FilterTest < ActiveSupport::TestCase test "plain summary" do assert_equal "Most discussed, tagged #Mobile, and assigned to JZ in all projects", filters(:jz_assignments).plain_summary end + + test "params without a name-value pair" do + filter = users(:david).filters.new indexed_by: "most_discussed", assignee_ids: [ users(:jz).id, users(:kevin).id ] + + expected = { indexed_by: "most_discussed", assignee_ids: [ users(:kevin).id ] } + assert_equal expected.stringify_keys, filter.params_without(:assignee_ids, users(:jz).id).to_h + + expected = { assignee_ids: [ users(:jz).id, users(:kevin).id ] } + assert_equal expected.stringify_keys, filter.params_without(:indexed_by, "most_discussed").to_h + + expected = { indexed_by: "most_discussed", assignee_ids: [ users(:jz).id, users(:kevin).id ] } + assert_equal expected.stringify_keys, filter.params_without(:indexed_by, "most_active").to_h + + expected = { indexed_by: "most_discussed", assignee_ids: [ users(:jz).id, users(:kevin).id ] } + assert_equal expected.stringify_keys, filter.params_without(:assignee_ids, users(:david).id).to_h + end end