Fixed tables

This commit is contained in:
2025-11-10 18:05:50 +01:00
parent cfdd1e633d
commit 34080fe292

View File

@@ -10,6 +10,7 @@ import {
import { haversineDistanceKm } from '../utils/distance'; import { haversineDistanceKm } from '../utils/distance';
const REGION_STORAGE_KEY = 'storeWatchRegionSelection'; const REGION_STORAGE_KEY = 'storeWatchRegionSelection';
const WATCH_TABLE_STATE_KEY = 'storeWatchTableState';
const columnHelper = createColumnHelper(); const columnHelper = createColumnHelper();
@@ -48,6 +49,47 @@ const ColumnSelectFilter = ({ column, options }) => {
); );
}; };
function readWatchTableState() {
if (typeof window === 'undefined') {
return {
sorting: [],
columnFilters: [{ id: 'isOpen', value: 'true' }]
};
}
try {
const raw = window.localStorage.getItem(WATCH_TABLE_STATE_KEY);
if (!raw) {
return {
sorting: [],
columnFilters: [{ id: 'isOpen', value: 'true' }]
};
}
const parsed = JSON.parse(raw);
return {
sorting: Array.isArray(parsed.sorting) ? parsed.sorting : [],
columnFilters: Array.isArray(parsed.columnFilters) && parsed.columnFilters.length > 0
? parsed.columnFilters
: [{ id: 'isOpen', value: 'true' }]
};
} catch {
return {
sorting: [],
columnFilters: [{ id: 'isOpen', value: 'true' }]
};
}
}
function persistWatchTableState(state) {
if (typeof window === 'undefined') {
return;
}
try {
window.localStorage.setItem(WATCH_TABLE_STATE_KEY, JSON.stringify(state));
} catch {
/* ignore */
}
}
const StoreWatchPage = ({ authorizedFetch, knownStores = [], userLocation }) => { const StoreWatchPage = ({ authorizedFetch, knownStores = [], userLocation }) => {
const [regions, setRegions] = useState([]); const [regions, setRegions] = useState([]);
const [selectedRegionId, setSelectedRegionId] = useState(() => { const [selectedRegionId, setSelectedRegionId] = useState(() => {
@@ -69,8 +111,9 @@ const StoreWatchPage = ({ authorizedFetch, knownStores = [], userLocation }) =>
const [error, setError] = useState(''); const [error, setError] = useState('');
const [dirty, setDirty] = useState(false); const [dirty, setDirty] = useState(false);
const [saving, setSaving] = useState(false); const [saving, setSaving] = useState(false);
const [sorting, setSorting] = useState([]); const initialTableState = useMemo(() => readWatchTableState(), []);
const [columnFilters, setColumnFilters] = useState([{ id: 'isOpen', value: 'true' }]); const [sorting, setSorting] = useState(initialTableState.sorting);
const [columnFilters, setColumnFilters] = useState(initialTableState.columnFilters);
useEffect(() => { useEffect(() => {
if (typeof window === 'undefined') { if (typeof window === 'undefined') {
@@ -83,6 +126,10 @@ const StoreWatchPage = ({ authorizedFetch, knownStores = [], userLocation }) =>
} }
}, [selectedRegionId]); }, [selectedRegionId]);
useEffect(() => {
persistWatchTableState({ sorting, columnFilters });
}, [sorting, columnFilters]);
const watchedIds = useMemo( const watchedIds = useMemo(
() => new Set(watchList.map((entry) => String(entry.storeId))), () => new Set(watchList.map((entry) => String(entry.storeId))),
[watchList] [watchList]
@@ -282,11 +329,10 @@ const StoreWatchPage = ({ authorizedFetch, knownStores = [], userLocation }) =>
), ),
cell: ({ getValue }) => { cell: ({ getValue }) => {
const value = getValue(); const value = getValue();
return ( const label = value
<span className="text-sm text-gray-600"> ? new Date(value).toLocaleDateString('de-DE', { year: 'numeric', month: '2-digit', day: '2-digit' })
{value ? new Date(value).toLocaleDateString('de-DE') : 'unbekannt'} : '';
</span> return <div className="text-center font-mono text-xs text-gray-600">{label}</div>;
);
}, },
sortingFn: (rowA, rowB, columnId) => { sortingFn: (rowA, rowB, columnId) => {
const a = rowA.getValue(columnId); const a = rowA.getValue(columnId);