fix(dienstgrad): add ASB→Abschnittssachbearbeiter, remove non-existent ranks (FA/FF/BOI/BAM variants), sync DB constraint, TS types, and display map
This commit is contained in:
@@ -63,25 +63,25 @@ import { ConfirmDialog, StatusChip, PageHeader } from '../components/templates';
|
||||
// ── Helpers ──
|
||||
|
||||
const DIENSTGRAD_KURZ: Record<string, string> = {
|
||||
'Feuerwehranwärter': 'FA', 'Jugendfeuerwehrmann': 'JFM', 'Probefeuerwehrmann': 'PFM',
|
||||
'Feuerwehrmann': 'FM', 'Feuerwehrfrau': 'FF',
|
||||
'Oberfeuerwehrmann': 'OFM', 'Oberfeuerwehrfrau': 'OFF',
|
||||
'Hauptfeuerwehrmann': 'HFM', 'Hauptfeuerwehrfrau': 'HFF',
|
||||
'Jugendfeuerwehrmann': 'JFM', 'Probefeuerwehrmann': 'PFM',
|
||||
'Feuerwehrmann': 'FM',
|
||||
'Oberfeuerwehrmann': 'OFM',
|
||||
'Hauptfeuerwehrmann': 'HFM',
|
||||
'Löschmeister': 'LM', 'Oberlöschmeister': 'OLM', 'Hauptlöschmeister': 'HLM',
|
||||
'Brandmeister': 'BM', 'Oberbrandmeister': 'OBM', 'Hauptbrandmeister': 'HBM',
|
||||
'Brandinspektor': 'BI', 'Oberbrandinspektor': 'OBI', 'Brandoberinspektor': 'BOI',
|
||||
'Brandamtmann': 'BAM',
|
||||
'Brandinspektor': 'BI', 'Oberbrandinspektor': 'OBI',
|
||||
'Verwaltungsmeister': 'VM', 'Oberverwaltungsmeister': 'OVM',
|
||||
'Hauptverwaltungsmeister': 'HVM', 'Verwalter': 'V',
|
||||
'Ehren-Feuerwehrmann': 'E-FM', 'Ehren-Feuerwehrfrau': 'E-FF',
|
||||
'Ehren-Oberfeuerwehrmann': 'E-OFM', 'Ehren-Oberfeuerwehrfrau': 'E-OFF',
|
||||
'Ehren-Hauptfeuerwehrmann': 'E-HFM', 'Ehren-Hauptfeuerwehrfrau': 'E-HFF',
|
||||
'Sachbearbeiter': 'SB', 'Abschnittssachbearbeiter': 'ASB',
|
||||
'Ehren-Feuerwehrmann': 'E-FM',
|
||||
'Ehren-Oberfeuerwehrmann': 'E-OFM',
|
||||
'Ehren-Hauptfeuerwehrmann': 'E-HFM',
|
||||
'Ehren-Löschmeister': 'E-LM', 'Ehren-Oberlöschmeister': 'E-OLM', 'Ehren-Hauptlöschmeister': 'E-HLM',
|
||||
'Ehren-Brandmeister': 'E-BM', 'Ehren-Oberbrandmeister': 'E-OBM', 'Ehren-Hauptbrandmeister': 'E-HBM',
|
||||
'Ehren-Brandinspektor': 'E-BI', 'Ehren-Oberbrandinspektor': 'E-OBI', 'Ehren-Brandoberinspektor': 'E-BOI',
|
||||
'Ehren-Brandamtmann': 'E-BAM',
|
||||
'Ehren-Brandinspektor': 'E-BI', 'Ehren-Oberbrandinspektor': 'E-OBI',
|
||||
'Ehren-Verwaltungsmeister': 'E-VM', 'Ehren-Oberverwaltungsmeister': 'E-OVM',
|
||||
'Ehren-Hauptverwaltungsmeister': 'E-HVM', 'Ehren-Verwalter': 'E-V',
|
||||
'Ehren-Sachbearbeiter': 'ESB', 'Ehren-Abschnittssachbearbeiter': 'EASB',
|
||||
};
|
||||
|
||||
const kurzDienstgrad = (d?: string) => (d ? (DIENSTGRAD_KURZ[d] ?? d) : undefined);
|
||||
|
||||
@@ -117,7 +117,7 @@ function Mitglieder() {
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, [debouncedSearch, selectedStatus, selectedDienstgrad, page]);
|
||||
}, [debouncedSearch, selectedStatus, selectedDienstgrad, page, pageSize]);
|
||||
|
||||
useEffect(() => {
|
||||
// Reset to page 0 when search changes
|
||||
@@ -137,8 +137,7 @@ function Mitglieder() {
|
||||
return;
|
||||
}
|
||||
fetchMembers();
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [page, selectedStatus, selectedDienstgrad]);
|
||||
}, [page, pageSize, selectedStatus, selectedDienstgrad]);
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
// Event handlers
|
||||
@@ -275,6 +274,22 @@ function Mitglieder() {
|
||||
|
||||
{/* Table */}
|
||||
<Paper sx={{ width: '100%', overflow: 'hidden' }}>
|
||||
<TablePagination
|
||||
component="div"
|
||||
count={total}
|
||||
page={page}
|
||||
onPageChange={(_e, newPage) => setPage(newPage)}
|
||||
rowsPerPage={pageSize}
|
||||
rowsPerPageOptions={[25, 50, 100, { value: -1, label: 'Alle' }]}
|
||||
onRowsPerPageChange={(e) => {
|
||||
setPageSize(parseInt(e.target.value, 10));
|
||||
setPage(0);
|
||||
}}
|
||||
labelRowsPerPage="Einträge pro Seite:"
|
||||
labelDisplayedRows={({ from, to, count }) =>
|
||||
`${from}–${to} von ${count !== -1 ? count : `mehr als ${to}`}`
|
||||
}
|
||||
/>
|
||||
<DataTable<MemberListItem>
|
||||
columns={[
|
||||
{ key: 'profile_picture_url', label: 'Foto', width: 56, sortable: false, searchable: false, render: (member) => {
|
||||
@@ -330,22 +345,6 @@ function Mitglieder() {
|
||||
stickyHeader
|
||||
/>
|
||||
|
||||
<TablePagination
|
||||
component="div"
|
||||
count={total}
|
||||
page={page}
|
||||
onPageChange={(_e, newPage) => setPage(newPage)}
|
||||
rowsPerPage={pageSize}
|
||||
rowsPerPageOptions={[25, 50, 100, { value: -1, label: 'Alle' }]}
|
||||
onRowsPerPageChange={(e) => {
|
||||
setPageSize(parseInt(e.target.value, 10));
|
||||
setPage(0);
|
||||
}}
|
||||
labelRowsPerPage="Einträge pro Seite:"
|
||||
labelDisplayedRows={({ from, to, count }) =>
|
||||
`${from}–${to} von ${count !== -1 ? count : `mehr als ${to}`}`
|
||||
}
|
||||
/>
|
||||
</Paper>
|
||||
</Container>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user