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:
co-authored by
Claude Opus 5
parent
be267e70a5
commit
757d06100a
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user