rework issue system

This commit is contained in:
Matthias Hochmeister
2026-03-24 14:44:21 +01:00
parent 0dd5033664
commit 65994286b2
6 changed files with 53 additions and 14 deletions

View File

@@ -22,11 +22,22 @@ class PermissionController {
permissions = permissionService.getEffectivePermissions(groups); permissions = permissionService.getEffectivePermissions(groups);
} }
const maintenance = permissionService.getMaintenanceFlags();
logger.debug('GET /api/permissions/me', {
email: req.user?.email,
groups,
isAdmin,
permissionsCount: permissions.length,
maintenanceWissen: maintenance['wissen'] ?? false,
maintenanceAusruestungsanfrage: maintenance['ausruestungsanfrage'] ?? false,
});
res.json({ res.json({
success: true, success: true,
data: { data: {
permissions, permissions,
maintenance: permissionService.getMaintenanceFlags(), maintenance,
isAdmin, isAdmin,
}, },
}); });

View File

@@ -0,0 +1,7 @@
-- Update feature_groups label
UPDATE feature_groups SET label = 'Interne Bestellungen' WHERE id = 'ausruestungsanfrage';
-- Update permission descriptions to remove "Shop-" references
UPDATE permissions SET description = 'Katalog einsehen' WHERE id = 'ausruestungsanfrage:view';
UPDATE permissions SET description = 'Artikel im Katalog verwalten' WHERE id = 'ausruestungsanfrage:manage_catalog';
UPDATE permissions SET description = 'Dashboard-Widget für Anfragen' WHERE id = 'ausruestungsanfrage:widget';

View File

@@ -44,11 +44,11 @@ function BestellungenTab() {
return ( return (
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}> <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* Pending Ausrüstungsanfragen */} {/* Pending interne Bestellungen */}
{(requests?.length ?? 0) > 0 && ( {(requests?.length ?? 0) > 0 && (
<Paper sx={{ p: 2 }}> <Paper sx={{ p: 2 }}>
<Typography variant="h6" gutterBottom> <Typography variant="h6" gutterBottom>
Offene Ausrüstungsanfragen ({requests?.length}) Offene interne Bestellungen ({requests?.length})
</Typography> </Typography>
{requestsLoading ? ( {requestsLoading ? (
<CircularProgress size={24} /> <CircularProgress size={24} />

View File

@@ -34,7 +34,7 @@ interface ResetSection {
const RESET_SECTIONS: ResetSection[] = [ const RESET_SECTIONS: ResetSection[] = [
{ key: 'reset-bestellungen', label: 'Bestellungen zuruecksetzen', description: 'Alle Bestellungen, Positionen, Dateien, Erinnerungen und Historie loeschen und Nummern zuruecksetzen.' }, { key: 'reset-bestellungen', label: 'Bestellungen zuruecksetzen', description: 'Alle Bestellungen, Positionen, Dateien, Erinnerungen und Historie loeschen und Nummern zuruecksetzen.' },
{ key: 'reset-ausruestung-anfragen', label: 'Ausruestungsanfragen zuruecksetzen', description: 'Alle Ausruestungsanfragen und zugehoerige Positionen loeschen und Nummern zuruecksetzen.' }, { key: 'reset-ausruestung-anfragen', label: 'Interne Bestellungen zuruecksetzen', description: 'Alle internen Bestellungen und zugehoerige Positionen loeschen und Nummern zuruecksetzen.' },
{ key: 'reset-issues', label: 'Issues zuruecksetzen', description: 'Alle Issues und Kommentare loeschen und Nummern zuruecksetzen.' }, { key: 'reset-issues', label: 'Issues zuruecksetzen', description: 'Alle Issues und Kommentare loeschen und Nummern zuruecksetzen.' },
]; ];

View File

@@ -195,7 +195,7 @@ const ChatPanelInner: React.FC = () => {
sx={{ sx={{
display: { xs: 'none', sm: 'flex' }, display: { xs: 'none', sm: 'flex' },
flexDirection: 'column', flexDirection: 'column',
width: 56, width: 120,
flexShrink: 0, flexShrink: 0,
borderRight: 1, borderRight: 1,
borderColor: 'divider', borderColor: 'divider',
@@ -207,12 +207,21 @@ const ChatPanelInner: React.FC = () => {
const isSelected = room.token === selectedRoomToken; const isSelected = room.token === selectedRoomToken;
return ( return (
<Tooltip key={room.token} title={room.displayName} placement="left" arrow> <Tooltip key={room.token} title={room.displayName} placement="left" arrow>
<IconButton <Box
onClick={() => selectRoom(room.token)} onClick={() => selectRoom(room.token)}
sx={{ sx={{
mx: 'auto', display: 'flex',
my: 0.25, alignItems: 'center',
p: 0.5, gap: 0.75,
px: 1,
py: 0.5,
cursor: 'pointer',
borderRadius: 1,
mx: 0.5,
bgcolor: isSelected ? 'action.selected' : 'transparent',
'&:hover': {
bgcolor: isSelected ? 'action.selected' : 'action.hover',
},
}} }}
> >
<Badge <Badge
@@ -222,17 +231,29 @@ const ChatPanelInner: React.FC = () => {
> >
<Avatar <Avatar
sx={{ sx={{
width: 32, width: 28,
height: 32, height: 28,
fontSize: '0.7rem', fontSize: '0.65rem',
bgcolor: isSelected ? 'primary.main' : 'action.hover', bgcolor: isSelected ? 'primary.main' : 'action.hover',
color: isSelected ? 'primary.contrastText' : 'text.primary', color: isSelected ? 'primary.contrastText' : 'text.primary',
flexShrink: 0,
}} }}
> >
{room.displayName.substring(0, 2).toUpperCase()} {room.displayName.substring(0, 2).toUpperCase()}
</Avatar> </Avatar>
</Badge> </Badge>
</IconButton> <Typography
variant="caption"
noWrap
sx={{
flex: 1,
minWidth: 0,
fontWeight: isSelected ? 600 : 400,
}}
>
{room.displayName}
</Typography>
</Box>
</Tooltip> </Tooltip>
); );
})} })}

View File

@@ -28,7 +28,7 @@ export const PermissionProvider: React.FC<PermissionProviderProps> = ({ children
queryKey: ['my-permissions'], queryKey: ['my-permissions'],
queryFn: permissionsApi.getMyPermissions, queryFn: permissionsApi.getMyPermissions,
enabled: isAuthenticated, enabled: isAuthenticated,
staleTime: 5 * 60 * 1000, staleTime: 60 * 1000,
}); });
const permissions = useMemo( const permissions = useMemo(