@webiny/app-admin 0.0.0-unstable.df7a8bb475 → 0.0.0-unstable.e2758ee1cf
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/base/Admin.js +3 -1
- package/base/Admin.js.map +1 -1
- package/base/Base/LexicalPreset.js +4 -5
- package/base/Base/LexicalPreset.js.map +1 -1
- package/base/Base/Menus.js +28 -18
- package/base/Base/Menus.js.map +1 -1
- package/base/Base.js +1 -2
- package/base/Base.js.map +1 -1
- package/components/DeveloperMode/DeveloperMode.d.ts +11 -0
- package/components/DeveloperMode/DeveloperMode.js +17 -0
- package/components/DeveloperMode/DeveloperMode.js.map +1 -0
- package/components/DeveloperMode/index.d.ts +2 -0
- package/components/DeveloperMode/index.js +3 -0
- package/components/DeveloperMode/index.js.map +1 -0
- package/components/LexicalEditor/LexicalLinkForm.d.ts +6 -0
- package/components/LexicalEditor/LexicalLinkForm.js +92 -0
- package/components/LexicalEditor/LexicalLinkForm.js.map +1 -0
- package/components/LexicalEditor/index.d.ts +1 -0
- package/components/LexicalEditor/index.js +1 -0
- package/components/LexicalEditor/index.js.map +1 -1
- package/components/Permissions/Permissions.d.ts +1 -3
- package/components/Permissions/Permissions.js +37 -31
- package/components/Permissions/Permissions.js.map +1 -1
- package/components/SimpleForm/SimpleForm.d.ts +1 -1
- package/components/Wcp.d.ts +2 -0
- package/components/Wcp.js +8 -1
- package/components/Wcp.js.map +1 -1
- package/components/index.d.ts +4 -1
- package/components/index.js +3 -1
- package/components/index.js.map +1 -1
- package/config/AdminConfig/Security.d.ts +3 -0
- package/config/AdminConfig/Security.js +6 -0
- package/config/AdminConfig/Security.js.map +1 -0
- package/config/AdminConfig/SecurityPermissions.d.ts +17 -0
- package/config/AdminConfig/SecurityPermissions.js +31 -0
- package/config/AdminConfig/SecurityPermissions.js.map +1 -0
- package/config/AdminConfig.d.ts +8 -1
- package/config/AdminConfig.js +8 -3
- package/config/AdminConfig.js.map +1 -1
- package/domain/Identity.js +1 -1
- package/domain/Identity.js.map +1 -1
- package/exports/admin/{buildParams.js → build-params.js} +1 -1
- package/exports/admin/build-params.js.map +1 -0
- package/exports/admin/form.d.ts +11 -0
- package/exports/admin/form.js +12 -0
- package/exports/admin/form.js.map +1 -0
- package/exports/admin/ui.d.ts +1 -0
- package/exports/admin/ui.js +1 -0
- package/exports/admin/ui.js.map +1 -1
- package/exports/admin.d.ts +4 -0
- package/exports/admin.js +4 -0
- package/exports/admin.js.map +1 -1
- package/features/wcp/ReactLicense.d.ts +1 -0
- package/features/wcp/ReactLicense.js +3 -0
- package/features/wcp/ReactLicense.js.map +1 -1
- package/index.d.ts +2 -1
- package/index.js +3 -1
- package/index.js.map +1 -1
- package/package.json +26 -29
- package/permissions/PermissionRenderer.d.ts +6 -0
- package/permissions/PermissionRenderer.js +219 -0
- package/permissions/PermissionRenderer.js.map +1 -0
- package/permissions/PermissionValueContext.d.ts +11 -0
- package/permissions/PermissionValueContext.js +23 -0
- package/permissions/PermissionValueContext.js.map +1 -0
- package/permissions/createHasPermission.d.ts +3 -0
- package/permissions/createHasPermission.js +36 -0
- package/permissions/createHasPermission.js.map +1 -0
- package/permissions/createPermissionSchema.d.ts +2 -0
- package/permissions/createPermissionSchema.js +8 -0
- package/permissions/createPermissionSchema.js.map +1 -0
- package/permissions/index.d.ts +8 -0
- package/permissions/index.js +8 -0
- package/permissions/index.js.map +1 -0
- package/permissions/types.d.ts +242 -0
- package/permissions/types.js +3 -0
- package/permissions/types.js.map +1 -0
- package/permissions/usePermissionForm.d.ts +17 -0
- package/permissions/usePermissionForm.js +256 -0
- package/permissions/usePermissionForm.js.map +1 -0
- package/permissions/usePermissions.d.ts +3 -0
- package/permissions/usePermissions.js +180 -0
- package/permissions/usePermissions.js.map +1 -0
- package/types.d.ts +0 -7
- package/types.js.map +1 -1
- package/base/Base/LexicalPreset/LinkEditForm.d.ts +0 -6
- package/base/Base/LexicalPreset/LinkEditForm.js +0 -63
- package/base/Base/LexicalPreset/LinkEditForm.js.map +0 -1
- package/exports/admin/buildParams.js.map +0 -1
- package/extensions/AdminBuildParam.d.ts +0 -11
- package/extensions/AdminBuildParam.js +0 -184
- package/extensions/AdminBuildParam.js.map +0 -1
- package/extensions/AdminExtension.d.ts +0 -11
- package/extensions/AdminExtension.js +0 -105
- package/extensions/AdminExtension.js.map +0 -1
- package/extensions/index.d.ts +0 -23
- package/extensions/index.js +0 -7
- package/extensions/index.js.map +0 -1
- package/plugins/PermissionRendererPlugin.d.ts +0 -22
- package/plugins/PermissionRendererPlugin.js +0 -19
- package/plugins/PermissionRendererPlugin.js.map +0 -1
- /package/exports/admin/{buildParams.d.ts → build-params.d.ts} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/app-admin",
|
|
3
|
-
"version": "0.0.0-unstable.
|
|
3
|
+
"version": "0.0.0-unstable.e2758ee1cf",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"description": "A collection of plugins that together form a complete admin interface, customizable and extensible with Webiny apps and plugins.",
|
|
@@ -15,29 +15,28 @@
|
|
|
15
15
|
"@apollo/react-hooks": "3.1.5",
|
|
16
16
|
"@emotion/react": "11.10.8",
|
|
17
17
|
"@emotion/styled": "11.10.6",
|
|
18
|
-
"@iconify/json": "2.2.
|
|
18
|
+
"@iconify/json": "2.2.445",
|
|
19
19
|
"@monaco-editor/react": "4.7.0",
|
|
20
20
|
"@svgr/webpack": "6.5.1",
|
|
21
21
|
"@types/mime": "2.0.3",
|
|
22
22
|
"@types/react": "18.2.79",
|
|
23
|
-
"@webiny/admin-ui": "0.0.0-unstable.
|
|
24
|
-
"@webiny/app": "0.0.0-unstable.
|
|
23
|
+
"@webiny/admin-ui": "0.0.0-unstable.e2758ee1cf",
|
|
24
|
+
"@webiny/app": "0.0.0-unstable.e2758ee1cf",
|
|
25
25
|
"@webiny/di": "0.2.3",
|
|
26
|
-
"@webiny/feature": "0.0.0-unstable.
|
|
27
|
-
"@webiny/form": "0.0.0-unstable.
|
|
28
|
-
"@webiny/icons": "0.0.0-unstable.
|
|
29
|
-
"@webiny/lexical-converter": "0.0.0-unstable.
|
|
30
|
-
"@webiny/lexical-editor": "0.0.0-unstable.
|
|
31
|
-
"@webiny/lexical-theme": "0.0.0-unstable.
|
|
32
|
-
"@webiny/plugins": "0.0.0-unstable.
|
|
33
|
-
"@webiny/
|
|
34
|
-
"@webiny/react-
|
|
35
|
-
"@webiny/
|
|
36
|
-
"@webiny/
|
|
37
|
-
"@webiny/
|
|
38
|
-
"@webiny/
|
|
39
|
-
"@webiny/
|
|
40
|
-
"@webiny/wcp": "0.0.0-unstable.df7a8bb475",
|
|
26
|
+
"@webiny/feature": "0.0.0-unstable.e2758ee1cf",
|
|
27
|
+
"@webiny/form": "0.0.0-unstable.e2758ee1cf",
|
|
28
|
+
"@webiny/icons": "0.0.0-unstable.e2758ee1cf",
|
|
29
|
+
"@webiny/lexical-converter": "0.0.0-unstable.e2758ee1cf",
|
|
30
|
+
"@webiny/lexical-editor": "0.0.0-unstable.e2758ee1cf",
|
|
31
|
+
"@webiny/lexical-theme": "0.0.0-unstable.e2758ee1cf",
|
|
32
|
+
"@webiny/plugins": "0.0.0-unstable.e2758ee1cf",
|
|
33
|
+
"@webiny/react-composition": "0.0.0-unstable.e2758ee1cf",
|
|
34
|
+
"@webiny/react-properties": "0.0.0-unstable.e2758ee1cf",
|
|
35
|
+
"@webiny/telemetry": "0.0.0-unstable.e2758ee1cf",
|
|
36
|
+
"@webiny/ui": "0.0.0-unstable.e2758ee1cf",
|
|
37
|
+
"@webiny/utils": "0.0.0-unstable.e2758ee1cf",
|
|
38
|
+
"@webiny/validation": "0.0.0-unstable.e2758ee1cf",
|
|
39
|
+
"@webiny/wcp": "0.0.0-unstable.e2758ee1cf",
|
|
41
40
|
"apollo-cache": "1.3.5",
|
|
42
41
|
"apollo-client": "2.6.10",
|
|
43
42
|
"apollo-link": "1.2.14",
|
|
@@ -45,13 +44,13 @@
|
|
|
45
44
|
"apollo-utilities": "1.3.4",
|
|
46
45
|
"classnames": "2.5.1",
|
|
47
46
|
"emotion": "10.0.27",
|
|
48
|
-
"graphql": "16.
|
|
47
|
+
"graphql": "16.13.0",
|
|
49
48
|
"graphql-tag": "2.12.6",
|
|
50
49
|
"history": "5.3.0",
|
|
51
50
|
"is-hotkey": "0.2.0",
|
|
52
51
|
"lodash": "4.17.23",
|
|
53
|
-
"markdown-to-jsx": "9.7.
|
|
54
|
-
"minimatch": "
|
|
52
|
+
"markdown-to-jsx": "9.7.6",
|
|
53
|
+
"minimatch": "10.2.4",
|
|
55
54
|
"mobx": "6.15.0",
|
|
56
55
|
"mobx-react-lite": "3.4.3",
|
|
57
56
|
"monaco-editor": "0.53.0",
|
|
@@ -60,14 +59,12 @@
|
|
|
60
59
|
"react-dom": "18.2.0",
|
|
61
60
|
"react-draggable": "4.5.0",
|
|
62
61
|
"react-resizable": "3.1.3",
|
|
63
|
-
"react-resizable-panels": "4.
|
|
62
|
+
"react-resizable-panels": "4.7.0",
|
|
64
63
|
"react-transition-group": "4.4.5",
|
|
65
64
|
"react-virtualized": "9.22.6",
|
|
66
65
|
"reset-css": "5.0.2",
|
|
67
66
|
"tinycolor2": "1.6.0",
|
|
68
|
-
"
|
|
69
|
-
"unicode-emoji-json": "0.8.0",
|
|
70
|
-
"zod": "3.25.76"
|
|
67
|
+
"unicode-emoji-json": "0.8.0"
|
|
71
68
|
},
|
|
72
69
|
"devDependencies": {
|
|
73
70
|
"@emotion/babel-plugin": "11.13.5",
|
|
@@ -79,10 +76,10 @@
|
|
|
79
76
|
"@types/react-transition-group": "4.4.12",
|
|
80
77
|
"@types/store": "2.0.5",
|
|
81
78
|
"@types/tinycolor2": "1.4.6",
|
|
82
|
-
"@webiny/build-tools": "0.0.0-unstable.
|
|
79
|
+
"@webiny/build-tools": "0.0.0-unstable.e2758ee1cf",
|
|
83
80
|
"rimraf": "6.1.3",
|
|
84
81
|
"typescript": "5.9.3",
|
|
85
|
-
"vitest": "
|
|
82
|
+
"vitest": "4.0.18"
|
|
86
83
|
},
|
|
87
84
|
"publishConfig": {
|
|
88
85
|
"access": "public",
|
|
@@ -105,5 +102,5 @@
|
|
|
105
102
|
]
|
|
106
103
|
}
|
|
107
104
|
},
|
|
108
|
-
"gitHead": "
|
|
105
|
+
"gitHead": "e2758ee1cfa3b9a7152e9bb995a90ccabd33266f"
|
|
109
106
|
}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import React, { Fragment, useCallback, useMemo } from "react";
|
|
2
|
+
import { CheckboxGroup, Grid, Select } from "@webiny/admin-ui";
|
|
3
|
+
import { Form } from "@webiny/form";
|
|
4
|
+
import { CannotUseAaclAlert, PermissionInfo, PermissionsGroup } from "../components/Permissions/index.js";
|
|
5
|
+
import { usePermissionForm } from "./usePermissionForm.js";
|
|
6
|
+
import { usePermissionValue } from "./PermissionValueContext.js";
|
|
7
|
+
import { useAuthentication } from "../exports/admin/security.js";
|
|
8
|
+
const NO_ACCESS = "no";
|
|
9
|
+
const FULL_ACCESS = "full";
|
|
10
|
+
const READ_ONLY_ACCESS = "read-only";
|
|
11
|
+
const CUSTOM_ACCESS = "custom";
|
|
12
|
+
const RWD_OPTIONS = [{
|
|
13
|
+
value: "r",
|
|
14
|
+
label: "Read"
|
|
15
|
+
}, {
|
|
16
|
+
value: "rw",
|
|
17
|
+
label: "Read, write"
|
|
18
|
+
}, {
|
|
19
|
+
value: "rwd",
|
|
20
|
+
label: "Read, write, delete"
|
|
21
|
+
}];
|
|
22
|
+
const PW_OPTIONS = [{
|
|
23
|
+
value: "p",
|
|
24
|
+
label: "Publish"
|
|
25
|
+
}, {
|
|
26
|
+
value: "u",
|
|
27
|
+
label: "Unpublish"
|
|
28
|
+
}];
|
|
29
|
+
function hasAction(entity, name) {
|
|
30
|
+
return entity.actions?.some(a => a.name === name) ?? false;
|
|
31
|
+
}
|
|
32
|
+
function buildScopeOptions(entity) {
|
|
33
|
+
const options = [{
|
|
34
|
+
value: NO_ACCESS,
|
|
35
|
+
label: "No access"
|
|
36
|
+
}];
|
|
37
|
+
if (entity.scopes.includes("full")) {
|
|
38
|
+
options.push({
|
|
39
|
+
value: FULL_ACCESS,
|
|
40
|
+
label: "Full access"
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
if (entity.scopes.includes("own")) {
|
|
44
|
+
options.push({
|
|
45
|
+
value: "own",
|
|
46
|
+
label: "Only entries created by the user"
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return options;
|
|
50
|
+
}
|
|
51
|
+
const BUILTIN_ACTIONS = new Set(["rwd", "pw"]);
|
|
52
|
+
function getCustomActions(entity) {
|
|
53
|
+
return (entity.actions ?? []).filter(a => !BUILTIN_ACTIONS.has(a.name));
|
|
54
|
+
}
|
|
55
|
+
function EntitySection({
|
|
56
|
+
entity,
|
|
57
|
+
data,
|
|
58
|
+
cannotUseAAcl,
|
|
59
|
+
Bind,
|
|
60
|
+
setValue
|
|
61
|
+
}) {
|
|
62
|
+
const scopeField = `${entity.id}AccessScope`;
|
|
63
|
+
const currentScope = data[scopeField];
|
|
64
|
+
const scopeDisabled = cannotUseAAcl || !currentScope || currentScope === NO_ACCESS;
|
|
65
|
+
const customActions = useMemo(() => getCustomActions(entity), [entity]);
|
|
66
|
+
|
|
67
|
+
// Derive the selected values array from individual boolean form fields.
|
|
68
|
+
const customActionsValue = useMemo(() => {
|
|
69
|
+
return customActions.filter(a => data[`${entity.id}Action_${a.name}`]).map(a => a.name);
|
|
70
|
+
}, [data, customActions, entity.id]);
|
|
71
|
+
const onCustomActionsChange = useCallback(selected => {
|
|
72
|
+
const selectedSet = new Set(selected);
|
|
73
|
+
for (const action of customActions) {
|
|
74
|
+
setValue(`${entity.id}Action_${action.name}`, selectedSet.has(action.name));
|
|
75
|
+
}
|
|
76
|
+
}, [customActions, entity.id, setValue]);
|
|
77
|
+
const columns = [/*#__PURE__*/React.createElement(Grid.Column, {
|
|
78
|
+
span: 12,
|
|
79
|
+
key: "access"
|
|
80
|
+
}, /*#__PURE__*/React.createElement(Bind, {
|
|
81
|
+
name: scopeField,
|
|
82
|
+
beforeChange: (value, cb) => {
|
|
83
|
+
if (value === "own" && hasAction(entity, "rwd")) {
|
|
84
|
+
setValue(`${entity.id}RWD`, "rwd");
|
|
85
|
+
}
|
|
86
|
+
cb(value);
|
|
87
|
+
}
|
|
88
|
+
}, /*#__PURE__*/React.createElement(Select, {
|
|
89
|
+
label: "Access Scope",
|
|
90
|
+
disabled: cannotUseAAcl,
|
|
91
|
+
options: buildScopeOptions(entity)
|
|
92
|
+
})))];
|
|
93
|
+
if (hasAction(entity, "rwd")) {
|
|
94
|
+
columns.push(/*#__PURE__*/React.createElement(Grid.Column, {
|
|
95
|
+
span: 12,
|
|
96
|
+
key: "rwd"
|
|
97
|
+
}, /*#__PURE__*/React.createElement(Bind, {
|
|
98
|
+
name: `${entity.id}RWD`
|
|
99
|
+
}, /*#__PURE__*/React.createElement(Select, {
|
|
100
|
+
label: "Primary Actions",
|
|
101
|
+
disabled: scopeDisabled || currentScope === "own",
|
|
102
|
+
options: RWD_OPTIONS
|
|
103
|
+
}))));
|
|
104
|
+
}
|
|
105
|
+
if (hasAction(entity, "pw")) {
|
|
106
|
+
columns.push(/*#__PURE__*/React.createElement(Grid.Column, {
|
|
107
|
+
span: 12,
|
|
108
|
+
key: "pw"
|
|
109
|
+
}, /*#__PURE__*/React.createElement(Bind, {
|
|
110
|
+
name: `${entity.id}PW`
|
|
111
|
+
}, /*#__PURE__*/React.createElement(CheckboxGroup, {
|
|
112
|
+
label: "Publishing actions",
|
|
113
|
+
description: "Publishing-related actions that can be performed on entries.",
|
|
114
|
+
items: PW_OPTIONS.map(opt => ({
|
|
115
|
+
...opt,
|
|
116
|
+
disabled: scopeDisabled
|
|
117
|
+
}))
|
|
118
|
+
}))));
|
|
119
|
+
}
|
|
120
|
+
if (customActions.length > 0) {
|
|
121
|
+
columns.push(/*#__PURE__*/React.createElement(Grid.Column, {
|
|
122
|
+
span: 12,
|
|
123
|
+
key: "other"
|
|
124
|
+
}, /*#__PURE__*/React.createElement(CheckboxGroup, {
|
|
125
|
+
label: "Other Actions",
|
|
126
|
+
value: customActionsValue,
|
|
127
|
+
onChange: onCustomActionsChange,
|
|
128
|
+
items: customActions.map(action => ({
|
|
129
|
+
value: action.name,
|
|
130
|
+
label: action.label || action.name,
|
|
131
|
+
disabled: scopeDisabled
|
|
132
|
+
}))
|
|
133
|
+
})));
|
|
134
|
+
}
|
|
135
|
+
return /*#__PURE__*/React.createElement(PermissionsGroup, {
|
|
136
|
+
title: entity.title || entity.id
|
|
137
|
+
}, /*#__PURE__*/React.createElement(Grid, null, columns));
|
|
138
|
+
}
|
|
139
|
+
export const PermissionRenderer = ({
|
|
140
|
+
schema
|
|
141
|
+
}) => {
|
|
142
|
+
const {
|
|
143
|
+
value,
|
|
144
|
+
onChange
|
|
145
|
+
} = usePermissionValue();
|
|
146
|
+
const {
|
|
147
|
+
identity
|
|
148
|
+
} = useAuthentication();
|
|
149
|
+
const cannotUseAAcl = useMemo(() => {
|
|
150
|
+
return !identity.getPermission("aacl", true);
|
|
151
|
+
}, []);
|
|
152
|
+
const {
|
|
153
|
+
formData,
|
|
154
|
+
onFormChange
|
|
155
|
+
} = usePermissionForm(schema, {
|
|
156
|
+
value,
|
|
157
|
+
onChange
|
|
158
|
+
});
|
|
159
|
+
const entities = schema.entities || [];
|
|
160
|
+
const hasEntities = entities.length > 0;
|
|
161
|
+
const accessLevelOptions = useMemo(() => {
|
|
162
|
+
const options = [{
|
|
163
|
+
value: NO_ACCESS,
|
|
164
|
+
label: "No access"
|
|
165
|
+
}];
|
|
166
|
+
if (schema.readOnlyAccess) {
|
|
167
|
+
options.push({
|
|
168
|
+
value: READ_ONLY_ACCESS,
|
|
169
|
+
label: "Read-only access"
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
options.push({
|
|
173
|
+
value: FULL_ACCESS,
|
|
174
|
+
label: "Full access"
|
|
175
|
+
});
|
|
176
|
+
if (hasEntities) {
|
|
177
|
+
options.push({
|
|
178
|
+
value: CUSTOM_ACCESS,
|
|
179
|
+
label: "Custom access"
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
return options;
|
|
183
|
+
}, [schema, hasEntities]);
|
|
184
|
+
return /*#__PURE__*/React.createElement(Form, {
|
|
185
|
+
data: formData,
|
|
186
|
+
onChange: onFormChange
|
|
187
|
+
}, ({
|
|
188
|
+
data,
|
|
189
|
+
Bind,
|
|
190
|
+
setValue
|
|
191
|
+
}) => /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(Grid, {
|
|
192
|
+
className: "pt-md"
|
|
193
|
+
}, /*#__PURE__*/React.createElement(Grid.Column, {
|
|
194
|
+
span: 12
|
|
195
|
+
}, data.accessLevel === CUSTOM_ACCESS && cannotUseAAcl && /*#__PURE__*/React.createElement(CannotUseAaclAlert, null))), /*#__PURE__*/React.createElement(Grid, {
|
|
196
|
+
className: "pt-md"
|
|
197
|
+
}, /*#__PURE__*/React.createElement(Grid.Column, {
|
|
198
|
+
span: 6
|
|
199
|
+
}, /*#__PURE__*/React.createElement(PermissionInfo, {
|
|
200
|
+
title: "Access Level"
|
|
201
|
+
})), /*#__PURE__*/React.createElement(Grid.Column, {
|
|
202
|
+
span: 6
|
|
203
|
+
}, /*#__PURE__*/React.createElement(Bind, {
|
|
204
|
+
name: "accessLevel"
|
|
205
|
+
}, /*#__PURE__*/React.createElement(Select, {
|
|
206
|
+
options: accessLevelOptions
|
|
207
|
+
})))), data.accessLevel === CUSTOM_ACCESS && hasEntities && /*#__PURE__*/React.createElement("div", {
|
|
208
|
+
className: "mt-lg"
|
|
209
|
+
}, entities.map(entity => /*#__PURE__*/React.createElement(EntitySection, {
|
|
210
|
+
key: entity.id,
|
|
211
|
+
entity: entity,
|
|
212
|
+
data: data,
|
|
213
|
+
cannotUseAAcl: cannotUseAAcl,
|
|
214
|
+
Bind: Bind,
|
|
215
|
+
setValue: setValue
|
|
216
|
+
})))));
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
//# sourceMappingURL=PermissionRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","Fragment","useCallback","useMemo","CheckboxGroup","Grid","Select","Form","CannotUseAaclAlert","PermissionInfo","PermissionsGroup","usePermissionForm","usePermissionValue","useAuthentication","NO_ACCESS","FULL_ACCESS","READ_ONLY_ACCESS","CUSTOM_ACCESS","RWD_OPTIONS","value","label","PW_OPTIONS","hasAction","entity","name","actions","some","a","buildScopeOptions","options","scopes","includes","push","BUILTIN_ACTIONS","Set","getCustomActions","filter","has","EntitySection","data","cannotUseAAcl","Bind","setValue","scopeField","id","currentScope","scopeDisabled","customActions","customActionsValue","map","onCustomActionsChange","selected","selectedSet","action","columns","createElement","Column","span","key","beforeChange","cb","disabled","description","items","opt","length","onChange","title","PermissionRenderer","schema","identity","getPermission","formData","onFormChange","entities","hasEntities","accessLevelOptions","readOnlyAccess","className","accessLevel"],"sources":["PermissionRenderer.tsx"],"sourcesContent":["import React, { Fragment, useCallback, useMemo } from \"react\";\nimport { CheckboxGroup, Grid, Select } from \"@webiny/admin-ui\";\nimport { Form } from \"@webiny/form\";\nimport type { BindComponent } from \"@webiny/form\";\nimport {\n CannotUseAaclAlert,\n PermissionInfo,\n PermissionsGroup\n} from \"../components/Permissions/index.js\";\nimport { usePermissionForm } from \"./usePermissionForm.js\";\nimport type { AaclPermission } from \"../features/wcp/types.js\";\nimport type { ActionDefinition, PermissionSchema, EntityDefinition } from \"./types.js\";\nimport { usePermissionValue } from \"./PermissionValueContext.js\";\nimport { useAuthentication } from \"~/exports/admin/security.js\";\n\nexport interface PermissionRendererProps {\n schema: PermissionSchema;\n}\n\nconst NO_ACCESS = \"no\";\nconst FULL_ACCESS = \"full\";\nconst READ_ONLY_ACCESS = \"read-only\";\nconst CUSTOM_ACCESS = \"custom\";\n\nconst RWD_OPTIONS = [\n { value: \"r\", label: \"Read\" },\n { value: \"rw\", label: \"Read, write\" },\n { value: \"rwd\", label: \"Read, write, delete\" }\n];\n\nconst PW_OPTIONS = [\n { value: \"p\", label: \"Publish\" },\n { value: \"u\", label: \"Unpublish\" }\n];\n\nfunction hasAction(entity: EntityDefinition, name: string): boolean {\n return entity.actions?.some(a => a.name === name) ?? false;\n}\n\nfunction buildScopeOptions(entity: EntityDefinition) {\n const options = [{ value: NO_ACCESS, label: \"No access\" }];\n\n if (entity.scopes.includes(\"full\")) {\n options.push({ value: FULL_ACCESS, label: \"Full access\" });\n }\n\n if (entity.scopes.includes(\"own\")) {\n options.push({ value: \"own\", label: \"Only entries created by the user\" });\n }\n\n return options;\n}\n\nconst BUILTIN_ACTIONS = new Set([\"rwd\", \"pw\"]);\n\nfunction getCustomActions(entity: EntityDefinition): ActionDefinition[] {\n return (entity.actions ?? []).filter(a => !BUILTIN_ACTIONS.has(a.name));\n}\n\ninterface EntitySectionProps {\n entity: EntityDefinition;\n data: Record<string, any>;\n cannotUseAAcl: boolean;\n Bind: BindComponent;\n setValue: (name: string, value: any) => void;\n}\n\nfunction EntitySection({ entity, data, cannotUseAAcl, Bind, setValue }: EntitySectionProps) {\n const scopeField = `${entity.id}AccessScope`;\n const currentScope = data[scopeField];\n const scopeDisabled = cannotUseAAcl || !currentScope || currentScope === NO_ACCESS;\n const customActions = useMemo(() => getCustomActions(entity), [entity]);\n\n // Derive the selected values array from individual boolean form fields.\n const customActionsValue = useMemo(() => {\n return customActions.filter(a => data[`${entity.id}Action_${a.name}`]).map(a => a.name);\n }, [data, customActions, entity.id]);\n\n const onCustomActionsChange = useCallback(\n (selected: string[]) => {\n const selectedSet = new Set(selected);\n for (const action of customActions) {\n setValue(`${entity.id}Action_${action.name}`, selectedSet.has(action.name));\n }\n },\n [customActions, entity.id, setValue]\n );\n\n const columns = [\n <Grid.Column span={12} key={\"access\"}>\n <Bind\n name={scopeField}\n beforeChange={(value: string, cb: (v: string) => void) => {\n if (value === \"own\" && hasAction(entity, \"rwd\")) {\n setValue(`${entity.id}RWD`, \"rwd\");\n }\n cb(value);\n }}\n >\n <Select\n label={\"Access Scope\"}\n disabled={cannotUseAAcl}\n options={buildScopeOptions(entity)}\n />\n </Bind>\n </Grid.Column>\n ];\n\n if (hasAction(entity, \"rwd\")) {\n columns.push(\n <Grid.Column span={12} key={\"rwd\"}>\n <Bind name={`${entity.id}RWD`}>\n <Select\n label={\"Primary Actions\"}\n disabled={scopeDisabled || currentScope === \"own\"}\n options={RWD_OPTIONS}\n />\n </Bind>\n </Grid.Column>\n );\n }\n\n if (hasAction(entity, \"pw\")) {\n columns.push(\n <Grid.Column span={12} key={\"pw\"}>\n <Bind name={`${entity.id}PW`}>\n <CheckboxGroup\n label={\"Publishing actions\"}\n description={\"Publishing-related actions that can be performed on entries.\"}\n items={PW_OPTIONS.map(opt => ({\n ...opt,\n disabled: scopeDisabled\n }))}\n />\n </Bind>\n </Grid.Column>\n );\n }\n\n if (customActions.length > 0) {\n columns.push(\n <Grid.Column span={12} key={\"other\"}>\n <CheckboxGroup\n label={\"Other Actions\"}\n value={customActionsValue}\n onChange={onCustomActionsChange}\n items={customActions.map(action => ({\n value: action.name,\n label: action.label || action.name,\n disabled: scopeDisabled\n }))}\n />\n </Grid.Column>\n );\n }\n\n return (\n <PermissionsGroup title={entity.title || entity.id}>\n <Grid>{columns}</Grid>\n </PermissionsGroup>\n );\n}\n\nexport const PermissionRenderer = ({ schema }: PermissionRendererProps) => {\n const { value, onChange } = usePermissionValue();\n const { identity } = useAuthentication();\n\n const cannotUseAAcl = useMemo(() => {\n return !identity.getPermission<AaclPermission>(\"aacl\", true);\n }, []);\n\n const { formData, onFormChange } = usePermissionForm(schema, { value, onChange });\n\n const entities = schema.entities || [];\n const hasEntities = entities.length > 0;\n\n const accessLevelOptions = useMemo(() => {\n const options = [{ value: NO_ACCESS, label: \"No access\" }];\n\n if (schema.readOnlyAccess) {\n options.push({ value: READ_ONLY_ACCESS, label: \"Read-only access\" });\n }\n\n options.push({ value: FULL_ACCESS, label: \"Full access\" });\n\n if (hasEntities) {\n options.push({ value: CUSTOM_ACCESS, label: \"Custom access\" });\n }\n\n return options;\n }, [schema, hasEntities]);\n\n return (\n <Form data={formData} onChange={onFormChange}>\n {({ data, Bind, setValue }) => (\n <Fragment>\n <Grid className={\"pt-md\"}>\n <Grid.Column span={12}>\n {data.accessLevel === CUSTOM_ACCESS && cannotUseAAcl && (\n <CannotUseAaclAlert />\n )}\n </Grid.Column>\n </Grid>\n <Grid className={\"pt-md\"}>\n <Grid.Column span={6}>\n <PermissionInfo title={\"Access Level\"} />\n </Grid.Column>\n <Grid.Column span={6}>\n <Bind name={\"accessLevel\"}>\n <Select options={accessLevelOptions} />\n </Bind>\n </Grid.Column>\n </Grid>\n {data.accessLevel === CUSTOM_ACCESS && hasEntities && (\n <div className={\"mt-lg\"}>\n {entities.map(entity => (\n <EntitySection\n key={entity.id}\n entity={entity}\n data={data}\n cannotUseAAcl={cannotUseAAcl}\n Bind={Bind}\n setValue={setValue}\n />\n ))}\n </div>\n )}\n </Fragment>\n )}\n </Form>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,QAAQ,EAAEC,WAAW,EAAEC,OAAO,QAAQ,OAAO;AAC7D,SAASC,aAAa,EAAEC,IAAI,EAAEC,MAAM,QAAQ,kBAAkB;AAC9D,SAASC,IAAI,QAAQ,cAAc;AAEnC,SACIC,kBAAkB,EAClBC,cAAc,EACdC,gBAAgB;AAEpB,SAASC,iBAAiB;AAG1B,SAASC,kBAAkB;AAC3B,SAASC,iBAAiB;AAM1B,MAAMC,SAAS,GAAG,IAAI;AACtB,MAAMC,WAAW,GAAG,MAAM;AAC1B,MAAMC,gBAAgB,GAAG,WAAW;AACpC,MAAMC,aAAa,GAAG,QAAQ;AAE9B,MAAMC,WAAW,GAAG,CAChB;EAAEC,KAAK,EAAE,GAAG;EAAEC,KAAK,EAAE;AAAO,CAAC,EAC7B;EAAED,KAAK,EAAE,IAAI;EAAEC,KAAK,EAAE;AAAc,CAAC,EACrC;EAAED,KAAK,EAAE,KAAK;EAAEC,KAAK,EAAE;AAAsB,CAAC,CACjD;AAED,MAAMC,UAAU,GAAG,CACf;EAAEF,KAAK,EAAE,GAAG;EAAEC,KAAK,EAAE;AAAU,CAAC,EAChC;EAAED,KAAK,EAAE,GAAG;EAAEC,KAAK,EAAE;AAAY,CAAC,CACrC;AAED,SAASE,SAASA,CAACC,MAAwB,EAAEC,IAAY,EAAW;EAChE,OAAOD,MAAM,CAACE,OAAO,EAAEC,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACH,IAAI,KAAKA,IAAI,CAAC,IAAI,KAAK;AAC9D;AAEA,SAASI,iBAAiBA,CAACL,MAAwB,EAAE;EACjD,MAAMM,OAAO,GAAG,CAAC;IAAEV,KAAK,EAAEL,SAAS;IAAEM,KAAK,EAAE;EAAY,CAAC,CAAC;EAE1D,IAAIG,MAAM,CAACO,MAAM,CAACC,QAAQ,CAAC,MAAM,CAAC,EAAE;IAChCF,OAAO,CAACG,IAAI,CAAC;MAAEb,KAAK,EAAEJ,WAAW;MAAEK,KAAK,EAAE;IAAc,CAAC,CAAC;EAC9D;EAEA,IAAIG,MAAM,CAACO,MAAM,CAACC,QAAQ,CAAC,KAAK,CAAC,EAAE;IAC/BF,OAAO,CAACG,IAAI,CAAC;MAAEb,KAAK,EAAE,KAAK;MAAEC,KAAK,EAAE;IAAmC,CAAC,CAAC;EAC7E;EAEA,OAAOS,OAAO;AAClB;AAEA,MAAMI,eAAe,GAAG,IAAIC,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAE9C,SAASC,gBAAgBA,CAACZ,MAAwB,EAAsB;EACpE,OAAO,CAACA,MAAM,CAACE,OAAO,IAAI,EAAE,EAAEW,MAAM,CAACT,CAAC,IAAI,CAACM,eAAe,CAACI,GAAG,CAACV,CAAC,CAACH,IAAI,CAAC,CAAC;AAC3E;AAUA,SAASc,aAAaA,CAAC;EAAEf,MAAM;EAAEgB,IAAI;EAAEC,aAAa;EAAEC,IAAI;EAAEC;AAA6B,CAAC,EAAE;EACxF,MAAMC,UAAU,GAAG,GAAGpB,MAAM,CAACqB,EAAE,aAAa;EAC5C,MAAMC,YAAY,GAAGN,IAAI,CAACI,UAAU,CAAC;EACrC,MAAMG,aAAa,GAAGN,aAAa,IAAI,CAACK,YAAY,IAAIA,YAAY,KAAK/B,SAAS;EAClF,MAAMiC,aAAa,GAAG5C,OAAO,CAAC,MAAMgC,gBAAgB,CAACZ,MAAM,CAAC,EAAE,CAACA,MAAM,CAAC,CAAC;;EAEvE;EACA,MAAMyB,kBAAkB,GAAG7C,OAAO,CAAC,MAAM;IACrC,OAAO4C,aAAa,CAACX,MAAM,CAACT,CAAC,IAAIY,IAAI,CAAC,GAAGhB,MAAM,CAACqB,EAAE,UAAUjB,CAAC,CAACH,IAAI,EAAE,CAAC,CAAC,CAACyB,GAAG,CAACtB,CAAC,IAAIA,CAAC,CAACH,IAAI,CAAC;EAC3F,CAAC,EAAE,CAACe,IAAI,EAAEQ,aAAa,EAAExB,MAAM,CAACqB,EAAE,CAAC,CAAC;EAEpC,MAAMM,qBAAqB,GAAGhD,WAAW,CACpCiD,QAAkB,IAAK;IACpB,MAAMC,WAAW,GAAG,IAAIlB,GAAG,CAACiB,QAAQ,CAAC;IACrC,KAAK,MAAME,MAAM,IAAIN,aAAa,EAAE;MAChCL,QAAQ,CAAC,GAAGnB,MAAM,CAACqB,EAAE,UAAUS,MAAM,CAAC7B,IAAI,EAAE,EAAE4B,WAAW,CAACf,GAAG,CAACgB,MAAM,CAAC7B,IAAI,CAAC,CAAC;IAC/E;EACJ,CAAC,EACD,CAACuB,aAAa,EAAExB,MAAM,CAACqB,EAAE,EAAEF,QAAQ,CACvC,CAAC;EAED,MAAMY,OAAO,GAAG,cACZtD,KAAA,CAAAuD,aAAA,CAAClD,IAAI,CAACmD,MAAM;IAACC,IAAI,EAAE,EAAG;IAACC,GAAG,EAAE;EAAS,gBACjC1D,KAAA,CAAAuD,aAAA,CAACd,IAAI;IACDjB,IAAI,EAAEmB,UAAW;IACjBgB,YAAY,EAAEA,CAACxC,KAAa,EAAEyC,EAAuB,KAAK;MACtD,IAAIzC,KAAK,KAAK,KAAK,IAAIG,SAAS,CAACC,MAAM,EAAE,KAAK,CAAC,EAAE;QAC7CmB,QAAQ,CAAC,GAAGnB,MAAM,CAACqB,EAAE,KAAK,EAAE,KAAK,CAAC;MACtC;MACAgB,EAAE,CAACzC,KAAK,CAAC;IACb;EAAE,gBAEFnB,KAAA,CAAAuD,aAAA,CAACjD,MAAM;IACHc,KAAK,EAAE,cAAe;IACtByC,QAAQ,EAAErB,aAAc;IACxBX,OAAO,EAAED,iBAAiB,CAACL,MAAM;EAAE,CACtC,CACC,CACG,CAAC,CACjB;EAED,IAAID,SAAS,CAACC,MAAM,EAAE,KAAK,CAAC,EAAE;IAC1B+B,OAAO,CAACtB,IAAI,cACRhC,KAAA,CAAAuD,aAAA,CAAClD,IAAI,CAACmD,MAAM;MAACC,IAAI,EAAE,EAAG;MAACC,GAAG,EAAE;IAAM,gBAC9B1D,KAAA,CAAAuD,aAAA,CAACd,IAAI;MAACjB,IAAI,EAAE,GAAGD,MAAM,CAACqB,EAAE;IAAM,gBAC1B5C,KAAA,CAAAuD,aAAA,CAACjD,MAAM;MACHc,KAAK,EAAE,iBAAkB;MACzByC,QAAQ,EAAEf,aAAa,IAAID,YAAY,KAAK,KAAM;MAClDhB,OAAO,EAAEX;IAAY,CACxB,CACC,CACG,CACjB,CAAC;EACL;EAEA,IAAII,SAAS,CAACC,MAAM,EAAE,IAAI,CAAC,EAAE;IACzB+B,OAAO,CAACtB,IAAI,cACRhC,KAAA,CAAAuD,aAAA,CAAClD,IAAI,CAACmD,MAAM;MAACC,IAAI,EAAE,EAAG;MAACC,GAAG,EAAE;IAAK,gBAC7B1D,KAAA,CAAAuD,aAAA,CAACd,IAAI;MAACjB,IAAI,EAAE,GAAGD,MAAM,CAACqB,EAAE;IAAK,gBACzB5C,KAAA,CAAAuD,aAAA,CAACnD,aAAa;MACVgB,KAAK,EAAE,oBAAqB;MAC5B0C,WAAW,EAAE,8DAA+D;MAC5EC,KAAK,EAAE1C,UAAU,CAAC4B,GAAG,CAACe,GAAG,KAAK;QAC1B,GAAGA,GAAG;QACNH,QAAQ,EAAEf;MACd,CAAC,CAAC;IAAE,CACP,CACC,CACG,CACjB,CAAC;EACL;EAEA,IAAIC,aAAa,CAACkB,MAAM,GAAG,CAAC,EAAE;IAC1BX,OAAO,CAACtB,IAAI,cACRhC,KAAA,CAAAuD,aAAA,CAAClD,IAAI,CAACmD,MAAM;MAACC,IAAI,EAAE,EAAG;MAACC,GAAG,EAAE;IAAQ,gBAChC1D,KAAA,CAAAuD,aAAA,CAACnD,aAAa;MACVgB,KAAK,EAAE,eAAgB;MACvBD,KAAK,EAAE6B,kBAAmB;MAC1BkB,QAAQ,EAAEhB,qBAAsB;MAChCa,KAAK,EAAEhB,aAAa,CAACE,GAAG,CAACI,MAAM,KAAK;QAChClC,KAAK,EAAEkC,MAAM,CAAC7B,IAAI;QAClBJ,KAAK,EAAEiC,MAAM,CAACjC,KAAK,IAAIiC,MAAM,CAAC7B,IAAI;QAClCqC,QAAQ,EAAEf;MACd,CAAC,CAAC;IAAE,CACP,CACQ,CACjB,CAAC;EACL;EAEA,oBACI9C,KAAA,CAAAuD,aAAA,CAAC7C,gBAAgB;IAACyD,KAAK,EAAE5C,MAAM,CAAC4C,KAAK,IAAI5C,MAAM,CAACqB;EAAG,gBAC/C5C,KAAA,CAAAuD,aAAA,CAAClD,IAAI,QAAEiD,OAAc,CACP,CAAC;AAE3B;AAEA,OAAO,MAAMc,kBAAkB,GAAGA,CAAC;EAAEC;AAAgC,CAAC,KAAK;EACvE,MAAM;IAAElD,KAAK;IAAE+C;EAAS,CAAC,GAAGtD,kBAAkB,CAAC,CAAC;EAChD,MAAM;IAAE0D;EAAS,CAAC,GAAGzD,iBAAiB,CAAC,CAAC;EAExC,MAAM2B,aAAa,GAAGrC,OAAO,CAAC,MAAM;IAChC,OAAO,CAACmE,QAAQ,CAACC,aAAa,CAAiB,MAAM,EAAE,IAAI,CAAC;EAChE,CAAC,EAAE,EAAE,CAAC;EAEN,MAAM;IAAEC,QAAQ;IAAEC;EAAa,CAAC,GAAG9D,iBAAiB,CAAC0D,MAAM,EAAE;IAAElD,KAAK;IAAE+C;EAAS,CAAC,CAAC;EAEjF,MAAMQ,QAAQ,GAAGL,MAAM,CAACK,QAAQ,IAAI,EAAE;EACtC,MAAMC,WAAW,GAAGD,QAAQ,CAACT,MAAM,GAAG,CAAC;EAEvC,MAAMW,kBAAkB,GAAGzE,OAAO,CAAC,MAAM;IACrC,MAAM0B,OAAO,GAAG,CAAC;MAAEV,KAAK,EAAEL,SAAS;MAAEM,KAAK,EAAE;IAAY,CAAC,CAAC;IAE1D,IAAIiD,MAAM,CAACQ,cAAc,EAAE;MACvBhD,OAAO,CAACG,IAAI,CAAC;QAAEb,KAAK,EAAEH,gBAAgB;QAAEI,KAAK,EAAE;MAAmB,CAAC,CAAC;IACxE;IAEAS,OAAO,CAACG,IAAI,CAAC;MAAEb,KAAK,EAAEJ,WAAW;MAAEK,KAAK,EAAE;IAAc,CAAC,CAAC;IAE1D,IAAIuD,WAAW,EAAE;MACb9C,OAAO,CAACG,IAAI,CAAC;QAAEb,KAAK,EAAEF,aAAa;QAAEG,KAAK,EAAE;MAAgB,CAAC,CAAC;IAClE;IAEA,OAAOS,OAAO;EAClB,CAAC,EAAE,CAACwC,MAAM,EAAEM,WAAW,CAAC,CAAC;EAEzB,oBACI3E,KAAA,CAAAuD,aAAA,CAAChD,IAAI;IAACgC,IAAI,EAAEiC,QAAS;IAACN,QAAQ,EAAEO;EAAa,GACxC,CAAC;IAAElC,IAAI;IAAEE,IAAI;IAAEC;EAAS,CAAC,kBACtB1C,KAAA,CAAAuD,aAAA,CAACtD,QAAQ,qBACLD,KAAA,CAAAuD,aAAA,CAAClD,IAAI;IAACyE,SAAS,EAAE;EAAQ,gBACrB9E,KAAA,CAAAuD,aAAA,CAAClD,IAAI,CAACmD,MAAM;IAACC,IAAI,EAAE;EAAG,GACjBlB,IAAI,CAACwC,WAAW,KAAK9D,aAAa,IAAIuB,aAAa,iBAChDxC,KAAA,CAAAuD,aAAA,CAAC/C,kBAAkB,MAAE,CAEhB,CACX,CAAC,eACPR,KAAA,CAAAuD,aAAA,CAAClD,IAAI;IAACyE,SAAS,EAAE;EAAQ,gBACrB9E,KAAA,CAAAuD,aAAA,CAAClD,IAAI,CAACmD,MAAM;IAACC,IAAI,EAAE;EAAE,gBACjBzD,KAAA,CAAAuD,aAAA,CAAC9C,cAAc;IAAC0D,KAAK,EAAE;EAAe,CAAE,CAC/B,CAAC,eACdnE,KAAA,CAAAuD,aAAA,CAAClD,IAAI,CAACmD,MAAM;IAACC,IAAI,EAAE;EAAE,gBACjBzD,KAAA,CAAAuD,aAAA,CAACd,IAAI;IAACjB,IAAI,EAAE;EAAc,gBACtBxB,KAAA,CAAAuD,aAAA,CAACjD,MAAM;IAACuB,OAAO,EAAE+C;EAAmB,CAAE,CACpC,CACG,CACX,CAAC,EACNrC,IAAI,CAACwC,WAAW,KAAK9D,aAAa,IAAI0D,WAAW,iBAC9C3E,KAAA,CAAAuD,aAAA;IAAKuB,SAAS,EAAE;EAAQ,GACnBJ,QAAQ,CAACzB,GAAG,CAAC1B,MAAM,iBAChBvB,KAAA,CAAAuD,aAAA,CAACjB,aAAa;IACVoB,GAAG,EAAEnC,MAAM,CAACqB,EAAG;IACfrB,MAAM,EAAEA,MAAO;IACfgB,IAAI,EAAEA,IAAK;IACXC,aAAa,EAAEA,aAAc;IAC7BC,IAAI,EAAEA,IAAK;IACXC,QAAQ,EAAEA;EAAS,CACtB,CACJ,CACA,CAEH,CAEZ,CAAC;AAEf,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { Permission } from "./types.js";
|
|
3
|
+
interface PermissionValueContextValue {
|
|
4
|
+
value: Permission[];
|
|
5
|
+
onChange: (value: Permission[]) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare const PermissionValueProvider: ({ value, onChange, children }: PermissionValueContextValue & {
|
|
8
|
+
children: React.ReactNode;
|
|
9
|
+
}) => React.JSX.Element;
|
|
10
|
+
export declare function usePermissionValue(): PermissionValueContextValue;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React, { useContext } from "react";
|
|
2
|
+
const PermissionValueContext = /*#__PURE__*/React.createContext(null);
|
|
3
|
+
export const PermissionValueProvider = ({
|
|
4
|
+
value,
|
|
5
|
+
onChange,
|
|
6
|
+
children
|
|
7
|
+
}) => {
|
|
8
|
+
return /*#__PURE__*/React.createElement(PermissionValueContext.Provider, {
|
|
9
|
+
value: {
|
|
10
|
+
value,
|
|
11
|
+
onChange
|
|
12
|
+
}
|
|
13
|
+
}, children);
|
|
14
|
+
};
|
|
15
|
+
export function usePermissionValue() {
|
|
16
|
+
const ctx = useContext(PermissionValueContext);
|
|
17
|
+
if (!ctx) {
|
|
18
|
+
throw new Error("usePermissionValue must be used within a PermissionValueProvider");
|
|
19
|
+
}
|
|
20
|
+
return ctx;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=PermissionValueContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","useContext","PermissionValueContext","createContext","PermissionValueProvider","value","onChange","children","createElement","Provider","usePermissionValue","ctx","Error"],"sources":["PermissionValueContext.tsx"],"sourcesContent":["import React, { useContext } from \"react\";\nimport type { Permission } from \"./types.js\";\n\ninterface PermissionValueContextValue {\n value: Permission[];\n onChange: (value: Permission[]) => void;\n}\n\nconst PermissionValueContext = React.createContext<PermissionValueContextValue | null>(null);\n\nexport const PermissionValueProvider = ({\n value,\n onChange,\n children\n}: PermissionValueContextValue & { children: React.ReactNode }) => {\n return (\n <PermissionValueContext.Provider value={{ value, onChange }}>\n {children}\n </PermissionValueContext.Provider>\n );\n};\n\nexport function usePermissionValue(): PermissionValueContextValue {\n const ctx = useContext(PermissionValueContext);\n if (!ctx) {\n throw new Error(\"usePermissionValue must be used within a PermissionValueProvider\");\n }\n return ctx;\n}\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,UAAU,QAAQ,OAAO;AAQzC,MAAMC,sBAAsB,gBAAGF,KAAK,CAACG,aAAa,CAAqC,IAAI,CAAC;AAE5F,OAAO,MAAMC,uBAAuB,GAAGA,CAAC;EACpCC,KAAK;EACLC,QAAQ;EACRC;AACyD,CAAC,KAAK;EAC/D,oBACIP,KAAA,CAAAQ,aAAA,CAACN,sBAAsB,CAACO,QAAQ;IAACJ,KAAK,EAAE;MAAEA,KAAK;MAAEC;IAAS;EAAE,GACvDC,QAC4B,CAAC;AAE1C,CAAC;AAED,OAAO,SAASG,kBAAkBA,CAAA,EAAgC;EAC9D,MAAMC,GAAG,GAAGV,UAAU,CAACC,sBAAsB,CAAC;EAC9C,IAAI,CAACS,GAAG,EAAE;IACN,MAAM,IAAIC,KAAK,CAAC,kEAAkE,CAAC;EACvF;EACA,OAAOD,GAAG;AACd","ignoreList":[]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { createUsePermissions } from "./usePermissions.js";
|
|
3
|
+
const BUILT_IN_ACTIONS = {
|
|
4
|
+
read: "canRead",
|
|
5
|
+
create: "canCreate",
|
|
6
|
+
edit: "canEdit",
|
|
7
|
+
delete: "canDelete",
|
|
8
|
+
publish: "canPublish",
|
|
9
|
+
unpublish: "canUnpublish"
|
|
10
|
+
};
|
|
11
|
+
export function createHasPermission(schema) {
|
|
12
|
+
const usePermissions = createUsePermissions(schema);
|
|
13
|
+
return function HasPermission({
|
|
14
|
+
children,
|
|
15
|
+
...props
|
|
16
|
+
}) {
|
|
17
|
+
const permissions = usePermissions();
|
|
18
|
+
const action = props.action;
|
|
19
|
+
const entities = props.entity ? [props.entity] : props.any ?? props.all ?? [];
|
|
20
|
+
const requireAll = !!props.all;
|
|
21
|
+
const check = entityId => {
|
|
22
|
+
if (!action) {
|
|
23
|
+
return permissions.canAccess(entityId);
|
|
24
|
+
}
|
|
25
|
+
const method = BUILT_IN_ACTIONS[action];
|
|
26
|
+
if (method) {
|
|
27
|
+
return permissions[method](entityId);
|
|
28
|
+
}
|
|
29
|
+
return permissions.canAction(action, entityId);
|
|
30
|
+
};
|
|
31
|
+
const allowed = requireAll ? entities.every(check) : entities.some(check);
|
|
32
|
+
return allowed ? /*#__PURE__*/React.createElement(React.Fragment, null, children) : null;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=createHasPermission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","createUsePermissions","BUILT_IN_ACTIONS","read","create","edit","delete","publish","unpublish","createHasPermission","schema","usePermissions","HasPermission","children","props","permissions","action","entities","entity","any","all","requireAll","check","entityId","canAccess","method","canAction","allowed","every","some","createElement","Fragment"],"sources":["createHasPermission.tsx"],"sourcesContent":["import React from \"react\";\nimport { createUsePermissions } from \"./usePermissions.js\";\nimport type { PermissionSchemaConfig, HasPermissionProps } from \"./types.js\";\n\nconst BUILT_IN_ACTIONS: Record<string, string> = {\n read: \"canRead\",\n create: \"canCreate\",\n edit: \"canEdit\",\n delete: \"canDelete\",\n publish: \"canPublish\",\n unpublish: \"canUnpublish\"\n};\n\nexport function createHasPermission<const S extends PermissionSchemaConfig>(\n schema: S\n): React.FC<HasPermissionProps<S>> {\n const usePermissions = createUsePermissions(schema);\n\n return function HasPermission({ children, ...props }) {\n const permissions = usePermissions();\n\n const action = props.action as string | undefined;\n const entities: string[] = props.entity ? [props.entity] : (props.any ?? props.all ?? []);\n const requireAll = !!props.all;\n\n const check = (entityId: string): boolean => {\n if (!action) {\n return permissions.canAccess(entityId as any);\n }\n const method = BUILT_IN_ACTIONS[action];\n if (method) {\n return (permissions as any)[method](entityId);\n }\n return permissions.canAction(action as any, entityId as any);\n };\n\n const allowed = requireAll ? entities.every(check) : entities.some(check);\n\n return allowed ? <>{children}</> : null;\n };\n}\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,oBAAoB;AAG7B,MAAMC,gBAAwC,GAAG;EAC7CC,IAAI,EAAE,SAAS;EACfC,MAAM,EAAE,WAAW;EACnBC,IAAI,EAAE,SAAS;EACfC,MAAM,EAAE,WAAW;EACnBC,OAAO,EAAE,YAAY;EACrBC,SAAS,EAAE;AACf,CAAC;AAED,OAAO,SAASC,mBAAmBA,CAC/BC,MAAS,EACsB;EAC/B,MAAMC,cAAc,GAAGV,oBAAoB,CAACS,MAAM,CAAC;EAEnD,OAAO,SAASE,aAAaA,CAAC;IAAEC,QAAQ;IAAE,GAAGC;EAAM,CAAC,EAAE;IAClD,MAAMC,WAAW,GAAGJ,cAAc,CAAC,CAAC;IAEpC,MAAMK,MAAM,GAAGF,KAAK,CAACE,MAA4B;IACjD,MAAMC,QAAkB,GAAGH,KAAK,CAACI,MAAM,GAAG,CAACJ,KAAK,CAACI,MAAM,CAAC,GAAIJ,KAAK,CAACK,GAAG,IAAIL,KAAK,CAACM,GAAG,IAAI,EAAG;IACzF,MAAMC,UAAU,GAAG,CAAC,CAACP,KAAK,CAACM,GAAG;IAE9B,MAAME,KAAK,GAAIC,QAAgB,IAAc;MACzC,IAAI,CAACP,MAAM,EAAE;QACT,OAAOD,WAAW,CAACS,SAAS,CAACD,QAAe,CAAC;MACjD;MACA,MAAME,MAAM,GAAGvB,gBAAgB,CAACc,MAAM,CAAC;MACvC,IAAIS,MAAM,EAAE;QACR,OAAQV,WAAW,CAASU,MAAM,CAAC,CAACF,QAAQ,CAAC;MACjD;MACA,OAAOR,WAAW,CAACW,SAAS,CAACV,MAAM,EAASO,QAAe,CAAC;IAChE,CAAC;IAED,MAAMI,OAAO,GAAGN,UAAU,GAAGJ,QAAQ,CAACW,KAAK,CAACN,KAAK,CAAC,GAAGL,QAAQ,CAACY,IAAI,CAACP,KAAK,CAAC;IAEzE,OAAOK,OAAO,gBAAG3B,KAAA,CAAA8B,aAAA,CAAA9B,KAAA,CAAA+B,QAAA,QAAGlB,QAAW,CAAC,GAAG,IAAI;EAC3C,CAAC;AACL","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createPermissionSchema","config","entities"],"sources":["createPermissionSchema.ts"],"sourcesContent":["import type { PermissionSchemaConfig } from \"./types.js\";\n\nexport function createPermissionSchema<const T extends PermissionSchemaConfig>(config: T): T {\n return {\n ...config,\n entities: config.entities ?? []\n };\n}\n"],"mappings":"AAEA,OAAO,SAASA,sBAAsBA,CAAyCC,MAAS,EAAK;EACzF,OAAO;IACH,GAAGA,MAAM;IACTC,QAAQ,EAAED,MAAM,CAACC,QAAQ,IAAI;EACjC,CAAC;AACL","ignoreList":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { createPermissionSchema } from "./createPermissionSchema.js";
|
|
2
|
+
export { createUsePermissions } from "./usePermissions.js";
|
|
3
|
+
export { usePermissionForm, deserializePermissions, serializePermissions } from "./usePermissionForm.js";
|
|
4
|
+
export { PermissionRenderer } from "./PermissionRenderer.js";
|
|
5
|
+
export type { PermissionRendererProps } from "./PermissionRenderer.js";
|
|
6
|
+
export { usePermissionValue, PermissionValueProvider } from "./PermissionValueContext.js";
|
|
7
|
+
export { createHasPermission } from "./createHasPermission.js";
|
|
8
|
+
export type { Permission, ActionDefinition, EntityDefinition, OwnableItem, PermissionSchemaConfig, PermissionSchema, UsePermissionFormOptions, UsePermissionFormResult, UsePermissionsResult, PermissionRendererConfig, HasPermissionAction, HasPermissionProps } from "./types.js";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { createPermissionSchema } from "./createPermissionSchema.js";
|
|
2
|
+
export { createUsePermissions } from "./usePermissions.js";
|
|
3
|
+
export { usePermissionForm, deserializePermissions, serializePermissions } from "./usePermissionForm.js";
|
|
4
|
+
export { PermissionRenderer } from "./PermissionRenderer.js";
|
|
5
|
+
export { usePermissionValue, PermissionValueProvider } from "./PermissionValueContext.js";
|
|
6
|
+
export { createHasPermission } from "./createHasPermission.js";
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createPermissionSchema","createUsePermissions","usePermissionForm","deserializePermissions","serializePermissions","PermissionRenderer","usePermissionValue","PermissionValueProvider","createHasPermission"],"sources":["index.ts"],"sourcesContent":["export { createPermissionSchema } from \"./createPermissionSchema.js\";\nexport { createUsePermissions } from \"./usePermissions.js\";\nexport {\n usePermissionForm,\n deserializePermissions,\n serializePermissions\n} from \"./usePermissionForm.js\";\nexport { PermissionRenderer } from \"./PermissionRenderer.js\";\nexport type { PermissionRendererProps } from \"./PermissionRenderer.js\";\nexport { usePermissionValue, PermissionValueProvider } from \"./PermissionValueContext.js\";\nexport { createHasPermission } from \"./createHasPermission.js\";\nexport type {\n Permission,\n ActionDefinition,\n EntityDefinition,\n OwnableItem,\n PermissionSchemaConfig,\n PermissionSchema,\n UsePermissionFormOptions,\n UsePermissionFormResult,\n UsePermissionsResult,\n PermissionRendererConfig,\n HasPermissionAction,\n HasPermissionProps\n} from \"./types.js\";\n"],"mappings":"AAAA,SAASA,sBAAsB;AAC/B,SAASC,oBAAoB;AAC7B,SACIC,iBAAiB,EACjBC,sBAAsB,EACtBC,oBAAoB;AAExB,SAASC,kBAAkB;AAE3B,SAASC,kBAAkB,EAAEC,uBAAuB;AACpD,SAASC,mBAAmB","ignoreList":[]}
|