Seitenleiste: Eintraege ausblenden, als Vorgabe und je Konto

In den Einstellungen legt der Administrator fest, was es im Haushalt
ueberhaupt gibt; in "Mein Konto" blendet jeder zusaetzlich aus, was er
selbst nicht braucht. Angehakt heisst sichtbar - auch wenn der Server das
Gegenteil speichert. Was der Administrator ausgeblendet hat, steht beim
Konto abgehakt und gesperrt da: Die eigene Auswahl addiert nur.

Uebersicht und Einstellungen fehlen in der Liste mit Absicht - dort landen
alle Anmeldewege bzw. es ist der einzige Weg zurueck. Wer beides
verstecken koennte, sperrte sich aus.

Ausgeblendet wird ueber einen Kontext statt per CSS-Klasse: Unter 768px
blendet die CSS die Listen-Kinder wieder ein, eine Klasse bisse sich
damit. Faellt dabei die ganze Listen-Gruppe weg, verschwindet auch ihr
Aufklapp-Knopf, und die Ueberschrift "Stammdaten" steht nur noch, solange
etwas darunter ist.

Die Leiste zieht sofort nach, ueber dasselbe Ereignis-Muster wie bei den
Dashboards - kein Neuladen noetig.

Versteckt wird nur der Eintrag, nicht die Seite: /shopping bleibt per
Lesezeichen und ueber die Dashboard-Karten erreichbar.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-28 20:31:50 +01:00
co-authored by Claude Opus 5
parent be267e70a5
commit 757d06100a
7 changed files with 256 additions and 10 deletions
+49
View File
@@ -2,6 +2,7 @@ import { useEffect, useState } from "react";
import { api } from "../api";
import { useConfirm } from "../confirm";
import Icon from "../components/Icon";
import NavigationAuswahl from "../components/NavigationAuswahl";
import { useToast } from "../toast";
import BrandingUpload from "../components/BrandingUpload";
import DangerAction from "../components/DangerAction";
@@ -192,6 +193,7 @@ export default function Settings() {
<button className="btn primary" disabled={busy}>{busy ? "Speichern…" : "Speichern"}</button>
</form>
<SeitenleisteCard />
<MealieCard />
<ApiTokensCard />
<DangerZoneCard />
@@ -199,6 +201,53 @@ export default function Settings() {
);
}
/**
* Welche Einträge der Seitenleiste es im Haushalt überhaupt gibt.
*
* Was hier abgewählt ist, sieht niemand – auch kein Administrator. Jeder kann
* in seinem Konto zusätzlich eigene Einträge ausblenden, aber nichts davon
* wieder einblenden.
*/
function SeitenleisteCard() {
const toast = useToast();
const [versteckt, setVersteckt] = useState(null);
const [busy, setBusy] = useState(false);
const [error, setError] = useState(null);
useEffect(() => {
api.navigation().then((a) => setVersteckt(a.vorgabe || [])).catch((e) => setError(e.message));
}, []);
async function speichern(neu) {
setVersteckt(neu);
setBusy(true);
setError(null);
try {
await api.setzeNavigationsVorgabe(neu);
// Die Leiste horcht darauf, statt dass man neu laden muss.
window.dispatchEvent(new Event("navigation-geaendert"));
toast("Seitenleiste gespeichert.");
} catch (err) { setError(err.message); } finally { setBusy(false); }
}
return (
<div className="card">
<div className="card-head"><Icon name="dashboard" /><h2>Seitenleiste</h2></div>
<p className="muted small">
Was hier abgewählt ist, verschwindet für alle aus der Leiste. Die Seiten
selbst bleiben erreichbar – Lesezeichen und Links funktionieren weiter.
Übersicht und Einstellungen lassen sich nicht ausblenden.
</p>
{error && <div className="alert error"><Icon name="alert" size={16} />{error}</div>}
{versteckt == null
? <p className="muted small">Wird geladen…</p>
: <fieldset disabled={busy} style={{ border: 0, padding: 0, margin: 0 }}>
<NavigationAuswahl versteckt={versteckt} onChange={speichern} />
</fieldset>}
</div>
);
}
/** Langlebige Tokens für externe Zugriffe (Home Assistant, Skripte). */
/**
* Verbindung zu einer selbst gehosteten Mealie-Instanz.