alkah3st
(Daniel Quinn)
19 Maggio 2025, 6:00am
1
Ho visto alcuni post a riguardo ma nessuno ha risposte definitive.
Il Discourse di Unreal Engine (presente nella pagina “Discover” di Discourse) ha un tema completamente personalizzato o ci sono componenti che possono ottenere questo risultato?
Noto anche che visualizzano le sottocategorie come link di primo livello quando ci si clicca sopra, e poi sotto elencano tutti gli argomenti. Sembra che quello che sta succedendo qui sia impostare “Subcategory List Style” su “Rows” nella categoria principale per ottenere questo risultato?
alkah3st
(Daniel Quinn)
19 Maggio 2025, 6:17am
3
Sembra che questo non sia qualcosa risolvibile con un componente.
Tuttavia sono riuscito a generare JS e CSS che raggiungono questo obiettivo con un piccolo aiuto dell’AI, se qualcuno è interessato sono felice di condividere.
nathank
(Nathan Kershaw)
19 Maggio 2025, 10:22am
4
Hai visto questo, immagino:
What is the name of Unreal Engine’s community theme? Or how can i make a theme like that?
Unreal Engine Forum
E questo:
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
Certo, condividi pure il tuo codice. Naturalmente, la sfida con cose del genere è la manutenzione continua.
alkah3st
(Daniel Quinn)
19 Maggio 2025, 3:57pm
5
Sì, sembra che gran parte di ciò che stanno facendo sia roba personalizzata.
Il mio script è così:
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;
// Costruisci una mappa di parent_id => [id delle sottocategorie]
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 = {}; // Tiene traccia dello stato di collasso per ogni genitore
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]) => {
// Imposta lo stato di collasso predefinito
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); // <— Ricostruisci i toggle
});
});
observer.observe(container, {
childList: true,
subtree: true,
});
});
});
});
L’ho appena inserito nel pannello JS delle personalizzazioni del tema. Il CSS pertinente è:
.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;
}
Va bene abbastanza per i miei scopi, ma non lo consiglierei se hai molte sottocategorie.