From f4959b228baec6c9f95c1457c6b48f07f20ca78b Mon Sep 17 00:00:00 2001 From: Bianca Nenciu Date: Wed, 27 Mar 2024 17:40:59 +0200 Subject: [PATCH] FIX: Load complete category objects Not all categories are preloaded when lazy_load_categories is enabled. In this case, the category objects that are loaded through /docs.json must be complete. --- assets/javascripts/discourse/models/docs.js | 14 ++++++++++ lib/docs/query.rb | 29 ++++++++++++++++++--- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/assets/javascripts/discourse/models/docs.js b/assets/javascripts/discourse/models/docs.js index acf9db1..5a62f3e 100644 --- a/assets/javascripts/discourse/models/docs.js +++ b/assets/javascripts/discourse/models/docs.js @@ -1,5 +1,6 @@ import EmberObject from "@ember/object"; import { ajax } from "discourse/lib/ajax"; +import Site from "discourse/models/site"; import Topic from "discourse/models/topic"; import User from "discourse/models/user"; import { getDocs } from "../../lib/get-docs"; @@ -38,6 +39,13 @@ Docs.reopenClass({ } return ajax(`/${docsPath}.json?${filters.join("&")}`).then((data) => { + const site = Site.current(); + if (site.lazy_load_categories) { + data.categories?.forEach((category) => site.updateCategory(category)); + data.topics.topic_list.categories?.forEach((category) => + site.updateCategory(category) + ); + } data.topics.topic_list.topics = data.topics.topic_list.topics.map( (topic) => Topic.create(topic) ); @@ -51,6 +59,12 @@ Docs.reopenClass({ loadMore(loadMoreUrl) { return ajax(loadMoreUrl).then((data) => { + const site = Site.current(); + if (site.lazy_load_categories) { + data.topics.topic_list.categories?.forEach((category) => + site.updateCategory(category) + ); + } data.topics.topic_list.topics = data.topics.topic_list.topics.map( (topic) => Topic.create(topic) ); diff --git a/lib/docs/query.rb b/lib/docs/query.rb index 32b644c..03b96b0 100644 --- a/lib/docs/query.rb +++ b/lib/docs/query.rb @@ -210,12 +210,33 @@ module Docs tags_object.sort_by { |tag| [tag[:active] ? 0 : 1, -tag[:count]] } end - def create_categories_object(categories) + def create_categories_object(category_counts) + categories = + Category + .where(id: category_counts.keys) + .includes( + :uploaded_logo, + :uploaded_logo_dark, + :uploaded_background, + :uploaded_background_dark, + ) + .joins("LEFT JOIN topics t on t.id = categories.topic_id") + .select("categories.*, t.slug topic_slug") + .index_by(&:id) + categories_object = [] - categories.each do |category| - active = @filters[:category].include?(category[0].to_s) if @filters[:category] - categories_object << { id: category[0], count: category[1], active: active || false } + category_counts.each do |id, count| + active = @filters[:category] && @filters[:category].include?(id.to_s) + + categories_object << if @guardian.can_lazy_load_categories? + BasicCategorySerializer + .new(categories[id], scope: @guardian, root: false) + .as_json + .merge(id:, count:, active:) + else + category_object = { id:, count:, active: } + end end categories_object.sort_by { |category| [category[:active] ? 0 : 1, -category[:count]] }