@mostajs/rbac 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +694 -0
  2. package/dist/api/categories-id.d.ts +21 -0
  3. package/dist/api/categories-id.d.ts.map +1 -0
  4. package/dist/api/categories-id.js +66 -0
  5. package/dist/api/categories-id.js.map +1 -0
  6. package/dist/api/categories.d.ts +15 -0
  7. package/dist/api/categories.d.ts.map +1 -0
  8. package/dist/api/categories.js +65 -0
  9. package/dist/api/categories.js.map +1 -0
  10. package/dist/api/matrix.d.ts +15 -0
  11. package/dist/api/matrix.d.ts.map +1 -0
  12. package/dist/api/matrix.js +104 -0
  13. package/dist/api/matrix.js.map +1 -0
  14. package/dist/api/permissions-id.d.ts +21 -0
  15. package/dist/api/permissions-id.d.ts.map +1 -0
  16. package/dist/api/permissions-id.js +48 -0
  17. package/dist/api/permissions-id.js.map +1 -0
  18. package/dist/api/permissions.d.ts +16 -0
  19. package/dist/api/permissions.d.ts.map +1 -0
  20. package/dist/api/permissions.js +102 -0
  21. package/dist/api/permissions.js.map +1 -0
  22. package/dist/api/roles-id.d.ts +27 -0
  23. package/dist/api/roles-id.d.ts.map +1 -0
  24. package/dist/api/roles-id.js +89 -0
  25. package/dist/api/roles-id.js.map +1 -0
  26. package/dist/api/roles.d.ts +15 -0
  27. package/dist/api/roles.d.ts.map +1 -0
  28. package/dist/api/roles.js +65 -0
  29. package/dist/api/roles.js.map +1 -0
  30. package/dist/api/seed.d.ts +16 -0
  31. package/dist/api/seed.d.ts.map +1 -0
  32. package/dist/api/seed.js +49 -0
  33. package/dist/api/seed.js.map +1 -0
  34. package/dist/api/users-id.d.ts +28 -0
  35. package/dist/api/users-id.d.ts.map +1 -0
  36. package/dist/api/users-id.js +94 -0
  37. package/dist/api/users-id.js.map +1 -0
  38. package/dist/api/users.d.ts +17 -0
  39. package/dist/api/users.d.ts.map +1 -0
  40. package/dist/api/users.js +80 -0
  41. package/dist/api/users.js.map +1 -0
  42. package/dist/components/CategoriesManager.d.ts +5 -0
  43. package/dist/components/CategoriesManager.d.ts.map +1 -0
  44. package/dist/components/CategoriesManager.js +115 -0
  45. package/dist/components/CategoriesManager.js.map +1 -0
  46. package/dist/components/PermissionMatrix.d.ts +5 -0
  47. package/dist/components/PermissionMatrix.d.ts.map +1 -0
  48. package/dist/components/PermissionMatrix.js +82 -0
  49. package/dist/components/PermissionMatrix.js.map +1 -0
  50. package/dist/components/PermissionsManager.d.ts +5 -0
  51. package/dist/components/PermissionsManager.d.ts.map +1 -0
  52. package/dist/components/PermissionsManager.js +89 -0
  53. package/dist/components/PermissionsManager.js.map +1 -0
  54. package/dist/components/RBACManager.d.ts +5 -0
  55. package/dist/components/RBACManager.d.ts.map +1 -0
  56. package/dist/components/RBACManager.js +16 -0
  57. package/dist/components/RBACManager.js.map +1 -0
  58. package/dist/components/RolesManager.d.ts +5 -0
  59. package/dist/components/RolesManager.d.ts.map +1 -0
  60. package/dist/components/RolesManager.js +97 -0
  61. package/dist/components/RolesManager.js.map +1 -0
  62. package/dist/components/UsersManager.d.ts +10 -0
  63. package/dist/components/UsersManager.d.ts.map +1 -0
  64. package/dist/components/UsersManager.js +111 -0
  65. package/dist/components/UsersManager.js.map +1 -0
  66. package/dist/components/ui/alert-dialog.d.ts +19 -0
  67. package/dist/components/ui/alert-dialog.d.ts.map +1 -0
  68. package/dist/components/ui/alert-dialog.js +67 -0
  69. package/dist/components/ui/alert-dialog.js.map +1 -0
  70. package/dist/components/ui/badge.d.ts +10 -0
  71. package/dist/components/ui/badge.d.ts.map +1 -0
  72. package/dist/components/ui/badge.js +37 -0
  73. package/dist/components/ui/badge.js.map +1 -0
  74. package/dist/components/ui/button.d.ts +11 -0
  75. package/dist/components/ui/button.d.ts.map +1 -0
  76. package/dist/components/ui/button.js +48 -0
  77. package/dist/components/ui/button.js.map +1 -0
  78. package/dist/components/ui/card.d.ts +10 -0
  79. package/dist/components/ui/card.d.ts.map +1 -0
  80. package/dist/components/ui/card.js +43 -0
  81. package/dist/components/ui/card.js.map +1 -0
  82. package/dist/components/ui/checkbox.d.ts +5 -0
  83. package/dist/components/ui/checkbox.d.ts.map +1 -0
  84. package/dist/components/ui/checkbox.js +23 -0
  85. package/dist/components/ui/checkbox.js.map +1 -0
  86. package/dist/components/ui/dialog.d.ts +18 -0
  87. package/dist/components/ui/dialog.d.ts.map +1 -0
  88. package/dist/components/ui/dialog.js +60 -0
  89. package/dist/components/ui/dialog.js.map +1 -0
  90. package/dist/components/ui/input.d.ts +4 -0
  91. package/dist/components/ui/input.d.ts.map +1 -0
  92. package/dist/components/ui/input.js +19 -0
  93. package/dist/components/ui/input.js.map +1 -0
  94. package/dist/components/ui/label.d.ts +5 -0
  95. package/dist/components/ui/label.d.ts.map +1 -0
  96. package/dist/components/ui/label.js +22 -0
  97. package/dist/components/ui/label.js.map +1 -0
  98. package/dist/components/ui/select.d.ts +16 -0
  99. package/dist/components/ui/select.d.ts.map +1 -0
  100. package/dist/components/ui/select.js +61 -0
  101. package/dist/components/ui/select.js.map +1 -0
  102. package/dist/components/ui/table.d.ts +11 -0
  103. package/dist/components/ui/table.d.ts.map +1 -0
  104. package/dist/components/ui/table.js +49 -0
  105. package/dist/components/ui/table.js.map +1 -0
  106. package/dist/components/ui/tabs.d.ts +12 -0
  107. package/dist/components/ui/tabs.d.ts.map +1 -0
  108. package/dist/components/ui/tabs.js +46 -0
  109. package/dist/components/ui/tabs.js.map +1 -0
  110. package/dist/index.d.ts +19 -0
  111. package/dist/index.d.ts.map +1 -0
  112. package/dist/index.js +15 -0
  113. package/dist/index.js.map +1 -0
  114. package/dist/lib/rbac-api.d.ts +66 -0
  115. package/dist/lib/rbac-api.d.ts.map +1 -0
  116. package/dist/lib/rbac-api.js +158 -0
  117. package/dist/lib/rbac-api.js.map +1 -0
  118. package/dist/lib/utils.d.ts +3 -0
  119. package/dist/lib/utils.d.ts.map +1 -0
  120. package/dist/lib/utils.js +7 -0
  121. package/dist/lib/utils.js.map +1 -0
  122. package/dist/server.d.ts +21 -0
  123. package/dist/server.d.ts.map +1 -0
  124. package/dist/server.js +14 -0
  125. package/dist/server.js.map +1 -0
  126. package/dist/types/index.d.ts +88 -0
  127. package/dist/types/index.d.ts.map +1 -0
  128. package/dist/types/index.js +4 -0
  129. package/dist/types/index.js.map +1 -0
  130. package/package.json +126 -0
@@ -0,0 +1,115 @@
1
+ // Author: Dr Hamid MADANI drmdh@msn.com
2
+ 'use client';
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { useState } from 'react';
5
+ import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
6
+ import { Button } from './ui/button';
7
+ import { Input } from './ui/input';
8
+ import { Label } from './ui/label';
9
+ import { Badge } from './ui/badge';
10
+ import { Card, CardContent } from './ui/card';
11
+ import { Dialog, DialogContent, DialogHeader, DialogTitle, } from './ui/dialog';
12
+ import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from './ui/alert-dialog';
13
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from './ui/table';
14
+ import { Plus, Pencil, Trash2, Loader2 } from 'lucide-react';
15
+ import { toast } from 'sonner';
16
+ import { createCategoriesApi, createPermissionsApi } from '../lib/rbac-api';
17
+ const defaultT = (key) => key;
18
+ export function CategoriesManager({ apiBasePath = '/api', t = defaultT, }) {
19
+ const catApi = createCategoriesApi(apiBasePath);
20
+ const permApi = createPermissionsApi(apiBasePath);
21
+ const queryClient = useQueryClient();
22
+ const { data: categories, isLoading } = useQuery({ queryKey: ['categories'], queryFn: catApi.fetchCategories });
23
+ const { data: permData } = useQuery({ queryKey: ['permissions'], queryFn: permApi.fetchPermissions });
24
+ const [dialogOpen, setDialogOpen] = useState(false);
25
+ const [editingCat, setEditingCat] = useState(null);
26
+ const [form, setForm] = useState({ name: '', label: '', description: '', icon: '', order: 0 });
27
+ const [confirmDeleteId, setConfirmDeleteId] = useState(null);
28
+ // Count permissions per category
29
+ const permCountByCategory = {};
30
+ if (permData === null || permData === void 0 ? void 0 : permData.data) {
31
+ for (const p of permData.data) {
32
+ const cat = p.category || 'other';
33
+ permCountByCategory[cat] = (permCountByCategory[cat] || 0) + 1;
34
+ }
35
+ }
36
+ const createMut = useMutation({
37
+ mutationFn: () => catApi.createCategory(form),
38
+ onSuccess: () => {
39
+ queryClient.invalidateQueries({ queryKey: ['categories'] });
40
+ queryClient.invalidateQueries({ queryKey: ['permissions'] });
41
+ queryClient.invalidateQueries({ queryKey: ['matrix'] });
42
+ setDialogOpen(false);
43
+ resetForm();
44
+ toast.success(t('roles.categories.created'));
45
+ },
46
+ onError: (err) => toast.error(err.message),
47
+ });
48
+ const updateMut = useMutation({
49
+ mutationFn: () => catApi.updateCategory(editingCat.id, {
50
+ label: form.label,
51
+ description: form.description,
52
+ icon: form.icon,
53
+ order: form.order,
54
+ }),
55
+ onSuccess: () => {
56
+ queryClient.invalidateQueries({ queryKey: ['categories'] });
57
+ queryClient.invalidateQueries({ queryKey: ['permissions'] });
58
+ queryClient.invalidateQueries({ queryKey: ['matrix'] });
59
+ setDialogOpen(false);
60
+ setEditingCat(null);
61
+ resetForm();
62
+ toast.success(t('roles.categories.updated'));
63
+ },
64
+ onError: (err) => toast.error(err.message),
65
+ });
66
+ const deleteMut = useMutation({
67
+ mutationFn: catApi.deleteCategory,
68
+ onSuccess: () => {
69
+ queryClient.invalidateQueries({ queryKey: ['categories'] });
70
+ toast.success(t('roles.categories.deleted'));
71
+ },
72
+ onError: (err) => toast.error(err.message),
73
+ });
74
+ function resetForm() {
75
+ setForm({ name: '', label: '', description: '', icon: '', order: 0 });
76
+ }
77
+ function openCreate() {
78
+ resetForm();
79
+ setEditingCat(null);
80
+ setDialogOpen(true);
81
+ }
82
+ function openEdit(cat) {
83
+ setEditingCat(cat);
84
+ setForm({
85
+ name: cat.name,
86
+ label: cat.label,
87
+ description: cat.description || '',
88
+ icon: cat.icon || '',
89
+ order: cat.order,
90
+ });
91
+ setDialogOpen(true);
92
+ }
93
+ function handleSubmit(e) {
94
+ e.preventDefault();
95
+ if (editingCat) {
96
+ updateMut.mutate();
97
+ }
98
+ else {
99
+ createMut.mutate();
100
+ }
101
+ }
102
+ const isPending = createMut.isPending || updateMut.isPending;
103
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx("div", { className: "flex justify-end", children: _jsxs(Button, { onClick: openCreate, children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), t('roles.categories.create')] }) }), _jsx(Card, { children: _jsx(CardContent, { className: "p-0", children: isLoading ? (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "h-6 w-6 animate-spin text-gray-400" }) })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: t('roles.categories.name') }), _jsx(TableHead, { children: t('roles.categories.label') }), _jsx(TableHead, { children: t('roles.categories.description') }), _jsx(TableHead, { className: "text-center", children: t('roles.categories.order') }), _jsx(TableHead, { className: "text-center", children: t('roles.categories.permissions') }), _jsx(TableHead, { className: "text-center", children: "Type" }), _jsx(TableHead, { className: "w-24" })] }) }), _jsxs(TableBody, { children: [categories === null || categories === void 0 ? void 0 : categories.map((cat) => (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "font-medium font-mono text-sm", children: cat.name }), _jsx(TableCell, { children: cat.label }), _jsx(TableCell, { className: "text-gray-500 text-sm", children: cat.description || '-' }), _jsx(TableCell, { className: "text-center", children: cat.order }), _jsx(TableCell, { className: "text-center", children: _jsx(Badge, { variant: "secondary", children: permCountByCategory[cat.name] || 0 }) }), _jsx(TableCell, { className: "text-center", children: cat.system ? (_jsx(Badge, { className: "bg-amber-100 text-amber-800", children: t('roles.categories.system') })) : (_jsx(Badge, { variant: "secondary", children: "Custom" })) }), _jsx(TableCell, { children: _jsxs("div", { className: "flex gap-1", children: [_jsx(Button, { variant: "ghost", size: "icon", onClick: () => openEdit(cat), className: "h-8 w-8", disabled: cat._fallback, children: _jsx(Pencil, { className: "h-4 w-4" }) }), _jsx(Button, { variant: "ghost", size: "icon", onClick: () => {
104
+ if (cat.system) {
105
+ toast.error(t('roles.categories.cannotDeleteSystem'));
106
+ return;
107
+ }
108
+ if ((permCountByCategory[cat.name] || 0) > 0) {
109
+ toast.error(t('roles.categories.cannotDeletePermissionsUsing'));
110
+ return;
111
+ }
112
+ setConfirmDeleteId(cat.id);
113
+ }, className: "h-8 w-8 text-red-600 hover:text-red-700", disabled: cat._fallback || cat.system, children: _jsx(Trash2, { className: "h-4 w-4" }) })] }) })] }, cat.id))), (!categories || categories.length === 0) && (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: 7, className: "text-center py-8 text-gray-400", children: t('roles.categories.noCategories') }) }))] })] })) }) }), _jsx(Dialog, { open: dialogOpen, onOpenChange: setDialogOpen, children: _jsxs(DialogContent, { className: "max-w-md", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: editingCat ? t('roles.categories.edit') : t('roles.categories.create') }) }), _jsxs("form", { onSubmit: handleSubmit, className: "space-y-4", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: t('roles.categories.name') }), _jsx(Input, { value: form.name, onChange: (e) => setForm(Object.assign(Object.assign({}, form), { name: e.target.value })), placeholder: t('roles.categories.namePlaceholder'), required: true, disabled: !!editingCat, pattern: "^[a-z][a-z0-9_]*$", title: "Minuscules, chiffres et underscores uniquement" })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: t('roles.categories.label') }), _jsx(Input, { value: form.label, onChange: (e) => setForm(Object.assign(Object.assign({}, form), { label: e.target.value })), placeholder: t('roles.categories.labelPlaceholder'), required: true })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: t('roles.categories.description') }), _jsx(Input, { value: form.description, onChange: (e) => setForm(Object.assign(Object.assign({}, form), { description: e.target.value })) })] }), _jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: t('roles.categories.icon') }), _jsx(Input, { value: form.icon, onChange: (e) => setForm(Object.assign(Object.assign({}, form), { icon: e.target.value })), placeholder: "ex: UserCheck" })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: t('roles.categories.order') }), _jsx(Input, { type: "number", value: form.order, onChange: (e) => setForm(Object.assign(Object.assign({}, form), { order: parseInt(e.target.value) || 0 })), min: 0 })] })] }), _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx(Button, { type: "button", variant: "outline", onClick: () => setDialogOpen(false), children: t('common.actions.cancel') }), _jsxs(Button, { type: "submit", disabled: isPending, children: [isPending && _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), t('common.actions.save')] })] })] })] }) }), _jsx(AlertDialog, { open: confirmDeleteId !== null, onOpenChange: (o) => !o && setConfirmDeleteId(null), children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: t('common.actions.confirm') }), _jsx(AlertDialogDescription, { children: t('roles.categories.confirmDelete') })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { children: t('common.actions.cancel') }), _jsx(AlertDialogAction, { onClick: () => { deleteMut.mutate(confirmDeleteId); setConfirmDeleteId(null); }, children: t('common.actions.delete') })] })] }) })] }));
114
+ }
115
+ //# sourceMappingURL=CategoriesManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CategoriesManager.js","sourceRoot":"","sources":["../../components/CategoriesManager.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { RBACConfig } from '../types';
2
+ export interface PermissionMatrixProps extends RBACConfig {
3
+ }
4
+ export declare function PermissionMatrix({ apiBasePath, t, }: PermissionMatrixProps): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=PermissionMatrix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionMatrix.d.ts","sourceRoot":"","sources":["../../components/PermissionMatrix.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAI1C,MAAM,WAAW,qBAAsB,SAAQ,UAAU;CAAG;AAE5D,wBAAgB,gBAAgB,CAAC,EAC/B,WAAoB,EACpB,CAAY,GACb,EAAE,qBAAqB,2CAwLvB"}
@@ -0,0 +1,82 @@
1
+ // Author: Dr Hamid MADANI drmdh@msn.com
2
+ 'use client';
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { useState, useCallback, Fragment } from 'react';
5
+ import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
6
+ import { Button } from './ui/button';
7
+ import { Badge } from './ui/badge';
8
+ import { Card, CardContent } from './ui/card';
9
+ import { Checkbox } from './ui/checkbox';
10
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from './ui/table';
11
+ import { Loader2, Save, Database } from 'lucide-react';
12
+ import { toast } from 'sonner';
13
+ import { createMatrixApi } from '../lib/rbac-api';
14
+ const defaultT = (key) => key;
15
+ export function PermissionMatrix({ apiBasePath = '/api', t = defaultT, }) {
16
+ const api = createMatrixApi(apiBasePath);
17
+ const queryClient = useQueryClient();
18
+ const { data: matrix, isLoading } = useQuery({ queryKey: ['matrix'], queryFn: api.fetchMatrix });
19
+ const [pendingChanges, setPendingChanges] = useState({});
20
+ const pendingCount = Object.values(pendingChanges).reduce((acc, perms) => acc + Object.keys(perms).length, 0);
21
+ const seedMutation = useMutation({
22
+ mutationFn: api.seedRbac,
23
+ onSuccess: () => {
24
+ queryClient.invalidateQueries({ queryKey: ['matrix'] });
25
+ queryClient.invalidateQueries({ queryKey: ['roles'] });
26
+ queryClient.invalidateQueries({ queryKey: ['permissions'] });
27
+ queryClient.invalidateQueries({ queryKey: ['categories'] });
28
+ toast.success(t('roles.matrix.initialized'));
29
+ },
30
+ onError: (err) => toast.error(err.message),
31
+ });
32
+ const saveMutation = useMutation({
33
+ mutationFn: () => {
34
+ const changes = [];
35
+ for (const [roleId, perms] of Object.entries(pendingChanges)) {
36
+ for (const [permId, granted] of Object.entries(perms)) {
37
+ changes.push({ roleId, permissionId: permId, granted });
38
+ }
39
+ }
40
+ return api.saveChanges(changes);
41
+ },
42
+ onSuccess: () => {
43
+ setPendingChanges({});
44
+ queryClient.invalidateQueries({ queryKey: ['matrix'] });
45
+ queryClient.invalidateQueries({ queryKey: ['roles'] });
46
+ toast.success(t('roles.matrix.saved'));
47
+ },
48
+ onError: (err) => toast.error(err.message),
49
+ });
50
+ const toggleCell = useCallback((roleId, permId, currentValue) => {
51
+ setPendingChanges((prev) => {
52
+ const copy = Object.assign({}, prev);
53
+ if (!copy[roleId])
54
+ copy[roleId] = {};
55
+ const newValue = !currentValue;
56
+ copy[roleId] = Object.assign(Object.assign({}, copy[roleId]), { [permId]: newValue });
57
+ return copy;
58
+ });
59
+ }, []);
60
+ const getCellValue = useCallback((roleId, permId) => {
61
+ var _a, _b;
62
+ if (((_a = pendingChanges[roleId]) === null || _a === void 0 ? void 0 : _a[permId]) !== undefined) {
63
+ return pendingChanges[roleId][permId];
64
+ }
65
+ return ((_b = matrix === null || matrix === void 0 ? void 0 : matrix.matrix[roleId]) === null || _b === void 0 ? void 0 : _b[permId]) || false;
66
+ }, [pendingChanges, matrix]);
67
+ if (isLoading) {
68
+ return (_jsx("div", { className: "flex items-center justify-center p-12", children: _jsx(Loader2, { className: "h-6 w-6 animate-spin text-gray-400" }) }));
69
+ }
70
+ // No data — show init button
71
+ if (!matrix || Object.keys(matrix.categories).length === 0) {
72
+ return (_jsx(Card, { children: _jsxs(CardContent, { className: "flex flex-col items-center justify-center py-16 gap-4", children: [_jsx(Database, { className: "h-12 w-12 text-gray-300" }), _jsx("p", { className: "text-gray-500", children: t('roles.matrix.noData') }), _jsxs(Button, { onClick: () => seedMutation.mutate(), disabled: seedMutation.isPending, children: [seedMutation.isPending && _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), _jsx(Database, { className: "mr-2 h-4 w-4" }), t('roles.matrix.initRbac')] })] }) }));
73
+ }
74
+ const categoryLabels = matrix.categoryLabels || {};
75
+ return (_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: "flex items-center gap-3", children: pendingCount > 0 && (_jsxs(Badge, { variant: "secondary", className: "bg-amber-100 text-amber-800", children: [pendingCount, " ", t('roles.matrix.pending')] })) }), _jsxs("div", { className: "flex gap-2", children: [_jsxs(Button, { variant: "outline", onClick: () => seedMutation.mutate(), disabled: seedMutation.isPending, size: "sm", children: [seedMutation.isPending ? _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }) : _jsx(Database, { className: "mr-2 h-4 w-4" }), t('roles.matrix.initRbac')] }), _jsxs(Button, { onClick: () => saveMutation.mutate(), disabled: pendingCount === 0 || saveMutation.isPending, size: "sm", children: [saveMutation.isPending ? _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }) : _jsx(Save, { className: "mr-2 h-4 w-4" }), t('roles.matrix.save')] })] })] }), _jsx(Card, { children: _jsx(CardContent, { className: "p-0 overflow-x-auto", children: _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { className: "sticky left-0 bg-white z-10 min-w-[250px]", children: "Permission" }), matrix.roles.map((role) => (_jsx(TableHead, { className: "text-center min-w-[120px]", children: _jsx("div", { className: "font-medium", children: role.name }) }, role.id)))] }) }), _jsx(TableBody, { children: Object.entries(matrix.categories).map(([category, perms]) => (_jsxs(Fragment, { children: [_jsx(TableRow, { className: "bg-gray-50", children: _jsx(TableCell, { colSpan: matrix.roles.length + 1, className: "font-semibold text-gray-700 py-2", children: categoryLabels[category] || category }) }), perms.map((perm) => (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "sticky left-0 bg-white z-10", children: _jsxs("div", { children: [_jsx("span", { className: "font-mono text-sm", children: perm.name }), perm.description && (_jsx("p", { className: "text-xs text-gray-400 mt-0.5", children: perm.description }))] }) }), matrix.roles.map((role) => {
76
+ var _a;
77
+ const checked = getCellValue(role.id, perm.id);
78
+ const isPending = ((_a = pendingChanges[role.id]) === null || _a === void 0 ? void 0 : _a[perm.id]) !== undefined;
79
+ return (_jsx(TableCell, { className: "text-center", children: _jsx("div", { className: "flex justify-center", children: _jsx(Checkbox, { checked: checked, onCheckedChange: () => toggleCell(role.id, perm.id, getCellValue(role.id, perm.id)), className: isPending ? 'ring-2 ring-amber-400' : '' }) }) }, `${role.id}-${perm.id}`));
80
+ })] }, perm.id)))] }, category))) })] }) }) })] }));
81
+ }
82
+ //# sourceMappingURL=PermissionMatrix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionMatrix.js","sourceRoot":"","sources":["../../components/PermissionMatrix.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { RBACConfig } from '../types';
2
+ export interface PermissionsManagerProps extends RBACConfig {
3
+ }
4
+ export declare function PermissionsManager({ apiBasePath, t, }: PermissionsManagerProps): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=PermissionsManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionsManager.d.ts","sourceRoot":"","sources":["../../components/PermissionsManager.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,UAAU,EAAgC,MAAM,UAAU,CAAA;AAIxE,MAAM,WAAW,uBAAwB,SAAQ,UAAU;CAAG;AAE9D,wBAAgB,kBAAkB,CAAC,EACjC,WAAoB,EACpB,CAAY,GACb,EAAE,uBAAuB,2CAwOzB"}
@@ -0,0 +1,89 @@
1
+ // Author: Dr Hamid MADANI drmdh@msn.com
2
+ 'use client';
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { useState } from 'react';
5
+ import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
6
+ import { Button } from './ui/button';
7
+ import { Input } from './ui/input';
8
+ import { Label } from './ui/label';
9
+ import { Badge } from './ui/badge';
10
+ import { Card, CardContent } from './ui/card';
11
+ import { Dialog, DialogContent, DialogHeader, DialogTitle, } from './ui/dialog';
12
+ import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from './ui/alert-dialog';
13
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from './ui/table';
14
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from './ui/select';
15
+ import { Plus, Pencil, Trash2, Loader2 } from 'lucide-react';
16
+ import { toast } from 'sonner';
17
+ import { createPermissionsApi, createCategoriesApi } from '../lib/rbac-api';
18
+ const defaultT = (key) => key;
19
+ export function PermissionsManager({ apiBasePath = '/api', t = defaultT, }) {
20
+ const permApi = createPermissionsApi(apiBasePath);
21
+ const catApi = createCategoriesApi(apiBasePath);
22
+ const queryClient = useQueryClient();
23
+ const { data: permData, isLoading } = useQuery({ queryKey: ['permissions'], queryFn: permApi.fetchPermissions });
24
+ const { data: categoriesList } = useQuery({ queryKey: ['categories'], queryFn: catApi.fetchCategories });
25
+ const permissions = (permData === null || permData === void 0 ? void 0 : permData.data) || [];
26
+ const categoryLabels = (permData === null || permData === void 0 ? void 0 : permData.categories) || {};
27
+ const [dialogOpen, setDialogOpen] = useState(false);
28
+ const [editingPerm, setEditingPerm] = useState(null);
29
+ const [form, setForm] = useState({ name: '', description: '', category: '' });
30
+ const [confirmDeletePerm, setConfirmDeletePerm] = useState(null);
31
+ const createMut = useMutation({
32
+ mutationFn: () => permApi.createPermission(form),
33
+ onSuccess: () => {
34
+ queryClient.invalidateQueries({ queryKey: ['permissions'] });
35
+ queryClient.invalidateQueries({ queryKey: ['matrix'] });
36
+ setDialogOpen(false);
37
+ resetForm();
38
+ toast.success(t('roles.permissions.created'));
39
+ },
40
+ onError: (err) => toast.error(err.message),
41
+ });
42
+ const updateMut = useMutation({
43
+ mutationFn: () => permApi.updatePermission(editingPerm.id, { description: form.description, category: form.category }),
44
+ onSuccess: () => {
45
+ queryClient.invalidateQueries({ queryKey: ['permissions'] });
46
+ queryClient.invalidateQueries({ queryKey: ['matrix'] });
47
+ setDialogOpen(false);
48
+ setEditingPerm(null);
49
+ resetForm();
50
+ toast.success(t('roles.permissions.updated'));
51
+ },
52
+ onError: (err) => toast.error(err.message),
53
+ });
54
+ const deleteMut = useMutation({
55
+ mutationFn: permApi.deletePermission,
56
+ onSuccess: () => {
57
+ queryClient.invalidateQueries({ queryKey: ['permissions'] });
58
+ queryClient.invalidateQueries({ queryKey: ['matrix'] });
59
+ queryClient.invalidateQueries({ queryKey: ['roles'] });
60
+ toast.success(t('roles.permissions.deleted'));
61
+ },
62
+ onError: (err) => toast.error(err.message),
63
+ });
64
+ function resetForm() {
65
+ setForm({ name: '', description: '', category: '' });
66
+ }
67
+ function openCreate() {
68
+ resetForm();
69
+ setEditingPerm(null);
70
+ setDialogOpen(true);
71
+ }
72
+ function openEdit(perm) {
73
+ setEditingPerm(perm);
74
+ setForm({ name: perm.name, description: perm.description || '', category: perm.category || '' });
75
+ setDialogOpen(true);
76
+ }
77
+ function handleSubmit(e) {
78
+ e.preventDefault();
79
+ if (editingPerm) {
80
+ updateMut.mutate();
81
+ }
82
+ else {
83
+ createMut.mutate();
84
+ }
85
+ }
86
+ const isPending = createMut.isPending || updateMut.isPending;
87
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx("div", { className: "flex justify-end", children: _jsxs(Button, { onClick: openCreate, children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), t('roles.permissions.create')] }) }), _jsx(Card, { children: _jsx(CardContent, { className: "p-0", children: isLoading ? (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "h-6 w-6 animate-spin text-gray-400" }) })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: t('roles.permissions.name') }), _jsx(TableHead, { children: t('roles.permissions.description') }), _jsx(TableHead, { children: t('roles.permissions.category') }), _jsx(TableHead, { className: "text-center", children: t('roles.permissions.rolesUsing') }), _jsx(TableHead, { className: "w-24" })] }) }), _jsxs(TableBody, { children: [permissions.map((perm) => (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "font-medium font-mono text-sm", children: perm.name }), _jsx(TableCell, { className: "text-gray-500 text-sm", children: perm.description || '-' }), _jsx(TableCell, { children: _jsx(Badge, { variant: "secondary", children: categoryLabels[perm.category || ''] || perm.category || '-' }) }), _jsx(TableCell, { className: "text-center", children: _jsx(Badge, { variant: "secondary", children: perm.roleCount || 0 }) }), _jsx(TableCell, { children: _jsxs("div", { className: "flex gap-1", children: [_jsx(Button, { variant: "ghost", size: "icon", onClick: () => openEdit(perm), className: "h-8 w-8", disabled: perm._fallback, children: _jsx(Pencil, { className: "h-4 w-4" }) }), _jsx(Button, { variant: "ghost", size: "icon", onClick: () => setConfirmDeletePerm(perm), className: "h-8 w-8 text-red-600 hover:text-red-700", disabled: perm._fallback, children: _jsx(Trash2, { className: "h-4 w-4" }) })] }) })] }, perm.id))), permissions.length === 0 && (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: 5, className: "text-center py-8 text-gray-400", children: t('roles.permissions.noPermissions') }) }))] })] })) }) }), _jsx(Dialog, { open: dialogOpen, onOpenChange: setDialogOpen, children: _jsxs(DialogContent, { className: "max-w-md", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: editingPerm ? t('roles.permissions.edit') : t('roles.permissions.create') }) }), _jsxs("form", { onSubmit: handleSubmit, className: "space-y-4", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: t('roles.permissions.name') }), _jsx(Input, { value: form.name, onChange: (e) => setForm(Object.assign(Object.assign({}, form), { name: e.target.value })), placeholder: t('roles.permissions.namePlaceholder'), required: true, disabled: !!editingPerm, pattern: "^[a-z_]+:[a-z_]+$", title: "Format requis : categorie:action (ex: caisse:view)" })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: t('roles.permissions.description') }), _jsx(Input, { value: form.description, onChange: (e) => setForm(Object.assign(Object.assign({}, form), { description: e.target.value })), placeholder: t('roles.permissions.descriptionPlaceholder') })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: t('roles.permissions.category') }), _jsxs(Select, { value: form.category, onValueChange: (val) => setForm(Object.assign(Object.assign({}, form), { category: val })), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, { placeholder: t('roles.permissions.categoryPlaceholder') }) }), _jsx(SelectContent, { children: (categoriesList || []).map((cat) => (_jsx(SelectItem, { value: cat.name, children: cat.label }, cat.id))) })] })] }), _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx(Button, { type: "button", variant: "outline", onClick: () => setDialogOpen(false), children: t('common.actions.cancel') }), _jsxs(Button, { type: "submit", disabled: isPending, children: [isPending && _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), t('common.actions.save')] })] })] })] }) }), _jsx(AlertDialog, { open: confirmDeletePerm !== null, onOpenChange: (o) => !o && setConfirmDeletePerm(null), children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: t('common.actions.confirm') }), _jsxs(AlertDialogDescription, { children: [t('roles.permissions.confirmDelete'), ((confirmDeletePerm === null || confirmDeletePerm === void 0 ? void 0 : confirmDeletePerm.roleCount) || 0) > 0 && (_jsx("span", { className: "block mt-1 text-amber-600", children: t('roles.permissions.warningRolesUsing') }))] })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { children: t('common.actions.cancel') }), _jsx(AlertDialogAction, { onClick: () => { deleteMut.mutate(confirmDeletePerm.id); setConfirmDeletePerm(null); }, children: t('common.actions.delete') })] })] }) })] }));
88
+ }
89
+ //# sourceMappingURL=PermissionsManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionsManager.js","sourceRoot":"","sources":["../../components/PermissionsManager.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { RBACConfig } from '../types';
2
+ export interface RBACManagerProps extends RBACConfig {
3
+ }
4
+ export declare function RBACManager({ apiBasePath, t, systemRoles, roleColors, statusColors, }: RBACManagerProps): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=RBACManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RBACManager.d.ts","sourceRoot":"","sources":["../../components/RBACManager.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAI1C,MAAM,WAAW,gBAAiB,SAAQ,UAAU;CAAG;AAEvD,wBAAgB,WAAW,CAAC,EAC1B,WAAoB,EACpB,CAAY,EACZ,WAAgB,EAChB,UAAU,EACV,YAAY,GACb,EAAE,gBAAgB,2CAiClB"}
@@ -0,0 +1,16 @@
1
+ // Author: Dr Hamid MADANI drmdh@msn.com
2
+ 'use client';
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { useState } from 'react';
5
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from './ui/tabs';
6
+ import { Shield } from 'lucide-react';
7
+ import { PermissionMatrix } from './PermissionMatrix';
8
+ import { RolesManager } from './RolesManager';
9
+ import { PermissionsManager } from './PermissionsManager';
10
+ import { CategoriesManager } from './CategoriesManager';
11
+ const defaultT = (key) => key;
12
+ export function RBACManager({ apiBasePath = '/api', t = defaultT, systemRoles = [], roleColors, statusColors, }) {
13
+ const [tab, setTab] = useState('matrix');
14
+ return (_jsxs("div", { className: "space-y-6", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Shield, { className: "h-7 w-7 text-sky-600" }), _jsx("h1", { className: "text-2xl font-bold text-gray-900", children: t('roles.title') })] }), _jsxs(Tabs, { value: tab, onValueChange: setTab, children: [_jsxs(TabsList, { children: [_jsx(TabsTrigger, { value: "matrix", children: t('roles.tabs.matrix') }), _jsx(TabsTrigger, { value: "roles", children: t('roles.tabs.roles') }), _jsx(TabsTrigger, { value: "permissions", children: t('roles.tabs.permissions') }), _jsx(TabsTrigger, { value: "categories", children: t('roles.tabs.categories') })] }), _jsx(TabsContent, { value: "matrix", children: _jsx(PermissionMatrix, { apiBasePath: apiBasePath, t: t }) }), _jsx(TabsContent, { value: "roles", children: _jsx(RolesManager, { apiBasePath: apiBasePath, t: t, systemRoles: systemRoles }) }), _jsx(TabsContent, { value: "permissions", children: _jsx(PermissionsManager, { apiBasePath: apiBasePath, t: t }) }), _jsx(TabsContent, { value: "categories", children: _jsx(CategoriesManager, { apiBasePath: apiBasePath, t: t }) })] })] }));
15
+ }
16
+ //# sourceMappingURL=RBACManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RBACManager.js","sourceRoot":"","sources":["../../components/RBACManager.tsx"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAGvD,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAA;AAIrC,MAAM,UAAU,WAAW,CAAC,EAC1B,WAAW,GAAG,MAAM,EACpB,CAAC,GAAG,QAAQ,EACZ,WAAW,GAAG,EAAE,EAChB,UAAU,EACV,YAAY,GACK;IACjB,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAExC,OAAO,CACL,eAAK,SAAS,EAAC,WAAW,aACxB,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,MAAM,IAAC,SAAS,EAAC,sBAAsB,GAAG,EAC3C,aAAI,SAAS,EAAC,kCAAkC,YAAE,CAAC,CAAC,aAAa,CAAC,GAAM,IACpE,EAEN,MAAC,IAAI,IAAC,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,aACrC,MAAC,QAAQ,eACP,KAAC,WAAW,IAAC,KAAK,EAAC,QAAQ,YAAE,CAAC,CAAC,mBAAmB,CAAC,GAAe,EAClE,KAAC,WAAW,IAAC,KAAK,EAAC,OAAO,YAAE,CAAC,CAAC,kBAAkB,CAAC,GAAe,EAChE,KAAC,WAAW,IAAC,KAAK,EAAC,aAAa,YAAE,CAAC,CAAC,wBAAwB,CAAC,GAAe,EAC5E,KAAC,WAAW,IAAC,KAAK,EAAC,YAAY,YAAE,CAAC,CAAC,uBAAuB,CAAC,GAAe,IACjE,EAEX,KAAC,WAAW,IAAC,KAAK,EAAC,QAAQ,YACzB,KAAC,gBAAgB,IAAC,WAAW,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,GAAI,GACxC,EACd,KAAC,WAAW,IAAC,KAAK,EAAC,OAAO,YACxB,KAAC,YAAY,IAAC,WAAW,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,GAAI,GAC9D,EACd,KAAC,WAAW,IAAC,KAAK,EAAC,aAAa,YAC9B,KAAC,kBAAkB,IAAC,WAAW,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,GAAI,GAC1C,EACd,KAAC,WAAW,IAAC,KAAK,EAAC,YAAY,YAC7B,KAAC,iBAAiB,IAAC,WAAW,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,GAAI,GACzC,IACT,IACH,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { RBACConfig } from '../types';
2
+ export interface RolesManagerProps extends RBACConfig {
3
+ }
4
+ export declare function RolesManager({ apiBasePath, t, systemRoles, }: RolesManagerProps): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=RolesManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RolesManager.d.ts","sourceRoot":"","sources":["../../components/RolesManager.tsx"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,UAAU,CAAA;AAIpD,MAAM,WAAW,iBAAkB,SAAQ,UAAU;CAAG;AAExD,wBAAgB,YAAY,CAAC,EAC3B,WAAoB,EACpB,CAAY,EACZ,WAAgB,GACjB,EAAE,iBAAiB,2CAoOnB"}
@@ -0,0 +1,97 @@
1
+ // Author: Dr Hamid MADANI drmdh@msn.com
2
+ 'use client';
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { useState } from 'react';
5
+ import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
6
+ import { Button } from './ui/button';
7
+ import { Input } from './ui/input';
8
+ import { Label } from './ui/label';
9
+ import { Badge } from './ui/badge';
10
+ import { Card, CardContent } from './ui/card';
11
+ import { Dialog, DialogContent, DialogHeader, DialogTitle, } from './ui/dialog';
12
+ import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from './ui/alert-dialog';
13
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from './ui/table';
14
+ import { Plus, Pencil, Trash2, Loader2 } from 'lucide-react';
15
+ import { toast } from 'sonner';
16
+ import { createRolesApi } from '../lib/rbac-api';
17
+ const defaultT = (key) => key;
18
+ export function RolesManager({ apiBasePath = '/api', t = defaultT, systemRoles = [], }) {
19
+ const api = createRolesApi(apiBasePath);
20
+ const queryClient = useQueryClient();
21
+ const { data: roles, isLoading } = useQuery({ queryKey: ['roles'], queryFn: api.fetchRoles });
22
+ const [dialogOpen, setDialogOpen] = useState(false);
23
+ const [editingRole, setEditingRole] = useState(null);
24
+ const [form, setForm] = useState({ name: '', description: '' });
25
+ const [confirmDeleteId, setConfirmDeleteId] = useState(null);
26
+ const createMut = useMutation({
27
+ mutationFn: () => api.createRole(form),
28
+ onSuccess: () => {
29
+ queryClient.invalidateQueries({ queryKey: ['roles'] });
30
+ queryClient.invalidateQueries({ queryKey: ['matrix'] });
31
+ setDialogOpen(false);
32
+ resetForm();
33
+ toast.success(t('roles.roles.created'));
34
+ },
35
+ onError: (err) => toast.error(err.message),
36
+ });
37
+ const updateMut = useMutation({
38
+ mutationFn: () => api.updateRole(editingRole.id, form),
39
+ onSuccess: () => {
40
+ queryClient.invalidateQueries({ queryKey: ['roles'] });
41
+ queryClient.invalidateQueries({ queryKey: ['matrix'] });
42
+ setDialogOpen(false);
43
+ setEditingRole(null);
44
+ resetForm();
45
+ toast.success(t('roles.roles.updated'));
46
+ },
47
+ onError: (err) => toast.error(err.message),
48
+ });
49
+ const deleteMut = useMutation({
50
+ mutationFn: api.deleteRole,
51
+ onSuccess: () => {
52
+ queryClient.invalidateQueries({ queryKey: ['roles'] });
53
+ queryClient.invalidateQueries({ queryKey: ['matrix'] });
54
+ toast.success(t('roles.roles.deleted'));
55
+ },
56
+ onError: (err) => toast.error(err.message),
57
+ });
58
+ function resetForm() {
59
+ setForm({ name: '', description: '' });
60
+ }
61
+ function openCreate() {
62
+ resetForm();
63
+ setEditingRole(null);
64
+ setDialogOpen(true);
65
+ }
66
+ function openEdit(role) {
67
+ setEditingRole(role);
68
+ setForm({ name: role.name, description: role.description || '' });
69
+ setDialogOpen(true);
70
+ }
71
+ function handleSubmit(e) {
72
+ e.preventDefault();
73
+ if (editingRole) {
74
+ updateMut.mutate();
75
+ }
76
+ else {
77
+ createMut.mutate();
78
+ }
79
+ }
80
+ const isPending = createMut.isPending || updateMut.isPending;
81
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx("div", { className: "flex justify-end", children: _jsxs(Button, { onClick: openCreate, children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), t('roles.roles.create')] }) }), _jsx(Card, { children: _jsx(CardContent, { className: "p-0", children: isLoading ? (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "h-6 w-6 animate-spin text-gray-400" }) })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: t('roles.roles.name') }), _jsx(TableHead, { children: t('roles.roles.description') }), _jsx(TableHead, { className: "text-center", children: t('roles.roles.permissions') }), _jsx(TableHead, { className: "text-center", children: t('roles.roles.users') }), _jsx(TableHead, { className: "text-center", children: "Type" }), _jsx(TableHead, { className: "w-24" })] }) }), _jsxs(TableBody, { children: [roles === null || roles === void 0 ? void 0 : roles.map((role) => {
82
+ var _a;
83
+ const isSystem = systemRoles.includes(role.name);
84
+ return (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "font-medium font-mono", children: role.name }), _jsx(TableCell, { className: "text-gray-500 text-sm", children: role.description || '-' }), _jsx(TableCell, { className: "text-center", children: _jsx(Badge, { variant: "secondary", children: ((_a = role.permissions) === null || _a === void 0 ? void 0 : _a.length) || 0 }) }), _jsx(TableCell, { className: "text-center", children: _jsx(Badge, { variant: "secondary", className: role.userCount ? 'bg-blue-100 text-blue-800' : '', children: role.userCount || 0 }) }), _jsx(TableCell, { className: "text-center", children: isSystem ? (_jsx(Badge, { className: "bg-amber-100 text-amber-800", children: t('roles.roles.system') })) : (_jsx(Badge, { variant: "secondary", children: "Custom" })) }), _jsx(TableCell, { children: _jsxs("div", { className: "flex gap-1", children: [_jsx(Button, { variant: "ghost", size: "icon", onClick: () => openEdit(role), className: "h-8 w-8", disabled: role._fallback, children: _jsx(Pencil, { className: "h-4 w-4" }) }), _jsx(Button, { variant: "ghost", size: "icon", onClick: () => {
85
+ if (isSystem) {
86
+ toast.error(t('roles.roles.cannotDeleteSystem'));
87
+ return;
88
+ }
89
+ if ((role.userCount || 0) > 0) {
90
+ toast.error(t('roles.roles.cannotDeleteUsersAssigned'));
91
+ return;
92
+ }
93
+ setConfirmDeleteId(role.id);
94
+ }, className: "h-8 w-8 text-red-600 hover:text-red-700", disabled: role._fallback || isSystem, children: _jsx(Trash2, { className: "h-4 w-4" }) })] }) })] }, role.id));
95
+ }), (!roles || roles.length === 0) && (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: 6, className: "text-center py-8 text-gray-400", children: t('roles.roles.noRoles') }) }))] })] })) }) }), _jsx(Dialog, { open: dialogOpen, onOpenChange: setDialogOpen, children: _jsxs(DialogContent, { className: "max-w-md", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: editingRole ? t('roles.roles.edit') : t('roles.roles.create') }) }), _jsxs("form", { onSubmit: handleSubmit, className: "space-y-4", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: t('roles.roles.name') }), _jsx(Input, { value: form.name, onChange: (e) => setForm(Object.assign(Object.assign({}, form), { name: e.target.value })), placeholder: t('roles.roles.namePlaceholder'), required: true, disabled: !!editingRole && systemRoles.includes(editingRole.name), pattern: "^[a-z][a-z0-9_]*$", title: "Minuscules, chiffres et underscores uniquement" })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: t('roles.roles.description') }), _jsx(Input, { value: form.description, onChange: (e) => setForm(Object.assign(Object.assign({}, form), { description: e.target.value })), placeholder: t('roles.roles.descriptionPlaceholder') })] }), _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx(Button, { type: "button", variant: "outline", onClick: () => setDialogOpen(false), children: t('common.actions.cancel') }), _jsxs(Button, { type: "submit", disabled: isPending, children: [isPending && _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), t('common.actions.save')] })] })] })] }) }), _jsx(AlertDialog, { open: confirmDeleteId !== null, onOpenChange: (o) => !o && setConfirmDeleteId(null), children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: t('common.actions.confirm') }), _jsx(AlertDialogDescription, { children: t('roles.roles.confirmDelete') })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { children: t('common.actions.cancel') }), _jsx(AlertDialogAction, { onClick: () => { deleteMut.mutate(confirmDeleteId); setConfirmDeleteId(null); }, children: t('common.actions.delete') })] })] }) })] }));
96
+ }
97
+ //# sourceMappingURL=RolesManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RolesManager.js","sourceRoot":"","sources":["../../components/RolesManager.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { RBACConfig } from '../types';
2
+ export interface UsersManagerProps extends RBACConfig {
3
+ /** Fallback role names if DB roles unavailable (e.g. ['admin', 'agent_accueil']) */
4
+ fallbackRoles?: {
5
+ value: string;
6
+ label: string;
7
+ }[];
8
+ }
9
+ export declare function UsersManager({ apiBasePath, t, roleColors, statusColors, fallbackRoles, }: UsersManagerProps): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=UsersManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UsersManager.d.ts","sourceRoot":"","sources":["../../components/UsersManager.tsx"],"names":[],"mappings":"AAwCA,OAAO,KAAK,EAAQ,UAAU,EAAc,MAAM,UAAU,CAAA;AAI5D,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD,oFAAoF;IACpF,aAAa,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CACnD;AAED,wBAAgB,YAAY,CAAC,EAC3B,WAAoB,EACpB,CAAY,EACZ,UAAe,EACf,YAAiB,EACjB,aAAa,GACd,EAAE,iBAAiB,2CAmTnB"}