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 %> +