Add server-side caching and HTTP caching when serving events in the timeline
This commit is contained in:
@@ -2,5 +2,6 @@ class Events::DaysController < ApplicationController
|
||||
include DayTimelinesScoped
|
||||
|
||||
def index
|
||||
fresh_when @day_timeline
|
||||
end
|
||||
end
|
||||
|
||||
@@ -4,5 +4,7 @@ class EventsController < ApplicationController
|
||||
enable_collection_filtering only: :index
|
||||
|
||||
def index
|
||||
Rails.logger.info "***** #{@day_timeline.cache_key}"
|
||||
fresh_when @day_timeline
|
||||
end
|
||||
end
|
||||
|
||||
@@ -58,7 +58,7 @@ class Filter < ApplicationRecord
|
||||
end
|
||||
|
||||
def cache_key
|
||||
ActiveSupport::Cache.expand_cache_key collections.cache_key_with_version, super
|
||||
ActiveSupport::Cache.expand_cache_key [ params_digest ], "filter"
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -73,4 +73,8 @@ module Filter::Params
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def params_digest
|
||||
super.presence || self.class.digest_params(as_params)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -45,6 +45,10 @@ class User::DayTimeline
|
||||
week_starts_at + 1.week
|
||||
end
|
||||
|
||||
def cache_key
|
||||
ActiveSupport::Cache.expand_cache_key [ user, filter, day.to_date, events ], "day-timeline"
|
||||
end
|
||||
|
||||
private
|
||||
def first_day_with_activity_this_week?
|
||||
day.monday? || (earliest_time.present? && earliest_time < day.beginning_of_week(:monday))
|
||||
|
||||
@@ -82,6 +82,10 @@ class User::Filtering
|
||||
end
|
||||
end
|
||||
|
||||
def cache_key
|
||||
ActiveSupport::Cache.expand_cache_key( [ user, filter, expanded? ], "user-filtering")
|
||||
end
|
||||
|
||||
private
|
||||
def supports_collection_filtering?
|
||||
@collection_filtering_route_resolver.present?
|
||||
|
||||
@@ -1,13 +1,6 @@
|
||||
<section class="events__day" data-controller="related-element"
|
||||
data-related-element-highlight-class="event--related">
|
||||
<% if day_timeline.has_activity? %>
|
||||
<div class="events__columns">
|
||||
<%= render "events/day_timeline_column", event_type: "added", day_timeline: day_timeline %>
|
||||
<%= render "events/day_timeline_column", event_type: "updated", day_timeline: day_timeline %>
|
||||
<%= render "events/day_timeline_column", event_type: "closed", day_timeline: day_timeline %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<%= render "events/day_timeline/columns", day_timeline: day_timeline %>
|
||||
<%= render "events/weekly_highlights", day_timeline: day_timeline if day_timeline.has_weekly_highlights? %>
|
||||
<%= render "events/empty_days", day_timeline: day_timeline %>
|
||||
</section>
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
<% day_timeline.events.group_by { event_column(it) }.each do |column, events_grouped_by_column| %>
|
||||
<div class="events__column">
|
||||
<h2 class="events__column-header"><%= column %></h2>
|
||||
<% events_grouped_by_column.group_by { it.created_at.hour }.each do |hour, events| %>
|
||||
<%= event_cluster_tag(hour, column) do %>
|
||||
<%= render partial: "events/event", collection: events %>
|
||||
<%= local_datetime_tag events.first.created_at, class: "event__timestamp txt-small translucent" %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
@@ -0,0 +1,9 @@
|
||||
<% cache day_timeline.events do %>
|
||||
<% if day_timeline.has_activity? %>
|
||||
<div class="events__columns">
|
||||
<%= render "events/day_timeline/column", event_type: "added", day_timeline: day_timeline %>
|
||||
<%= render "events/day_timeline/column", event_type: "updated", day_timeline: day_timeline %>
|
||||
<%= render "events/day_timeline/column", event_type: "closed", day_timeline: day_timeline %>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
@@ -5,7 +5,6 @@
|
||||
|
||||
<% content_for :header do %>
|
||||
<%= render "filters/menu", user_filtering: @user_filtering %>
|
||||
|
||||
<%= render "filters/menu/add_card_button", user_filtering: @user_filtering %>
|
||||
|
||||
<h1 class="header__title overflow-ellipsis">
|
||||
|
||||
@@ -1,41 +1,43 @@
|
||||
<nav data-controller="dialog" data-action="keydown.esc->dialog#close click@document->dialog#closeOnClickOutside">
|
||||
<%= render "filters/menu/button" %>
|
||||
<% cache user_filtering do %>
|
||||
<nav data-controller="dialog" data-action="keydown.esc->dialog#close click@document->dialog#closeOnClickOutside">
|
||||
<%= render "filters/menu/button" %>
|
||||
|
||||
<%= tag.dialog class: "fizzy-menu filter popup popup--animated panel margin-block-start-half",
|
||||
data: {
|
||||
action: "turbo:before-cache@document->dialog#close keydown->navigable-list#navigate filter:changed->navigable-list#reset toggle->filter#filter",
|
||||
controller: "filter navigable-list",
|
||||
dialog_target: "dialog",
|
||||
navigable_list_focus_on_selection_value: false,
|
||||
navigable_list_actionable_items_value: true } do %>
|
||||
<div class="flex gap">
|
||||
<%= text_field_tag :search, nil,
|
||||
type: "search",
|
||||
role: "combobox",
|
||||
placeholder: "Filter…",
|
||||
class: "input input--transparent txt-small",
|
||||
autofocus: true,
|
||||
autocorrect: "off",
|
||||
autocomplete: "off",
|
||||
aria: { activedescendant: "" },
|
||||
data: {
|
||||
"1p-ignore": "true",
|
||||
filter_target: "input",
|
||||
navigable_list_target: "input",
|
||||
action: "input->filter#filter" } %>
|
||||
<button class="fizzy-menu__close btn borderless txt-small" data-action="dialog#close">
|
||||
<%= icon_tag "close" %>
|
||||
<span class="for-screen-reader">Close menu</span>
|
||||
</button>
|
||||
</div>
|
||||
<%= tag.dialog class: "fizzy-menu filter popup popup--animated panel margin-block-start-half",
|
||||
data: {
|
||||
action: "turbo:before-cache@document->dialog#close keydown->navigable-list#navigate filter:changed->navigable-list#reset toggle->filter#filter",
|
||||
controller: "filter navigable-list",
|
||||
dialog_target: "dialog",
|
||||
navigable_list_focus_on_selection_value: false,
|
||||
navigable_list_actionable_items_value: true } do %>
|
||||
<div class="flex gap">
|
||||
<%= text_field_tag :search, nil,
|
||||
type: "search",
|
||||
role: "combobox",
|
||||
placeholder: "Filter…",
|
||||
class: "input input--transparent txt-small",
|
||||
autofocus: true,
|
||||
autocorrect: "off",
|
||||
autocomplete: "off",
|
||||
aria: { activedescendant: "" },
|
||||
data: {
|
||||
"1p-ignore": "true",
|
||||
filter_target: "input",
|
||||
navigable_list_target: "input",
|
||||
action: "input->filter#filter" } %>
|
||||
<button class="fizzy-menu__close btn borderless txt-small" data-action="dialog#close">
|
||||
<%= icon_tag "close" %>
|
||||
<span class="for-screen-reader">Close menu</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<%= render "filters/menu/hotkeys" %>
|
||||
<%= render "filters/menu/custom", user_filtering: user_filtering %>
|
||||
<%= render "filters/menu/collections", user_filtering: user_filtering %>
|
||||
<%= render "filters/menu/tags", user_filtering: user_filtering %>
|
||||
<%= render "filters/menu/users", user_filtering: user_filtering %>
|
||||
<%= render "filters/menu/places", user_filtering: user_filtering %>
|
||||
<%= render "filters/menu/hotkeys" %>
|
||||
<%= render "filters/menu/custom", user_filtering: user_filtering %>
|
||||
<%= render "filters/menu/collections", user_filtering: user_filtering %>
|
||||
<%= render "filters/menu/tags", user_filtering: user_filtering %>
|
||||
<%= render "filters/menu/users", user_filtering: user_filtering %>
|
||||
<%= render "filters/menu/places", user_filtering: user_filtering %>
|
||||
|
||||
<%= render "filters/menu/shortcut_notice" %>
|
||||
<% end %>
|
||||
</nav>
|
||||
<%= render "filters/menu/shortcut_notice" %>
|
||||
<% end %>
|
||||
</nav>
|
||||
<% end %>
|
||||
|
||||
Reference in New Issue
Block a user