Возможность скрыть категории третьего уровня на главной странице категорий без нарушения разметки

Мы используем глубокую двухуровневую структуру категорий (все публичные библиотеки нашего города с их отдельными филиалами, плюс центральная библиотека со своими собственными категориями верхнего уровня). Недавно нам потребовалось добавить третий уровень вложенности в некоторых ветвях категорий.

Как только у любой категории в дереве появляется «внучка», главная страница категорий переключает режим отображения: вместо компактной сетки блоков (родительская категория с перечисленными внутри прямыми дочерними категориями) все категории отображаются в виде длинного одноколоночного списка. Это делает главную страницу чрезвычайно длинной и неудобной для быстрого просмотра нашими ~1200 сотрудниками.

Похоже, что этим управляет свойство isGrandParent, описанное в этой связанной теме: When you add an additional nesting level, all categories, including child categories, are displayed on the categories page

Что нам нужно

Наш предпочтительный вариант: способ сохранить стандартную главную страницу с «блоками» даже тогда, когда у категории есть третий уровень вложенности — например, просто не показывая «внучек» на главной странице (они всё равно будут доступны через страницу родительской категории).

Альтернативный вариант: нативный сворачиваемый/разворачиваемый вид для категорий с «внучками» непосредственно на главной странице категорий, чтобы пользователи могли разворачивать только нужные им ветви, вместо плоского списка всего содержимого.

Почему мы просим нативное/официальное решение

Мы знаем, что существуют обходные решения с помощью компонентов тем/CSS или JS (например, переопределение isGrandParent через modifyClass), обсуждавшиеся в указанной выше старой теме. Мы предпочитаем не идти по этому пути: у нас нет глубокой экспертизы во фронтенде внутри компании, и мы обеспокоены возможными непредвиденными побочными эффектами или сбоями при будущих обновлениях Discourse, если мы будем самостоятельно переопределять базовую логику рендеринга. Поддерживаемая настройка или официальная опция были бы для нас гораздо безопаснее с точки зрения долгосрочного обслуживания.

Мы осознаем, что Discourse официально не рекомендует глубокую вложенность, но для нашей организационной структуры (несколько учреждений, каждое из которых имеет несколько физических местоположений, каждое из которых нуждается в своем собственном пространстве) это не является для нас опциональным.

Поддерживаемый способ управления отображением на главной странице в таких случаях очень помог бы, и мы уверены, что с 2021 года потребность в скрытом третьем уровне могла возникнуть и в других организациях, верно?

Приложены скриншоты: наша текущая двухуровневая главная страница

и как она ломается, как только вводится третий уровень.

5 лайков

Я не уверен, но этот Customization > Theme component может быть тем, что вам нужно, или его можно немного доработать. Возможно, DeV также будет открыт к добавлению этой функции.

1 лайк

Это разумное замечание: поддерживать балансировку макета страницы /categories бывает сложно, если категорий немного, а у них несколько уровней вложенности.

Мы действительно не хотим, чтобы люди продолжали использовать modifyClass, потому что, как вы упомянули, поддержка таких переопределений может требовать значительных усилий с точки зрения разработки.

У нас появились более новые методы кастомизации, с которыми мы можем работать и которые проще поддерживать в стабильном состоянии. В данном случае поможет преобразователь значений (value transformer). Я только что добавил один из них, который скоро станет доступен в обновлениях: DEV: Add a category-list-subcategories value transformer - Pull Request #42804 - discourse/discourse - GitHub

Простая демонстрация выглядит примерно так:

api.registerValueTransformer(
  "category-list-subcategories",
  ({ value, context }) =>
  context.page === "categories" && context.category.level >= 1 ? [] : value
);

Это покажет только один уровень подкатегорий. С помощью преобразователя теперь доступны и другие варианты, поэтому я подготовил компонент темы, который мы сможем поддерживать для их реализации.

Так что, как только Discourse будет обновлён, вы сможете установить этот компонент, чтобы контролировать, сколько подкатегорий отображается на странице /categories и в некоторых других списках категорий:

Установите значение Categories page depth в 2, чтобы скрыть все категории третьего уровня (внуки).

2 лайка

Привет, большое спасибо!

Можно ли предсказать, как будут вести себя категории второго уровня? Например, вернутся ли они к своему исходному порядку друг относительно друга?

1 лайк

Да, порядок останется прежним… это, по сути, поддерживаемый способ переопределить isGrandParent

Вот сравнение «до» и «после» с моего тестового сайта

3 лайка