@webiny/app-security-access-management 0.0.0-unstable.78f581c1d2 → 0.0.0-unstable.7be00a75a9

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 (129) hide show
  1. package/Extension.d.ts +2 -0
  2. package/Extension.js +84 -0
  3. package/Extension.js.map +1 -0
  4. package/README.md +7 -111
  5. package/SecurityPermissions.d.ts +2 -0
  6. package/SecurityPermissions.js +53 -0
  7. package/SecurityPermissions.js.map +1 -0
  8. package/{plugins/constants.d.ts → constants.d.ts} +2 -1
  9. package/constants.js +9 -0
  10. package/constants.js.map +1 -0
  11. package/domain/permissionsSchema.d.ts +20 -0
  12. package/domain/permissionsSchema.js +34 -0
  13. package/domain/permissionsSchema.js.map +1 -0
  14. package/features/permissions/abstractions.d.ts +17 -0
  15. package/features/permissions/abstractions.js +6 -0
  16. package/features/permissions/abstractions.js.map +1 -0
  17. package/features/permissions/feature.d.ts +14 -0
  18. package/features/permissions/feature.js +7 -0
  19. package/features/permissions/feature.js.map +1 -0
  20. package/index.d.ts +1 -9
  21. package/index.js +1 -80
  22. package/package.json +24 -37
  23. package/routes.d.ts +21 -0
  24. package/routes.js +36 -0
  25. package/routes.js.map +1 -0
  26. package/types.d.ts +17 -3
  27. package/types.js +0 -5
  28. package/ui/views/ApiKeys/ApiKeyForm.d.ts +5 -3
  29. package/ui/views/ApiKeys/ApiKeyForm.js +212 -280
  30. package/ui/views/ApiKeys/ApiKeyForm.js.map +1 -1
  31. package/ui/views/ApiKeys/ApiKeys.d.ts +1 -7
  32. package/ui/views/ApiKeys/ApiKeys.js +15 -24
  33. package/ui/views/ApiKeys/ApiKeys.js.map +1 -1
  34. package/ui/views/ApiKeys/ApiKeysDataList.d.ts +2 -2
  35. package/ui/views/ApiKeys/ApiKeysDataList.js +136 -228
  36. package/ui/views/ApiKeys/ApiKeysDataList.js.map +1 -1
  37. package/ui/views/ApiKeys/graphql.d.ts +8 -0
  38. package/ui/views/ApiKeys/graphql.js +83 -25
  39. package/ui/views/ApiKeys/graphql.js.map +1 -1
  40. package/ui/views/ApiKeys/index.d.ts +1 -1
  41. package/ui/views/ApiKeys/index.js +1 -18
  42. package/ui/views/ApiKeys/utils.d.ts +3 -2
  43. package/ui/views/ApiKeys/utils.js +15 -18
  44. package/ui/views/ApiKeys/utils.js.map +1 -1
  45. package/ui/views/Roles/Roles.d.ts +2 -0
  46. package/ui/views/Roles/Roles.js +17 -0
  47. package/ui/views/Roles/Roles.js.map +1 -0
  48. package/ui/views/Roles/RolesDataList.d.ts +5 -0
  49. package/ui/views/Roles/RolesDataList.js +141 -0
  50. package/ui/views/Roles/RolesDataList.js.map +1 -0
  51. package/ui/views/Roles/RolesForm.d.ts +6 -0
  52. package/ui/views/Roles/RolesForm.js +213 -0
  53. package/ui/views/Roles/RolesForm.js.map +1 -0
  54. package/ui/views/Roles/graphql.d.ts +13 -0
  55. package/ui/views/Roles/graphql.js +86 -0
  56. package/ui/views/Roles/graphql.js.map +1 -0
  57. package/ui/views/Roles/index.d.ts +1 -0
  58. package/ui/views/Roles/index.js +1 -0
  59. package/ui/views/Teams/Teams.d.ts +2 -0
  60. package/ui/views/Teams/Teams.js +17 -0
  61. package/ui/views/Teams/Teams.js.map +1 -0
  62. package/ui/views/Teams/TeamsDataList.d.ts +5 -0
  63. package/ui/views/Teams/TeamsDataList.js +141 -0
  64. package/ui/views/Teams/TeamsDataList.js.map +1 -0
  65. package/ui/views/Teams/TeamsForm.d.ts +6 -0
  66. package/ui/views/Teams/TeamsForm.js +191 -0
  67. package/ui/views/Teams/TeamsForm.js.map +1 -0
  68. package/ui/views/Teams/graphql.d.ts +13 -0
  69. package/ui/views/Teams/graphql.js +90 -0
  70. package/ui/views/Teams/graphql.js.map +1 -0
  71. package/ui/views/Teams/index.d.ts +1 -0
  72. package/ui/views/Teams/index.js +1 -0
  73. package/ui/views/utils.d.ts +1 -1
  74. package/ui/views/utils.js +10 -24
  75. package/ui/views/utils.js.map +1 -1
  76. package/components/GroupAutocomplete/graphql.d.ts +0 -1
  77. package/components/GroupAutocomplete/graphql.js +0 -17
  78. package/components/GroupAutocomplete/graphql.js.map +0 -1
  79. package/components/GroupAutocomplete/index.d.ts +0 -5
  80. package/components/GroupAutocomplete/index.js +0 -31
  81. package/components/GroupAutocomplete/index.js.map +0 -1
  82. package/components/NotAuthorizedError/NotAuthorizedError.d.ts +0 -2
  83. package/components/NotAuthorizedError/NotAuthorizedError.js +0 -71
  84. package/components/NotAuthorizedError/NotAuthorizedError.js.map +0 -1
  85. package/components/NotAuthorizedError/SecureRouteError.svg +0 -1
  86. package/components/NotAuthorizedError/index.d.ts +0 -1
  87. package/components/NotAuthorizedError/index.js +0 -13
  88. package/components/NotAuthorizedError/index.js.map +0 -1
  89. package/index.js.map +0 -1
  90. package/plugins/constants.js +0 -13
  91. package/plugins/constants.js.map +0 -1
  92. package/plugins/index.d.ts +0 -3
  93. package/plugins/index.js +0 -20
  94. package/plugins/index.js.map +0 -1
  95. package/plugins/installation.d.ts +0 -3
  96. package/plugins/installation.js +0 -121
  97. package/plugins/installation.js.map +0 -1
  98. package/plugins/permissionRenderer/SecurityPermissions.d.ts +0 -8
  99. package/plugins/permissionRenderer/SecurityPermissions.js +0 -199
  100. package/plugins/permissionRenderer/SecurityPermissions.js.map +0 -1
  101. package/plugins/permissionRenderer/index.d.ts +0 -3
  102. package/plugins/permissionRenderer/index.js +0 -39
  103. package/plugins/permissionRenderer/index.js.map +0 -1
  104. package/plugins/routes.d.ts +0 -3
  105. package/plugins/routes.js +0 -56
  106. package/plugins/routes.js.map +0 -1
  107. package/plugins/secureRouteError.d.ts +0 -7
  108. package/plugins/secureRouteError.js +0 -22
  109. package/plugins/secureRouteError.js.map +0 -1
  110. package/types.js.map +0 -1
  111. package/ui/elements/GroupAutocompleteElement.d.ts +0 -6
  112. package/ui/elements/GroupAutocompleteElement.js +0 -64
  113. package/ui/elements/GroupAutocompleteElement.js.map +0 -1
  114. package/ui/views/ApiKeys/index.js.map +0 -1
  115. package/ui/views/Groups/Groups.d.ts +0 -8
  116. package/ui/views/Groups/Groups.js +0 -26
  117. package/ui/views/Groups/Groups.js.map +0 -1
  118. package/ui/views/Groups/GroupsDataList.d.ts +0 -5
  119. package/ui/views/Groups/GroupsDataList.js +0 -239
  120. package/ui/views/Groups/GroupsDataList.js.map +0 -1
  121. package/ui/views/Groups/GroupsForm.d.ts +0 -5
  122. package/ui/views/Groups/GroupsForm.js +0 -278
  123. package/ui/views/Groups/GroupsForm.js.map +0 -1
  124. package/ui/views/Groups/graphql.d.ts +0 -5
  125. package/ui/views/Groups/graphql.js +0 -26
  126. package/ui/views/Groups/graphql.js.map +0 -1
  127. package/ui/views/Groups/index.d.ts +0 -1
  128. package/ui/views/Groups/index.js +0 -18
  129. package/ui/views/Groups/index.js.map +0 -1
@@ -1,26 +1,84 @@
1
- "use strict";
1
+ import graphql_tag from "graphql-tag";
2
+ const fields = `
3
+ id
4
+ name
5
+ slug
6
+ description
7
+ token
8
+ permissions
9
+ createdOn
10
+ `;
11
+ const LIST_API_KEYS = graphql_tag`
12
+ query ListApiKeys {
13
+ security {
14
+ apiKeys: listApiKeys {
15
+ data {
16
+ ${fields}
17
+ }
18
+ }
19
+ }
20
+ }
21
+ `;
22
+ const READ_API_KEY = graphql_tag`
23
+ query GetApiKey($id: ID!) {
24
+ security {
25
+ apiKey: getApiKey(id: $id){
26
+ data {
27
+ ${fields}
28
+ }
29
+ error {
30
+ code
31
+ message
32
+ }
33
+ }
34
+ }
35
+ }
36
+ `;
37
+ const CREATE_API_KEY = graphql_tag`
38
+ mutation CreateApiKey($data: SecurityApiKeyInput!){
39
+ security {
40
+ apiKey: createApiKey(data: $data) {
41
+ data {
42
+ ${fields}
43
+ }
44
+ error {
45
+ code
46
+ message
47
+ data
48
+ }
49
+ }
50
+ }
51
+ }
52
+ `;
53
+ const UPDATE_API_KEY = graphql_tag`
54
+ mutation UpdateApiKey($id: ID!, $data: SecurityApiKeyInput!){
55
+ security {
56
+ apiKey: updateApiKey(id: $id, data: $data) {
57
+ data {
58
+ ${fields}
59
+ }
60
+ error {
61
+ code
62
+ message
63
+ data
64
+ }
65
+ }
66
+ }
67
+ }
68
+ `;
69
+ const DELETE_API_KEY = graphql_tag`
70
+ mutation DeleteApiKey($id: ID!) {
71
+ security {
72
+ deleteApiKey(id: $id) {
73
+ data
74
+ error {
75
+ code
76
+ message
77
+ }
78
+ }
79
+ }
80
+ }
81
+ `;
82
+ export { CREATE_API_KEY, DELETE_API_KEY, LIST_API_KEYS, READ_API_KEY, UPDATE_API_KEY };
2
83
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.UPDATE_API_KEY = exports.READ_API_KEY = exports.LIST_API_KEYS = exports.DELETE_API_KEY = exports.CREATE_API_KEY = void 0;
9
-
10
- var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
11
-
12
- var _graphqlTag = _interopRequireDefault(require("graphql-tag"));
13
-
14
- var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
15
-
16
- var fields = "\n id\n name\n description\n token\n permissions\n createdOn\n";
17
- var LIST_API_KEYS = (0, _graphqlTag.default)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n query ListApiKeys {\n security {\n apiKeys: listApiKeys {\n data {\n ", "\n }\n }\n }\n }\n"])), fields);
18
- exports.LIST_API_KEYS = LIST_API_KEYS;
19
- var READ_API_KEY = (0, _graphqlTag.default)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n query GetApiKey($id: ID!) {\n security {\n apiKey: getApiKey(id: $id){\n data {\n ", "\n }\n error {\n code\n message\n }\n }\n }\n }\n"])), fields);
20
- exports.READ_API_KEY = READ_API_KEY;
21
- var CREATE_API_KEY = (0, _graphqlTag.default)(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2.default)(["\n mutation CreateApiKey($data: SecurityApiKeyInput!){\n security {\n apiKey: createApiKey(data: $data) {\n data {\n ", "\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n"])), fields);
22
- exports.CREATE_API_KEY = CREATE_API_KEY;
23
- var UPDATE_API_KEY = (0, _graphqlTag.default)(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2.default)(["\n mutation UpdateApiKey($id: ID!, $data: SecurityApiKeyInput!){\n security {\n apiKey: updateApiKey(id: $id, data: $data) {\n data {\n ", "\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n"])), fields);
24
- exports.UPDATE_API_KEY = UPDATE_API_KEY;
25
- var DELETE_API_KEY = (0, _graphqlTag.default)(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2.default)(["\n mutation DeleteApiKey($id: ID!) {\n security {\n deleteApiKey(id: $id) {\n data\n error {\n code\n message\n }\n }\n }\n }\n"])));
26
- exports.DELETE_API_KEY = DELETE_API_KEY;
84
+ //# sourceMappingURL=graphql.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["fields","LIST_API_KEYS","gql","READ_API_KEY","CREATE_API_KEY","UPDATE_API_KEY","DELETE_API_KEY"],"sources":["graphql.ts"],"sourcesContent":["import gql from \"graphql-tag\";\n\nconst fields = `\n id\n name\n description\n token\n permissions\n createdOn\n`;\n\nexport const LIST_API_KEYS = gql`\n query ListApiKeys {\n security {\n apiKeys: listApiKeys {\n data {\n ${fields}\n }\n }\n }\n }\n`;\n\nexport const READ_API_KEY = gql`\n query GetApiKey($id: ID!) {\n security {\n apiKey: getApiKey(id: $id){\n data {\n ${fields}\n }\n error {\n code\n message\n }\n }\n }\n }\n`;\n\nexport const CREATE_API_KEY = gql`\n mutation CreateApiKey($data: SecurityApiKeyInput!){\n security {\n apiKey: createApiKey(data: $data) {\n data {\n ${fields}\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n\nexport const UPDATE_API_KEY = gql`\n mutation UpdateApiKey($id: ID!, $data: SecurityApiKeyInput!){\n security {\n apiKey: updateApiKey(id: $id, data: $data) {\n data {\n ${fields}\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n\nexport const DELETE_API_KEY = gql`\n mutation DeleteApiKey($id: ID!) {\n security {\n deleteApiKey(id: $id) {\n data\n error {\n code\n message\n }\n }\n }\n }\n`;\n"],"mappings":";;;;;;;;;;;AAAA;;;;AAEA,IAAMA,MAAM,qFAAZ;AASO,IAAMC,aAAa,OAAGC,mBAAH,6QAKLF,MALK,CAAnB;;AAYA,IAAMG,YAAY,OAAGD,mBAAH,gYAKHF,MALG,CAAlB;;AAgBA,IAAMI,cAAc,OAAGF,mBAAH,0bAKLF,MALK,CAApB;;AAiBA,IAAMK,cAAc,OAAGH,mBAAH,6cAKLF,MALK,CAApB;;AAiBA,IAAMM,cAAc,OAAGJ,mBAAH,kVAApB"}
1
+ {"version":3,"file":"ui/views/ApiKeys/graphql.js","sources":["../../../../src/ui/views/ApiKeys/graphql.ts"],"sourcesContent":["import gql from \"graphql-tag\";\nimport type { ApiKey } from \"~/types.js\";\n\nconst fields = `\n id\n name\n slug\n description\n token\n permissions\n createdOn\n`;\n\nexport interface ListApiKeysResponse {\n security: {\n apiKeys: {\n data: ApiKey[];\n };\n };\n}\n\nexport const LIST_API_KEYS = gql`\n query ListApiKeys {\n security {\n apiKeys: listApiKeys {\n data {\n ${fields}\n }\n }\n }\n }\n`;\n\nexport const READ_API_KEY = gql`\n query GetApiKey($id: ID!) {\n security {\n apiKey: getApiKey(id: $id){\n data {\n ${fields}\n }\n error {\n code\n message\n }\n }\n }\n }\n`;\n\nexport const CREATE_API_KEY = gql`\n mutation CreateApiKey($data: SecurityApiKeyInput!){\n security {\n apiKey: createApiKey(data: $data) {\n data {\n ${fields}\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n\nexport const UPDATE_API_KEY = gql`\n mutation UpdateApiKey($id: ID!, $data: SecurityApiKeyInput!){\n security {\n apiKey: updateApiKey(id: $id, data: $data) {\n data {\n ${fields}\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n\nexport const DELETE_API_KEY = gql`\n mutation DeleteApiKey($id: ID!) {\n security {\n deleteApiKey(id: $id) {\n data\n error {\n code\n message\n }\n }\n }\n }\n`;\n"],"names":["fields","LIST_API_KEYS","gql","READ_API_KEY","CREATE_API_KEY","UPDATE_API_KEY","DELETE_API_KEY"],"mappings":";AAGA,MAAMA,SAAS,CAAC;;;;;;;;AAQhB,CAAC;AAUM,MAAMC,gBAAgBC,WAAG,CAAC;;;;;mBAKd,EAAEF,OAAO;;;;;AAK5B,CAAC;AAEM,MAAMG,eAAeD,WAAG,CAAC;;;;;oBAKZ,EAAEF,OAAO;;;;;;;;;AAS7B,CAAC;AAEM,MAAMI,iBAAiBF,WAAG,CAAC;;;;;oBAKd,EAAEF,OAAO;;;;;;;;;;AAU7B,CAAC;AAEM,MAAMK,iBAAiBH,WAAG,CAAC;;;;;oBAKd,EAAEF,OAAO;;;;;;;;;;AAU7B,CAAC;AAEM,MAAMM,iBAAiBJ,WAAG,CAAC;;;;;;;;;;;;AAYlC,CAAC"}
@@ -1 +1 @@
1
- export * from "./ApiKeys";
1
+ export * from "./ApiKeys.js";
@@ -1,18 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
-
7
- var _ApiKeys = require("./ApiKeys");
8
-
9
- Object.keys(_ApiKeys).forEach(function (key) {
10
- if (key === "default" || key === "__esModule") return;
11
- if (key in exports && exports[key] === _ApiKeys[key]) return;
12
- Object.defineProperty(exports, key, {
13
- enumerable: true,
14
- get: function get() {
15
- return _ApiKeys[key];
16
- }
17
- });
18
- });
1
+ export * from "./ApiKeys.js";
@@ -1,2 +1,3 @@
1
- import { ApiKey } from "../../../types";
2
- export declare const pickDataForAPI: (data: ApiKey) => Pick<ApiKey, "name" | "description" | "permissions">;
1
+ import type { ApiKey } from "../../../types.js";
2
+ export declare const pickDataForCreate: (data: ApiKey) => Pick<ApiKey, "name" | "slug" | "description" | "permissions">;
3
+ export declare const pickDataForUpdate: (data: ApiKey) => Pick<ApiKey, "name" | "description" | "permissions">;
@@ -1,18 +1,15 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.pickDataForAPI = void 0;
9
-
10
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
11
-
12
- var _pick2 = _interopRequireDefault(require("lodash/pick"));
13
-
14
- var pickDataForAPI = function pickDataForAPI(data) {
15
- return (0, _objectSpread2.default)({}, (0, _pick2.default)(data, ["name", "description", "permissions"]));
16
- };
17
-
18
- exports.pickDataForAPI = pickDataForAPI;
1
+ import pick from "lodash/pick.js";
2
+ const pickDataForCreate = (data)=>structuredClone(pick(data, [
3
+ "name",
4
+ "slug",
5
+ "description",
6
+ "permissions"
7
+ ]));
8
+ const pickDataForUpdate = (data)=>structuredClone(pick(data, [
9
+ "name",
10
+ "description",
11
+ "permissions"
12
+ ]));
13
+ export { pickDataForCreate, pickDataForUpdate };
14
+
15
+ //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["pickDataForAPI","data"],"sources":["utils.ts"],"sourcesContent":["import { pick } from \"lodash\";\nimport { ApiKey } from \"~/types\";\n\nexport const pickDataForAPI = (\n data: ApiKey\n): Pick<ApiKey, \"name\" | \"description\" | \"permissions\"> => ({\n ...pick(data, [\"name\", \"description\", \"permissions\"])\n});\n"],"mappings":";;;;;;;;;;;;;AAGO,IAAMA,cAAc,GAAG,SAAjBA,cAAiB,CAC1BC,IAD0B;EAAA,uCAGvB,oBAAKA,IAAL,EAAW,CAAC,MAAD,EAAS,aAAT,EAAwB,aAAxB,CAAX,CAHuB;AAAA,CAAvB"}
1
+ {"version":3,"file":"ui/views/ApiKeys/utils.js","sources":["../../../../src/ui/views/ApiKeys/utils.ts"],"sourcesContent":["import pick from \"lodash/pick.js\";\nimport type { ApiKey } from \"~/types.js\";\n\nexport const pickDataForCreate = (\n data: ApiKey\n): Pick<ApiKey, \"name\" | \"slug\" | \"description\" | \"permissions\"> => {\n return structuredClone(pick(data, [\"name\", \"slug\", \"description\", \"permissions\"]));\n};\n\nexport const pickDataForUpdate = (\n data: ApiKey\n): Pick<ApiKey, \"name\" | \"description\" | \"permissions\"> => {\n return structuredClone(pick(data, [\"name\", \"description\", \"permissions\"]));\n};\n"],"names":["pickDataForCreate","data","structuredClone","pick","pickDataForUpdate"],"mappings":";AAGO,MAAMA,oBAAoB,CAC7BC,OAEOC,gBAAgBC,KAAKF,MAAM;QAAC;QAAQ;QAAQ;QAAe;KAAc;AAG7E,MAAMG,oBAAoB,CAC7BH,OAEOC,gBAAgBC,KAAKF,MAAM;QAAC;QAAQ;QAAe;KAAc"}
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const Roles: () => React.JSX.Element;
@@ -0,0 +1,17 @@
1
+ import react from "react";
2
+ import { LeftPanel, RightPanel, SplitView, useRoute } from "@webiny/app-admin";
3
+ import { RolesDataList } from "./RolesDataList.js";
4
+ import { RolesForm } from "./RolesForm.js";
5
+ import { Routes } from "../../../routes.js";
6
+ const Roles = ()=>{
7
+ const { route } = useRoute(Routes.Roles.List);
8
+ return /*#__PURE__*/ react.createElement(SplitView, null, /*#__PURE__*/ react.createElement(LeftPanel, null, /*#__PURE__*/ react.createElement(RolesDataList, {
9
+ activeId: route.params.id
10
+ })), /*#__PURE__*/ react.createElement(RightPanel, null, /*#__PURE__*/ react.createElement(RolesForm, {
11
+ newEntry: true === route.params.new,
12
+ id: route.params.id
13
+ })));
14
+ };
15
+ export { Roles };
16
+
17
+ //# sourceMappingURL=Roles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui/views/Roles/Roles.js","sources":["../../../../src/ui/views/Roles/Roles.tsx"],"sourcesContent":["import React from \"react\";\nimport { SplitView, LeftPanel, RightPanel, useRoute } from \"@webiny/app-admin\";\nimport { RolesDataList } from \"./RolesDataList.js\";\nimport { RolesForm } from \"./RolesForm.js\";\nimport { Routes } from \"~/routes.js\";\n\nexport const Roles = () => {\n const { route } = useRoute(Routes.Roles.List);\n\n return (\n <SplitView>\n <LeftPanel>\n <RolesDataList activeId={route.params.id} />\n </LeftPanel>\n <RightPanel>\n <RolesForm newEntry={route.params.new === true} id={route.params.id} />\n </RightPanel>\n </SplitView>\n );\n};\n"],"names":["Roles","route","useRoute","Routes","SplitView","LeftPanel","RolesDataList","RightPanel","RolesForm"],"mappings":";;;;;AAMO,MAAMA,QAAQ;IACjB,MAAM,EAAEC,KAAK,EAAE,GAAGC,SAASC,OAAO,KAAK,CAAC,IAAI;IAE5C,OAAO,WAAP,GACI,oBAACC,WAASA,MAAAA,WAAAA,GACN,oBAACC,WAASA,MAAAA,WAAAA,GACN,oBAACC,eAAaA;QAAC,UAAUL,MAAM,MAAM,CAAC,EAAE;uBAE5C,oBAACM,YAAUA,MAAAA,WAAAA,GACP,oBAACC,WAASA;QAAC,UAAUP,AAAqB,SAArBA,MAAM,MAAM,CAAC,GAAG;QAAW,IAAIA,MAAM,MAAM,CAAC,EAAE;;AAInF"}
@@ -0,0 +1,5 @@
1
+ import React from "react";
2
+ export interface RolesDataListProps {
3
+ activeId: string | undefined;
4
+ }
5
+ export declare const RolesDataList: ({ activeId }: RolesDataListProps) => React.JSX.Element;
@@ -0,0 +1,141 @@
1
+ import react, { useCallback, useMemo, useState } from "react";
2
+ import orderBy from "lodash/orderBy.js";
3
+ import { i18n } from "@webiny/app/i18n/index.js";
4
+ import { Button, DataList, DataListModal, DeleteIcon, Grid, List, Select, Tooltip } from "@webiny/admin-ui";
5
+ import { SearchUI, useConfirmationDialog, useRouter, useSnackbar } from "@webiny/app-admin";
6
+ import { useMutation, useQuery } from "@apollo/react-hooks";
7
+ import { DELETE_ROLE, LIST_ROLES } from "./graphql.js";
8
+ import { deserializeSorters } from "../utils.js";
9
+ import { ReactComponent } from "@webiny/icons/add.svg";
10
+ import { Routes } from "../../../routes.js";
11
+ const t = i18n.ns("app-security/admin/roles/data-list");
12
+ const SORTERS = [
13
+ {
14
+ label: t`Newest to oldest`,
15
+ sorter: "createdOn_DESC"
16
+ },
17
+ {
18
+ label: t`Oldest to newest`,
19
+ sorter: "createdOn_ASC"
20
+ },
21
+ {
22
+ label: t`Name A-Z`,
23
+ sorter: "name_ASC"
24
+ },
25
+ {
26
+ label: t`Name Z-A`,
27
+ sorter: "name_DESC"
28
+ }
29
+ ];
30
+ const RolesDataList = ({ activeId })=>{
31
+ const [filter, setFilter] = useState("");
32
+ const [sort, setSort] = useState(SORTERS[0].sorter);
33
+ const { goToRoute } = useRouter();
34
+ const { showSnackbar } = useSnackbar();
35
+ const { showConfirmation } = useConfirmationDialog({
36
+ dataTestId: "default-data-list.delete-dialog"
37
+ });
38
+ const { data: listResponse, loading: listLoading } = useQuery(LIST_ROLES);
39
+ const [deleteIt, { loading: deleteLoading }] = useMutation(DELETE_ROLE, {
40
+ refetchQueries: [
41
+ {
42
+ query: LIST_ROLES
43
+ }
44
+ ]
45
+ });
46
+ const data = listLoading && !listResponse ? [] : listResponse?.security.roles.data || [];
47
+ const filterRole = useCallback(({ name, slug, description })=>name.toLowerCase().includes(filter) || slug.toLowerCase().includes(filter) || description && description.toLowerCase().includes(filter), [
48
+ filter
49
+ ]);
50
+ const sortRoles = useCallback((roles)=>{
51
+ if (!sort) return roles;
52
+ const [key, sortBy] = deserializeSorters(sort);
53
+ return orderBy(roles, [
54
+ key
55
+ ], [
56
+ sortBy
57
+ ]);
58
+ }, [
59
+ sort
60
+ ]);
61
+ const deleteItem = useCallback((item)=>{
62
+ showConfirmation(async ()=>{
63
+ const { data } = await deleteIt({
64
+ variables: item
65
+ });
66
+ const { error } = data.security.deleteRole;
67
+ if (error) return showSnackbar(error.message);
68
+ showSnackbar(t`Role "{slug}" deleted.`({
69
+ slug: item.slug
70
+ }));
71
+ if (activeId === item.id) goToRoute(Routes.Roles.List);
72
+ });
73
+ }, [
74
+ activeId
75
+ ]);
76
+ const rolesDataListModalOverlay = useMemo(()=>/*#__PURE__*/ react.createElement(DataListModal.Content, null, /*#__PURE__*/ react.createElement(Grid, null, /*#__PURE__*/ react.createElement(Grid.Column, {
77
+ span: 12
78
+ }, /*#__PURE__*/ react.createElement(Select, {
79
+ value: sort,
80
+ onChange: setSort,
81
+ label: t`Sort by`,
82
+ options: SORTERS.map(({ label, sorter: value })=>({
83
+ label,
84
+ value
85
+ }))
86
+ })))), [
87
+ sort
88
+ ]);
89
+ const filteredData = "" === filter ? data : data.filter(filterRole);
90
+ const groupList = sortRoles(filteredData);
91
+ return /*#__PURE__*/ react.createElement(DataList, {
92
+ title: t`Roles`,
93
+ actions: /*#__PURE__*/ react.createElement(Button, {
94
+ text: t`New`,
95
+ icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
96
+ size: "sm",
97
+ className: "ml-xs",
98
+ "data-testid": "new-record-button",
99
+ onClick: ()=>{
100
+ goToRoute(Routes.Roles.List, {
101
+ new: true
102
+ });
103
+ }
104
+ }),
105
+ data: groupList,
106
+ loading: listLoading || deleteLoading,
107
+ search: /*#__PURE__*/ react.createElement(SearchUI, {
108
+ value: filter,
109
+ onChange: setFilter,
110
+ inputPlaceholder: t`Search roles...`
111
+ }),
112
+ modalOverlay: rolesDataListModalOverlay,
113
+ modalOverlayAction: /*#__PURE__*/ react.createElement(DataListModal.Trigger, {
114
+ "data-testid": "default-data-list.filter"
115
+ })
116
+ }, ({ data })=>/*#__PURE__*/ react.createElement(List, {
117
+ "data-testid": "default-data-list"
118
+ }, data.map((item)=>/*#__PURE__*/ react.createElement(List.Item, {
119
+ key: item.id,
120
+ selected: item.id === activeId,
121
+ title: item.name,
122
+ description: item.description,
123
+ onClick: ()=>{
124
+ goToRoute(Routes.Roles.List, {
125
+ id: item.id
126
+ });
127
+ },
128
+ actions: item.system || item.plugin ? /*#__PURE__*/ react.createElement(Tooltip, {
129
+ content: /*#__PURE__*/ react.createElement("span", null, item.system ? t`Cannot delete system roles.` : t`Cannot delete roles registered via extensions.`),
130
+ trigger: /*#__PURE__*/ react.createElement(DeleteIcon, {
131
+ disabled: true
132
+ })
133
+ }) : /*#__PURE__*/ react.createElement(DeleteIcon, {
134
+ onClick: ()=>deleteItem(item),
135
+ "data-testid": "default-data-list.delete"
136
+ })
137
+ }))));
138
+ };
139
+ export { RolesDataList };
140
+
141
+ //# sourceMappingURL=RolesDataList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui/views/Roles/RolesDataList.js","sources":["../../../../src/ui/views/Roles/RolesDataList.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useState } from \"react\";\nimport orderBy from \"lodash/orderBy.js\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { List, DataList, DataListModal, DeleteIcon } from \"@webiny/admin-ui\";\n\nimport { useRouter, SearchUI, useSnackbar, useConfirmationDialog } from \"@webiny/app-admin\";\nimport { useQuery, useMutation } from \"@apollo/react-hooks\";\nimport type { ListRolesResponse } from \"./graphql.js\";\nimport { LIST_ROLES, DELETE_ROLE } from \"./graphql.js\";\nimport { deserializeSorters } from \"../utils.js\";\nimport type { Role } from \"~/types.js\";\nimport { Button, Grid, Select, Tooltip } from \"@webiny/admin-ui\";\nimport { ReactComponent as AddIcon } from \"@webiny/icons/add.svg\";\nimport { Routes } from \"~/routes.js\";\n\nconst t = i18n.ns(\"app-security/admin/roles/data-list\");\n\nconst SORTERS = [\n {\n label: t`Newest to oldest`,\n sorter: \"createdOn_DESC\"\n },\n {\n label: t`Oldest to newest`,\n sorter: \"createdOn_ASC\"\n },\n {\n label: t`Name A-Z`,\n sorter: \"name_ASC\"\n },\n {\n label: t`Name Z-A`,\n sorter: \"name_DESC\"\n }\n];\n\nexport interface RolesDataListProps {\n activeId: string | undefined;\n}\n\nexport const RolesDataList = ({ activeId }: RolesDataListProps) => {\n const [filter, setFilter] = useState(\"\");\n const [sort, setSort] = useState(SORTERS[0].sorter);\n const { goToRoute } = useRouter();\n const { showSnackbar } = useSnackbar();\n const { showConfirmation } = useConfirmationDialog({\n dataTestId: \"default-data-list.delete-dialog\"\n });\n\n const { data: listResponse, loading: listLoading } = useQuery<ListRolesResponse>(LIST_ROLES);\n\n const [deleteIt, { loading: deleteLoading }] = useMutation(DELETE_ROLE, {\n refetchQueries: [{ query: LIST_ROLES }]\n });\n\n const data = listLoading && !listResponse ? [] : listResponse?.security.roles.data || [];\n\n const filterRole = useCallback(\n ({ name, slug, description }: Role) => {\n return (\n name.toLowerCase().includes(filter) ||\n slug.toLowerCase().includes(filter) ||\n (description && description.toLowerCase().includes(filter))\n );\n },\n [filter]\n );\n\n const sortRoles = useCallback(\n (roles: Role[]) => {\n if (!sort) {\n return roles;\n }\n const [key, sortBy] = deserializeSorters(sort);\n return orderBy(roles, [key], [sortBy]);\n },\n [sort]\n );\n\n const deleteItem = useCallback(\n (item: Role) => {\n showConfirmation(async () => {\n const { data } = await deleteIt({\n variables: item\n });\n\n const { error } = data.security.deleteRole;\n if (error) {\n return showSnackbar(error.message);\n }\n\n showSnackbar(t`Role \"{slug}\" deleted.`({ slug: item.slug }));\n\n if (activeId === item.id) {\n goToRoute(Routes.Roles.List);\n }\n });\n },\n [activeId]\n );\n\n const rolesDataListModalOverlay = useMemo(\n () => (\n <DataListModal.Content>\n <Grid>\n <Grid.Column span={12}>\n <Select\n value={sort}\n onChange={setSort}\n label={t`Sort by`}\n options={SORTERS.map(({ label, sorter: value }) => ({\n label,\n value\n }))}\n />\n </Grid.Column>\n </Grid>\n </DataListModal.Content>\n ),\n [sort]\n );\n\n const filteredData = filter === \"\" ? data : data.filter(filterRole);\n const groupList = sortRoles(filteredData);\n\n return (\n <DataList\n title={t`Roles`}\n actions={\n <Button\n text={t`New`}\n icon={<AddIcon />}\n size={\"sm\"}\n className={\"ml-xs\"}\n data-testid=\"new-record-button\"\n onClick={() => {\n goToRoute(Routes.Roles.List, { new: true });\n }}\n />\n }\n data={groupList}\n loading={listLoading || deleteLoading}\n search={\n <SearchUI\n value={filter}\n onChange={setFilter}\n inputPlaceholder={t`Search roles...`}\n />\n }\n modalOverlay={rolesDataListModalOverlay}\n modalOverlayAction={<DataListModal.Trigger data-testid={\"default-data-list.filter\"} />}\n >\n {({ data }: { data: Role[] }) => (\n <List data-testid=\"default-data-list\">\n {data.map(item => (\n <List.Item\n key={item.id}\n selected={item.id === activeId}\n title={item.name}\n description={item.description}\n onClick={() => {\n goToRoute(Routes.Roles.List, { id: item.id });\n }}\n actions={\n item.system || item.plugin ? (\n <Tooltip\n content={\n <span>\n {item.system\n ? t`Cannot delete system roles.`\n : t`Cannot delete roles registered via extensions.`}\n </span>\n }\n trigger={<DeleteIcon disabled />}\n />\n ) : (\n <DeleteIcon\n onClick={() => deleteItem(item)}\n data-testid={\"default-data-list.delete\"}\n />\n )\n }\n />\n ))}\n </List>\n )}\n </DataList>\n );\n};\n"],"names":["t","i18n","SORTERS","RolesDataList","activeId","filter","setFilter","useState","sort","setSort","goToRoute","useRouter","showSnackbar","useSnackbar","showConfirmation","useConfirmationDialog","listResponse","listLoading","useQuery","LIST_ROLES","deleteIt","deleteLoading","useMutation","DELETE_ROLE","data","filterRole","useCallback","name","slug","description","sortRoles","roles","key","sortBy","deserializeSorters","orderBy","deleteItem","item","error","Routes","rolesDataListModalOverlay","useMemo","DataListModal","Grid","Select","label","value","filteredData","groupList","DataList","Button","AddIcon","SearchUI","List","Tooltip","DeleteIcon"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ export interface RolesFormProps {
3
+ newEntry: boolean;
4
+ id: string | undefined;
5
+ }
6
+ export declare const RolesForm: ({ id, newEntry }: RolesFormProps) => React.JSX.Element;
@@ -0,0 +1,213 @@
1
+ import react, { useCallback } from "react";
2
+ import { useMutation, useQuery } from "@apollo/react-hooks";
3
+ import get from "lodash/get.js";
4
+ import { i18n } from "@webiny/app/i18n/index.js";
5
+ import { Bind as form_Bind, Form, useForm, useGenerateSlug } from "@webiny/form";
6
+ import { validation } from "@webiny/validation";
7
+ import { EmptyView, Permissions, SimpleForm, SimpleFormContent, SimpleFormFooter, SimpleFormHeader, useRouter, useSnackbar } from "@webiny/app-admin";
8
+ import { CREATE_ROLE, LIST_ROLES, READ_ROLE, UPDATE_ROLE } from "./graphql.js";
9
+ import isEmpty from "lodash/isEmpty.js";
10
+ import { ReactComponent } from "@webiny/icons/add.svg";
11
+ import { ReactComponent as content_copy_svg_ReactComponent } from "@webiny/icons/content_copy.svg";
12
+ import { ReactComponent as settings_svg_ReactComponent } from "@webiny/icons/settings.svg";
13
+ import { Alert, Button, Grid, IconButton, Input, OverlayLoader, Textarea, Tooltip } from "@webiny/admin-ui";
14
+ import { Routes } from "../../../routes.js";
15
+ const t = i18n.ns("app-security/admin/roles/form");
16
+ const RolesForm = ({ id, newEntry })=>{
17
+ const { goToRoute } = useRouter();
18
+ const { showSnackbar } = useSnackbar();
19
+ const getQuery = useQuery(READ_ROLE, {
20
+ variables: {
21
+ id
22
+ },
23
+ skip: !id,
24
+ onCompleted: (data)=>{
25
+ if (!data) return;
26
+ const { error } = data.security.role;
27
+ if (error) {
28
+ goToRoute(Routes.Roles.List);
29
+ showSnackbar(error.message);
30
+ }
31
+ }
32
+ });
33
+ const [create, createMutation] = useMutation(CREATE_ROLE, {
34
+ refetchQueries: [
35
+ {
36
+ query: LIST_ROLES
37
+ }
38
+ ]
39
+ });
40
+ const [update, updateMutation] = useMutation(UPDATE_ROLE, {
41
+ refetchQueries: [
42
+ {
43
+ query: LIST_ROLES
44
+ }
45
+ ]
46
+ });
47
+ const loading = [
48
+ getQuery,
49
+ createMutation,
50
+ updateMutation
51
+ ].find((item)=>item.loading);
52
+ const onSubmit = useCallback(async ({ id, name, description, slug, permissions, createdOn })=>{
53
+ if (!permissions || !permissions.length) return void showSnackbar(t`You must configure permissions before saving!`, {
54
+ timeout: 60000,
55
+ dismissesOnAction: true
56
+ });
57
+ const isUpdate = createdOn;
58
+ const [operation, args] = isUpdate ? [
59
+ update,
60
+ {
61
+ variables: {
62
+ id,
63
+ data: {
64
+ name,
65
+ permissions,
66
+ ...description && {
67
+ description
68
+ }
69
+ }
70
+ }
71
+ }
72
+ ] : [
73
+ create,
74
+ {
75
+ variables: {
76
+ data: {
77
+ name,
78
+ slug,
79
+ description,
80
+ permissions
81
+ }
82
+ }
83
+ }
84
+ ];
85
+ const response = await operation(args);
86
+ const { data: role, error } = response.data.security.role;
87
+ if (error) return showSnackbar(error.message);
88
+ if (!isUpdate) goToRoute(Routes.Roles.List, {
89
+ id: role.id
90
+ });
91
+ showSnackbar(t`Role saved successfully!`);
92
+ }, [
93
+ id
94
+ ]);
95
+ const data = loading ? {} : get(getQuery, "data.security.role.data", {});
96
+ const systemRole = "full-access" === data.slug || data.system;
97
+ const pluginRole = data.plugin ?? false;
98
+ const canModifyRole = !systemRole && !pluginRole;
99
+ const showEmptyView = !newEntry && !loading && isEmpty(data);
100
+ if (showEmptyView) return /*#__PURE__*/ react.createElement(EmptyView, {
101
+ icon: /*#__PURE__*/ react.createElement(settings_svg_ReactComponent, null),
102
+ title: t`Click on the left side list to display role details or create a...`,
103
+ action: /*#__PURE__*/ react.createElement(Button, {
104
+ icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
105
+ text: t`New Role`,
106
+ "data-testid": "new-record-button",
107
+ onClick: ()=>{
108
+ goToRoute(Routes.Roles.List, {
109
+ new: true
110
+ });
111
+ }
112
+ })
113
+ });
114
+ return /*#__PURE__*/ react.createElement(Form, {
115
+ data: data,
116
+ onSubmit: onSubmit
117
+ }, ({ data, form, Bind })=>/*#__PURE__*/ react.createElement(SimpleForm, {
118
+ size: "lg"
119
+ }, loading && /*#__PURE__*/ react.createElement(OverlayLoader, null), /*#__PURE__*/ react.createElement(SimpleFormHeader, {
120
+ title: data.name ? data.name : "Untitled"
121
+ }), /*#__PURE__*/ react.createElement(SimpleFormContent, null, /*#__PURE__*/ react.createElement(FormContent, {
122
+ pluginRole: pluginRole,
123
+ canModifyRole: canModifyRole,
124
+ newEntry: newEntry
125
+ })), /*#__PURE__*/ react.createElement(SimpleFormHeader, {
126
+ title: "Permissions",
127
+ rounded: false
128
+ }, /*#__PURE__*/ react.createElement("div", {
129
+ className: "flex justify-end"
130
+ }, /*#__PURE__*/ react.createElement(Tooltip, {
131
+ content: "Copy permissions as JSON",
132
+ trigger: /*#__PURE__*/ react.createElement(IconButton, {
133
+ variant: "ghost",
134
+ icon: /*#__PURE__*/ react.createElement(content_copy_svg_ReactComponent, null),
135
+ onClick: ()=>{
136
+ navigator.clipboard.writeText(JSON.stringify(data.permissions, null, 2));
137
+ showSnackbar("JSON data copied to clipboard.");
138
+ }
139
+ })
140
+ }))), /*#__PURE__*/ react.createElement(SimpleFormContent, null, systemRole && /*#__PURE__*/ react.createElement(Grid.Column, {
141
+ span: 12
142
+ }, /*#__PURE__*/ react.createElement(Alert, {
143
+ type: "warning",
144
+ title: "Permissions are locked"
145
+ }, "This is a protected system role and you can't modify its permissions.")), /*#__PURE__*/ react.createElement(Grid, null, /*#__PURE__*/ react.createElement(react.Fragment, null, canModifyRole && /*#__PURE__*/ react.createElement(Grid.Column, {
146
+ span: 12
147
+ }, /*#__PURE__*/ react.createElement(Bind, {
148
+ name: "permissions",
149
+ defaultValue: []
150
+ }, (bind)=>/*#__PURE__*/ react.createElement(Permissions, {
151
+ id: data.id || "new",
152
+ ...bind
153
+ })))))), /*#__PURE__*/ react.createElement(SimpleFormFooter, null, canModifyRole && /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(Button, {
154
+ variant: "secondary",
155
+ text: t`Cancel`,
156
+ onClick: ()=>{
157
+ goToRoute(Routes.Roles.List);
158
+ },
159
+ "data-testid": "pb.category.new.form.button.cancel"
160
+ }), /*#__PURE__*/ react.createElement(Button, {
161
+ text: t`Save`,
162
+ "data-testid": "admin.am.role.new.save",
163
+ onClick: (ev)=>{
164
+ form.submit(ev);
165
+ }
166
+ })))));
167
+ };
168
+ const FormContent = (props)=>{
169
+ const { pluginRole, canModifyRole, newEntry } = props;
170
+ const form = useForm();
171
+ const { generateSlug } = useGenerateSlug(form, "name", "slug");
172
+ return /*#__PURE__*/ react.createElement(Grid, null, /*#__PURE__*/ react.createElement(react.Fragment, null, pluginRole && /*#__PURE__*/ react.createElement(Grid.Column, {
173
+ span: 12
174
+ }, /*#__PURE__*/ react.createElement(Alert, {
175
+ type: "warning",
176
+ title: "Permissions are locked"
177
+ }, "This role is registered via an extension, and cannot be modified.")), /*#__PURE__*/ react.createElement(Grid.Column, {
178
+ span: 6
179
+ }, /*#__PURE__*/ react.createElement(form_Bind, {
180
+ name: "name",
181
+ validators: validation.create("required,minLength:1")
182
+ }, /*#__PURE__*/ react.createElement(Input, {
183
+ required: true,
184
+ label: t`Name`,
185
+ disabled: !canModifyRole,
186
+ onBlur: generateSlug,
187
+ "data-testid": "admin.am.role.new.name"
188
+ }))), /*#__PURE__*/ react.createElement(Grid.Column, {
189
+ span: 6
190
+ }, /*#__PURE__*/ react.createElement(form_Bind, {
191
+ name: "slug",
192
+ validators: validation.create("required,minLength:1")
193
+ }, /*#__PURE__*/ react.createElement(Input, {
194
+ required: true,
195
+ disabled: !canModifyRole || !newEntry,
196
+ label: t`Slug`,
197
+ "data-testid": "admin.am.role.new.slug"
198
+ }))), /*#__PURE__*/ react.createElement(Grid.Column, {
199
+ span: 12
200
+ }, /*#__PURE__*/ react.createElement(form_Bind, {
201
+ name: "description",
202
+ validators: validation.create("maxLength:500"),
203
+ defaultValue: ""
204
+ }, /*#__PURE__*/ react.createElement(Textarea, {
205
+ label: t`Description`,
206
+ rows: 3,
207
+ disabled: !canModifyRole,
208
+ "data-testid": "admin.am.role.new.description"
209
+ })))));
210
+ };
211
+ export { RolesForm };
212
+
213
+ //# sourceMappingURL=RolesForm.js.map