fix(multi): FDISK sync, order UX, Ausbildungen display, untracked items
FDISK sync: - fix(sync): strip 'KFZ-Führerschein / ' prefix from license class select option text before whitelist validation - fix(sync): fix navigateAndGetTableRows to pick date column with most matches (prevents sidebar tables from hijacking dateColIdx for Beförderungen) - fix(sync): input.value fallback now falls through to textContent when value is empty - feat(sync): expand Ausbildungen to capture Kursnummer, Kurz, Kurs (full name), Erfolgscode from FDISK table; add migration 086 External orders (Bestellungen): - fix(bestellungen): allow erhalten_menge editing in lieferung_pruefen status (resolves deadlock preventing order completion) - fix(bestellungen): show cost/received warnings for bestellt/teillieferung/lieferung_pruefen, not just when abgeschlossen is next - feat(bestellungen): rename status labels to Eingereicht, Genehmigt, Teilweise geliefert, Vollständig geliefert - fix(bestellungen): remove duplicate Bestelldatum from PDF export - feat(bestellungen): add catalog item autocomplete to creation form (auto-fills bezeichnung + artikelnummer) Internal orders (Ausruestungsanfrage): - fix(ausruestung): untracked items with zuweisung_typ='keine' now appear in Nicht-zugewiesen tab (frontend filter was too strict) - feat(ausruestung): load user-specific personal items when ordering for another user - feat(ausruestung): auto-set ist_ersatz=true for items from personal equipment list; add toggle for catalog/free-text items - feat(ausruestung): load item eigenschaften when personal item with artikel_id is checked Ausbildungen display: - feat(mitglieder): show kursname (full), kurs_kurzbezeichnung chip, erfolgscode chip (color-coded) per Ausbildung entry Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1146,23 +1146,28 @@ function MitgliedDetail() {
|
||||
{a.kurs_datum ? new Date(a.kurs_datum).toLocaleDateString('de-AT') : '—'}
|
||||
</Typography>
|
||||
</Box>
|
||||
{(a.ort || a.status !== 'abgeschlossen') && (
|
||||
<Box sx={{ display: 'flex', gap: 1, alignItems: 'center', mt: 0.25 }}>
|
||||
{a.ort && (
|
||||
<Typography variant="body2" color="text.secondary">
|
||||
{a.ort}
|
||||
</Typography>
|
||||
)}
|
||||
{a.status !== 'abgeschlossen' && (
|
||||
<Chip
|
||||
label={a.status === 'in_bearbeitung' ? 'In Bearbeitung' : 'Abgelaufen'}
|
||||
size="small"
|
||||
color={a.status === 'abgelaufen' ? 'warning' : 'info'}
|
||||
variant="outlined"
|
||||
/>
|
||||
)}
|
||||
</Box>
|
||||
)}
|
||||
<Box sx={{ display: 'flex', gap: 0.5, flexWrap: 'wrap', alignItems: 'center', mt: 0.25 }}>
|
||||
{a.kurs_kurzbezeichnung && (
|
||||
<Chip label={a.kurs_kurzbezeichnung} size="small" variant="outlined" />
|
||||
)}
|
||||
{a.erfolgscode && (
|
||||
<Chip
|
||||
label={a.erfolgscode}
|
||||
size="small"
|
||||
variant="outlined"
|
||||
color={
|
||||
/mit erfolg|bestanden/i.test(a.erfolgscode) ? 'success'
|
||||
: /teilgenommen/i.test(a.erfolgscode) ? 'info'
|
||||
: 'default'
|
||||
}
|
||||
/>
|
||||
)}
|
||||
{a.ort && (
|
||||
<Typography variant="body2" color="text.secondary">
|
||||
{a.ort}
|
||||
</Typography>
|
||||
)}
|
||||
</Box>
|
||||
{a.ablaufdatum && (
|
||||
<Typography variant="caption" color="text.secondary">
|
||||
Gültig bis: {new Date(a.ablaufdatum).toLocaleDateString('de-AT')}
|
||||
|
||||
Reference in New Issue
Block a user