feat(sprint8): Phase 4 — Dokumentenarchiv + Vorstandsverwaltung

Backend:
- V20 migration: documents table with category, access_level, file storage
- V21 migration: board_positions + board_members with term tracking
- Document entity + DocumentCategory/DocumentAccessLevel enums
- BoardPosition + BoardMember entities
- Extended AuditEventType (DOCUMENT_UPLOADED/DELETED, BOARD_MEMBER_ELECTED/REMOVED)
- Extended StaffPermission (MANAGE_DOCUMENTS)
- Extended NotificationType (BOARD_TERM_EXPIRING)
- DocumentService: upload, list, download, delete, storage usage
- BoardService: positions CRUD, elect/remove members, current/history
- DocumentController: multipart upload, filtered list, download, delete, portal
- BoardController: positions, elect, remove, current board, history, portal

Frontend:
- documents.ts + board.ts service layers
- Admin /documents page: grouped by category, upload dialog, filter, download/delete
- Admin /board page: current board cards, position management, elect member dialog
- Navigation: added Dokumente + Vorstand to sidebar
- i18n: documents.* + board.* keys in de.json + en.json
This commit is contained in:
Patrick Plate
2026-06-15 08:53:38 +02:00
parent b22702317a
commit e4698827ee
24 changed files with 1812 additions and 5 deletions
+56 -1
View File
@@ -949,5 +949,60 @@
"paymentHistory": "Zahlungshistorie",
"noPayments": "Noch keine Zahlungen vorhanden"
}
},
"documents": {
"title": "Dokumentenarchiv",
"description": "Vereinsdokumente verwalten und archivieren",
"upload": "Hochladen",
"uploadDocument": "Dokument hochladen",
"documentTitle": "Titel",
"titlePlaceholder": "z.B. Vereinssatzung 2024",
"category": "Kategorie",
"selectCategory": "Kategorie wählen",
"accessLevel": "Zugriff",
"allMembers": "Alle Mitglieder",
"boardOnly": "Nur Vorstand",
"descriptionLabel": "Beschreibung",
"descriptionPlaceholder": "Optionale Beschreibung...",
"file": "Datei",
"fileHint": "PDF, DOCX, XLSX, PNG, JPG — max. 10 MB",
"uploadButton": "Dokument hochladen",
"allCategories": "Alle Kategorien",
"documentsCount": "Dokumente",
"name": "Name",
"access": "Zugriff",
"size": "Größe",
"date": "Datum",
"actions": "Aktionen"
},
"board": {
"title": "Vorstand",
"description": "Vorstandspositionen und -mitglieder verwalten",
"addPosition": "Position anlegen",
"electMember": "Mitglied wählen",
"createPosition": "Position erstellen",
"positionTitle": "Titel",
"positionTitlePlaceholder": "z.B. 1. Vorsitzender",
"positionDescription": "Beschreibung",
"positionDescPlaceholder": "z.B. Gesetzlicher Vertreter gem. §26 BGB",
"sortOrder": "Reihenfolge",
"save": "Speichern",
"electBoardMember": "Vorstandsmitglied wählen",
"position": "Position",
"selectPosition": "Position wählen",
"member": "Mitglied",
"selectMember": "Mitglied wählen",
"electedAt": "Gewählt am",
"termStart": "Amtszeit Beginn",
"termEnd": "Amtszeit Ende",
"confirmElection": "Wahl bestätigen",
"elected": "Gewählt",
"term": "Amtszeit",
"unlimited": "unbefristet",
"termExpiringSoon": "Läuft bald ab",
"termActive": "Aktiv",
"positions": "Positionen",
"active": "Aktiv",
"inactive": "Inaktiv"
}
}
}
+56 -1
View File
@@ -949,5 +949,60 @@
"paymentHistory": "Payment History",
"noPayments": "No payments yet"
}
},
"documents": {
"title": "Document Archive",
"description": "Manage and archive club documents",
"upload": "Upload",
"uploadDocument": "Upload Document",
"documentTitle": "Title",
"titlePlaceholder": "e.g. Club Bylaws 2024",
"category": "Category",
"selectCategory": "Select category",
"accessLevel": "Access",
"allMembers": "All Members",
"boardOnly": "Board Only",
"descriptionLabel": "Description",
"descriptionPlaceholder": "Optional description...",
"file": "File",
"fileHint": "PDF, DOCX, XLSX, PNG, JPG — max. 10 MB",
"uploadButton": "Upload Document",
"allCategories": "All Categories",
"documentsCount": "documents",
"name": "Name",
"access": "Access",
"size": "Size",
"date": "Date",
"actions": "Actions"
},
"board": {
"title": "Board",
"description": "Manage board positions and members",
"addPosition": "Add Position",
"electMember": "Elect Member",
"createPosition": "Create Position",
"positionTitle": "Title",
"positionTitlePlaceholder": "e.g. President",
"positionDescription": "Description",
"positionDescPlaceholder": "e.g. Legal representative",
"sortOrder": "Sort Order",
"save": "Save",
"electBoardMember": "Elect Board Member",
"position": "Position",
"selectPosition": "Select position",
"member": "Member",
"selectMember": "Select member",
"electedAt": "Elected on",
"termStart": "Term Start",
"termEnd": "Term End",
"confirmElection": "Confirm Election",
"elected": "Elected",
"term": "Term",
"unlimited": "unlimited",
"termExpiringSoon": "Expiring soon",
"termActive": "Active",
"positions": "Positions",
"active": "Active",
"inactive": "Inactive"
}
}
}