@firecms/user_management 3.0.0-beta.4.pre.1 → 3.0.0-canary.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/UserManagementProvider.d.ts +4 -3
- package/dist/components/roles/RoleChip.d.ts +1 -1
- package/dist/components/roles/RolesDetailsForm.d.ts +1 -2
- package/dist/components/roles/RolesTable.d.ts +1 -1
- package/dist/components/roles/default_roles.d.ts +1 -1
- package/dist/components/users/UserDetailsForm.d.ts +2 -2
- package/dist/components/users/UsersTable.d.ts +2 -2
- package/dist/hooks/useBuildFirestoreUserManagement.d.ts +1 -3
- package/dist/hooks/useUserManagement.d.ts +3 -2
- package/dist/index.es.js +349 -338
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/types/index.d.ts +1 -2
- package/dist/types/persisted_user.d.ts +5 -0
- package/dist/types/user_management.d.ts +7 -10
- package/dist/utils/permissions.d.ts +3 -4
- package/package.json +8 -9
- package/src/UserManagementProvider.tsx +4 -3
- package/src/components/roles/RoleChip.tsx +1 -1
- package/src/components/roles/RolesDetailsForm.tsx +1 -2
- package/src/components/roles/RolesTable.tsx +1 -2
- package/src/components/roles/RolesView.tsx +1 -2
- package/src/components/roles/default_roles.tsx +1 -1
- package/src/components/users/UserDetailsForm.tsx +14 -13
- package/src/components/users/UsersTable.tsx +9 -10
- package/src/components/users/UsersView.tsx +3 -3
- package/src/hooks/useBuildFirestoreUserManagement.tsx +22 -23
- package/src/hooks/useUserManagement.tsx +3 -3
- package/src/types/index.ts +1 -2
- package/src/types/persisted_user.ts +6 -0
- package/src/types/user_management.tsx +8 -11
- package/src/useUserManagementPlugin.tsx +2 -2
- package/src/utils/permissions.ts +7 -5
- package/dist/types/firecms_user.d.ts +0 -7
- package/dist/types/roles.d.ts +0 -31
- package/src/types/firecms_user.ts +0 -8
- package/src/types/roles.ts +0 -41
- package/tailwind.config.js +0 -68
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "@firecms/user_management",
|
3
3
|
"type": "module",
|
4
|
-
"version": "3.0.0-
|
4
|
+
"version": "3.0.0-canary.10",
|
5
5
|
"publishConfig": {
|
6
6
|
"access": "public"
|
7
7
|
},
|
@@ -22,8 +22,7 @@
|
|
22
22
|
"require": "./dist/index.umd.js",
|
23
23
|
"types": "./dist/index.d.ts"
|
24
24
|
},
|
25
|
-
"./package.json": "./package.json"
|
26
|
-
"./tailwind.config.js": "./tailwind.config.js"
|
25
|
+
"./package.json": "./package.json"
|
27
26
|
},
|
28
27
|
"packageManager": "yarn@4.1.0",
|
29
28
|
"main": "./dist/index.umd.js",
|
@@ -31,9 +30,10 @@
|
|
31
30
|
"types": "dist/index.d.ts",
|
32
31
|
"source": "src/index.ts",
|
33
32
|
"dependencies": {
|
34
|
-
"@firecms/core": "^3.0.0-
|
35
|
-
"@firecms/formex": "^3.0.0-
|
36
|
-
"@firecms/ui": "^3.0.0-
|
33
|
+
"@firecms/core": "^3.0.0-canary.10",
|
34
|
+
"@firecms/formex": "^3.0.0-canary.10",
|
35
|
+
"@firecms/ui": "^3.0.0-canary.10",
|
36
|
+
"date-fns": "^3.6.0"
|
37
37
|
},
|
38
38
|
"peerDependencies": {
|
39
39
|
"firebase": "^10.7.1",
|
@@ -53,7 +53,7 @@
|
|
53
53
|
"eslint-plugin-react": "^7.34.1",
|
54
54
|
"eslint-plugin-react-hooks": "^4.6.0",
|
55
55
|
"typescript": "^5.4.2",
|
56
|
-
"vite": "^5.
|
56
|
+
"vite": "^5.2.3"
|
57
57
|
},
|
58
58
|
"scripts": {
|
59
59
|
"dev": "vite",
|
@@ -63,7 +63,6 @@
|
|
63
63
|
"files": [
|
64
64
|
"dist",
|
65
65
|
"src",
|
66
|
-
"tailwind.config.js",
|
67
66
|
"bin"
|
68
67
|
],
|
69
68
|
"eslintConfig": {
|
@@ -72,5 +71,5 @@
|
|
72
71
|
"react-app/jest"
|
73
72
|
]
|
74
73
|
},
|
75
|
-
"gitHead": "
|
74
|
+
"gitHead": "0cfaa281907c2626dd3d446747c3ac53a10bc8ea"
|
76
75
|
}
|
@@ -1,13 +1,14 @@
|
|
1
1
|
import React, { PropsWithChildren } from "react";
|
2
|
-
import { UserManagement
|
2
|
+
import { UserManagement } from "./types";
|
3
|
+
import { User } from "@firecms/core";
|
3
4
|
|
4
5
|
export const UserManagementContext = React.createContext<UserManagement<any>>({} as any);
|
5
6
|
|
6
|
-
export interface UserManagementProviderProps<U extends
|
7
|
+
export interface UserManagementProviderProps<U extends User = User> {
|
7
8
|
userManagement: UserManagement<U>
|
8
9
|
}
|
9
10
|
|
10
|
-
export function UserManagementProvider<U extends
|
11
|
+
export function UserManagementProvider<U extends User = User>({
|
11
12
|
children,
|
12
13
|
userManagement
|
13
14
|
}: PropsWithChildren<UserManagementProviderProps<U>>) {
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import React, { useCallback, useState } from "react";
|
2
2
|
import * as Yup from "yup";
|
3
3
|
|
4
|
-
import { EntityCollection, FieldCaption, toSnakeCase, } from "@firecms/core";
|
4
|
+
import { EntityCollection, FieldCaption, Role, toSnakeCase, } from "@firecms/core";
|
5
5
|
import {
|
6
6
|
Button,
|
7
7
|
Checkbox,
|
@@ -24,7 +24,6 @@ import {
|
|
24
24
|
} from "@firecms/ui";
|
25
25
|
import { useUserManagement } from "../../hooks";
|
26
26
|
import { Formex, getIn, useCreateFormex } from "@firecms/formex";
|
27
|
-
import { Role } from "../../types";
|
28
27
|
|
29
28
|
export const RoleYupSchema = Yup.object().shape({
|
30
29
|
id: Yup.string().required("Required"),
|
@@ -13,9 +13,8 @@ import {
|
|
13
13
|
Tooltip,
|
14
14
|
Typography
|
15
15
|
} from "@firecms/ui";
|
16
|
-
import { DeleteConfirmationDialog } from "@firecms/core";
|
16
|
+
import { DeleteConfirmationDialog, Role } from "@firecms/core";
|
17
17
|
import { useUserManagement } from "../../hooks";
|
18
|
-
import { Role } from "../../types";
|
19
18
|
import { RoleChip } from "./RoleChip";
|
20
19
|
import { DEFAULT_ROLES } from "./default_roles";
|
21
20
|
|
@@ -1,11 +1,10 @@
|
|
1
1
|
import React, { useCallback, useState } from "react";
|
2
2
|
|
3
|
-
import { useNavigationController } from "@firecms/core";
|
3
|
+
import { Role, useNavigationController } from "@firecms/core";
|
4
4
|
import { AddIcon, Button, Container, Tooltip, Typography } from "@firecms/ui";
|
5
5
|
import { RolesTable } from "./RolesTable";
|
6
6
|
import { RolesDetailsForm } from "./RolesDetailsForm";
|
7
7
|
import { useUserManagement } from "../../hooks";
|
8
|
-
import { Role } from "../../types";
|
9
8
|
|
10
9
|
export const RolesView = React.memo(
|
11
10
|
function RolesView({ children }: { children?: React.ReactNode }) {
|
@@ -12,10 +12,9 @@ import {
|
|
12
12
|
TextField,
|
13
13
|
Typography,
|
14
14
|
} from "@firecms/ui";
|
15
|
-
import { FieldCaption, useSnackbarController } from "@firecms/core";
|
15
|
+
import { FieldCaption, Role, useAuthController, User, useSnackbarController } from "@firecms/core";
|
16
16
|
import { Formex, useCreateFormex } from "@firecms/formex";
|
17
17
|
|
18
|
-
import { Role, UserWithRoles } from "../../types";
|
19
18
|
import { areRolesEqual } from "../../utils";
|
20
19
|
import { useUserManagement } from "../../hooks";
|
21
20
|
import { RoleChip } from "../roles";
|
@@ -26,17 +25,17 @@ export const UserYupSchema = Yup.object().shape({
|
|
26
25
|
roles: Yup.array().min(1)
|
27
26
|
});
|
28
27
|
|
29
|
-
function canUserBeEdited(loggedUser:
|
30
|
-
const admins = users.filter(u => u.roles
|
31
|
-
const loggedUserIsAdmin = loggedUser.roles
|
32
|
-
const didRolesChange = !prevUser || !areRolesEqual(prevUser.roles, user.roles);
|
28
|
+
function canUserBeEdited(loggedUser: User, user: User, users: User[], roles: Role[], prevUser?: User) {
|
29
|
+
const admins = users.filter(u => u.roles?.map(r => r.id).includes("admin"));
|
30
|
+
const loggedUserIsAdmin = loggedUser.roles?.map(r => r.id).includes("admin");
|
31
|
+
const didRolesChange = !prevUser || !areRolesEqual(prevUser.roles ?? [], user.roles ?? []);
|
33
32
|
|
34
33
|
if (didRolesChange && !loggedUserIsAdmin) {
|
35
34
|
throw new Error("Only admins can change roles");
|
36
35
|
}
|
37
36
|
|
38
37
|
// was the admin role removed
|
39
|
-
const adminRoleRemoved = prevUser && prevUser.roles
|
38
|
+
const adminRoleRemoved = prevUser && prevUser.roles?.map(r => r.id).includes("admin") && !user.roles?.map(r => r.id).includes("admin");
|
40
39
|
|
41
40
|
// avoid removing the last admin
|
42
41
|
if (adminRoleRemoved && admins.length === 1) {
|
@@ -51,20 +50,22 @@ export function UserDetailsForm({
|
|
51
50
|
handleClose
|
52
51
|
}: {
|
53
52
|
open: boolean,
|
54
|
-
user?:
|
53
|
+
user?: User,
|
55
54
|
handleClose: () => void
|
56
55
|
}) {
|
57
56
|
|
58
57
|
const snackbarController = useSnackbarController();
|
59
58
|
const {
|
60
|
-
loggedInUser
|
59
|
+
user: loggedInUser
|
60
|
+
} = useAuthController();
|
61
|
+
const {
|
61
62
|
saveUser,
|
62
63
|
users,
|
63
64
|
roles,
|
64
65
|
} = useUserManagement();
|
65
66
|
const isNewUser = !userProp;
|
66
67
|
|
67
|
-
const onUserUpdated = useCallback((savedUser:
|
68
|
+
const onUserUpdated = useCallback((savedUser: User): Promise<User> => {
|
68
69
|
if (!loggedInUser) {
|
69
70
|
throw new Error("Logged user not found");
|
70
71
|
}
|
@@ -81,7 +82,7 @@ export function UserDetailsForm({
|
|
81
82
|
displayName: "",
|
82
83
|
email: "",
|
83
84
|
roles: roles.filter(r => r.id === "editor")
|
84
|
-
} as
|
85
|
+
} as User,
|
85
86
|
validation: (values) => {
|
86
87
|
return UserYupSchema.validate(values, { abortEarly: false })
|
87
88
|
.then(() => {
|
@@ -93,7 +94,7 @@ export function UserDetailsForm({
|
|
93
94
|
}, {});
|
94
95
|
});
|
95
96
|
},
|
96
|
-
onSubmit: (user:
|
97
|
+
onSubmit: (user: User, formexController) => {
|
97
98
|
|
98
99
|
return onUserUpdated(user)
|
99
100
|
.then(() => {
|
@@ -181,7 +182,7 @@ export function UserDetailsForm({
|
|
181
182
|
<div className={"col-span-12"}>
|
182
183
|
<MultiSelect
|
183
184
|
label="Roles"
|
184
|
-
value={values.roles
|
185
|
+
value={values.roles?.map(r => r.id) ?? []}
|
185
186
|
onMultiValueChange={(value: string[]) => setFieldValue("roles", value.map(id => roles.find(r => r.id === id) as Role))}
|
186
187
|
renderValue={(value: string) => {
|
187
188
|
const userRole = roles
|
@@ -1,14 +1,13 @@
|
|
1
1
|
import { useState } from "react";
|
2
|
-
import { User as FirebaseUser } from "firebase/auth";
|
3
2
|
|
4
3
|
import { format } from "date-fns";
|
5
4
|
import * as locales from "date-fns/locale";
|
6
5
|
|
7
6
|
import {
|
8
7
|
defaultDateFormat,
|
9
|
-
DeleteConfirmationDialog,
|
8
|
+
DeleteConfirmationDialog, Role,
|
10
9
|
useAuthController,
|
11
|
-
useCustomizationController,
|
10
|
+
useCustomizationController, User,
|
12
11
|
useSnackbarController
|
13
12
|
} from "@firecms/core";
|
14
13
|
import {
|
@@ -24,28 +23,28 @@ import {
|
|
24
23
|
Tooltip,
|
25
24
|
Typography,
|
26
25
|
} from "@firecms/ui";
|
27
|
-
import {
|
28
|
-
import {
|
29
|
-
import {
|
26
|
+
import { useUserManagement } from "../../hooks";
|
27
|
+
import { RoleChip } from "../roles";
|
28
|
+
import { PersistedUser } from "../../types";
|
30
29
|
|
31
30
|
export function UsersTable({ onUserClicked }: {
|
32
|
-
onUserClicked: (user:
|
31
|
+
onUserClicked: (user: User) => void;
|
33
32
|
}) {
|
34
33
|
|
35
34
|
const {
|
36
35
|
users,
|
37
36
|
saveUser,
|
38
37
|
deleteUser
|
39
|
-
} = useUserManagement();
|
38
|
+
} = useUserManagement<PersistedUser>();
|
40
39
|
|
41
|
-
const authController = useAuthController
|
40
|
+
const authController = useAuthController();
|
42
41
|
const snackbarController = useSnackbarController();
|
43
42
|
|
44
43
|
const customizationController = useCustomizationController();
|
45
44
|
const dateUtilsLocale = customizationController?.locale ? locales[customizationController?.locale as keyof typeof locales] : undefined;
|
46
45
|
const dateFormat: string = customizationController?.dateTimeFormat ?? defaultDateFormat;
|
47
46
|
|
48
|
-
const [userToBeDeleted, setUserToBeDeleted] = useState<
|
47
|
+
const [userToBeDeleted, setUserToBeDeleted] = useState<User | undefined>(undefined);
|
49
48
|
const [deleteInProgress, setDeleteInProgress] = useState<boolean>(false);
|
50
49
|
|
51
50
|
return (
|
@@ -3,19 +3,19 @@ import { AddIcon, Button, Container, Typography } from "@firecms/ui";
|
|
3
3
|
import { UsersTable } from "./UsersTable";
|
4
4
|
import { UserDetailsForm } from "./UserDetailsForm";
|
5
5
|
import React, { useCallback, useState } from "react";
|
6
|
-
import { UserWithRoles } from "../../types";
|
7
6
|
import { useUserManagement } from "../../hooks/useUserManagement";
|
7
|
+
import { User } from "@firecms/core";
|
8
8
|
|
9
9
|
export const UsersView = function UsersView({ children }: { children?: React.ReactNode }) {
|
10
10
|
|
11
11
|
const [dialogOpen, setDialogOpen] = useState<boolean>();
|
12
|
-
const [selectedUser, setSelectedUser] = useState<
|
12
|
+
const [selectedUser, setSelectedUser] = useState<User | undefined>();
|
13
13
|
|
14
14
|
const { users, usersLimit } = useUserManagement();
|
15
15
|
|
16
16
|
const reachedUsersLimit = usersLimit !== undefined && (users && users.length >= usersLimit);
|
17
17
|
|
18
|
-
const onUserClicked = useCallback((user:
|
18
|
+
const onUserClicked = useCallback((user: User) => {
|
19
19
|
setSelectedUser(user);
|
20
20
|
setDialogOpen(true);
|
21
21
|
}, []);
|
@@ -10,8 +10,8 @@ import {
|
|
10
10
|
setDoc
|
11
11
|
} from "firebase/firestore";
|
12
12
|
import { FirebaseApp } from "firebase/app";
|
13
|
-
import {
|
14
|
-
import {
|
13
|
+
import { UserManagement } from "../types";
|
14
|
+
import { PermissionsBuilder, Role, User } from "@firecms/core";
|
15
15
|
import { resolveUserRolePermissions } from "../utils";
|
16
16
|
|
17
17
|
type UserWithRoleIds = User & { roles: string[] };
|
@@ -41,8 +41,6 @@ export interface UserManagementParams {
|
|
41
41
|
|
42
42
|
canEditRoles?: boolean;
|
43
43
|
|
44
|
-
authController: AuthController;
|
45
|
-
|
46
44
|
/**
|
47
45
|
* If there are no roles in the database, provide a button to create the default roles.
|
48
46
|
*/
|
@@ -70,7 +68,6 @@ export function useBuildFirestoreUserManagement({
|
|
70
68
|
rolesPath = "__FIRECMS/config/roles",
|
71
69
|
usersLimit,
|
72
70
|
canEditRoles = true,
|
73
|
-
authController,
|
74
71
|
allowDefaultRolesCreation,
|
75
72
|
includeCollectionConfigPermissions
|
76
73
|
}: UserManagementParams): UserManagement {
|
@@ -85,22 +82,13 @@ export function useBuildFirestoreUserManagement({
|
|
85
82
|
const users = usersWithRoleIds.map(u => ({
|
86
83
|
...u,
|
87
84
|
roles: roles.filter(r => u.roles?.includes(r.id))
|
88
|
-
}) as
|
85
|
+
}) as User);
|
89
86
|
|
90
87
|
const [rolesError, setRolesError] = React.useState<Error | undefined>();
|
91
88
|
const [usersError, setUsersError] = React.useState<Error | undefined>();
|
92
89
|
|
93
90
|
const loading = rolesLoading || usersLoading;
|
94
91
|
|
95
|
-
const loggedInUser: UserWithRoles | undefined = users.find(u => u.email?.toLowerCase() === authController.user?.email?.toLowerCase());
|
96
|
-
// console.log("authController", authController);
|
97
|
-
// if (!loading && !authController.authLoading) {
|
98
|
-
// const user = authController.user;
|
99
|
-
// if (user) {
|
100
|
-
// loggedInUser = users.find(u => u.email?.toLowerCase() === user.email?.toLowerCase());
|
101
|
-
// }
|
102
|
-
// }
|
103
|
-
|
104
92
|
useEffect(() => {
|
105
93
|
if (!firebaseApp) return;
|
106
94
|
firestoreRef.current = getFirestore(firebaseApp);
|
@@ -155,16 +143,19 @@ export function useBuildFirestoreUserManagement({
|
|
155
143
|
);
|
156
144
|
}, [firebaseApp, usersPath]);
|
157
145
|
|
158
|
-
const saveUser = useCallback(async (user:
|
146
|
+
const saveUser = useCallback(async (user: User): Promise<User> => {
|
159
147
|
const firestore = firestoreRef.current;
|
160
148
|
if (!firestore || !usersPath) throw Error("useFirestoreConfigurationPersistence Firestore not initialised");
|
161
149
|
console.debug("Persisting user", user);
|
162
|
-
const roleIds = user.roles
|
150
|
+
const roleIds = user.roles?.map(r => r.id);
|
163
151
|
const {
|
164
152
|
uid,
|
165
153
|
...userData
|
166
154
|
} = user;
|
167
|
-
return setDoc(doc(firestore, usersPath, uid), {
|
155
|
+
return setDoc(doc(firestore, usersPath, uid), {
|
156
|
+
...userData,
|
157
|
+
roles: roleIds
|
158
|
+
}, { merge: true }).then(() => user);
|
168
159
|
}, [usersPath]);
|
169
160
|
|
170
161
|
const saveRole = useCallback((role: Role): Promise<void> => {
|
@@ -179,7 +170,7 @@ export function useBuildFirestoreUserManagement({
|
|
179
170
|
return setDoc(ref, roleData, { merge: true });
|
180
171
|
}, [rolesPath]);
|
181
172
|
|
182
|
-
const deleteUser = useCallback(async (user:
|
173
|
+
const deleteUser = useCallback(async (user: User): Promise<void> => {
|
183
174
|
const firestore = firestoreRef.current;
|
184
175
|
if (!firestore || !usersPath) throw Error("useFirestoreConfigurationPersistence Firestore not initialised");
|
185
176
|
console.debug("Deleting", user);
|
@@ -198,14 +189,21 @@ export function useBuildFirestoreUserManagement({
|
|
198
189
|
|
199
190
|
const collectionPermissions: PermissionsBuilder = useCallback(({
|
200
191
|
collection,
|
192
|
+
user
|
201
193
|
}) => resolveUserRolePermissions({
|
202
194
|
collection,
|
203
|
-
user
|
204
|
-
}), [
|
195
|
+
user
|
196
|
+
}), []);
|
197
|
+
|
198
|
+
const userIds = users.map(u => u.uid);
|
199
|
+
const defineRolesFor: ((user: User) => Role[] | undefined) = useCallback((user) => {
|
200
|
+
if (!users) throw Error("Users not loaded");
|
201
|
+
const mgmtUser = users.find(u => u.email?.toLowerCase() === user?.email?.toLowerCase());
|
202
|
+
return mgmtUser?.roles;
|
203
|
+
}, [userIds]);
|
205
204
|
|
206
205
|
return {
|
207
206
|
loading,
|
208
|
-
loggedInUser,
|
209
207
|
roles,
|
210
208
|
users,
|
211
209
|
saveUser,
|
@@ -216,7 +214,8 @@ export function useBuildFirestoreUserManagement({
|
|
216
214
|
canEditRoles: canEditRoles === undefined ? true : canEditRoles,
|
217
215
|
allowDefaultRolesCreation: allowDefaultRolesCreation === undefined ? true : allowDefaultRolesCreation,
|
218
216
|
includeCollectionConfigPermissions: Boolean(includeCollectionConfigPermissions),
|
219
|
-
collectionPermissions
|
217
|
+
collectionPermissions,
|
218
|
+
defineRolesFor
|
220
219
|
}
|
221
220
|
}
|
222
221
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { useContext } from "react";
|
2
|
-
import { UserManagement } from "../types
|
2
|
+
import { UserManagement } from "../types";
|
3
3
|
import { UserManagementContext } from "../UserManagementProvider";
|
4
|
-
|
5
|
-
export const useUserManagement = () => useContext<UserManagement
|
4
|
+
import { User } from "@firecms/core";
|
5
|
+
export const useUserManagement = <USER extends User>() => useContext<UserManagement<USER>>(UserManagementContext);
|
package/src/types/index.ts
CHANGED
@@ -1,18 +1,9 @@
|
|
1
|
-
import {
|
2
|
-
import { Role } from "./roles";
|
3
|
-
import { PermissionsBuilder } from "@firecms/core";
|
1
|
+
import { PermissionsBuilder, Role, User } from "@firecms/core";
|
4
2
|
|
5
|
-
export type UserManagement<USER extends
|
3
|
+
export type UserManagement<USER extends User = User> = {
|
6
4
|
|
7
5
|
loading: boolean;
|
8
6
|
|
9
|
-
/**
|
10
|
-
* The user currently logged in, in the user management system.
|
11
|
-
* This is the same user that is logged in the Authenticator, but with the roles
|
12
|
-
* and permissions loaded.
|
13
|
-
*/
|
14
|
-
loggedInUser: USER | undefined;
|
15
|
-
|
16
7
|
users: USER[];
|
17
8
|
saveUser: (user: USER) => Promise<USER>;
|
18
9
|
deleteUser: (user: USER) => Promise<void>;
|
@@ -47,4 +38,10 @@ export type UserManagement<USER extends UserWithRoles = UserWithRoles> = {
|
|
47
38
|
*/
|
48
39
|
collectionPermissions: PermissionsBuilder;
|
49
40
|
|
41
|
+
/**
|
42
|
+
* Define the roles for a given user.
|
43
|
+
* @param user
|
44
|
+
*/
|
45
|
+
defineRolesFor: (user: User) => Promise<Role[]> | Role[] | undefined;
|
46
|
+
|
50
47
|
};
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import {
|
1
|
+
import { FireCMSPlugin } from "@firecms/core";
|
2
2
|
import { UserManagementProvider } from "./UserManagementProvider";
|
3
3
|
import { UserManagement } from "./types";
|
4
4
|
|
@@ -6,7 +6,7 @@ export function useUserManagementPlugin({ userManagement }: {
|
|
6
6
|
userManagement: UserManagement,
|
7
7
|
}): FireCMSPlugin {
|
8
8
|
return {
|
9
|
-
|
9
|
+
key: "user_management",
|
10
10
|
loading: userManagement.loading,
|
11
11
|
provider: {
|
12
12
|
Component: UserManagementProvider,
|
package/src/utils/permissions.ts
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
import {
|
2
|
-
import { Role, UserWithRoles } from "../types";
|
1
|
+
import { EntityCollection, Permissions, Role, User } from "@firecms/core";
|
3
2
|
|
4
3
|
export const RESERVED_GROUPS = ["Admin"];
|
5
4
|
|
@@ -10,8 +9,11 @@ const DEFAULT_PERMISSIONS = {
|
|
10
9
|
delete: false
|
11
10
|
};
|
12
11
|
|
13
|
-
export function resolveUserRolePermissions<UserType extends
|
14
|
-
({
|
12
|
+
export function resolveUserRolePermissions<UserType extends User>
|
13
|
+
({
|
14
|
+
collection,
|
15
|
+
user
|
16
|
+
}: {
|
15
17
|
collection: EntityCollection<any>,
|
16
18
|
user: UserType | null
|
17
19
|
}): Permissions {
|
@@ -66,7 +68,7 @@ const mergePermissions = (permA: Permissions, permB: Permissions) => {
|
|
66
68
|
};
|
67
69
|
}
|
68
70
|
|
69
|
-
export function getUserRoles(roles: Role[], fireCMSUser:
|
71
|
+
export function getUserRoles(roles: Role[], fireCMSUser: User): Role[] | undefined {
|
70
72
|
return !roles
|
71
73
|
? undefined
|
72
74
|
: (fireCMSUser.roles
|
package/dist/types/roles.d.ts
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
import { Permissions } from "@firecms/core";
|
2
|
-
export type Role = {
|
3
|
-
/**
|
4
|
-
* ID of the role
|
5
|
-
*/
|
6
|
-
id: string;
|
7
|
-
/**
|
8
|
-
* Name of the role
|
9
|
-
*/
|
10
|
-
name: string;
|
11
|
-
/**
|
12
|
-
* If this flag is true, the user can perform any action
|
13
|
-
*/
|
14
|
-
isAdmin?: boolean;
|
15
|
-
/**
|
16
|
-
* Default permissions for all collections for this role.
|
17
|
-
* You can override this values at the collection level using
|
18
|
-
* {@link collectionPermissions}
|
19
|
-
*/
|
20
|
-
defaultPermissions?: Permissions;
|
21
|
-
/**
|
22
|
-
* Record of stripped collection ids to their permissions.
|
23
|
-
* @see stripCollectionPath
|
24
|
-
*/
|
25
|
-
collectionPermissions?: Record<string, Permissions>;
|
26
|
-
config?: {
|
27
|
-
createCollections?: boolean;
|
28
|
-
editCollections?: boolean | "own";
|
29
|
-
deleteCollections?: boolean | "own";
|
30
|
-
};
|
31
|
-
};
|
package/src/types/roles.ts
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
import { Permissions } from "@firecms/core";
|
2
|
-
|
3
|
-
export type Role = {
|
4
|
-
|
5
|
-
/**
|
6
|
-
* ID of the role
|
7
|
-
*/
|
8
|
-
id: string;
|
9
|
-
|
10
|
-
/**
|
11
|
-
* Name of the role
|
12
|
-
*/
|
13
|
-
name: string;
|
14
|
-
|
15
|
-
/**
|
16
|
-
* If this flag is true, the user can perform any action
|
17
|
-
*/
|
18
|
-
isAdmin?: boolean;
|
19
|
-
|
20
|
-
/**
|
21
|
-
* Default permissions for all collections for this role.
|
22
|
-
* You can override this values at the collection level using
|
23
|
-
* {@link collectionPermissions}
|
24
|
-
*/
|
25
|
-
defaultPermissions?: Permissions;
|
26
|
-
|
27
|
-
/**
|
28
|
-
* Record of stripped collection ids to their permissions.
|
29
|
-
* @see stripCollectionPath
|
30
|
-
*/
|
31
|
-
collectionPermissions?: Record<string, Permissions>;
|
32
|
-
|
33
|
-
config?: {
|
34
|
-
|
35
|
-
createCollections?: boolean;
|
36
|
-
|
37
|
-
editCollections?: boolean | "own";
|
38
|
-
|
39
|
-
deleteCollections?: boolean | "own";
|
40
|
-
}
|
41
|
-
}
|