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);
}
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({
success: true,
data: {
permissions,
maintenance: permissionService.getMaintenanceFlags(),
maintenance,
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 (
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* Pending Ausrüstungsanfragen */}
{/* Pending interne Bestellungen */}
{(requests?.length ?? 0) > 0 && (
<Paper sx={{ p: 2 }}>
<Typography variant="h6" gutterBottom>
Offene Ausrüstungsanfragen ({requests?.length})
Offene interne Bestellungen ({requests?.length})
</Typography>
{requestsLoading ? (
<CircularProgress size={24} />

View File

@@ -34,7 +34,7 @@ interface 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-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.' },
];

View File

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

View File

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