@firecms/user_management 3.0.0-canary.23 → 3.0.0-canary.231
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/LICENSE +114 -21
- package/README.md +2 -2
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/{useBuildFirestoreUserManagement.d.ts → useBuildUserManagement.d.ts} +11 -12
- package/dist/index.es.js +2178 -1216
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +2254 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/types/user_management.d.ts +6 -12
- package/dist/useUserManagementPlugin.d.ts +8 -3
- package/dist/utils/permissions.d.ts +2 -2
- package/package.json +14 -28
- package/src/components/roles/RolesDetailsForm.tsx +81 -33
- package/src/components/roles/RolesTable.tsx +6 -4
- package/src/components/roles/RolesView.tsx +9 -15
- package/src/components/users/UserDetailsForm.tsx +18 -19
- package/src/components/users/UsersTable.tsx +6 -6
- package/src/components/users/UsersView.tsx +1 -4
- package/src/hooks/index.ts +1 -1
- package/src/hooks/useBuildUserManagement.tsx +333 -0
- package/src/types/user_management.tsx +7 -13
- package/src/useUserManagementPlugin.tsx +89 -3
- package/src/utils/permissions.ts +9 -8
- package/src/hooks/useBuildFirestoreUserManagement.tsx +0 -271
package/dist/index.umd.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/utils/permissions.ts","../src/utils/local_storage.ts","../src/utils/colors.ts","../src/hooks/useBuildFirestoreUserManagement.tsx","../src/UserManagementProvider.tsx","../src/hooks/useUserManagement.tsx","../src/components/roles/RoleChip.tsx","../src/components/roles/RolesDetailsForm.tsx","../src/components/roles/default_roles.tsx","../src/components/roles/RolesTable.tsx","../src/components/roles/RolesView.tsx","../src/components/users/UserDetailsForm.tsx","../src/components/users/UsersTable.tsx","../src/components/users/UsersView.tsx","../src/useUserManagementPlugin.tsx","../src/admin_views.tsx"],"sourcesContent":["import { EntityCollection, Permissions, Role, User } from \"@firecms/core\";\n\nexport const RESERVED_GROUPS = [\"Admin\"];\n\nconst DEFAULT_PERMISSIONS = {\n read: false,\n edit: false,\n create: false,\n delete: false\n};\n\nexport function resolveUserRolePermissions<UserType extends User>\n({\n collection,\n user\n }: {\n collection: EntityCollection<any>,\n user: UserType | null\n}): Permissions {\n\n const roles = user?.roles;\n if (!roles) {\n return DEFAULT_PERMISSIONS;\n } else if (collection.ownerId === user?.uid) {\n return {\n read: true,\n create: true,\n edit: true,\n delete: true\n };\n } else {\n const basePermissions = {\n read: false,\n create: false,\n edit: false,\n delete: false\n };\n\n return roles\n .map(role => resolveCollectionRole(role, collection.id))\n .reduce(mergePermissions, basePermissions);\n }\n}\n\nfunction resolveCollectionRole(role: Role, id: string): Permissions {\n\n const basePermissions = {\n read: role.isAdmin || role.defaultPermissions?.read,\n create: role.isAdmin || role.defaultPermissions?.create,\n edit: role.isAdmin || role.defaultPermissions?.edit,\n delete: role.isAdmin || role.defaultPermissions?.delete\n };\n if (role.collectionPermissions && role.collectionPermissions[id]) {\n return mergePermissions(role.collectionPermissions[id], basePermissions);\n } else if (role.defaultPermissions) {\n return mergePermissions(role.defaultPermissions, basePermissions);\n } else {\n return basePermissions;\n }\n}\n\nconst mergePermissions = (permA: Permissions, permB: Permissions) => {\n return {\n read: permA.read || permB.read,\n create: permA.create || permB.create,\n edit: permA.edit || permB.edit,\n delete: permA.delete || permB.delete\n };\n}\n\nexport function getUserRoles(roles: Role[], fireCMSUser: User): Role[] | undefined {\n return !roles\n ? undefined\n : (fireCMSUser.roles\n ? fireCMSUser.roles\n .map(role => roles.find((r) => r.id === role.id))\n .filter(Boolean) as Role[]\n : []);\n}\n\nexport const areRolesEqual = (rolesA: Role[], rolesB: Role[]) => {\n const rolesAIds = rolesA.map(r => r.id);\n const rolesBIds = rolesB.map(r => r.id);\n return rolesAIds.length === rolesB.length && rolesAIds.every((role) => rolesBIds.includes(role));\n}\n","// const tokens = new Map<string, {\n// token: string,\n// expiry: Date\n// }>();\n\nexport function cacheDelegatedLoginToken(projectId: string, delegatedToken?: string) {\n if (!delegatedToken) {\n return;\n }\n\n const data = parseJwt(delegatedToken);\n // @ts-ignore\n const expiry = new Date(data.exp * 1000);\n localStorage.setItem(`auth_token::${projectId}`, JSON.stringify({\n token: delegatedToken,\n expiry\n }));\n\n}\n\nexport function getDelegatedLoginTokenFromCache(projectId: string) {\n const entry = localStorage.getItem(`auth_token::${projectId}`);\n if (entry) {\n const data = JSON.parse(entry);\n data.expiry = new Date(data.expiry);\n if (data.expiry > new Date()) {\n return data.token;\n }\n }\n return undefined;\n}\n\nexport function clearDelegatedLoginTokensCache() {\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(\"auth_token::\")) {\n localStorage.removeItem(key);\n }\n }\n}\n\nfunction parseJwt(token?: string): object {\n if (!token) {\n throw new Error(\"No JWT token\");\n }\n const base64Url = token.split(\".\")[1];\n const base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const jsonPayload = decodeURIComponent(window.atob(base64).split(\"\").map(function (c) {\n return \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2);\n }).join(\"\"));\n\n return JSON.parse(jsonPayload);\n}\n","export function darkenColor(hexColor: string, darkenBy = 10): string {\n // Check input validity\n if (!/^#([0-9A-Fa-f]{3}){1,2}$/.test(hexColor)) {\n throw new Error(\"Invalid color format\");\n }\n\n // If shorthand form, convert to full form\n let color = hexColor.substring(1).split(\"\");\n if (color.length === 3) {\n color = [color[0], color[0], color[1], color[1], color[2], color[2]];\n }\n\n // Convert to RGB values\n let r = parseInt(color[0] + color[1], 16);\n let g = parseInt(color[2] + color[3], 16);\n let b = parseInt(color[4] + color[5], 16);\n\n // Reduce each color component by the specified percentage (darkenBy)\n r = Math.floor(r * (1 - darkenBy / 100));\n g = Math.floor(g * (1 - darkenBy / 100));\n b = Math.floor(b * (1 - darkenBy / 100));\n\n // Recombine into hex and return\n return \"#\" +\n (r < 16 ? \"0\" : \"\") + r.toString(16) +\n (g < 16 ? \"0\" : \"\") + g.toString(16) +\n (b < 16 ? \"0\" : \"\") + b.toString(16);\n}\n\nexport function hexToRgbaWithOpacity(hexColor: string, opacity = 10): string {\n // Check input validity\n if (!/^#([0-9A-Fa-f]{3}){1,2}$/.test(hexColor)) {\n throw new Error(\"Invalid color format\");\n }\n\n // If shorthand form, convert to full form\n let color = hexColor.substring(1).split(\"\");\n if (color.length === 3) {\n color = [color[0], color[0], color[1], color[1], color[2], color[2]];\n }\n\n // Convert to RGB values\n const r = parseInt(color[0] + color[1], 16);\n const g = parseInt(color[2] + color[3], 16);\n const b = parseInt(color[4] + color[5], 16);\n\n // Convert opacity to a decimal for CSS\n const alpha = opacity / 100;\n\n // Construct and return the RGBA color\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n","import React, { useCallback, useEffect, useRef } from \"react\";\nimport {\n addDoc,\n collection,\n deleteDoc,\n doc,\n DocumentSnapshot,\n Firestore,\n getFirestore,\n onSnapshot,\n setDoc\n} from \"firebase/firestore\";\nimport { FirebaseApp } from \"firebase/app\";\nimport { UserManagement } from \"../types\";\nimport { Authenticator, PermissionsBuilder, Role, User } from \"@firecms/core\";\nimport { resolveUserRolePermissions } from \"../utils\";\n\ntype UserWithRoleIds = User & { roles: string[] };\n\nexport interface UserManagementParams {\n /**\n * The Firebase app to use for the user management. The config will be saved in the Firestore\n * collection indicated by `configPath`.\n */\n firebaseApp?: FirebaseApp;\n /**\n * Path where the plugin users configuration is stored.\n * Default: __FIRECMS/config/users\n * You can specify a different path if you want to store the user management configuration in a different place.\n * Please keep in mind that the FireCMS users are not necessarily the same as the Firebase users (but they can be).\n * The path should be relative to the root of the Firestore database, and should always have an odd number of segments.\n */\n usersPath?: string;\n\n /**\n * Path where the plugin roles configuration is stored.\n * Default: __FIRECMS/config/roles\n */\n rolesPath?: string;\n\n usersLimit?: number;\n\n canEditRoles?: boolean;\n\n /**\n * If there are no roles in the database, provide a button to create the default roles.\n */\n allowDefaultRolesCreation?: boolean;\n\n /**\n * Include the collection config permissions in the user management system.\n */\n includeCollectionConfigPermissions?: boolean;\n\n}\n\n/**\n * This hook is used to build a user management object that can be used to\n * manage users and roles in a Firestore backend.\n * @param backendFirebaseApp\n * @param usersPath\n * @param rolesPath\n * @param usersLimit\n * @param canEditRoles\n */\nexport function useBuildFirestoreUserManagement({\n firebaseApp,\n usersPath = \"__FIRECMS/config/users\",\n rolesPath = \"__FIRECMS/config/roles\",\n usersLimit,\n canEditRoles = true,\n allowDefaultRolesCreation,\n includeCollectionConfigPermissions\n }: UserManagementParams): UserManagement {\n\n const firestoreRef = useRef<Firestore>();\n\n const [rolesLoading, setRolesLoading] = React.useState<boolean>(true);\n const [usersLoading, setUsersLoading] = React.useState<boolean>(true);\n const [roles, setRoles] = React.useState<Role[]>([]);\n const [usersWithRoleIds, setUsersWithRoleIds] = React.useState<UserWithRoleIds[]>([]);\n\n const users = usersWithRoleIds.map(u => ({\n ...u,\n roles: roles.filter(r => u.roles?.includes(r.id))\n }) as User);\n\n const [rolesError, setRolesError] = React.useState<Error | undefined>();\n const [usersError, setUsersError] = React.useState<Error | undefined>();\n\n const loading = rolesLoading || usersLoading;\n\n useEffect(() => {\n if (!firebaseApp) return;\n firestoreRef.current = getFirestore(firebaseApp);\n }, [firebaseApp]);\n\n useEffect(() => {\n if (!firebaseApp || !rolesPath) return;\n const firestore = getFirestore(firebaseApp);\n\n return onSnapshot(collection(firestore, rolesPath),\n {\n next: (snapshot) => {\n setRolesError(undefined);\n try {\n const newRoles = docsToRoles(snapshot.docs);\n setRoles(newRoles);\n } catch (e) {\n // console.error(e);\n setRolesError(e as Error);\n }\n setRolesLoading(false);\n },\n error: (e) => {\n setRolesError(e);\n setRolesLoading(false);\n }\n }\n );\n }, [firebaseApp, rolesPath]);\n\n useEffect(() => {\n if (!firebaseApp || !usersPath) return;\n const firestore = getFirestore(firebaseApp);\n\n return onSnapshot(collection(firestore, usersPath),\n {\n next: (snapshot) => {\n setUsersError(undefined);\n try {\n const newUsers = docsToUsers(snapshot.docs);\n setUsersWithRoleIds(newUsers);\n } catch (e) {\n setUsersError(e as Error);\n }\n setUsersLoading(false);\n },\n error: (e) => {\n setUsersError(e);\n setUsersLoading(false);\n }\n }\n );\n }, [firebaseApp, usersPath]);\n\n const saveUser = useCallback(async (user: User): Promise<User> => {\n const firestore = firestoreRef.current;\n if (!firestore || !usersPath) throw Error(\"useFirestoreConfigurationPersistence Firestore not initialised\");\n console.debug(\"Persisting user\", user);\n const roleIds = user.roles?.map(r => r.id);\n const {\n uid,\n ...userData\n } = user;\n const data = {\n ...userData,\n roles: roleIds\n };\n if (uid) {\n return setDoc(doc(firestore, usersPath, uid), data, { merge: true }).then(() => user);\n } else {\n return addDoc(collection(firestore, usersPath), data).then(() => user);\n }\n }, [usersPath]);\n\n const saveRole = useCallback((role: Role): Promise<void> => {\n const firestore = firestoreRef.current;\n if (!firestore || !rolesPath) throw Error(\"useFirestoreConfigurationPersistence Firestore not initialised\");\n console.debug(\"Persisting role\", role);\n const {\n id,\n ...roleData\n } = role;\n const ref = doc(firestore, rolesPath, id);\n return setDoc(ref, roleData, { merge: true });\n }, [rolesPath]);\n\n const deleteUser = useCallback(async (user: User): Promise<void> => {\n const firestore = firestoreRef.current;\n if (!firestore || !usersPath) throw Error(\"useFirestoreConfigurationPersistence Firestore not initialised\");\n console.debug(\"Deleting\", user);\n const { uid } = user;\n return deleteDoc(doc(firestore, usersPath, uid));\n }, [usersPath]);\n\n const deleteRole = useCallback((role: Role): Promise<void> => {\n const firestore = firestoreRef.current;\n if (!firestore || !rolesPath) throw Error(\"useFirestoreConfigurationPersistence Firestore not initialised\");\n console.debug(\"Deleting\", role);\n const { id } = role;\n const ref = doc(firestore, rolesPath, id);\n return deleteDoc(ref);\n }, [rolesPath]);\n\n const collectionPermissions: PermissionsBuilder = useCallback(({\n collection,\n user\n }) => resolveUserRolePermissions({\n collection,\n user\n }), []);\n\n const userIds = users.map(u => u.uid);\n const defineRolesFor: ((user: User) => Role[] | undefined) = useCallback((user) => {\n if (!users) throw Error(\"Users not loaded\");\n const mgmtUser = users.find(u => u.email?.toLowerCase() === user?.email?.toLowerCase());\n return mgmtUser?.roles;\n }, [userIds]);\n\n const authenticator: Authenticator = useCallback(({ user }) => {\n console.log(\"Authenticating user\", user);\n // return true;\"\n\n // console.log(\"authentication\", user, userManagement);\n if (loading) {\n console.log(\"User management is still loading\");\n return false;\n }\n\n // This is an example of how you can link the access system to the user management plugin\n if (users.length === 0) {\n return true; // If there are no users created yet, we allow access to every user\n }\n\n const mgmtUser = users.find(u => u.email?.toLowerCase() === user?.email?.toLowerCase());\n if (mgmtUser) {\n // authController.setRoles(mgmtUser.roles ?? [])\n return true;\n }\n\n throw Error(\"Could not find a user with the provided email\");\n }, [loading, users])\n\n return {\n loading,\n roles,\n users,\n saveUser,\n saveRole,\n deleteUser,\n deleteRole,\n usersLimit,\n canEditRoles: canEditRoles === undefined ? true : canEditRoles,\n allowDefaultRolesCreation: allowDefaultRolesCreation === undefined ? true : allowDefaultRolesCreation,\n includeCollectionConfigPermissions: Boolean(includeCollectionConfigPermissions),\n collectionPermissions,\n defineRolesFor,\n authenticator\n }\n}\n\nconst docsToUsers = (docs: DocumentSnapshot[]): (UserWithRoleIds)[] => {\n return docs.map((doc) => {\n const data = doc.data() as any;\n const newVar = {\n uid: doc.id,\n ...data,\n created_on: data?.created_on?.toDate(),\n updated_on: data?.updated_on?.toDate()\n };\n return newVar as (UserWithRoleIds);\n });\n}\n\nconst docsToRoles = (docs: DocumentSnapshot[]): Role[] => {\n return docs.map((doc) => ({\n id: doc.id,\n ...doc.data()\n } as Role));\n}\n","import React, { PropsWithChildren } from \"react\";\nimport { UserManagement } from \"./types\";\nimport { User } from \"@firecms/core\";\n\nexport const UserManagementContext = React.createContext<UserManagement<any>>({} as any);\n\nexport interface UserManagementProviderProps<U extends User = User> {\n userManagement: UserManagement<U>\n}\n\nexport function UserManagementProvider<U extends User = User>({\n children,\n userManagement\n }: PropsWithChildren<UserManagementProviderProps<U>>) {\n return (\n <UserManagementContext.Provider value={userManagement}>\n {children}\n </UserManagementContext.Provider>\n );\n};\n","import { useContext } from \"react\";\nimport { UserManagement } from \"../types\";\nimport { UserManagementContext } from \"../UserManagementProvider\";\nimport { User } from \"@firecms/core\";\nexport const useUserManagement = <USER extends User>() => useContext<UserManagement<USER>>(UserManagementContext);\n","import { Chip, getColorSchemeForSeed } from \"@firecms/ui\";\nimport { Role } from \"@firecms/core\";\n\nexport type RoleChipProps = {\n role: Role;\n}\n\nexport function RoleChip({ role }: RoleChipProps) {\n let colorScheme;\n if (role.isAdmin) {\n colorScheme = \"blueDarker\";\n } else if (role.id === \"editor\") {\n colorScheme = \"yellowLight\";\n } else if (role.id === \"viewer\") {\n colorScheme = \"grayLight\";\n } else {\n colorScheme = getColorSchemeForSeed(role.id);\n }\n\n return (\n <Chip\n colorScheme={colorScheme}\n key={role.id}>\n {role.name}\n </Chip>\n );\n\n}\n","import React, { useCallback, useState } from \"react\";\nimport * as Yup from \"yup\";\n\nimport { EntityCollection, FieldCaption, Role, toSnakeCase, } from \"@firecms/core\";\nimport {\n Button,\n Checkbox,\n Dialog,\n DialogActions,\n DialogContent,\n DoneIcon,\n LoadingButton,\n Paper,\n Select,\n SelectItem,\n Table,\n TableBody,\n TableCell,\n TableHeader,\n TableRow,\n TextField,\n Tooltip,\n Typography\n} from \"@firecms/ui\";\nimport { useUserManagement } from \"../../hooks\";\nimport { Formex, getIn, useCreateFormex } from \"@firecms/formex\";\n\nexport const RoleYupSchema = Yup.object().shape({\n id: Yup.string().required(\"Required\"),\n name: Yup.string().required(\"Required\")\n});\n\nexport function RolesDetailsForm({\n open,\n role,\n editable,\n handleClose,\n collections\n }: {\n open: boolean,\n editable?: boolean,\n role?: Role,\n handleClose: () => void,\n collections?: EntityCollection[]\n}) {\n\n const { saveRole } = useUserManagement();\n const isNewRole = !role;\n\n const [savingError, setSavingError] = useState<Error | undefined>();\n\n const onRoleUpdated = useCallback((role: Role) => {\n setSavingError(undefined);\n return saveRole(role);\n }, [saveRole]);\n\n const formex = useCreateFormex({\n initialValues: role ?? {\n name: \"\"\n } as Role,\n onSubmit: (role: Role, formexController) => {\n return onRoleUpdated(role)\n .then(() => {\n formexController.resetForm({\n values: role\n });\n handleClose();\n })\n .catch(e => setSavingError(e));\n },\n validation: (values) => {\n return RoleYupSchema.validate(values, { abortEarly: false })\n .then(() => ({}))\n .catch((e) => {\n const errors: Record<string, string> = {};\n e.inner.forEach((error: any) => {\n errors[error.path] = error.message;\n });\n return errors;\n });\n }\n\n });\n\n const {\n isSubmitting,\n touched,\n values,\n errors,\n handleChange,\n setFieldValue,\n dirty,\n setFieldTouched\n } = formex;\n\n const isAdmin = values.isAdmin ?? false;\n const defaultCreate = values.defaultPermissions?.create ?? false;\n const defaultRead = values.defaultPermissions?.read ?? false;\n const defaultEdit = values.defaultPermissions?.edit ?? false;\n const defaultDelete = values.defaultPermissions?.delete ?? false;\n\n React.useEffect(() => {\n const idTouched = getIn(touched, \"id\");\n if (!idTouched && values.name) {\n setFieldValue(\"id\", toSnakeCase(values.name))\n }\n }, [touched, values.name]);\n\n return (\n <Dialog\n open={open}\n maxWidth={\"4xl\"}\n >\n <Formex value={formex}>\n <form noValidate\n autoComplete={\"off\"}\n onSubmit={formex.handleSubmit}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n position: \"relative\",\n height: \"100%\"\n }}>\n <DialogContent className=\"flex-grow\">\n <div\n className=\"flex flex-row pt-12 pb-8\">\n <Typography variant={\"h4\"}\n className=\"flex-grow\">\n Role\n </Typography>\n </div>\n\n <div className={\"grid grid-cols-12 gap-8\"}>\n\n <div className={\"col-span-12 md:col-span-8\"}>\n <TextField\n name=\"name\"\n required\n error={touched.name && Boolean(errors.name)}\n value={values.name}\n disabled={isAdmin || !editable}\n onChange={handleChange}\n aria-describedby=\"name-helper-text\"\n label=\"Name\"\n />\n <FieldCaption>\n {touched.name && Boolean(errors.name) ? errors.name : \"Name of this role\"}\n </FieldCaption>\n </div>\n\n <div className={\"col-span-12 md:col-span-4\"}>\n <TextField\n name=\"id\"\n required\n error={touched.id && Boolean(errors.id)}\n value={values.id}\n disabled={!isNewRole || !editable}\n onChange={(e) => {\n handleChange(e);\n setFieldTouched(\"id\", true)\n }}\n aria-describedby=\"id-helper-text\"\n label=\"ID\"\n />\n <FieldCaption>\n {touched.id && Boolean(errors.id) ? errors.id : \"ID of this role\"}\n </FieldCaption>\n </div>\n\n <div className={\"col-span-12\"}>\n <Paper\n\n className=\"bg-inherit\">\n <Table>\n <TableHeader>\n <TableCell></TableCell>\n <TableCell\n align=\"center\">Create\n entities\n </TableCell>\n <TableCell\n align=\"center\">Read\n entities\n </TableCell>\n <TableCell\n align=\"center\">Update\n entities\n </TableCell>\n <TableCell\n align=\"center\">Delete\n entities\n </TableCell>\n </TableHeader>\n\n <TableBody>\n <TableRow>\n <TableCell\n scope=\"row\">\n <strong>All\n collections</strong>\n </TableCell>\n <TableCell\n align=\"center\">\n <Tooltip\n title=\"Create entities in collections\">\n <Checkbox\n disabled={isAdmin || !editable}\n checked={(isAdmin || defaultCreate) ?? false}\n onCheckedChange={(checked) => setFieldValue(\"defaultPermissions.create\", checked)}\n />\n </Tooltip>\n </TableCell>\n\n <TableCell\n align=\"center\">\n <Tooltip\n title=\"Access all data in every collection\">\n <Checkbox\n disabled={isAdmin || !editable}\n checked={(isAdmin || defaultRead) ?? false}\n onCheckedChange={(checked) => setFieldValue(\"defaultPermissions.read\", checked)}\n />\n </Tooltip>\n </TableCell>\n <TableCell\n align=\"center\">\n <Tooltip\n title=\"Update data in any collection\">\n <Checkbox\n disabled={isAdmin || !editable}\n checked={(isAdmin || defaultEdit) ?? false}\n onCheckedChange={(checked) => setFieldValue(\"defaultPermissions.edit\", checked)}\n />\n </Tooltip>\n </TableCell>\n <TableCell\n align=\"center\">\n <Tooltip\n title=\"Delete data in any collection\">\n <Checkbox\n disabled={isAdmin || !editable}\n checked={(isAdmin || defaultDelete) ?? false}\n onCheckedChange={(checked) => setFieldValue(\"defaultPermissions.delete\", checked)}\n />\n\n </Tooltip>\n </TableCell>\n </TableRow>\n {collections && collections.map((col) => (\n <TableRow key={col.name}>\n <TableCell\n scope=\"row\">\n {col.name}\n </TableCell>\n <TableCell\n align=\"center\">\n <Checkbox\n disabled={isAdmin || defaultCreate || !editable}\n checked={(isAdmin || defaultCreate || getIn(values, `collectionPermissions.${col.path}.create`)) ?? false}\n onCheckedChange={(checked) => setFieldValue(`collectionPermissions.${col.path}.create`, checked)}/>\n </TableCell>\n <TableCell\n align=\"center\">\n <Checkbox\n disabled={isAdmin || defaultRead || !editable}\n checked={(isAdmin || defaultRead || getIn(values, `collectionPermissions.${col.path}.read`)) ?? false}\n onCheckedChange={(checked) => setFieldValue(`collectionPermissions.${col.path}.read`, checked)}/>\n </TableCell>\n <TableCell\n align=\"center\">\n <Checkbox\n disabled={isAdmin || defaultEdit || !editable}\n checked={(isAdmin || defaultEdit || getIn(values, `collectionPermissions.${col.path}.edit`)) ?? false}\n onCheckedChange={(checked) => setFieldValue(`collectionPermissions.${col.path}.edit`, checked)}/>\n </TableCell>\n <TableCell\n align=\"center\">\n <Checkbox\n disabled={isAdmin || defaultDelete || !editable}\n checked={(isAdmin || defaultDelete || getIn(values, `collectionPermissions.${col.path}.delete`)) ?? false}\n onCheckedChange={(checked) => setFieldValue(`collectionPermissions.${col.path}.delete`, checked)}/>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </Paper>\n <FieldCaption>\n You can customise the permissions\n that the users related to this\n role can perform in the entities\n of each collection\n </FieldCaption>\n </div>\n\n <div className={\"col-span-12 md:col-span-4\"}>\n <Select\n error={touched.config && Boolean(errors.config)}\n id=\"createCollections\"\n name=\"createCollections\"\n label=\"Create collections\"\n position={\"item-aligned\"}\n disabled={isAdmin || !editable}\n onChange={(event) => setFieldValue(\"config.createCollections\", event.target.value === \"true\")}\n value={isAdmin || values.config?.createCollections ? \"true\" : \"false\"}\n renderValue={(value: any) => value === \"true\" ? \"Yes\" : \"No\"}\n >\n <SelectItem\n value={\"true\"}> Yes </SelectItem>\n <SelectItem\n value={\"false\"}> No </SelectItem>\n </Select>\n\n <FieldCaption>\n {touched.config && Boolean(errors.config) ? errors.config : \"Can the user create collections\"}\n </FieldCaption>\n </div>\n\n <div className={\"col-span-12 md:col-span-4\"}>\n <Select\n error={touched.config && Boolean(errors.config)}\n id=\"editCollections\"\n name=\"editCollections\"\n label=\"Edit collections\"\n disabled={isAdmin || !editable}\n position={\"item-aligned\"}\n onChange={(event) => setFieldValue(\"config.editCollections\", event.target.value === \"own\" ? \"own\" : event.target.value === \"true\")}\n value={isAdmin ? \"true\" : (values.config?.editCollections === \"own\" ? \"own\" : (values.config?.editCollections ? \"true\" : \"false\"))}\n renderValue={(value: any) => value === \"own\" ? \"Own\" : (value === \"true\" ? \"Yes\" : \"No\")}\n >\n <SelectItem\n value={\"true\"}> Yes </SelectItem>\n <SelectItem\n value={\"false\"}> No </SelectItem>\n <SelectItem\n value={\"own\"}> Only\n his/her own </SelectItem>\n </Select>\n\n <FieldCaption>\n {touched.config && Boolean(errors.config) ? errors.config : \"Can the user edit collections\"}\n </FieldCaption>\n </div>\n\n <div className={\"col-span-12 md:col-span-4\"}>\n <Select\n error={touched.config && Boolean(errors.config)}\n id=\"deleteCollections\"\n name=\"deleteCollections\"\n label=\"Delete collections\"\n disabled={isAdmin || !editable}\n position={\"item-aligned\"}\n onChange={(event) => setFieldValue(\"config.deleteCollections\", event.target.value === \"own\" ? \"own\" : event.target.value === \"true\")}\n value={isAdmin ? \"true\" : (values.config?.deleteCollections === \"own\" ? \"own\" : (values.config?.deleteCollections ? \"true\" : \"false\"))}\n renderValue={(value: any) => value === \"own\" ? \"Own\" : (value === \"true\" ? \"Yes\" : \"No\")}\n >\n <SelectItem\n value={\"true\"}> Yes </SelectItem>\n <SelectItem\n value={\"false\"}> No </SelectItem>\n <SelectItem\n value={\"own\"}> Only\n his/her own </SelectItem>\n </Select>\n\n <FieldCaption>\n {touched.config && Boolean(errors.config) ? errors.config : \"Can the user delete collections\"}\n </FieldCaption>\n\n </div>\n\n </div>\n </DialogContent>\n\n <DialogActions position={\"sticky\"}>\n {savingError && <Typography className={\"text-red-500\"}>\n There was an error saving this role\n </Typography>}\n <Button variant={\"text\"}\n onClick={() => {\n handleClose();\n }}>\n Cancel\n </Button>\n <LoadingButton\n variant=\"filled\"\n color=\"primary\"\n type=\"submit\"\n disabled={!dirty}\n loading={isSubmitting}\n startIcon={<DoneIcon/>}\n >\n {isNewRole ? \"Create role\" : \"Update\"}\n </LoadingButton>\n </DialogActions>\n </form>\n\n </Formex>\n </Dialog>\n );\n}\n","import { Role } from \"@firecms/core\";\n\nexport const DEFAULT_ROLES: Role[] = [\n {\n id: \"admin\",\n name: \"Admin\",\n isAdmin: true\n },\n {\n id: \"editor\",\n name: \"Editor\",\n isAdmin: false,\n defaultPermissions: {\n read: true,\n create: true,\n edit: true,\n delete: true\n },\n config: {\n createCollections: true,\n editCollections: \"own\",\n deleteCollections: \"own\"\n }\n },\n {\n id: \"viewer\",\n name: \"Viewer\",\n isAdmin: false,\n defaultPermissions: {\n read: true,\n create: false,\n edit: false,\n delete: false\n }\n }\n];\n","import { useState } from \"react\";\nimport {\n Button,\n CenteredView,\n Checkbox,\n DeleteIcon,\n IconButton,\n Table,\n TableBody,\n TableCell,\n TableHeader,\n TableRow,\n Tooltip,\n Typography\n} from \"@firecms/ui\";\nimport { DeleteConfirmationDialog, Role } from \"@firecms/core\";\nimport { useUserManagement } from \"../../hooks\";\nimport { RoleChip } from \"./RoleChip\";\nimport { DEFAULT_ROLES } from \"./default_roles\";\n\nexport function RolesTable({\n onRoleClicked,\n editable\n }: {\n onRoleClicked: (role: Role) => void;\n editable: boolean;\n}) {\n\n const {\n roles,\n saveRole,\n deleteRole,\n allowDefaultRolesCreation\n } = useUserManagement();\n\n const [roleToBeDeleted, setRoleToBeDeleted] = useState<Role | undefined>(undefined);\n const [deleteInProgress, setDeleteInProgress] = useState<boolean>(false);\n\n return <div\n className=\"w-full overflow-auto\">\n <Table>\n <TableHeader>\n <TableCell header={true} className=\"w-16\"></TableCell>\n <TableCell header={true}>Role</TableCell>\n <TableCell header={true} className={\"items-center\"}>Is Admin</TableCell>\n <TableCell header={true}>Default permissions</TableCell>\n </TableHeader>\n\n <TableBody>\n {roles && roles.map((role) => {\n const canCreateAll = role.isAdmin || role.defaultPermissions?.create;\n const canReadAll = role.isAdmin || role.defaultPermissions?.read;\n const canUpdateAll = role.isAdmin || role.defaultPermissions?.edit;\n const canDeleteAll = role.isAdmin || role.defaultPermissions?.delete;\n return (\n <TableRow\n key={role.name}\n onClick={() => {\n onRoleClicked(role);\n }}\n >\n <TableCell style={{ width: \"64px\" }}>\n {!role.isAdmin &&\n <Tooltip title={\"Delete this role\"}>\n <IconButton\n size={\"small\"}\n disabled={!editable}\n onClick={(event) => {\n event.stopPropagation();\n return setRoleToBeDeleted(role);\n }}>\n <DeleteIcon/>\n </IconButton>\n </Tooltip>}\n </TableCell>\n <TableCell>\n <RoleChip role={role}/>\n </TableCell>\n <TableCell className={\"items-center\"}>\n <Checkbox checked={role.isAdmin ?? false}/>\n </TableCell>\n <TableCell>\n <ul>\n {canCreateAll && <li>Create</li>}\n {canReadAll && <li>Read</li>}\n {canUpdateAll && <li>Update</li>}\n {canDeleteAll && <li>Delete</li>}\n </ul>\n </TableCell>\n </TableRow>\n );\n })}\n\n {(!roles || roles.length === 0) && <TableRow>\n <TableCell colspan={4}>\n <CenteredView className={\"flex flex-col gap-4 my-8 items-center\"}>\n <Typography variant={\"label\"}>\n You don't have any roles yet.\n </Typography>\n {allowDefaultRolesCreation && <Button variant={\"outlined\"}\n onClick={() => {\n DEFAULT_ROLES.forEach((role) => {\n saveRole(role);\n });\n }}>\n Create default roles\n </Button>}\n </CenteredView>\n </TableCell>\n </TableRow>}\n\n </TableBody>\n\n </Table>\n\n <DeleteConfirmationDialog\n open={Boolean(roleToBeDeleted)}\n loading={deleteInProgress}\n onAccept={() => {\n if (roleToBeDeleted) {\n setDeleteInProgress(true);\n deleteRole(roleToBeDeleted)\n .then(() => {\n setRoleToBeDeleted(undefined);\n })\n .finally(() => {\n setDeleteInProgress(false);\n })\n }\n }}\n onCancel={() => {\n setRoleToBeDeleted(undefined);\n }}\n title={<>Delete?</>}\n body={<>Are you sure you want to delete this role?</>}/>\n\n </div>;\n}\n","import React, { useCallback, useState } from \"react\";\n\nimport { Role, useNavigationController } from \"@firecms/core\";\nimport { AddIcon, Button, Container, Tooltip, Typography } from \"@firecms/ui\";\nimport { RolesTable } from \"./RolesTable\";\nimport { RolesDetailsForm } from \"./RolesDetailsForm\";\nimport { useUserManagement } from \"../../hooks\";\n\nexport const RolesView = React.memo(\n function RolesView({ children }: { children?: React.ReactNode }) {\n\n const { collections } = useNavigationController();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [selectedRole, setSelectedRole] = useState<Role | undefined>();\n\n const { canEditRoles } = useUserManagement();\n\n const onRoleClicked = useCallback((user: Role) => {\n setDialogOpen(true);\n setSelectedRole(user);\n }, []);\n\n const handleClose = () => {\n setSelectedRole(undefined);\n setDialogOpen(false);\n };\n\n return (\n <Container className=\"w-full flex flex-col py-4 gap-4\" maxWidth={\"6xl\"}>\n\n {children}\n\n <div className=\"flex items-center mt-12\">\n <Typography gutterBottom variant=\"h4\"\n className=\"flex-grow\"\n component=\"h4\">\n Roles\n </Typography>\n <Tooltip title={!canEditRoles ? \"Update plans to customise roles\" : undefined}>\n <Button\n size={\"large\"}\n disabled={!canEditRoles}\n startIcon={<AddIcon/>}\n onClick={() => setDialogOpen(true)}>\n Add role\n </Button>\n </Tooltip>\n </div>\n\n <RolesTable onRoleClicked={onRoleClicked} editable={Boolean(canEditRoles)}/>\n\n <RolesDetailsForm\n key={selectedRole?.id ?? \"new\"}\n open={dialogOpen}\n role={selectedRole}\n editable={canEditRoles}\n collections={collections}\n handleClose={handleClose}/>\n\n </Container>\n )\n });\n","import React, { useCallback } from \"react\";\nimport * as Yup from \"yup\";\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DoneIcon,\n LoadingButton,\n MultiSelect,\n MultiSelectItem,\n TextField,\n Typography,\n} from \"@firecms/ui\";\nimport { FieldCaption, Role, useAuthController, User, useSnackbarController } from \"@firecms/core\";\nimport { Formex, useCreateFormex } from \"@firecms/formex\";\n\nimport { areRolesEqual } from \"../../utils\";\nimport { useUserManagement } from \"../../hooks\";\nimport { RoleChip } from \"../roles\";\n\nexport const UserYupSchema = Yup.object().shape({\n displayName: Yup.string().required(\"Required\"),\n email: Yup.string().email().required(\"Required\"),\n roles: Yup.array().min(1)\n});\n\nfunction canUserBeEdited(loggedUser: User, user: User, users: User[], roles: Role[], prevUser?: User) {\n const admins = users.filter(u => u.roles?.map(r => r.id).includes(\"admin\"));\n const loggedUserIsAdmin = loggedUser.roles?.map(r => r.id).includes(\"admin\");\n const didRolesChange = !prevUser || !areRolesEqual(prevUser.roles ?? [], user.roles ?? []);\n\n if (didRolesChange && !loggedUserIsAdmin) {\n throw new Error(\"Only admins can change roles\");\n }\n\n // was the admin role removed\n const adminRoleRemoved = prevUser && prevUser.roles?.map(r => r.id).includes(\"admin\") && !user.roles?.map(r => r.id).includes(\"admin\");\n\n // avoid removing the last admin\n if (adminRoleRemoved && admins.length === 1) {\n throw new Error(\"There must be at least one admin\");\n }\n return true;\n}\n\nexport function UserDetailsForm({\n open,\n user: userProp,\n handleClose\n }: {\n open: boolean,\n user?: User,\n handleClose: () => void\n}) {\n\n const snackbarController = useSnackbarController();\n const {\n user: loggedInUser\n } = useAuthController();\n const {\n saveUser,\n users,\n roles,\n } = useUserManagement();\n const isNewUser = !userProp;\n\n const onUserUpdated = useCallback((savedUser: User): Promise<User> => {\n if (!loggedInUser) {\n throw new Error(\"Logged user not found\");\n }\n try {\n canUserBeEdited(loggedInUser, savedUser, users, roles, userProp);\n return saveUser(savedUser);\n } catch (e: any) {\n return Promise.reject(e);\n }\n }, [roles, saveUser, userProp, users, loggedInUser]);\n\n const formex = useCreateFormex({\n initialValues: userProp ?? {\n displayName: \"\",\n email: \"\",\n roles: roles.filter(r => r.id === \"editor\")\n } as User,\n validation: (values) => {\n return UserYupSchema.validate(values, { abortEarly: false })\n .then(() => {\n return {};\n }).catch((e) => {\n return e.inner.reduce((acc: any, error: any) => {\n acc[error.path] = error.message;\n return acc;\n }, {});\n });\n },\n onSubmit: (user: User, formexController) => {\n\n return onUserUpdated(user)\n .then(() => {\n handleClose();\n formexController.resetForm({\n values: user\n });\n }).catch((e) => {\n snackbarController.open({\n type: \"error\",\n message: e.message\n });\n });\n }\n });\n\n const {\n isSubmitting,\n touched,\n handleChange,\n values,\n errors,\n setFieldValue,\n dirty,\n handleSubmit,\n submitCount\n } = formex;\n\n return (\n <Dialog\n open={open}\n onOpenChange={(open) => !open ? handleClose() : undefined}\n maxWidth={\"4xl\"}\n >\n <Formex value={formex}>\n <form\n onSubmit={handleSubmit}\n autoComplete={\"off\"}\n noValidate\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n position: \"relative\",\n height: \"100%\"\n }}>\n <DialogContent className=\"h-full flex-grow\">\n <div\n className=\"flex flex-row pt-4 pb-4\">\n <Typography variant={\"h4\"}\n className=\"flex-grow\">\n User\n </Typography>\n </div>\n\n <div className={\"grid grid-cols-12 gap-8\"}>\n\n <div className={\"col-span-12\"}>\n <TextField\n name=\"displayName\"\n required\n error={submitCount > 0 && Boolean(errors.displayName)}\n value={values.displayName ?? \"\"}\n onChange={handleChange}\n aria-describedby=\"name-helper-text\"\n label=\"Name\"\n />\n <FieldCaption>\n {submitCount > 0 && Boolean(errors.displayName) ? errors.displayName : \"Name of this user\"}\n </FieldCaption>\n </div>\n <div className={\"col-span-12\"}>\n <TextField\n required\n error={submitCount > 0 && Boolean(errors.email)}\n name=\"email\"\n value={values.email ?? \"\"}\n onChange={handleChange}\n aria-describedby=\"email-helper-text\"\n label=\"Email\"\n />\n <FieldCaption>\n {submitCount > 0 && Boolean(errors.email) ? errors.email : \"Email of this user\"}\n </FieldCaption>\n </div>\n <div className={\"col-span-12\"}>\n <MultiSelect\n label=\"Roles\"\n value={values.roles?.map(r => r.id) ?? []}\n onMultiValueChange={(value: string[]) => setFieldValue(\"roles\", value.map(id => roles.find(r => r.id === id) as Role))}\n renderValue={(value: string) => {\n const userRole = roles\n .find((role) => role.id === value);\n if (!userRole) return null;\n return <div className=\"flex flex-wrap space-x-2 space-y-2\">\n <RoleChip key={userRole?.id} role={userRole}/>\n </div>;\n }}>\n {roles.map(userRole => <MultiSelectItem key={userRole.id}\n value={userRole.id}>\n <RoleChip key={userRole?.id} role={userRole}/>\n </MultiSelectItem>)}\n </MultiSelect>\n </div>\n\n </div>\n\n </DialogContent>\n\n <DialogActions>\n\n <Button variant={\"text\"}\n onClick={() => {\n handleClose();\n }}>\n Cancel\n </Button>\n\n <LoadingButton\n variant=\"filled\"\n color=\"primary\"\n type=\"submit\"\n disabled={!dirty}\n loading={isSubmitting}\n startIcon={<DoneIcon/>}\n >\n {isNewUser ? \"Create user\" : \"Update\"}\n </LoadingButton>\n </DialogActions>\n </form>\n </Formex>\n\n </Dialog>\n );\n}\n","import { useState } from \"react\";\n\nimport { format } from \"date-fns\";\nimport * as locales from \"date-fns/locale\";\n\nimport {\n defaultDateFormat,\n DeleteConfirmationDialog, Role,\n useAuthController,\n useCustomizationController, User,\n useSnackbarController\n} from \"@firecms/core\";\nimport {\n Button,\n CenteredView,\n DeleteIcon,\n IconButton,\n Table,\n TableBody,\n TableCell,\n TableHeader,\n TableRow,\n Tooltip,\n Typography,\n} from \"@firecms/ui\";\nimport { useUserManagement } from \"../../hooks\";\nimport { RoleChip } from \"../roles\";\nimport { PersistedUser } from \"../../types\";\n\nexport function UsersTable({ onUserClicked }: {\n onUserClicked: (user: User) => void;\n}) {\n\n const {\n users,\n saveUser,\n deleteUser\n } = useUserManagement<PersistedUser>();\n\n const authController = useAuthController();\n const snackbarController = useSnackbarController();\n\n const customizationController = useCustomizationController();\n const dateUtilsLocale = customizationController?.locale ? locales[customizationController?.locale as keyof typeof locales] : undefined;\n const dateFormat: string = customizationController?.dateTimeFormat ?? defaultDateFormat;\n\n const [userToBeDeleted, setUserToBeDeleted] = useState<User | undefined>(undefined);\n const [deleteInProgress, setDeleteInProgress] = useState<boolean>(false);\n\n return (\n <div className=\"overflow-auto\">\n\n <Table>\n\n <TableHeader>\n <TableCell className=\"truncate w-16\"></TableCell>\n <TableCell>ID</TableCell>\n <TableCell>Email</TableCell>\n <TableCell>Name</TableCell>\n <TableCell>Roles</TableCell>\n <TableCell>Created on</TableCell>\n </TableHeader>\n <TableBody>\n {users && users.map((user) => {\n\n const userRoles: Role[] | undefined = user.roles;\n\n const formattedDate = user.created_on ? format(user.created_on, dateFormat, { locale: dateUtilsLocale }) : \"\";\n\n return (\n <TableRow\n key={\"row_\" + user.uid}\n onClick={() => {\n onUserClicked(user);\n }}\n >\n <TableCell className={\"w-10\"}>\n <Tooltip title={\"Delete this user\"}>\n <IconButton\n size={\"small\"}\n onClick={(event) => {\n event.stopPropagation();\n return setUserToBeDeleted(user);\n }}>\n <DeleteIcon/>\n </IconButton>\n </Tooltip>\n </TableCell>\n <TableCell>{user.uid}</TableCell>\n <TableCell>{user.email}</TableCell>\n <TableCell className={\"font-medium align-left\"}>{user.displayName}</TableCell>\n <TableCell className=\"align-left\">\n {userRoles\n ? <div className=\"flex flex-wrap gap-2\">\n {userRoles.map(userRole =>\n <RoleChip key={userRole?.id} role={userRole}/>\n )}\n </div>\n : null}\n </TableCell>\n <TableCell>{formattedDate}</TableCell>\n </TableRow>\n );\n })}\n\n {(!users || users.length === 0) && <TableRow>\n <TableCell colspan={6}>\n <CenteredView className={\"flex flex-col gap-4 my-8 items-center\"}>\n <Typography variant={\"label\"}>\n There are no users yet\n </Typography>\n <Button variant={\"outlined\"}\n onClick={() => {\n if (!authController.user?.uid) {\n throw Error(\"UsersTable, authController misconfiguration\");\n }\n saveUser({\n uid: authController.user?.uid,\n email: authController.user?.email,\n displayName: authController.user?.displayName,\n photoURL: authController.user?.photoURL,\n providerId: authController.user?.providerId,\n isAnonymous: authController.user?.isAnonymous,\n roles: [{ id: \"admin\", name: \"Admin\" }],\n created_on: new Date()\n })\n .then(() => {\n snackbarController.open({\n type: \"success\",\n message: \"User added successfully\"\n })\n })\n .catch((error) => {\n snackbarController.open({\n type: \"error\",\n message: \"Error adding user: \" + error.message,\n })\n });\n }}>\n\n Add the logged user as an admin\n </Button>\n </CenteredView>\n </TableCell>\n </TableRow>}\n\n </TableBody>\n </Table>\n\n <DeleteConfirmationDialog\n open={Boolean(userToBeDeleted)}\n loading={deleteInProgress}\n onAccept={() => {\n if (userToBeDeleted) {\n setDeleteInProgress(true);\n deleteUser(userToBeDeleted)\n .then(() => {\n setUserToBeDeleted(undefined);\n })\n .catch((error) => {\n snackbarController.open({\n type: \"error\",\n message: \"Error deleting user: \" + error.message,\n })\n })\n .finally(() => {\n setDeleteInProgress(false);\n })\n }\n }}\n onCancel={() => {\n setUserToBeDeleted(undefined);\n }}\n title={<>Delete?</>}\n body={<>Are you sure you want to delete this user?</>}/>\n </div>);\n}\n","import { AddIcon, Button, Container, Typography } from \"@firecms/ui\";\n\nimport { UsersTable } from \"./UsersTable\";\nimport { UserDetailsForm } from \"./UserDetailsForm\";\nimport React, { useCallback, useState } from \"react\";\nimport { useUserManagement } from \"../../hooks/useUserManagement\";\nimport { User } from \"@firecms/core\";\n\nexport const UsersView = function UsersView({ children }: { children?: React.ReactNode }) {\n\n const [dialogOpen, setDialogOpen] = useState<boolean>();\n const [selectedUser, setSelectedUser] = useState<User | undefined>();\n\n const { users, usersLimit } = useUserManagement();\n\n const reachedUsersLimit = usersLimit !== undefined && (users && users.length >= usersLimit);\n\n const onUserClicked = useCallback((user: User) => {\n setSelectedUser(user);\n setDialogOpen(true);\n }, []);\n\n const handleClose = useCallback(() => {\n setDialogOpen(false);\n setSelectedUser(undefined);\n }, []);\n\n return (\n <Container className=\"w-full flex flex-col py-4 gap-4\" maxWidth={\"6xl\"}>\n\n {children}\n\n <div\n className=\"flex items-center mt-12\">\n <Typography gutterBottom variant=\"h4\"\n className=\"flex-grow\"\n component=\"h4\">\n Users\n </Typography>\n <Button\n size={\"large\"}\n disabled={reachedUsersLimit}\n startIcon={<AddIcon/>}\n onClick={() => setDialogOpen(true)}>\n Add user\n </Button>\n </div>\n\n <UsersTable onUserClicked={onUserClicked}/>\n\n <UserDetailsForm\n key={selectedUser?.uid ?? \"new\"}\n open={dialogOpen ?? false}\n user={selectedUser}\n handleClose={handleClose}/>\n\n </Container>\n )\n};\n","import { FireCMSPlugin } from \"@firecms/core\";\nimport { UserManagementProvider } from \"./UserManagementProvider\";\nimport { UserManagement } from \"./types\";\n\nexport function useUserManagementPlugin({ userManagement }: {\n userManagement: UserManagement,\n}): FireCMSPlugin {\n return {\n key: \"user_management\",\n loading: userManagement.loading,\n provider: {\n Component: UserManagementProvider,\n props: {\n userManagement\n }\n }\n }\n}\n","import { CMSView } from \"@firecms/core\";\nimport { RolesView, UsersView } from \"./components\";\n\nexport const userManagementAdminViews: CMSView[] = [\n {\n path: \"users\",\n name: \"CMS Users\",\n group: \"Admin\",\n icon: \"face\",\n view: <UsersView/>\n },\n {\n path: \"roles\",\n name: \"Roles\",\n group: \"Admin\",\n icon: \"gpp_good\",\n view: <RolesView/>\n }\n]\n"],"names":["RESERVED_GROUPS","DEFAULT_PERMISSIONS","resolveUserRolePermissions","collection","user","roles","basePermissions","role","resolveCollectionRole","mergePermissions","id","permA","permB","getUserRoles","fireCMSUser","r","areRolesEqual","rolesA","rolesB","rolesAIds","rolesBIds","cacheDelegatedLoginToken","projectId","delegatedToken","data","parseJwt","expiry","getDelegatedLoginTokenFromCache","entry","clearDelegatedLoginTokensCache","i","key","token","base64","jsonPayload","c","darkenColor","hexColor","darkenBy","color","g","b","hexToRgbaWithOpacity","opacity","alpha","useBuildFirestoreUserManagement","firebaseApp","usersPath","rolesPath","usersLimit","canEditRoles","allowDefaultRolesCreation","includeCollectionConfigPermissions","firestoreRef","useRef","rolesLoading","setRolesLoading","React","usersLoading","setUsersLoading","setRoles","usersWithRoleIds","setUsersWithRoleIds","users","u","rolesError","setRolesError","usersError","setUsersError","loading","useEffect","getFirestore","firestore","onSnapshot","snapshot","newRoles","docsToRoles","e","newUsers","docsToUsers","saveUser","useCallback","roleIds","uid","userData","setDoc","doc","addDoc","saveRole","roleData","ref","deleteUser","deleteDoc","deleteRole","collectionPermissions","userIds","defineRolesFor","authenticator","docs","UserManagementContext","UserManagementProvider","children","userManagement","useUserManagement","useContext","RoleChip","colorScheme","getColorSchemeForSeed","jsx","Chip","RoleYupSchema","Yup","RolesDetailsForm","open","editable","handleClose","collections","isNewRole","savingError","setSavingError","useState","onRoleUpdated","formex","useCreateFormex","formexController","values","errors","error","isSubmitting","touched","handleChange","setFieldValue","dirty","setFieldTouched","isAdmin","defaultCreate","defaultRead","defaultEdit","defaultDelete","getIn","toSnakeCase","Dialog","Formex","jsxs","DialogContent","Typography","TextField","FieldCaption","Paper","Table","TableHeader","TableCell","TableBody","TableRow","Tooltip","Checkbox","checked","col","Select","event","value","SelectItem","DialogActions","Button","LoadingButton","DoneIcon","DEFAULT_ROLES","RolesTable","onRoleClicked","roleToBeDeleted","setRoleToBeDeleted","deleteInProgress","setDeleteInProgress","canCreateAll","canReadAll","canUpdateAll","canDeleteAll","IconButton","DeleteIcon","CenteredView","DeleteConfirmationDialog","RolesView","useNavigationController","dialogOpen","setDialogOpen","selectedRole","setSelectedRole","Container","AddIcon","UserYupSchema","canUserBeEdited","loggedUser","prevUser","admins","loggedUserIsAdmin","UserDetailsForm","userProp","snackbarController","useSnackbarController","loggedInUser","useAuthController","isNewUser","onUserUpdated","savedUser","acc","handleSubmit","submitCount","MultiSelect","userRole","MultiSelectItem","UsersTable","onUserClicked","authController","customizationController","useCustomizationController","dateUtilsLocale","locales","dateFormat","defaultDateFormat","userToBeDeleted","setUserToBeDeleted","userRoles","formattedDate","format","UsersView","selectedUser","setSelectedUser","reachedUsersLimit","useUserManagementPlugin","userManagementAdminViews"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/utils/permissions.ts","../src/utils/local_storage.ts","../src/utils/colors.ts","../src/hooks/useBuildUserManagement.tsx","../src/UserManagementProvider.tsx","../src/hooks/useUserManagement.tsx","../src/components/roles/RoleChip.tsx","../src/components/roles/RolesDetailsForm.tsx","../src/components/roles/default_roles.tsx","../src/components/roles/RolesTable.tsx","../src/components/roles/RolesView.tsx","../src/components/users/UserDetailsForm.tsx","../src/components/users/UsersTable.tsx","../src/components/users/UsersView.tsx","../src/useUserManagementPlugin.tsx","../src/admin_views.tsx"],"sourcesContent":["import { EntityCollection, Permissions, Role, User } from \"@firecms/core\";\n\nexport const RESERVED_GROUPS = [\"Admin\"];\n\nconst DEFAULT_PERMISSIONS = {\n read: false,\n edit: false,\n create: false,\n delete: false\n};\n\nexport function resolveUserRolePermissions<USER extends User>\n({\n collection,\n user\n }: {\n collection: EntityCollection<any>,\n user: USER | null\n}): Permissions {\n\n const roles = user?.roles;\n if (!roles) {\n return DEFAULT_PERMISSIONS;\n } else if (collection.ownerId === user?.uid) {\n return {\n read: true,\n create: true,\n edit: true,\n delete: true\n };\n } else {\n const basePermissions = {\n read: false,\n create: false,\n edit: false,\n delete: false\n };\n\n return roles\n .map(role => resolveCollectionRole(role, collection.id))\n .reduce(mergePermissions, basePermissions);\n }\n}\n\nfunction resolveCollectionRole(role: Role, id: string): Permissions {\n\n const basePermissions = {\n read: (role.isAdmin || role.defaultPermissions?.read) ?? false,\n create: (role.isAdmin || role.defaultPermissions?.create) ?? false,\n edit: (role.isAdmin || role.defaultPermissions?.edit) ?? false,\n delete: (role.isAdmin || role.defaultPermissions?.delete) ?? false\n };\n const thisCollectionPermissions = role.collectionPermissions?.[id];\n if (thisCollectionPermissions) {\n return mergePermissions(thisCollectionPermissions, basePermissions);\n } else if (role.defaultPermissions) {\n return mergePermissions(role.defaultPermissions, basePermissions);\n } else {\n return basePermissions;\n }\n}\n\nconst mergePermissions = (permA: Permissions, permB: Permissions) => {\n return {\n read: permA.read || permB.read,\n create: permA.create || permB.create,\n edit: permA.edit || permB.edit,\n delete: permA.delete || permB.delete\n };\n}\n\nexport function getUserRoles(roles: Role[], fireCMSUser: User): Role[] | undefined {\n return !roles\n ? undefined\n : (fireCMSUser.roles\n ? fireCMSUser.roles\n .map(role => roles.find((r) => r.id === role.id))\n .filter(Boolean) as Role[]\n : []);\n}\n\nexport const areRolesEqual = (rolesA: Role[], rolesB: Role[]) => {\n const rolesAIds = rolesA.map(r => r.id);\n const rolesBIds = rolesB.map(r => r.id);\n return rolesAIds.length === rolesB.length && rolesAIds.every((role) => rolesBIds.includes(role));\n}\n","// const tokens = new Map<string, {\n// token: string,\n// expiry: Date\n// }>();\n\nexport function cacheDelegatedLoginToken(projectId: string, delegatedToken?: string) {\n if (!delegatedToken) {\n return;\n }\n\n const data = parseJwt(delegatedToken);\n // @ts-ignore\n const expiry = new Date(data.exp * 1000);\n localStorage.setItem(`auth_token::${projectId}`, JSON.stringify({\n token: delegatedToken,\n expiry\n }));\n\n}\n\nexport function getDelegatedLoginTokenFromCache(projectId: string) {\n const entry = localStorage.getItem(`auth_token::${projectId}`);\n if (entry) {\n const data = JSON.parse(entry);\n data.expiry = new Date(data.expiry);\n if (data.expiry > new Date()) {\n return data.token;\n }\n }\n return undefined;\n}\n\nexport function clearDelegatedLoginTokensCache() {\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(\"auth_token::\")) {\n localStorage.removeItem(key);\n }\n }\n}\n\nfunction parseJwt(token?: string): object {\n if (!token) {\n throw new Error(\"No JWT token\");\n }\n const base64Url = token.split(\".\")[1];\n const base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const jsonPayload = decodeURIComponent(window.atob(base64).split(\"\").map(function (c) {\n return \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2);\n }).join(\"\"));\n\n return JSON.parse(jsonPayload);\n}\n","export function darkenColor(hexColor: string, darkenBy = 10): string {\n // Check input validity\n if (!/^#([0-9A-Fa-f]{3}){1,2}$/.test(hexColor)) {\n throw new Error(\"Invalid color format\");\n }\n\n // If shorthand form, convert to full form\n let color = hexColor.substring(1).split(\"\");\n if (color.length === 3) {\n color = [color[0], color[0], color[1], color[1], color[2], color[2]];\n }\n\n // Convert to RGB values\n let r = parseInt(color[0] + color[1], 16);\n let g = parseInt(color[2] + color[3], 16);\n let b = parseInt(color[4] + color[5], 16);\n\n // Reduce each color component by the specified percentage (darkenBy)\n r = Math.floor(r * (1 - darkenBy / 100));\n g = Math.floor(g * (1 - darkenBy / 100));\n b = Math.floor(b * (1 - darkenBy / 100));\n\n // Recombine into hex and return\n return \"#\" +\n (r < 16 ? \"0\" : \"\") + r.toString(16) +\n (g < 16 ? \"0\" : \"\") + g.toString(16) +\n (b < 16 ? \"0\" : \"\") + b.toString(16);\n}\n\nexport function hexToRgbaWithOpacity(hexColor: string, opacity = 10): string {\n // Check input validity\n if (!/^#([0-9A-Fa-f]{3}){1,2}$/.test(hexColor)) {\n throw new Error(\"Invalid color format\");\n }\n\n // If shorthand form, convert to full form\n let color = hexColor.substring(1).split(\"\");\n if (color.length === 3) {\n color = [color[0], color[0], color[1], color[1], color[2], color[2]];\n }\n\n // Convert to RGB values\n const r = parseInt(color[0] + color[1], 16);\n const g = parseInt(color[2] + color[3], 16);\n const b = parseInt(color[4] + color[5], 16);\n\n // Convert opacity to a decimal for CSS\n const alpha = opacity / 100;\n\n // Construct and return the RGBA color\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n","import React, { useCallback, useEffect } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport { UserManagement } from \"../types\";\nimport {\n AuthController,\n Authenticator,\n DataSourceDelegate,\n Entity,\n PermissionsBuilder,\n removeUndefined,\n Role,\n User\n} from \"@firecms/core\";\nimport { resolveUserRolePermissions } from \"../utils\";\n\ntype UserWithRoleIds<USER extends User = any> = Omit<USER, \"roles\"> & { roles: string[] };\n\nexport interface UserManagementParams<CONTROLLER extends AuthController<any> = AuthController<any>> {\n\n authController: CONTROLLER;\n\n /**\n * The delegate in charge of persisting the data.\n */\n dataSourceDelegate?: DataSourceDelegate;\n\n /**\n * Path where the plugin users configuration is stored.\n * Default: __FIRECMS/config/users\n * You can specify a different path if you want to store the user management configuration in a different place.\n * Please keep in mind that the FireCMS users are not necessarily the same as the Firebase users (but they can be).\n * The path should be relative to the root of the database, and should always have an odd number of segments.\n */\n usersPath?: string;\n\n /**\n * Path where the plugin roles configuration is stored.\n * Default: __FIRECMS/config/roles\n */\n rolesPath?: string;\n\n /**\n * If there are no roles in the database, provide a button to create the default roles.\n */\n allowDefaultRolesCreation?: boolean;\n\n /**\n * Include the collection config permissions in the user management system.\n */\n includeCollectionConfigPermissions?: boolean;\n\n}\n\n/**\n * This hook is used to build a user management object that can be used to\n * manage users and roles in a Firestore backend.\n * @param authController\n * @param dataSourceDelegate\n * @param usersPath\n * @param rolesPath\n * @param allowDefaultRolesCreation\n * @param includeCollectionConfigPermissions\n */\nexport function useBuildUserManagement<CONTROLLER extends AuthController<any> = AuthController<any>,\n USER extends User = CONTROLLER extends AuthController<infer U> ? U : any>\n({\n authController,\n dataSourceDelegate,\n usersPath = \"__FIRECMS/config/users\",\n rolesPath = \"__FIRECMS/config/roles\",\n allowDefaultRolesCreation,\n includeCollectionConfigPermissions\n }: UserManagementParams<CONTROLLER>): UserManagement<USER> & CONTROLLER {\n\n if (!authController) {\n throw Error(\"useBuildUserManagement: You need to provide an authController since version 3.0.0-beta.11. Check https://firecms.co/docs/pro/migrating_from_v3_beta\");\n }\n\n const [rolesLoading, setRolesLoading] = React.useState<boolean>(true);\n const [usersLoading, setUsersLoading] = React.useState<boolean>(true);\n const [roles, setRoles] = React.useState<Role[]>([]);\n const [usersWithRoleIds, setUsersWithRoleIds] = React.useState<UserWithRoleIds<USER>[]>([]);\n\n const users = usersWithRoleIds.map(u => ({\n ...u,\n roles: roles.filter(r => u.roles?.includes(r.id))\n }) as USER);\n\n const [rolesError, setRolesError] = React.useState<Error | undefined>();\n const [usersError, setUsersError] = React.useState<Error | undefined>();\n\n const _usersLoading = usersLoading;\n const _rolesLoading = rolesLoading;\n\n const loading = _rolesLoading || _usersLoading;\n\n useEffect(() => {\n if (!dataSourceDelegate || !rolesPath) return;\n if (dataSourceDelegate.initialised !== undefined && !dataSourceDelegate.initialised) return;\n if (authController?.initialLoading) return;\n // if (authController.user === null) {\n // setRolesLoading(false);\n // return;\n // }\n\n setRolesLoading(true);\n return dataSourceDelegate.listenCollection?.({\n path: rolesPath,\n onUpdate(entities: Entity<any>[]): void {\n setRolesError(undefined);\n try {\n const newRoles = entityToRoles(entities);\n if (!equal(newRoles, roles)) {\n setRoles(newRoles);\n }\n } catch (e) {\n setRoles([]);\n console.error(\"Error loading roles\", e);\n setRolesError(e as Error);\n }\n setRolesLoading(false);\n },\n onError(e: any): void {\n setRoles([]);\n console.error(\"Error loading roles\", e);\n setRolesError(e);\n setRolesLoading(false);\n }\n });\n\n }, [dataSourceDelegate?.initialised, authController?.initialLoading, authController?.user?.uid, rolesPath]);\n\n useEffect(() => {\n if (!dataSourceDelegate || !usersPath) return;\n if (dataSourceDelegate.initialised !== undefined && !dataSourceDelegate.initialised) {\n return;\n }\n if (authController?.initialLoading) {\n return;\n }\n\n setUsersLoading(true);\n return dataSourceDelegate.listenCollection?.({\n path: usersPath,\n onUpdate(entities: Entity<any>[]): void {\n console.debug(\"Updating users\", entities);\n setUsersError(undefined);\n try {\n const newUsers = entitiesToUsers(entities);\n // if (!equal(newUsers, usersWithRoleIds))\n setUsersWithRoleIds(newUsers);\n } catch (e) {\n setUsersWithRoleIds([]);\n console.error(\"Error loading users\", e);\n setUsersError(e as Error);\n }\n setUsersLoading(false);\n },\n onError(e: any): void {\n console.error(\"Error loading users\", e);\n setUsersWithRoleIds([]);\n setUsersError(e);\n setUsersLoading(false);\n }\n });\n\n }, [dataSourceDelegate?.initialised, authController?.initialLoading, authController?.user?.uid, usersPath]);\n\n const saveUser = useCallback(async (user: USER): Promise<USER> => {\n if (!dataSourceDelegate) throw Error(\"useBuildUserManagement Firebase not initialised\");\n if (!usersPath) throw Error(\"useBuildUserManagement Firestore not initialised\");\n\n console.debug(\"Persisting user\", user);\n\n const roleIds = user.roles?.map(r => r.id);\n const email = user.email?.toLowerCase().trim();\n if (!email) throw Error(\"Email is required\");\n\n const userExists = users.find(u => u.email?.toLowerCase() === email);\n const data = {\n ...user,\n roles: roleIds ?? []\n };\n if (!userExists) {\n // @ts-ignore\n data.created_on = new Date();\n }\n\n return dataSourceDelegate.saveEntity({\n status: \"existing\",\n path: usersPath,\n entityId: email,\n values: removeUndefined(data)\n }).then(() => user);\n }, [usersPath, dataSourceDelegate?.initialised]);\n\n const saveRole = useCallback((role: Role): Promise<void> => {\n if (!dataSourceDelegate) throw Error(\"useBuildUserManagement Firebase not initialised\");\n if (!rolesPath) throw Error(\"useBuildUserManagement Firestore not initialised\");\n console.debug(\"Persisting role\", role);\n const {\n id,\n ...roleData\n } = role;\n return dataSourceDelegate.saveEntity({\n status: \"existing\",\n path: rolesPath,\n entityId: id,\n values: removeUndefined(roleData)\n }).then(() => {\n return;\n });\n }, [rolesPath, dataSourceDelegate?.initialised]);\n\n const deleteUser = useCallback(async (user: User): Promise<void> => {\n if (!dataSourceDelegate) throw Error(\"useBuildUserManagement Firebase not initialised\");\n if (!usersPath) throw Error(\"useBuildUserManagement Firestore not initialised\");\n console.debug(\"Deleting\", user);\n const { uid } = user;\n const entity: Entity<any> = {\n path: usersPath,\n id: uid,\n values: {}\n };\n await dataSourceDelegate.deleteEntity({ entity })\n }, [usersPath, dataSourceDelegate?.initialised]);\n\n const deleteRole = useCallback(async (role: Role): Promise<void> => {\n if (!dataSourceDelegate) throw Error(\"useBuildUserManagement Firebase not initialised\");\n if (!rolesPath) throw Error(\"useBuildUserManagement Firestore not initialised\");\n console.debug(\"Deleting\", role);\n const { id } = role;\n const entity: Entity<any> = {\n path: rolesPath,\n id: id,\n values: {}\n };\n await dataSourceDelegate.deleteEntity({ entity })\n }, [rolesPath, dataSourceDelegate?.initialised]);\n\n const collectionPermissions: PermissionsBuilder = useCallback(({\n collection,\n user\n }) =>\n resolveUserRolePermissions({\n collection,\n user\n }), []);\n\n const defineRolesFor: ((user: User) => Role[] | undefined) = useCallback((user) => {\n if (!usersWithRoleIds) throw Error(\"Users not loaded\");\n const users = usersWithRoleIds.map(u => ({\n ...u,\n roles: roles.filter(r => u.roles?.includes(r.id))\n }) as User);\n const mgmtUser = users.find(u => u.email?.toLowerCase() === user?.email?.toLowerCase());\n return mgmtUser?.roles;\n }, [roles, usersWithRoleIds]);\n\n const authenticator: Authenticator<USER> = useCallback(({ user }) => {\n if (loading) {\n return false;\n }\n\n if (users.length === 0) {\n console.warn(\"No users created yet\");\n return true; // If there are no users created yet, we allow access to every user\n }\n\n const mgmtUser = users.find(u => u.email?.toLowerCase() === user?.email?.toLowerCase());\n if (mgmtUser) {\n console.debug(\"User found in user management system\", mgmtUser);\n return true;\n }\n\n throw Error(\"Could not find a user with the provided email in the user management system.\");\n }, [loading, users]);\n\n const userRoles = authController.user ? defineRolesFor(authController.user) : undefined;\n const isAdmin = (userRoles ?? []).some(r => r.id === \"admin\");\n\n const userRoleIds = userRoles?.map(r => r.id);\n useEffect(() => {\n console.debug(\"Setting roles\", userRoles);\n authController.setUserRoles?.(userRoles ?? []);\n }, [userRoleIds]);\n\n return {\n loading,\n roles,\n users,\n saveUser,\n saveRole,\n rolesError,\n deleteUser,\n deleteRole,\n usersError,\n isAdmin,\n allowDefaultRolesCreation: allowDefaultRolesCreation === undefined ? true : allowDefaultRolesCreation,\n includeCollectionConfigPermissions: Boolean(includeCollectionConfigPermissions),\n collectionPermissions,\n defineRolesFor,\n authenticator,\n ...authController,\n initialLoading: authController.initialLoading || loading,\n userRoles: userRoles,\n user: authController.user ? {\n ...authController.user,\n roles: userRoles\n } : null\n }\n}\n\nconst entitiesToUsers = (docs: Entity<Omit<UserWithRoleIds, \"id\">>[]): (UserWithRoleIds)[] => {\n return docs.map((doc) => {\n const data = doc.values as any;\n const newVar = {\n uid: doc.id,\n ...data,\n created_on: data?.created_on,\n updated_on: data?.updated_on\n };\n return newVar as (UserWithRoleIds);\n });\n}\n\nconst entityToRoles = (entities: Entity<Omit<Role, \"id\">>[]): Role[] => {\n return entities.map((doc) => ({\n id: doc.id,\n ...doc.values\n } as Role));\n}\n","import React, { PropsWithChildren } from \"react\";\nimport { UserManagement } from \"./types\";\nimport { User } from \"@firecms/core\";\n\nexport const UserManagementContext = React.createContext<UserManagement<any>>({} as any);\n\nexport interface UserManagementProviderProps<U extends User = User> {\n userManagement: UserManagement<U>\n}\n\nexport function UserManagementProvider<U extends User = User>({\n children,\n userManagement\n }: PropsWithChildren<UserManagementProviderProps<U>>) {\n return (\n <UserManagementContext.Provider value={userManagement}>\n {children}\n </UserManagementContext.Provider>\n );\n};\n","import { useContext } from \"react\";\nimport { UserManagement } from \"../types\";\nimport { UserManagementContext } from \"../UserManagementProvider\";\nimport { User } from \"@firecms/core\";\nexport const useUserManagement = <USER extends User>() => useContext<UserManagement<USER>>(UserManagementContext);\n","import { Chip, getColorSchemeForSeed } from \"@firecms/ui\";\nimport { Role } from \"@firecms/core\";\n\nexport type RoleChipProps = {\n role: Role;\n}\n\nexport function RoleChip({ role }: RoleChipProps) {\n let colorScheme;\n if (role.isAdmin) {\n colorScheme = \"blueDarker\";\n } else if (role.id === \"editor\") {\n colorScheme = \"yellowLight\";\n } else if (role.id === \"viewer\") {\n colorScheme = \"grayLight\";\n } else {\n colorScheme = getColorSchemeForSeed(role.id);\n }\n\n return (\n <Chip\n colorScheme={colorScheme}\n key={role.id}>\n {role.name}\n </Chip>\n );\n\n}\n","import React, { useCallback, useState } from \"react\";\nimport * as Yup from \"yup\";\n\nimport { EntityCollection, FieldCaption, Role, toSnakeCase, useAuthController, User, } from \"@firecms/core\";\nimport {\n Button,\n Checkbox,\n CheckIcon,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n LoadingButton,\n Paper,\n Select,\n SelectItem,\n Table,\n TableBody,\n TableCell,\n TableHeader,\n TableRow,\n TextField,\n Tooltip,\n Typography\n} from \"@firecms/ui\";\nimport { useUserManagement } from \"../../hooks\";\nimport { Formex, getIn, useCreateFormex } from \"@firecms/formex\";\n\nexport const RoleYupSchema = Yup.object().shape({\n id: Yup.string().required(\"Required\"),\n name: Yup.string().required(\"Required\")\n});\n\nfunction canRoleBeEdited(loggedUser: User) {\n const loggedUserIsAdmin = loggedUser.roles?.map(r => r.id).includes(\"admin\");\n if (!loggedUserIsAdmin) {\n throw new Error(\"Only admins can edit roles\");\n }\n\n return true;\n}\n\nexport function RolesDetailsForm({\n open,\n role,\n editable,\n handleClose,\n collections\n }: {\n open: boolean,\n editable?: boolean,\n role?: Role,\n handleClose: () => void,\n collections?: EntityCollection[]\n}) {\n\n const { saveRole } = useUserManagement();\n const isNewRole = !role;\n const {\n user: loggedInUser\n } = useAuthController();\n\n const [savingError, setSavingError] = useState<Error | undefined>();\n\n const onRoleUpdated = useCallback((role: Role) => {\n setSavingError(undefined);\n if (!loggedInUser) throw new Error(\"User not found\");\n canRoleBeEdited(loggedInUser);\n return saveRole(role);\n }, [saveRole, loggedInUser]);\n\n const formex = useCreateFormex({\n initialValues: role ?? {\n name: \"\"\n } as Role,\n onSubmit: (role: Role, formexController) => {\n try {\n return onRoleUpdated(role)\n .then(() => {\n formexController.resetForm({\n values: role\n });\n handleClose();\n })\n .catch(e => {\n setSavingError(e);\n });\n } catch (e: any) {\n setSavingError(e);\n return Promise.resolve();\n }\n },\n validation: (values) => {\n return RoleYupSchema.validate(values, { abortEarly: false })\n .then(() => ({}))\n .catch((e) => {\n const errors: Record<string, string> = {};\n e.inner.forEach((error: any) => {\n errors[error.path] = error.message;\n });\n return errors;\n });\n }\n\n });\n\n const {\n isSubmitting,\n touched,\n values,\n errors,\n handleChange,\n setFieldValue,\n dirty,\n setFieldTouched\n } = formex;\n\n const isAdmin = values.isAdmin ?? false;\n const defaultCreate = values.defaultPermissions?.create ?? false;\n const defaultRead = values.defaultPermissions?.read ?? false;\n const defaultEdit = values.defaultPermissions?.edit ?? false;\n const defaultDelete = values.defaultPermissions?.delete ?? false;\n\n React.useEffect(() => {\n const idTouched = getIn(touched, \"id\");\n if (!idTouched && values.name) {\n setFieldValue(\"id\", toSnakeCase(values.name))\n }\n }, [touched, values.name]);\n\n return (\n <Dialog\n open={open}\n maxWidth={\"4xl\"}\n >\n <Formex value={formex}>\n <form noValidate\n autoComplete={\"off\"}\n onSubmit={formex.handleSubmit}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n position: \"relative\",\n height: \"100%\"\n }}>\n <DialogTitle variant={\"h4\"} gutterBottom={false}>\n Role\n </DialogTitle>\n <DialogContent className=\"flex-grow\">\n\n <div className={\"grid grid-cols-12 gap-8\"}>\n\n <div className={\"col-span-12 md:col-span-8\"}>\n <TextField\n name=\"name\"\n required\n error={touched.name && Boolean(errors.name)}\n value={values.name}\n disabled={isAdmin || !editable}\n onChange={handleChange}\n aria-describedby=\"name-helper-text\"\n label=\"Name\"\n />\n <FieldCaption>\n {touched.name && Boolean(errors.name) ? errors.name : \"Name of this role\"}\n </FieldCaption>\n </div>\n\n <div className={\"col-span-12 md:col-span-4\"}>\n <TextField\n name=\"id\"\n required\n error={touched.id && Boolean(errors.id)}\n value={values.id}\n disabled={!isNewRole || !editable}\n onChange={(e) => {\n handleChange(e);\n setFieldTouched(\"id\", true)\n }}\n aria-describedby=\"id-helper-text\"\n label=\"ID\"\n />\n <FieldCaption>\n {touched.id && Boolean(errors.id) ? errors.id : \"ID of this role\"}\n </FieldCaption>\n </div>\n\n <div className={\"col-span-12\"}>\n <Paper className=\"bg-inherit overflow-hidden\">\n <Table className={\"w-full rounded-md\"}>\n <TableHeader className={\"rounded-md\"}>\n <TableCell></TableCell>\n <TableCell\n align=\"center\">Create\n entities\n </TableCell>\n <TableCell\n align=\"center\">Read\n entities\n </TableCell>\n <TableCell\n align=\"center\">Update\n entities\n </TableCell>\n <TableCell\n align=\"center\">Delete\n entities\n </TableCell>\n <TableCell\n align=\"center\">\n </TableCell>\n </TableHeader>\n\n <TableBody>\n <TableRow>\n <TableCell\n scope=\"row\">\n <strong>All\n collections</strong>\n </TableCell>\n <TableCell\n align=\"center\">\n <Tooltip\n title=\"Create entities in collections\">\n <Checkbox\n disabled={isAdmin || !editable}\n checked={(isAdmin || defaultCreate) ?? false}\n onCheckedChange={(checked) => setFieldValue(\"defaultPermissions.create\", checked)}\n />\n </Tooltip>\n </TableCell>\n\n <TableCell\n align=\"center\">\n <Tooltip\n title=\"Access all data in every collection\">\n <Checkbox\n disabled={isAdmin || !editable}\n checked={(isAdmin || defaultRead) ?? false}\n onCheckedChange={(checked) => setFieldValue(\"defaultPermissions.read\", checked)}\n />\n </Tooltip>\n </TableCell>\n <TableCell\n align=\"center\">\n <Tooltip\n title=\"Update data in any collection\">\n <Checkbox\n disabled={isAdmin || !editable}\n checked={(isAdmin || defaultEdit) ?? false}\n onCheckedChange={(checked) => setFieldValue(\"defaultPermissions.edit\", checked)}\n />\n </Tooltip>\n </TableCell>\n <TableCell\n align=\"center\">\n <Tooltip\n title=\"Delete data in any collection\">\n <Checkbox\n disabled={isAdmin || !editable}\n checked={(isAdmin || defaultDelete) ?? false}\n onCheckedChange={(checked) => setFieldValue(\"defaultPermissions.delete\", checked)}\n />\n\n </Tooltip>\n </TableCell>\n <TableCell\n align=\"center\">\n </TableCell>\n </TableRow>\n {collections && collections.map((col) => (\n <TableRow key={col.name}>\n <TableCell\n scope=\"row\">\n {col.name}\n </TableCell>\n <TableCell\n align=\"center\">\n <Checkbox\n disabled={isAdmin || defaultCreate || !editable}\n checked={(isAdmin || defaultCreate || getIn(values, `collectionPermissions.${col.id}.create`)) ?? false}\n onCheckedChange={(checked) => setFieldValue(`collectionPermissions.${col.id}.create`, checked)}/>\n </TableCell>\n <TableCell\n align=\"center\">\n <Checkbox\n disabled={isAdmin || defaultRead || !editable}\n checked={(isAdmin || defaultRead || getIn(values, `collectionPermissions.${col.id}.read`)) ?? false}\n onCheckedChange={(checked) => setFieldValue(`collectionPermissions.${col.id}.read`, checked)}/>\n </TableCell>\n <TableCell\n align=\"center\">\n <Checkbox\n disabled={isAdmin || defaultEdit || !editable}\n checked={(isAdmin || defaultEdit || getIn(values, `collectionPermissions.${col.id}.edit`)) ?? false}\n onCheckedChange={(checked) => setFieldValue(`collectionPermissions.${col.id}.edit`, checked)}/>\n </TableCell>\n <TableCell\n align=\"center\">\n <Checkbox\n disabled={isAdmin || defaultDelete || !editable}\n checked={(isAdmin || defaultDelete || getIn(values, `collectionPermissions.${col.id}.delete`)) ?? false}\n onCheckedChange={(checked) => setFieldValue(`collectionPermissions.${col.id}.delete`, checked)}/>\n </TableCell>\n\n <TableCell\n align=\"center\">\n <Tooltip\n title=\"Allow all permissions in this collections\">\n <Button\n className={\"color-inherit\"}\n onClick={() => {\n setFieldValue(`collectionPermissions.${col.id}.create`, true);\n setFieldValue(`collectionPermissions.${col.id}.read`, true);\n setFieldValue(`collectionPermissions.${col.id}.edit`, true);\n setFieldValue(`collectionPermissions.${col.id}.delete`, true);\n }}\n disabled={isAdmin || !editable}\n variant={\"text\"}>\n All\n </Button>\n\n </Tooltip>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </Paper>\n <FieldCaption>\n You can customise the permissions\n that the users related to this\n role can perform in the entities\n of each collection\n </FieldCaption>\n </div>\n\n <div className={\"col-span-12 md:col-span-4\"}>\n <Select\n error={touched.config && Boolean(errors.config)}\n size={\"large\"}\n fullWidth={true}\n id=\"createCollections\"\n name=\"createCollections\"\n label=\"Create collections\"\n position={\"item-aligned\"}\n disabled={isAdmin || !editable}\n onChange={(event) => setFieldValue(\"config.createCollections\", event.target.value === \"true\")}\n value={isAdmin || values.config?.createCollections ? \"true\" : \"false\"}\n renderValue={(value: any) => value === \"true\" ? \"Yes\" : \"No\"}\n >\n <SelectItem\n value={\"true\"}> Yes </SelectItem>\n <SelectItem\n value={\"false\"}> No </SelectItem>\n </Select>\n\n <FieldCaption>\n {touched.config && Boolean(errors.config) ? errors.config : \"Can the user create collections\"}\n </FieldCaption>\n </div>\n\n <div className={\"col-span-12 md:col-span-4\"}>\n <Select\n size={\"large\"}\n fullWidth={true}\n error={touched.config && Boolean(errors.config)}\n id=\"editCollections\"\n name=\"editCollections\"\n label=\"Edit collections\"\n disabled={isAdmin || !editable}\n position={\"item-aligned\"}\n onChange={(event) => setFieldValue(\"config.editCollections\", event.target.value === \"own\" ? \"own\" : event.target.value === \"true\")}\n value={isAdmin ? \"true\" : (values.config?.editCollections === \"own\" ? \"own\" : (values.config?.editCollections ? \"true\" : \"false\"))}\n renderValue={(value: any) => value === \"own\" ? \"Own\" : (value === \"true\" ? \"Yes\" : \"No\")}\n >\n <SelectItem\n value={\"true\"}> Yes </SelectItem>\n <SelectItem\n value={\"false\"}> No </SelectItem>\n <SelectItem\n value={\"own\"}> Only\n his/her own </SelectItem>\n </Select>\n\n <FieldCaption>\n {touched.config && Boolean(errors.config) ? errors.config : \"Can the user edit collections\"}\n </FieldCaption>\n </div>\n\n <div className={\"col-span-12 md:col-span-4\"}>\n <Select\n size={\"large\"}\n fullWidth={true}\n error={touched.config && Boolean(errors.config)}\n id=\"deleteCollections\"\n name=\"deleteCollections\"\n label=\"Delete collections\"\n disabled={isAdmin || !editable}\n position={\"item-aligned\"}\n onChange={(event) => setFieldValue(\"config.deleteCollections\", event.target.value === \"own\" ? \"own\" : event.target.value === \"true\")}\n value={isAdmin ? \"true\" : (values.config?.deleteCollections === \"own\" ? \"own\" : (values.config?.deleteCollections ? \"true\" : \"false\"))}\n renderValue={(value: any) => value === \"own\" ? \"Own\" : (value === \"true\" ? \"Yes\" : \"No\")}\n >\n <SelectItem\n value={\"true\"}> Yes </SelectItem>\n <SelectItem\n value={\"false\"}> No </SelectItem>\n <SelectItem\n value={\"own\"}> Only\n his/her own </SelectItem>\n </Select>\n\n <FieldCaption>\n {touched.config && Boolean(errors.config) ? errors.config : \"Can the user delete collections\"}\n </FieldCaption>\n\n </div>\n\n </div>\n </DialogContent>\n\n <DialogActions position={\"sticky\"}>\n {savingError && <Typography className={\"text-red-500 dark:text-red-500\"}>\n {savingError.message ?? \"There was an error saving this role\"}\n </Typography>}\n <Button variant={\"text\"}\n onClick={() => {\n handleClose();\n }}>\n Cancel\n </Button>\n <LoadingButton\n variant=\"filled\"\n color=\"primary\"\n type=\"submit\"\n disabled={!dirty}\n loading={isSubmitting}\n startIcon={<CheckIcon/>}\n >\n {isNewRole ? \"Create role\" : \"Update\"}\n </LoadingButton>\n </DialogActions>\n </form>\n\n </Formex>\n </Dialog>\n );\n}\n","import { Role } from \"@firecms/core\";\n\nexport const DEFAULT_ROLES: Role[] = [\n {\n id: \"admin\",\n name: \"Admin\",\n isAdmin: true\n },\n {\n id: \"editor\",\n name: \"Editor\",\n isAdmin: false,\n defaultPermissions: {\n read: true,\n create: true,\n edit: true,\n delete: true\n },\n config: {\n createCollections: true,\n editCollections: \"own\",\n deleteCollections: \"own\"\n }\n },\n {\n id: \"viewer\",\n name: \"Viewer\",\n isAdmin: false,\n defaultPermissions: {\n read: true,\n create: false,\n edit: false,\n delete: false\n }\n }\n];\n","import { useState } from \"react\";\nimport {\n Button,\n CenteredView,\n Checkbox,\n DeleteIcon,\n IconButton,\n Table,\n TableBody,\n TableCell,\n TableHeader,\n TableRow,\n Tooltip,\n Typography\n} from \"@firecms/ui\";\nimport { ConfirmationDialog, Role } from \"@firecms/core\";\nimport { useUserManagement } from \"../../hooks\";\nimport { RoleChip } from \"./RoleChip\";\nimport { DEFAULT_ROLES } from \"./default_roles\";\n\nexport function RolesTable({\n onRoleClicked,\n editable\n }: {\n onRoleClicked: (role: Role) => void;\n editable: boolean;\n}) {\n\n const {\n roles,\n saveRole,\n deleteRole,\n allowDefaultRolesCreation\n } = useUserManagement();\n\n const [roleToBeDeleted, setRoleToBeDeleted] = useState<Role | undefined>(undefined);\n const [deleteInProgress, setDeleteInProgress] = useState<boolean>(false);\n\n return <div\n className=\"w-full overflow-auto\">\n <Table className={\"w-full\"}>\n <TableHeader>\n <TableCell header={true} className=\"w-16\"></TableCell>\n <TableCell header={true}>Role</TableCell>\n <TableCell header={true} className={\"items-center\"}>Is Admin</TableCell>\n <TableCell header={true}>Default permissions</TableCell>\n </TableHeader>\n\n <TableBody>\n {roles && roles.map((role) => {\n const canCreateAll = role.isAdmin || role.defaultPermissions?.create;\n const canReadAll = role.isAdmin || role.defaultPermissions?.read;\n const canUpdateAll = role.isAdmin || role.defaultPermissions?.edit;\n const canDeleteAll = role.isAdmin || role.defaultPermissions?.delete;\n return (\n <TableRow\n key={role.name}\n onClick={() => {\n onRoleClicked(role);\n }}\n >\n <TableCell style={{ width: \"64px\" }}>\n {!role.isAdmin &&\n <Tooltip\n asChild={true}\n title={\"Delete this role\"}>\n <IconButton\n size={\"small\"}\n disabled={!editable}\n onClick={(event) => {\n event.stopPropagation();\n return setRoleToBeDeleted(role);\n }}>\n <DeleteIcon/>\n </IconButton>\n </Tooltip>}\n </TableCell>\n <TableCell>\n <RoleChip role={role}/>\n </TableCell>\n <TableCell className={\"items-center\"}>\n <Checkbox checked={role.isAdmin ?? false}/>\n </TableCell>\n <TableCell>\n <ul>\n {canCreateAll && <li>Create</li>}\n {canReadAll && <li>Read</li>}\n {canUpdateAll && <li>Update</li>}\n {canDeleteAll && <li>Delete</li>}\n </ul>\n </TableCell>\n </TableRow>\n );\n })}\n\n {(!roles || roles.length === 0) && <TableRow>\n <TableCell colspan={4}>\n <CenteredView className={\"flex flex-col gap-4 my-8 items-center\"}>\n <Typography variant={\"label\"}>\n You don't have any roles yet.\n </Typography>\n {allowDefaultRolesCreation && <Button variant={\"outlined\"}\n onClick={() => {\n DEFAULT_ROLES.forEach((role) => {\n saveRole(role);\n });\n }}>\n Create default roles\n </Button>}\n </CenteredView>\n </TableCell>\n </TableRow>}\n\n </TableBody>\n\n </Table>\n\n <ConfirmationDialog\n open={Boolean(roleToBeDeleted)}\n loading={deleteInProgress}\n onAccept={() => {\n if (roleToBeDeleted) {\n setDeleteInProgress(true);\n deleteRole(roleToBeDeleted)\n .then(() => {\n setRoleToBeDeleted(undefined);\n })\n .finally(() => {\n setDeleteInProgress(false);\n })\n }\n }}\n onCancel={() => {\n setRoleToBeDeleted(undefined);\n }}\n title={<>Delete?</>}\n body={<>Are you sure you want to delete this role?</>}/>\n\n </div>;\n}\n","import React, { useCallback, useState } from \"react\";\n\nimport { Role, useNavigationController } from \"@firecms/core\";\nimport { AddIcon, Button, Container, Typography } from \"@firecms/ui\";\nimport { RolesTable } from \"./RolesTable\";\nimport { RolesDetailsForm } from \"./RolesDetailsForm\";\n\nexport const RolesView = React.memo(\n function RolesView({ children }: { children?: React.ReactNode }) {\n\n const { collections } = useNavigationController();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [selectedRole, setSelectedRole] = useState<Role | undefined>();\n\n const onRoleClicked = useCallback((user: Role) => {\n setDialogOpen(true);\n setSelectedRole(user);\n }, []);\n\n const handleClose = () => {\n setSelectedRole(undefined);\n setDialogOpen(false);\n };\n\n return (\n <Container className=\"w-full flex flex-col py-4 gap-4\" maxWidth={\"6xl\"}>\n\n {children}\n\n <div className=\"flex items-center mt-12\">\n <Typography gutterBottom variant=\"h4\"\n className=\"flex-grow\"\n component=\"h4\">\n Roles\n </Typography>\n <Button\n size={\"large\"}\n startIcon={<AddIcon/>}\n onClick={() => setDialogOpen(true)}>\n Add role\n </Button>\n </div>\n\n <RolesTable onRoleClicked={onRoleClicked} editable={true}/>\n\n <RolesDetailsForm\n key={selectedRole?.id ?? \"new\"}\n open={dialogOpen}\n role={selectedRole}\n editable={true}\n collections={collections}\n handleClose={handleClose}/>\n\n </Container>\n )\n });\n","import React, { useCallback } from \"react\";\nimport * as Yup from \"yup\";\nimport {\n Button,\n CheckIcon,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n LoadingButton,\n MultiSelect,\n MultiSelectItem,\n TextField,\n} from \"@firecms/ui\";\nimport { FieldCaption, Role, useAuthController, User, useSnackbarController } from \"@firecms/core\";\nimport { Formex, useCreateFormex } from \"@firecms/formex\";\n\nimport { areRolesEqual } from \"../../utils\";\nimport { useUserManagement } from \"../../hooks\";\nimport { RoleChip } from \"../roles\";\n\nexport const UserYupSchema = Yup.object().shape({\n displayName: Yup.string().required(\"Required\"),\n email: Yup.string().email().required(\"Required\"),\n roles: Yup.array().min(1)\n});\n\nfunction canUserBeEdited(loggedUser: User, user: User, users: User[], roles: Role[], prevUser?: User) {\n const admins = users.filter(u => u.roles?.map(r => r.id).includes(\"admin\"));\n const loggedUserIsAdmin = loggedUser.roles?.map(r => r.id).includes(\"admin\");\n const didRolesChange = !prevUser || !areRolesEqual(prevUser.roles ?? [], user.roles ?? []);\n\n if (didRolesChange && !loggedUserIsAdmin) {\n throw new Error(\"Only admins can change roles\");\n }\n\n // was the admin role removed\n const adminRoleRemoved = prevUser && prevUser.roles?.map(r => r.id).includes(\"admin\") && !user.roles?.map(r => r.id).includes(\"admin\");\n\n // avoid removing the last admin\n if (adminRoleRemoved && admins.length === 1) {\n throw new Error(\"There must be at least one admin\");\n }\n return true;\n}\n\nexport function UserDetailsForm({\n open,\n user: userProp,\n handleClose\n }: {\n open: boolean,\n user?: User,\n handleClose: () => void\n}) {\n\n const snackbarController = useSnackbarController();\n const {\n user: loggedInUser\n } = useAuthController();\n const {\n saveUser,\n users,\n roles,\n } = useUserManagement();\n const isNewUser = !userProp;\n\n const onUserUpdated = useCallback((savedUser: User): Promise<User> => {\n if (!loggedInUser) {\n throw new Error(\"Logged user not found\");\n }\n try {\n canUserBeEdited(loggedInUser, savedUser, users, roles, userProp);\n return saveUser(savedUser);\n } catch (e: any) {\n return Promise.reject(e);\n }\n }, [roles, saveUser, userProp, users, loggedInUser]);\n\n const formex = useCreateFormex({\n initialValues: userProp ?? {\n displayName: \"\",\n email: \"\",\n roles: roles.filter(r => r.id === \"editor\")\n } as User,\n validation: (values) => {\n return UserYupSchema.validate(values, { abortEarly: false })\n .then(() => {\n return {};\n }).catch((e) => {\n return e.inner.reduce((acc: any, error: any) => {\n acc[error.path] = error.message;\n return acc;\n }, {});\n });\n },\n onSubmit: (user: User, formexController) => {\n\n return onUserUpdated(user)\n .then(() => {\n handleClose();\n formexController.resetForm({\n values: user\n });\n }).catch((e) => {\n snackbarController.open({\n type: \"error\",\n message: e.message\n });\n });\n }\n });\n\n const {\n isSubmitting,\n touched,\n handleChange,\n values,\n errors,\n setFieldValue,\n dirty,\n handleSubmit,\n submitCount\n } = formex;\n\n return (\n <Dialog\n open={open}\n onOpenChange={(open) => !open ? handleClose() : undefined}\n maxWidth={\"4xl\"}\n >\n <Formex value={formex}>\n <form\n onSubmit={handleSubmit}\n autoComplete={\"off\"}\n noValidate\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n position: \"relative\",\n height: \"100%\"\n }}>\n\n <DialogTitle variant={\"h4\"} gutterBottom={false}>\n User\n </DialogTitle>\n <DialogContent className=\"h-full flex-grow\">\n\n <div className={\"grid grid-cols-12 gap-8\"}>\n\n <div className={\"col-span-12\"}>\n <TextField\n name=\"displayName\"\n required\n error={submitCount > 0 && Boolean(errors.displayName)}\n value={values.displayName ?? \"\"}\n onChange={handleChange}\n aria-describedby=\"name-helper-text\"\n label=\"Name\"\n />\n <FieldCaption>\n {submitCount > 0 && Boolean(errors.displayName) ? errors.displayName : \"Name of this user\"}\n </FieldCaption>\n </div>\n <div className={\"col-span-12\"}>\n <TextField\n required\n error={submitCount > 0 && Boolean(errors.email)}\n name=\"email\"\n value={values.email ?? \"\"}\n onChange={handleChange}\n aria-describedby=\"email-helper-text\"\n label=\"Email\"\n />\n <FieldCaption>\n {submitCount > 0 && Boolean(errors.email) ? errors.email : \"Email of this user\"}\n </FieldCaption>\n </div>\n <div className={\"col-span-12\"}>\n <MultiSelect\n className={\"w-full\"}\n label=\"Roles\"\n value={values.roles?.map(r => r.id) ?? []}\n onValueChange={(value: string[]) => setFieldValue(\"roles\", value.map(id => roles.find(r => r.id === id) as Role))}\n // renderValue={(value: string) => {\n // const userRole = roles\n // .find((role) => role.id === value);\n // if (!userRole) return null;\n // return <div className=\"flex flex-wrap space-x-2 space-y-2\">\n // <RoleChip key={userRole?.id} role={userRole}/>\n // </div>;\n // }}\n >\n {roles.map(userRole => <MultiSelectItem key={userRole.id}\n value={userRole.id}>\n <RoleChip key={userRole?.id} role={userRole}/>\n </MultiSelectItem>)}\n </MultiSelect>\n </div>\n\n </div>\n\n </DialogContent>\n\n <DialogActions>\n\n <Button variant={\"text\"}\n onClick={() => {\n handleClose();\n }}>\n Cancel\n </Button>\n\n <LoadingButton\n variant=\"filled\"\n color=\"primary\"\n type=\"submit\"\n disabled={!dirty}\n loading={isSubmitting}\n startIcon={<CheckIcon/>}\n >\n {isNewUser ? \"Create user\" : \"Update\"}\n </LoadingButton>\n </DialogActions>\n </form>\n </Formex>\n\n </Dialog>\n );\n}\n","import { useState } from \"react\";\n\nimport { format } from \"date-fns\";\nimport * as locales from \"date-fns/locale\";\n\nimport {\n defaultDateFormat,\n ConfirmationDialog, Role,\n useAuthController,\n useCustomizationController, User,\n useSnackbarController\n} from \"@firecms/core\";\nimport {\n Button,\n CenteredView,\n DeleteIcon,\n IconButton,\n Table,\n TableBody,\n TableCell,\n TableHeader,\n TableRow,\n Tooltip,\n Typography,\n} from \"@firecms/ui\";\nimport { useUserManagement } from \"../../hooks\";\nimport { RoleChip } from \"../roles\";\nimport { PersistedUser } from \"../../types\";\n\nexport function UsersTable({ onUserClicked }: {\n onUserClicked: (user: User) => void;\n}) {\n\n const {\n users,\n saveUser,\n deleteUser\n } = useUserManagement<PersistedUser>();\n\n const authController = useAuthController();\n const snackbarController = useSnackbarController();\n\n const customizationController = useCustomizationController();\n const dateUtilsLocale = customizationController?.locale ? locales[customizationController?.locale as keyof typeof locales] : undefined;\n const dateFormat: string = customizationController?.dateTimeFormat ?? defaultDateFormat;\n\n const [userToBeDeleted, setUserToBeDeleted] = useState<User | undefined>(undefined);\n const [deleteInProgress, setDeleteInProgress] = useState<boolean>(false);\n\n return (\n <div className=\"overflow-auto\">\n\n <Table className={\"w-full\"}>\n\n <TableHeader>\n <TableCell className=\"truncate w-16\"></TableCell>\n <TableCell>Email</TableCell>\n <TableCell>Name</TableCell>\n <TableCell>Roles</TableCell>\n <TableCell>Created on</TableCell>\n </TableHeader>\n <TableBody>\n {users && users.map((user) => {\n\n const userRoles: Role[] | undefined = user.roles;\n\n const formattedDate = user.created_on ? format(user.created_on, dateFormat, { locale: dateUtilsLocale }) : \"\";\n\n return (\n <TableRow\n key={\"row_\" + user.uid}\n onClick={() => {\n onUserClicked(user);\n }}\n >\n <TableCell className={\"w-10\"}>\n <Tooltip\n asChild={true}\n title={\"Delete this user\"}>\n <IconButton\n size={\"small\"}\n onClick={(event) => {\n event.stopPropagation();\n return setUserToBeDeleted(user);\n }}>\n <DeleteIcon/>\n </IconButton>\n </Tooltip>\n </TableCell>\n <TableCell>{user.email}</TableCell>\n <TableCell className={\"font-medium align-left\"}>{user.displayName}</TableCell>\n <TableCell className=\"align-left\">\n {userRoles\n ? <div className=\"flex flex-wrap gap-2\">\n {userRoles.map(userRole =>\n <RoleChip key={userRole?.id} role={userRole}/>\n )}\n </div>\n : null}\n </TableCell>\n <TableCell>{formattedDate}</TableCell>\n </TableRow>\n );\n })}\n\n {(!users || users.length === 0) && <TableRow>\n <TableCell colspan={6}>\n <CenteredView className={\"flex flex-col gap-4 my-8 items-center\"}>\n <Typography variant={\"label\"}>\n There are no users yet\n </Typography>\n <Button variant={\"outlined\"}\n onClick={() => {\n if (!authController.user?.uid) {\n throw Error(\"UsersTable, authController misconfiguration\");\n }\n saveUser({\n uid: authController.user?.uid,\n email: authController.user?.email,\n displayName: authController.user?.displayName,\n photoURL: authController.user?.photoURL,\n providerId: authController.user?.providerId,\n isAnonymous: authController.user?.isAnonymous,\n roles: [{ id: \"admin\", name: \"Admin\" }],\n created_on: new Date()\n })\n .then(() => {\n snackbarController.open({\n type: \"success\",\n message: \"User added successfully\"\n })\n })\n .catch((error) => {\n snackbarController.open({\n type: \"error\",\n message: \"Error adding user: \" + error.message,\n })\n });\n }}>\n\n Add the logged user as an admin\n </Button>\n </CenteredView>\n </TableCell>\n </TableRow>}\n\n </TableBody>\n </Table>\n\n <ConfirmationDialog\n open={Boolean(userToBeDeleted)}\n loading={deleteInProgress}\n onAccept={() => {\n if (userToBeDeleted) {\n setDeleteInProgress(true);\n deleteUser(userToBeDeleted)\n .then(() => {\n setUserToBeDeleted(undefined);\n })\n .catch((error) => {\n snackbarController.open({\n type: \"error\",\n message: \"Error deleting user: \" + error.message,\n })\n })\n .finally(() => {\n setDeleteInProgress(false);\n })\n }\n }}\n onCancel={() => {\n setUserToBeDeleted(undefined);\n }}\n title={<>Delete?</>}\n body={<>Are you sure you want to delete this user?</>}/>\n </div>);\n}\n","import { AddIcon, Button, Container, Typography } from \"@firecms/ui\";\n\nimport { UsersTable } from \"./UsersTable\";\nimport { UserDetailsForm } from \"./UserDetailsForm\";\nimport React, { useCallback, useState } from \"react\";\nimport { useUserManagement } from \"../../hooks/useUserManagement\";\nimport { User } from \"@firecms/core\";\n\nexport const UsersView = function UsersView({ children }: { children?: React.ReactNode }) {\n\n const [dialogOpen, setDialogOpen] = useState<boolean>();\n const [selectedUser, setSelectedUser] = useState<User | undefined>();\n\n const { users } = useUserManagement();\n\n const onUserClicked = useCallback((user: User) => {\n setSelectedUser(user);\n setDialogOpen(true);\n }, []);\n\n const handleClose = useCallback(() => {\n setDialogOpen(false);\n setSelectedUser(undefined);\n }, []);\n\n return (\n <Container className=\"w-full flex flex-col py-4 gap-4\" maxWidth={\"6xl\"}>\n\n {children}\n\n <div\n className=\"flex items-center mt-12\">\n <Typography gutterBottom variant=\"h4\"\n className=\"flex-grow\"\n component=\"h4\">\n Users\n </Typography>\n <Button\n size={\"large\"}\n startIcon={<AddIcon/>}\n onClick={() => setDialogOpen(true)}>\n Add user\n </Button>\n </div>\n\n <UsersTable onUserClicked={onUserClicked}/>\n\n <UserDetailsForm\n key={selectedUser?.uid ?? \"new\"}\n open={dialogOpen ?? false}\n user={selectedUser}\n handleClose={handleClose}/>\n\n </Container>\n )\n};\n","import { FireCMSPlugin, useAuthController, User, useSnackbarController } from \"@firecms/core\";\nimport { UserManagementProvider } from \"./UserManagementProvider\";\nimport { UserManagement } from \"./types\";\nimport { AddIcon, Button, Paper, Typography } from \"@firecms/ui\";\nimport { DEFAULT_ROLES } from \"./components/roles/default_roles\";\n\nexport function useUserManagementPlugin<USER extends User = any>({ userManagement }: {\n userManagement: UserManagement<USER>,\n}): FireCMSPlugin {\n\n const noUsers = userManagement.users.length === 0;\n const noRoles = userManagement.roles.length === 0;\n\n return {\n key: \"user_management\",\n loading: userManagement.loading,\n\n homePage: {\n additionalChildrenStart: noUsers || noRoles\n ? <IntroWidget\n noUsers={noUsers}\n noRoles={noRoles}\n userManagement={userManagement}/>\n : undefined\n },\n provider: {\n Component: UserManagementProvider,\n props: {\n userManagement\n }\n }\n }\n}\n\nexport function IntroWidget({\n noUsers,\n noRoles,\n userManagement\n }: {\n noUsers: boolean;\n noRoles: boolean;\n userManagement: UserManagement<any>;\n}) {\n\n const authController = useAuthController();\n const snackbarController = useSnackbarController();\n\n const buttonLabel = noUsers && noRoles\n ? \"Create default roles and add current user as admin\"\n : noUsers\n ? \"Add current user as admin\"\n : noRoles ? \"Create default roles\" : undefined;\n\n return (\n <Paper\n className={\"my-4 flex flex-col px-4 py-6 bg-white dark:bg-surface-accent-800 gap-2\"}>\n <Typography variant={\"subtitle2\"} className={\"uppercase\"}>Create your users and roles</Typography>\n <Typography>\n You have no users or roles defined. You can create default roles and add the current user as admin.\n </Typography>\n <Button onClick={() => {\n if (!authController.user?.uid) {\n throw Error(\"UsersTable, authController misconfiguration\");\n }\n if (noUsers) {\n userManagement.saveUser({\n uid: authController.user?.uid,\n email: authController.user?.email,\n displayName: authController.user?.displayName,\n photoURL: authController.user?.photoURL,\n providerId: authController.user?.providerId,\n isAnonymous: authController.user?.isAnonymous,\n roles: [{\n id: \"admin\",\n name: \"Admin\"\n }],\n created_on: new Date()\n })\n .then(() => {\n snackbarController.open({\n type: \"success\",\n message: \"User added successfully\"\n })\n })\n .catch((error) => {\n snackbarController.open({\n type: \"error\",\n message: \"Error adding user: \" + error.message\n })\n });\n }\n if (noRoles) {\n DEFAULT_ROLES.forEach((role) => {\n userManagement.saveRole(role);\n });\n }\n }}>\n <AddIcon/>\n {buttonLabel}\n </Button>\n </Paper>\n );\n\n}\n","import { CMSView } from \"@firecms/core\";\nimport { RolesView, UsersView } from \"./components\";\n\nexport const userManagementAdminViews: CMSView[] = [\n {\n path: \"users\",\n name: \"CMS Users\",\n group: \"Admin\",\n icon: \"face\",\n view: <UsersView/>\n },\n {\n path: \"roles\",\n name: \"Roles\",\n group: \"Admin\",\n icon: \"gpp_good\",\n view: <RolesView/>\n }\n]\n"],"names":["RESERVED_GROUPS","DEFAULT_PERMISSIONS","read","edit","create","delete","resolveUserRolePermissions","collection","user","roles","ownerId","uid","basePermissions","map","role","resolveCollectionRole","id","reduce","mergePermissions","isAdmin","defaultPermissions","thisCollectionPermissions","collectionPermissions","permA","permB","getUserRoles","fireCMSUser","undefined","find","r","filter","Boolean","areRolesEqual","rolesA","rolesB","rolesAIds","rolesBIds","length","every","includes","cacheDelegatedLoginToken","projectId","delegatedToken","data","parseJwt","expiry","Date","exp","localStorage","setItem","JSON","stringify","token","getDelegatedLoginTokenFromCache","entry","getItem","parse","clearDelegatedLoginTokensCache","i","key","startsWith","removeItem","Error","base64Url","split","base64","replace","jsonPayload","decodeURIComponent","window","atob","c","charCodeAt","toString","slice","join","darkenColor","hexColor","darkenBy","test","color","substring","parseInt","g","b","Math","floor","hexToRgbaWithOpacity","opacity","alpha","useBuildUserManagement","authController","dataSourceDelegate","usersPath","rolesPath","allowDefaultRolesCreation","includeCollectionConfigPermissions","rolesLoading","setRolesLoading","React","useState","usersLoading","setUsersLoading","setRoles","usersWithRoleIds","setUsersWithRoleIds","users","u","rolesError","setRolesError","usersError","setUsersError","_usersLoading","_rolesLoading","loading","useEffect","initialised","initialLoading","listenCollection","path","onUpdate","entities","newRoles","entityToRoles","equal","e","error","onError","debug","newUsers","entitiesToUsers","saveUser","useCallback","roleIds","email","toLowerCase","trim","userExists","created_on","saveEntity","status","entityId","values","removeUndefined","then","saveRole","roleData","deleteUser","entity","deleteEntity","deleteRole","defineRolesFor","mgmtUser","authenticator","console","warn","userRoles","some","userRoleIds","setUserRoles","docs","doc","newVar","updated_on","UserManagementContext","createContext","UserManagementProvider","t0","$","_c","children","userManagement","t1","useUserManagement","useContext","RoleChip","colorScheme","getColorSchemeForSeed","name","Chip","RoleYupSchema","Yup","object","shape","string","required","canRoleBeEdited","loggedUser","loggedUserIsAdmin","RolesDetailsForm","open","editable","handleClose","collections","isNewRole","loggedInUser","useAuthController","savingError","setSavingError","role_0","onRoleUpdated","t2","t3","role_1","formexController","resetForm","catch","e_0","t4","Promise","resolve","initialValues","onSubmit","validation","_temp3","formex","useCreateFormex","isSubmitting","touched","values_0","errors","errors_0","handleChange","setFieldValue","dirty","setFieldTouched","defaultCreate","defaultRead","defaultEdit","defaultDelete","t5","idTouched","getIn","toSnakeCase","t6","t7","t8","Symbol","for","display","flexDirection","position","height","DialogTitle","t9","t10","t11","TextField","t12","t13","jsx","FieldCaption","t14","jsxs","t15","t16","t17","e_2","t18","t19","t20","t21","t22","TableHeader","TableCell","t23","t24","t25","t26","checked","t27","Tooltip","Checkbox","t28","t29","t30","checked_0","t31","t32","t33","t34","checked_1","t35","t36","t37","t38","checked_2","t39","t40","t41","TableRow","t42","col","checked_3","checked_4","checked_5","checked_6","Button","t43","Paper","Table","TableBody","t44","t45","t46","config","t47","t48","event","target","value","t49","createCollections","t50","t51","SelectItem","t52","Select","_temp4","t53","t54","t55","t56","t57","t58","event_0","t59","editCollections","t60","t61","t62","t63","_temp5","t64","t65","t66","t67","t68","t69","event_1","t70","deleteCollections","t71","t72","t73","t74","_temp6","t75","t76","t77","t78","DialogContent","t79","Typography","message","t80","t81","t82","CheckIcon","t83","t84","LoadingButton","t85","DialogActions","t86","handleSubmit","t87","Formex","t88","Dialog","value_1","value_0","validate","abortEarly","_temp","_temp2","e_1","inner","forEach","DEFAULT_ROLES","RolesTable","onRoleClicked","roleToBeDeleted","setRoleToBeDeleted","deleteInProgress","setDeleteInProgress","canCreateAll","canReadAll","canUpdateAll","canDeleteAll","width","IconButton","stopPropagation","DeleteIcon","CenteredView","finally","ConfirmationDialog","RolesView","memo","useNavigationController","dialogOpen","setDialogOpen","selectedRole","setSelectedRole","AddIcon","Container","UserYupSchema","displayName","array","min","canUserBeEdited","prevUser","admins","didRolesChange","adminRoleRemoved","UserDetailsForm","userProp","snackbarController","useSnackbarController","isNewUser","savedUser","reject","onUserUpdated","type","submitCount","open_0","r_1","_temp7","MultiSelect","userRole","MultiSelectItem","r_0","acc","UsersTable","onUserClicked","customizationController","useCustomizationController","dateUtilsLocale","locale","locales","dateFormat","dateTimeFormat","defaultDateFormat","userToBeDeleted","setUserToBeDeleted","formattedDate","format","photoURL","providerId","isAnonymous","error_0","UsersView","selectedUser","setSelectedUser","useUserManagementPlugin","noUsers","noRoles","additionalChildrenStart","Component","props","homePage","provider","IntroWidget","buttonLabel","userManagementAdminViews","group","icon","view"],"mappings":"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"}
|