Render each kind of filter in its own frame

This commit is contained in:
Jose Farias
2024-11-12 19:58:19 -06:00
parent d77eafe012
commit ec16237bf4
4 changed files with 46 additions and 15 deletions
+39 -9
View File
@@ -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
+2 -2
View File
@@ -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
+1 -1
View File
@@ -38,7 +38,7 @@
</button>
<%= 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 %>
</div>
@@ -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 %>