From ec16237bf49b11b93fa1b9490b232b6fe50ce4ba Mon Sep 17 00:00:00 2001 From: Jose Farias Date: Tue, 12 Nov 2024 19:58:19 -0600 Subject: [PATCH] Render each kind of filter in its own frame --- app/helpers/filters_helper.rb | 48 +++++++++++++++---- app/models/filter/params.rb | 4 +- app/views/bubbles/_filters.html.erb | 2 +- .../filter_chips/create.turbo_stream.erb | 7 +-- 4 files changed, 46 insertions(+), 15 deletions(-) diff --git a/app/helpers/filters_helper.rb b/app/helpers/filters_helper.rb index a6689350c..568c324e0 100644 --- a/app/helpers/filters_helper.rb +++ b/app/helpers/filters_helper.rb @@ -4,9 +4,25 @@ module FiltersHelper end def filter_chips(filter, **) - filter.to_h.map do |kind, object| - filter_chip_from kind, object, ** - end.join.html_safe + 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) @@ -28,11 +44,13 @@ module FiltersHelper end private - def filter_chip_from(kind, object, **) - if object.respond_to? :map - safe_join object.map { |o| filter_chip_tag(**chip_attrs(kind, o), **) } - else - filter_chip_tag(**chip_attrs(kind, object), **) + 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 @@ -53,7 +71,19 @@ module FiltersHelper when :terms [ %Q("#{object}"), object, "terms[]" ] end.then do |display, value, name| - { display: display, value: value, name: name } + { display: display, value: value, name: name, frame: filter_chip_frame(kind) } + end + end + + def filter_chip_frame(kind) + "#{kind}_chips" + end + + def frame_for_filter_kind(filter, kind, **) + chips_for_filter_kind(filter, kind, **).then do |chips| + turbo_frame_tag filter_chip_frame(kind) do + safe_join chips + end end end end diff --git a/app/models/filter/params.rb b/app/models/filter/params.rb index 6fe266b53..9baefc1f1 100644 --- a/app/models/filter/params.rb +++ b/app/models/filter/params.rb @@ -12,7 +12,7 @@ module Filter::Params h["tag_ids"] = h.delete("tags")&.ids h["bucket_ids"] = h.delete("buckets")&.ids h["assignee_ids"] = h.delete("assignees")&.ids - end.compact_blank + end.compact_blank.with_indifferent_access end def to_h @@ -25,7 +25,7 @@ module Filter::Params h["terms"] = terms end.reject do |k, v| default_fields[k] == v - end.compact_blank + end.compact_blank.with_indifferent_access end def to_params diff --git a/app/views/bubbles/_filters.html.erb b/app/views/bubbles/_filters.html.erb index be34a65a6..44593b37e 100644 --- a/app/views/bubbles/_filters.html.erb +++ b/app/views/bubbles/_filters.html.erb @@ -38,7 +38,7 @@ <%= form_with url: bubbles_path, id: :filter_form, method: :get, class: "flex-inline center align-center gap-half" do %> - <%= filter_chips filter, class: "fill-selected" %> + <%= filter_chips_for_editing filter, class: "fill-selected" %> <% end %> diff --git a/app/views/filter_chips/create.turbo_stream.erb b/app/views/filter_chips/create.turbo_stream.erb index 382e2ecb9..045a3eaee 100644 --- a/app/views/filter_chips/create.turbo_stream.erb +++ b/app/views/filter_chips/create.turbo_stream.erb @@ -1,6 +1,7 @@ +<% display = params[:display] || %Q("#{params[:value]}") %> + <%= turbo_stream.remove filter_chip_id(params[:value], params[:name]) %> -<%= turbo_stream.append :filter_form do %> - <%= filter_chip_tag display: params[:display] || %Q("#{params[:value]}"), - value: params[:value], name: params[:name], class: "fill-selected" %> +<%= turbo_stream.append params[:frame] do %> + <%= filter_chip_tag display: display, value: params[:value], name: params[:name], class: "fill-selected" %> <% end %>