From cb16e35c5f9fc93a3382391de496153515cf05ca Mon Sep 17 00:00:00 2001 From: erdgeist Date: Thu, 6 Aug 2026 04:17:29 +0200 Subject: Preload page titles for the sitemap, and order containers before leaves --- app/controllers/nodes_controller.rb | 6 ++++++ app/helpers/nodes_helper.rb | 14 +++++--------- app/models/concerns/nested_tree.rb | 4 +++- config/locales/de.yml | 1 + config/locales/en.yml | 1 + 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/app/controllers/nodes_controller.rb b/app/controllers/nodes_controller.rb index 447d596d..5b919b1f 100644 --- a/app/controllers/nodes_controller.rb +++ b/app/controllers/nodes_controller.rb @@ -256,6 +256,12 @@ class NodesController < ApplicationController def sitemap @sitemap = Node.root.self_and_descendants_ordered_with_level + + ActiveRecord::Associations::Preloader.new( + :records => @sitemap.map(&:first), + :associations => [{ :head => :translations }, { :draft => :translations }] + ).call + @sitemap_descendant_counts = descendant_counts_for(@sitemap) end diff --git a/app/helpers/nodes_helper.rb b/app/helpers/nodes_helper.rb index 5884c8cd..48f44f8b 100644 --- a/app/helpers/nodes_helper.rb +++ b/app/helpers/nodes_helper.rb @@ -1,15 +1,11 @@ module NodesHelper def title_for_node node - if node.head - node.head.title - else - if not node.draft or not node.draft.title - logger.error "Missing title in node #{node.id}" - return "NO TITLE" - end - node.draft.title - end + return node.head.title if node.head&.title.present? + return node.draft.title if node.draft&.title.present? + + logger.error "Missing title in node #{node.id}" + t("admin.common.no_title") end def truncated_title_for_node node diff --git a/app/models/concerns/nested_tree.rb b/app/models/concerns/nested_tree.rb index befcdb38..87a94d23 100644 --- a/app/models/concerns/nested_tree.rb +++ b/app/models/concerns/nested_tree.rb @@ -61,7 +61,9 @@ module NestedTree def self_and_descendants_ordered_with_level nodes = [self] + descendants.to_a children_by_parent = nodes.group_by(&:parent_id) - children_by_parent.each_value { |list| list.sort_by!(&:id) } + children_by_parent.each_value do |list| + list.sort_by! { |n| [children_by_parent.key?(n.id) ? 0 : 1, n.slug.to_s] } + end result = [] visit = ->(node, level) do diff --git a/config/locales/de.yml b/config/locales/de.yml index fe40e507..591b45d1 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -377,6 +377,7 @@ de: force_render: "Vorschau neu rendern" revisions: "Revisionen" explain: "Was macht das?" + no_title: "kein Titel" "yes": "ja" "no": "nein" columns: diff --git a/config/locales/en.yml b/config/locales/en.yml index 55c0abc5..f8a7144c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -325,6 +325,7 @@ en: force_render: "Force preview render" revisions: "revisions" explain: "What does this do?" + no_title: "no title" "yes": "yes" "no": "no" columns: -- cgit v1.3