From 0995eee074e26b42aa6acf72537aab8ac194b989 Mon Sep 17 00:00:00 2001 From: Jose Farias Date: Mon, 18 Nov 2024 11:34:44 -0600 Subject: [PATCH 1/6] 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 From 20d4319744ef0104f537239cae28cc1679bd676c Mon Sep 17 00:00:00 2001 From: Jose Farias Date: Mon, 18 Nov 2024 11:45:29 -0600 Subject: [PATCH 2/6] Pass params directly into filter chip helper --- app/helpers/filters_helper.rb | 4 ++-- app/views/bubbles/_filters.html.erb | 18 ++++++++++-------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/app/helpers/filters_helper.rb b/app/helpers/filters_helper.rb index e16c63c69..bc41459e5 100644 --- a/app/helpers/filters_helper.rb +++ b/app/helpers/filters_helper.rb @@ -1,6 +1,6 @@ module FiltersHelper - def filter_chip_tag(text, name:, value:, filter:) - link_to bubbles_path(**filter.params_without(name, value)), class: "btn txt-small btn--remove" do + def filter_chip_tag(text, **) + link_to bubbles_path(**), 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/views/bubbles/_filters.html.erb b/app/views/bubbles/_filters.html.erb index 6e9d6592f..1c8faed21 100644 --- a/app/views/bubbles/_filters.html.erb +++ b/app/views/bubbles/_filters.html.erb @@ -11,30 +11,32 @@
- <%= filter_chip_tag filter.indexed_by.humanize, name: :indexed_by, value: filter.indexed_by, filter: filter unless filter.default_indexed_by? %> + <%= filter_chip_tag filter.indexed_by.humanize, **filter.params_without(:indexed_by, filter.indexed_by) unless filter.default_indexed_by? %> <% filter.tags.each do |tag| %> - <%= filter_chip_tag tag.hashtag, name: :tag_ids, value: tag.id, filter: filter %> + <%= filter_chip_tag tag.hashtag, **filter.params_without(:tag_ids, tag.id) %> <% end %> <% filter.assignees.each do |assignee| %> - <%= filter_chip_tag "for #{assignee.name}", name: :assignee_ids, value: assignee.id, filter: filter %> + <%= filter_chip_tag "for #{assignee.name}", **filter.params_without(:assignee_ids, assignee.id) %> <% end %> <% if filter.assignments.present? %> - <%= filter_chip_tag filter.assignments.humanize, name: :assignments, value: filter.assignments, filter: filter %> + <%= filter_chip_tag filter.assignments.humanize, **filter.params_without(:assignments, filter.assignments) %> <% end %> <% filter.assigners.each do |assigner| %> - <%= filter_chip_tag "by #{assigner.name}", name: :assigner_ids, value: assigner.id, filter: filter %> + <%= filter_chip_tag "by #{assigner.name}", **filter.params_without(:assigner_ids, assigner.id) %> <% end %> - <% filter.buckets.each do |bucket| %> - <%= filter_chip_tag "in #{bucket.name}", name: :bucket_ids, value: bucket.id, filter: filter %> + <% if filter.buckets.many? %> + <% filter.buckets.each do |bucket| %> + <%= filter_chip_tag "in #{bucket.name}", **filter.params_without(:bucket_ids, bucket.id) %> + <% end %> <% end %> <% filter.terms.each do |term| %> - <%= filter_chip_tag %Q("#{term}"), name: :terms, value: term, filter: filter %> + <%= filter_chip_tag %Q("#{term}"), **filter.params_without(:terms, term) %> <% end %>
From f5a12ace68d210ddc195f28f34c0b0d408abca10 Mon Sep 17 00:00:00 2001 From: Jose Farias Date: Mon, 18 Nov 2024 11:48:28 -0600 Subject: [PATCH 3/6] Change title based on selected buckets --- app/views/bubbles/_filters.html.erb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/views/bubbles/_filters.html.erb b/app/views/bubbles/_filters.html.erb index 1c8faed21..51adf7a7f 100644 --- a/app/views/bubbles/_filters.html.erb +++ b/app/views/bubbles/_filters.html.erb @@ -1,7 +1,13 @@

- <%= filter.buckets.first&.name || "All projects" %> + <% if filter.buckets.none? %> + All projects + <% elsif filter.buckets.many? %> + <%= pluralize(filter.buckets.size, "project") %> + <% else %> + <%= filter.buckets.first.name %> + <% end %>

From 5c1f6dd5aad8215a8783a0c8fc0287a516ca9dce Mon Sep 17 00:00:00 2001 From: Jose Farias Date: Mon, 18 Nov 2024 11:49:20 -0600 Subject: [PATCH 4/6] Swap one? and many? branches --- app/views/bubbles/_filters.html.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/bubbles/_filters.html.erb b/app/views/bubbles/_filters.html.erb index 51adf7a7f..924ef9ddc 100644 --- a/app/views/bubbles/_filters.html.erb +++ b/app/views/bubbles/_filters.html.erb @@ -3,10 +3,10 @@

<% if filter.buckets.none? %> All projects - <% elsif filter.buckets.many? %> - <%= pluralize(filter.buckets.size, "project") %> - <% else %> + <% elsif filter.buckets.one? %> <%= filter.buckets.first.name %> + <% else %> + <%= pluralize(filter.buckets.size, "project") %> <% end %>

From 3d34bc05122810a1eef5e5bb6650265bd55d75cf Mon Sep 17 00:00:00 2001 From: Jose Farias Date: Mon, 18 Nov 2024 11:59:28 -0600 Subject: [PATCH 5/6] ** not required --- app/helpers/filters_helper.rb | 4 ++-- app/views/bubbles/_filters.html.erb | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/helpers/filters_helper.rb b/app/helpers/filters_helper.rb index bc41459e5..13413280b 100644 --- a/app/helpers/filters_helper.rb +++ b/app/helpers/filters_helper.rb @@ -1,6 +1,6 @@ module FiltersHelper - def filter_chip_tag(text, **) - link_to bubbles_path(**), class: "btn txt-small btn--remove" do + def filter_chip_tag(text, params) + link_to bubbles_path(params), 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/views/bubbles/_filters.html.erb b/app/views/bubbles/_filters.html.erb index 924ef9ddc..36528da16 100644 --- a/app/views/bubbles/_filters.html.erb +++ b/app/views/bubbles/_filters.html.erb @@ -17,32 +17,32 @@
- <%= filter_chip_tag filter.indexed_by.humanize, **filter.params_without(:indexed_by, filter.indexed_by) unless filter.default_indexed_by? %> + <%= filter_chip_tag filter.indexed_by.humanize, filter.params_without(:indexed_by, filter.indexed_by) unless filter.default_indexed_by? %> <% filter.tags.each do |tag| %> - <%= filter_chip_tag tag.hashtag, **filter.params_without(:tag_ids, tag.id) %> + <%= filter_chip_tag tag.hashtag, filter.params_without(:tag_ids, tag.id) %> <% end %> <% filter.assignees.each do |assignee| %> - <%= filter_chip_tag "for #{assignee.name}", **filter.params_without(:assignee_ids, assignee.id) %> + <%= filter_chip_tag "for #{assignee.name}", filter.params_without(:assignee_ids, assignee.id) %> <% end %> <% if filter.assignments.present? %> - <%= filter_chip_tag filter.assignments.humanize, **filter.params_without(:assignments, filter.assignments) %> + <%= filter_chip_tag filter.assignments.humanize, filter.params_without(:assignments, filter.assignments) %> <% end %> <% filter.assigners.each do |assigner| %> - <%= filter_chip_tag "by #{assigner.name}", **filter.params_without(:assigner_ids, assigner.id) %> + <%= filter_chip_tag "by #{assigner.name}", filter.params_without(:assigner_ids, assigner.id) %> <% end %> <% if filter.buckets.many? %> <% filter.buckets.each do |bucket| %> - <%= filter_chip_tag "in #{bucket.name}", **filter.params_without(:bucket_ids, bucket.id) %> + <%= filter_chip_tag "in #{bucket.name}", filter.params_without(:bucket_ids, bucket.id) %> <% end %> <% end %> <% filter.terms.each do |term| %> - <%= filter_chip_tag %Q("#{term}"), **filter.params_without(:terms, term) %> + <%= filter_chip_tag %Q("#{term}"), filter.params_without(:terms, term) %> <% end %>
From 0c51129e1e98f38c1f9cf8feb8a440344a6a4e64 Mon Sep 17 00:00:00 2001 From: Jose Farias Date: Mon, 18 Nov 2024 12:04:52 -0600 Subject: [PATCH 6/6] name -> key --- app/models/filter/params.rb | 6 +++--- test/models/filter_test.rb | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/models/filter/params.rb b/app/models/filter/params.rb index 69cd07bb4..8938840eb 100644 --- a/app/models/filter/params.rb +++ b/app/models/filter/params.rb @@ -25,10 +25,10 @@ module Filter::Params end end - def params_without(name, value) + def params_without(key, value) to_params.tap do |params| - params[name].delete(value) if params[name].is_a?(Array) - params.delete(name) if params[name] == value + params[key].delete(value) if params[key].is_a?(Array) + params.delete(key) if params[key] == value end end end diff --git a/test/models/filter_test.rb b/test/models/filter_test.rb index 49d7c3167..4933f003b 100644 --- a/test/models/filter_test.rb +++ b/test/models/filter_test.rb @@ -100,7 +100,7 @@ class FilterTest < ActiveSupport::TestCase 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 + test "params without a key-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 ] }