Skip to content

Commit db76fc4

Browse files
committed
feat: Lazy load admin pages sitemap
We introduced server side sitemap rendering recently, but large sitemaps still load several seconds. For better UX we lazy load the sitemap via a Turbo Frame. (cherry picked from commit 2220152)
1 parent ae0c11c commit db76fc4

7 files changed

Lines changed: 34 additions & 19 deletions

File tree

app/assets/builds/alchemy/admin.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/controllers/alchemy/admin/pages_controller.rb

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class PagesController < ResourcesController
88

99
helper "alchemy/pages"
1010

11-
before_action :load_resource, except: [:index, :flush, :new, :create, :copy_language_tree, :link]
11+
before_action :load_resource, except: [:index, :flush, :new, :create, :copy_language_tree, :link, :tree]
1212

1313
authorize_resource class: Alchemy::Page, except: [:index]
1414

@@ -60,14 +60,18 @@ def index
6060
items = items.page(params[:page] || 1).per(items_per_page)
6161
@pages = items
6262
elsif @current_language.root_page
63-
@root_page = Alchemy::PageTreePreloader.new(
64-
page: @current_language.root_page,
65-
user: current_alchemy_user,
66-
admin_includes: true
67-
).call
63+
@root_page = @current_language.root_page
6864
end
6965
end
7066

67+
def tree
68+
@root_page = Alchemy::PageTreePreloader.new(
69+
page: @current_language.root_page,
70+
user: current_alchemy_user,
71+
admin_includes: true
72+
).call
73+
end
74+
7175
# Used by page preview iframe in Page#edit view.
7276
#
7377
def show

app/stylesheets/alchemy/admin/sitemap.scss

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,12 @@ alchemy-sitemap {
6464
min-height: calc(100vh - 148px);
6565
}
6666

67+
#alchemy_pages_tree {
68+
display: block;
69+
height: calc(100vh - var(--top-menu-height) - var(--spacing-3));
70+
position: relative;
71+
}
72+
6773
#sitemap {
6874
padding: 0 0 104px 0;
6975

app/views/alchemy/admin/pages/_sitemap.html.erb

Lines changed: 0 additions & 11 deletions
This file was deleted.

app/views/alchemy/admin/pages/index.html.erb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@
2626
<% else %>
2727
<% if @root_page %>
2828
<h2 id="page_filter_result">Page filter display</h2>
29-
<%= render "sitemap", page_partial: "page" %>
29+
<%= turbo_frame_tag "alchemy_pages_tree", src: alchemy.tree_admin_pages_path do %>
30+
<alchemy-spinner></alchemy-spinner>
31+
<% end %>
3032
<% elsif can?(:create, Alchemy::Page) %>
3133
<%= render partial: "create_language_form" %>
3234
<% else %>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<%= turbo_frame_tag "alchemy_pages_tree" do %>
2+
<h4 id="sitemap_heading">
3+
<span class="page_name"><%= Alchemy::Page.human_attribute_name(:name) %></span>
4+
<span class="page_urlname"><%= Alchemy::Page.human_attribute_name(:urlname) %></span>
5+
<span class="page_status"><%= Alchemy.t(:page_status) %></span>
6+
</h4>
7+
8+
<alchemy-sitemap>
9+
<ul id="sitemap" class="list">
10+
<%= render Alchemy::Admin::PageNode.new(page: @root_page) %>
11+
</ul>
12+
</alchemy-sitemap>
13+
<% end %>

config/routes.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
post :copy_language_tree
2727
get :create_language
2828
get :link
29+
get :tree
2930
end
3031
member do
3132
post :unlock

0 commit comments

Comments
 (0)