diff --git a/app/helpers/filters_helper.rb b/app/helpers/filters_helper.rb
index ff5a62e37..d853c5e13 100644
--- a/app/helpers/filters_helper.rb
+++ b/app/helpers/filters_helper.rb
@@ -1,89 +1,22 @@
module FiltersHelper
def filter_chip_id(value, name)
- "#{name}_filter--#{value}"
+ "#{name}__filter--#{value}"
end
- def filter_chip_frame_id(kind)
- "#{kind}_chips"
- end
-
- def filter_chips(filter, **)
- safe_join [
- chips_for_filter_kind(filter, :indexed_by, **),
- chips_for_filter_kind(filter, :tags, **),
- chips_for_filter_kind(filter, :assignees, **),
- chips_for_filter_kind(filter, :assigners, **),
- chips_for_filter_kind(filter, :buckets, **),
- chips_for_filter_kind(filter, :terms, **)
- ]
- end
-
- def filter_chips_for_editing(filter, **)
- safe_join [
- frame_for_filter_kind(filter, :indexed_by, **),
- frame_for_filter_kind(filter, :tags, **),
- frame_for_filter_kind(filter, :assignees, **),
- frame_for_filter_kind(filter, :assigners, **),
- frame_for_filter_kind(filter, :buckets, **),
- frame_for_filter_kind(filter, :terms, **)
- ]
- end
-
- def filter_chip_tag(display:, value:, name:, **options)
- tag.button id: filter_chip_id(value, name),
- class: [ "btn txt-small btn--remove", options.delete(:class) ],
+ def filter_chip_tag(text, name:, value:, **options)
+ tag.button id: filter_chip_id(value, name), class: [ "btn txt-small btn--remove", options.delete(:class) ],
data: { action: "filter-form#removeFilter form#submit", filter_form_target: "button" } do
concat hidden_field_tag(name, value, id: nil)
- concat tag.span(display)
+ concat tag.span(text)
concat image_tag("close.svg", aria: { hidden: true }, size: 24)
end
end
- def button_to_chip(text, kind:, object:, data: {})
- if object
- button_to text, filter_chips_path, method: :post, class: "btn btn--plain filter__button", params: chip_attrs(kind, object), data: data
+ def button_to_chip(text, params: {}, data: {})
+ if params.present?
+ button_to text, filter_chips_path, method: :post, class: "btn btn--plain filter__button", params: params, data: data
else
button_tag text, type: :button, class: "btn btn--plain filter__button", data: data
end
end
-
- private
- def chips_for_filter_kind(filter, kind, **)
- Array(filter.to_h[kind]).map do |value|
- if value.respond_to? :map
- safe_join value.map { |v| filter_chip_tag(**chip_attrs(kind, v), **) }
- else
- filter_chip_tag(**chip_attrs(kind, value), **)
- end
- end
- end
-
- def chip_attrs(kind, object)
- case kind&.to_sym
- when :tags
- [ object.hashtag, object.id, "tag_ids[]" ]
- when :buckets
- [ "in #{object.name}", object.id, "bucket_ids[]" ]
- when :assignees
- [ "for #{object.name}", object.id, "assignee_ids[]" ]
- when :assigners
- [ "by #{object.name}", object.id, "assigner_ids[]" ]
- when :indexed_by
- [ object.humanize, object, "indexed_by" ]
- when :assignments
- [ object.humanize, object, "assignments" ]
- when :terms
- [ %Q("#{object}"), object, "terms[]" ]
- end.then do |display, value, name|
- { display: display, value: value, name: name, frame: filter_chip_frame_id(kind) }
- end
- end
-
- def frame_for_filter_kind(filter, kind, **)
- chips_for_filter_kind(filter, kind, **).then do |chips|
- turbo_frame_tag filter_chip_frame_id(kind) do
- safe_join chips
- end
- end
- end
end
diff --git a/app/models/filter/fields.rb b/app/models/filter/fields.rb
index 085ead833..a1b385a06 100644
--- a/app/models/filter/fields.rb
+++ b/app/models/filter/fields.rb
@@ -5,7 +5,7 @@ module Filter::Fields
class_methods do
def default_fields
- { "indexed_by" => "most_active" }
+ { indexed_by: "most_active" }
end
end
@@ -13,7 +13,7 @@ module Filter::Fields
store_accessor :fields, :indexed_by, :assignments, :terms
def indexed_by
- (super || default_fields["indexed_by"]).inquiry
+ (super || default_fields[:indexed_by]).inquiry
end
def assignments
diff --git a/app/models/filter/params.rb b/app/models/filter/params.rb
index 1b256af53..6591edc5b 100644
--- a/app/models/filter/params.rb
+++ b/app/models/filter/params.rb
@@ -8,24 +8,16 @@ module Filter::Params
end
def as_params
- @as_params ||= to_h.dup.tap do |h|
- h["tag_ids"] = h.delete("tags")&.ids
- h["bucket_ids"] = h.delete("buckets")&.ids
- h["assignee_ids"] = h.delete("assignees")&.ids
- end.compact_blank.with_indifferent_access
- end
-
- def to_h
- @to_h ||= {}.tap do |h|
- h["tags"] = tags
- h["terms"] = terms
- h["buckets"] = buckets
- h["assignees"] = assignees
- h["indexed_by"] = indexed_by
- h["assignments"] = assignments
- end.reject do |k, v|
- default_fields[k] == v
- end.compact_blank.with_indifferent_access
+ @as_params ||= {
+ terms: terms,
+ tag_ids: tags.ids,
+ assignees: assignees,
+ indexed_by: indexed_by,
+ bucket_ids: buckets.ids,
+ assignments: assignments,
+ assignee_ids: assignees.ids,
+ assigner_ids: assigners.ids
+ }.reject { |k, v| default_fields[k] == v }.compact_blank
end
def to_params
diff --git a/app/models/filter/resources.rb b/app/models/filter/resources.rb
index d7cc35e2e..78c862c9d 100644
--- a/app/models/filter/resources.rb
+++ b/app/models/filter/resources.rb
@@ -5,6 +5,7 @@ module Filter::Resources
has_and_belongs_to_many :tags
has_and_belongs_to_many :buckets
has_and_belongs_to_many :assignees, class_name: "User", join_table: "assignees_filters", association_foreign_key: "assignee_id"
+ has_and_belongs_to_many :assigners, class_name: "User", join_table: "assigners_filters", association_foreign_key: "assigner_id"
end
def resource_removed(resource)
diff --git a/app/views/bubbles/_filters.html.erb b/app/views/bubbles/_filters.html.erb
index e74608e23..d8629cef5 100644
--- a/app/views/bubbles/_filters.html.erb
+++ b/app/views/bubbles/_filters.html.erb
@@ -10,7 +10,31 @@
<%= form_with url: bubbles_path, method: :get, class: "flex-inline center align-center gap-half", data: { controller: "form" } do %>
- <%= filter_chips filter %>
+ <%= filter_chip_tag filter.indexed_by.humanize, name: "indexed_by", value: filter.indexed_by %>
+
+ <% filter.tags.each do |tag| %>
+ <%= filter_chip_tag tag.hashtag, name: "tag_ids[]", value: tag.id %>
+ <% end %>
+
+ <% filter.assignees.each do |assignee| %>
+ <%= filter_chip_tag "for #{assignee.name}", name: "assignee_ids[]", value: assignee.id %>
+ <% end %>
+
+ <% if filter.assignments.present? %>
+ <%= filter_chip_tag filter.assignments.humanize, name: "assignments", value: filter.assignments %>
+ <% end %>
+
+ <% filter.assigners.each do |assigner| %>
+ <%= filter_chip_tag "by #{assigner.name}", name: "assigner_ids[]", value: assigner.id %>
+ <% end %>
+
+ <% filter.buckets.each do |bucket| %>
+ <%= filter_chip_tag "in #{bucket.name}", name: "bucket_ids[]", value: bucket.id %>
+ <% end %>
+
+ <% filter.terms.each do |term| %>
+ <%= filter_chip_tag %Q("#{term}"), name: "terms[]", value: term %>
+ <% end %>
<% end %>
@@ -38,13 +62,50 @@
<%= form_with url: bubbles_path, id: :filter_form, method: :get, class: "flex-inline center align-center gap-half" do %>
- <%= filter_chips_for_editing filter, class: "fill-selected" %>
+ <%= turbo_frame_tag :indexed_by_chips do %>
+ <%= filter_chip_tag filter.indexed_by.humanize, name: "indexed_by", value: filter.indexed_by, class: "fill-selected" %>
+ <% end %>
+
+ <%= turbo_frame_tag :tag_chips do %>
+ <% filter.tags.each do |tag| %>
+ <%= filter_chip_tag tag.hashtag, name: "tag_ids[]", value: tag.id, class: "fill-selected" %>
+ <% end %>
+ <% end %>
+
+ <%= turbo_frame_tag :assignee_chips do %>
+ <% filter.assignees.each do |assignee| %>
+ <%= filter_chip_tag "for #{assignee.name}", name: "assignee_ids[]", value: assignee.id, class: "fill-selected" %>
+ <% end %>
+
+ <% if filter.assignments.present? %>
+ <%= filter_chip_tag filter.assignments.humanize, name: "assignments", value: filter.assignments, class: "fill-selected" %>
+ <% end %>
+ <% end %>
+
+ <%= turbo_frame_tag :assigner_chips do %>
+ <% filter.assigners.each do |assigner| %>
+ <%= filter_chip_tag "by #{assigner.name}", name: "assigner_ids[]", value: assigner.id, class: "fill-selected" %>
+ <% end %>
+ <% end %>
+
+ <%= turbo_frame_tag :bucket_chips do %>
+ <% filter.buckets.each do |bucket| %>
+ <%= filter_chip_tag "in #{bucket.name}", name: "bucket_ids[]", value: bucket.id, class: "fill-selected" %>
+ <% end %>
+ <% end %>
+
+ <%= turbo_frame_tag :terms_chips do %>
+ <% filter.terms.each do |term| %>
+ <%= filter_chip_tag %Q("#{term}"), name: "terms[]", value: term, class: "fill-selected" %>
+ <% end %>
+ <% end %>
<% end %>
<%= form_with url: filter_chips_path, method: :post, class: "flex gap flex-item-grow align-center justify-center full-width center margin-block" do %>
<%= hidden_field_tag :name, "terms[]" %>
- <%= hidden_field_tag :frame, filter_chip_frame_id(:terms) %>
+ <%= hidden_field_tag :frame, :terms_chips %>
+