@zealamic/payload-auth-rbac-plugin 1.0.0 → 1.0.2

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 CHANGED
@@ -61,7 +61,22 @@ export default buildConfig({
61
61
  });
62
62
  ```
63
63
 
64
- ### 2. Seed RBAC data (Admin or script)
64
+ ### 2. Migration
65
+
66
+ After adding the plugin to `payload.config.ts`, run a Payload migration if your database schema is not up to date:
67
+
68
+ ```bash
69
+ npm run payload migrate:create
70
+ # or: yarn payload migrate:create
71
+ # or: pnpm payload migrate:create
72
+ ```
73
+
74
+ Then apply the migration with `migrate` (or your project's usual migration workflow).
75
+
76
+ > **Bootstrap a super admin:** RBAC collections are restricted to super admins by default. Set `isSuperAdmin: true` on at least one user (via seed script, Local API, or direct database update) before you can manage roles, permissions, and the permission matrix in Admin.
77
+ > → See [COLLECTIONS — Bootstrap super admin](https://github.com/zealamic/payload-auth-rbac-plugin/blob/main/docs/COLLECTIONS.md#bootstrap-super-admin)
78
+
79
+ ### 3. Seed RBAC data (Admin or script)
65
80
 
66
81
  1. **permission-features** — e.g. `posts`, `users` (`code` = `featureCode` in access helpers)
67
82
  2. **permission-actions** — e.g. `create`, `read`, `update`, `delete`
@@ -71,7 +86,7 @@ export default buildConfig({
71
86
 
72
87
  → Full collection reference: **[COLLECTIONS](https://github.com/zealamic/payload-auth-rbac-plugin/blob/main/docs/COLLECTIONS.md)**
73
88
 
74
- ### 3. Protect app collections
89
+ ### 4. Protect app collections
75
90
 
76
91
  ```ts
77
92
  import { getPermissionAccess } from "@zealamic/payload-auth-rbac-plugin";
@@ -1,6 +1,6 @@
1
1
  import { getArrayOfMergedFieldAffectingData, getPermissionAccess, toLocaleRecord } from "../../lib/utils/index.js";
2
2
  import { mergeUserCollectionHooks } from "./parent-path.js";
3
- const buildDefaultFields = (translations)=>{
3
+ const buildDefaultFields = (translations, userSlug)=>{
4
4
  const locales = Object.keys(translations);
5
5
  return [
6
6
  {
@@ -22,7 +22,8 @@ const buildDefaultFields = (translations)=>{
22
22
  {
23
23
  name: "parent",
24
24
  type: "relationship",
25
- relationTo: "users",
25
+ relationTo: userSlug,
26
+ hasMany: false,
26
27
  label: toLocaleRecord(locales, (locale)=>translations[locale]?.fields?.parent?.label),
27
28
  filterOptions: ({ id })=>id ? {
28
29
  id: {
@@ -55,11 +56,10 @@ export const modifyUsersCollection = (params = {})=>{
55
56
  "isSuperAdmin",
56
57
  "updatedAt"
57
58
  ],
58
- useAsTitle: "email",
59
- ...config.admin
59
+ useAsTitle: "email"
60
60
  };
61
61
  const pluginFields = getArrayOfMergedFieldAffectingData({
62
- defaultFields: buildDefaultFields(translations),
62
+ defaultFields: buildDefaultFields(translations, userSlug),
63
63
  fields: customFields
64
64
  });
65
65
  const existing = (config.collections || []).find((c)=>c.slug === userSlug);
@@ -100,11 +100,14 @@ export const modifyUsersCollection = (params = {})=>{
100
100
  return {
101
101
  ...collection,
102
102
  fields: [
103
- ...collection.fields,
104
- ...pluginFields
103
+ ...pluginFields,
104
+ ...collection.fields
105
105
  ],
106
106
  access: {
107
- ...defaultAccess,
107
+ create: collection.access?.create ?? defaultAccess.create,
108
+ read: collection.access?.read ?? defaultAccess.read,
109
+ update: collection.access?.update ?? defaultAccess.update,
110
+ delete: collection.access?.delete ?? defaultAccess.delete,
108
111
  ...collection.access
109
112
  },
110
113
  hooks: mergeUserCollectionHooks({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/collections/users/index.ts"],"sourcesContent":["import type { Config, Field, PayloadRequest } from \"payload\";\nimport {\n getArrayOfMergedFieldAffectingData,\n getPermissionAccess,\n toLocaleRecord,\n} from \"../../lib/utils/index.js\";\nimport { mergeUserCollectionHooks } from \"./parent-path.js\";\nimport type {\n UsersModificationParams,\n UsersModificationTranslations,\n} from \"./types.js\";\n\nconst buildDefaultFields = (\n translations: UsersModificationTranslations,\n): Field[] => {\n const locales = Object.keys(translations);\n return [\n {\n name: \"isSuperAdmin\",\n type: \"checkbox\",\n defaultValue: false,\n label: toLocaleRecord(\n locales,\n (locale) => translations[locale]?.fields?.isSuperAdmin?.label,\n ),\n admin: {\n readOnly: true,\n },\n },\n {\n name: \"roles\",\n type: \"relationship\",\n relationTo: \"roles\",\n hasMany: true,\n label: toLocaleRecord(\n locales,\n (locale) => translations[locale]?.fields?.roles?.label,\n ),\n },\n {\n name: \"parent\",\n type: \"relationship\",\n relationTo: \"users\",\n label: toLocaleRecord(\n locales,\n (locale) => translations[locale]?.fields?.parent?.label,\n ),\n filterOptions: ({ id }) => (id ? { id: { not_equals: id } } : true),\n },\n {\n name: \"parentPath\",\n type: \"text\",\n index: true,\n admin: {\n hidden: true,\n readOnly: true,\n },\n },\n ];\n};\n\nexport const modifyUsersCollection = (params: UsersModificationParams = {}) => {\n const { translations = {}, fields: customFields = [] } = params;\n\n return (incomingConfig: Config): Config => {\n const config = { ...incomingConfig };\n const userSlug = config.admin?.user || \"users\";\n\n const customAdmin = {\n defaultColumns: [\"email\", \"roles\", \"isSuperAdmin\", \"updatedAt\"],\n useAsTitle: \"email\",\n ...config.admin,\n };\n\n const pluginFields = getArrayOfMergedFieldAffectingData({\n defaultFields: buildDefaultFields(translations),\n fields: customFields,\n });\n\n const existing = (config.collections || []).find(\n (c) => c.slug === userSlug,\n );\n const dataScopeOptions = {\n createdByField: \"id\",\n usersCollectionSlug: userSlug,\n } as const;\n\n const defaultAccess = {\n create: getPermissionAccess({\n featureCode: userSlug,\n actionCode: \"create\",\n }),\n update: getPermissionAccess({\n featureCode: userSlug,\n actionCode: \"update\",\n mode: \"modify\",\n collectionSlug: userSlug,\n options: dataScopeOptions,\n }),\n delete: getPermissionAccess({\n featureCode: userSlug,\n actionCode: \"delete\",\n mode: \"modify\",\n collectionSlug: userSlug,\n options: dataScopeOptions,\n }),\n read: getPermissionAccess({\n featureCode: userSlug,\n actionCode: \"read\",\n options: dataScopeOptions,\n }),\n };\n\n if (existing) {\n config.collections = (config.collections || []).map((collection) => {\n if (collection.slug !== userSlug) {\n return collection;\n }\n return {\n ...collection,\n fields: [...collection.fields, ...pluginFields],\n access: {\n ...defaultAccess,\n ...collection.access,\n },\n hooks: mergeUserCollectionHooks({\n existingHooks: collection.hooks,\n userSlug,\n }),\n };\n });\n } else {\n config.collections = [\n ...(config.collections || []),\n {\n slug: userSlug,\n auth: true,\n admin: customAdmin,\n fields: pluginFields,\n access: defaultAccess,\n hooks: mergeUserCollectionHooks({ userSlug }),\n },\n ];\n }\n\n return config;\n };\n};\n"],"names":["getArrayOfMergedFieldAffectingData","getPermissionAccess","toLocaleRecord","mergeUserCollectionHooks","buildDefaultFields","translations","locales","Object","keys","name","type","defaultValue","label","locale","fields","isSuperAdmin","admin","readOnly","relationTo","hasMany","roles","parent","filterOptions","id","not_equals","index","hidden","modifyUsersCollection","params","customFields","incomingConfig","config","userSlug","user","customAdmin","defaultColumns","useAsTitle","pluginFields","defaultFields","existing","collections","find","c","slug","dataScopeOptions","createdByField","usersCollectionSlug","defaultAccess","create","featureCode","actionCode","update","mode","collectionSlug","options","delete","read","map","collection","access","hooks","existingHooks","auth"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/collections/users/index.ts"],"sourcesContent":["import type { Config, Field } from \"payload\";\nimport {\n getArrayOfMergedFieldAffectingData,\n getPermissionAccess,\n toLocaleRecord,\n} from \"../../lib/utils/index.js\";\nimport { mergeUserCollectionHooks } from \"./parent-path.js\";\nimport type {\n UsersModificationParams,\n UsersModificationTranslations,\n} from \"./types.js\";\n\nconst buildDefaultFields = (\n translations: UsersModificationTranslations,\n userSlug: string,\n): Field[] => {\n const locales = Object.keys(translations);\n return [\n {\n name: \"isSuperAdmin\",\n type: \"checkbox\",\n defaultValue: false,\n label: toLocaleRecord(\n locales,\n (locale) => translations[locale]?.fields?.isSuperAdmin?.label,\n ),\n admin: {\n readOnly: true,\n },\n },\n {\n name: \"roles\",\n type: \"relationship\",\n relationTo: \"roles\",\n hasMany: true,\n label: toLocaleRecord(\n locales,\n (locale) => translations[locale]?.fields?.roles?.label,\n ),\n },\n {\n name: \"parent\",\n type: \"relationship\",\n relationTo: userSlug,\n hasMany: false,\n label: toLocaleRecord(\n locales,\n (locale) => translations[locale]?.fields?.parent?.label,\n ),\n filterOptions: ({ id }) => (id ? { id: { not_equals: id } } : true),\n },\n {\n name: \"parentPath\",\n type: \"text\",\n index: true,\n admin: {\n hidden: true,\n readOnly: true,\n },\n },\n ];\n};\n\nexport const modifyUsersCollection = (params: UsersModificationParams = {}) => {\n const { translations = {}, fields: customFields = [] } = params;\n\n return (incomingConfig: Config): Config => {\n const config = { ...incomingConfig };\n const userSlug = config.admin?.user || \"users\";\n\n const customAdmin = {\n defaultColumns: [\"email\", \"roles\", \"isSuperAdmin\", \"updatedAt\"],\n useAsTitle: \"email\",\n };\n\n const pluginFields = getArrayOfMergedFieldAffectingData({\n defaultFields: buildDefaultFields(translations, userSlug),\n fields: customFields,\n });\n\n const existing = (config.collections || []).find(\n (c) => c.slug === userSlug,\n );\n\n const dataScopeOptions = {\n createdByField: \"id\",\n usersCollectionSlug: userSlug,\n } as const;\n\n const defaultAccess = {\n create: getPermissionAccess({\n featureCode: userSlug,\n actionCode: \"create\",\n }),\n update: getPermissionAccess({\n featureCode: userSlug,\n actionCode: \"update\",\n mode: \"modify\",\n collectionSlug: userSlug,\n options: dataScopeOptions,\n }),\n delete: getPermissionAccess({\n featureCode: userSlug,\n actionCode: \"delete\",\n mode: \"modify\",\n collectionSlug: userSlug,\n options: dataScopeOptions,\n }),\n read: getPermissionAccess({\n featureCode: userSlug,\n actionCode: \"read\",\n options: dataScopeOptions,\n }),\n };\n\n if (existing) {\n config.collections = (config.collections || []).map((collection) => {\n if (collection.slug !== userSlug) {\n return collection;\n }\n return {\n ...collection,\n fields: [...pluginFields, ...collection.fields],\n access: {\n create: collection.access?.create ?? defaultAccess.create,\n read: collection.access?.read ?? defaultAccess.read,\n update: collection.access?.update ?? defaultAccess.update,\n delete: collection.access?.delete ?? defaultAccess.delete,\n ...collection.access,\n },\n hooks: mergeUserCollectionHooks({\n existingHooks: collection.hooks,\n userSlug,\n }),\n };\n });\n } else {\n config.collections = [\n ...(config.collections || []),\n {\n slug: userSlug,\n auth: true,\n admin: customAdmin,\n fields: pluginFields,\n access: defaultAccess,\n hooks: mergeUserCollectionHooks({ userSlug }),\n },\n ];\n }\n\n return config;\n };\n};\n"],"names":["getArrayOfMergedFieldAffectingData","getPermissionAccess","toLocaleRecord","mergeUserCollectionHooks","buildDefaultFields","translations","userSlug","locales","Object","keys","name","type","defaultValue","label","locale","fields","isSuperAdmin","admin","readOnly","relationTo","hasMany","roles","parent","filterOptions","id","not_equals","index","hidden","modifyUsersCollection","params","customFields","incomingConfig","config","user","customAdmin","defaultColumns","useAsTitle","pluginFields","defaultFields","existing","collections","find","c","slug","dataScopeOptions","createdByField","usersCollectionSlug","defaultAccess","create","featureCode","actionCode","update","mode","collectionSlug","options","delete","read","map","collection","access","hooks","existingHooks","auth"],"mappings":"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"}
@@ -7,12 +7,12 @@ export const rolePermissionMatrixClientDefaultTranslations = {
7
7
  placeholder: "Loading permission matrix..."
8
8
  },
9
9
  title: "Permission Matrix",
10
+ featuresLabel: "Features",
10
11
  features: {
11
- label: "Features",
12
12
  users: "Users"
13
13
  },
14
+ actionsLabel: "Actions",
14
15
  actions: {
15
- label: "Actions",
16
16
  create: "Create",
17
17
  read: "Read",
18
18
  update: "Update",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/role-permission-matrix-client/default-data.ts"],"sourcesContent":["import type { RolePermissionMatrixClientTranslations } from \"./types.js\";\n\nexport const rolePermissionMatrixClientDefaultTranslations: RolePermissionMatrixClientTranslations =\n {\n en: {\n viewInUpdateScreenOnly: {\n label: \"View permission matrix in update screen only\",\n },\n loading: {\n placeholder: \"Loading permission matrix...\",\n },\n title: \"Permission Matrix\",\n features: {\n label: \"Features\",\n users: \"Users\",\n },\n actions: {\n label: \"Actions\",\n create: \"Create\",\n read: \"Read\",\n update: \"Update\",\n delete: \"Delete\",\n },\n },\n };\n"],"names":["rolePermissionMatrixClientDefaultTranslations","en","viewInUpdateScreenOnly","label","loading","placeholder","title","features","users","actions","create","read","update","delete"],"mappings":"AAEA,OAAO,MAAMA,gDACX;IACEC,IAAI;QACFC,wBAAwB;YACtBC,OAAO;QACT;QACAC,SAAS;YACPC,aAAa;QACf;QACAC,OAAO;QACPC,UAAU;YACRJ,OAAO;YACPK,OAAO;QACT;QACAC,SAAS;YACPN,OAAO;YACPO,QAAQ;YACRC,MAAM;YACNC,QAAQ;YACRC,QAAQ;QACV;IACF;AACF,EAAE"}
1
+ {"version":3,"sources":["../../../src/components/role-permission-matrix-client/default-data.ts"],"sourcesContent":["import type { RolePermissionMatrixClientTranslations } from \"./types.js\";\n\nexport const rolePermissionMatrixClientDefaultTranslations: RolePermissionMatrixClientTranslations =\n {\n en: {\n viewInUpdateScreenOnly: {\n label: \"View permission matrix in update screen only\",\n },\n loading: {\n placeholder: \"Loading permission matrix...\",\n },\n title: \"Permission Matrix\",\n featuresLabel: \"Features\",\n features: {\n users: \"Users\",\n },\n actionsLabel: \"Actions\",\n actions: {\n create: \"Create\",\n read: \"Read\",\n update: \"Update\",\n delete: \"Delete\",\n },\n },\n };\n"],"names":["rolePermissionMatrixClientDefaultTranslations","en","viewInUpdateScreenOnly","label","loading","placeholder","title","featuresLabel","features","users","actionsLabel","actions","create","read","update","delete"],"mappings":"AAEA,OAAO,MAAMA,gDACX;IACEC,IAAI;QACFC,wBAAwB;YACtBC,OAAO;QACT;QACAC,SAAS;YACPC,aAAa;QACf;QACAC,OAAO;QACPC,eAAe;QACfC,UAAU;YACRC,OAAO;QACT;QACAC,cAAc;QACdC,SAAS;YACPC,QAAQ;YACRC,MAAM;YACNC,QAAQ;YACRC,QAAQ;QACV;IACF;AACF,EAAE"}
@@ -131,12 +131,12 @@ export const RolePermissionMatrixClient = ()=>{
131
131
  children: [
132
132
  /*#__PURE__*/ _jsx("th", {
133
133
  className: styles[`${RBAC_PREFIX}-table-th-feature`],
134
- children: t(`components:rolePermissionMatrix:features:label`)
134
+ children: t(`components:rolePermissionMatrix:featuresLabel`)
135
135
  }),
136
136
  /*#__PURE__*/ _jsx("th", {
137
137
  className: styles[`${RBAC_PREFIX}-table-th-action`],
138
138
  colSpan: actions.filter((action)=>action.type === TYPE.MAIN).length,
139
- children: t(`components:rolePermissionMatrix:actions:label`)
139
+ children: t(`components:rolePermissionMatrix:actionsLabel`)
140
140
  })
141
141
  ]
142
142
  })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/role-permission-matrix-client/index.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n useConfig,\n useDocumentInfo,\n useField,\n useTranslation,\n} from \"@payloadcms/ui\";\nimport { Fragment, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport type { PermissionAction } from \"../../collections/permission-actions/types.js\";\nimport type { PermissionFeature } from \"../../collections/permission-features/types.js\";\nimport type { Permission } from \"../../collections/permissions/types.js\";\nimport type { RolePermission } from \"../../collections/roles-permissions/types.js\";\nimport { STATUS as PERMISSION_STATUS } from \"../../lib/constants/permission.js\";\nimport {\n STATUS as PERMISSION_ACTION_STATUS,\n TYPE,\n} from \"../../lib/constants/permission-action.js\";\nimport { STATUS as PERMISSION_FEATURE_STATUS } from \"../../lib/constants/permission-feature.js\";\nimport { toID } from \"../../lib/utils/data.js\";\n\nimport styles from \"./matrix.module.scss\";\n\nconst RBAC_PREFIX = \"rbac\";\n\ntype ApiListResponse<T> = {\n docs?: T[];\n};\n\nexport const RolePermissionMatrixClient = () => {\n const checkboxId = useId();\n const { config } = useConfig();\n const { hasSavePermission, id } = useDocumentInfo();\n const { setValue, value } = useField<Record<string, boolean> | null>({\n path: \"permissionMatrixDraft\",\n });\n const isReadOnly = !hasSavePermission;\n\n const [features, setFeatures] = useState<PermissionFeature[]>([]);\n const [actions, setActions] = useState<PermissionAction[]>([]);\n const [permissions, setPermissions] = useState<Permission[]>([]);\n const [rolePermissions, setRolePermissions] = useState<RolePermission[]>([]);\n const [loading, setLoading] = useState(true);\n const { t } = useTranslation();\n const seededForRoleIdRef = useRef<string | null>(null);\n\n useEffect(() => {\n const run = async () => {\n setLoading(true);\n try {\n const base = config?.routes?.api || \"/api\";\n\n const [featuresRes, actionsRes, permissionsRes, rolePermissionsRes] =\n await Promise.all([\n fetch(\n `${base}/permission-features?limit=0&depth=0&where[status][equals]=${PERMISSION_FEATURE_STATUS.ACTIVE}`,\n { credentials: \"include\" },\n ),\n fetch(\n `${base}/permission-actions?limit=0&depth=0&where[status][equals]=${PERMISSION_ACTION_STATUS.ACTIVE}`,\n { credentials: \"include\" },\n ),\n fetch(\n `${base}/permissions?limit=0&depth=1&where[status][equals]=${PERMISSION_STATUS.ACTIVE}`,\n { credentials: \"include\" },\n ),\n id\n ? fetch(\n `${base}/roles-permissions?limit=0&depth=0&where[role][equals]=${id}`,\n {\n credentials: \"include\",\n },\n )\n : Promise.resolve(new Response(JSON.stringify({ docs: [] }))),\n ]);\n\n const featuresJson =\n (await featuresRes.json()) as ApiListResponse<PermissionFeature>;\n const actionsJson =\n (await actionsRes.json()) as ApiListResponse<PermissionAction>;\n const permissionsJson =\n (await permissionsRes.json()) as ApiListResponse<Permission>;\n const rolePermissionsJson =\n (await rolePermissionsRes.json()) as ApiListResponse<RolePermission>;\n\n setFeatures(\n featuresJson.docs?.sort(\n (a, b) => (a?.sortOrder ?? 0) - (b?.sortOrder ?? 0),\n ) || [],\n );\n setActions(\n actionsJson.docs?.sort(\n (a, b) => (a?.sortOrder ?? 0) - (b?.sortOrder ?? 0),\n ) || [],\n );\n setPermissions(permissionsJson.docs || []);\n setRolePermissions(rolePermissionsJson.docs || []);\n } finally {\n setLoading(false);\n }\n };\n\n void run();\n }, [config?.routes?.api, id]);\n\n const enabledByPermissionID = useMemo(() => {\n const map = new Map<string, boolean>();\n for (const row of rolePermissions) {\n map.set(toID(row.permission), Boolean(row.enabled));\n }\n return map;\n }, [rolePermissions]);\n\n const draftValue = (\n value && typeof value === \"object\" && !Array.isArray(value) ? value : {}\n ) as Record<string, boolean>;\n\n useEffect(() => {\n if (!id || loading) {\n return;\n }\n\n const roleId = String(id);\n if (seededForRoleIdRef.current === roleId) {\n return;\n }\n\n const fromRolesPermissions: Record<string, boolean> = {};\n for (const [permissionID, enabled] of enabledByPermissionID.entries()) {\n if (permissionID) {\n fromRolesPermissions[permissionID] = enabled;\n }\n }\n\n const fromDocument =\n value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, boolean>)\n : {};\n\n const hasRolesPermissions = Object.keys(fromRolesPermissions).length > 0;\n const hasDocumentDraft = Object.keys(fromDocument).length > 0;\n\n if (!hasRolesPermissions && !hasDocumentDraft) {\n return;\n }\n\n seededForRoleIdRef.current = roleId;\n setValue({\n ...fromRolesPermissions,\n ...fromDocument,\n });\n }, [enabledByPermissionID, id, loading, setValue, value]);\n\n if (!id) {\n return (\n <div className={styles[`${RBAC_PREFIX}-component-placeholder`]}>\n {t(\n `components:rolePermissionMatrix:viewInUpdateScreenOnly:label` as Parameters<\n typeof t\n >[0],\n )}\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className={styles[`${RBAC_PREFIX}-component-placeholder`]}>\n {t(\n `components:rolePermissionMatrix:loading:placeholder` as Parameters<\n typeof t\n >[0],\n )}\n </div>\n );\n }\n\n return (\n <div>\n <div className={styles[`${RBAC_PREFIX}-component-title`]}>\n {t(`components:rolePermissionMatrix:title` as Parameters<typeof t>[0])}\n </div>\n\n <div className={styles[`${RBAC_PREFIX}-table-container`]}>\n <table className={styles[`${RBAC_PREFIX}-table`]}>\n <thead>\n <tr>\n <th className={styles[`${RBAC_PREFIX}-table-th-feature`]}>\n {t(\n `components:rolePermissionMatrix:features:label` as Parameters<\n typeof t\n >[0],\n )}\n </th>\n <th\n className={styles[`${RBAC_PREFIX}-table-th-action`]}\n colSpan={\n actions.filter((action) => action.type === TYPE.MAIN).length\n }\n >\n {t(\n `components:rolePermissionMatrix:actions:label` as Parameters<\n typeof t\n >[0],\n )}\n </th>\n </tr>\n </thead>\n <tbody>\n {features.map((feature) => {\n const mainActions = actions.filter(\n (action) => action.type === TYPE.MAIN,\n );\n const subActions = actions.filter(\n (action) =>\n action.type === TYPE.SUB &&\n permissions.some(\n (permission) =>\n toID(permission.permissionAction) === String(action.id) &&\n toID(permission.permissionFeature) === String(feature.id),\n ),\n );\n const isSubActionInPermission = subActions.length > 0;\n\n return (\n <Fragment key={String(feature.id)}>\n <tr>\n <td className={styles[`${RBAC_PREFIX}-table-td-feature`]}>\n {t(\n `components:rolePermissionMatrix:features:${feature.code}` as Parameters<\n typeof t\n >[0],\n ) || feature.id}\n </td>\n\n {mainActions.map((action) => {\n const matchedPermission = permissions.find(\n (permission) =>\n toID(permission.permissionFeature) ===\n String(feature.id) &&\n toID(permission.permissionAction) ===\n String(action.id),\n );\n\n if (!matchedPermission) {\n return (\n <td\n key={`${feature.id}-${action.id}`}\n className={styles[`${RBAC_PREFIX}-table-td-action`]}\n >\n -\n </td>\n );\n }\n\n const permissionID = String(matchedPermission.id);\n const checked =\n typeof draftValue[permissionID] === \"boolean\"\n ? draftValue[permissionID]\n : (enabledByPermissionID.get(permissionID) ?? false);\n\n return (\n <td\n key={`${feature.id}-${action.id}`}\n className={styles[`${RBAC_PREFIX}-table-td-action`]}\n >\n <div\n className={\n styles[`${RBAC_PREFIX}-table-td-action-container`]\n }\n >\n <input\n type=\"checkbox\"\n id={`permission-matrix-checkbox-${checkboxId}-${feature.id}-${action.id}`}\n name={`permission-matrix-checkbox-${checkboxId}-${feature.id}-${action.id}`}\n checked={checked}\n disabled={isReadOnly}\n onChange={(event) => {\n setValue({\n ...draftValue,\n [permissionID]: event.target.checked,\n });\n }}\n className={\n styles[`${RBAC_PREFIX}-table-td-action-input`]\n }\n />\n <label\n htmlFor={`permission-matrix-checkbox-${checkboxId}-${feature.id}-${action.id}`}\n className={\n styles[`${RBAC_PREFIX}-table-td-action-label`]\n }\n >\n {t(\n `components:rolePermissionMatrix:actions:${action.code}` as Parameters<\n typeof t\n >[0],\n ) || action.id}\n </label>\n </div>\n </td>\n );\n })}\n </tr>\n\n {isSubActionInPermission && (\n <tr>\n <td\n className={styles[`${RBAC_PREFIX}-table-td-feature`]}\n ></td>\n <td\n className={styles[`${RBAC_PREFIX}-table-td-action`]}\n colSpan={mainActions.length}\n >\n {subActions.map((action) => {\n const matchedPermission = permissions.find(\n (permission) =>\n toID(permission.permissionFeature) ===\n String(feature.id) &&\n toID(permission.permissionAction) ===\n String(action.id),\n );\n\n if (!matchedPermission) {\n return null;\n }\n\n const permissionID = String(matchedPermission.id);\n const checked =\n typeof draftValue[permissionID] === \"boolean\"\n ? draftValue[permissionID]\n : (enabledByPermissionID.get(permissionID) ??\n false);\n\n return (\n <div key={`${feature.id}-${action.id}-sub`}>\n <input\n type=\"checkbox\"\n checked={checked}\n disabled={isReadOnly}\n onChange={(event) => {\n setValue({\n ...draftValue,\n [permissionID]: event.target.checked,\n });\n }}\n />{\" \"}\n <span\n style={{\n display: \"inline-block\",\n }}\n >\n {action.code || action.id}\n </span>\n </div>\n );\n })}\n </td>\n </tr>\n )}\n </Fragment>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n );\n};\n"],"names":["useConfig","useDocumentInfo","useField","useTranslation","Fragment","useEffect","useId","useMemo","useRef","useState","STATUS","PERMISSION_STATUS","PERMISSION_ACTION_STATUS","TYPE","PERMISSION_FEATURE_STATUS","toID","styles","RBAC_PREFIX","RolePermissionMatrixClient","checkboxId","config","hasSavePermission","id","setValue","value","path","isReadOnly","features","setFeatures","actions","setActions","permissions","setPermissions","rolePermissions","setRolePermissions","loading","setLoading","t","seededForRoleIdRef","run","base","routes","api","featuresRes","actionsRes","permissionsRes","rolePermissionsRes","Promise","all","fetch","ACTIVE","credentials","resolve","Response","JSON","stringify","docs","featuresJson","json","actionsJson","permissionsJson","rolePermissionsJson","sort","a","b","sortOrder","enabledByPermissionID","map","Map","row","set","permission","Boolean","enabled","draftValue","Array","isArray","roleId","String","current","fromRolesPermissions","permissionID","entries","fromDocument","hasRolesPermissions","Object","keys","length","hasDocumentDraft","div","className","table","thead","tr","th","colSpan","filter","action","type","MAIN","tbody","feature","mainActions","subActions","SUB","some","permissionAction","permissionFeature","isSubActionInPermission","td","code","matchedPermission","find","checked","get","input","name","disabled","onChange","event","target","label","htmlFor","span","style","display"],"mappings":"AAAA;;AAEA,SACEA,SAAS,EACTC,eAAe,EACfC,QAAQ,EACRC,cAAc,QACT,iBAAiB;AACxB,SAASC,QAAQ,EAAEC,SAAS,EAAEC,KAAK,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAQ;AAK9E,SAASC,UAAUC,iBAAiB,QAAQ,oCAAoC;AAChF,SACED,UAAUE,wBAAwB,EAClCC,IAAI,QACC,2CAA2C;AAClD,SAASH,UAAUI,yBAAyB,QAAQ,4CAA4C;AAChG,SAASC,IAAI,QAAQ,0BAA0B;AAE/C,OAAOC,YAAY,uBAAuB;AAE1C,MAAMC,cAAc;AAMpB,OAAO,MAAMC,6BAA6B;IACxC,MAAMC,aAAab;IACnB,MAAM,EAAEc,MAAM,EAAE,GAAGpB;IACnB,MAAM,EAAEqB,iBAAiB,EAAEC,EAAE,EAAE,GAAGrB;IAClC,MAAM,EAAEsB,QAAQ,EAAEC,KAAK,EAAE,GAAGtB,SAAyC;QACnEuB,MAAM;IACR;IACA,MAAMC,aAAa,CAACL;IAEpB,MAAM,CAACM,UAAUC,YAAY,GAAGnB,SAA8B,EAAE;IAChE,MAAM,CAACoB,SAASC,WAAW,GAAGrB,SAA6B,EAAE;IAC7D,MAAM,CAACsB,aAAaC,eAAe,GAAGvB,SAAuB,EAAE;IAC/D,MAAM,CAACwB,iBAAiBC,mBAAmB,GAAGzB,SAA2B,EAAE;IAC3E,MAAM,CAAC0B,SAASC,WAAW,GAAG3B,SAAS;IACvC,MAAM,EAAE4B,CAAC,EAAE,GAAGlC;IACd,MAAMmC,qBAAqB9B,OAAsB;IAEjDH,UAAU;QACR,MAAMkC,MAAM;YACVH,WAAW;YACX,IAAI;gBACF,MAAMI,OAAOpB,QAAQqB,QAAQC,OAAO;gBAEpC,MAAM,CAACC,aAAaC,YAAYC,gBAAgBC,mBAAmB,GACjE,MAAMC,QAAQC,GAAG,CAAC;oBAChBC,MACE,GAAGT,KAAK,2DAA2D,EAAE1B,0BAA0BoC,MAAM,EAAE,EACvG;wBAAEC,aAAa;oBAAU;oBAE3BF,MACE,GAAGT,KAAK,0DAA0D,EAAE5B,yBAAyBsC,MAAM,EAAE,EACrG;wBAAEC,aAAa;oBAAU;oBAE3BF,MACE,GAAGT,KAAK,mDAAmD,EAAE7B,kBAAkBuC,MAAM,EAAE,EACvF;wBAAEC,aAAa;oBAAU;oBAE3B7B,KACI2B,MACE,GAAGT,KAAK,uDAAuD,EAAElB,IAAI,EACrE;wBACE6B,aAAa;oBACf,KAEFJ,QAAQK,OAAO,CAAC,IAAIC,SAASC,KAAKC,SAAS,CAAC;wBAAEC,MAAM,EAAE;oBAAC;iBAC5D;gBAEH,MAAMC,eACH,MAAMd,YAAYe,IAAI;gBACzB,MAAMC,cACH,MAAMf,WAAWc,IAAI;gBACxB,MAAME,kBACH,MAAMf,eAAea,IAAI;gBAC5B,MAAMG,sBACH,MAAMf,mBAAmBY,IAAI;gBAEhC9B,YACE6B,aAAaD,IAAI,EAAEM,KACjB,CAACC,GAAGC,IAAM,AAACD,CAAAA,GAAGE,aAAa,CAAA,IAAMD,CAAAA,GAAGC,aAAa,CAAA,MAC9C,EAAE;gBAETnC,WACE6B,YAAYH,IAAI,EAAEM,KAChB,CAACC,GAAGC,IAAM,AAACD,CAAAA,GAAGE,aAAa,CAAA,IAAMD,CAAAA,GAAGC,aAAa,CAAA,MAC9C,EAAE;gBAETjC,eAAe4B,gBAAgBJ,IAAI,IAAI,EAAE;gBACzCtB,mBAAmB2B,oBAAoBL,IAAI,IAAI,EAAE;YACnD,SAAU;gBACRpB,WAAW;YACb;QACF;QAEA,KAAKG;IACP,GAAG;QAACnB,QAAQqB,QAAQC;QAAKpB;KAAG;IAE5B,MAAM4C,wBAAwB3D,QAAQ;QACpC,MAAM4D,MAAM,IAAIC;QAChB,KAAK,MAAMC,OAAOpC,gBAAiB;YACjCkC,IAAIG,GAAG,CAACvD,KAAKsD,IAAIE,UAAU,GAAGC,QAAQH,IAAII,OAAO;QACnD;QACA,OAAON;IACT,GAAG;QAAClC;KAAgB;IAEpB,MAAMyC,aACJlD,SAAS,OAAOA,UAAU,YAAY,CAACmD,MAAMC,OAAO,CAACpD,SAASA,QAAQ,CAAC;IAGzEnB,UAAU;QACR,IAAI,CAACiB,MAAMa,SAAS;YAClB;QACF;QAEA,MAAM0C,SAASC,OAAOxD;QACtB,IAAIgB,mBAAmByC,OAAO,KAAKF,QAAQ;YACzC;QACF;QAEA,MAAMG,uBAAgD,CAAC;QACvD,KAAK,MAAM,CAACC,cAAcR,QAAQ,IAAIP,sBAAsBgB,OAAO,GAAI;YACrE,IAAID,cAAc;gBAChBD,oBAAoB,CAACC,aAAa,GAAGR;YACvC;QACF;QAEA,MAAMU,eACJ3D,SAAS,OAAOA,UAAU,YAAY,CAACmD,MAAMC,OAAO,CAACpD,SAChDA,QACD,CAAC;QAEP,MAAM4D,sBAAsBC,OAAOC,IAAI,CAACN,sBAAsBO,MAAM,GAAG;QACvE,MAAMC,mBAAmBH,OAAOC,IAAI,CAACH,cAAcI,MAAM,GAAG;QAE5D,IAAI,CAACH,uBAAuB,CAACI,kBAAkB;YAC7C;QACF;QAEAlD,mBAAmByC,OAAO,GAAGF;QAC7BtD,SAAS;YACP,GAAGyD,oBAAoB;YACvB,GAAGG,YAAY;QACjB;IACF,GAAG;QAACjB;QAAuB5C;QAAIa;QAASZ;QAAUC;KAAM;IAExD,IAAI,CAACF,IAAI;QACP,qBACE,KAACmE;YAAIC,WAAW1E,MAAM,CAAC,GAAGC,YAAY,sBAAsB,CAAC,CAAC;sBAC3DoB,EACC,CAAC,4DAA4D,CAAC;;IAMtE;IAEA,IAAIF,SAAS;QACX,qBACE,KAACsD;YAAIC,WAAW1E,MAAM,CAAC,GAAGC,YAAY,sBAAsB,CAAC,CAAC;sBAC3DoB,EACC,CAAC,mDAAmD,CAAC;;IAM7D;IAEA,qBACE,MAACoD;;0BACC,KAACA;gBAAIC,WAAW1E,MAAM,CAAC,GAAGC,YAAY,gBAAgB,CAAC,CAAC;0BACrDoB,EAAE,CAAC,qCAAqC,CAAC;;0BAG5C,KAACoD;gBAAIC,WAAW1E,MAAM,CAAC,GAAGC,YAAY,gBAAgB,CAAC,CAAC;0BACtD,cAAA,MAAC0E;oBAAMD,WAAW1E,MAAM,CAAC,GAAGC,YAAY,MAAM,CAAC,CAAC;;sCAC9C,KAAC2E;sCACC,cAAA,MAACC;;kDACC,KAACC;wCAAGJ,WAAW1E,MAAM,CAAC,GAAGC,YAAY,iBAAiB,CAAC,CAAC;kDACrDoB,EACC,CAAC,8CAA8C,CAAC;;kDAKpD,KAACyD;wCACCJ,WAAW1E,MAAM,CAAC,GAAGC,YAAY,gBAAgB,CAAC,CAAC;wCACnD8E,SACElE,QAAQmE,MAAM,CAAC,CAACC,SAAWA,OAAOC,IAAI,KAAKrF,KAAKsF,IAAI,EAAEZ,MAAM;kDAG7DlD,EACC,CAAC,6CAA6C,CAAC;;;;;sCAOvD,KAAC+D;sCACEzE,SAASwC,GAAG,CAAC,CAACkC;gCACb,MAAMC,cAAczE,QAAQmE,MAAM,CAChC,CAACC,SAAWA,OAAOC,IAAI,KAAKrF,KAAKsF,IAAI;gCAEvC,MAAMI,aAAa1E,QAAQmE,MAAM,CAC/B,CAACC,SACCA,OAAOC,IAAI,KAAKrF,KAAK2F,GAAG,IACxBzE,YAAY0E,IAAI,CACd,CAAClC,aACCxD,KAAKwD,WAAWmC,gBAAgB,MAAM5B,OAAOmB,OAAO3E,EAAE,KACtDP,KAAKwD,WAAWoC,iBAAiB,MAAM7B,OAAOuB,QAAQ/E,EAAE;gCAGhE,MAAMsF,0BAA0BL,WAAWhB,MAAM,GAAG;gCAEpD,qBACE,MAACnF;;sDACC,MAACyF;;8DACC,KAACgB;oDAAGnB,WAAW1E,MAAM,CAAC,GAAGC,YAAY,iBAAiB,CAAC,CAAC;8DACrDoB,EACC,CAAC,yCAAyC,EAAEgE,QAAQS,IAAI,EAAE,KAGvDT,QAAQ/E,EAAE;;gDAGhBgF,YAAYnC,GAAG,CAAC,CAAC8B;oDAChB,MAAMc,oBAAoBhF,YAAYiF,IAAI,CACxC,CAACzC,aACCxD,KAAKwD,WAAWoC,iBAAiB,MAC/B7B,OAAOuB,QAAQ/E,EAAE,KACnBP,KAAKwD,WAAWmC,gBAAgB,MAC9B5B,OAAOmB,OAAO3E,EAAE;oDAGtB,IAAI,CAACyF,mBAAmB;wDACtB,qBACE,KAACF;4DAECnB,WAAW1E,MAAM,CAAC,GAAGC,YAAY,gBAAgB,CAAC,CAAC;sEACpD;2DAFM,GAAGoF,QAAQ/E,EAAE,CAAC,CAAC,EAAE2E,OAAO3E,EAAE,EAAE;oDAMvC;oDAEA,MAAM2D,eAAeH,OAAOiC,kBAAkBzF,EAAE;oDAChD,MAAM2F,UACJ,OAAOvC,UAAU,CAACO,aAAa,KAAK,YAChCP,UAAU,CAACO,aAAa,GACvBf,sBAAsBgD,GAAG,CAACjC,iBAAiB;oDAElD,qBACE,KAAC4B;wDAECnB,WAAW1E,MAAM,CAAC,GAAGC,YAAY,gBAAgB,CAAC,CAAC;kEAEnD,cAAA,MAACwE;4DACCC,WACE1E,MAAM,CAAC,GAAGC,YAAY,0BAA0B,CAAC,CAAC;;8EAGpD,KAACkG;oEACCjB,MAAK;oEACL5E,IAAI,CAAC,2BAA2B,EAAEH,WAAW,CAAC,EAAEkF,QAAQ/E,EAAE,CAAC,CAAC,EAAE2E,OAAO3E,EAAE,EAAE;oEACzE8F,MAAM,CAAC,2BAA2B,EAAEjG,WAAW,CAAC,EAAEkF,QAAQ/E,EAAE,CAAC,CAAC,EAAE2E,OAAO3E,EAAE,EAAE;oEAC3E2F,SAASA;oEACTI,UAAU3F;oEACV4F,UAAU,CAACC;wEACThG,SAAS;4EACP,GAAGmD,UAAU;4EACb,CAACO,aAAa,EAAEsC,MAAMC,MAAM,CAACP,OAAO;wEACtC;oEACF;oEACAvB,WACE1E,MAAM,CAAC,GAAGC,YAAY,sBAAsB,CAAC,CAAC;;8EAGlD,KAACwG;oEACCC,SAAS,CAAC,2BAA2B,EAAEvG,WAAW,CAAC,EAAEkF,QAAQ/E,EAAE,CAAC,CAAC,EAAE2E,OAAO3E,EAAE,EAAE;oEAC9EoE,WACE1E,MAAM,CAAC,GAAGC,YAAY,sBAAsB,CAAC,CAAC;8EAG/CoB,EACC,CAAC,wCAAwC,EAAE4D,OAAOa,IAAI,EAAE,KAGrDb,OAAO3E,EAAE;;;;uDAlCb,GAAG+E,QAAQ/E,EAAE,CAAC,CAAC,EAAE2E,OAAO3E,EAAE,EAAE;gDAuCvC;;;wCAGDsF,yCACC,MAACf;;8DACC,KAACgB;oDACCnB,WAAW1E,MAAM,CAAC,GAAGC,YAAY,iBAAiB,CAAC,CAAC;;8DAEtD,KAAC4F;oDACCnB,WAAW1E,MAAM,CAAC,GAAGC,YAAY,gBAAgB,CAAC,CAAC;oDACnD8E,SAASO,YAAYf,MAAM;8DAE1BgB,WAAWpC,GAAG,CAAC,CAAC8B;wDACf,MAAMc,oBAAoBhF,YAAYiF,IAAI,CACxC,CAACzC,aACCxD,KAAKwD,WAAWoC,iBAAiB,MAC/B7B,OAAOuB,QAAQ/E,EAAE,KACnBP,KAAKwD,WAAWmC,gBAAgB,MAC9B5B,OAAOmB,OAAO3E,EAAE;wDAGtB,IAAI,CAACyF,mBAAmB;4DACtB,OAAO;wDACT;wDAEA,MAAM9B,eAAeH,OAAOiC,kBAAkBzF,EAAE;wDAChD,MAAM2F,UACJ,OAAOvC,UAAU,CAACO,aAAa,KAAK,YAChCP,UAAU,CAACO,aAAa,GACvBf,sBAAsBgD,GAAG,CAACjC,iBAC3B;wDAEN,qBACE,MAACQ;;8EACC,KAAC0B;oEACCjB,MAAK;oEACLe,SAASA;oEACTI,UAAU3F;oEACV4F,UAAU,CAACC;wEACThG,SAAS;4EACP,GAAGmD,UAAU;4EACb,CAACO,aAAa,EAAEsC,MAAMC,MAAM,CAACP,OAAO;wEACtC;oEACF;;gEACC;8EACH,KAACU;oEACCC,OAAO;wEACLC,SAAS;oEACX;8EAEC5B,OAAOa,IAAI,IAAIb,OAAO3E,EAAE;;;2DAjBnB,GAAG+E,QAAQ/E,EAAE,CAAC,CAAC,EAAE2E,OAAO3E,EAAE,CAAC,IAAI,CAAC;oDAqB9C;;;;;mCAnIOwD,OAAOuB,QAAQ/E,EAAE;4BAyIpC;;;;;;;AAMZ,EAAE"}
1
+ {"version":3,"sources":["../../../src/components/role-permission-matrix-client/index.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n useConfig,\n useDocumentInfo,\n useField,\n useTranslation,\n} from \"@payloadcms/ui\";\nimport { Fragment, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport type { PermissionAction } from \"../../collections/permission-actions/types.js\";\nimport type { PermissionFeature } from \"../../collections/permission-features/types.js\";\nimport type { Permission } from \"../../collections/permissions/types.js\";\nimport type { RolePermission } from \"../../collections/roles-permissions/types.js\";\nimport { STATUS as PERMISSION_STATUS } from \"../../lib/constants/permission.js\";\nimport {\n STATUS as PERMISSION_ACTION_STATUS,\n TYPE,\n} from \"../../lib/constants/permission-action.js\";\nimport { STATUS as PERMISSION_FEATURE_STATUS } from \"../../lib/constants/permission-feature.js\";\nimport { toID } from \"../../lib/utils/data.js\";\n\nimport styles from \"./matrix.module.scss\";\n\nconst RBAC_PREFIX = \"rbac\";\n\ntype ApiListResponse<T> = {\n docs?: T[];\n};\n\nexport const RolePermissionMatrixClient = () => {\n const checkboxId = useId();\n const { config } = useConfig();\n const { hasSavePermission, id } = useDocumentInfo();\n const { setValue, value } = useField<Record<string, boolean> | null>({\n path: \"permissionMatrixDraft\",\n });\n const isReadOnly = !hasSavePermission;\n\n const [features, setFeatures] = useState<PermissionFeature[]>([]);\n const [actions, setActions] = useState<PermissionAction[]>([]);\n const [permissions, setPermissions] = useState<Permission[]>([]);\n const [rolePermissions, setRolePermissions] = useState<RolePermission[]>([]);\n const [loading, setLoading] = useState(true);\n const { t } = useTranslation();\n const seededForRoleIdRef = useRef<string | null>(null);\n\n useEffect(() => {\n const run = async () => {\n setLoading(true);\n try {\n const base = config?.routes?.api || \"/api\";\n\n const [featuresRes, actionsRes, permissionsRes, rolePermissionsRes] =\n await Promise.all([\n fetch(\n `${base}/permission-features?limit=0&depth=0&where[status][equals]=${PERMISSION_FEATURE_STATUS.ACTIVE}`,\n { credentials: \"include\" },\n ),\n fetch(\n `${base}/permission-actions?limit=0&depth=0&where[status][equals]=${PERMISSION_ACTION_STATUS.ACTIVE}`,\n { credentials: \"include\" },\n ),\n fetch(\n `${base}/permissions?limit=0&depth=1&where[status][equals]=${PERMISSION_STATUS.ACTIVE}`,\n { credentials: \"include\" },\n ),\n id\n ? fetch(\n `${base}/roles-permissions?limit=0&depth=0&where[role][equals]=${id}`,\n {\n credentials: \"include\",\n },\n )\n : Promise.resolve(new Response(JSON.stringify({ docs: [] }))),\n ]);\n\n const featuresJson =\n (await featuresRes.json()) as ApiListResponse<PermissionFeature>;\n const actionsJson =\n (await actionsRes.json()) as ApiListResponse<PermissionAction>;\n const permissionsJson =\n (await permissionsRes.json()) as ApiListResponse<Permission>;\n const rolePermissionsJson =\n (await rolePermissionsRes.json()) as ApiListResponse<RolePermission>;\n\n setFeatures(\n featuresJson.docs?.sort(\n (a, b) => (a?.sortOrder ?? 0) - (b?.sortOrder ?? 0),\n ) || [],\n );\n setActions(\n actionsJson.docs?.sort(\n (a, b) => (a?.sortOrder ?? 0) - (b?.sortOrder ?? 0),\n ) || [],\n );\n setPermissions(permissionsJson.docs || []);\n setRolePermissions(rolePermissionsJson.docs || []);\n } finally {\n setLoading(false);\n }\n };\n\n void run();\n }, [config?.routes?.api, id]);\n\n const enabledByPermissionID = useMemo(() => {\n const map = new Map<string, boolean>();\n for (const row of rolePermissions) {\n map.set(toID(row.permission), Boolean(row.enabled));\n }\n return map;\n }, [rolePermissions]);\n\n const draftValue = (\n value && typeof value === \"object\" && !Array.isArray(value) ? value : {}\n ) as Record<string, boolean>;\n\n useEffect(() => {\n if (!id || loading) {\n return;\n }\n\n const roleId = String(id);\n if (seededForRoleIdRef.current === roleId) {\n return;\n }\n\n const fromRolesPermissions: Record<string, boolean> = {};\n for (const [permissionID, enabled] of enabledByPermissionID.entries()) {\n if (permissionID) {\n fromRolesPermissions[permissionID] = enabled;\n }\n }\n\n const fromDocument =\n value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, boolean>)\n : {};\n\n const hasRolesPermissions = Object.keys(fromRolesPermissions).length > 0;\n const hasDocumentDraft = Object.keys(fromDocument).length > 0;\n\n if (!hasRolesPermissions && !hasDocumentDraft) {\n return;\n }\n\n seededForRoleIdRef.current = roleId;\n setValue({\n ...fromRolesPermissions,\n ...fromDocument,\n });\n }, [enabledByPermissionID, id, loading, setValue, value]);\n\n if (!id) {\n return (\n <div className={styles[`${RBAC_PREFIX}-component-placeholder`]}>\n {t(\n `components:rolePermissionMatrix:viewInUpdateScreenOnly:label` as Parameters<\n typeof t\n >[0],\n )}\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className={styles[`${RBAC_PREFIX}-component-placeholder`]}>\n {t(\n `components:rolePermissionMatrix:loading:placeholder` as Parameters<\n typeof t\n >[0],\n )}\n </div>\n );\n }\n\n return (\n <div>\n <div className={styles[`${RBAC_PREFIX}-component-title`]}>\n {t(`components:rolePermissionMatrix:title` as Parameters<typeof t>[0])}\n </div>\n\n <div className={styles[`${RBAC_PREFIX}-table-container`]}>\n <table className={styles[`${RBAC_PREFIX}-table`]}>\n <thead>\n <tr>\n <th className={styles[`${RBAC_PREFIX}-table-th-feature`]}>\n {t(\n `components:rolePermissionMatrix:featuresLabel` as Parameters<\n typeof t\n >[0],\n )}\n </th>\n <th\n className={styles[`${RBAC_PREFIX}-table-th-action`]}\n colSpan={\n actions.filter((action) => action.type === TYPE.MAIN).length\n }\n >\n {t(\n `components:rolePermissionMatrix:actionsLabel` as Parameters<\n typeof t\n >[0],\n )}\n </th>\n </tr>\n </thead>\n <tbody>\n {features.map((feature) => {\n const mainActions = actions.filter(\n (action) => action.type === TYPE.MAIN,\n );\n const subActions = actions.filter(\n (action) =>\n action.type === TYPE.SUB &&\n permissions.some(\n (permission) =>\n toID(permission.permissionAction) === String(action.id) &&\n toID(permission.permissionFeature) === String(feature.id),\n ),\n );\n const isSubActionInPermission = subActions.length > 0;\n\n return (\n <Fragment key={String(feature.id)}>\n <tr>\n <td className={styles[`${RBAC_PREFIX}-table-td-feature`]}>\n {t(\n `components:rolePermissionMatrix:features:${feature.code}` as Parameters<\n typeof t\n >[0],\n ) || feature.id}\n </td>\n\n {mainActions.map((action) => {\n const matchedPermission = permissions.find(\n (permission) =>\n toID(permission.permissionFeature) ===\n String(feature.id) &&\n toID(permission.permissionAction) ===\n String(action.id),\n );\n\n if (!matchedPermission) {\n return (\n <td\n key={`${feature.id}-${action.id}`}\n className={styles[`${RBAC_PREFIX}-table-td-action`]}\n >\n -\n </td>\n );\n }\n\n const permissionID = String(matchedPermission.id);\n const checked =\n typeof draftValue[permissionID] === \"boolean\"\n ? draftValue[permissionID]\n : (enabledByPermissionID.get(permissionID) ?? false);\n\n return (\n <td\n key={`${feature.id}-${action.id}`}\n className={styles[`${RBAC_PREFIX}-table-td-action`]}\n >\n <div\n className={\n styles[`${RBAC_PREFIX}-table-td-action-container`]\n }\n >\n <input\n type=\"checkbox\"\n id={`permission-matrix-checkbox-${checkboxId}-${feature.id}-${action.id}`}\n name={`permission-matrix-checkbox-${checkboxId}-${feature.id}-${action.id}`}\n checked={checked}\n disabled={isReadOnly}\n onChange={(event) => {\n setValue({\n ...draftValue,\n [permissionID]: event.target.checked,\n });\n }}\n className={\n styles[`${RBAC_PREFIX}-table-td-action-input`]\n }\n />\n <label\n htmlFor={`permission-matrix-checkbox-${checkboxId}-${feature.id}-${action.id}`}\n className={\n styles[`${RBAC_PREFIX}-table-td-action-label`]\n }\n >\n {t(\n `components:rolePermissionMatrix:actions:${action.code}` as Parameters<\n typeof t\n >[0],\n ) || action.id}\n </label>\n </div>\n </td>\n );\n })}\n </tr>\n\n {isSubActionInPermission && (\n <tr>\n <td\n className={styles[`${RBAC_PREFIX}-table-td-feature`]}\n ></td>\n <td\n className={styles[`${RBAC_PREFIX}-table-td-action`]}\n colSpan={mainActions.length}\n >\n {subActions.map((action) => {\n const matchedPermission = permissions.find(\n (permission) =>\n toID(permission.permissionFeature) ===\n String(feature.id) &&\n toID(permission.permissionAction) ===\n String(action.id),\n );\n\n if (!matchedPermission) {\n return null;\n }\n\n const permissionID = String(matchedPermission.id);\n const checked =\n typeof draftValue[permissionID] === \"boolean\"\n ? draftValue[permissionID]\n : (enabledByPermissionID.get(permissionID) ??\n false);\n\n return (\n <div key={`${feature.id}-${action.id}-sub`}>\n <input\n type=\"checkbox\"\n checked={checked}\n disabled={isReadOnly}\n onChange={(event) => {\n setValue({\n ...draftValue,\n [permissionID]: event.target.checked,\n });\n }}\n />{\" \"}\n <span\n style={{\n display: \"inline-block\",\n }}\n >\n {action.code || action.id}\n </span>\n </div>\n );\n })}\n </td>\n </tr>\n )}\n </Fragment>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n );\n};\n"],"names":["useConfig","useDocumentInfo","useField","useTranslation","Fragment","useEffect","useId","useMemo","useRef","useState","STATUS","PERMISSION_STATUS","PERMISSION_ACTION_STATUS","TYPE","PERMISSION_FEATURE_STATUS","toID","styles","RBAC_PREFIX","RolePermissionMatrixClient","checkboxId","config","hasSavePermission","id","setValue","value","path","isReadOnly","features","setFeatures","actions","setActions","permissions","setPermissions","rolePermissions","setRolePermissions","loading","setLoading","t","seededForRoleIdRef","run","base","routes","api","featuresRes","actionsRes","permissionsRes","rolePermissionsRes","Promise","all","fetch","ACTIVE","credentials","resolve","Response","JSON","stringify","docs","featuresJson","json","actionsJson","permissionsJson","rolePermissionsJson","sort","a","b","sortOrder","enabledByPermissionID","map","Map","row","set","permission","Boolean","enabled","draftValue","Array","isArray","roleId","String","current","fromRolesPermissions","permissionID","entries","fromDocument","hasRolesPermissions","Object","keys","length","hasDocumentDraft","div","className","table","thead","tr","th","colSpan","filter","action","type","MAIN","tbody","feature","mainActions","subActions","SUB","some","permissionAction","permissionFeature","isSubActionInPermission","td","code","matchedPermission","find","checked","get","input","name","disabled","onChange","event","target","label","htmlFor","span","style","display"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  // Import Payload compile-time SCSS vars ($breakpoint-s-width, etc.).
2
2
  // Note: @payloadcms/ui/scss/vars is not a published export — use dist/scss/vars.
3
- @use "../../../node_modules/@payloadcms/ui/dist/scss/vars" as payload-vars;
3
+ // @use "../../../node_modules/@payloadcms/ui/dist/scss/vars" as payload-vars;
4
4
  @use "../../styles/variables" as rbac-vars;
5
5
 
6
6
  $local-prefix: rbac-vars.$rbac-prefix;
@@ -26,9 +26,6 @@ $local-prefix: rbac-vars.$rbac-prefix;
26
26
  &-container {
27
27
  border-radius: var(--style-radius-m);
28
28
  border: 1px solid var(--theme-border-color);
29
- @media only screen and (min-width: payload-vars.$breakpoint-s-width) {
30
- border-radius: var(--style-radius-l);
31
- }
32
29
  }
33
30
  &-th {
34
31
  &-feature {
@@ -8,11 +8,9 @@ export type RolePermissionMatrixClientTranslations = {
8
8
  placeholder?: string;
9
9
  };
10
10
  title?: string;
11
- features?: {
12
- label?: string;
13
- } | Record<string, string>;
14
- actions?: {
15
- label?: string;
16
- } | Record<string, string>;
11
+ featuresLabel?: string;
12
+ features?: Record<string, string>;
13
+ actionsLabel?: string;
14
+ actions?: Record<string, string>;
17
15
  };
18
16
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/role-permission-matrix-client/types.ts"],"sourcesContent":["export type RolePermissionMatrixClientTranslations = {\n [locale: string]: {\n viewInUpdateScreenOnly?: {\n label?: string\n placeholder?: string\n }\n loading?: {\n placeholder?: string\n }\n title?: string\n features?:\n | {\n label?: string\n }\n | Record<string, string>\n actions?:\n | {\n label?: string\n }\n | Record<string, string>\n }\n}\n"],"names":[],"mappings":"AAAA,WAqBC"}
1
+ {"version":3,"sources":["../../../src/components/role-permission-matrix-client/types.ts"],"sourcesContent":["export type RolePermissionMatrixClientTranslations = {\n [locale: string]: {\n viewInUpdateScreenOnly?: {\n label?: string;\n placeholder?: string;\n };\n loading?: {\n placeholder?: string;\n };\n title?: string;\n featuresLabel?: string;\n features?: Record<string, string>;\n actionsLabel?: string;\n actions?: Record<string, string>;\n };\n};\n"],"names":[],"mappings":"AAAA,WAeE"}
@@ -0,0 +1,5 @@
1
+ type ItemRef = number | string | { id?: number | string };
2
+
3
+ type ApiListResponse<T> = {
4
+ docs?: T[];
5
+ };
package/dist/index.d.ts CHANGED
@@ -2,4 +2,5 @@ import type { Config } from "payload";
2
2
  import type { PayloadAuthRbacPluginConfig } from "./types.js";
3
3
  export * from "./lib/constants/index.js";
4
4
  export * from "./lib/utils/index.js";
5
+ export type * from "./types.js";
5
6
  export declare const payloadAuthRbacPlugin: (pluginOptions: PayloadAuthRbacPluginConfig) => (config: Config) => Config;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Config } from \"payload\";\nimport { permissionActionsDefaultTranslations } from \"./collections/permission-actions/default-data.js\";\nimport { getPermissionActionsCollection } from \"./collections/permission-actions/index.js\";\nimport { permissionFeaturesDefaultTranslations } from \"./collections/permission-features/default-data.js\";\nimport { getPermissionFeaturesCollection } from \"./collections/permission-features/index.js\";\nimport { permissionsDefaultTranslations } from \"./collections/permissions/default-data.js\";\nimport { getPermissionsCollection } from \"./collections/permissions/index.js\";\nimport { rolesDefaultTranslations } from \"./collections/roles/default-data.js\";\nimport { getRolesCollection } from \"./collections/roles/index.js\";\nimport { rolesPermissionsDefaultTranslations } from \"./collections/roles-permissions/default-data.js\";\nimport { getRolesPermissionsCollection } from \"./collections/roles-permissions/index.js\";\nimport { usersDefaultTranslations } from \"./collections/users/default-data.js\";\nimport { modifyUsersCollection } from \"./collections/users/index.js\";\nimport { rolePermissionMatrixClientDefaultTranslations } from \"./components/role-permission-matrix-client/default-data.js\";\n\nimport {\n getAllTranslationsOfSpecificObject,\n getMergedTranslations,\n} from \"./lib/utils/index.js\";\nimport type {\n PayloadAuthRbacPluginConfig,\n PermissionActionsCollectionTranslations,\n PermissionFeaturesCollectionTranslations,\n PermissionsCollectionTranslations,\n RolesCollectionTranslations,\n RolesPermissionsCollectionTranslations,\n UsersModificationTranslations,\n} from \"./types.js\";\n\nexport * from \"./lib/constants/index.js\";\nexport * from \"./lib/utils/index.js\";\n\nexport const payloadAuthRbacPlugin =\n (pluginOptions: PayloadAuthRbacPluginConfig) =>\n (config: Config): Config => {\n if (!config.collections) {\n config.collections = [];\n }\n\n if (!pluginOptions.translations) {\n pluginOptions.translations = {};\n }\n\n config.collections.push(\n getPermissionActionsCollection({\n ...pluginOptions.collections?.permissionActions,\n translations: getMergedTranslations({\n defaultTranslations: permissionActionsDefaultTranslations,\n translations:\n getAllTranslationsOfSpecificObject<PermissionActionsCollectionTranslations>(\n {\n translations: pluginOptions.translations,\n path: \"collections.permissionActions\",\n },\n ),\n }),\n }),\n );\n config.collections.push(\n getPermissionFeaturesCollection({\n ...pluginOptions.collections?.permissionFeatures,\n translations: getMergedTranslations({\n defaultTranslations: permissionFeaturesDefaultTranslations,\n translations:\n getAllTranslationsOfSpecificObject<PermissionFeaturesCollectionTranslations>(\n {\n translations: pluginOptions.translations,\n path: \"collections.permissionFeatures\",\n },\n ),\n }),\n }),\n );\n config.collections.push(\n getPermissionsCollection({\n ...pluginOptions.collections?.permissions,\n translations: getMergedTranslations({\n defaultTranslations: permissionsDefaultTranslations,\n translations:\n getAllTranslationsOfSpecificObject<PermissionsCollectionTranslations>(\n {\n translations: pluginOptions.translations,\n path: \"collections.permissions\",\n },\n ),\n }),\n }),\n );\n config.collections.push(\n getRolesCollection({\n ...pluginOptions.collections?.roles,\n translations: getMergedTranslations({\n defaultTranslations: rolesDefaultTranslations,\n translations:\n getAllTranslationsOfSpecificObject<RolesCollectionTranslations>({\n translations: pluginOptions.translations,\n path: \"collections.roles\",\n }),\n }),\n }),\n );\n config.collections.push(\n getRolesPermissionsCollection({\n ...pluginOptions.collections?.rolesPermissions,\n translations: getMergedTranslations({\n defaultTranslations: rolesPermissionsDefaultTranslations,\n translations:\n getAllTranslationsOfSpecificObject<RolesPermissionsCollectionTranslations>(\n {\n translations: pluginOptions.translations,\n path: \"collections.rolesPermissions\",\n },\n ),\n }),\n }),\n );\n\n if (pluginOptions.autoModifyUsersCollection !== false) {\n config = modifyUsersCollection({\n translations: getMergedTranslations({\n defaultTranslations: usersDefaultTranslations,\n translations:\n getAllTranslationsOfSpecificObject<UsersModificationTranslations>({\n translations: pluginOptions.translations,\n path: \"collections.users\",\n }),\n }),\n })(config);\n }\n // if (pluginOptions.collections) {\n // for (const collectionSlug in pluginOptions.collections) {\n // const collection = config.collections.find(\n // (collection) => collection.slug === collectionSlug,\n // );\n\n // if (collection) {\n // collection.fields.push({\n // name: \"addedByPlugin\",\n // type: \"text\",\n // admin: {\n // position: \"sidebar\",\n // },\n // });\n // }\n // }\n // }\n\n /**\n * If the plugin is disabled, we still want to keep added collections/fields so the database schema is consistent which is important for migrations.\n * If your plugin heavily modifies the database schema, you may want to remove this property.\n */\n if (pluginOptions.disabled) {\n return config;\n }\n\n if (!config.endpoints) {\n config.endpoints = [];\n }\n\n if (!config.admin) {\n config.admin = {};\n }\n\n if (!config.admin.components) {\n config.admin.components = {};\n }\n\n // if (!config.admin.components.beforeDashboard) {\n // config.admin.components.beforeDashboard = []\n // }\n\n // config.admin.components.beforeDashboard.push(\n // `payload-auth-rbac-plugin/rsc#BeforeDashboardServer`,\n // )\n\n // config.endpoints.push({\n // handler: customEndpointHandler,\n // method: \"get\",\n // path: \"/my-plugin-endpoint\",\n // })\n\n const incomingOnInit = config.onInit;\n\n config.onInit = async (payload) => {\n // Ensure we are executing any existing onInit functions before running our own.\n if (incomingOnInit) {\n await incomingOnInit(payload);\n }\n\n // const { totalDocs } = await payload.count({\n // collection: \"plugin-collection\",\n // where: {\n // id: {\n // equals: \"seeded-by-plugin\",\n // },\n // },\n // });\n\n // if (totalDocs === 0) {\n // await payload.create({\n // collection: \"plugin-collection\",\n // data: {\n // id: \"seeded-by-plugin\",\n // },\n // });\n // }\n };\n\n if (!config.i18n) {\n config.i18n = {};\n }\n const existingTranslations =\n (config.i18n?.translations as\n | Record<string, Record<string, unknown>>\n | undefined) || {};\n\n const defaultRBACTranslations = {\n en: {\n collections: {\n permissionActions: permissionActionsDefaultTranslations.en,\n permissionFeatures: permissionFeaturesDefaultTranslations.en,\n permissions: permissionsDefaultTranslations.en,\n roles: rolesDefaultTranslations.en,\n rolesPermissions: rolesPermissionsDefaultTranslations.en,\n users: usersDefaultTranslations.en,\n },\n components: {\n rolePermissionMatrix:\n rolePermissionMatrixClientDefaultTranslations.en,\n },\n },\n };\n\n const mergedRBACTranslations = getMergedTranslations({\n defaultTranslations: defaultRBACTranslations,\n translations: pluginOptions.translations,\n });\n\n const finalTranslations = getMergedTranslations({\n defaultTranslations: existingTranslations as Record<string, any>,\n translations: mergedRBACTranslations,\n });\n\n config.i18n = {\n ...config.i18n,\n translations: finalTranslations,\n };\n return config;\n };\n"],"names":["permissionActionsDefaultTranslations","getPermissionActionsCollection","permissionFeaturesDefaultTranslations","getPermissionFeaturesCollection","permissionsDefaultTranslations","getPermissionsCollection","rolesDefaultTranslations","getRolesCollection","rolesPermissionsDefaultTranslations","getRolesPermissionsCollection","usersDefaultTranslations","modifyUsersCollection","rolePermissionMatrixClientDefaultTranslations","getAllTranslationsOfSpecificObject","getMergedTranslations","payloadAuthRbacPlugin","pluginOptions","config","collections","translations","push","permissionActions","defaultTranslations","path","permissionFeatures","permissions","roles","rolesPermissions","autoModifyUsersCollection","disabled","endpoints","admin","components","incomingOnInit","onInit","payload","i18n","existingTranslations","defaultRBACTranslations","en","users","rolePermissionMatrix","mergedRBACTranslations","finalTranslations"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Config } from \"payload\";\nimport { permissionActionsDefaultTranslations } from \"./collections/permission-actions/default-data.js\";\nimport { getPermissionActionsCollection } from \"./collections/permission-actions/index.js\";\nimport { permissionFeaturesDefaultTranslations } from \"./collections/permission-features/default-data.js\";\nimport { getPermissionFeaturesCollection } from \"./collections/permission-features/index.js\";\nimport { permissionsDefaultTranslations } from \"./collections/permissions/default-data.js\";\nimport { getPermissionsCollection } from \"./collections/permissions/index.js\";\nimport { rolesDefaultTranslations } from \"./collections/roles/default-data.js\";\nimport { getRolesCollection } from \"./collections/roles/index.js\";\nimport { rolesPermissionsDefaultTranslations } from \"./collections/roles-permissions/default-data.js\";\nimport { getRolesPermissionsCollection } from \"./collections/roles-permissions/index.js\";\nimport { usersDefaultTranslations } from \"./collections/users/default-data.js\";\nimport { modifyUsersCollection } from \"./collections/users/index.js\";\nimport { rolePermissionMatrixClientDefaultTranslations } from \"./components/role-permission-matrix-client/default-data.js\";\n\nimport {\n getAllTranslationsOfSpecificObject,\n getMergedTranslations,\n} from \"./lib/utils/index.js\";\nimport type {\n PayloadAuthRbacPluginConfig,\n PermissionActionsCollectionTranslations,\n PermissionFeaturesCollectionTranslations,\n PermissionsCollectionTranslations,\n RolesCollectionTranslations,\n RolesPermissionsCollectionTranslations,\n UsersModificationTranslations,\n} from \"./types.js\";\n\nexport * from \"./lib/constants/index.js\";\nexport * from \"./lib/utils/index.js\";\nexport type * from \"./types.js\";\n\nexport const payloadAuthRbacPlugin =\n (pluginOptions: PayloadAuthRbacPluginConfig) =>\n (config: Config): Config => {\n if (!config.collections) {\n config.collections = [];\n }\n\n if (!pluginOptions.translations) {\n pluginOptions.translations = {};\n }\n\n config.collections.push(\n getPermissionActionsCollection({\n ...pluginOptions.collections?.permissionActions,\n translations: getMergedTranslations({\n defaultTranslations: permissionActionsDefaultTranslations,\n translations:\n getAllTranslationsOfSpecificObject<PermissionActionsCollectionTranslations>(\n {\n translations: pluginOptions.translations,\n path: \"collections.permissionActions\",\n },\n ),\n }),\n }),\n );\n config.collections.push(\n getPermissionFeaturesCollection({\n ...pluginOptions.collections?.permissionFeatures,\n translations: getMergedTranslations({\n defaultTranslations: permissionFeaturesDefaultTranslations,\n translations:\n getAllTranslationsOfSpecificObject<PermissionFeaturesCollectionTranslations>(\n {\n translations: pluginOptions.translations,\n path: \"collections.permissionFeatures\",\n },\n ),\n }),\n }),\n );\n config.collections.push(\n getPermissionsCollection({\n ...pluginOptions.collections?.permissions,\n translations: getMergedTranslations({\n defaultTranslations: permissionsDefaultTranslations,\n translations:\n getAllTranslationsOfSpecificObject<PermissionsCollectionTranslations>(\n {\n translations: pluginOptions.translations,\n path: \"collections.permissions\",\n },\n ),\n }),\n }),\n );\n config.collections.push(\n getRolesCollection({\n ...pluginOptions.collections?.roles,\n translations: getMergedTranslations({\n defaultTranslations: rolesDefaultTranslations,\n translations:\n getAllTranslationsOfSpecificObject<RolesCollectionTranslations>({\n translations: pluginOptions.translations,\n path: \"collections.roles\",\n }),\n }),\n }),\n );\n config.collections.push(\n getRolesPermissionsCollection({\n ...pluginOptions.collections?.rolesPermissions,\n translations: getMergedTranslations({\n defaultTranslations: rolesPermissionsDefaultTranslations,\n translations:\n getAllTranslationsOfSpecificObject<RolesPermissionsCollectionTranslations>(\n {\n translations: pluginOptions.translations,\n path: \"collections.rolesPermissions\",\n },\n ),\n }),\n }),\n );\n\n if (pluginOptions.autoModifyUsersCollection !== false) {\n config = modifyUsersCollection({\n translations: getMergedTranslations({\n defaultTranslations: usersDefaultTranslations,\n translations:\n getAllTranslationsOfSpecificObject<UsersModificationTranslations>({\n translations: pluginOptions.translations,\n path: \"collections.users\",\n }),\n }),\n })(config);\n }\n // if (pluginOptions.collections) {\n // for (const collectionSlug in pluginOptions.collections) {\n // const collection = config.collections.find(\n // (collection) => collection.slug === collectionSlug,\n // );\n\n // if (collection) {\n // collection.fields.push({\n // name: \"addedByPlugin\",\n // type: \"text\",\n // admin: {\n // position: \"sidebar\",\n // },\n // });\n // }\n // }\n // }\n\n /**\n * If the plugin is disabled, we still want to keep added collections/fields so the database schema is consistent which is important for migrations.\n * If your plugin heavily modifies the database schema, you may want to remove this property.\n */\n if (pluginOptions.disabled) {\n return config;\n }\n\n if (!config.endpoints) {\n config.endpoints = [];\n }\n\n if (!config.admin) {\n config.admin = {};\n }\n\n if (!config.admin.components) {\n config.admin.components = {};\n }\n\n // if (!config.admin.components.beforeDashboard) {\n // config.admin.components.beforeDashboard = []\n // }\n\n // config.admin.components.beforeDashboard.push(\n // `payload-auth-rbac-plugin/rsc#BeforeDashboardServer`,\n // )\n\n // config.endpoints.push({\n // handler: customEndpointHandler,\n // method: \"get\",\n // path: \"/my-plugin-endpoint\",\n // })\n\n const incomingOnInit = config.onInit;\n\n config.onInit = async (payload) => {\n // Ensure we are executing any existing onInit functions before running our own.\n if (incomingOnInit) {\n await incomingOnInit(payload);\n }\n\n // const { totalDocs } = await payload.count({\n // collection: \"plugin-collection\",\n // where: {\n // id: {\n // equals: \"seeded-by-plugin\",\n // },\n // },\n // });\n\n // if (totalDocs === 0) {\n // await payload.create({\n // collection: \"plugin-collection\",\n // data: {\n // id: \"seeded-by-plugin\",\n // },\n // });\n // }\n };\n\n if (!config.i18n) {\n config.i18n = {};\n }\n const existingTranslations =\n (config.i18n?.translations as\n | Record<string, Record<string, unknown>>\n | undefined) || {};\n\n const defaultRBACTranslations = {\n en: {\n collections: {\n permissionActions: permissionActionsDefaultTranslations.en,\n permissionFeatures: permissionFeaturesDefaultTranslations.en,\n permissions: permissionsDefaultTranslations.en,\n roles: rolesDefaultTranslations.en,\n rolesPermissions: rolesPermissionsDefaultTranslations.en,\n users: usersDefaultTranslations.en,\n },\n components: {\n rolePermissionMatrix:\n rolePermissionMatrixClientDefaultTranslations.en,\n },\n },\n };\n\n const mergedRBACTranslations = getMergedTranslations({\n defaultTranslations: defaultRBACTranslations,\n translations: pluginOptions.translations,\n });\n\n const finalTranslations = getMergedTranslations({\n defaultTranslations: existingTranslations as Record<string, any>,\n translations: mergedRBACTranslations,\n });\n\n config.i18n = {\n ...config.i18n,\n translations: finalTranslations,\n };\n return config;\n };\n"],"names":["permissionActionsDefaultTranslations","getPermissionActionsCollection","permissionFeaturesDefaultTranslations","getPermissionFeaturesCollection","permissionsDefaultTranslations","getPermissionsCollection","rolesDefaultTranslations","getRolesCollection","rolesPermissionsDefaultTranslations","getRolesPermissionsCollection","usersDefaultTranslations","modifyUsersCollection","rolePermissionMatrixClientDefaultTranslations","getAllTranslationsOfSpecificObject","getMergedTranslations","payloadAuthRbacPlugin","pluginOptions","config","collections","translations","push","permissionActions","defaultTranslations","path","permissionFeatures","permissions","roles","rolesPermissions","autoModifyUsersCollection","disabled","endpoints","admin","components","incomingOnInit","onInit","payload","i18n","existingTranslations","defaultRBACTranslations","en","users","rolePermissionMatrix","mergedRBACTranslations","finalTranslations"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -12,6 +12,12 @@ export * from "./collections/roles/types.js";
12
12
  export * from "./collections/roles-permissions/types.js";
13
13
  export * from "./collections/users/types.js";
14
14
  export * from "./components/role-permission-matrix-client/types.js";
15
+ export type ItemRef = number | string | {
16
+ id?: number | string;
17
+ };
18
+ export type ApiListResponse<T> = {
19
+ docs?: T[];
20
+ };
15
21
  export type RBACTranslations = {
16
22
  [locale: string]: {
17
23
  collections?: {
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts"],"sourcesContent":["// Collections types\nimport type * as PermissionActionTypes from \"./collections/permission-actions/types.js\";\nimport type * as PermissionFeatureTypes from \"./collections/permission-features/types.js\";\nimport type * as PermissionTypes from \"./collections/permissions/types.js\";\nimport type * as RoleTypes from \"./collections/roles/types.js\";\nimport type * as RolePermissionTypes from \"./collections/roles-permissions/types.js\";\nimport type * as UsersTypes from \"./collections/users/types.js\";\n\n// Components types\nimport type * as RolePermissionMatrixClientTypes from \"./components/role-permission-matrix-client/types.js\";\n\nexport * from \"./collections/permission-actions/types.js\";\nexport * from \"./collections/permission-features/types.js\";\nexport * from \"./collections/permissions/types.js\";\nexport * from \"./collections/roles/types.js\";\nexport * from \"./collections/roles-permissions/types.js\";\nexport * from \"./collections/users/types.js\";\nexport * from \"./components/role-permission-matrix-client/types.js\";\n\nexport type RBACTranslations = {\n [locale: string]: {\n // Collections types\n collections?: {\n permissionActions?: PermissionActionTypes.PermissionActionsCollectionTranslations[string];\n permissionFeatures?: PermissionFeatureTypes.PermissionFeaturesCollectionTranslations[string];\n permissions?: PermissionTypes.PermissionsCollectionTranslations[string];\n roles?: RoleTypes.RolesCollectionTranslations[string];\n rolesPermissions?: RolePermissionTypes.RolesPermissionsCollectionTranslations[string];\n users?: UsersTypes.UsersModificationTranslations[string];\n };\n // Components types\n components?: {\n rolePermissionMatrix?: RolePermissionMatrixClientTypes.RolePermissionMatrixClientTranslations[string];\n };\n };\n};\n\nexport type PayloadAuthRbacPluginConfig = {\n /**\n * Collection slugs to augment (may include plugin-only collections absent from generated `CollectionSlug`).\n */\n collections?: Partial<\n Record<\n string,\n | Omit<\n PermissionActionTypes.PermissionActionsCollectionParams,\n \"translations\"\n >\n | Omit<\n PermissionFeatureTypes.PermissionFeaturesCollectionParams,\n \"translations\"\n >\n | Omit<PermissionTypes.PermissionsCollectionParams, \"translations\">\n | Omit<RoleTypes.RolesCollectionParams, \"translations\">\n | Omit<\n RolePermissionTypes.RolesPermissionsCollectionParams,\n \"translations\"\n >\n >\n >;\n disabled?: boolean;\n translations?: RBACTranslations;\n autoModifyUsersCollection?: boolean;\n};\n"],"names":[],"mappings":"AAAA,oBAAoB;AAWpB,cAAc,4CAA4C;AAC1D,cAAc,6CAA6C;AAC3D,cAAc,qCAAqC;AACnD,cAAc,+BAA+B;AAC7C,cAAc,2CAA2C;AACzD,cAAc,+BAA+B;AAC7C,cAAc,sDAAsD"}
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["// Collections types\nimport type * as PermissionActionTypes from \"./collections/permission-actions/types.js\";\nimport type * as PermissionFeatureTypes from \"./collections/permission-features/types.js\";\nimport type * as PermissionTypes from \"./collections/permissions/types.js\";\nimport type * as RoleTypes from \"./collections/roles/types.js\";\nimport type * as RolePermissionTypes from \"./collections/roles-permissions/types.js\";\nimport type * as UsersTypes from \"./collections/users/types.js\";\n\n// Components types\nimport type * as RolePermissionMatrixClientTypes from \"./components/role-permission-matrix-client/types.js\";\n\nexport * from \"./collections/permission-actions/types.js\";\nexport * from \"./collections/permission-features/types.js\";\nexport * from \"./collections/permissions/types.js\";\nexport * from \"./collections/roles/types.js\";\nexport * from \"./collections/roles-permissions/types.js\";\nexport * from \"./collections/users/types.js\";\nexport * from \"./components/role-permission-matrix-client/types.js\";\n\nexport type ItemRef = number | string | { id?: number | string };\n\nexport type ApiListResponse<T> = {\n docs?: T[];\n};\n\nexport type RBACTranslations = {\n [locale: string]: {\n // Collections types\n collections?: {\n permissionActions?: PermissionActionTypes.PermissionActionsCollectionTranslations[string];\n permissionFeatures?: PermissionFeatureTypes.PermissionFeaturesCollectionTranslations[string];\n permissions?: PermissionTypes.PermissionsCollectionTranslations[string];\n roles?: RoleTypes.RolesCollectionTranslations[string];\n rolesPermissions?: RolePermissionTypes.RolesPermissionsCollectionTranslations[string];\n users?: UsersTypes.UsersModificationTranslations[string];\n };\n // Components types\n components?: {\n rolePermissionMatrix?: RolePermissionMatrixClientTypes.RolePermissionMatrixClientTranslations[string];\n };\n };\n};\n\nexport type PayloadAuthRbacPluginConfig = {\n /**\n * Collection slugs to augment (may include plugin-only collections absent from generated `CollectionSlug`).\n */\n collections?: Partial<\n Record<\n string,\n | Omit<\n PermissionActionTypes.PermissionActionsCollectionParams,\n \"translations\"\n >\n | Omit<\n PermissionFeatureTypes.PermissionFeaturesCollectionParams,\n \"translations\"\n >\n | Omit<PermissionTypes.PermissionsCollectionParams, \"translations\">\n | Omit<RoleTypes.RolesCollectionParams, \"translations\">\n | Omit<\n RolePermissionTypes.RolesPermissionsCollectionParams,\n \"translations\"\n >\n >\n >;\n disabled?: boolean;\n translations?: RBACTranslations;\n autoModifyUsersCollection?: boolean;\n};\n"],"names":[],"mappings":"AAAA,oBAAoB;AAWpB,cAAc,4CAA4C;AAC1D,cAAc,6CAA6C;AAC3D,cAAc,qCAAqC;AACnD,cAAc,+BAA+B;AAC7C,cAAc,2CAA2C;AACzD,cAAc,+BAA+B;AAC7C,cAAc,sDAAsD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zealamic/payload-auth-rbac-plugin",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "A plugin for Payload CMS to manage authentication and authorization",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -27,33 +27,37 @@
27
27
  ],
28
28
  "exports": {
29
29
  ".": {
30
- "default": "./src/index.ts"
30
+ "types": "./dist/index.d.ts",
31
+ "import": "./dist/index.js",
32
+ "default": "./dist/index.js"
31
33
  },
32
34
  "./client": {
33
- "default": "./src/exports/client.ts"
35
+ "types": "./dist/exports/client.d.ts",
36
+ "import": "./dist/exports/client.js",
37
+ "default": "./dist/exports/client.js"
34
38
  },
35
39
  "./rsc": {
36
- "default": "./src/exports/rsc.ts"
37
- },
38
- "./types": {
39
- "default": "./src/types.ts"
40
+ "types": "./dist/exports/rsc.d.ts",
41
+ "import": "./dist/exports/rsc.js",
42
+ "default": "./dist/exports/rsc.js"
40
43
  },
41
44
  "./utils": {
42
- "default": "./src/lib/utils/index.ts"
45
+ "types": "./dist/lib/utils/index.d.ts",
46
+ "import": "./dist/lib/utils/index.js",
47
+ "default": "./dist/lib/utils/index.js"
43
48
  }
44
49
  },
45
- "main": "./src/index.ts",
46
- "types": "./src/general.d.ts",
50
+ "main": "./dist/index.js",
51
+ "types": "./dist/general-types.d.ts",
47
52
  "files": [
48
- "dist",
49
- "docs",
50
- "assets"
53
+ "dist"
51
54
  ],
52
55
  "scripts": {
53
56
  "copy:styles": "node -e \"require('fs').cpSync('src/styles', 'dist/styles', {recursive:true})\"",
54
- "build": "yarn copyfiles && yarn build:types && yarn build:swc && yarn copy:styles",
57
+ "copy:general-types": "node -e \"require('fs').cpSync('src/general-types.d.ts', 'dist/general-types.d.ts', {recursive:true})\"",
58
+ "build": "yarn copyfiles && yarn build:types && yarn build:swc && yarn copy:styles && yarn copy:general-types",
55
59
  "build:swc": "swc ./src -d ./dist --config-file .swcrc --strip-leading-paths",
56
- "build:types": "tsc --outDir dist --rootDir ./src",
60
+ "build:types": "tsc --project tsconfig.build.json",
57
61
  "clean": "rimraf {dist,*.tsbuildinfo}",
58
62
  "copyfiles": "copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/",
59
63
  "dev": "next dev dev --turbo",
@@ -64,6 +68,7 @@
64
68
  "generate:types": "yarn dev:generate-types",
65
69
  "lint": "biome check",
66
70
  "lint:fix": "biome check --write",
71
+ "prepublishOnly": "yarn clean && yarn build",
67
72
  "test": "yarn test:int && yarn test:e2e",
68
73
  "test:e2e": "playwright test",
69
74
  "test:int": "vitest"
@@ -108,31 +113,7 @@
108
113
  "node": "^18.20.2 || >=20.9.0"
109
114
  },
110
115
  "publishConfig": {
111
- "access": "public",
112
- "main": "./dist/index.js",
113
- "types": "./dist/index.d.ts",
114
- "exports": {
115
- ".": {
116
- "types": "./dist/index.d.ts",
117
- "default": "./dist/index.js"
118
- },
119
- "./client": {
120
- "types": "./dist/exports/client.d.ts",
121
- "default": "./dist/exports/client.js"
122
- },
123
- "./rsc": {
124
- "types": "./dist/exports/rsc.d.ts",
125
- "default": "./dist/exports/rsc.js"
126
- },
127
- "./types": {
128
- "types": "./dist/types.d.ts",
129
- "default": "./dist/types.js"
130
- },
131
- "./utils": {
132
- "types": "./dist/lib/utils/index.d.ts",
133
- "default": "./dist/lib/utils/index.js"
134
- }
135
- }
116
+ "access": "public"
136
117
  },
137
118
  "registry": "https://registry.npmjs.org/",
138
119
  "dependencies": {}
Binary file