@webiny/app-security-access-management 0.0.0-mt-2 → 0.0.0-unstable.06b2ede40f

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 (119) hide show
  1. package/README.md +6 -4
  2. package/components/GroupAutocomplete/graphql.d.ts +1 -1
  3. package/components/GroupAutocomplete/graphql.js +17 -5
  4. package/components/GroupAutocomplete/graphql.js.map +1 -0
  5. package/components/GroupAutocomplete/index.d.ts +5 -2
  6. package/components/GroupAutocomplete/index.js +10 -8
  7. package/components/GroupAutocomplete/index.js.map +1 -0
  8. package/components/GroupsMultiAutocomplete/graphql.d.ts +1 -0
  9. package/components/GroupsMultiAutocomplete/graphql.js +23 -0
  10. package/components/GroupsMultiAutocomplete/graphql.js.map +1 -0
  11. package/components/GroupsMultiAutocomplete/index.d.ts +5 -0
  12. package/components/GroupsMultiAutocomplete/index.js +19 -0
  13. package/components/GroupsMultiAutocomplete/index.js.map +1 -0
  14. package/components/NotAuthorizedError/NotAuthorizedError.d.ts +2 -2
  15. package/components/NotAuthorizedError/NotAuthorizedError.js +17 -44
  16. package/components/NotAuthorizedError/NotAuthorizedError.js.map +1 -0
  17. package/components/NotAuthorizedError/index.js +3 -1
  18. package/components/NotAuthorizedError/index.js.map +1 -0
  19. package/components/TeamAutocomplete/graphql.d.ts +1 -0
  20. package/components/TeamAutocomplete/graphql.js +18 -0
  21. package/components/TeamAutocomplete/graphql.js.map +1 -0
  22. package/components/TeamAutocomplete/index.d.ts +5 -0
  23. package/components/TeamAutocomplete/index.js +18 -0
  24. package/components/TeamAutocomplete/index.js.map +1 -0
  25. package/components/TeamsMultiAutocomplete/graphql.d.ts +1 -0
  26. package/components/TeamsMultiAutocomplete/graphql.js +23 -0
  27. package/components/TeamsMultiAutocomplete/graphql.js.map +1 -0
  28. package/components/TeamsMultiAutocomplete/index.d.ts +5 -0
  29. package/components/TeamsMultiAutocomplete/index.js +19 -0
  30. package/components/TeamsMultiAutocomplete/index.js.map +1 -0
  31. package/index.d.ts +2 -2
  32. package/index.js +83 -4
  33. package/index.js.map +1 -0
  34. package/package.json +24 -37
  35. package/plugins/constants.d.ts +1 -0
  36. package/plugins/constants.js +6 -4
  37. package/plugins/constants.js.map +1 -0
  38. package/plugins/index.d.ts +1 -1
  39. package/plugins/index.js +3 -5
  40. package/plugins/index.js.map +1 -0
  41. package/plugins/installation.d.ts +1 -1
  42. package/plugins/installation.js +68 -67
  43. package/plugins/installation.js.map +1 -0
  44. package/plugins/permissionRenderer/SecurityPermissions.d.ts +8 -5
  45. package/plugins/permissionRenderer/SecurityPermissions.js +93 -94
  46. package/plugins/permissionRenderer/SecurityPermissions.js.map +1 -0
  47. package/plugins/permissionRenderer/index.js +14 -13
  48. package/plugins/permissionRenderer/index.js.map +1 -0
  49. package/plugins/routes.d.ts +1 -1
  50. package/plugins/routes.js +14 -16
  51. package/plugins/routes.js.map +1 -0
  52. package/plugins/secureRouteError.d.ts +2 -2
  53. package/plugins/secureRouteError.js +5 -3
  54. package/plugins/secureRouteError.js.map +1 -0
  55. package/types.d.ts +28 -0
  56. package/types.js +3 -0
  57. package/types.js.map +1 -0
  58. package/ui/elements/GroupAutocompleteElement.d.ts +2 -1
  59. package/ui/elements/GroupAutocompleteElement.js +27 -30
  60. package/ui/elements/GroupAutocompleteElement.js.map +1 -0
  61. package/ui/elements/GroupsMultiAutocompleteElement.d.ts +6 -0
  62. package/ui/elements/GroupsMultiAutocompleteElement.js +32 -0
  63. package/ui/elements/GroupsMultiAutocompleteElement.js.map +1 -0
  64. package/ui/elements/TeamAutocompleteElement.d.ts +6 -0
  65. package/ui/elements/TeamAutocompleteElement.js +32 -0
  66. package/ui/elements/TeamAutocompleteElement.js.map +1 -0
  67. package/ui/views/ApiKeys/ApiKeyForm.d.ts +5 -3
  68. package/ui/views/ApiKeys/ApiKeyForm.js +125 -183
  69. package/ui/views/ApiKeys/ApiKeyForm.js.map +1 -0
  70. package/ui/views/ApiKeys/ApiKeys.d.ts +8 -3
  71. package/ui/views/ApiKeys/ApiKeys.js +7 -7
  72. package/ui/views/ApiKeys/ApiKeys.js.map +1 -0
  73. package/ui/views/ApiKeys/ApiKeysDataList.d.ts +5 -3
  74. package/ui/views/ApiKeys/ApiKeysDataList.js +105 -169
  75. package/ui/views/ApiKeys/ApiKeysDataList.js.map +1 -0
  76. package/ui/views/ApiKeys/graphql.d.ts +13 -5
  77. package/ui/views/ApiKeys/graphql.js +81 -10
  78. package/ui/views/ApiKeys/graphql.js.map +1 -0
  79. package/ui/views/ApiKeys/index.d.ts +1 -1
  80. package/ui/views/ApiKeys/index.js +3 -1
  81. package/ui/views/ApiKeys/index.js.map +1 -0
  82. package/ui/views/ApiKeys/utils.d.ts +2 -1
  83. package/ui/views/ApiKeys/utils.js +6 -5
  84. package/ui/views/ApiKeys/utils.js.map +1 -0
  85. package/ui/views/Groups/Groups.d.ts +8 -3
  86. package/ui/views/Groups/Groups.js +8 -8
  87. package/ui/views/Groups/Groups.js.map +1 -0
  88. package/ui/views/Groups/GroupsDataList.d.ts +5 -3
  89. package/ui/views/Groups/GroupsDataList.js +110 -176
  90. package/ui/views/Groups/GroupsDataList.js.map +1 -0
  91. package/ui/views/Groups/GroupsForm.d.ts +5 -3
  92. package/ui/views/Groups/GroupsForm.js +150 -170
  93. package/ui/views/Groups/GroupsForm.js.map +1 -0
  94. package/ui/views/Groups/graphql.d.ts +13 -5
  95. package/ui/views/Groups/graphql.js +84 -10
  96. package/ui/views/Groups/graphql.js.map +1 -0
  97. package/ui/views/Groups/index.d.ts +1 -1
  98. package/ui/views/Groups/index.js +3 -1
  99. package/ui/views/Groups/index.js.map +1 -0
  100. package/ui/views/Teams/Teams.d.ts +8 -0
  101. package/ui/views/Teams/Teams.js +12 -0
  102. package/ui/views/Teams/Teams.js.map +1 -0
  103. package/ui/views/Teams/TeamsDataList.d.ts +5 -0
  104. package/ui/views/Teams/TeamsDataList.js +151 -0
  105. package/ui/views/Teams/TeamsDataList.js.map +1 -0
  106. package/ui/views/Teams/TeamsForm.d.ts +5 -0
  107. package/ui/views/Teams/TeamsForm.js +173 -0
  108. package/ui/views/Teams/TeamsForm.js.map +1 -0
  109. package/ui/views/Teams/graphql.d.ts +13 -0
  110. package/ui/views/Teams/graphql.js +89 -0
  111. package/ui/views/Teams/graphql.js.map +1 -0
  112. package/ui/views/Teams/index.d.ts +1 -0
  113. package/ui/views/Teams/index.js +3 -0
  114. package/ui/views/Teams/index.js.map +1 -0
  115. package/ui/views/utils.d.ts +3 -2
  116. package/ui/views/utils.js +6 -23
  117. package/ui/views/utils.js.map +1 -0
  118. package/plugins/menus.d.ts +0 -4
  119. package/plugins/menus.js +0 -61
@@ -1,215 +1,149 @@
1
- import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
- import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
- import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
4
-
5
- var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10;
6
-
7
- import _regeneratorRuntime from "@babel/runtime/regenerator";
8
1
  import React, { useCallback, useMemo, useState } from "react";
9
2
  import orderBy from "lodash/orderBy";
10
3
  import { i18n } from "@webiny/app/i18n";
11
- import { DataList, ScrollList, ListItem, ListItemText, ListItemTextSecondary, ListItemMeta, ListActions, DataListModalOverlayAction, DataListModalOverlay } from "@webiny/ui/List";
4
+ import { DataList, ScrollList, ListItem, ListItemText, ListItemTextSecondary, ListItemMeta, ListActions, DataListModalOverlayAction, DataListModalOverlay, ListItemTextPrimary } from "@webiny/ui/List";
12
5
  import { DeleteIcon } from "@webiny/ui/List/DataList/icons";
13
6
  import { useRouter } from "@webiny/react-router";
14
7
  import { useSnackbar } from "@webiny/app-admin/hooks/useSnackbar";
15
8
  import { useQuery, useMutation } from "@apollo/react-hooks";
16
9
  import { useConfirmationDialog } from "@webiny/app-admin/hooks/useConfirmationDialog";
17
10
  import { LIST_GROUPS, DELETE_GROUP } from "./graphql";
18
- import { Tooltip } from "@webiny/ui/Tooltip";
19
- import { ButtonIcon, ButtonSecondary } from "@webiny/ui/Button";
20
- import { Cell, Grid } from "@webiny/ui/Grid";
21
- import { Select } from "@webiny/ui/Select";
22
11
  import SearchUI from "@webiny/app-admin/components/SearchUI";
23
- import { ReactComponent as AddIcon } from "@svgr/webpack!@webiny/app-admin/assets/icons/add-18px.svg";
24
- import { ReactComponent as FilterIcon } from "@svgr/webpack!@webiny/app-admin/assets/icons/filter-24px.svg";
25
- import { deserializeSorters, serializeSorters } from "../utils";
26
- var t = i18n.ns("app-security/admin/groups/data-list");
27
- var SORTERS = [{
28
- label: t(_templateObject || (_templateObject = _taggedTemplateLiteral(["Newest to oldest"]))),
29
- sorters: {
30
- createdOn: "desc"
31
- }
12
+ import { deserializeSorters } from "../utils";
13
+ import { Button, Grid, Select, Tooltip } from "@webiny/admin-ui";
14
+ import { ReactComponent as AddIcon } from "@webiny/icons/add.svg";
15
+ const t = i18n.ns("app-security/admin/roles/data-list");
16
+ const SORTERS = [{
17
+ label: t`Newest to oldest`,
18
+ sorter: "createdOn_DESC"
32
19
  }, {
33
- label: t(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["Oldest to newest"]))),
34
- sorters: {
35
- createdOn: "asc"
36
- }
20
+ label: t`Oldest to newest`,
21
+ sorter: "createdOn_ASC"
37
22
  }, {
38
- label: t(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["Name A-Z"]))),
39
- sorters: {
40
- name: "asc"
41
- }
23
+ label: t`Name A-Z`,
24
+ sorter: "name_ASC"
42
25
  }, {
43
- label: t(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["Name Z-A"]))),
44
- sorters: {
45
- name: "desc"
46
- }
26
+ label: t`Name Z-A`,
27
+ sorter: "name_DESC"
47
28
  }];
48
-
49
- var GroupsDataList = function GroupsDataList() {
50
- var _useState = useState(""),
51
- _useState2 = _slicedToArray(_useState, 2),
52
- filter = _useState2[0],
53
- setFilter = _useState2[1];
54
-
55
- var _useState3 = useState(serializeSorters(SORTERS[0].sorters)),
56
- _useState4 = _slicedToArray(_useState3, 2),
57
- sort = _useState4[0],
58
- setSort = _useState4[1];
59
-
60
- var _useRouter = useRouter(),
61
- history = _useRouter.history,
62
- location = _useRouter.location;
63
-
64
- var _useSnackbar = useSnackbar(),
65
- showSnackbar = _useSnackbar.showSnackbar;
66
-
67
- var _useConfirmationDialo = useConfirmationDialog({
29
+ export const GroupsDataList = () => {
30
+ const [filter, setFilter] = useState("");
31
+ const [sort, setSort] = useState(SORTERS[0].sorter);
32
+ const {
33
+ history,
34
+ location
35
+ } = useRouter();
36
+ const {
37
+ showSnackbar
38
+ } = useSnackbar();
39
+ const {
40
+ showConfirmation
41
+ } = useConfirmationDialog({
68
42
  dataTestId: "default-data-list.delete-dialog"
69
- }),
70
- showConfirmation = _useConfirmationDialo.showConfirmation;
71
-
72
- var _useQuery = useQuery(LIST_GROUPS),
73
- listResponse = _useQuery.data,
74
- listLoading = _useQuery.loading;
75
-
76
- var _useMutation = useMutation(DELETE_GROUP, {
43
+ });
44
+ const {
45
+ data: listResponse,
46
+ loading: listLoading
47
+ } = useQuery(LIST_GROUPS);
48
+ const [deleteIt, {
49
+ loading: deleteLoading
50
+ }] = useMutation(DELETE_GROUP, {
77
51
  refetchQueries: [{
78
52
  query: LIST_GROUPS
79
53
  }]
80
- }),
81
- _useMutation2 = _slicedToArray(_useMutation, 2),
82
- deleteIt = _useMutation2[0],
83
- deleteLoading = _useMutation2[1].loading;
84
-
85
- var data = listLoading && !listResponse ? [] : listResponse.security.groups.data;
86
- var id = new URLSearchParams(location.search).get("id");
87
- var filterGroup = useCallback(function (_ref) {
88
- var name = _ref.name,
89
- slug = _ref.slug,
90
- description = _ref.description;
54
+ });
55
+ const data = listLoading && !listResponse ? [] : listResponse?.security.groups.data || [];
56
+ const id = new URLSearchParams(location.search).get("id");
57
+ const filterGroup = useCallback(({
58
+ name,
59
+ slug,
60
+ description
61
+ }) => {
91
62
  return name.toLowerCase().includes(filter) || slug.toLowerCase().includes(filter) || description && description.toLowerCase().includes(filter);
92
63
  }, [filter]);
93
- var sortGroups = useCallback(function (groups) {
64
+ const sortGroups = useCallback(groups => {
94
65
  if (!sort) {
95
66
  return groups;
96
67
  }
97
-
98
- var _Object$entries = Object.entries(deserializeSorters(sort)),
99
- _Object$entries2 = _slicedToArray(_Object$entries, 1),
100
- _Object$entries2$ = _slicedToArray(_Object$entries2[0], 2),
101
- key = _Object$entries2$[0],
102
- value = _Object$entries2$[1];
103
-
104
- return orderBy(groups, [key], [value]);
68
+ const [key, sortBy] = deserializeSorters(sort);
69
+ return orderBy(groups, [key], [sortBy]);
105
70
  }, [sort]);
106
- var deleteItem = useCallback(function (item) {
107
- showConfirmation( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
108
- var _yield$deleteIt, data, error;
109
-
110
- return _regeneratorRuntime.wrap(function _callee$(_context) {
111
- while (1) {
112
- switch (_context.prev = _context.next) {
113
- case 0:
114
- _context.next = 2;
115
- return deleteIt({
116
- variables: item
117
- });
118
-
119
- case 2:
120
- _yield$deleteIt = _context.sent;
121
- data = _yield$deleteIt.data;
122
- error = data.security.deleteGroup.error;
123
-
124
- if (!error) {
125
- _context.next = 7;
126
- break;
127
- }
128
-
129
- return _context.abrupt("return", showSnackbar(error.message));
130
-
131
- case 7:
132
- showSnackbar(t(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["Group \"{slug}\" deleted."])))({
133
- slug: item.slug
134
- }));
135
-
136
- if (id === item.id) {
137
- history.push("/access-management/groups");
138
- }
139
-
140
- case 9:
141
- case "end":
142
- return _context.stop();
143
- }
144
- }
145
- }, _callee);
146
- })));
71
+ const deleteItem = useCallback(item => {
72
+ showConfirmation(async () => {
73
+ const {
74
+ data
75
+ } = await deleteIt({
76
+ variables: item
77
+ });
78
+ const {
79
+ error
80
+ } = data.security.deleteGroup;
81
+ if (error) {
82
+ return showSnackbar(error.message);
83
+ }
84
+ showSnackbar(t`Role "{slug}" deleted.`({
85
+ slug: item.slug
86
+ }));
87
+ if (id === item.id) {
88
+ history.push(`/access-management/roles`);
89
+ }
90
+ });
147
91
  }, [id]);
148
- var groupsDataListModalOverlay = useMemo(function () {
149
- return /*#__PURE__*/React.createElement(DataListModalOverlay, null, /*#__PURE__*/React.createElement(Grid, null, /*#__PURE__*/React.createElement(Cell, {
150
- span: 12
151
- }, /*#__PURE__*/React.createElement(Select, {
152
- value: sort,
153
- onChange: setSort,
154
- label: t(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["Sort by"])))
155
- }, SORTERS.map(function (_ref3) {
156
- var label = _ref3.label,
157
- sorters = _ref3.sorters;
158
- return /*#__PURE__*/React.createElement("option", {
159
- key: label,
160
- value: serializeSorters(sorters)
161
- }, label);
162
- })))));
163
- }, [sort]);
164
- var filteredData = filter === "" ? data : data.filter(filterGroup);
165
- var groupList = sortGroups(filteredData);
92
+ const groupsDataListModalOverlay = useMemo(() => /*#__PURE__*/React.createElement(DataListModalOverlay, null, /*#__PURE__*/React.createElement(Grid, null, /*#__PURE__*/React.createElement(Grid.Column, {
93
+ span: 12
94
+ }, /*#__PURE__*/React.createElement(Select, {
95
+ value: sort,
96
+ onChange: setSort,
97
+ label: t`Sort by`,
98
+ options: SORTERS.map(({
99
+ label,
100
+ sorter: value
101
+ }) => ({
102
+ label,
103
+ value
104
+ }))
105
+ })))), [sort]);
106
+ const filteredData = filter === "" ? data : data.filter(filterGroup);
107
+ const groupList = sortGroups(filteredData);
166
108
  return /*#__PURE__*/React.createElement(DataList, {
167
- title: t(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["Groups"]))),
168
- actions: /*#__PURE__*/React.createElement(ButtonSecondary, {
109
+ title: t`Roles`,
110
+ actions: /*#__PURE__*/React.createElement(Button, {
111
+ text: t`New`,
112
+ icon: /*#__PURE__*/React.createElement(AddIcon, null),
113
+ size: "sm",
114
+ className: "wby-ml-xs",
169
115
  "data-testid": "new-record-button",
170
- onClick: function onClick() {
171
- return history.push("/access-management/groups?new=true");
172
- }
173
- }, /*#__PURE__*/React.createElement(ButtonIcon, {
174
- icon: /*#__PURE__*/React.createElement(AddIcon, null)
175
- }), " ", t(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["New Group"])))),
116
+ onClick: () => history.push("/access-management/roles?new=true")
117
+ }),
176
118
  data: groupList,
177
119
  loading: listLoading || deleteLoading,
178
120
  search: /*#__PURE__*/React.createElement(SearchUI, {
179
121
  value: filter,
180
122
  onChange: setFilter,
181
- inputPlaceholder: t(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["Search Groups"])))
123
+ inputPlaceholder: t`Search roles...`
182
124
  }),
183
125
  modalOverlay: groupsDataListModalOverlay,
184
126
  modalOverlayAction: /*#__PURE__*/React.createElement(DataListModalOverlayAction, {
185
- icon: /*#__PURE__*/React.createElement(FilterIcon, null),
186
127
  "data-testid": "default-data-list.filter"
187
128
  })
188
- }, function (_ref4) {
189
- var data = _ref4.data;
190
- return /*#__PURE__*/React.createElement(ScrollList, {
191
- "data-testid": "default-data-list"
192
- }, data.map(function (item) {
193
- return /*#__PURE__*/React.createElement(ListItem, {
194
- key: item.id,
195
- selected: item.id === id
196
- }, /*#__PURE__*/React.createElement(ListItemText, {
197
- onClick: function onClick() {
198
- return history.push("/access-management/groups?id=".concat(item.id));
199
- }
200
- }, item.name, /*#__PURE__*/React.createElement(ListItemTextSecondary, null, item.description)), /*#__PURE__*/React.createElement(ListItemMeta, null, /*#__PURE__*/React.createElement(ListActions, null, item.slug !== "full-access" ? /*#__PURE__*/React.createElement(DeleteIcon, {
201
- onClick: function onClick() {
202
- return deleteItem(item);
203
- },
204
- "data-testid": "default-data-list.delete"
205
- }) : /*#__PURE__*/React.createElement(Tooltip, {
206
- placement: "bottom",
207
- content: /*#__PURE__*/React.createElement("span", null, t(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["You can't delete this group."]))))
208
- }, /*#__PURE__*/React.createElement(DeleteIcon, {
209
- disabled: true
210
- })))));
211
- }));
212
- });
129
+ }, ({
130
+ data
131
+ }) => /*#__PURE__*/React.createElement(ScrollList, {
132
+ "data-testid": "default-data-list"
133
+ }, data.map(item => /*#__PURE__*/React.createElement(ListItem, {
134
+ key: item.id,
135
+ selected: item.id === id
136
+ }, /*#__PURE__*/React.createElement(ListItemText, {
137
+ onClick: () => history.push(`/access-management/roles?id=${item.id}`)
138
+ }, /*#__PURE__*/React.createElement(ListItemTextPrimary, null, item.name), /*#__PURE__*/React.createElement(ListItemTextSecondary, null, item.description)), /*#__PURE__*/React.createElement(ListItemMeta, null, /*#__PURE__*/React.createElement(ListActions, null, item.system || item.plugin ? /*#__PURE__*/React.createElement(Tooltip, {
139
+ content: /*#__PURE__*/React.createElement("span", null, item.system ? t`Cannot delete system roles.` : t`Cannot delete roles registered via extensions.`),
140
+ trigger: /*#__PURE__*/React.createElement(DeleteIcon, {
141
+ disabled: true
142
+ })
143
+ }) : /*#__PURE__*/React.createElement(DeleteIcon, {
144
+ onClick: () => deleteItem(item),
145
+ "data-testid": "default-data-list.delete"
146
+ })))))));
213
147
  };
214
148
 
215
- export default GroupsDataList;
149
+ //# sourceMappingURL=GroupsDataList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useCallback","useMemo","useState","orderBy","i18n","DataList","ScrollList","ListItem","ListItemText","ListItemTextSecondary","ListItemMeta","ListActions","DataListModalOverlayAction","DataListModalOverlay","ListItemTextPrimary","DeleteIcon","useRouter","useSnackbar","useQuery","useMutation","useConfirmationDialog","LIST_GROUPS","DELETE_GROUP","SearchUI","deserializeSorters","Button","Grid","Select","Tooltip","ReactComponent","AddIcon","t","ns","SORTERS","label","sorter","GroupsDataList","filter","setFilter","sort","setSort","history","location","showSnackbar","showConfirmation","dataTestId","data","listResponse","loading","listLoading","deleteIt","deleteLoading","refetchQueries","query","security","groups","id","URLSearchParams","search","get","filterGroup","name","slug","description","toLowerCase","includes","sortGroups","key","sortBy","deleteItem","item","variables","error","deleteGroup","message","push","groupsDataListModalOverlay","createElement","Column","span","value","onChange","options","map","filteredData","groupList","title","actions","text","icon","size","className","onClick","inputPlaceholder","modalOverlay","modalOverlayAction","selected","system","plugin","content","trigger","disabled"],"sources":["GroupsDataList.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useState } from \"react\";\nimport orderBy from \"lodash/orderBy\";\nimport { i18n } from \"@webiny/app/i18n\";\nimport {\n DataList,\n ScrollList,\n ListItem,\n ListItemText,\n ListItemTextSecondary,\n ListItemMeta,\n ListActions,\n DataListModalOverlayAction,\n DataListModalOverlay,\n ListItemTextPrimary\n} from \"@webiny/ui/List\";\nimport { DeleteIcon } from \"@webiny/ui/List/DataList/icons\";\nimport { useRouter } from \"@webiny/react-router\";\nimport { useSnackbar } from \"@webiny/app-admin/hooks/useSnackbar\";\nimport { useQuery, useMutation } from \"@apollo/react-hooks\";\nimport { useConfirmationDialog } from \"@webiny/app-admin/hooks/useConfirmationDialog\";\nimport type { ListGroupsResponse } from \"./graphql\";\nimport { LIST_GROUPS, DELETE_GROUP } from \"./graphql\";\nimport SearchUI from \"@webiny/app-admin/components/SearchUI\";\nimport { deserializeSorters } from \"../utils\";\nimport type { Group } from \"~/types\";\nimport { Button, Grid, Select, Tooltip } from \"@webiny/admin-ui\";\nimport { ReactComponent as AddIcon } from \"@webiny/icons/add.svg\";\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 GroupsDataListProps {\n // TODO @ts-refactor delete and go up the tree and sort it out\n [key: string]: any;\n}\n\nexport const GroupsDataList = () => {\n const [filter, setFilter] = useState(\"\");\n const [sort, setSort] = useState(SORTERS[0].sorter);\n const { history, location } = 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<ListGroupsResponse>(LIST_GROUPS);\n\n const [deleteIt, { loading: deleteLoading }] = useMutation(DELETE_GROUP, {\n refetchQueries: [{ query: LIST_GROUPS }]\n });\n\n const data = listLoading && !listResponse ? [] : listResponse?.security.groups.data || [];\n const id = new URLSearchParams(location.search).get(\"id\");\n\n const filterGroup = useCallback(\n ({ name, slug, description }: Group) => {\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 sortGroups = useCallback(\n (groups: Group[]) => {\n if (!sort) {\n return groups;\n }\n const [key, sortBy] = deserializeSorters(sort);\n return orderBy(groups, [key], [sortBy]);\n },\n [sort]\n );\n\n const deleteItem = useCallback(\n (item: Group) => {\n showConfirmation(async () => {\n const { data } = await deleteIt({\n variables: item\n });\n\n const { error } = data.security.deleteGroup;\n if (error) {\n return showSnackbar(error.message);\n }\n\n showSnackbar(t`Role \"{slug}\" deleted.`({ slug: item.slug }));\n\n if (id === item.id) {\n history.push(`/access-management/roles`);\n }\n });\n },\n [id]\n );\n\n const groupsDataListModalOverlay = useMemo(\n () => (\n <DataListModalOverlay>\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 </DataListModalOverlay>\n ),\n [sort]\n );\n\n const filteredData = filter === \"\" ? data : data.filter(filterGroup);\n const groupList = sortGroups(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={\"wby-ml-xs\"}\n data-testid=\"new-record-button\"\n onClick={() => history.push(\"/access-management/roles?new=true\")}\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={groupsDataListModalOverlay}\n modalOverlayAction={\n <DataListModalOverlayAction data-testid={\"default-data-list.filter\"} />\n }\n >\n {({ data }: { data: Group[] }) => (\n <ScrollList data-testid=\"default-data-list\">\n {data.map(item => (\n <ListItem key={item.id} selected={item.id === id}>\n <ListItemText\n onClick={() =>\n history.push(`/access-management/roles?id=${item.id}`)\n }\n >\n <ListItemTextPrimary>{item.name}</ListItemTextPrimary>\n <ListItemTextSecondary>{item.description}</ListItemTextSecondary>\n </ListItemText>\n\n <ListItemMeta>\n <ListActions>\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 </ListActions>\n </ListItemMeta>\n </ListItem>\n ))}\n </ScrollList>\n )}\n </DataList>\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,3 +1,5 @@
1
- /// <reference types="react" />
2
- declare const GroupForm: () => JSX.Element;
3
- export default GroupForm;
1
+ import React from "react";
2
+ export interface GroupsFormProps {
3
+ [key: string]: any;
4
+ }
5
+ export declare const GroupsForm: () => React.JSX.Element;