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?
1 Mi Piace
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.
3 Mi Piace
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.
2 Mi Piace
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.