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

TLDR:
Как быстрее всего изменить состав filteredTopics (строка 26)? Я хотел бы иметь полный контроль над тем, какие темы (с какими свойствами) собираются.

Привет, сообщество,

Мы используем компонент темы GitHub - discourse/discourse-topic-thumbnails: Display thumbnails in topic lists · GitHub на нашем размещённом окружении и хотели внести в него дополнительные изменения, чтобы удовлетворить наши потребности.

Вместо того чтобы смешивать все темы в один большой блок элементов сетки, мы хотим внести некоторый порядок.
Мы планируем следующее:
Сначала хотим сортировать по статусу «просмотрено/не просмотрено», затем — по категории; после этого сгруппировать их по хронологии (и создать группы, например: «Сегодня» (все соответствующие посты за сегодня), «Вчера», «На прошлой неделе»).

Таким образом, наш список тем должен выглядеть так, с тремя отдельными сетками одна под другой:

<СЕГОДНЯ, ВЧЕРА, НА ПРОШЛОЙ НЕДЕЛЕ> представляет собой группировку.

ЗАКРЕПЛЕНО:
Тема 20, Тема 30, Тема 40

НЕ ПРОСМОТРЕНО:
<СЕГОДНЯ : [АРТ: Тема 1, Тема 2], [ДИЗАЙН: Тема 4]> <ВЧЕРА: [КОНЦЕПТ: Тема 3], [ДРУГАЯ_КАТЕГОРИЯ: Тема 6, Тема 11]> <НА ПРОШЛОЙ НЕДЕЛЕ: Тема 8, Тема 10>

ПРОСМОТРЕНО:
<СЕГОДНЯ : [АРТ: Тема 4, Тема 12], [ДИЗАЙН: Тема 4]> <ВЧЕРА: [CGI: Тема 13], [ДРУГАЯ_КАТЕГОРИЯ: Тема 16, Тема 21]>, <НА ПРОШЛОЙ НЕДЕЛЕ: Тема 18, Тема 100>

Мой главный вопрос: как я могу создать/расширить запрос, который формирует набор результатов, а затем итерироваться по нему в

через filteredList.

Я нашёл место, где это, возможно, заполняется, но не был уверен, как это «расширить». Похоже, существует система queryParam и некоторые маршруты, которые могут влиять на набор результатов, но я не разобрался.

Может ли кто-нибудь указать мне правильное направление?

Мы используем упомянутый выше компонент темы, что означает, что у нас есть ограничения в том, что мы можем делать.
Мне было бы очень полезно, если бы кто-то показал, как ограничить filteredList только темами с непрочитанными постами, например — тогда я смогу продолжить дальше.

Огромное спасибо!

CC @pfaffman

Только для информации: Topic List Thumbnails — это Customization > Theme component, а не плагин. :+1:

Да, спасибо, я об этом знал, но упустил правильные термины. Сейчас поправлю.

Джимми, я добавил краткую выжимку. Есть ли у тебя какие-то подсказки по этому сокращённому вопросу?
Спасибо

Боюсь, это выходит за рамки моих компетенций. :slight_smile:

Вы изучали, как изменять классы в Developing Discourse Themes & Theme Components? Возможно, там есть что-то, что поможет. Поиск также может выдать полезные примеры, если расширить ключевые слова?

Да, спасибо, Джимми, я в курсе этих вещей и даже написал несколько собственных плагинов (или расширил существующие). Проблема в том, что я не понимаю, где именно агрегируется список и как работает вся логика ЗАПРОСА тем, а также где она находится. Если бы я знал хоть одно из этого, я мог бы двигаться дальше.

Я добавляю в копию ещё несколько коллег, так как увидел их в коде Git.

Просто к сведению: на самом деле в Meta очень дурным тоном считается упоминание участников команды таким образом, поэтому я удалил эти упоминания, чтобы не создавать шаблон, который другие могут попытаться повторить. :+1:

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

Удалось ли вам продвинуться в ваших исследованиях или попытках?

Я думал, что проявил хитрость, добавив в копию нужных людей :rofl:

И нет, я не продвинулся дальше. Я трижды пытался показать список тем, а затем скрыть ненужные темы в каждом из них, но затем сработала функция «Загрузить ещё», значительные части DOM были перестроены, и мои расчёты на JavaScript стали слишком тяжёлыми, что вызвало странные эффекты.

Я понял, что нужно сделать это правильно, используя API, предоставленные Discourse.

Я добился здесь значительного прогресса, но в процессе возникло ещё несколько вопросов:

  • Существует ли API-эндпоинт, который можно использовать для получения всех закреплённых тем? Аналогично /latest.json или /top.json?
  • Есть ли JS-команда (предполагая, что я работаю в плагине), с помощью которой можно принудительно перерендерить список тем после изменения статуса элементов в этом списке, чтобы изменения сразу отобразились? Думаю, мне придётся работать с наблюдателем (observer) на topics.

Также я нашёл следующую статью, где есть всё необходимое для кастомизации списка тем, которую я хочу реализовать.

https://meta.discourse.org/t/how-to-add-a-featured-topic-list-to-your-discourse-homepage/132949

Рад, что вы добились прогресса — вы явно находитесь в неизведанных землях!

Закреплённые темы можно получить, выполнив запрос к /search.json?expanded=true&q=in%3Apinned
Используя поиск без ключевого слова поиска.

Это возвращает только список идентификаторов тем или, так сказать, упрощённый набор данных о темах. Вам потребуется выполнить последующие AJAX-запросы к /t/${topic.id}.json, чтобы получить полный набор данных, связанный с темой.

Меня по-прежнему интересует, как можно принудительно вызвать повторный рендеринг списка тем через JS.