我看到了一些关于这个问题的帖子,但都没有明确的答案。
Unreal Engine Discourse(在 Discourse 的“发现”页面上精选)是否拥有完全自定义的主题,还是有一些组件可以实现这一点?
我还注意到,当你点击进入一个子分类时,它会显示为顶级链接,然后在下方列出所有主题。看起来这里发生的是将父分类的“子分类列表样式”设置为“行”来实现的?
我看到了一些关于这个问题的帖子,但都没有明确的答案。
Unreal Engine Discourse(在 Discourse 的“发现”页面上精选)是否拥有完全自定义的主题,还是有一些组件可以实现这一点?
我还注意到,当你点击进入一个子分类时,它会显示为顶级链接,然后在下方列出所有主题。看起来这里发生的是将父分类的“子分类列表样式”设置为“行”来实现的?
看起来这可能不是用一个组件就能解决的问题。
不过,我能够生成用一点人工智能帮助实现的JS和CSS代码,如果有人感兴趣,我很乐意分享。
您已经看到这个了吧:
还有这个:
请随时分享您的代码。当然,这类事情的挑战在于持续的维护。
是的,看起来他们做的很多都是定制内容。
我的脚本长得像这样:
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;
// 构建父ID到子类别ID数组的映射
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;
}
它在我的用途下效果还不错,但如果你有很多子类别,我不建议这样做.