Add caching and http caching to the cards index screen

This commit is contained in:
Jorge Manrubia
2025-09-09 12:05:16 +02:00
parent e3aabaafbf
commit 1366ccc8df
11 changed files with 42 additions and 31 deletions
+2
View File
@@ -15,6 +15,8 @@ class CardsController < ApplicationController
@on_deck = page_and_filter_for @filter.with(engagement_status: "on_deck"), per_page: PAGE_SIZE
@doing = page_and_filter_for @filter.with(engagement_status: "doing"), per_page: PAGE_SIZE
@closed = page_and_filter_for_closed_cards
fresh_when etag: [ @considering, @on_deck, @doing, @closed ].collect { it.page.records }
end
def create
+5 -1
View File
@@ -61,8 +61,12 @@ class Filter < ApplicationRecord
ActiveSupport::Cache.expand_cache_key [ params_digest ], "filter"
end
def only_closed?
indexed_by.closed? || closure_window || closers.present?
end
private
def include_closed_cards?
indexed_by.closed? || closure_window || closers.present? || card_ids.present?
only_closed? || card_ids.present?
end
end
+1 -1
View File
@@ -45,7 +45,7 @@ module Filter::Params
# +as_params+ uses `resource#ids` instead of `#resource_ids`
# because the latter won't work on unpersisted filters.
def as_params
{}.tap do |params|
@as_params ||= {}.tap do |params|
params[:indexed_by] = indexed_by
params[:sorted_by] = sorted_by
params[:engagement_status] = engagement_status
+1
View File
@@ -4,6 +4,7 @@ class User::Filtering
attr_reader :user, :filter, :expanded
delegate :as_params, :any?, to: :filter
delegate :only_closed?, to: :filter
def initialize(user, filter, expanded: false)
@user, @filter, @expanded = user, filter, expanded
+1 -10
View File
@@ -40,15 +40,6 @@
dragover->drag-and-drop#dragOver
drop->drag-and-drop#drop
dragend->drag-and-drop#dragEnd" } do %>
<div class="card-columns" data-controller="related-element" data-related-element-highlight-class="cards--related">
<% unless @filter.closers.any? %>
<%= render "cards/index/engagement/on_deck", **@on_deck.to_h %>
<%= render "cards/index/engagement/considering", **@considering.to_h %>
<%= render "cards/index/engagement/doing", **@doing.to_h %>
<% end %>
</div>
<%= render "cards/index/engagement/closed", **@closed.to_h %>
<%= render "cards/index/columns", user_filtering: @user_filtering, on_deck: @on_deck, considering: @considering, doing: @doing, closed: @closed %>
<% end %>
+11
View File
@@ -0,0 +1,11 @@
<% cache [ on_deck, considering, doing, closed ].collect { it.page.records } do %>
<div class="card-columns" data-controller="related-element" data-related-element-highlight-class="cards--related">
<% unless user_filtering.only_closed? %>
<%= render "cards/index/engagement/on_deck", user_filtering: user_filtering, **on_deck.to_h %>
<%= render "cards/index/engagement/considering", user_filtering: user_filtering, **considering.to_h %>
<%= render "cards/index/engagement/doing", user_filtering: user_filtering, **doing.to_h %>
<% end %>
<%= render "cards/index/engagement/closed", user_filtering: user_filtering, **closed.to_h %>
</div>
<% end %>
@@ -10,6 +10,6 @@
</div>
<% end %>
<% else %>
<p class="txt-normal translucent"><%= @user_filtering.any? ? "No matches" : "Nothing here" %></p>
<p class="txt-normal translucent"><%= user_filtering.any? ? "No matches" : "Nothing here" %></p>
<% end %>
</section>
@@ -5,7 +5,7 @@
data-related-element-group-value="card-columns"
data-action="mouseover->related-element#highlight mouseout->related-element#unhighlight">
<div class="cards__decoration"></div>
<%= render "cards/index/add_card_button", user_filtering: @user_filtering %>
<%= render "cards/index/add_card_button", user_filtering: user_filtering %>
<% if page.used? %>
<%= render partial: "cards/display/preview", collection: page.records, as: :card, locals: { draggable: true }, cached: true %>
@@ -21,6 +21,6 @@
</div>
<% end %>
<% else %>
<p class="txt-normal translucent"><%= @user_filtering.any? ? "No matches" : "Nothing here" %></p>
<p class="txt-normal translucent"><%= user_filtering.any? ? "No matches" : "Nothing here" %></p>
<% end %>
</section>
@@ -15,6 +15,6 @@
</div>
<% end %>
<% else %>
<p class="txt-normal translucent"><%= filter.any? ? "No matches" : "Nothing here" %></p>
<p class="txt-normal translucent"><%= user_filtering.any? ? "No matches" : "Nothing here" %></p>
<% end %>
</section>
+17 -15
View File
@@ -1,17 +1,19 @@
<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/toggle", user_filtering: user_filtering %>
<% 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/toggle", 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/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/terms", user_filtering: user_filtering %>
<%= render "filters/settings/controls", user_filtering: user_filtering %>
</div>
</aside>
<%= render "filters/settings/controls", user_filtering: user_filtering %>
</div>
</aside>
<% end %>