Remove duplicate compliance and DSGVO admin pages that have been superseded by the unified SDK pipeline. Update navigation, sidebar, roles, and module registry to reflect the new structure. Add DSFA corpus API proxy and source-policy components. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
101 lines
2.7 KiB
TypeScript
101 lines
2.7 KiB
TypeScript
/**
|
|
* Role-based Access System for Admin v2
|
|
*
|
|
* Roles determine which categories and modules are visible
|
|
*/
|
|
|
|
import { CategoryId } from './navigation'
|
|
|
|
export type RoleId = 'developer' | 'manager' | 'auditor' | 'dsb'
|
|
|
|
export interface Role {
|
|
id: RoleId
|
|
name: string
|
|
description: string
|
|
icon: string
|
|
visibleCategories: CategoryId[]
|
|
color: string
|
|
}
|
|
|
|
export const roles: Role[] = [
|
|
{
|
|
id: 'developer',
|
|
name: 'Entwickler',
|
|
description: 'Voller Zugriff auf alle Bereiche',
|
|
icon: 'code',
|
|
visibleCategories: ['compliance-sdk', 'ai', 'infrastructure', 'education', 'communication', 'development', 'website'],
|
|
color: 'bg-primary-100 border-primary-300 text-primary-700',
|
|
},
|
|
{
|
|
id: 'manager',
|
|
name: 'Manager',
|
|
description: 'Executive Uebersicht',
|
|
icon: 'chart',
|
|
visibleCategories: ['compliance-sdk', 'communication', 'website'],
|
|
color: 'bg-blue-100 border-blue-300 text-blue-700',
|
|
},
|
|
{
|
|
id: 'auditor',
|
|
name: 'Auditor',
|
|
description: 'Compliance Pruefung',
|
|
icon: 'clipboard',
|
|
visibleCategories: ['compliance-sdk'],
|
|
color: 'bg-amber-100 border-amber-300 text-amber-700',
|
|
},
|
|
{
|
|
id: 'dsb',
|
|
name: 'DSB',
|
|
description: 'Datenschutzbeauftragter',
|
|
icon: 'shield',
|
|
visibleCategories: ['compliance-sdk'],
|
|
color: 'bg-purple-100 border-purple-300 text-purple-700',
|
|
},
|
|
]
|
|
|
|
// Storage key for localStorage
|
|
const ROLE_STORAGE_KEY = 'admin-v2-selected-role'
|
|
|
|
// Get role by ID
|
|
export function getRoleById(id: RoleId): Role | undefined {
|
|
return roles.find(role => role.id === id)
|
|
}
|
|
|
|
// Check if category is visible for a role
|
|
export function isCategoryVisibleForRole(categoryId: CategoryId, roleId: RoleId): boolean {
|
|
const role = getRoleById(roleId)
|
|
return role ? role.visibleCategories.includes(categoryId) : false
|
|
}
|
|
|
|
// Get stored role from localStorage (client-side only)
|
|
export function getStoredRole(): RoleId | null {
|
|
if (typeof window === 'undefined') return null
|
|
const stored = localStorage.getItem(ROLE_STORAGE_KEY)
|
|
if (stored && roles.some(r => r.id === stored)) {
|
|
return stored as RoleId
|
|
}
|
|
return null
|
|
}
|
|
|
|
// Store role in localStorage
|
|
export function storeRole(roleId: RoleId): void {
|
|
if (typeof window === 'undefined') return
|
|
localStorage.setItem(ROLE_STORAGE_KEY, roleId)
|
|
}
|
|
|
|
// Clear stored role
|
|
export function clearStoredRole(): void {
|
|
if (typeof window === 'undefined') return
|
|
localStorage.removeItem(ROLE_STORAGE_KEY)
|
|
}
|
|
|
|
// Check if this is a first-time visitor (no role stored)
|
|
export function isFirstTimeVisitor(): boolean {
|
|
return getStoredRole() === null
|
|
}
|
|
|
|
// Get visible categories for a role
|
|
export function getVisibleCategoriesForRole(roleId: RoleId): CategoryId[] {
|
|
const role = getRoleById(roleId)
|
|
return role ? role.visibleCategories : []
|
|
}
|