@firecms/user_management 3.0.0-canary.153 → 3.0.0-canary.155

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.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 USER extends User = CONTROLLER extends AuthController<infer U> ? U : 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 * Maximum number of users that can be created.\n */\n usersLimit?: number;\n\n /**\n * Can the logged user edit roles\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 authController\n * @param dataSourceDelegate\n * @param usersPath\n * @param rolesPath\n * @param usersLimit\n * @param canEditRoles\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 usersLimit,\n canEditRoles = true,\n allowDefaultRolesCreation,\n includeCollectionConfigPermissions\n }: UserManagementParams<CONTROLLER, USER>): 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 // if (authController.user === null) {\n // setUsersLoading(false);\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 // console.log(\"Setting roles\", {\n // user: authController.user,\n // userRoles\n // });\n // useEffect(() => {\n // console.debug(\"Setting roles\", {\n // authController,\n // userRoles\n // });\n // authController.setUserRoles?.(userRoles ?? []);\n // }, [userRoles?.map(r => r.id)]);\n\n return {\n loading,\n roles,\n users,\n saveUser,\n saveRole,\n rolesError,\n deleteUser,\n deleteRole,\n usersLimit,\n usersError,\n isAdmin,\n canEditRoles: canEditRoles === undefined ? true : canEditRoles,\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 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\nfunction canRoleBeEdited(loggedUser: User) {\n const loggedUserIsAdmin = loggedUser.roles?.map(r => r.id).includes(\"admin\");\n console.log(\"loggedUserIsAdmin\", loggedUser);\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 <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 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 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 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 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={<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 { 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&apos;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, 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\n asChild={true}\n 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 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={<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 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, 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, 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":["users","role","values","errors","RolesView","open","UsersView"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.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 * Maximum number of users that can be created.\n */\n usersLimit?: number;\n\n /**\n * Can the logged user edit roles\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 authController\n * @param dataSourceDelegate\n * @param usersPath\n * @param rolesPath\n * @param usersLimit\n * @param canEditRoles\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 usersLimit,\n canEditRoles = true,\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 usersLimit,\n usersError,\n isAdmin,\n canEditRoles: canEditRoles === undefined ? true : canEditRoles,\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 Dialog,\n DialogActions,\n DialogContent, DialogTitle,\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\nfunction canRoleBeEdited(loggedUser: User) {\n const loggedUserIsAdmin = loggedUser.roles?.map(r => r.id).includes(\"admin\");\n console.log(\"loggedUserIsAdmin\", loggedUser);\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={<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 { 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&apos;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, 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\n asChild={true}\n 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 DialogTitle,\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\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={<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 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, 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, 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","usersLimit","canEditRoles","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","RoleYupSchema","Yup","object","shape","string","required","canRoleBeEdited","loggedUser","loggedUserIsAdmin","log","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","t9","t10","t11","t12","t13","t14","t15","t16","t17","e_2","t18","t19","t20","t21","t22","t23","t24","t25","t26","checked","t27","t28","t29","t30","checked_0","t31","t32","t33","t34","checked_1","t35","t36","t37","t38","checked_2","t39","t40","t41","t42","col","checked_3","checked_4","checked_5","checked_6","t43","t44","t45","t46","config","t47","t48","event","target","value","t49","createCollections","t50","t51","t52","_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","t79","message","t80","t81","t82","t83","t84","t85","t86","handleSubmit","t87","t88","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","stopPropagation","finally","RolesView","memo","useNavigationController","dialogOpen","setDialogOpen","selectedRole","setSelectedRole","UserYupSchema","displayName","array","min","canUserBeEdited","prevUser","admins","didRolesChange","adminRoleRemoved","UserDetailsForm","userProp","snackbarController","useSnackbarController","isNewUser","savedUser","reject","onUserUpdated","type","submitCount","open_0","r_1","_temp7","userRole","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","reachedUsersLimit","useUserManagementPlugin","noUsers","noRoles","additionalChildrenStart","Component","props","homePage","provider","IntroWidget","buttonLabel","userManagementAdminViews","group","icon","view"],"mappings":"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"}