@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.
Files changed (102) hide show
  1. package/base/Admin.js +3 -1
  2. package/base/Admin.js.map +1 -1
  3. package/base/Base/LexicalPreset.js +4 -5
  4. package/base/Base/LexicalPreset.js.map +1 -1
  5. package/base/Base/Menus.js +28 -18
  6. package/base/Base/Menus.js.map +1 -1
  7. package/base/Base.js +1 -2
  8. package/base/Base.js.map +1 -1
  9. package/components/DeveloperMode/DeveloperMode.d.ts +11 -0
  10. package/components/DeveloperMode/DeveloperMode.js +17 -0
  11. package/components/DeveloperMode/DeveloperMode.js.map +1 -0
  12. package/components/DeveloperMode/index.d.ts +2 -0
  13. package/components/DeveloperMode/index.js +3 -0
  14. package/components/DeveloperMode/index.js.map +1 -0
  15. package/components/LexicalEditor/LexicalLinkForm.d.ts +6 -0
  16. package/components/LexicalEditor/LexicalLinkForm.js +92 -0
  17. package/components/LexicalEditor/LexicalLinkForm.js.map +1 -0
  18. package/components/LexicalEditor/index.d.ts +1 -0
  19. package/components/LexicalEditor/index.js +1 -0
  20. package/components/LexicalEditor/index.js.map +1 -1
  21. package/components/Permissions/Permissions.d.ts +1 -3
  22. package/components/Permissions/Permissions.js +37 -31
  23. package/components/Permissions/Permissions.js.map +1 -1
  24. package/components/SimpleForm/SimpleForm.d.ts +1 -1
  25. package/components/Wcp.d.ts +2 -0
  26. package/components/Wcp.js +8 -1
  27. package/components/Wcp.js.map +1 -1
  28. package/components/index.d.ts +4 -1
  29. package/components/index.js +3 -1
  30. package/components/index.js.map +1 -1
  31. package/config/AdminConfig/Security.d.ts +3 -0
  32. package/config/AdminConfig/Security.js +6 -0
  33. package/config/AdminConfig/Security.js.map +1 -0
  34. package/config/AdminConfig/SecurityPermissions.d.ts +17 -0
  35. package/config/AdminConfig/SecurityPermissions.js +31 -0
  36. package/config/AdminConfig/SecurityPermissions.js.map +1 -0
  37. package/config/AdminConfig.d.ts +8 -1
  38. package/config/AdminConfig.js +8 -3
  39. package/config/AdminConfig.js.map +1 -1
  40. package/domain/Identity.js +1 -1
  41. package/domain/Identity.js.map +1 -1
  42. package/exports/admin/{buildParams.js → build-params.js} +1 -1
  43. package/exports/admin/build-params.js.map +1 -0
  44. package/exports/admin/form.d.ts +11 -0
  45. package/exports/admin/form.js +12 -0
  46. package/exports/admin/form.js.map +1 -0
  47. package/exports/admin/ui.d.ts +1 -0
  48. package/exports/admin/ui.js +1 -0
  49. package/exports/admin/ui.js.map +1 -1
  50. package/exports/admin.d.ts +4 -0
  51. package/exports/admin.js +4 -0
  52. package/exports/admin.js.map +1 -1
  53. package/features/wcp/ReactLicense.d.ts +1 -0
  54. package/features/wcp/ReactLicense.js +3 -0
  55. package/features/wcp/ReactLicense.js.map +1 -1
  56. package/index.d.ts +2 -1
  57. package/index.js +3 -1
  58. package/index.js.map +1 -1
  59. package/package.json +26 -29
  60. package/permissions/PermissionRenderer.d.ts +6 -0
  61. package/permissions/PermissionRenderer.js +219 -0
  62. package/permissions/PermissionRenderer.js.map +1 -0
  63. package/permissions/PermissionValueContext.d.ts +11 -0
  64. package/permissions/PermissionValueContext.js +23 -0
  65. package/permissions/PermissionValueContext.js.map +1 -0
  66. package/permissions/createHasPermission.d.ts +3 -0
  67. package/permissions/createHasPermission.js +36 -0
  68. package/permissions/createHasPermission.js.map +1 -0
  69. package/permissions/createPermissionSchema.d.ts +2 -0
  70. package/permissions/createPermissionSchema.js +8 -0
  71. package/permissions/createPermissionSchema.js.map +1 -0
  72. package/permissions/index.d.ts +8 -0
  73. package/permissions/index.js +8 -0
  74. package/permissions/index.js.map +1 -0
  75. package/permissions/types.d.ts +242 -0
  76. package/permissions/types.js +3 -0
  77. package/permissions/types.js.map +1 -0
  78. package/permissions/usePermissionForm.d.ts +17 -0
  79. package/permissions/usePermissionForm.js +256 -0
  80. package/permissions/usePermissionForm.js.map +1 -0
  81. package/permissions/usePermissions.d.ts +3 -0
  82. package/permissions/usePermissions.js +180 -0
  83. package/permissions/usePermissions.js.map +1 -0
  84. package/types.d.ts +0 -7
  85. package/types.js.map +1 -1
  86. package/base/Base/LexicalPreset/LinkEditForm.d.ts +0 -6
  87. package/base/Base/LexicalPreset/LinkEditForm.js +0 -63
  88. package/base/Base/LexicalPreset/LinkEditForm.js.map +0 -1
  89. package/exports/admin/buildParams.js.map +0 -1
  90. package/extensions/AdminBuildParam.d.ts +0 -11
  91. package/extensions/AdminBuildParam.js +0 -184
  92. package/extensions/AdminBuildParam.js.map +0 -1
  93. package/extensions/AdminExtension.d.ts +0 -11
  94. package/extensions/AdminExtension.js +0 -105
  95. package/extensions/AdminExtension.js.map +0 -1
  96. package/extensions/index.d.ts +0 -23
  97. package/extensions/index.js +0 -7
  98. package/extensions/index.js.map +0 -1
  99. package/plugins/PermissionRendererPlugin.d.ts +0 -22
  100. package/plugins/PermissionRendererPlugin.js +0 -19
  101. package/plugins/PermissionRendererPlugin.js.map +0 -1
  102. /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.df7a8bb475",
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.439",
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.df7a8bb475",
24
- "@webiny/app": "0.0.0-unstable.df7a8bb475",
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.df7a8bb475",
27
- "@webiny/form": "0.0.0-unstable.df7a8bb475",
28
- "@webiny/icons": "0.0.0-unstable.df7a8bb475",
29
- "@webiny/lexical-converter": "0.0.0-unstable.df7a8bb475",
30
- "@webiny/lexical-editor": "0.0.0-unstable.df7a8bb475",
31
- "@webiny/lexical-theme": "0.0.0-unstable.df7a8bb475",
32
- "@webiny/plugins": "0.0.0-unstable.df7a8bb475",
33
- "@webiny/project": "0.0.0-unstable.df7a8bb475",
34
- "@webiny/react-composition": "0.0.0-unstable.df7a8bb475",
35
- "@webiny/react-properties": "0.0.0-unstable.df7a8bb475",
36
- "@webiny/telemetry": "0.0.0-unstable.df7a8bb475",
37
- "@webiny/ui": "0.0.0-unstable.df7a8bb475",
38
- "@webiny/utils": "0.0.0-unstable.df7a8bb475",
39
- "@webiny/validation": "0.0.0-unstable.df7a8bb475",
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.12.0",
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.4",
54
- "minimatch": "5.1.6",
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.6.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
- "ts-morph": "27.0.2",
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.df7a8bb475",
79
+ "@webiny/build-tools": "0.0.0-unstable.e2758ee1cf",
83
80
  "rimraf": "6.1.3",
84
81
  "typescript": "5.9.3",
85
- "vitest": "3.2.4"
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": "df7a8bb4755a1da047f0af8c56bdb649cc81bf7d"
105
+ "gitHead": "e2758ee1cfa3b9a7152e9bb995a90ccabd33266f"
109
106
  }
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ import type { PermissionSchema } from "./types.js";
3
+ export interface PermissionRendererProps {
4
+ schema: PermissionSchema;
5
+ }
6
+ export declare const PermissionRenderer: ({ schema }: PermissionRendererProps) => React.JSX.Element;
@@ -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":"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","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,3 @@
1
+ import React from "react";
2
+ import type { PermissionSchemaConfig, HasPermissionProps } from "./types.js";
3
+ export declare function createHasPermission<const S extends PermissionSchemaConfig>(schema: S): React.FC<HasPermissionProps<S>>;
@@ -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,2 @@
1
+ import type { PermissionSchemaConfig } from "./types.js";
2
+ export declare function createPermissionSchema<const T extends PermissionSchemaConfig>(config: T): T;
@@ -0,0 +1,8 @@
1
+ export function createPermissionSchema(config) {
2
+ return {
3
+ ...config,
4
+ entities: config.entities ?? []
5
+ };
6
+ }
7
+
8
+ //# sourceMappingURL=createPermissionSchema.js.map
@@ -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":[]}