diff --git a/web/src/components/DataTable.jsx b/web/src/components/DataTable.jsx index c5108e9..7d84b52 100644 --- a/web/src/components/DataTable.jsx +++ b/web/src/components/DataTable.jsx @@ -40,6 +40,22 @@ export default function DataTable({ const rest = columns.map((c) => c.key).filter((k) => !saved.includes(k)); return [...saved, ...rest]; }); + // `order` ist eine Momentaufnahme vom Mounten. Seiten duerfen ihre Spalten + // aber danach aendern (die Artikelliste zeigt „Verwaltung" nur bei + // Gegenstaenden), und eine neu hinzugefuegte Spalte steht ohnehin nie in der + // gespeicherten Reihenfolge. Fehlt sie dort, faellt sie aus allOrdered heraus + // und ist WEG – nicht nur aus dem Spalten-Menue, sondern aus der Tabelle. + // Deshalb hier nachziehen. Angehaengt, nicht einsortiert: eine selbst + // gewaehlte Reihenfolge soll nicht umspringen. + const schluessel = columns.map((c) => c.key).join("|"); + useEffect(() => { + setOrder((alt) => { + const fehlend = columns.map((c) => c.key).filter((k) => !alt.includes(k)); + return fehlend.length ? [...alt, ...fehlend] : alt; + }); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [schluessel]); + const [widths, setWidths] = useState(() => loadPersisted(id).widths || {}); // Filter + Sortierung bleiben erhalten (localStorage je Tabelle), bis man // „Filter löschen" drückt oder anders sortiert – auch nach Navigieren/Neuladen. @@ -98,7 +114,14 @@ export default function DataTable({ useLayoutEffect(() => { if (chooserOpen && chooserBtn.current) { const r = chooserBtn.current.getBoundingClientRect(); - setChooserPos({ left: Math.min(r.left, window.innerWidth - 240), top: r.bottom + 4 }); + // Hoehe an den freien Platz koppeln. Eine feste Obergrenze schnitt die + // letzten Eintraege ab, ohne dass man es sah – auf macOS blendet das + // System die Bildlaufleiste aus, und dann fehlt die Spalte scheinbar. + setChooserPos({ + left: Math.min(r.left, window.innerWidth - 240), + top: r.bottom + 4, + maxHeight: Math.max(180, window.innerHeight - r.bottom - 24), + }); } }, [chooserOpen]); useEffect(() => { @@ -316,7 +339,7 @@ export default function DataTable({ {chooserOpen && chooserPos && createPortal(