@webiny/app-security-access-management 6.3.0-beta.4 → 6.4.0-beta.0

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 (53) hide show
  1. package/Extension.js +74 -73
  2. package/Extension.js.map +1 -1
  3. package/SecurityPermissions.js +49 -41
  4. package/SecurityPermissions.js.map +1 -1
  5. package/constants.js +6 -5
  6. package/constants.js.map +1 -1
  7. package/domain/permissionsSchema.js +30 -19
  8. package/domain/permissionsSchema.js.map +1 -1
  9. package/features/permissions/abstractions.js +2 -1
  10. package/features/permissions/abstractions.js.map +1 -1
  11. package/features/permissions/feature.js +2 -1
  12. package/features/permissions/feature.js.map +1 -1
  13. package/index.js +0 -2
  14. package/package.json +9 -11
  15. package/routes.js +32 -37
  16. package/routes.js.map +1 -1
  17. package/types.js +0 -3
  18. package/ui/views/ApiKeys/ApiKeyForm.js +203 -220
  19. package/ui/views/ApiKeys/ApiKeyForm.js.map +1 -1
  20. package/ui/views/ApiKeys/ApiKeys.js +11 -12
  21. package/ui/views/ApiKeys/ApiKeys.js.map +1 -1
  22. package/ui/views/ApiKeys/ApiKeysDataList.js +129 -143
  23. package/ui/views/ApiKeys/ApiKeysDataList.js.map +1 -1
  24. package/ui/views/ApiKeys/graphql.js +7 -6
  25. package/ui/views/ApiKeys/graphql.js.map +1 -1
  26. package/ui/views/ApiKeys/index.js +0 -2
  27. package/ui/views/ApiKeys/utils.js +12 -6
  28. package/ui/views/ApiKeys/utils.js.map +1 -1
  29. package/ui/views/Roles/Roles.js +11 -12
  30. package/ui/views/Roles/Roles.js.map +1 -1
  31. package/ui/views/Roles/RolesDataList.js +130 -144
  32. package/ui/views/Roles/RolesDataList.js.map +1 -1
  33. package/ui/views/Roles/RolesForm.js +198 -223
  34. package/ui/views/Roles/RolesForm.js.map +1 -1
  35. package/ui/views/Roles/graphql.js +7 -6
  36. package/ui/views/Roles/graphql.js.map +1 -1
  37. package/ui/views/Roles/index.js +0 -2
  38. package/ui/views/Teams/Teams.js +11 -12
  39. package/ui/views/Teams/Teams.js.map +1 -1
  40. package/ui/views/Teams/TeamsDataList.js +130 -146
  41. package/ui/views/Teams/TeamsDataList.js.map +1 -1
  42. package/ui/views/Teams/TeamsForm.js +174 -182
  43. package/ui/views/Teams/TeamsForm.js.map +1 -1
  44. package/ui/views/Teams/graphql.js +7 -6
  45. package/ui/views/Teams/graphql.js.map +1 -1
  46. package/ui/views/Teams/index.js +0 -2
  47. package/ui/views/utils.js +9 -7
  48. package/ui/views/utils.js.map +1 -1
  49. package/index.js.map +0 -1
  50. package/types.js.map +0 -1
  51. package/ui/views/ApiKeys/index.js.map +0 -1
  52. package/ui/views/Roles/index.js.map +0 -1
  53. package/ui/views/Teams/index.js.map +0 -1
@@ -1,155 +1,141 @@
1
- import React, { useCallback, useMemo, useState } from "react";
1
+ import react, { useCallback, useMemo, useState } from "react";
2
2
  import orderBy from "lodash/orderBy.js";
3
3
  import { i18n } from "@webiny/app/i18n/index.js";
4
- import { DataList, ScrollList, ListItem, ListItemText, ListItemTextSecondary, ListItemMeta, ListActions, DataListModalOverlayAction, DataListModalOverlay, ListItemTextPrimary } from "@webiny/ui/List/index.js";
5
- import { DeleteIcon } from "@webiny/ui/List/DataList/icons/index.js";
6
- import { useRouter, SearchUI, useSnackbar, useConfirmationDialog } from "@webiny/app-admin";
7
- import { useQuery, useMutation } from "@apollo/react-hooks";
8
- import { LIST_ROLES, DELETE_ROLE } from "./graphql.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";
9
8
  import { deserializeSorters } from "../utils.js";
10
- import { Button, Grid, Select, Tooltip } from "@webiny/admin-ui";
11
- import { ReactComponent as AddIcon } from "@webiny/icons/add.svg";
9
+ import { ReactComponent } from "@webiny/icons/add.svg";
12
10
  import { Routes } from "../../../routes.js";
13
11
  const t = i18n.ns("app-security/admin/roles/data-list");
14
- const SORTERS = [{
15
- label: t`Newest to oldest`,
16
- sorter: "createdOn_DESC"
17
- }, {
18
- label: t`Oldest to newest`,
19
- sorter: "createdOn_ASC"
20
- }, {
21
- label: t`Name A-Z`,
22
- sorter: "name_ASC"
23
- }, {
24
- label: t`Name Z-A`,
25
- sorter: "name_DESC"
26
- }];
27
- export const RolesDataList = ({
28
- activeId
29
- }) => {
30
- const [filter, setFilter] = useState("");
31
- const [sort, setSort] = useState(SORTERS[0].sorter);
32
- const {
33
- goToRoute
34
- } = useRouter();
35
- const {
36
- showSnackbar
37
- } = useSnackbar();
38
- const {
39
- showConfirmation
40
- } = useConfirmationDialog({
41
- dataTestId: "default-data-list.delete-dialog"
42
- });
43
- const {
44
- data: listResponse,
45
- loading: listLoading
46
- } = useQuery(LIST_ROLES);
47
- const [deleteIt, {
48
- loading: deleteLoading
49
- }] = useMutation(DELETE_ROLE, {
50
- refetchQueries: [{
51
- query: LIST_ROLES
52
- }]
53
- });
54
- const data = listLoading && !listResponse ? [] : listResponse?.security.roles.data || [];
55
- const filterRole = useCallback(({
56
- name,
57
- slug,
58
- description
59
- }) => {
60
- return name.toLowerCase().includes(filter) || slug.toLowerCase().includes(filter) || description && description.toLowerCase().includes(filter);
61
- }, [filter]);
62
- const sortRoles = useCallback(roles => {
63
- if (!sort) {
64
- return roles;
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"
65
28
  }
66
- const [key, sortBy] = deserializeSorters(sort);
67
- return orderBy(roles, [key], [sortBy]);
68
- }, [sort]);
69
- const deleteItem = useCallback(item => {
70
- showConfirmation(async () => {
71
- const {
72
- data
73
- } = await deleteIt({
74
- variables: item
75
- });
76
- const {
77
- error
78
- } = data.security.deleteRole;
79
- if (error) {
80
- return showSnackbar(error.message);
81
- }
82
- showSnackbar(t`Role "{slug}" deleted.`({
83
- slug: item.slug
84
- }));
85
- if (activeId === item.id) {
86
- goToRoute(Routes.Roles.List);
87
- }
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"
88
37
  });
89
- }, [activeId]);
90
- const rolesDataListModalOverlay = useMemo(() => /*#__PURE__*/React.createElement(DataListModalOverlay, null, /*#__PURE__*/React.createElement(Grid, null, /*#__PURE__*/React.createElement(Grid.Column, {
91
- span: 12
92
- }, /*#__PURE__*/React.createElement(Select, {
93
- value: sort,
94
- onChange: setSort,
95
- label: t`Sort by`,
96
- options: SORTERS.map(({
97
- label,
98
- sorter: value
99
- }) => ({
100
- label,
101
- value
102
- }))
103
- })))), [sort]);
104
- const filteredData = filter === "" ? data : data.filter(filterRole);
105
- const groupList = sortRoles(filteredData);
106
- return /*#__PURE__*/React.createElement(DataList, {
107
- title: t`Roles`,
108
- actions: /*#__PURE__*/React.createElement(Button, {
109
- text: t`New`,
110
- icon: /*#__PURE__*/React.createElement(AddIcon, null),
111
- size: "sm",
112
- className: "ml-xs",
113
- "data-testid": "new-record-button",
114
- onClick: () => {
115
- goToRoute(Routes.Roles.List, {
116
- new: true
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);
117
72
  });
118
- }
119
- }),
120
- data: groupList,
121
- loading: listLoading || deleteLoading,
122
- search: /*#__PURE__*/React.createElement(SearchUI, {
123
- value: filter,
124
- onChange: setFilter,
125
- inputPlaceholder: t`Search roles...`
126
- }),
127
- modalOverlay: rolesDataListModalOverlay,
128
- modalOverlayAction: /*#__PURE__*/React.createElement(DataListModalOverlayAction, {
129
- "data-testid": "default-data-list.filter"
130
- })
131
- }, ({
132
- data
133
- }) => /*#__PURE__*/React.createElement(ScrollList, {
134
- "data-testid": "default-data-list"
135
- }, data.map(item => /*#__PURE__*/React.createElement(ListItem, {
136
- key: item.id,
137
- selected: item.id === activeId
138
- }, /*#__PURE__*/React.createElement(ListItemText, {
139
- onClick: () => {
140
- goToRoute(Routes.Roles.List, {
141
- id: item.id
142
- });
143
- }
144
- }, /*#__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, {
145
- content: /*#__PURE__*/React.createElement("span", null, item.system ? t`Cannot delete system roles.` : t`Cannot delete roles registered via extensions.`),
146
- trigger: /*#__PURE__*/React.createElement(DeleteIcon, {
147
- disabled: true
148
- })
149
- }) : /*#__PURE__*/React.createElement(DeleteIcon, {
150
- onClick: () => deleteItem(item),
151
- "data-testid": "default-data-list.delete"
152
- })))))));
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
+ }))));
153
138
  };
139
+ export { RolesDataList };
154
140
 
155
141
  //# sourceMappingURL=RolesDataList.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","useCallback","useMemo","useState","orderBy","i18n","DataList","ScrollList","ListItem","ListItemText","ListItemTextSecondary","ListItemMeta","ListActions","DataListModalOverlayAction","DataListModalOverlay","ListItemTextPrimary","DeleteIcon","useRouter","SearchUI","useSnackbar","useConfirmationDialog","useQuery","useMutation","LIST_ROLES","DELETE_ROLE","deserializeSorters","Button","Grid","Select","Tooltip","ReactComponent","AddIcon","Routes","t","ns","SORTERS","label","sorter","RolesDataList","activeId","filter","setFilter","sort","setSort","goToRoute","showSnackbar","showConfirmation","dataTestId","data","listResponse","loading","listLoading","deleteIt","deleteLoading","refetchQueries","query","security","roles","filterRole","name","slug","description","toLowerCase","includes","sortRoles","key","sortBy","deleteItem","item","variables","error","deleteRole","message","id","Roles","List","rolesDataListModalOverlay","createElement","Column","span","value","onChange","options","map","filteredData","groupList","title","actions","text","icon","size","className","onClick","new","search","inputPlaceholder","modalOverlay","modalOverlayAction","selected","system","plugin","content","trigger","disabled"],"sources":["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 {\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/index.js\";\nimport { DeleteIcon } from \"@webiny/ui/List/DataList/icons/index.js\";\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 <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(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={\n <DataListModalOverlayAction data-testid={\"default-data-list.filter\"} />\n }\n >\n {({ data }: { data: Role[] }) => (\n <ScrollList data-testid=\"default-data-list\">\n {data.map(item => (\n <ListItem key={item.id} selected={item.id === activeId}>\n <ListItemText\n onClick={() => {\n goToRoute(Routes.Roles.List, { 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
+ {"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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"}