feat: vehicle/equipment type system, equipment checklist support, and checklist overview redesign
This commit is contained in:
@@ -63,10 +63,11 @@ function ChecklistWidget() {
|
||||
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 0.5 }}>
|
||||
{overdueItems.slice(0, 5).map((item) => {
|
||||
const days = Math.ceil((Date.now() - new Date(item.naechste_faellig_am).getTime()) / 86400000);
|
||||
const targetName = item.fahrzeug_name || item.ausruestung_name || '–';
|
||||
return (
|
||||
<Box key={`${item.fahrzeug_id}-${item.vorlage_id}`} sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
|
||||
<Box key={`${item.fahrzeug_id || item.ausruestung_id}-${item.vorlage_id}`} sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
|
||||
<Typography variant="body2" noWrap sx={{ maxWidth: '60%' }}>
|
||||
{item.fahrzeug_name}
|
||||
{targetName}
|
||||
</Typography>
|
||||
<Chip
|
||||
label={`${item.vorlage_name} \u2013 ${days > 0 ? `${days}d` : 'heute'}`}
|
||||
|
||||
@@ -192,12 +192,17 @@ function Sidebar({ mobileOpen, onMobileClose }: SidebarProps) {
|
||||
const menuOrder: string[] = (preferences?.menuOrder as string[] | undefined) ?? [];
|
||||
|
||||
const vehicleSubItems: SubItem[] = useMemo(
|
||||
() =>
|
||||
(vehicleList ?? []).map((v) => ({
|
||||
() => {
|
||||
const items: SubItem[] = (vehicleList ?? []).map((v) => ({
|
||||
text: v.bezeichnung ?? v.kurzname,
|
||||
path: `/fahrzeuge/${v.id}`,
|
||||
})),
|
||||
[vehicleList],
|
||||
}));
|
||||
if (hasPermission('fahrzeuge:edit')) {
|
||||
items.push({ text: 'Einstellungen', path: '/fahrzeuge/einstellungen' });
|
||||
}
|
||||
return items;
|
||||
},
|
||||
[vehicleList, hasPermission],
|
||||
);
|
||||
|
||||
const navigationItems = useMemo((): NavigationItem[] => {
|
||||
@@ -234,13 +239,19 @@ function Sidebar({ mobileOpen, onMobileClose }: SidebarProps) {
|
||||
];
|
||||
if (hasPermission('checklisten:manage_templates')) {
|
||||
checklistenSubItems.push({ text: 'Vorlagen', path: '/checklisten?tab=1' });
|
||||
checklistenSubItems.push({ text: 'Fahrzeugtypen', path: '/checklisten?tab=2' });
|
||||
}
|
||||
checklistenSubItems.push({ text: 'Historie', path: `/checklisten?tab=${checklistenSubItems.length}` });
|
||||
|
||||
const items = baseNavigationItems
|
||||
.map((item) => {
|
||||
if (item.path === '/fahrzeuge') return fahrzeugeItem;
|
||||
if (item.path === '/ausruestung') {
|
||||
const ausruestungSubs: SubItem[] = [];
|
||||
if (hasPermission('ausruestung:manage_types')) {
|
||||
ausruestungSubs.push({ text: 'Einstellungen', path: '/ausruestung/einstellungen' });
|
||||
}
|
||||
return ausruestungSubs.length > 0 ? { ...item, subItems: ausruestungSubs } : item;
|
||||
}
|
||||
if (item.path === '/ausruestungsanfrage') {
|
||||
const canSeeAusruestung =
|
||||
hasPermission('ausruestungsanfrage:view') ||
|
||||
|
||||
Reference in New Issue
Block a user