feat: checklist multi-type assignments, tab layouts for Fahrzeuge/Ausruestung, admin cleanup
- Migration 074: convert checklist vorlage single FK fields to junction tables (vorlage_fahrzeug_typen, vorlage_fahrzeuge, vorlage_ausruestung_typen, vorlage_ausruestungen) - Backend checklist service: multi-type create/update/query with array fields - Backend cleanup service: add checklist-history and reset-checklist-history targets - Frontend types/service: singular FK fields replaced with arrays (fahrzeug_typ_ids, etc.) - Frontend Checklisten.tsx: multi-select Autocomplete pickers for all assignment types - Fahrzeuge.tsx/Ausruestung.tsx: add tab layout (Uebersicht + Einstellungen), inline type CRUD - FahrzeugEinstellungen/AusruestungEinstellungen: replaced with redirects to tab URLs - Sidebar: add Uebersicht sub-items, update Einstellungen paths to tab URLs - DataManagementTab: add checklist-history cleanup and reset sections Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -225,7 +225,7 @@ const cleanupBodySchema = z.object({
|
||||
confirm: z.boolean().optional().default(false),
|
||||
});
|
||||
|
||||
type CleanupTarget = 'notifications' | 'audit-log' | 'events' | 'bookings' | 'orders' | 'vehicle-history' | 'equipment-history';
|
||||
type CleanupTarget = 'notifications' | 'audit-log' | 'events' | 'bookings' | 'orders' | 'vehicle-history' | 'equipment-history' | 'checklist-history';
|
||||
|
||||
const CLEANUP_TARGETS: Record<CleanupTarget, (days: number, confirm: boolean) => Promise<{ count: number; deleted: boolean }>> = {
|
||||
'notifications': (d, c) => cleanupService.cleanupNotifications(d, c),
|
||||
@@ -235,11 +235,13 @@ const CLEANUP_TARGETS: Record<CleanupTarget, (days: number, confirm: boolean) =>
|
||||
'orders': (d, c) => cleanupService.cleanupOrders(d, c),
|
||||
'vehicle-history': (d, c) => cleanupService.cleanupVehicleHistory(d, c),
|
||||
'equipment-history': (d, c) => cleanupService.cleanupEquipmentHistory(d, c),
|
||||
'checklist-history': (d, c) => cleanupService.cleanupChecklistHistory(d, c),
|
||||
};
|
||||
|
||||
router.delete('/cleanup/reset-bestellungen', authenticate, requirePermission('admin:write'), (req, res) => { req.params.resetTarget = 'reset-bestellungen'; return resetHandler(req, res); });
|
||||
router.delete('/cleanup/reset-ausruestung-anfragen', authenticate, requirePermission('admin:write'), (req, res) => { req.params.resetTarget = 'reset-ausruestung-anfragen'; return resetHandler(req, res); });
|
||||
router.delete('/cleanup/reset-issues', authenticate, requirePermission('admin:write'), (req, res) => { req.params.resetTarget = 'reset-issues'; return resetHandler(req, res); });
|
||||
router.delete('/cleanup/reset-checklist-history', authenticate, requirePermission('admin:write'), (req, res) => { req.params.resetTarget = 'reset-checklist-history'; return resetHandler(req, res); });
|
||||
router.delete('/cleanup/issues-all', authenticate, requirePermission('admin:write'), (req, res) => { req.params.resetTarget = 'issues-all'; return resetHandler(req, res); });
|
||||
|
||||
router.delete(
|
||||
@@ -279,6 +281,7 @@ const RESET_TARGETS: Record<string, (confirm: boolean) => Promise<{ count: numbe
|
||||
'reset-ausruestung-anfragen': (c) => cleanupService.resetAusruestungAnfragenSequence(c),
|
||||
'reset-issues': (c) => cleanupService.resetIssuesSequence(c),
|
||||
'issues-all': (c) => cleanupService.resetIssuesSequence(c),
|
||||
'reset-checklist-history': (c) => cleanupService.resetChecklistHistory(c),
|
||||
};
|
||||
|
||||
const resetHandler = async (req: Request, res: Response): Promise<void> => {
|
||||
|
||||
Reference in New Issue
Block a user