@webiny/app-security-access-management 6.3.0 → 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.
- package/Extension.js +74 -73
- package/Extension.js.map +1 -1
- package/SecurityPermissions.js +49 -41
- package/SecurityPermissions.js.map +1 -1
- package/constants.js +6 -5
- package/constants.js.map +1 -1
- package/domain/permissionsSchema.js +30 -19
- package/domain/permissionsSchema.js.map +1 -1
- package/features/permissions/abstractions.js +2 -1
- package/features/permissions/abstractions.js.map +1 -1
- package/features/permissions/feature.js +2 -1
- package/features/permissions/feature.js.map +1 -1
- package/index.js +0 -2
- package/package.json +9 -11
- package/routes.js +32 -37
- package/routes.js.map +1 -1
- package/types.js +0 -3
- package/ui/views/ApiKeys/ApiKeyForm.js +203 -220
- package/ui/views/ApiKeys/ApiKeyForm.js.map +1 -1
- package/ui/views/ApiKeys/ApiKeys.js +11 -12
- package/ui/views/ApiKeys/ApiKeys.js.map +1 -1
- package/ui/views/ApiKeys/ApiKeysDataList.js +129 -143
- package/ui/views/ApiKeys/ApiKeysDataList.js.map +1 -1
- package/ui/views/ApiKeys/graphql.js +7 -6
- package/ui/views/ApiKeys/graphql.js.map +1 -1
- package/ui/views/ApiKeys/index.js +0 -2
- package/ui/views/ApiKeys/utils.js +12 -6
- package/ui/views/ApiKeys/utils.js.map +1 -1
- package/ui/views/Roles/Roles.js +11 -12
- package/ui/views/Roles/Roles.js.map +1 -1
- package/ui/views/Roles/RolesDataList.js +130 -144
- package/ui/views/Roles/RolesDataList.js.map +1 -1
- package/ui/views/Roles/RolesForm.js +198 -223
- package/ui/views/Roles/RolesForm.js.map +1 -1
- package/ui/views/Roles/graphql.js +7 -6
- package/ui/views/Roles/graphql.js.map +1 -1
- package/ui/views/Roles/index.js +0 -2
- package/ui/views/Teams/Teams.js +11 -12
- package/ui/views/Teams/Teams.js.map +1 -1
- package/ui/views/Teams/TeamsDataList.js +130 -146
- package/ui/views/Teams/TeamsDataList.js.map +1 -1
- package/ui/views/Teams/TeamsForm.js +174 -182
- package/ui/views/Teams/TeamsForm.js.map +1 -1
- package/ui/views/Teams/graphql.js +7 -6
- package/ui/views/Teams/graphql.js.map +1 -1
- package/ui/views/Teams/index.js +0 -2
- package/ui/views/utils.js +9 -7
- package/ui/views/utils.js.map +1 -1
- package/index.js.map +0 -1
- package/types.js.map +0 -1
- package/ui/views/ApiKeys/index.js.map +0 -1
- package/ui/views/Roles/index.js.map +0 -1
- package/ui/views/Teams/index.js.map +0 -1
|
@@ -1,154 +1,140 @@
|
|
|
1
|
-
import
|
|
1
|
+
import react, { useCallback, useMemo, useState } from "react";
|
|
2
2
|
import orderBy from "lodash/orderBy.js";
|
|
3
|
-
import { Button, Grid, Select, useToast } from "@webiny/admin-ui";
|
|
4
|
-
import { ReactComponent
|
|
3
|
+
import { Button, DataList, DataListModal, DeleteIcon, Grid, List, Select, useToast } from "@webiny/admin-ui";
|
|
4
|
+
import { ReactComponent } from "@webiny/icons/add.svg";
|
|
5
5
|
import { i18n } from "@webiny/app/i18n/index.js";
|
|
6
|
-
import {
|
|
7
|
-
import { DeleteIcon } from "@webiny/ui/List/DataList/icons/index.js";
|
|
8
|
-
import { useQuery, useMutation } from "@apollo/react-hooks";
|
|
9
|
-
import * as GQL from "./graphql.js";
|
|
6
|
+
import { useMutation, useQuery } from "@apollo/react-hooks";
|
|
10
7
|
import { deserializeSorters } from "../utils.js";
|
|
11
|
-
import { useConfirmationDialog, useRouter
|
|
8
|
+
import { SearchUI, useConfirmationDialog, useRouter } from "@webiny/app-admin";
|
|
12
9
|
import { Routes } from "../../../routes.js";
|
|
10
|
+
import * as __rspack_external__graphql_js_d64db012 from "./graphql.js";
|
|
13
11
|
const t = i18n.ns("app-security/admin/roles/data-list");
|
|
14
|
-
const SORTERS = [
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const {
|
|
31
|
-
goToRoute
|
|
32
|
-
} = useRouter();
|
|
33
|
-
const [filter, setFilter] = useState("");
|
|
34
|
-
const [sort, setSort] = useState(SORTERS[0].sorter);
|
|
35
|
-
const toast = useToast();
|
|
36
|
-
const {
|
|
37
|
-
showConfirmation
|
|
38
|
-
} = useConfirmationDialog({
|
|
39
|
-
dataTestId: "default-data-list.delete-dialog"
|
|
40
|
-
});
|
|
41
|
-
const filterAPIKey = useCallback(({
|
|
42
|
-
description,
|
|
43
|
-
name
|
|
44
|
-
}) => {
|
|
45
|
-
return description && description.toLowerCase().includes(filter) || name.toLowerCase().includes(filter);
|
|
46
|
-
}, [filter]);
|
|
47
|
-
const sortKeys = useCallback(list => {
|
|
48
|
-
if (!sort) {
|
|
49
|
-
return 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"
|
|
50
28
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
82
|
-
toast.showSuccessToast({
|
|
83
|
-
title: t`Api key "{name}" was deleted.`({
|
|
84
|
-
name: item.name
|
|
85
|
-
})
|
|
86
|
-
});
|
|
87
|
-
if (activeId === item.id) {
|
|
88
|
-
goToRoute(Routes.ApiKeys.List);
|
|
89
|
-
}
|
|
29
|
+
];
|
|
30
|
+
const ApiKeysDataList = ({ activeId })=>{
|
|
31
|
+
const { goToRoute } = useRouter();
|
|
32
|
+
const [filter, setFilter] = useState("");
|
|
33
|
+
const [sort, setSort] = useState(SORTERS[0].sorter);
|
|
34
|
+
const toast = useToast();
|
|
35
|
+
const { showConfirmation } = useConfirmationDialog({
|
|
36
|
+
dataTestId: "default-data-list.delete-dialog"
|
|
37
|
+
});
|
|
38
|
+
const filterAPIKey = useCallback(({ description, name })=>description && description.toLowerCase().includes(filter) || name.toLowerCase().includes(filter), [
|
|
39
|
+
filter
|
|
40
|
+
]);
|
|
41
|
+
const sortKeys = useCallback((list)=>{
|
|
42
|
+
if (!sort) return list;
|
|
43
|
+
const [key, value] = deserializeSorters(sort);
|
|
44
|
+
return orderBy(list, [
|
|
45
|
+
key
|
|
46
|
+
], [
|
|
47
|
+
value
|
|
48
|
+
]);
|
|
49
|
+
}, [
|
|
50
|
+
sort
|
|
51
|
+
]);
|
|
52
|
+
const { data: listResponse, loading: listLoading } = useQuery(__rspack_external__graphql_js_d64db012.LIST_API_KEYS);
|
|
53
|
+
const [deleteIt, { loading: deleteLoading }] = useMutation(__rspack_external__graphql_js_d64db012.DELETE_API_KEY, {
|
|
54
|
+
refetchQueries: [
|
|
55
|
+
{
|
|
56
|
+
query: __rspack_external__graphql_js_d64db012.LIST_API_KEYS
|
|
57
|
+
}
|
|
58
|
+
]
|
|
90
59
|
});
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
})))), [sort]);
|
|
108
|
-
const filteredData = filter === "" ? data : data.filter(filterAPIKey);
|
|
109
|
-
const list = sortKeys(filteredData);
|
|
110
|
-
return /*#__PURE__*/React.createElement(DataList, {
|
|
111
|
-
title: t`API keys`,
|
|
112
|
-
actions: /*#__PURE__*/React.createElement(Button, {
|
|
113
|
-
text: t`New`,
|
|
114
|
-
icon: /*#__PURE__*/React.createElement(AddIcon, null),
|
|
115
|
-
size: "sm",
|
|
116
|
-
className: "ml-xs",
|
|
117
|
-
"data-testid": "new-record-button",
|
|
118
|
-
onClick: () => {
|
|
119
|
-
goToRoute(Routes.ApiKeys.List, {
|
|
120
|
-
new: true
|
|
60
|
+
const data = listLoading && !listResponse ? [] : listResponse?.security.apiKeys.data || [];
|
|
61
|
+
const deleteItem = useCallback((item)=>{
|
|
62
|
+
showConfirmation(async ()=>{
|
|
63
|
+
const { data } = await deleteIt({
|
|
64
|
+
variables: item
|
|
65
|
+
});
|
|
66
|
+
const { error } = data.security.deleteApiKey;
|
|
67
|
+
if (error) return void toast.showWarningToast({
|
|
68
|
+
title: error.message
|
|
69
|
+
});
|
|
70
|
+
toast.showSuccessToast({
|
|
71
|
+
title: t`Api key "{name}" was deleted.`({
|
|
72
|
+
name: item.name
|
|
73
|
+
})
|
|
74
|
+
});
|
|
75
|
+
if (activeId === item.id) goToRoute(Routes.ApiKeys.List);
|
|
121
76
|
});
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
"data
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
77
|
+
}, [
|
|
78
|
+
activeId
|
|
79
|
+
]);
|
|
80
|
+
const rolesDataListModalOverlay = useMemo(()=>/*#__PURE__*/ react.createElement(DataListModal.Content, null, /*#__PURE__*/ react.createElement(Grid, null, /*#__PURE__*/ react.createElement(Grid.Column, {
|
|
81
|
+
span: 12
|
|
82
|
+
}, /*#__PURE__*/ react.createElement(Select, {
|
|
83
|
+
value: sort,
|
|
84
|
+
onChange: setSort,
|
|
85
|
+
label: t`Sort by`,
|
|
86
|
+
options: SORTERS.map(({ label, sorter: value })=>({
|
|
87
|
+
label,
|
|
88
|
+
value
|
|
89
|
+
}))
|
|
90
|
+
})))), [
|
|
91
|
+
sort
|
|
92
|
+
]);
|
|
93
|
+
const filteredData = "" === filter ? data : data.filter(filterAPIKey);
|
|
94
|
+
const list = sortKeys(filteredData);
|
|
95
|
+
return /*#__PURE__*/ react.createElement(DataList, {
|
|
96
|
+
title: t`API keys`,
|
|
97
|
+
actions: /*#__PURE__*/ react.createElement(Button, {
|
|
98
|
+
text: t`New`,
|
|
99
|
+
icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
|
|
100
|
+
size: "sm",
|
|
101
|
+
className: "ml-xs",
|
|
102
|
+
"data-testid": "new-record-button",
|
|
103
|
+
onClick: ()=>{
|
|
104
|
+
goToRoute(Routes.ApiKeys.List, {
|
|
105
|
+
new: true
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}),
|
|
109
|
+
data: list,
|
|
110
|
+
loading: listLoading || deleteLoading,
|
|
111
|
+
search: /*#__PURE__*/ react.createElement(SearchUI, {
|
|
112
|
+
value: filter,
|
|
113
|
+
onChange: setFilter,
|
|
114
|
+
inputPlaceholder: t`Search API keys...`
|
|
115
|
+
}),
|
|
116
|
+
modalOverlay: rolesDataListModalOverlay,
|
|
117
|
+
modalOverlayAction: /*#__PURE__*/ react.createElement(DataListModal.Trigger, {
|
|
118
|
+
"data-testid": "default-data-list.filter"
|
|
119
|
+
})
|
|
120
|
+
}, ({ data })=>/*#__PURE__*/ react.createElement(List, {
|
|
121
|
+
"data-testid": "default-data-list"
|
|
122
|
+
}, data.map((item)=>/*#__PURE__*/ react.createElement(List.Item, {
|
|
123
|
+
key: item.id,
|
|
124
|
+
selected: item.id === activeId,
|
|
125
|
+
title: item.name,
|
|
126
|
+
description: item.description,
|
|
127
|
+
onClick: ()=>{
|
|
128
|
+
goToRoute(Routes.ApiKeys.List, {
|
|
129
|
+
id: item.id
|
|
130
|
+
});
|
|
131
|
+
},
|
|
132
|
+
actions: /*#__PURE__*/ react.createElement(DeleteIcon, {
|
|
133
|
+
onClick: ()=>deleteItem(item),
|
|
134
|
+
"data-testid": "default-data-list.delete"
|
|
135
|
+
})
|
|
136
|
+
}))));
|
|
152
137
|
};
|
|
138
|
+
export { ApiKeysDataList };
|
|
153
139
|
|
|
154
140
|
//# sourceMappingURL=ApiKeysDataList.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useCallback","useMemo","useState","orderBy","Button","Grid","Select","useToast","ReactComponent","AddIcon","i18n","DataList","ScrollList","ListItem","ListItemText","ListItemTextSecondary","ListItemMeta","ListActions","DataListModalOverlayAction","DataListModalOverlay","ListItemTextPrimary","DeleteIcon","useQuery","useMutation","GQL","deserializeSorters","useConfirmationDialog","useRouter","SearchUI","Routes","t","ns","SORTERS","label","sorter","ApiKeysDataList","activeId","goToRoute","filter","setFilter","sort","setSort","toast","showConfirmation","dataTestId","filterAPIKey","description","name","toLowerCase","includes","sortKeys","list","key","value","data","listResponse","loading","listLoading","LIST_API_KEYS","deleteIt","deleteLoading","DELETE_API_KEY","refetchQueries","query","security","apiKeys","deleteItem","item","variables","error","deleteApiKey","showWarningToast","title","message","showSuccessToast","id","ApiKeys","List","rolesDataListModalOverlay","createElement","Column","span","onChange","options","map","filteredData","actions","text","icon","size","className","onClick","new","search","inputPlaceholder","modalOverlay","modalOverlayAction","selected"],"sources":["ApiKeysDataList.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useState } from \"react\";\nimport orderBy from \"lodash/orderBy.js\";\nimport { Button, Grid, Select, useToast } from \"@webiny/admin-ui\";\nimport { ReactComponent as AddIcon } from \"@webiny/icons/add.svg\";\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 { useQuery, useMutation } from \"@apollo/react-hooks\";\nimport * as GQL from \"./graphql.js\";\nimport { deserializeSorters } from \"../utils.js\";\nimport type { ApiKey } from \"~/types.js\";\nimport { useConfirmationDialog, useRouter, SearchUI } from \"@webiny/app-admin\";\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];\nexport interface ApiKeysDataListProps {\n activeId: string | undefined;\n}\n\nexport const ApiKeysDataList = ({ activeId }: ApiKeysDataListProps) => {\n const { goToRoute } = useRouter();\n const [filter, setFilter] = useState(\"\");\n const [sort, setSort] = useState<string>(SORTERS[0].sorter);\n const toast = useToast();\n const { showConfirmation } = useConfirmationDialog({\n dataTestId: \"default-data-list.delete-dialog\"\n });\n\n const filterAPIKey = useCallback(\n ({ description, name }: ApiKey) => {\n return (\n (description && description.toLowerCase().includes(filter)) ||\n name.toLowerCase().includes(filter)\n );\n },\n [filter]\n );\n\n const sortKeys = useCallback(\n (list: ApiKey[]) => {\n if (!sort) {\n return list;\n }\n const [key, value] = deserializeSorters(sort);\n return orderBy(list, [key], [value]);\n },\n [sort]\n );\n\n const { data: listResponse, loading: listLoading } = useQuery<GQL.ListApiKeysResponse>(\n GQL.LIST_API_KEYS\n );\n\n const [deleteIt, { loading: deleteLoading }] = useMutation(GQL.DELETE_API_KEY, {\n refetchQueries: [{ query: GQL.LIST_API_KEYS }]\n });\n\n const data = listLoading && !listResponse ? [] : listResponse?.security.apiKeys.data || [];\n\n const deleteItem = useCallback(\n (item: ApiKey) => {\n showConfirmation(async () => {\n const { data } = await deleteIt({\n variables: item\n });\n\n const { error } = data.security.deleteApiKey;\n if (error) {\n toast.showWarningToast({\n title: error.message\n });\n return;\n }\n\n toast.showSuccessToast({\n title: t`Api key \"{name}\" was deleted.`({ name: item.name })\n });\n\n if (activeId === item.id) {\n goToRoute(Routes.ApiKeys.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 return {\n label,\n value\n };\n })}\n />\n </Grid.Column>\n </Grid>\n </DataListModalOverlay>\n ),\n [sort]\n );\n\n const filteredData = filter === \"\" ? data : data.filter(filterAPIKey);\n const list = sortKeys(filteredData);\n\n return (\n <DataList\n title={t`API keys`}\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.ApiKeys.List, { new: true });\n }}\n />\n }\n data={list}\n loading={listLoading || deleteLoading}\n search={\n <SearchUI\n value={filter}\n onChange={setFilter}\n inputPlaceholder={t`Search API keys...`}\n />\n }\n modalOverlay={rolesDataListModalOverlay}\n modalOverlayAction={\n <DataListModalOverlayAction data-testid={\"default-data-list.filter\"} />\n }\n >\n {({ data }: { data: ApiKey[] }) => (\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.ApiKeys.List, { id: item.id });\n }}\n >\n <ListItemTextPrimary>{item.name}</ListItemTextPrimary>\n <ListItemTextSecondary>{item.description}</ListItemTextSecondary>\n </ListItemText>\n\n <ListItemMeta>\n <ListActions>\n <DeleteIcon\n onClick={() => deleteItem(item)}\n data-testid={\"default-data-list.delete\"}\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/ApiKeys/ApiKeysDataList.js","sources":["../../../../src/ui/views/ApiKeys/ApiKeysDataList.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useState } from \"react\";\nimport orderBy from \"lodash/orderBy.js\";\nimport { Button, Grid, Select, useToast } from \"@webiny/admin-ui\";\nimport { ReactComponent as AddIcon } from \"@webiny/icons/add.svg\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { List, DataList, DataListModal, DeleteIcon } from \"@webiny/admin-ui\";\n\nimport { useQuery, useMutation } from \"@apollo/react-hooks\";\nimport * as GQL from \"./graphql.js\";\nimport { deserializeSorters } from \"../utils.js\";\nimport type { ApiKey } from \"~/types.js\";\nimport { useConfirmationDialog, useRouter, SearchUI } from \"@webiny/app-admin\";\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];\nexport interface ApiKeysDataListProps {\n activeId: string | undefined;\n}\n\nexport const ApiKeysDataList = ({ activeId }: ApiKeysDataListProps) => {\n const { goToRoute } = useRouter();\n const [filter, setFilter] = useState(\"\");\n const [sort, setSort] = useState<string>(SORTERS[0].sorter);\n const toast = useToast();\n const { showConfirmation } = useConfirmationDialog({\n dataTestId: \"default-data-list.delete-dialog\"\n });\n\n const filterAPIKey = useCallback(\n ({ description, name }: ApiKey) => {\n return (\n (description && description.toLowerCase().includes(filter)) ||\n name.toLowerCase().includes(filter)\n );\n },\n [filter]\n );\n\n const sortKeys = useCallback(\n (list: ApiKey[]) => {\n if (!sort) {\n return list;\n }\n const [key, value] = deserializeSorters(sort);\n return orderBy(list, [key], [value]);\n },\n [sort]\n );\n\n const { data: listResponse, loading: listLoading } = useQuery<GQL.ListApiKeysResponse>(\n GQL.LIST_API_KEYS\n );\n\n const [deleteIt, { loading: deleteLoading }] = useMutation(GQL.DELETE_API_KEY, {\n refetchQueries: [{ query: GQL.LIST_API_KEYS }]\n });\n\n const data = listLoading && !listResponse ? [] : listResponse?.security.apiKeys.data || [];\n\n const deleteItem = useCallback(\n (item: ApiKey) => {\n showConfirmation(async () => {\n const { data } = await deleteIt({\n variables: item\n });\n\n const { error } = data.security.deleteApiKey;\n if (error) {\n toast.showWarningToast({\n title: error.message\n });\n return;\n }\n\n toast.showSuccessToast({\n title: t`Api key \"{name}\" was deleted.`({ name: item.name })\n });\n\n if (activeId === item.id) {\n goToRoute(Routes.ApiKeys.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 return {\n label,\n value\n };\n })}\n />\n </Grid.Column>\n </Grid>\n </DataListModal.Content>\n ),\n [sort]\n );\n\n const filteredData = filter === \"\" ? data : data.filter(filterAPIKey);\n const list = sortKeys(filteredData);\n\n return (\n <DataList\n title={t`API keys`}\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.ApiKeys.List, { new: true });\n }}\n />\n }\n data={list}\n loading={listLoading || deleteLoading}\n search={\n <SearchUI\n value={filter}\n onChange={setFilter}\n inputPlaceholder={t`Search API keys...`}\n />\n }\n modalOverlay={rolesDataListModalOverlay}\n modalOverlayAction={<DataListModal.Trigger data-testid={\"default-data-list.filter\"} />}\n >\n {({ data }: { data: ApiKey[] }) => (\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.ApiKeys.List, { id: item.id });\n }}\n actions={\n <DeleteIcon\n onClick={() => deleteItem(item)}\n data-testid={\"default-data-list.delete\"}\n />\n }\n />\n ))}\n </List>\n )}\n </DataList>\n );\n};\n"],"names":["t","i18n","SORTERS","ApiKeysDataList","activeId","goToRoute","useRouter","filter","setFilter","useState","sort","setSort","toast","useToast","showConfirmation","useConfirmationDialog","filterAPIKey","useCallback","description","name","sortKeys","list","key","value","deserializeSorters","orderBy","listResponse","listLoading","useQuery","GQL","deleteIt","deleteLoading","useMutation","data","deleteItem","item","error","Routes","rolesDataListModalOverlay","useMemo","DataListModal","Grid","Select","label","filteredData","DataList","Button","AddIcon","SearchUI","List","DeleteIcon"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import graphql_tag from "graphql-tag";
|
|
2
2
|
const fields = `
|
|
3
3
|
id
|
|
4
4
|
name
|
|
@@ -8,7 +8,7 @@ const fields = `
|
|
|
8
8
|
permissions
|
|
9
9
|
createdOn
|
|
10
10
|
`;
|
|
11
|
-
|
|
11
|
+
const LIST_API_KEYS = graphql_tag`
|
|
12
12
|
query ListApiKeys {
|
|
13
13
|
security {
|
|
14
14
|
apiKeys: listApiKeys {
|
|
@@ -19,7 +19,7 @@ export const LIST_API_KEYS = gql`
|
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
`;
|
|
22
|
-
|
|
22
|
+
const READ_API_KEY = graphql_tag`
|
|
23
23
|
query GetApiKey($id: ID!) {
|
|
24
24
|
security {
|
|
25
25
|
apiKey: getApiKey(id: $id){
|
|
@@ -34,7 +34,7 @@ export const READ_API_KEY = gql`
|
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
`;
|
|
37
|
-
|
|
37
|
+
const CREATE_API_KEY = graphql_tag`
|
|
38
38
|
mutation CreateApiKey($data: SecurityApiKeyInput!){
|
|
39
39
|
security {
|
|
40
40
|
apiKey: createApiKey(data: $data) {
|
|
@@ -50,7 +50,7 @@ export const CREATE_API_KEY = gql`
|
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
`;
|
|
53
|
-
|
|
53
|
+
const UPDATE_API_KEY = graphql_tag`
|
|
54
54
|
mutation UpdateApiKey($id: ID!, $data: SecurityApiKeyInput!){
|
|
55
55
|
security {
|
|
56
56
|
apiKey: updateApiKey(id: $id, data: $data) {
|
|
@@ -66,7 +66,7 @@ export const UPDATE_API_KEY = gql`
|
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
`;
|
|
69
|
-
|
|
69
|
+
const DELETE_API_KEY = graphql_tag`
|
|
70
70
|
mutation DeleteApiKey($id: ID!) {
|
|
71
71
|
security {
|
|
72
72
|
deleteApiKey(id: $id) {
|
|
@@ -79,5 +79,6 @@ export const DELETE_API_KEY = gql`
|
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
`;
|
|
82
|
+
export { CREATE_API_KEY, DELETE_API_KEY, LIST_API_KEYS, READ_API_KEY, UPDATE_API_KEY };
|
|
82
83
|
|
|
83
84
|
//# sourceMappingURL=graphql.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
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,9 +1,15 @@
|
|
|
1
1
|
import pick from "lodash/pick.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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 };
|
|
8
14
|
|
|
9
15
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
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"}
|
package/ui/views/Roles/Roles.js
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { LeftPanel, RightPanel, SplitView, useRoute } from "@webiny/app-admin";
|
|
3
3
|
import { RolesDataList } from "./RolesDataList.js";
|
|
4
4
|
import { RolesForm } from "./RolesForm.js";
|
|
5
5
|
import { Routes } from "../../../routes.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
id: route.params.id
|
|
15
|
-
})));
|
|
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
|
+
})));
|
|
16
14
|
};
|
|
15
|
+
export { Roles };
|
|
17
16
|
|
|
18
17
|
//# sourceMappingURL=Roles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
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"}
|