Turn filter chips into links

This commit is contained in:
Jose Farias
2024-11-18 11:34:44 -06:00
parent 85e008e31d
commit 0995eee074
5 changed files with 34 additions and 33 deletions
+2 -3
View File
@@ -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
@@ -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
}
}
+7
View File
@@ -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
+9 -9
View File
@@ -10,33 +10,33 @@
<span class="for-screen-reader">Filter</span>
</button>
<%= 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? %>
<div class="flex-inline center align-center gap-half">
<%= 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 %>
</div>
</div>
<dialog class="filter__popup dialog panel fill-white shadow" data-dialog-target="dialog" data-dialog-modal-value="true">
+16
View File
@@ -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