alkah3st
(Daniel Quinn)
19.Май.2025 06:00:58
1
Я видел несколько постов на эту тему, но ни один не давал окончательных ответов.
Имеет ли Unreal Engine Discourse (отображаемый на странице «Обзор» в Discourse) полностью кастомную тему или существуют компоненты, позволяющие достичь такого результата?
Также я заметил, что при переходе в одну из категорий подкатегории отображаются как ссылки верхнего уровня, а под ними перечисляются все темы. Похоже, что здесь используется настройка «Стиль списка подкатегорий» со значением «Строки» для родительской категории, чтобы добиться такого вида?
alkah3st
(Daniel Quinn)
19.Май.2025 06:17:47
3
Похоже, это не то, что можно решить с помощью компонента.
Однако мне удалось с небольшой помощью ИИ сгенерировать JS и CSS, которые решают эту задачу. Если кому-то интересно, я с радостью поделюсь.
nathank
(Nathan Kershaw)
19.Май.2025 10:22:48
4
Вы, наверное, уже видели это:
What is the name of Unreal Engine’s community theme? Or how can i make a theme like that?
Unreal Engine Forum
А также это:
This is a heavily customised forum. Something like this will use plugins as well as theme modifications.
This is something that our partners can help you with; Discourse can help too of course, if you are on the Enterprise plans
Безусловно, делитесь своим кодом. Конечно, сложность подобных вещей заключается в постоянном обслуживании.
alkah3st
(Daniel Quinn)
19.Май.2025 15:57:47
5
Да, похоже, что многое из того, что они делают, — это кастомные решения.
Мой скрипт выглядит так:
import { apiInitializer } from "discourse/lib/api";
import { ajax } from "discourse/lib/ajax";
export default apiInitializer("0.11.1", (api) => {
ajax("/site.json").then((data) => {
const categories = data.categories;
// Создаём карту parent_id => [child_category_ids]
const childMap = {};
categories.forEach((cat) => {
if (cat.parent_category_id) {
if (!childMap[cat.parent_category_id]) {
childMap[cat.parent_category_id] = [];
}
childMap[cat.parent_category_id].push(cat.id);
}
});
const collapseState = {}; // Отслеживает состояние сворачивания для каждого родителя
function applyCollapseState(parentId, childIds, collapsed) {
childIds.forEach((childId) => {
const childEl = document.querySelector(
`.sidebar-section-link-wrapper[data-category-id="${childId}"]`
);
if (childEl) {
childEl.classList.toggle("is-collapsed", collapsed);
childEl.classList.add("is-subcategory");
}
});
}
function ensureToggleExists(parentId, childIds) {
const parentEl = document.querySelector(
`.sidebar-section-link-wrapper[data-category-id="${parentId}"]`
);
if (!parentEl || parentEl.classList.contains("has-toggle")) return;
const toggle = document.createElement("span");
toggle.innerText = collapseState[parentId] ? "▸" : "▾";
toggle.className = "toggle-subcategories";
toggle.style.cursor = "pointer";
toggle.style.marginLeft = "0.5em";
toggle.onclick = () => {
const isNowCollapsed = !collapseState[parentId];
applyCollapseState(parentId, childIds, isNowCollapsed);
toggle.innerText = isNowCollapsed ? "▸" : "▾";
collapseState[parentId] = isNowCollapsed;
};
parentEl.classList.add("has-toggle");
const link = parentEl.querySelector(".sidebar-section-link");
if (link) link.appendChild(toggle);
}
api.onPageChange(() => {
Object.entries(childMap).forEach(([parentId, childIds]) => {
// Устанавливаем состояние сворачивания по умолчанию
if (collapseState[parentId] === undefined) {
collapseState[parentId] = true;
}
applyCollapseState(parentId, childIds, collapseState[parentId]);
ensureToggleExists(parentId, childIds);
});
const container = document.querySelector('[data-section-name="categories"]');
if (!container) return;
const observer = new MutationObserver(() => {
Object.entries(childMap).forEach(([parentId, childIds]) => {
applyCollapseState(parentId, childIds, collapseState[parentId]);
ensureToggleExists(parentId, childIds); // <-- Восстанавливаем переключатели
});
});
observer.observe(container, {
childList: true,
subtree: true,
});
});
});
});
Я просто вставил это в панель JS темы. Соответствующий CSS:
.sidebar-section-link-wrapper.is-collapsed {
display: none !important;
}
.sidebar-section-link-wrapper.is-subcategory {
padding-left: 1.5em;
}
.toggle-subcategories {
float: right;
display: flex;
width: 30px;
align-items: center;
font-size: .9em;
line-height: 1;
height: 30px;
}
Это работает достаточно хорошо для моих целей, но я бы не рекомендовал такой подход, если у вас много подкатегорий.