roles-privileges-payload-plugin 1.1.1 → 1.2.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.
- package/README.md +15 -0
- package/dist/collections/roles.d.ts +2 -2
- package/dist/collections/roles.js +27 -45
- package/dist/collections/roles.js.map +1 -1
- package/dist/components/PrivilegesSelect.d.ts +2 -2
- package/dist/components/PrivilegesSelect.js +89 -71
- package/dist/components/PrivilegesSelect.js.map +1 -1
- package/dist/exports/utilities.d.ts +5 -4
- package/dist/exports/utilities.js +10 -8
- package/dist/exports/utilities.js.map +1 -1
- package/dist/fields/slug/SlugComponent.d.ts +9 -0
- package/dist/fields/slug/SlugComponent.js +83 -0
- package/dist/fields/slug/SlugComponent.js.map +1 -0
- package/dist/fields/slug/formatSlug.d.ts +3 -0
- package/dist/fields/slug/formatSlug.js +15 -0
- package/dist/fields/slug/formatSlug.js.map +1 -0
- package/dist/fields/slug/index.d.ts +8 -0
- package/dist/fields/slug/index.js +47 -0
- package/dist/fields/slug/index.js.map +1 -0
- package/dist/fields/slug/index.scss +12 -0
- package/dist/index.d.ts +17 -7
- package/dist/index.js +59 -10
- package/dist/index.js.map +1 -1
- package/dist/roles-privileges-payload-plugin-1.2.0.tgz +0 -0
- package/dist/translations/index.js +4 -4
- package/dist/translations/index.js.map +1 -1
- package/dist/translations/languages/en.js +19 -18
- package/dist/translations/languages/en.js.map +1 -1
- package/dist/translations/languages/fr.js +19 -18
- package/dist/translations/languages/fr.js.map +1 -1
- package/dist/translations/types.d.ts +43 -42
- package/dist/translations/types.js.map +1 -1
- package/dist/utils/assignSuperAdminToFirstUser.d.ts +10 -0
- package/dist/utils/assignSuperAdminToFirstUser.js +70 -0
- package/dist/utils/assignSuperAdminToFirstUser.js.map +1 -0
- package/dist/utils/createCustomPrivilege.d.ts +9 -9
- package/dist/utils/createCustomPrivilege.js +4 -4
- package/dist/utils/createCustomPrivilege.js.map +1 -1
- package/dist/utils/generateGlobalPrivileges.d.ts +4 -4
- package/dist/utils/generateGlobalPrivileges.js +4 -4
- package/dist/utils/generateGlobalPrivileges.js.map +1 -1
- package/dist/utils/generatePrivileges.d.ts +6 -6
- package/dist/utils/generatePrivileges.js +6 -6
- package/dist/utils/generatePrivileges.js.map +1 -1
- package/dist/utils/seedSuperAdminRole.js +7 -7
- package/dist/utils/seedSuperAdminRole.js.map +1 -1
- package/package.json +15 -15
- package/dist/roles-privileges-payload-plugin-1.1.1.tgz +0 -0
|
@@ -10,10 +10,10 @@ import { memo, useCallback } from 'react';
|
|
|
10
10
|
* @param {CollectionPrivileges[]} props.collections - Collections with their privileges
|
|
11
11
|
* @param {GlobalPrivileges[]} props.globals - Globals with their privileges
|
|
12
12
|
*/ const PrivilegesSelect = (props)=>{
|
|
13
|
-
const {
|
|
13
|
+
const { collections = [], globals = [], path } = props;
|
|
14
14
|
const { rows } = useField({
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
hasRows: true,
|
|
16
|
+
path
|
|
17
17
|
});
|
|
18
18
|
const { addFieldRow, removeFieldRow, setModified } = useForm();
|
|
19
19
|
const { dispatch } = useFormFields(([_, dispatch])=>({
|
|
@@ -22,9 +22,11 @@ import { memo, useCallback } from 'react';
|
|
|
22
22
|
const { i18n } = useTranslation();
|
|
23
23
|
const locale = i18n?.language || 'en';
|
|
24
24
|
// Helper to get label in current locale with fallback
|
|
25
|
-
const getLabel = (labels)=>{
|
|
25
|
+
const getLabel = useCallback((labels)=>{
|
|
26
26
|
return labels[locale] || labels._default || labels.en || Object.values(labels)[0] || '';
|
|
27
|
-
}
|
|
27
|
+
}, [
|
|
28
|
+
locale
|
|
29
|
+
]);
|
|
28
30
|
// Use the collections and globals from props
|
|
29
31
|
const collectionsArray = collections;
|
|
30
32
|
const globalsArray = globals;
|
|
@@ -57,7 +59,7 @@ import { memo, useCallback } from 'react';
|
|
|
57
59
|
}, [
|
|
58
60
|
collectionsArray,
|
|
59
61
|
globalsArray,
|
|
60
|
-
|
|
62
|
+
getLabel
|
|
61
63
|
]);
|
|
62
64
|
/**
|
|
63
65
|
* Check if a privilege is already selected
|
|
@@ -104,8 +106,8 @@ import { memo, useCallback } from 'react';
|
|
|
104
106
|
]);
|
|
105
107
|
return /*#__PURE__*/ _jsxs("div", {
|
|
106
108
|
style: {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
+
marginBottom: '16px',
|
|
110
|
+
marginTop: '16px'
|
|
109
111
|
},
|
|
110
112
|
children: [
|
|
111
113
|
/*#__PURE__*/ _jsxs("div", {
|
|
@@ -121,20 +123,22 @@ import { memo, useCallback } from 'react';
|
|
|
121
123
|
return /*#__PURE__*/ _jsx(Collapsible, {
|
|
122
124
|
header: /*#__PURE__*/ _jsxs("div", {
|
|
123
125
|
style: {
|
|
124
|
-
display: 'flex',
|
|
125
126
|
alignItems: 'center',
|
|
127
|
+
display: 'flex',
|
|
126
128
|
justifyContent: 'space-between',
|
|
127
129
|
width: '100%'
|
|
128
130
|
},
|
|
129
131
|
children: [
|
|
130
132
|
/*#__PURE__*/ _jsxs("div", {
|
|
131
133
|
style: {
|
|
132
|
-
display: 'flex',
|
|
133
134
|
alignItems: 'center',
|
|
135
|
+
display: 'flex',
|
|
134
136
|
gap: '8px'
|
|
135
137
|
},
|
|
136
138
|
children: [
|
|
137
139
|
/*#__PURE__*/ _jsx("span", {
|
|
140
|
+
"aria-label": "Collection",
|
|
141
|
+
role: "img",
|
|
138
142
|
children: "📦"
|
|
139
143
|
}),
|
|
140
144
|
/*#__PURE__*/ _jsx("span", {
|
|
@@ -147,12 +151,12 @@ import { memo, useCallback } from 'react';
|
|
|
147
151
|
}),
|
|
148
152
|
selectedCount > 0 && /*#__PURE__*/ _jsx("span", {
|
|
149
153
|
style: {
|
|
150
|
-
padding: '2px 8px',
|
|
151
154
|
backgroundColor: 'var(--theme-success-100)',
|
|
152
|
-
color: 'var(--theme-success-800)',
|
|
153
155
|
borderRadius: '12px',
|
|
156
|
+
color: 'var(--theme-success-800)',
|
|
154
157
|
fontSize: '12px',
|
|
155
|
-
fontWeight: 600
|
|
158
|
+
fontWeight: 600,
|
|
159
|
+
padding: '2px 8px'
|
|
156
160
|
},
|
|
157
161
|
children: selectedCount
|
|
158
162
|
})
|
|
@@ -160,39 +164,43 @@ import { memo, useCallback } from 'react';
|
|
|
160
164
|
}),
|
|
161
165
|
children: /*#__PURE__*/ _jsx("div", {
|
|
162
166
|
style: {
|
|
163
|
-
padding: '16px',
|
|
164
167
|
backgroundColor: 'var(--theme-elevation-50)',
|
|
165
168
|
display: 'flex',
|
|
166
169
|
flexDirection: 'column',
|
|
167
|
-
gap: '12px'
|
|
170
|
+
gap: '12px',
|
|
171
|
+
padding: '16px'
|
|
168
172
|
},
|
|
169
173
|
children: privileges.map((privilege)=>{
|
|
170
174
|
const isSelected = isPrivilegeSelected(privilege.privilegeKey);
|
|
171
175
|
const isCustom = privilege.isCustom === true;
|
|
172
176
|
return /*#__PURE__*/ _jsx("div", {
|
|
173
177
|
style: {
|
|
174
|
-
padding: '12px',
|
|
175
178
|
backgroundColor: 'var(--theme-elevation-0)',
|
|
176
179
|
border: `1px solid ${isSelected ? 'var(--theme-success-300)' : 'var(--theme-elevation-300)'}`,
|
|
177
180
|
borderRadius: '4px',
|
|
181
|
+
padding: '12px',
|
|
178
182
|
transition: 'all 0.2s'
|
|
179
183
|
},
|
|
180
184
|
children: /*#__PURE__*/ _jsxs("label", {
|
|
185
|
+
"aria-label": `Select privilege: ${getLabel(privilege.label)}`,
|
|
186
|
+
htmlFor: `global-privilege-${privilege.privilegeKey}`,
|
|
181
187
|
style: {
|
|
182
|
-
display: 'flex',
|
|
183
188
|
alignItems: 'flex-start',
|
|
184
|
-
|
|
185
|
-
|
|
189
|
+
cursor: 'pointer',
|
|
190
|
+
display: 'flex',
|
|
191
|
+
gap: '12px'
|
|
186
192
|
},
|
|
187
193
|
children: [
|
|
188
194
|
/*#__PURE__*/ _jsx("input", {
|
|
189
|
-
|
|
195
|
+
"aria-label": `Select privilege: ${getLabel(privilege.label)}`,
|
|
190
196
|
checked: isSelected,
|
|
197
|
+
id: `global-privilege-${privilege.privilegeKey}`,
|
|
191
198
|
onChange: ()=>handlePrivilegeToggle(privilege),
|
|
192
199
|
style: {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
}
|
|
200
|
+
cursor: 'pointer',
|
|
201
|
+
marginTop: '2px'
|
|
202
|
+
},
|
|
203
|
+
type: "checkbox"
|
|
196
204
|
}),
|
|
197
205
|
/*#__PURE__*/ _jsxs("div", {
|
|
198
206
|
style: {
|
|
@@ -201,16 +209,18 @@ import { memo, useCallback } from 'react';
|
|
|
201
209
|
children: [
|
|
202
210
|
/*#__PURE__*/ _jsxs("div", {
|
|
203
211
|
style: {
|
|
204
|
-
|
|
205
|
-
fontSize: '14px',
|
|
212
|
+
alignItems: 'center',
|
|
206
213
|
color: 'var(--theme-elevation-1000)',
|
|
207
|
-
marginBottom: '4px',
|
|
208
214
|
display: 'flex',
|
|
209
|
-
|
|
210
|
-
|
|
215
|
+
fontSize: '14px',
|
|
216
|
+
fontWeight: 600,
|
|
217
|
+
gap: '6px',
|
|
218
|
+
marginBottom: '4px'
|
|
211
219
|
},
|
|
212
220
|
children: [
|
|
213
221
|
isCustom && /*#__PURE__*/ _jsx("span", {
|
|
222
|
+
"aria-label": "Custom privilege",
|
|
223
|
+
role: "img",
|
|
214
224
|
style: {
|
|
215
225
|
fontSize: '16px'
|
|
216
226
|
},
|
|
@@ -221,8 +231,8 @@ import { memo, useCallback } from 'react';
|
|
|
221
231
|
}),
|
|
222
232
|
/*#__PURE__*/ _jsx("div", {
|
|
223
233
|
style: {
|
|
224
|
-
fontSize: '13px',
|
|
225
234
|
color: 'var(--theme-elevation-700)',
|
|
235
|
+
fontSize: '13px',
|
|
226
236
|
lineHeight: '1.4',
|
|
227
237
|
marginBottom: '8px'
|
|
228
238
|
},
|
|
@@ -230,13 +240,13 @@ import { memo, useCallback } from 'react';
|
|
|
230
240
|
}),
|
|
231
241
|
/*#__PURE__*/ _jsxs("div", {
|
|
232
242
|
style: {
|
|
233
|
-
padding: '4px 8px',
|
|
234
243
|
backgroundColor: isCustom ? 'var(--theme-warning-100)' : 'var(--theme-elevation-100)',
|
|
235
244
|
borderRadius: '4px',
|
|
236
|
-
fontSize: '11px',
|
|
237
|
-
fontFamily: 'monospace',
|
|
238
245
|
color: isCustom ? 'var(--theme-warning-900)' : 'var(--theme-elevation-800)',
|
|
239
|
-
display: 'inline-block'
|
|
246
|
+
display: 'inline-block',
|
|
247
|
+
fontFamily: 'monospace',
|
|
248
|
+
fontSize: '11px',
|
|
249
|
+
padding: '4px 8px'
|
|
240
250
|
},
|
|
241
251
|
children: [
|
|
242
252
|
isCustom && '⭐ ',
|
|
@@ -258,20 +268,22 @@ import { memo, useCallback } from 'react';
|
|
|
258
268
|
return /*#__PURE__*/ _jsx(Collapsible, {
|
|
259
269
|
header: /*#__PURE__*/ _jsxs("div", {
|
|
260
270
|
style: {
|
|
261
|
-
display: 'flex',
|
|
262
271
|
alignItems: 'center',
|
|
272
|
+
display: 'flex',
|
|
263
273
|
justifyContent: 'space-between',
|
|
264
274
|
width: '100%'
|
|
265
275
|
},
|
|
266
276
|
children: [
|
|
267
277
|
/*#__PURE__*/ _jsxs("div", {
|
|
268
278
|
style: {
|
|
269
|
-
display: 'flex',
|
|
270
279
|
alignItems: 'center',
|
|
280
|
+
display: 'flex',
|
|
271
281
|
gap: '8px'
|
|
272
282
|
},
|
|
273
283
|
children: [
|
|
274
284
|
/*#__PURE__*/ _jsx("span", {
|
|
285
|
+
"aria-label": "Global",
|
|
286
|
+
role: "img",
|
|
275
287
|
children: "🌐"
|
|
276
288
|
}),
|
|
277
289
|
/*#__PURE__*/ _jsx("span", {
|
|
@@ -284,12 +296,12 @@ import { memo, useCallback } from 'react';
|
|
|
284
296
|
}),
|
|
285
297
|
selectedCount > 0 && /*#__PURE__*/ _jsx("span", {
|
|
286
298
|
style: {
|
|
287
|
-
padding: '2px 8px',
|
|
288
299
|
backgroundColor: 'var(--theme-success-100)',
|
|
289
|
-
color: 'var(--theme-success-800)',
|
|
290
300
|
borderRadius: '12px',
|
|
301
|
+
color: 'var(--theme-success-800)',
|
|
291
302
|
fontSize: '12px',
|
|
292
|
-
fontWeight: 600
|
|
303
|
+
fontWeight: 600,
|
|
304
|
+
padding: '2px 8px'
|
|
293
305
|
},
|
|
294
306
|
children: selectedCount
|
|
295
307
|
})
|
|
@@ -297,39 +309,43 @@ import { memo, useCallback } from 'react';
|
|
|
297
309
|
}),
|
|
298
310
|
children: /*#__PURE__*/ _jsx("div", {
|
|
299
311
|
style: {
|
|
300
|
-
padding: '16px',
|
|
301
312
|
backgroundColor: 'var(--theme-elevation-50)',
|
|
302
313
|
display: 'flex',
|
|
303
314
|
flexDirection: 'column',
|
|
304
|
-
gap: '12px'
|
|
315
|
+
gap: '12px',
|
|
316
|
+
padding: '16px'
|
|
305
317
|
},
|
|
306
318
|
children: privileges.map((privilege)=>{
|
|
307
319
|
const isSelected = isPrivilegeSelected(privilege.privilegeKey);
|
|
308
320
|
const isCustom = privilege.isCustom === true;
|
|
309
321
|
return /*#__PURE__*/ _jsx("div", {
|
|
310
322
|
style: {
|
|
311
|
-
padding: '12px',
|
|
312
323
|
backgroundColor: 'var(--theme-elevation-0)',
|
|
313
324
|
border: `1px solid ${isSelected ? 'var(--theme-success-300)' : 'var(--theme-elevation-300)'}`,
|
|
314
325
|
borderRadius: '4px',
|
|
326
|
+
padding: '12px',
|
|
315
327
|
transition: 'all 0.2s'
|
|
316
328
|
},
|
|
317
329
|
children: /*#__PURE__*/ _jsxs("label", {
|
|
330
|
+
"aria-label": `Select privilege: ${getLabel(privilege.label)}`,
|
|
331
|
+
htmlFor: `global-privilege-${privilege.privilegeKey}`,
|
|
318
332
|
style: {
|
|
319
|
-
display: 'flex',
|
|
320
333
|
alignItems: 'flex-start',
|
|
321
|
-
|
|
322
|
-
|
|
334
|
+
cursor: 'pointer',
|
|
335
|
+
display: 'flex',
|
|
336
|
+
gap: '12px'
|
|
323
337
|
},
|
|
324
338
|
children: [
|
|
325
339
|
/*#__PURE__*/ _jsx("input", {
|
|
326
|
-
|
|
340
|
+
"aria-label": `Select privilege: ${getLabel(privilege.label)}`,
|
|
327
341
|
checked: isSelected,
|
|
342
|
+
id: `global-privilege-${privilege.privilegeKey}`,
|
|
328
343
|
onChange: ()=>handlePrivilegeToggle(privilege),
|
|
329
344
|
style: {
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
}
|
|
345
|
+
cursor: 'pointer',
|
|
346
|
+
marginTop: '2px'
|
|
347
|
+
},
|
|
348
|
+
type: "checkbox"
|
|
333
349
|
}),
|
|
334
350
|
/*#__PURE__*/ _jsxs("div", {
|
|
335
351
|
style: {
|
|
@@ -338,16 +354,18 @@ import { memo, useCallback } from 'react';
|
|
|
338
354
|
children: [
|
|
339
355
|
/*#__PURE__*/ _jsxs("div", {
|
|
340
356
|
style: {
|
|
341
|
-
|
|
342
|
-
fontSize: '14px',
|
|
357
|
+
alignItems: 'center',
|
|
343
358
|
color: 'var(--theme-elevation-1000)',
|
|
344
|
-
marginBottom: '4px',
|
|
345
359
|
display: 'flex',
|
|
346
|
-
|
|
347
|
-
|
|
360
|
+
fontSize: '14px',
|
|
361
|
+
fontWeight: 600,
|
|
362
|
+
gap: '6px',
|
|
363
|
+
marginBottom: '4px'
|
|
348
364
|
},
|
|
349
365
|
children: [
|
|
350
366
|
isCustom && /*#__PURE__*/ _jsx("span", {
|
|
367
|
+
"aria-label": "Custom privilege",
|
|
368
|
+
role: "img",
|
|
351
369
|
style: {
|
|
352
370
|
fontSize: '16px'
|
|
353
371
|
},
|
|
@@ -358,8 +376,8 @@ import { memo, useCallback } from 'react';
|
|
|
358
376
|
}),
|
|
359
377
|
/*#__PURE__*/ _jsx("div", {
|
|
360
378
|
style: {
|
|
361
|
-
fontSize: '13px',
|
|
362
379
|
color: 'var(--theme-elevation-700)',
|
|
380
|
+
fontSize: '13px',
|
|
363
381
|
lineHeight: '1.4',
|
|
364
382
|
marginBottom: '8px'
|
|
365
383
|
},
|
|
@@ -367,13 +385,13 @@ import { memo, useCallback } from 'react';
|
|
|
367
385
|
}),
|
|
368
386
|
/*#__PURE__*/ _jsxs("div", {
|
|
369
387
|
style: {
|
|
370
|
-
padding: '4px 8px',
|
|
371
388
|
backgroundColor: isCustom ? 'var(--theme-warning-100)' : 'var(--theme-elevation-100)',
|
|
372
389
|
borderRadius: '4px',
|
|
373
|
-
fontSize: '11px',
|
|
374
|
-
fontFamily: 'monospace',
|
|
375
390
|
color: isCustom ? 'var(--theme-warning-900)' : 'var(--theme-elevation-800)',
|
|
376
|
-
display: 'inline-block'
|
|
391
|
+
display: 'inline-block',
|
|
392
|
+
fontFamily: 'monospace',
|
|
393
|
+
fontSize: '11px',
|
|
394
|
+
padding: '4px 8px'
|
|
377
395
|
},
|
|
378
396
|
children: [
|
|
379
397
|
isCustom && '⭐ ',
|
|
@@ -393,18 +411,18 @@ import { memo, useCallback } from 'react';
|
|
|
393
411
|
}),
|
|
394
412
|
existingPrivileges.length > 0 && /*#__PURE__*/ _jsxs("div", {
|
|
395
413
|
style: {
|
|
396
|
-
marginTop: '16px',
|
|
397
|
-
padding: '16px',
|
|
398
414
|
backgroundColor: 'var(--theme-elevation-100)',
|
|
399
|
-
borderRadius: '4px'
|
|
415
|
+
borderRadius: '4px',
|
|
416
|
+
marginTop: '16px',
|
|
417
|
+
padding: '16px'
|
|
400
418
|
},
|
|
401
419
|
children: [
|
|
402
420
|
/*#__PURE__*/ _jsxs("h5", {
|
|
403
421
|
style: {
|
|
404
|
-
|
|
422
|
+
color: 'var(--theme-elevation-1000)',
|
|
405
423
|
fontSize: '14px',
|
|
406
424
|
fontWeight: 600,
|
|
407
|
-
|
|
425
|
+
margin: '0 0 12px 0'
|
|
408
426
|
},
|
|
409
427
|
children: [
|
|
410
428
|
i18n.t('plugin-roles-privileges:privileges-selected-count'),
|
|
@@ -422,22 +440,21 @@ import { memo, useCallback } from 'react';
|
|
|
422
440
|
},
|
|
423
441
|
children: existingPrivileges.map((privilegeKey, index)=>/*#__PURE__*/ _jsxs("div", {
|
|
424
442
|
style: {
|
|
425
|
-
display: 'inline-flex',
|
|
426
443
|
alignItems: 'center',
|
|
427
|
-
gap: '8px',
|
|
428
|
-
padding: '6px 12px',
|
|
429
444
|
backgroundColor: 'var(--theme-success-100)',
|
|
430
445
|
border: '1px solid var(--theme-success-300)',
|
|
431
446
|
borderRadius: '16px',
|
|
447
|
+
color: 'var(--theme-success-800)',
|
|
448
|
+
display: 'inline-flex',
|
|
432
449
|
fontSize: '12px',
|
|
433
|
-
|
|
450
|
+
gap: '8px',
|
|
451
|
+
padding: '6px 12px'
|
|
434
452
|
},
|
|
435
453
|
children: [
|
|
436
454
|
/*#__PURE__*/ _jsx("span", {
|
|
437
455
|
children: getPrivilegeLabel(privilegeKey)
|
|
438
456
|
}),
|
|
439
457
|
/*#__PURE__*/ _jsx("button", {
|
|
440
|
-
type: "button",
|
|
441
458
|
onClick: ()=>{
|
|
442
459
|
removeFieldRow({
|
|
443
460
|
path,
|
|
@@ -446,16 +463,17 @@ import { memo, useCallback } from 'react';
|
|
|
446
463
|
setModified(true);
|
|
447
464
|
},
|
|
448
465
|
style: {
|
|
466
|
+
alignItems: 'center',
|
|
449
467
|
background: 'none',
|
|
450
468
|
border: 'none',
|
|
451
469
|
color: 'var(--theme-success-600)',
|
|
452
470
|
cursor: 'pointer',
|
|
453
|
-
padding: 0,
|
|
454
471
|
display: 'flex',
|
|
455
|
-
alignItems: 'center',
|
|
456
472
|
fontSize: '16px',
|
|
457
|
-
lineHeight: 1
|
|
473
|
+
lineHeight: 1,
|
|
474
|
+
padding: 0
|
|
458
475
|
},
|
|
476
|
+
type: "button",
|
|
459
477
|
children: "×"
|
|
460
478
|
})
|
|
461
479
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/PrivilegesSelect.tsx"],"sourcesContent":["'use client'\nimport type { ArrayFieldClientComponent } from 'payload'\n\nimport { Collapsible, useField, useForm, useFormFields, useTranslation } from '@payloadcms/ui'\nimport { memo, useCallback } from 'react'\nimport type { GlobalPrivilege } from '../utils/generateGlobalPrivileges.js'\nimport type { Privilege } from '../utils/generatePrivileges.js'\n\ntype CollectionPrivileges = {\n collectionSlug: string\n collectionLabel: Record<string, string>\n privileges: Record<string, Privilege>\n}\n\ntype GlobalPrivileges = {\n globalSlug: string\n globalLabel: Record<string, string>\n privileges: Record<string, GlobalPrivilege>\n}\n\ntype PrivilegesSelectProps = {\n path: string\n collections: CollectionPrivileges[]\n globals: GlobalPrivileges[]\n}\n\n/**\n * Custom array field component for managing privileges in Payload CMS\n * @component\n * @param {Object} props - Component props from Payload CMS\n * @param {string} props.path - Path to the field in the form\n * @param {CollectionPrivileges[]} props.collections - Collections with their privileges\n * @param {GlobalPrivileges[]} props.globals - Globals with their privileges\n */\nconst PrivilegesSelect: ArrayFieldClientComponent = (props) => {\n const { path, collections = [], globals = [] } = props as any\n const { rows } = useField({ path, hasRows: true })\n const { addFieldRow, removeFieldRow, setModified } = useForm()\n const { dispatch } = useFormFields(([_, dispatch]) => ({ dispatch }))\n const { i18n } = useTranslation()\n const locale = i18n?.language || 'en'\n\n // Helper to get label in current locale with fallback\n const getLabel = (labels: Record<string, string>): string => {\n return labels[locale] || labels._default || labels.en || Object.values(labels)[0] || ''\n }\n\n // Use the collections and globals from props\n const collectionsArray = collections\n const globalsArray = globals\n\n /**\n * Get existing privilege values from form fields\n */\n const existingPrivileges = useFormFields(\n ([fields]) =>\n rows?.map((row, index) => {\n const value = fields[`${path}.${index}.privilege`]?.value\n return typeof value === 'string' ? value : ''\n }) || [],\n )\n\n /**\n * Get privilege label from privilegeKey\n */\n const getPrivilegeLabel = useCallback(\n (privilegeKey: string) => {\n // Check collections\n for (const collection of collectionsArray) {\n for (const privilege of Object.values(collection.privileges) as Privilege[]) {\n if (privilege.privilegeKey === privilegeKey) {\n return getLabel(privilege.label)\n }\n }\n }\n // Check globals\n for (const global of globalsArray) {\n for (const privilege of Object.values(global.privileges) as GlobalPrivilege[]) {\n if (privilege.privilegeKey === privilegeKey) {\n return getLabel(privilege.label)\n }\n }\n }\n return privilegeKey\n },\n [collectionsArray, globalsArray, locale],\n )\n\n /**\n * Check if a privilege is already selected\n */\n const isPrivilegeSelected = useCallback(\n (privilegeName: string) => {\n return existingPrivileges.includes(privilegeName)\n },\n [existingPrivileges],\n )\n\n /**\n * Handles privilege selection/deselection\n */\n const handlePrivilegeToggle = useCallback(\n (privilege: Privilege | GlobalPrivilege) => {\n const privilegeKey = privilege.privilegeKey\n const existingIndex = existingPrivileges.indexOf(privilegeKey)\n\n if (existingIndex >= 0) {\n // Remove privilege\n removeFieldRow({ path, rowIndex: existingIndex })\n setModified(true)\n } else {\n // Add privilege\n addFieldRow({\n path,\n schemaPath: `${path}.0.privilege`,\n })\n\n setTimeout(() => {\n dispatch({\n type: 'UPDATE',\n path: `${path}.${rows?.length || 0}.privilege`,\n value: privilegeKey,\n })\n setModified(true)\n }, 0)\n }\n },\n [addFieldRow, dispatch, existingPrivileges, path, removeFieldRow, rows?.length, setModified],\n )\n\n return (\n <div style={{ marginTop: '16px', marginBottom: '16px' }}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {/* Collections */}\n {collectionsArray.map((collection: CollectionPrivileges) => {\n const privileges = Object.values(collection.privileges) as Privilege[]\n const selectedCount = privileges.filter((p) => isPrivilegeSelected(p.privilegeKey)).length\n\n return (\n <Collapsible\n key={collection.collectionSlug}\n header={\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <span>📦</span>\n <span style={{ fontWeight: 500 }}>\n {getLabel(collection.collectionLabel) || collection.collectionSlug}\n </span>\n </div>\n {selectedCount > 0 && (\n <span\n style={{\n padding: '2px 8px',\n backgroundColor: 'var(--theme-success-100)',\n color: 'var(--theme-success-800)',\n borderRadius: '12px',\n fontSize: '12px',\n fontWeight: 600,\n }}\n >\n {selectedCount}\n </span>\n )}\n </div>\n }\n >\n <div\n style={{\n padding: '16px',\n backgroundColor: 'var(--theme-elevation-50)',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n }}\n >\n {privileges.map((privilege) => {\n const isSelected = isPrivilegeSelected(privilege.privilegeKey)\n const isCustom = privilege.isCustom === true\n return (\n <div\n key={privilege.privilegeKey}\n style={{\n padding: '12px',\n backgroundColor: 'var(--theme-elevation-0)',\n border: `1px solid ${\n isSelected ? 'var(--theme-success-300)' : 'var(--theme-elevation-300)'\n }`,\n borderRadius: '4px',\n transition: 'all 0.2s',\n }}\n >\n <label\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: '12px',\n cursor: 'pointer',\n }}\n >\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={() => handlePrivilegeToggle(privilege)}\n style={{ marginTop: '2px', cursor: 'pointer' }}\n />\n <div style={{ flex: 1 }}>\n <div\n style={{\n fontWeight: 600,\n fontSize: '14px',\n color: 'var(--theme-elevation-1000)',\n marginBottom: '4px',\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n }}\n >\n {isCustom && <span style={{ fontSize: '16px' }}>⭐</span>}\n {getLabel(privilege.label)}\n </div>\n <div\n style={{\n fontSize: '13px',\n color: 'var(--theme-elevation-700)',\n lineHeight: '1.4',\n marginBottom: '8px',\n }}\n >\n {getLabel(privilege.description)}\n </div>\n <div\n style={{\n padding: '4px 8px',\n backgroundColor: isCustom\n ? 'var(--theme-warning-100)'\n : 'var(--theme-elevation-100)',\n borderRadius: '4px',\n fontSize: '11px',\n fontFamily: 'monospace',\n color: isCustom\n ? 'var(--theme-warning-900)'\n : 'var(--theme-elevation-800)',\n display: 'inline-block',\n }}\n >\n {isCustom && '⭐ '}\n {privilege.privilegeKey}\n </div>\n </div>\n </label>\n </div>\n )\n })}\n </div>\n </Collapsible>\n )\n })}\n\n {/* Globals */}\n {globalsArray.map((global: GlobalPrivileges) => {\n const privileges = Object.values(global.privileges) as GlobalPrivilege[]\n const selectedCount = privileges.filter((p) => isPrivilegeSelected(p.privilegeKey)).length\n\n return (\n <Collapsible\n key={global.globalSlug}\n header={\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <span>🌐</span>\n <span style={{ fontWeight: 500 }}>\n {getLabel(global.globalLabel) || global.globalSlug}\n </span>\n </div>\n {selectedCount > 0 && (\n <span\n style={{\n padding: '2px 8px',\n backgroundColor: 'var(--theme-success-100)',\n color: 'var(--theme-success-800)',\n borderRadius: '12px',\n fontSize: '12px',\n fontWeight: 600,\n }}\n >\n {selectedCount}\n </span>\n )}\n </div>\n }\n >\n <div\n style={{\n padding: '16px',\n backgroundColor: 'var(--theme-elevation-50)',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n }}\n >\n {privileges.map((privilege) => {\n const isSelected = isPrivilegeSelected(privilege.privilegeKey)\n const isCustom = privilege.isCustom === true\n return (\n <div\n key={privilege.privilegeKey}\n style={{\n padding: '12px',\n backgroundColor: 'var(--theme-elevation-0)',\n border: `1px solid ${\n isSelected ? 'var(--theme-success-300)' : 'var(--theme-elevation-300)'\n }`,\n borderRadius: '4px',\n transition: 'all 0.2s',\n }}\n >\n <label\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: '12px',\n cursor: 'pointer',\n }}\n >\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={() => handlePrivilegeToggle(privilege)}\n style={{ marginTop: '2px', cursor: 'pointer' }}\n />\n <div style={{ flex: 1 }}>\n <div\n style={{\n fontWeight: 600,\n fontSize: '14px',\n color: 'var(--theme-elevation-1000)',\n marginBottom: '4px',\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n }}\n >\n {isCustom && <span style={{ fontSize: '16px' }}>⭐</span>}\n {getLabel(privilege.label)}\n </div>\n <div\n style={{\n fontSize: '13px',\n color: 'var(--theme-elevation-700)',\n lineHeight: '1.4',\n marginBottom: '8px',\n }}\n >\n {getLabel(privilege.description)}\n </div>\n <div\n style={{\n padding: '4px 8px',\n backgroundColor: isCustom\n ? 'var(--theme-warning-100)'\n : 'var(--theme-elevation-100)',\n borderRadius: '4px',\n fontSize: '11px',\n fontFamily: 'monospace',\n color: isCustom\n ? 'var(--theme-warning-900)'\n : 'var(--theme-elevation-800)',\n display: 'inline-block',\n }}\n >\n {isCustom && '⭐ '}\n {privilege.privilegeKey}\n </div>\n </div>\n </label>\n </div>\n )\n })}\n </div>\n </Collapsible>\n )\n })}\n </div>\n\n {/* Selected Privileges Summary */}\n {existingPrivileges.length > 0 && (\n <div\n style={{\n marginTop: '16px',\n padding: '16px',\n backgroundColor: 'var(--theme-elevation-100)',\n borderRadius: '4px',\n }}\n >\n <h5\n style={{\n margin: '0 0 12px 0',\n fontSize: '14px',\n fontWeight: 600,\n color: 'var(--theme-elevation-1000)',\n }}\n >\n {(i18n.t as (key: string) => string)(\n 'plugin-roles-privileges:privileges-selected-count',\n )}{' '}\n ({existingPrivileges.length})\n </h5>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '8px' }}>\n {existingPrivileges.map((privilegeKey, index) => (\n <div\n key={`${privilegeKey}-${index}`}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n padding: '6px 12px',\n backgroundColor: 'var(--theme-success-100)',\n border: '1px solid var(--theme-success-300)',\n borderRadius: '16px',\n fontSize: '12px',\n color: 'var(--theme-success-800)',\n }}\n >\n <span>{getPrivilegeLabel(privilegeKey)}</span>\n <button\n type=\"button\"\n onClick={() => {\n removeFieldRow({ path, rowIndex: index })\n setModified(true)\n }}\n style={{\n background: 'none',\n border: 'none',\n color: 'var(--theme-success-600)',\n cursor: 'pointer',\n padding: 0,\n display: 'flex',\n alignItems: 'center',\n fontSize: '16px',\n lineHeight: 1,\n }}\n >\n ×\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport default memo(PrivilegesSelect)\nexport type { CollectionPrivileges, GlobalPrivileges }\n"],"names":["Collapsible","useField","useForm","useFormFields","useTranslation","memo","useCallback","PrivilegesSelect","props","path","collections","globals","rows","hasRows","addFieldRow","removeFieldRow","setModified","dispatch","_","i18n","locale","language","getLabel","labels","_default","en","Object","values","collectionsArray","globalsArray","existingPrivileges","fields","map","row","index","value","getPrivilegeLabel","privilegeKey","collection","privilege","privileges","label","global","isPrivilegeSelected","privilegeName","includes","handlePrivilegeToggle","existingIndex","indexOf","rowIndex","schemaPath","setTimeout","type","length","div","style","marginTop","marginBottom","display","flexDirection","gap","selectedCount","filter","p","header","alignItems","justifyContent","width","span","fontWeight","collectionLabel","collectionSlug","padding","backgroundColor","color","borderRadius","fontSize","isSelected","isCustom","border","transition","cursor","input","checked","onChange","flex","lineHeight","description","fontFamily","globalLabel","globalSlug","h5","margin","t","flexWrap","button","onClick","background"],"mappings":"AAAA;;AAGA,SAASA,WAAW,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,aAAa,EAAEC,cAAc,QAAQ,iBAAgB;AAC9F,SAASC,IAAI,EAAEC,WAAW,QAAQ,QAAO;AAsBzC;;;;;;;CAOC,GACD,MAAMC,mBAA8C,CAACC;IACnD,MAAM,EAAEC,IAAI,EAAEC,cAAc,EAAE,EAAEC,UAAU,EAAE,EAAE,GAAGH;IACjD,MAAM,EAAEI,IAAI,EAAE,GAAGX,SAAS;QAAEQ;QAAMI,SAAS;IAAK;IAChD,MAAM,EAAEC,WAAW,EAAEC,cAAc,EAAEC,WAAW,EAAE,GAAGd;IACrD,MAAM,EAAEe,QAAQ,EAAE,GAAGd,cAAc,CAAC,CAACe,GAAGD,SAAS,GAAM,CAAA;YAAEA;QAAS,CAAA;IAClE,MAAM,EAAEE,IAAI,EAAE,GAAGf;IACjB,MAAMgB,SAASD,MAAME,YAAY;IAEjC,sDAAsD;IACtD,MAAMC,WAAW,CAACC;QAChB,OAAOA,MAAM,CAACH,OAAO,IAAIG,OAAOC,QAAQ,IAAID,OAAOE,EAAE,IAAIC,OAAOC,MAAM,CAACJ,OAAO,CAAC,EAAE,IAAI;IACvF;IAEA,6CAA6C;IAC7C,MAAMK,mBAAmBlB;IACzB,MAAMmB,eAAelB;IAErB;;GAEC,GACD,MAAMmB,qBAAqB3B,cACzB,CAAC,CAAC4B,OAAO,GACPnB,MAAMoB,IAAI,CAACC,KAAKC;YACd,MAAMC,QAAQJ,MAAM,CAAC,GAAGtB,KAAK,CAAC,EAAEyB,MAAM,UAAU,CAAC,CAAC,EAAEC;YACpD,OAAO,OAAOA,UAAU,WAAWA,QAAQ;QAC7C,MAAM,EAAE;IAGZ;;GAEC,GACD,MAAMC,oBAAoB9B,YACxB,CAAC+B;QACC,oBAAoB;QACpB,KAAK,MAAMC,cAAcV,iBAAkB;YACzC,KAAK,MAAMW,aAAab,OAAOC,MAAM,CAACW,WAAWE,UAAU,EAAkB;gBAC3E,IAAID,UAAUF,YAAY,KAAKA,cAAc;oBAC3C,OAAOf,SAASiB,UAAUE,KAAK;gBACjC;YACF;QACF;QACA,gBAAgB;QAChB,KAAK,MAAMC,UAAUb,aAAc;YACjC,KAAK,MAAMU,aAAab,OAAOC,MAAM,CAACe,OAAOF,UAAU,EAAwB;gBAC7E,IAAID,UAAUF,YAAY,KAAKA,cAAc;oBAC3C,OAAOf,SAASiB,UAAUE,KAAK;gBACjC;YACF;QACF;QACA,OAAOJ;IACT,GACA;QAACT;QAAkBC;QAAcT;KAAO;IAG1C;;GAEC,GACD,MAAMuB,sBAAsBrC,YAC1B,CAACsC;QACC,OAAOd,mBAAmBe,QAAQ,CAACD;IACrC,GACA;QAACd;KAAmB;IAGtB;;GAEC,GACD,MAAMgB,wBAAwBxC,YAC5B,CAACiC;QACC,MAAMF,eAAeE,UAAUF,YAAY;QAC3C,MAAMU,gBAAgBjB,mBAAmBkB,OAAO,CAACX;QAEjD,IAAIU,iBAAiB,GAAG;YACtB,mBAAmB;YACnBhC,eAAe;gBAAEN;gBAAMwC,UAAUF;YAAc;YAC/C/B,YAAY;QACd,OAAO;YACL,gBAAgB;YAChBF,YAAY;gBACVL;gBACAyC,YAAY,GAAGzC,KAAK,YAAY,CAAC;YACnC;YAEA0C,WAAW;gBACTlC,SAAS;oBACPmC,MAAM;oBACN3C,MAAM,GAAGA,KAAK,CAAC,EAAEG,MAAMyC,UAAU,EAAE,UAAU,CAAC;oBAC9ClB,OAAOE;gBACT;gBACArB,YAAY;YACd,GAAG;QACL;IACF,GACA;QAACF;QAAaG;QAAUa;QAAoBrB;QAAMM;QAAgBH,MAAMyC;QAAQrC;KAAY;IAG9F,qBACE,MAACsC;QAAIC,OAAO;YAAEC,WAAW;YAAQC,cAAc;QAAO;;0BACpD,MAACH;gBAAIC,OAAO;oBAAEG,SAAS;oBAAQC,eAAe;oBAAUC,KAAK;gBAAM;;oBAEhEhC,iBAAiBI,GAAG,CAAC,CAACM;wBACrB,MAAME,aAAad,OAAOC,MAAM,CAACW,WAAWE,UAAU;wBACtD,MAAMqB,gBAAgBrB,WAAWsB,MAAM,CAAC,CAACC,IAAMpB,oBAAoBoB,EAAE1B,YAAY,GAAGgB,MAAM;wBAE1F,qBACE,KAACrD;4BAECgE,sBACE,MAACV;gCACCC,OAAO;oCACLG,SAAS;oCACTO,YAAY;oCACZC,gBAAgB;oCAChBC,OAAO;gCACT;;kDAEA,MAACb;wCAAIC,OAAO;4CAAEG,SAAS;4CAAQO,YAAY;4CAAUL,KAAK;wCAAM;;0DAC9D,KAACQ;0DAAK;;0DACN,KAACA;gDAAKb,OAAO;oDAAEc,YAAY;gDAAI;0DAC5B/C,SAASgB,WAAWgC,eAAe,KAAKhC,WAAWiC,cAAc;;;;oCAGrEV,gBAAgB,mBACf,KAACO;wCACCb,OAAO;4CACLiB,SAAS;4CACTC,iBAAiB;4CACjBC,OAAO;4CACPC,cAAc;4CACdC,UAAU;4CACVP,YAAY;wCACd;kDAECR;;;;sCAMT,cAAA,KAACP;gCACCC,OAAO;oCACLiB,SAAS;oCACTC,iBAAiB;oCACjBf,SAAS;oCACTC,eAAe;oCACfC,KAAK;gCACP;0CAECpB,WAAWR,GAAG,CAAC,CAACO;oCACf,MAAMsC,aAAalC,oBAAoBJ,UAAUF,YAAY;oCAC7D,MAAMyC,WAAWvC,UAAUuC,QAAQ,KAAK;oCACxC,qBACE,KAACxB;wCAECC,OAAO;4CACLiB,SAAS;4CACTC,iBAAiB;4CACjBM,QAAQ,CAAC,UAAU,EACjBF,aAAa,6BAA6B,8BAC1C;4CACFF,cAAc;4CACdK,YAAY;wCACd;kDAEA,cAAA,MAACvC;4CACCc,OAAO;gDACLG,SAAS;gDACTO,YAAY;gDACZL,KAAK;gDACLqB,QAAQ;4CACV;;8DAEA,KAACC;oDACC9B,MAAK;oDACL+B,SAASN;oDACTO,UAAU,IAAMtC,sBAAsBP;oDACtCgB,OAAO;wDAAEC,WAAW;wDAAOyB,QAAQ;oDAAU;;8DAE/C,MAAC3B;oDAAIC,OAAO;wDAAE8B,MAAM;oDAAE;;sEACpB,MAAC/B;4DACCC,OAAO;gEACLc,YAAY;gEACZO,UAAU;gEACVF,OAAO;gEACPjB,cAAc;gEACdC,SAAS;gEACTO,YAAY;gEACZL,KAAK;4DACP;;gEAECkB,0BAAY,KAACV;oEAAKb,OAAO;wEAAEqB,UAAU;oEAAO;8EAAG;;gEAC/CtD,SAASiB,UAAUE,KAAK;;;sEAE3B,KAACa;4DACCC,OAAO;gEACLqB,UAAU;gEACVF,OAAO;gEACPY,YAAY;gEACZ7B,cAAc;4DAChB;sEAECnC,SAASiB,UAAUgD,WAAW;;sEAEjC,MAACjC;4DACCC,OAAO;gEACLiB,SAAS;gEACTC,iBAAiBK,WACb,6BACA;gEACJH,cAAc;gEACdC,UAAU;gEACVY,YAAY;gEACZd,OAAOI,WACH,6BACA;gEACJpB,SAAS;4DACX;;gEAECoB,YAAY;gEACZvC,UAAUF,YAAY;;;;;;;uCAlExBE,UAAUF,YAAY;gCAwEjC;;2BAvHGC,WAAWiC,cAAc;oBA2HpC;oBAGC1C,aAAaG,GAAG,CAAC,CAACU;wBACjB,MAAMF,aAAad,OAAOC,MAAM,CAACe,OAAOF,UAAU;wBAClD,MAAMqB,gBAAgBrB,WAAWsB,MAAM,CAAC,CAACC,IAAMpB,oBAAoBoB,EAAE1B,YAAY,GAAGgB,MAAM;wBAE1F,qBACE,KAACrD;4BAECgE,sBACE,MAACV;gCACCC,OAAO;oCACLG,SAAS;oCACTO,YAAY;oCACZC,gBAAgB;oCAChBC,OAAO;gCACT;;kDAEA,MAACb;wCAAIC,OAAO;4CAAEG,SAAS;4CAAQO,YAAY;4CAAUL,KAAK;wCAAM;;0DAC9D,KAACQ;0DAAK;;0DACN,KAACA;gDAAKb,OAAO;oDAAEc,YAAY;gDAAI;0DAC5B/C,SAASoB,OAAO+C,WAAW,KAAK/C,OAAOgD,UAAU;;;;oCAGrD7B,gBAAgB,mBACf,KAACO;wCACCb,OAAO;4CACLiB,SAAS;4CACTC,iBAAiB;4CACjBC,OAAO;4CACPC,cAAc;4CACdC,UAAU;4CACVP,YAAY;wCACd;kDAECR;;;;sCAMT,cAAA,KAACP;gCACCC,OAAO;oCACLiB,SAAS;oCACTC,iBAAiB;oCACjBf,SAAS;oCACTC,eAAe;oCACfC,KAAK;gCACP;0CAECpB,WAAWR,GAAG,CAAC,CAACO;oCACf,MAAMsC,aAAalC,oBAAoBJ,UAAUF,YAAY;oCAC7D,MAAMyC,WAAWvC,UAAUuC,QAAQ,KAAK;oCACxC,qBACE,KAACxB;wCAECC,OAAO;4CACLiB,SAAS;4CACTC,iBAAiB;4CACjBM,QAAQ,CAAC,UAAU,EACjBF,aAAa,6BAA6B,8BAC1C;4CACFF,cAAc;4CACdK,YAAY;wCACd;kDAEA,cAAA,MAACvC;4CACCc,OAAO;gDACLG,SAAS;gDACTO,YAAY;gDACZL,KAAK;gDACLqB,QAAQ;4CACV;;8DAEA,KAACC;oDACC9B,MAAK;oDACL+B,SAASN;oDACTO,UAAU,IAAMtC,sBAAsBP;oDACtCgB,OAAO;wDAAEC,WAAW;wDAAOyB,QAAQ;oDAAU;;8DAE/C,MAAC3B;oDAAIC,OAAO;wDAAE8B,MAAM;oDAAE;;sEACpB,MAAC/B;4DACCC,OAAO;gEACLc,YAAY;gEACZO,UAAU;gEACVF,OAAO;gEACPjB,cAAc;gEACdC,SAAS;gEACTO,YAAY;gEACZL,KAAK;4DACP;;gEAECkB,0BAAY,KAACV;oEAAKb,OAAO;wEAAEqB,UAAU;oEAAO;8EAAG;;gEAC/CtD,SAASiB,UAAUE,KAAK;;;sEAE3B,KAACa;4DACCC,OAAO;gEACLqB,UAAU;gEACVF,OAAO;gEACPY,YAAY;gEACZ7B,cAAc;4DAChB;sEAECnC,SAASiB,UAAUgD,WAAW;;sEAEjC,MAACjC;4DACCC,OAAO;gEACLiB,SAAS;gEACTC,iBAAiBK,WACb,6BACA;gEACJH,cAAc;gEACdC,UAAU;gEACVY,YAAY;gEACZd,OAAOI,WACH,6BACA;gEACJpB,SAAS;4DACX;;gEAECoB,YAAY;gEACZvC,UAAUF,YAAY;;;;;;;uCAlExBE,UAAUF,YAAY;gCAwEjC;;2BAvHGK,OAAOgD,UAAU;oBA2H5B;;;YAID5D,mBAAmBuB,MAAM,GAAG,mBAC3B,MAACC;gBACCC,OAAO;oBACLC,WAAW;oBACXgB,SAAS;oBACTC,iBAAiB;oBACjBE,cAAc;gBAChB;;kCAEA,MAACgB;wBACCpC,OAAO;4BACLqC,QAAQ;4BACRhB,UAAU;4BACVP,YAAY;4BACZK,OAAO;wBACT;;4BAEEvD,KAAK0E,CAAC,CACN;4BACC;4BAAI;4BACL/D,mBAAmBuB,MAAM;4BAAC;;;kCAE9B,KAACC;wBAAIC,OAAO;4BAAEG,SAAS;4BAAQoC,UAAU;4BAAQlC,KAAK;wBAAM;kCACzD9B,mBAAmBE,GAAG,CAAC,CAACK,cAAcH,sBACrC,MAACoB;gCAECC,OAAO;oCACLG,SAAS;oCACTO,YAAY;oCACZL,KAAK;oCACLY,SAAS;oCACTC,iBAAiB;oCACjBM,QAAQ;oCACRJ,cAAc;oCACdC,UAAU;oCACVF,OAAO;gCACT;;kDAEA,KAACN;kDAAMhC,kBAAkBC;;kDACzB,KAAC0D;wCACC3C,MAAK;wCACL4C,SAAS;4CACPjF,eAAe;gDAAEN;gDAAMwC,UAAUf;4CAAM;4CACvClB,YAAY;wCACd;wCACAuC,OAAO;4CACL0C,YAAY;4CACZlB,QAAQ;4CACRL,OAAO;4CACPO,QAAQ;4CACRT,SAAS;4CACTd,SAAS;4CACTO,YAAY;4CACZW,UAAU;4CACVU,YAAY;wCACd;kDACD;;;+BA/BI,GAAGjD,aAAa,CAAC,EAAEH,OAAO;;;;;;AAyC/C;AAEA,6BAAe7B,KAAKE,kBAAiB"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/PrivilegesSelect.tsx"],"sourcesContent":["'use client'\nimport type { ArrayFieldClientComponent } from 'payload'\n\nimport { Collapsible, useField, useForm, useFormFields, useTranslation } from '@payloadcms/ui'\nimport { memo, useCallback } from 'react'\n\nimport type { GlobalPrivilege } from '../utils/generateGlobalPrivileges.js'\nimport type { Privilege } from '../utils/generatePrivileges.js'\n\ntype CollectionPrivileges = {\n collectionLabel: Record<string, string>\n collectionSlug: string\n privileges: Record<string, Privilege>\n}\n\ntype GlobalPrivileges = {\n globalLabel: Record<string, string>\n globalSlug: string\n privileges: Record<string, GlobalPrivilege>\n}\n\n/**\n * Custom array field component for managing privileges in Payload CMS\n * @component\n * @param {Object} props - Component props from Payload CMS\n * @param {string} props.path - Path to the field in the form\n * @param {CollectionPrivileges[]} props.collections - Collections with their privileges\n * @param {GlobalPrivileges[]} props.globals - Globals with their privileges\n */\nconst PrivilegesSelect: ArrayFieldClientComponent = (props) => {\n const {\n collections = [],\n globals = [],\n path,\n } = props as {\n collections?: CollectionPrivileges[]\n globals?: GlobalPrivileges[]\n path: string\n }\n const { rows } = useField({ hasRows: true, path })\n const { addFieldRow, removeFieldRow, setModified } = useForm()\n const { dispatch } = useFormFields(([_, dispatch]) => ({ dispatch }))\n const { i18n } = useTranslation()\n const locale = i18n?.language || 'en'\n\n // Helper to get label in current locale with fallback\n const getLabel = useCallback(\n (labels: Record<string, string>): string => {\n return labels[locale] || labels._default || labels.en || Object.values(labels)[0] || ''\n },\n [locale],\n )\n\n // Use the collections and globals from props\n const collectionsArray = collections\n const globalsArray = globals\n\n /**\n * Get existing privilege values from form fields\n */\n const existingPrivileges = useFormFields(\n ([fields]) =>\n rows?.map((row, index) => {\n const value = fields[`${path}.${index}.privilege`]?.value\n return typeof value === 'string' ? value : ''\n }) || [],\n )\n\n /**\n * Get privilege label from privilegeKey\n */\n const getPrivilegeLabel = useCallback(\n (privilegeKey: string) => {\n // Check collections\n for (const collection of collectionsArray) {\n for (const privilege of Object.values(collection.privileges)) {\n if (privilege.privilegeKey === privilegeKey) {\n return getLabel(privilege.label)\n }\n }\n }\n // Check globals\n for (const global of globalsArray) {\n for (const privilege of Object.values(global.privileges)) {\n if (privilege.privilegeKey === privilegeKey) {\n return getLabel(privilege.label)\n }\n }\n }\n return privilegeKey\n },\n [collectionsArray, globalsArray, getLabel],\n )\n\n /**\n * Check if a privilege is already selected\n */\n const isPrivilegeSelected = useCallback(\n (privilegeName: string) => {\n return existingPrivileges.includes(privilegeName)\n },\n [existingPrivileges],\n )\n\n /**\n * Handles privilege selection/deselection\n */\n const handlePrivilegeToggle = useCallback(\n (privilege: GlobalPrivilege | Privilege) => {\n const privilegeKey = privilege.privilegeKey\n const existingIndex = existingPrivileges.indexOf(privilegeKey)\n\n if (existingIndex >= 0) {\n // Remove privilege\n removeFieldRow({ path, rowIndex: existingIndex })\n setModified(true)\n } else {\n // Add privilege\n addFieldRow({\n path,\n schemaPath: `${path}.0.privilege`,\n })\n\n setTimeout(() => {\n dispatch({\n type: 'UPDATE',\n path: `${path}.${rows?.length || 0}.privilege`,\n value: privilegeKey,\n })\n setModified(true)\n }, 0)\n }\n },\n [addFieldRow, dispatch, existingPrivileges, path, removeFieldRow, rows?.length, setModified],\n )\n\n return (\n <div style={{ marginBottom: '16px', marginTop: '16px' }}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {/* Collections */}\n {collectionsArray.map((collection: CollectionPrivileges) => {\n const privileges = Object.values(collection.privileges)\n const selectedCount = privileges.filter((p) => isPrivilegeSelected(p.privilegeKey)).length\n\n return (\n <Collapsible\n header={\n <div\n style={{\n alignItems: 'center',\n display: 'flex',\n justifyContent: 'space-between',\n width: '100%',\n }}\n >\n <div style={{ alignItems: 'center', display: 'flex', gap: '8px' }}>\n <span aria-label=\"Collection\" role=\"img\">\n 📦\n </span>\n <span style={{ fontWeight: 500 }}>\n {getLabel(collection.collectionLabel) || collection.collectionSlug}\n </span>\n </div>\n {selectedCount > 0 && (\n <span\n style={{\n backgroundColor: 'var(--theme-success-100)',\n borderRadius: '12px',\n color: 'var(--theme-success-800)',\n fontSize: '12px',\n fontWeight: 600,\n padding: '2px 8px',\n }}\n >\n {selectedCount}\n </span>\n )}\n </div>\n }\n key={collection.collectionSlug}\n >\n <div\n style={{\n backgroundColor: 'var(--theme-elevation-50)',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n padding: '16px',\n }}\n >\n {privileges.map((privilege) => {\n const isSelected = isPrivilegeSelected(privilege.privilegeKey)\n const isCustom = privilege.isCustom === true\n return (\n <div\n key={privilege.privilegeKey}\n style={{\n backgroundColor: 'var(--theme-elevation-0)',\n border: `1px solid ${\n isSelected ? 'var(--theme-success-300)' : 'var(--theme-elevation-300)'\n }`,\n borderRadius: '4px',\n padding: '12px',\n transition: 'all 0.2s',\n }}\n >\n <label\n aria-label={`Select privilege: ${getLabel(privilege.label)}`}\n htmlFor={`global-privilege-${privilege.privilegeKey}`}\n style={{\n alignItems: 'flex-start',\n cursor: 'pointer',\n display: 'flex',\n gap: '12px',\n }}\n >\n <input\n aria-label={`Select privilege: ${getLabel(privilege.label)}`}\n checked={isSelected}\n id={`global-privilege-${privilege.privilegeKey}`}\n onChange={() => handlePrivilegeToggle(privilege)}\n style={{ cursor: 'pointer', marginTop: '2px' }}\n type=\"checkbox\"\n />\n <div style={{ flex: 1 }}>\n <div\n style={{\n alignItems: 'center',\n color: 'var(--theme-elevation-1000)',\n display: 'flex',\n fontSize: '14px',\n fontWeight: 600,\n gap: '6px',\n marginBottom: '4px',\n }}\n >\n {isCustom && (\n <span\n aria-label=\"Custom privilege\"\n role=\"img\"\n style={{ fontSize: '16px' }}\n >\n ⭐\n </span>\n )}\n {getLabel(privilege.label)}\n </div>\n <div\n style={{\n color: 'var(--theme-elevation-700)',\n fontSize: '13px',\n lineHeight: '1.4',\n marginBottom: '8px',\n }}\n >\n {getLabel(privilege.description)}\n </div>\n <div\n style={{\n backgroundColor: isCustom\n ? 'var(--theme-warning-100)'\n : 'var(--theme-elevation-100)',\n borderRadius: '4px',\n color: isCustom\n ? 'var(--theme-warning-900)'\n : 'var(--theme-elevation-800)',\n display: 'inline-block',\n fontFamily: 'monospace',\n fontSize: '11px',\n padding: '4px 8px',\n }}\n >\n {isCustom && '⭐ '}\n {privilege.privilegeKey}\n </div>\n </div>\n </label>\n </div>\n )\n })}\n </div>\n </Collapsible>\n )\n })}\n\n {/* Globals */}\n {globalsArray.map((global: GlobalPrivileges) => {\n const privileges = Object.values(global.privileges)\n const selectedCount = privileges.filter((p) => isPrivilegeSelected(p.privilegeKey)).length\n\n return (\n <Collapsible\n header={\n <div\n style={{\n alignItems: 'center',\n display: 'flex',\n justifyContent: 'space-between',\n width: '100%',\n }}\n >\n <div style={{ alignItems: 'center', display: 'flex', gap: '8px' }}>\n <span aria-label=\"Global\" role=\"img\">\n 🌐\n </span>\n <span style={{ fontWeight: 500 }}>\n {getLabel(global.globalLabel) || global.globalSlug}\n </span>\n </div>\n {selectedCount > 0 && (\n <span\n style={{\n backgroundColor: 'var(--theme-success-100)',\n borderRadius: '12px',\n color: 'var(--theme-success-800)',\n fontSize: '12px',\n fontWeight: 600,\n padding: '2px 8px',\n }}\n >\n {selectedCount}\n </span>\n )}\n </div>\n }\n key={global.globalSlug}\n >\n <div\n style={{\n backgroundColor: 'var(--theme-elevation-50)',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n padding: '16px',\n }}\n >\n {privileges.map((privilege) => {\n const isSelected = isPrivilegeSelected(privilege.privilegeKey)\n const isCustom = privilege.isCustom === true\n return (\n <div\n key={privilege.privilegeKey}\n style={{\n backgroundColor: 'var(--theme-elevation-0)',\n border: `1px solid ${\n isSelected ? 'var(--theme-success-300)' : 'var(--theme-elevation-300)'\n }`,\n borderRadius: '4px',\n padding: '12px',\n transition: 'all 0.2s',\n }}\n >\n <label\n aria-label={`Select privilege: ${getLabel(privilege.label)}`}\n htmlFor={`global-privilege-${privilege.privilegeKey}`}\n style={{\n alignItems: 'flex-start',\n cursor: 'pointer',\n display: 'flex',\n gap: '12px',\n }}\n >\n <input\n aria-label={`Select privilege: ${getLabel(privilege.label)}`}\n checked={isSelected}\n id={`global-privilege-${privilege.privilegeKey}`}\n onChange={() => handlePrivilegeToggle(privilege)}\n style={{ cursor: 'pointer', marginTop: '2px' }}\n type=\"checkbox\"\n />\n <div style={{ flex: 1 }}>\n <div\n style={{\n alignItems: 'center',\n color: 'var(--theme-elevation-1000)',\n display: 'flex',\n fontSize: '14px',\n fontWeight: 600,\n gap: '6px',\n marginBottom: '4px',\n }}\n >\n {isCustom && (\n <span\n aria-label=\"Custom privilege\"\n role=\"img\"\n style={{ fontSize: '16px' }}\n >\n ⭐\n </span>\n )}\n {getLabel(privilege.label)}\n </div>\n <div\n style={{\n color: 'var(--theme-elevation-700)',\n fontSize: '13px',\n lineHeight: '1.4',\n marginBottom: '8px',\n }}\n >\n {getLabel(privilege.description)}\n </div>\n <div\n style={{\n backgroundColor: isCustom\n ? 'var(--theme-warning-100)'\n : 'var(--theme-elevation-100)',\n borderRadius: '4px',\n color: isCustom\n ? 'var(--theme-warning-900)'\n : 'var(--theme-elevation-800)',\n display: 'inline-block',\n fontFamily: 'monospace',\n fontSize: '11px',\n padding: '4px 8px',\n }}\n >\n {isCustom && '⭐ '}\n {privilege.privilegeKey}\n </div>\n </div>\n </label>\n </div>\n )\n })}\n </div>\n </Collapsible>\n )\n })}\n </div>\n\n {/* Selected Privileges Summary */}\n {existingPrivileges.length > 0 && (\n <div\n style={{\n backgroundColor: 'var(--theme-elevation-100)',\n borderRadius: '4px',\n marginTop: '16px',\n padding: '16px',\n }}\n >\n <h5\n style={{\n color: 'var(--theme-elevation-1000)',\n fontSize: '14px',\n fontWeight: 600,\n margin: '0 0 12px 0',\n }}\n >\n {(i18n.t as (key: string) => string)(\n 'plugin-roles-privileges:privileges-selected-count',\n )}{' '}\n ({existingPrivileges.length})\n </h5>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '8px' }}>\n {existingPrivileges.map((privilegeKey, index) => (\n <div\n key={`${privilegeKey}-${index}`}\n style={{\n alignItems: 'center',\n backgroundColor: 'var(--theme-success-100)',\n border: '1px solid var(--theme-success-300)',\n borderRadius: '16px',\n color: 'var(--theme-success-800)',\n display: 'inline-flex',\n fontSize: '12px',\n gap: '8px',\n padding: '6px 12px',\n }}\n >\n <span>{getPrivilegeLabel(privilegeKey)}</span>\n <button\n onClick={() => {\n removeFieldRow({ path, rowIndex: index })\n setModified(true)\n }}\n style={{\n alignItems: 'center',\n background: 'none',\n border: 'none',\n color: 'var(--theme-success-600)',\n cursor: 'pointer',\n display: 'flex',\n fontSize: '16px',\n lineHeight: 1,\n padding: 0,\n }}\n type=\"button\"\n >\n ×\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport default memo(PrivilegesSelect)\nexport type { CollectionPrivileges, GlobalPrivileges }\n"],"names":["Collapsible","useField","useForm","useFormFields","useTranslation","memo","useCallback","PrivilegesSelect","props","collections","globals","path","rows","hasRows","addFieldRow","removeFieldRow","setModified","dispatch","_","i18n","locale","language","getLabel","labels","_default","en","Object","values","collectionsArray","globalsArray","existingPrivileges","fields","map","row","index","value","getPrivilegeLabel","privilegeKey","collection","privilege","privileges","label","global","isPrivilegeSelected","privilegeName","includes","handlePrivilegeToggle","existingIndex","indexOf","rowIndex","schemaPath","setTimeout","type","length","div","style","marginBottom","marginTop","display","flexDirection","gap","selectedCount","filter","p","header","alignItems","justifyContent","width","span","aria-label","role","fontWeight","collectionLabel","collectionSlug","backgroundColor","borderRadius","color","fontSize","padding","isSelected","isCustom","border","transition","htmlFor","cursor","input","checked","id","onChange","flex","lineHeight","description","fontFamily","globalLabel","globalSlug","h5","margin","t","flexWrap","button","onClick","background"],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
export { checkAllPrivileges, checkAnyPrivilege, checkPrivilege, checkPrivileges, hasAllPrivileges, hasAnyPrivilege, hasPrivilege, privilegesAccess, } from '../utils/privilegesAccess.js';
|
|
2
|
-
export { allPrivilegesMap, generateCollectionPrivileges, generatePrivilegeKey, getAllPrivilegeKeys, getAllPrivileges, } from '../utils/generatePrivileges.js';
|
|
3
|
-
export { allGlobalPrivilegesMap, generateGlobalPrivilegeKey, generateGlobalPrivileges, getAllGlobalPrivilegeKeys, getAllGlobalPrivileges, } from '../utils/generateGlobalPrivileges.js';
|
|
4
|
-
export { customPrivilegesRegistry, registerCustomPrivilege, registerCustomPrivileges, type CustomGlobalPrivilege, type CustomPrivilegeConfig, } from '../utils/createCustomPrivilege.js';
|
|
5
1
|
export { createRolesCollection, ensureSuperAdminDontGetDeleted, ensureSuperAdminDontGetUpdated, } from '../collections/roles.js';
|
|
2
|
+
export { createAssignSuperAdminToFirstUserHook, wrapUserCollectionWithSuperAdminHook, } from '../utils/assignSuperAdminToFirstUser.js';
|
|
3
|
+
export { customPrivilegesRegistry, registerCustomPrivilege, registerCustomPrivileges, type CustomGlobalPrivilege, type CustomPrivilegeConfig, } from '../utils/createCustomPrivilege.js';
|
|
4
|
+
export { allGlobalPrivilegesMap, generateGlobalPrivilegeKey, generateGlobalPrivileges, getAllGlobalPrivilegeKeys, getAllGlobalPrivileges, } from '../utils/generateGlobalPrivileges.js';
|
|
5
|
+
export { allPrivilegesMap, generateCollectionPrivileges, generatePrivilegeKey, getAllPrivilegeKeys, getAllPrivileges, } from '../utils/generatePrivileges.js';
|
|
6
|
+
export { checkAllPrivileges, checkAnyPrivilege, checkPrivilege, checkPrivileges, hasAllPrivileges, hasAnyPrivilege, hasPrivilege, privilegesAccess, } from '../utils/privilegesAccess.js';
|
|
6
7
|
export { seedSuperAdminRole } from '../utils/seedSuperAdminRole.js';
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
// Re-export utility functions for access control
|
|
2
|
-
export { checkAllPrivileges, checkAnyPrivilege, checkPrivilege, checkPrivileges, hasAllPrivileges, hasAnyPrivilege, hasPrivilege, privilegesAccess } from '../utils/privilegesAccess.js';
|
|
3
|
-
// Re-export collection privilege utilities
|
|
4
|
-
export { allPrivilegesMap, generateCollectionPrivileges, generatePrivilegeKey, getAllPrivilegeKeys, getAllPrivileges } from '../utils/generatePrivileges.js';
|
|
5
|
-
// Re-export global privilege utilities
|
|
6
|
-
export { allGlobalPrivilegesMap, generateGlobalPrivilegeKey, generateGlobalPrivileges, getAllGlobalPrivilegeKeys, getAllGlobalPrivileges } from '../utils/generateGlobalPrivileges.js';
|
|
7
|
-
// Re-export custom privilege registration utilities
|
|
8
|
-
export { customPrivilegesRegistry, registerCustomPrivilege, registerCustomPrivileges } from '../utils/createCustomPrivilege.js';
|
|
9
1
|
// Re-export roles collection creation helper
|
|
10
2
|
export { createRolesCollection, ensureSuperAdminDontGetDeleted, ensureSuperAdminDontGetUpdated } from '../collections/roles.js';
|
|
3
|
+
// Re-export first user super admin assignment utilities
|
|
4
|
+
export { createAssignSuperAdminToFirstUserHook, wrapUserCollectionWithSuperAdminHook } from '../utils/assignSuperAdminToFirstUser.js';
|
|
5
|
+
// Re-export custom privilege registration utilities
|
|
6
|
+
export { customPrivilegesRegistry, registerCustomPrivilege, registerCustomPrivileges } from '../utils/createCustomPrivilege.js';
|
|
7
|
+
// Re-export global privilege utilities
|
|
8
|
+
export { allGlobalPrivilegesMap, generateGlobalPrivilegeKey, generateGlobalPrivileges, getAllGlobalPrivilegeKeys, getAllGlobalPrivileges } from '../utils/generateGlobalPrivileges.js';
|
|
9
|
+
// Re-export collection privilege utilities
|
|
10
|
+
export { allPrivilegesMap, generateCollectionPrivileges, generatePrivilegeKey, getAllPrivilegeKeys, getAllPrivileges } from '../utils/generatePrivileges.js';
|
|
11
|
+
// Re-export utility functions for access control
|
|
12
|
+
export { checkAllPrivileges, checkAnyPrivilege, checkPrivilege, checkPrivileges, hasAllPrivileges, hasAnyPrivilege, hasPrivilege, privilegesAccess } from '../utils/privilegesAccess.js';
|
|
11
13
|
// Re-export seed super admin utility
|
|
12
14
|
export { seedSuperAdminRole } from '../utils/seedSuperAdminRole.js';
|
|
13
15
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/exports/utilities.ts"],"sourcesContent":["// Re-export
|
|
1
|
+
{"version":3,"sources":["../../src/exports/utilities.ts"],"sourcesContent":["// Re-export roles collection creation helper\nexport {\n createRolesCollection,\n ensureSuperAdminDontGetDeleted,\n ensureSuperAdminDontGetUpdated,\n} from '../collections/roles.js'\n\n// Re-export first user super admin assignment utilities\nexport {\n createAssignSuperAdminToFirstUserHook,\n wrapUserCollectionWithSuperAdminHook,\n} from '../utils/assignSuperAdminToFirstUser.js'\n\n// Re-export custom privilege registration utilities\nexport {\n customPrivilegesRegistry,\n registerCustomPrivilege,\n registerCustomPrivileges,\n type CustomGlobalPrivilege,\n type CustomPrivilegeConfig,\n} from '../utils/createCustomPrivilege.js'\n\n// Re-export global privilege utilities\nexport {\n allGlobalPrivilegesMap,\n generateGlobalPrivilegeKey,\n generateGlobalPrivileges,\n getAllGlobalPrivilegeKeys,\n getAllGlobalPrivileges,\n} from '../utils/generateGlobalPrivileges.js'\n\n// Re-export collection privilege utilities\nexport {\n allPrivilegesMap,\n generateCollectionPrivileges,\n generatePrivilegeKey,\n getAllPrivilegeKeys,\n getAllPrivileges,\n} from '../utils/generatePrivileges.js'\n\n// Re-export utility functions for access control\nexport {\n checkAllPrivileges,\n checkAnyPrivilege,\n checkPrivilege,\n checkPrivileges,\n hasAllPrivileges,\n hasAnyPrivilege,\n hasPrivilege,\n privilegesAccess,\n} from '../utils/privilegesAccess.js'\n\n// Re-export seed super admin utility\nexport { seedSuperAdminRole } from '../utils/seedSuperAdminRole.js'\n"],"names":["createRolesCollection","ensureSuperAdminDontGetDeleted","ensureSuperAdminDontGetUpdated","createAssignSuperAdminToFirstUserHook","wrapUserCollectionWithSuperAdminHook","customPrivilegesRegistry","registerCustomPrivilege","registerCustomPrivileges","allGlobalPrivilegesMap","generateGlobalPrivilegeKey","generateGlobalPrivileges","getAllGlobalPrivilegeKeys","getAllGlobalPrivileges","allPrivilegesMap","generateCollectionPrivileges","generatePrivilegeKey","getAllPrivilegeKeys","getAllPrivileges","checkAllPrivileges","checkAnyPrivilege","checkPrivilege","checkPrivileges","hasAllPrivileges","hasAnyPrivilege","hasPrivilege","privilegesAccess","seedSuperAdminRole"],"mappings":"AAAA,6CAA6C;AAC7C,SACEA,qBAAqB,EACrBC,8BAA8B,EAC9BC,8BAA8B,QACzB,0BAAyB;AAEhC,wDAAwD;AACxD,SACEC,qCAAqC,EACrCC,oCAAoC,QAC/B,0CAAyC;AAEhD,oDAAoD;AACpD,SACEC,wBAAwB,EACxBC,uBAAuB,EACvBC,wBAAwB,QAGnB,oCAAmC;AAE1C,uCAAuC;AACvC,SACEC,sBAAsB,EACtBC,0BAA0B,EAC1BC,wBAAwB,EACxBC,yBAAyB,EACzBC,sBAAsB,QACjB,uCAAsC;AAE7C,2CAA2C;AAC3C,SACEC,gBAAgB,EAChBC,4BAA4B,EAC5BC,oBAAoB,EACpBC,mBAAmB,EACnBC,gBAAgB,QACX,iCAAgC;AAEvC,iDAAiD;AACjD,SACEC,kBAAkB,EAClBC,iBAAiB,EACjBC,cAAc,EACdC,eAAe,EACfC,gBAAgB,EAChBC,eAAe,EACfC,YAAY,EACZC,gBAAgB,QACX,+BAA8B;AAErC,qCAAqC;AACrC,SAASC,kBAAkB,QAAQ,iCAAgC"}
|