LS bekommt einen festen Platz unter Gaming
Deploy / check (push) Has been cancelled
Deploy / deploy (push) Has been cancelled

Das Modul stand nur unter "Meine Funktionen" — also solange, wie du es
angeheftet laesst. Loest man die Nadel, ist es nur noch uebers Modul-Raster
erreichbar. Fuer die groesste Seite im Panel zu wenig.

Jetzt kann ein Modul `nav: true` setzen und bekommt damit einen Eintrag in der
Seitenleiste, unter seiner eigenen Gruppe. Kein Sonderfall fuer LS: jedes
Modul, das eine ganze Seite fuellt, kann sich so einsortieren.

Dabei aufgefallen und mitgenommen: eine halbe Antwort von /api/modules/:id hat
die ganze Config weiss gemacht. Der Ladepfad ist zwar sauber abgesichert —
`fehler` und `!detail` fangen ab —, aber ein Objekt OHNE die Listen kommt
durch beide Wachen und laesst dann `detail.werte.some(...)` werfen, was React
mit dem gesamten Baum quittiert. Vier Listen mit `?? []` kosten nichts und
machen aus dem Weissbild schlimmstenfalls eine leere Sektion.

Zwei Werkzeug-Fallen nebenbei: `npx vite build` zieht mal das lokale Vite 6,
mal ein gecachtes Vite 8 aus dem npx-Ordner — ab jetzt nur noch
`npm --prefix frontend run build`. Und der laufende Preview-Server haelt
dist/assets fest, was den Build mit EPERM abbricht; vorher stoppen.

Geprueft: Seitenleiste zeigt Gaming mit Game-Server und LS, Klick oeffnet die
Modulseite und markiert den Eintrag, kein Fehler in der Konsole.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-09 08:38:52 +02:00
co-authored by Claude Opus 5
parent 9f929fe0e4
commit 5de172f862
3 changed files with 47 additions and 17 deletions
+19 -1
View File
@@ -4103,7 +4103,12 @@ export default function Settings({ me }) {
{TAB_SECTIONS.map((section) => {
const items = foundTabs.filter((t) => t.section === section.id);
if (items.length === 0) return null;
// Module mit `nav` bekommen hier einen festen Platz —
// sonst sind sie nur übers Raster erreichbar oder
// solange man sie angeheftet lässt.
const eigene = modules.filter((m) => m.nav && m.group === section.id
&& (!query || m.name.toLowerCase().includes(query.toLowerCase())));
if (items.length === 0 && eigene.length === 0) return null;
return (
<div className="settings-nav-group" key={section.id}>
<span className="settings-nav-label">{section.label}</span>
@@ -4117,6 +4122,19 @@ export default function Settings({ me }) {
{t.label}
</button>
))}
{eigene.map((m) => {
const Icon = moduleIcon(m.id);
return (
<button
key={m.id}
className={`settings-nav-item ${openModule === m.id ? 'active' : ''}`}
onClick={() => { setTabState('module'); setOpenModule(m.id); }}
>
<span className="settings-nav-icon"><Icon /></span>
{m.name}
</button>
);
})}
</div>
);
})}