Fix: Freigaberollen korrekt filtern und speichern
- Korrigiere normalizeApprovalPermissions: verwende Set für korrekte Deduplizierung - Füge getAvailableApprovalRoles hinzu, um basierend auf der Benutzerrolle die verfügbaren Freigaberollen zu bestimmen: - ADMIN (Vorstand): Vorstand A, Vorstand B - FINANCE (Finanz-AG): Finanz-AG - MEMBER (AG-Mitglied): Keine - Aktualisiere renderApprovalPermissionSelector mit rollenbasierter Filterung - Verhindere Auswahl inkompatibler Kombinationen (z.B. Vorstand A + B zusammen)
This commit is contained in:
@@ -45,6 +45,7 @@ import {
|
|||||||
approvalLabel,
|
approvalLabel,
|
||||||
canManageBudgets,
|
canManageBudgets,
|
||||||
canManageUsers,
|
canManageUsers,
|
||||||
|
getAvailableApprovalRoles,
|
||||||
roleLabel
|
roleLabel
|
||||||
} from "@/lib/domain";
|
} from "@/lib/domain";
|
||||||
|
|
||||||
@@ -1091,7 +1092,8 @@ export function DashboardShell({
|
|||||||
function renderApprovalPermissionSelector(
|
function renderApprovalPermissionSelector(
|
||||||
value: ApprovalPermissionValue[],
|
value: ApprovalPermissionValue[],
|
||||||
onToggle: (approvalType: ApprovalPermissionValue) => void,
|
onToggle: (approvalType: ApprovalPermissionValue) => void,
|
||||||
helperText: string
|
helperText: string,
|
||||||
|
availableApprovalTypes: ApprovalPermissionValue[]
|
||||||
) {
|
) {
|
||||||
return (
|
return (
|
||||||
<Stack spacing={1}>
|
<Stack spacing={1}>
|
||||||
@@ -1099,7 +1101,8 @@ export function DashboardShell({
|
|||||||
Freigaberollen
|
Freigaberollen
|
||||||
</Typography>
|
</Typography>
|
||||||
<Stack direction="row" gap={1} useFlexGap flexWrap="wrap">
|
<Stack direction="row" gap={1} useFlexGap flexWrap="wrap">
|
||||||
{APPROVAL_FLOW.map((approvalType) => {
|
{availableApprovalTypes.length > 0 ? (
|
||||||
|
availableApprovalTypes.map((approvalType) => {
|
||||||
const selected = value.includes(approvalType);
|
const selected = value.includes(approvalType);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -1113,7 +1116,12 @@ export function DashboardShell({
|
|||||||
{approvalLabel(approvalType)}
|
{approvalLabel(approvalType)}
|
||||||
</Button>
|
</Button>
|
||||||
);
|
);
|
||||||
})}
|
})
|
||||||
|
) : (
|
||||||
|
<Typography variant="body2" color="text.secondary">
|
||||||
|
Keine Freigaberollen verfuegbar
|
||||||
|
</Typography>
|
||||||
|
)}
|
||||||
</Stack>
|
</Stack>
|
||||||
<Typography variant="body2" color="text.secondary">
|
<Typography variant="body2" color="text.secondary">
|
||||||
{helperText}
|
{helperText}
|
||||||
@@ -1778,7 +1786,8 @@ export function DashboardShell({
|
|||||||
...current,
|
...current,
|
||||||
approvalPermissions: toggleApprovalPermission(current.approvalPermissions, approvalType)
|
approvalPermissions: toggleApprovalPermission(current.approvalPermissions, approvalType)
|
||||||
})),
|
})),
|
||||||
"Lege fest, für welche Freigabeschritte dieses Konto zeichnen darf."
|
"Lege fest, für welche Freigabeschritte dieses Konto zeichnen darf.",
|
||||||
|
getAvailableApprovalRoles(userForm.role)
|
||||||
)}
|
)}
|
||||||
<Button type="submit" variant="outlined" disabled={busy}>
|
<Button type="submit" variant="outlined" disabled={busy}>
|
||||||
Nutzer speichern
|
Nutzer speichern
|
||||||
@@ -1970,7 +1979,8 @@ export function DashboardShell({
|
|||||||
updateManagedUserDraft(user, {
|
updateManagedUserDraft(user, {
|
||||||
approvalPermissions: toggleApprovalPermission(draft.approvalPermissions, approvalType)
|
approvalPermissions: toggleApprovalPermission(draft.approvalPermissions, approvalType)
|
||||||
}),
|
}),
|
||||||
"Lege fest, welche Freigabeschritte dieses Konto autorisieren darf."
|
"Lege fest, welche Freigabeschritte dieses Konto autorisieren darf.",
|
||||||
|
getAvailableApprovalRoles(draft.role)
|
||||||
)}
|
)}
|
||||||
<Stack direction="row" gap={1} useFlexGap flexWrap="wrap">
|
<Stack direction="row" gap={1} useFlexGap flexWrap="wrap">
|
||||||
<Button type="button" variant="contained" disabled={busy} onClick={() => handleUpdateUser(user)}>
|
<Button type="button" variant="contained" disabled={busy} onClick={() => handleUpdateUser(user)}>
|
||||||
|
|||||||
@@ -97,6 +97,17 @@ export function canDeleteExpense(
|
|||||||
return viewerId === creatorId && approvalStatus === "PENDING" && !paidAt && !documentedAt;
|
return viewerId === creatorId && approvalStatus === "PENDING" && !paidAt && !documentedAt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getAvailableApprovalRoles(role: AppRole): ApprovalTypeValue[] {
|
||||||
|
switch (role) {
|
||||||
|
case "ADMIN":
|
||||||
|
return ["CHAIR_A", "CHAIR_B"];
|
||||||
|
case "FINANCE":
|
||||||
|
return ["FINANCE"];
|
||||||
|
case "MEMBER":
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function normalizeApprovalPermissions(
|
export function normalizeApprovalPermissions(
|
||||||
_role: AppRole,
|
_role: AppRole,
|
||||||
approvalPermissions: ApprovalTypeValue[] | null | undefined,
|
approvalPermissions: ApprovalTypeValue[] | null | undefined,
|
||||||
@@ -104,9 +115,18 @@ export function normalizeApprovalPermissions(
|
|||||||
) {
|
) {
|
||||||
const rawPermissions = approvalPermissions ?? (approvalPreference ? [approvalPreference] : []);
|
const rawPermissions = approvalPermissions ?? (approvalPreference ? [approvalPreference] : []);
|
||||||
|
|
||||||
return APPROVAL_FLOW.filter(
|
// Deduplizierung: behalte jeden Eintrag nur beim ersten Vorkommen
|
||||||
(approvalType, index) => rawPermissions.includes(approvalType) && rawPermissions.indexOf(approvalType) === index
|
const seen = new Set<ApprovalTypeValue>();
|
||||||
) as ApprovalTypeValue[];
|
const unique: ApprovalTypeValue[] = [];
|
||||||
|
for (const perm of rawPermissions) {
|
||||||
|
if (!seen.has(perm)) {
|
||||||
|
seen.add(perm);
|
||||||
|
unique.push(perm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sortiere nach der Reihenfolge in APPROVAL_FLOW
|
||||||
|
return APPROVAL_FLOW.filter((type) => unique.includes(type)) as ApprovalTypeValue[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getLegacyApprovalPreference(approvalPermissions: ApprovalTypeValue[]) {
|
export function getLegacyApprovalPreference(approvalPermissions: ApprovalTypeValue[]) {
|
||||||
|
|||||||
Reference in New Issue
Block a user