alkah3st
(Daniel Quinn)
19 במאי, 2025, 6:00am
1
I’ve seen a few posts about this but none have definitive answers.
Does the Unreal Engine Discourse (featured on the Discourse “Discover” page) have a completely custom theme, or are there components that can achieve this?
I also notice they display the subcategories as top level links when you click into one, and then beneath it lists all the topics. It looks like what’s happening here is setting “Subcategory List Style” to “Rows” on the parent category to achieve that?
לייק 1
alkah3st
(Daniel Quinn)
19 במאי, 2025, 6:17am
3
נראה שזה לא משהו שניתן לפתור באמצעות רכיב.
עם זאת, הצלחתי ליצור קוד JS ו-CSS שמגיעים לתוצאה זו בעזרת מעט בינה מלאכותית, אם מישהו מעוניין, אשמח לשתף.
3 לייקים
nathank
(Nathan Kershaw)
19 במאי, 2025, 10:22am
4
You’ve seen this I take it:
What is the name of Unreal Engine’s community theme? Or how can i make a theme like that?
Unreal Engine Forum
And this:
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
By all means, do share your code. Of course, the challenge with things like this is the ongoing maintenance.
2 לייקים
alkah3st
(Daniel Quinn)
19 במאי, 2025, 3:57pm
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 => [מזהי תת הקטגוריות]
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;
}
זה עובד די טוב לצרכיי, אבל לא הייתי ממליץ על זה אם יש לך המון תת קטגוריות.