Merge pull request #1091 from basecamp/fast-filter-expansion

Speed up filter expansion with turbo stream
This commit is contained in:
Jorge Manrubia
2025-09-12 13:12:18 +02:00
committed by GitHub
7 changed files with 53 additions and 41 deletions
+5 -1
View File
@@ -24,7 +24,11 @@ module FilterScoped
end
def set_user_filtering
@user_filtering = User::Filtering.new(Current.user, @filter, expanded: params[:expand_all])
@user_filtering = User::Filtering.new(Current.user, @filter, expanded: expanded_param)
end
def expanded_param
ActiveRecord::Type::Boolean.new.cast(params[:expand_all])
end
def enable_collection_filtering
@@ -0,0 +1,7 @@
class My::FilterExpansionsController < ApplicationController
include FilterScoped
def create
render turbo_stream: turbo_stream.replace("filter-settings", partial: "filters/settings", locals: { user_filtering: @user_filtering })
end
end
+9 -17
View File
@@ -1,17 +1,9 @@
<% cache user_filtering do %>
<aside class="filters flex align-center gap-half justify-center center margin-block-end">
<div class="flex-inline center align-center gap-half">
<%= render "filters/settings/terms", user_filtering: user_filtering %>
<%= render "filters/settings/sorted_by", user_filtering: user_filtering %>
<%= render "filters/settings/indexed_by", user_filtering: user_filtering %>
<%= render "filters/settings/tags", user_filtering: user_filtering %>
<%= render "filters/settings/assignees", user_filtering: user_filtering %>
<%= render "filters/settings/creators", user_filtering: user_filtering %>
<%= render "filters/settings/closers", user_filtering: user_filtering %>
<%= render "filters/settings/time_window", user_filtering: user_filtering, name: :creation, label: "Created" %>
<%= render "filters/settings/time_window", user_filtering: user_filtering, name: :closure, label: "Closed" %>
<%= render "filters/settings/toggle", user_filtering: user_filtering %>
<%= render "filters/settings/controls", user_filtering: user_filtering %>
</div>
</aside>
<% end %>
<aside id="filter-settings" class="filters flex align-center gap-half justify-center center margin-block-end">
<div class="flex-inline center align-center gap-half">
<%= render "filters/settings/terms", user_filtering: user_filtering %>
<%= render "filters/settings/controls", user_filtering: user_filtering %>
<%= render "filters/settings/toggle", user_filtering: user_filtering %>
<%= render "filters/settings/manage", user_filtering: user_filtering %>
</div>
</aside>
+8 -21
View File
@@ -1,21 +1,8 @@
<% filter = user_filtering.filter %>
<% if user_filtering.any? %>
<% if filter.persisted? %>
<%= button_to filter_path(filter), method: :delete, class: "btn txt-x-small btn--reversed", form_class: "inline" do %>
<%= icon_tag "bookmark-outline" %>
<span class="for-screen-reader">Remove saved filter</span>
<% end %>
<% else %>
<% filter_params = filter.as_params.transform_values { |v| v.respond_to?(:to_str) ? v.to_str : v } %>
<%= button_to filters_path, method: :post, params: filter_params, class: "btn txt-x-small", form_class: "inline" do %>
<%= icon_tag "bookmark-outline" %>
<span class="for-screen-reader">Save filter</span>
<% end %>
<% end %>
<%= link_to cards_path(filter.as_params.except(:assignee_ids, :assignment_status, :card_ids, :creator_ids, :closer_ids, :stage_ids, :tag_ids, :terms, :indexed_by, :sorted_by, :creation, :closure)), class: "btn btn--remove txt-x-small" do %>
<%= icon_tag "close" %>
<span class="for-screen-reader">Clear all</span>
<% end %>
<% end %>
<%= render "filters/settings/sorted_by", user_filtering: user_filtering %>
<%= render "filters/settings/indexed_by", user_filtering: user_filtering %>
<%= render "filters/settings/tags", user_filtering: user_filtering %>
<%= render "filters/settings/assignees", user_filtering: user_filtering %>
<%= render "filters/settings/creators", user_filtering: user_filtering %>
<%= render "filters/settings/closers", user_filtering: user_filtering %>
<%= render "filters/settings/time_window", user_filtering: user_filtering, name: :creation, label: "Created" %>
<%= render "filters/settings/time_window", user_filtering: user_filtering, name: :closure, label: "Closed" %>
@@ -0,0 +1,21 @@
<% filter = user_filtering.filter %>
<% if user_filtering.any? %>
<% if filter.persisted? %>
<%= button_to filter_path(filter), method: :delete, class: "btn txt-x-small btn--reversed", form_class: "inline" do %>
<%= icon_tag "bookmark-outline" %>
<span class="for-screen-reader">Remove saved filter</span>
<% end %>
<% else %>
<% filter_params = filter.as_params.transform_values { |v| v.respond_to?(:to_str) ? v.to_str : v } %>
<%= button_to filters_path, method: :post, params: filter_params, class: "btn txt-x-small", form_class: "inline" do %>
<%= icon_tag "bookmark-outline" %>
<span class="for-screen-reader">Save filter</span>
<% end %>
<% end %>
<%= link_to cards_path(filter.as_params.except(:assignee_ids, :assignment_status, :card_ids, :creator_ids, :closer_ids, :stage_ids, :tag_ids, :terms, :indexed_by, :sorted_by, :creation, :closure)), class: "btn btn--remove txt-x-small" do %>
<%= icon_tag "close" %>
<span class="for-screen-reader">Clear all</span>
<% end %>
<% end %>
+2 -2
View File
@@ -1,12 +1,12 @@
<% filter = user_filtering.filter %>
<% if user_filtering.expanded? %>
<%= link_to cards_path(filter.as_params), class: "btn txt-x-small btn--reversed", aria: { selected: true } do %>
<%= link_to my_filter_expansion_path(**filter.as_params, expand_all: false), class: "btn txt-x-small btn--reversed", aria: { selected: true }, data: { turbo_method: "post" } do %>
<%= icon_tag "filter" %>
<span class="for-screen-reader">Close filter options</span>
<% end %>
<% else %>
<%= link_to cards_path(filter.as_params.merge(expand_all: true)), class: "btn txt-x-small" do %>
<%= link_to my_filter_expansion_path(**filter.as_params, expand_all: true), class: "btn txt-x-small", data: { turbo_method: "post" } do %>
<%= icon_tag "filter" %>
<span class="for-screen-reader">Expand filter options</span>
<% end %>
+1
View File
@@ -125,6 +125,7 @@ Rails.application.routes.draw do
resources :pins
resource :timezone
resource :menu
resource :filter_expansion, only: %i[ create destroy ]
end
namespace :prompts do