pixelize-design-library 2.3.1-beta.14 → 2.3.1-beta.15

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.
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import { DeleteRoleModalProps } from "./RolesPermissionProps";
3
+ declare const DeleteRoleModal: React.FC<DeleteRoleModalProps>;
4
+ export default DeleteRoleModal;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ var react_1 = __importDefault(require("react"));
7
+ var react_2 = require("@chakra-ui/react");
8
+ var lucide_react_1 = require("lucide-react");
9
+ var useCustomTheme_1 = require("../../Theme/useCustomTheme");
10
+ var Button_1 = __importDefault(require("../Button/Button"));
11
+ var DeleteRoleModal = function (_a) {
12
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
13
+ var isOpen = _a.isOpen, onClose = _a.onClose, onConfirm = _a.onConfirm, isLoading = _a.isLoading, labels = _a.labels;
14
+ var colors = (0, useCustomTheme_1.useCustomTheme)().colors;
15
+ return (react_1.default.createElement(react_2.Modal, { isOpen: isOpen, onClose: onClose, isCentered: true },
16
+ react_1.default.createElement(react_2.ModalOverlay, { backdropFilter: "blur(4px)" }),
17
+ react_1.default.createElement(react_2.ModalContent, { borderRadius: "2xl", overflow: "hidden" },
18
+ react_1.default.createElement(react_2.ModalHeader, { borderBottom: "1px solid", borderColor: (_c = (_b = colors === null || colors === void 0 ? void 0 : colors.boxborder) === null || _b === void 0 ? void 0 : _b[200]) !== null && _c !== void 0 ? _c : (_d = colors === null || colors === void 0 ? void 0 : colors.gray) === null || _d === void 0 ? void 0 : _d[200], display: "flex", alignItems: "center", gap: 3 },
19
+ react_1.default.createElement(react_2.Flex, { align: "center", justify: "center", boxSize: "36px", borderRadius: "full", bg: (_j = (_g = (_f = (_e = colors === null || colors === void 0 ? void 0 : colors.semantic) === null || _e === void 0 ? void 0 : _e.error) === null || _f === void 0 ? void 0 : _f[50]) !== null && _g !== void 0 ? _g : (_h = colors === null || colors === void 0 ? void 0 : colors.red) === null || _h === void 0 ? void 0 : _h[50]) !== null && _j !== void 0 ? _j : "#FEF2F2", color: (_p = (_m = (_l = (_k = colors === null || colors === void 0 ? void 0 : colors.semantic) === null || _k === void 0 ? void 0 : _k.error) === null || _l === void 0 ? void 0 : _l[500]) !== null && _m !== void 0 ? _m : (_o = colors === null || colors === void 0 ? void 0 : colors.red) === null || _o === void 0 ? void 0 : _o[500]) !== null && _p !== void 0 ? _p : "#EF4444" },
20
+ react_1.default.createElement(lucide_react_1.AlertTriangle, { size: 18 })),
21
+ react_1.default.createElement(react_2.Text, { fontSize: "1.05rem", fontWeight: 600 }, labels.deleteRole)),
22
+ react_1.default.createElement(react_2.ModalCloseButton, null),
23
+ react_1.default.createElement(react_2.ModalBody, { py: 6 },
24
+ react_1.default.createElement(react_2.Text, { color: (_q = colors === null || colors === void 0 ? void 0 : colors.gray) === null || _q === void 0 ? void 0 : _q[600], fontSize: "sm", mb: 5 }, labels.deleteRoleConfirm),
25
+ react_1.default.createElement(react_2.HStack, { justifyContent: "flex-end", spacing: 3 },
26
+ react_1.default.createElement(Button_1.default, { label: labels.cancel, onClick: onClose, variant: "outline", colorScheme: "gray", size: "sm" }),
27
+ react_1.default.createElement(Button_1.default, { label: labels.delete, onClick: onConfirm, colorScheme: "red", size: "sm", isLoading: isLoading, leftIcon: react_1.default.createElement(lucide_react_1.Trash2, { size: 15 }) }))))));
28
+ };
29
+ exports.default = DeleteRoleModal;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import { RolesPermissionProps } from "./RolesPermissionProps";
3
+ declare const RolesPermission: React.FC<RolesPermissionProps>;
4
+ export default RolesPermission;
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ var __importDefault = (this && this.__importDefault) || function (mod) {
47
+ return (mod && mod.__esModule) ? mod : { "default": mod };
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ var react_1 = __importStar(require("react"));
51
+ var react_2 = require("@chakra-ui/react");
52
+ var lucide_react_1 = require("lucide-react");
53
+ var useCustomTheme_1 = require("../../Theme/useCustomTheme");
54
+ var Button_1 = __importDefault(require("../Button/Button"));
55
+ var TextInput_1 = __importDefault(require("../Input/TextInput"));
56
+ var EmptyState_1 = __importDefault(require("../EmptyState/EmptyState"));
57
+ var DeleteRoleModal_1 = __importDefault(require("./DeleteRoleModal"));
58
+ var DEFAULT_LABELS = {
59
+ title: "Roles & Permissions",
60
+ totalRoles: "Total Roles",
61
+ newRole: "New Role",
62
+ sNo: "S.No",
63
+ roleNameColumn: "Role name",
64
+ createdBy: "Created By",
65
+ createdTime: "Created Time",
66
+ actions: "Actions",
67
+ noRoles: "No roles found",
68
+ view: "View",
69
+ edit: "Edit",
70
+ delete: "Delete",
71
+ roleInformation: "Role & Permission Information",
72
+ roleName: "Role Name",
73
+ roleNamePlaceholder: "Enter role name",
74
+ enableAllPermissions: "Enable All Permissions",
75
+ trackLocation: "Track Location",
76
+ showAllUserRecords: "Show All User Records",
77
+ permissionSettings: "Permission Settings",
78
+ moduleName: "Module Name",
79
+ read: "Read",
80
+ create: "Create",
81
+ editPermission: "Edit",
82
+ deletePermission: "Delete",
83
+ importPermission: "Import",
84
+ exportPermission: "Export",
85
+ noPermissions: "No permissions found",
86
+ cancel: "Cancel",
87
+ saveChanges: "Save Changes",
88
+ updateChanges: "Update Changes",
89
+ readOnly: "Read Only",
90
+ deleteRole: "Delete Role",
91
+ deleteRoleConfirm: "Are you sure you want to delete this role?",
92
+ };
93
+ var DEFAULT_KEYS = [
94
+ "read",
95
+ "create",
96
+ "edit",
97
+ "delete",
98
+ "import",
99
+ "export",
100
+ ];
101
+ var RolesPermission = function (_a) {
102
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
103
+ var view = _a.view, _q = _a.mode, mode = _q === void 0 ? "create" : _q, roles = _a.roles, _r = _a.isRolesLoading, isRolesLoading = _r === void 0 ? false : _r, permissions = _a.permissions, _s = _a.permissionKeys, permissionKeys = _s === void 0 ? DEFAULT_KEYS : _s, roleName = _a.roleName, roleNameError = _a.roleNameError, isSuperAdmin = _a.isSuperAdmin, isTrackLocation = _a.isTrackLocation, isShowRecords = _a.isShowRecords, _t = _a.isEditing, isEditing = _t === void 0 ? false : _t, _u = _a.isSaving, isSaving = _u === void 0 ? false : _u, onNewRole = _a.onNewRole, onViewRole = _a.onViewRole, onEditRole = _a.onEditRole, onDeleteRole = _a.onDeleteRole, onBack = _a.onBack, onRoleNameChange = _a.onRoleNameChange, onToggleSuperAdmin = _a.onToggleSuperAdmin, onToggleTrackLocation = _a.onToggleTrackLocation, onToggleShowRecords = _a.onToggleShowRecords, onPermissionChange = _a.onPermissionChange, onSave = _a.onSave, onCancelForm = _a.onCancelForm, footerSlot = _a.footerSlot, checkIcon = _a.checkIcon, labelOverrides = _a.labels, _v = _a.padding, padding = _v === void 0 ? "16px" : _v;
104
+ var colors = (0, useCustomTheme_1.useCustomTheme)().colors;
105
+ var labels = (0, react_1.useMemo)(function () { return (__assign(__assign({}, DEFAULT_LABELS), labelOverrides)); }, [labelOverrides]);
106
+ var _w = (0, react_1.useState)(null), deleteId = _w[0], setDeleteId = _w[1];
107
+ var border = (_e = (_c = (_b = colors === null || colors === void 0 ? void 0 : colors.boxborder) === null || _b === void 0 ? void 0 : _b[200]) !== null && _c !== void 0 ? _c : (_d = colors === null || colors === void 0 ? void 0 : colors.gray) === null || _d === void 0 ? void 0 : _d[200]) !== null && _e !== void 0 ? _e : "#E2E8F0";
108
+ var surface = (_f = colors === null || colors === void 0 ? void 0 : colors.white) !== null && _f !== void 0 ? _f : "#FFFFFF";
109
+ var muted = (_h = (_g = colors === null || colors === void 0 ? void 0 : colors.gray) === null || _g === void 0 ? void 0 : _g[500]) !== null && _h !== void 0 ? _h : "#64748B";
110
+ var heading = (_k = (_j = colors === null || colors === void 0 ? void 0 : colors.gray) === null || _j === void 0 ? void 0 : _j[800]) !== null && _k !== void 0 ? _k : "#1E293B";
111
+ var headBg = (_m = (_l = colors === null || colors === void 0 ? void 0 : colors.gray) === null || _l === void 0 ? void 0 : _l[50]) !== null && _m !== void 0 ? _m : "#F8FAFC";
112
+ var isViewMode = mode === "view";
113
+ var columnLabels = {
114
+ read: labels.read,
115
+ create: labels.create,
116
+ edit: labels.editPermission,
117
+ delete: labels.deletePermission,
118
+ import: labels.importPermission,
119
+ export: labels.exportPermission,
120
+ automation: "Automation",
121
+ };
122
+ var cardSx = {
123
+ backgroundColor: surface,
124
+ borderRadius: "xl",
125
+ border: "1px solid",
126
+ borderColor: border,
127
+ boxShadow: "0 1px 2px rgba(16,24,40,0.05)",
128
+ overflow: "hidden",
129
+ };
130
+ var cardHeaderSx = {
131
+ px: 4,
132
+ py: 3,
133
+ borderBottom: "1px solid",
134
+ borderColor: border,
135
+ };
136
+ var thStyle = {
137
+ fontSize: "0.7rem",
138
+ textTransform: "uppercase",
139
+ letterSpacing: "0.04em",
140
+ color: muted,
141
+ borderColor: border,
142
+ py: 3,
143
+ };
144
+ var renderGrantedCheck = function () {
145
+ var _a, _b;
146
+ return checkIcon !== null && checkIcon !== void 0 ? checkIcon : (react_1.default.createElement(react_2.Box, { color: (_b = (_a = colors === null || colors === void 0 ? void 0 : colors.green) === null || _a === void 0 ? void 0 : _a[500]) !== null && _b !== void 0 ? _b : "#22C55E", display: "inline-flex" },
147
+ react_1.default.createElement(lucide_react_1.Check, { size: 18, strokeWidth: 3 })));
148
+ };
149
+ var renderListView = function () { return (react_1.default.createElement(react_2.VStack, { align: "stretch", spacing: 4 },
150
+ react_1.default.createElement(react_2.Box, __assign({}, cardSx),
151
+ react_1.default.createElement(react_2.Flex, __assign({}, cardHeaderSx, { alignItems: "center", justifyContent: "space-between" }),
152
+ react_1.default.createElement(react_2.HStack, { spacing: 2 },
153
+ onBack && (react_1.default.createElement(react_2.IconButton, { "aria-label": "Go back", icon: react_1.default.createElement(lucide_react_1.ArrowLeft, { size: 16 }), variant: "ghost", size: "xs", color: muted, onClick: onBack })),
154
+ react_1.default.createElement(react_2.Heading, { size: "sm", fontWeight: 600, color: heading }, labels.title),
155
+ !isRolesLoading && (react_1.default.createElement(react_2.Badge, { colorScheme: "blue", variant: "subtle", borderRadius: "full", px: 2, py: 0.5, fontSize: "0.65rem", textTransform: "none" },
156
+ labels.totalRoles,
157
+ ": ",
158
+ roles.length))),
159
+ react_1.default.createElement(Button_1.default, { label: labels.newRole, onClick: onNewRole, size: "sm", sx: { fontSize: "xs" }, colorScheme: "primary", leftIcon: react_1.default.createElement(lucide_react_1.Plus, { size: 15 }) })),
160
+ react_1.default.createElement(react_2.Box, { overflowX: "auto" }, isRolesLoading ? (react_1.default.createElement(react_2.VStack, { spacing: 3, p: 4, align: "stretch" }, Array.from({ length: 6 }).map(function (_, idx) { return (react_1.default.createElement(react_2.Skeleton, { key: idx, height: "18px", borderRadius: "md" })); }))) : roles.length === 0 ? (react_1.default.createElement(EmptyState_1.default, { icon: lucide_react_1.ShieldCheck, title: labels.noRoles, size: "sm", minH: "200px" })) : (react_1.default.createElement(react_2.Table, { variant: "simple", size: "sm" },
161
+ react_1.default.createElement(react_2.Thead, { bg: headBg },
162
+ react_1.default.createElement(react_2.Tr, null,
163
+ react_1.default.createElement(react_2.Th, __assign({}, thStyle, { width: "56px" }), labels.sNo),
164
+ react_1.default.createElement(react_2.Th, __assign({}, thStyle), labels.roleNameColumn),
165
+ react_1.default.createElement(react_2.Th, __assign({}, thStyle), labels.createdBy),
166
+ react_1.default.createElement(react_2.Th, __assign({}, thStyle), labels.createdTime),
167
+ react_1.default.createElement(react_2.Th, __assign({}, thStyle, { textAlign: "right" }), labels.actions))),
168
+ react_1.default.createElement(react_2.Tbody, null, roles.map(function (role, index) {
169
+ var _a, _b, _c;
170
+ return (react_1.default.createElement(react_2.Tr, { key: (_a = role.roles_id) !== null && _a !== void 0 ? _a : role.roleName, _hover: { bg: headBg }, transition: "background 0.15s ease" },
171
+ react_1.default.createElement(react_2.Td, { borderColor: border, color: muted, fontSize: "sm" }, index + 1),
172
+ react_1.default.createElement(react_2.Td, { borderColor: border, maxW: "160px", whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis", fontSize: "sm", fontWeight: 600, color: heading }, role.roleName),
173
+ react_1.default.createElement(react_2.Td, { borderColor: border, fontSize: "sm", color: muted }, role.createdBy),
174
+ react_1.default.createElement(react_2.Td, { borderColor: border, fontSize: "sm", color: muted }, role.created_at),
175
+ react_1.default.createElement(react_2.Td, { borderColor: border },
176
+ react_1.default.createElement(react_2.HStack, { spacing: 1, justifyContent: "flex-end" },
177
+ react_1.default.createElement(react_2.Tooltip, { label: labels.view, hasArrow: true },
178
+ react_1.default.createElement(react_2.IconButton, { icon: react_1.default.createElement(lucide_react_1.SquareArrowOutUpRight, { size: 15 }), "aria-label": labels.view, variant: "ghost", size: "xs", color: muted, onClick: function () { return onViewRole === null || onViewRole === void 0 ? void 0 : onViewRole(role); } })),
179
+ react_1.default.createElement(react_2.Tooltip, { label: labels.edit, hasArrow: true },
180
+ react_1.default.createElement(react_2.IconButton, { icon: react_1.default.createElement(lucide_react_1.Pencil, { size: 15 }), "aria-label": labels.edit, variant: "ghost", size: "xs", color: muted, onClick: function () { return onEditRole === null || onEditRole === void 0 ? void 0 : onEditRole(role); } })),
181
+ react_1.default.createElement(react_2.Tooltip, { label: labels.delete, hasArrow: true },
182
+ react_1.default.createElement(react_2.IconButton, { icon: react_1.default.createElement(lucide_react_1.Trash2, { size: 15 }), "aria-label": labels.delete, variant: "ghost", size: "xs", colorScheme: "red", color: (_c = (_b = colors === null || colors === void 0 ? void 0 : colors.red) === null || _b === void 0 ? void 0 : _b[400]) !== null && _c !== void 0 ? _c : "#F87171", onClick: function () { return setDeleteId(Number(role.roles_id)); } }))))));
183
+ })))))),
184
+ footerSlot)); };
185
+ var renderFormView = function () { return (react_1.default.createElement(react_2.VStack, { align: "stretch", spacing: 4 },
186
+ react_1.default.createElement(react_2.Box, __assign({}, cardSx),
187
+ react_1.default.createElement(react_2.Flex, __assign({}, cardHeaderSx, { alignItems: "center", gap: 2 }),
188
+ onCancelForm && (react_1.default.createElement(react_2.IconButton, { "aria-label": "Go back", icon: react_1.default.createElement(lucide_react_1.ArrowLeft, { size: 16 }), variant: "ghost", size: "xs", color: muted, onClick: onCancelForm })),
189
+ react_1.default.createElement(react_2.Heading, { size: "sm", fontWeight: 600, color: heading }, labels.roleInformation)),
190
+ react_1.default.createElement(react_2.Box, { p: 4 },
191
+ react_1.default.createElement(react_2.Box, { maxW: "320px" },
192
+ react_1.default.createElement(react_2.Tooltip, { label: isViewMode ? labels.readOnly : "", isDisabled: !isViewMode },
193
+ react_1.default.createElement(react_2.Box, null,
194
+ react_1.default.createElement(TextInput_1.default, { label: labels.roleName, value: roleName, placeholder: labels.roleNamePlaceholder, error: !!roleNameError, errorMessage: roleNameError, onChange: function (e) { return onRoleNameChange === null || onRoleNameChange === void 0 ? void 0 : onRoleNameChange(e.target.value); }, isRequired: true, width: "100%", isDisabled: isViewMode })))),
195
+ react_1.default.createElement(react_2.VStack, { align: "stretch", spacing: 3, mt: 4 },
196
+ react_1.default.createElement(react_2.Checkbox, { isChecked: isSuperAdmin, isDisabled: isViewMode, size: "sm", onChange: function (e) { return onToggleSuperAdmin === null || onToggleSuperAdmin === void 0 ? void 0 : onToggleSuperAdmin(e.target.checked); } },
197
+ react_1.default.createElement(react_2.Text, { fontSize: "sm", color: heading }, labels.enableAllPermissions)),
198
+ react_1.default.createElement(react_2.Checkbox, { isChecked: isTrackLocation, isDisabled: isViewMode, size: "sm", onChange: function (e) { return onToggleTrackLocation === null || onToggleTrackLocation === void 0 ? void 0 : onToggleTrackLocation(e.target.checked); } },
199
+ react_1.default.createElement(react_2.Text, { fontSize: "sm", color: heading }, labels.trackLocation)),
200
+ react_1.default.createElement(react_2.Checkbox, { isChecked: isShowRecords, isDisabled: isViewMode, size: "sm", onChange: function (e) { return onToggleShowRecords === null || onToggleShowRecords === void 0 ? void 0 : onToggleShowRecords(e.target.checked); } },
201
+ react_1.default.createElement(react_2.Text, { fontSize: "sm", color: heading }, labels.showAllUserRecords))))),
202
+ react_1.default.createElement(react_2.Box, __assign({}, cardSx),
203
+ react_1.default.createElement(react_2.Flex, __assign({}, cardHeaderSx, { alignItems: "center" }),
204
+ react_1.default.createElement(react_2.Heading, { size: "sm", fontWeight: 600, color: heading }, labels.permissionSettings)),
205
+ react_1.default.createElement(react_2.Box, { overflowX: "auto" },
206
+ react_1.default.createElement(react_2.Table, { variant: "simple", size: "sm" },
207
+ react_1.default.createElement(react_2.Thead, { bg: headBg },
208
+ react_1.default.createElement(react_2.Tr, null,
209
+ react_1.default.createElement(react_2.Th, __assign({}, thStyle), labels.moduleName),
210
+ permissionKeys.map(function (key) { return (react_1.default.createElement(react_2.Th, __assign({ key: key }, thStyle, { textAlign: "center" }), columnLabels[key])); }))),
211
+ react_1.default.createElement(react_2.Tbody, null, permissions.length === 0 ? (react_1.default.createElement(react_2.Tr, null,
212
+ react_1.default.createElement(react_2.Td, { colSpan: permissionKeys.length + 1, textAlign: "center", borderColor: border },
213
+ react_1.default.createElement(react_2.Text, { color: muted, fontSize: "sm", py: 4 }, labels.noPermissions)))) : (permissions.map(function (perm) {
214
+ var _a;
215
+ var isAutomationModule = ((_a = perm.module) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === "automation";
216
+ return (react_1.default.createElement(react_2.Tr, { key: perm.module, _hover: { bg: headBg }, transition: "background 0.15s ease" },
217
+ react_1.default.createElement(react_2.Td, { borderColor: border, color: heading, fontSize: "sm", fontWeight: 500, maxW: "160px", whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" }, perm.module),
218
+ permissionKeys.map(function (key) {
219
+ var isRead = key === "read";
220
+ return (react_1.default.createElement(react_2.Td, { key: key, textAlign: "center", borderColor: border },
221
+ react_1.default.createElement(react_2.Flex, { justify: "center" }, isViewMode ? (isAutomationModule ? (isRead &&
222
+ perm.automation &&
223
+ renderGrantedCheck()) : (perm[key] && renderGrantedCheck())) : isAutomationModule && !isRead ? null : (react_1.default.createElement(react_2.Checkbox, { size: "sm", isChecked: isAutomationModule
224
+ ? perm.automation
225
+ : perm[key], isDisabled: isAutomationModule && !isRead, onChange: function () {
226
+ return onPermissionChange === null || onPermissionChange === void 0 ? void 0 : onPermissionChange(perm.module, isAutomationModule ? "automation" : key);
227
+ } })))));
228
+ })));
229
+ }))))),
230
+ !isViewMode && (react_1.default.createElement(react_1.default.Fragment, null,
231
+ react_1.default.createElement(react_2.Divider, { borderColor: border }),
232
+ react_1.default.createElement(react_2.Flex, { justifyContent: "flex-end", gap: 3, p: 4 },
233
+ react_1.default.createElement(Button_1.default, { onClick: onCancelForm, size: "sm", sx: { fontSize: "xs" }, label: labels.cancel, colorScheme: "red", variant: "outline" }),
234
+ react_1.default.createElement(Button_1.default, { onClick: onSave, size: "sm", sx: { fontSize: "xs" }, colorScheme: "primary", isLoading: isSaving, label: isEditing ? labels.updateChanges : labels.saveChanges }))))))); };
235
+ return (react_1.default.createElement(react_2.Box, { p: padding, backgroundColor: (_p = (_o = colors === null || colors === void 0 ? void 0 : colors.gray) === null || _o === void 0 ? void 0 : _o[50]) !== null && _p !== void 0 ? _p : "#F8FAFC", minHeight: "100%" },
236
+ view === "list" ? renderListView() : renderFormView(),
237
+ react_1.default.createElement(DeleteRoleModal_1.default, { isOpen: deleteId !== null, onClose: function () { return setDeleteId(null); }, onConfirm: function () {
238
+ if (deleteId !== null)
239
+ onDeleteRole === null || onDeleteRole === void 0 ? void 0 : onDeleteRole(deleteId);
240
+ setDeleteId(null);
241
+ }, labels: labels })));
242
+ };
243
+ exports.default = RolesPermission;
@@ -0,0 +1 @@
1
+ import "@testing-library/jest-dom";
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ var react_1 = __importDefault(require("react"));
18
+ var react_2 = require("@testing-library/react");
19
+ require("@testing-library/jest-dom");
20
+ var react_3 = require("@chakra-ui/react");
21
+ var RolesPermission_1 = __importDefault(require("./RolesPermission"));
22
+ jest.mock("../../Theme/useCustomTheme", function () { return ({
23
+ useCustomTheme: function () { return ({
24
+ colors: {
25
+ white: "#ffffff",
26
+ gray: {
27
+ 50: "#f8fafc",
28
+ 100: "#f0f0f0",
29
+ 200: "#e2e8f0",
30
+ 300: "#cbd5e1",
31
+ 400: "#94a3b8",
32
+ 500: "#64748b",
33
+ 600: "#475569",
34
+ 700: "#334155",
35
+ 800: "#1e293b",
36
+ },
37
+ primary: {
38
+ 50: "#eef2ff",
39
+ 100: "#e0e7ff",
40
+ 300: "#a5b4fc",
41
+ 500: "#6366f1",
42
+ 600: "#4f46e5",
43
+ 700: "#4338ca",
44
+ },
45
+ boxborder: { 200: "#e2e8f0" },
46
+ text: { 400: "#94a3b8", 500: "#64748b", 600: "#475569", 700: "#334155" },
47
+ secondary: { 500: "#805ad5" },
48
+ backgroundColor: { light: "#ffffff" },
49
+ blue: { 200: "#bfdbfe", 400: "#60a5fa", 500: "#3b82f6" },
50
+ green: { 400: "#4ade80", 500: "#22c55e" },
51
+ red: { 400: "#f87171", 500: "#ef4444", 50: "#fef2f2" },
52
+ semantic: { error: { 50: "#fef2f2", 500: "#ef4444" } },
53
+ },
54
+ }); },
55
+ }); });
56
+ beforeAll(function () {
57
+ Object.defineProperty(window, "matchMedia", {
58
+ writable: true,
59
+ configurable: true,
60
+ value: jest.fn().mockImplementation(function (query) { return ({
61
+ matches: false,
62
+ media: query,
63
+ onchange: null,
64
+ addListener: jest.fn(),
65
+ removeListener: jest.fn(),
66
+ addEventListener: jest.fn(),
67
+ removeEventListener: jest.fn(),
68
+ dispatchEvent: jest.fn(),
69
+ }); }),
70
+ });
71
+ });
72
+ var roles = [
73
+ {
74
+ roleName: "Admin",
75
+ createdBy: "Aisha Khan",
76
+ created_at: "Jun 6, 2026 10:00 AM",
77
+ permission: [],
78
+ roles_id: "1",
79
+ designation: "Army",
80
+ makeSuperAdmin: true,
81
+ },
82
+ {
83
+ roleName: "Sales",
84
+ createdBy: "Marcus Reed",
85
+ created_at: "Jun 5, 2026 09:00 AM",
86
+ permission: [],
87
+ roles_id: "2",
88
+ designation: "Army",
89
+ },
90
+ ];
91
+ var permissions = [
92
+ {
93
+ module: "Leads",
94
+ read: true,
95
+ create: true,
96
+ edit: false,
97
+ delete: false,
98
+ import: false,
99
+ export: false,
100
+ },
101
+ {
102
+ module: "Automation",
103
+ read: false,
104
+ create: false,
105
+ edit: false,
106
+ delete: false,
107
+ automation: true,
108
+ },
109
+ ];
110
+ var baseProps = {
111
+ roles: roles,
112
+ permissions: permissions,
113
+ roleName: "",
114
+ isSuperAdmin: false,
115
+ isTrackLocation: false,
116
+ isShowRecords: false,
117
+ };
118
+ var renderWithChakra = function (ui) {
119
+ return (0, react_2.render)(react_1.default.createElement(react_3.ChakraProvider, null, ui));
120
+ };
121
+ describe("RolesPermission", function () {
122
+ it("renders the roles list", function () {
123
+ renderWithChakra(react_1.default.createElement(RolesPermission_1.default, __assign({ view: "list" }, baseProps)));
124
+ expect(react_2.screen.getByText("Roles & Permissions")).toBeInTheDocument();
125
+ expect(react_2.screen.getByText("Admin")).toBeInTheDocument();
126
+ expect(react_2.screen.getByText("Sales")).toBeInTheDocument();
127
+ });
128
+ it("calls onNewRole when New Role is clicked", function () {
129
+ var onNewRole = jest.fn();
130
+ renderWithChakra(react_1.default.createElement(RolesPermission_1.default, __assign({ view: "list" }, baseProps, { onNewRole: onNewRole })));
131
+ react_2.fireEvent.click(react_2.screen.getByText("New Role"));
132
+ expect(onNewRole).toHaveBeenCalled();
133
+ });
134
+ it("shows an empty state when there are no roles", function () {
135
+ renderWithChakra(react_1.default.createElement(RolesPermission_1.default, __assign({ view: "list" }, baseProps, { roles: [] })));
136
+ expect(react_2.screen.getByText("No roles found")).toBeInTheDocument();
137
+ });
138
+ it("renders the permission matrix in the form view", function () {
139
+ renderWithChakra(react_1.default.createElement(RolesPermission_1.default, __assign({ view: "form", mode: "create" }, baseProps)));
140
+ expect(react_2.screen.getByText("Permission Settings")).toBeInTheDocument();
141
+ expect(react_2.screen.getByText("Leads")).toBeInTheDocument();
142
+ expect(react_2.screen.getByText("Automation")).toBeInTheDocument();
143
+ expect(react_2.screen.getByText("Enable All Permissions")).toBeInTheDocument();
144
+ });
145
+ it("opens the delete confirmation modal", function () {
146
+ renderWithChakra(react_1.default.createElement(RolesPermission_1.default, __assign({ view: "list" }, baseProps)));
147
+ react_2.fireEvent.click(react_2.screen.getAllByLabelText("Delete")[0]);
148
+ expect(react_2.screen.getByText("Are you sure you want to delete this role?")).toBeInTheDocument();
149
+ });
150
+ });
@@ -0,0 +1,117 @@
1
+ import { ReactNode } from "react";
2
+ export type PermissionKey = "read" | "create" | "edit" | "delete" | "import" | "export" | "automation";
3
+ export type Permission = {
4
+ module: string;
5
+ read: boolean;
6
+ create: boolean;
7
+ edit: boolean;
8
+ delete: boolean;
9
+ import?: boolean;
10
+ export?: boolean;
11
+ automation?: boolean;
12
+ };
13
+ export type RoleData = {
14
+ roleName: string;
15
+ createdBy: string;
16
+ created_at: string;
17
+ permission: Permission[];
18
+ roles_id: string;
19
+ designation: string;
20
+ makeSuperAdmin?: boolean;
21
+ automation?: boolean;
22
+ trackLocation?: boolean;
23
+ show_records?: boolean;
24
+ };
25
+ export type RolesPermissionView = "list" | "form";
26
+ export type RolesPermissionMode = "create" | "edit" | "view";
27
+ /**
28
+ * All user-facing strings. Provide translated values from the host app; every
29
+ * key has a sensible English default so the component works standalone.
30
+ */
31
+ export type RolesPermissionLabels = {
32
+ title?: string;
33
+ totalRoles?: string;
34
+ newRole?: string;
35
+ sNo?: string;
36
+ roleNameColumn?: string;
37
+ createdBy?: string;
38
+ createdTime?: string;
39
+ actions?: string;
40
+ noRoles?: string;
41
+ view?: string;
42
+ edit?: string;
43
+ delete?: string;
44
+ roleInformation?: string;
45
+ roleName?: string;
46
+ roleNamePlaceholder?: string;
47
+ enableAllPermissions?: string;
48
+ trackLocation?: string;
49
+ showAllUserRecords?: string;
50
+ permissionSettings?: string;
51
+ moduleName?: string;
52
+ read?: string;
53
+ create?: string;
54
+ editPermission?: string;
55
+ deletePermission?: string;
56
+ importPermission?: string;
57
+ exportPermission?: string;
58
+ noPermissions?: string;
59
+ cancel?: string;
60
+ saveChanges?: string;
61
+ updateChanges?: string;
62
+ readOnly?: string;
63
+ deleteRole?: string;
64
+ deleteRoleConfirm?: string;
65
+ };
66
+ export interface RolesPermissionProps {
67
+ /** Which view to render. */
68
+ view: RolesPermissionView;
69
+ /** Form mode (controls read-only vs editable form). */
70
+ mode?: RolesPermissionMode;
71
+ /** Roles list data. */
72
+ roles: RoleData[];
73
+ isRolesLoading?: boolean;
74
+ /** Permission matrix rows for the form view. */
75
+ permissions: Permission[];
76
+ /** Columns rendered in the matrix. Defaults to all non-automation keys. */
77
+ permissionKeys?: PermissionKey[];
78
+ /** Form field values (controlled). */
79
+ roleName: string;
80
+ roleNameError?: string;
81
+ isSuperAdmin: boolean;
82
+ isTrackLocation: boolean;
83
+ isShowRecords: boolean;
84
+ /** Whether the role is being edited (changes the Save button label). */
85
+ isEditing?: boolean;
86
+ /** Save in-flight flag. */
87
+ isSaving?: boolean;
88
+ /** List actions. */
89
+ onNewRole?: () => void;
90
+ onViewRole?: (role: RoleData) => void;
91
+ onEditRole?: (role: RoleData) => void;
92
+ onDeleteRole?: (roleId: number) => void;
93
+ onBack?: () => void;
94
+ /** Form actions. */
95
+ onRoleNameChange?: (value: string) => void;
96
+ onToggleSuperAdmin?: (checked: boolean) => void;
97
+ onToggleTrackLocation?: (checked: boolean) => void;
98
+ onToggleShowRecords?: (checked: boolean) => void;
99
+ onPermissionChange?: (module: string, key: PermissionKey) => void;
100
+ onSave?: () => void;
101
+ onCancelForm?: () => void;
102
+ /** App-specific sections rendered under the roles list (e.g. ModuleDelete, SignInActivity). */
103
+ footerSlot?: ReactNode;
104
+ /** Icon shown in the matrix for granted permissions in view mode. */
105
+ checkIcon?: ReactNode;
106
+ /** Translated/override strings. */
107
+ labels?: RolesPermissionLabels;
108
+ /** Outer padding override. Defaults to a compact value. */
109
+ padding?: string;
110
+ }
111
+ export interface DeleteRoleModalProps {
112
+ isOpen: boolean;
113
+ onClose: () => void;
114
+ onConfirm: () => void;
115
+ isLoading?: boolean;
116
+ labels: Required<Pick<RolesPermissionLabels, "deleteRole" | "deleteRoleConfirm" | "cancel" | "delete">>;
117
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import { AddUserModalProps } from "./UserDetailsProps";
3
+ declare const AddUserModal: React.FC<AddUserModalProps>;
4
+ export default AddUserModal;