@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,238 +1,213 @@
|
|
|
1
|
-
import
|
|
1
|
+
import react, { useCallback } from "react";
|
|
2
2
|
import { useMutation, useQuery } from "@apollo/react-hooks";
|
|
3
3
|
import get from "lodash/get.js";
|
|
4
4
|
import { i18n } from "@webiny/app/i18n/index.js";
|
|
5
|
-
import { Bind, Form, useForm, useGenerateSlug } from "@webiny/form";
|
|
5
|
+
import { Bind as form_Bind, Form, useForm, useGenerateSlug } from "@webiny/form";
|
|
6
6
|
import { validation } from "@webiny/validation";
|
|
7
|
-
import {
|
|
7
|
+
import { EmptyView, Permissions, SimpleForm, SimpleFormContent, SimpleFormFooter, SimpleFormHeader, useRouter, useSnackbar } from "@webiny/app-admin";
|
|
8
8
|
import { CREATE_ROLE, LIST_ROLES, READ_ROLE, UPDATE_ROLE } from "./graphql.js";
|
|
9
9
|
import isEmpty from "lodash/isEmpty.js";
|
|
10
|
-
import { ReactComponent
|
|
11
|
-
import { ReactComponent as
|
|
12
|
-
import { ReactComponent as
|
|
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
13
|
import { Alert, Button, Grid, IconButton, Input, OverlayLoader, Textarea, Tooltip } from "@webiny/admin-ui";
|
|
14
14
|
import { Routes } from "../../../routes.js";
|
|
15
15
|
const t = i18n.ns("app-security/admin/roles/form");
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
onCompleted: data => {
|
|
32
|
-
if (!data) {
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
const {
|
|
36
|
-
error
|
|
37
|
-
} = data.security.role;
|
|
38
|
-
if (error) {
|
|
39
|
-
goToRoute(Routes.Roles.List);
|
|
40
|
-
showSnackbar(error.message);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
const [create, createMutation] = useMutation(CREATE_ROLE, {
|
|
45
|
-
refetchQueries: [{
|
|
46
|
-
query: LIST_ROLES
|
|
47
|
-
}]
|
|
48
|
-
});
|
|
49
|
-
const [update, updateMutation] = useMutation(UPDATE_ROLE, {
|
|
50
|
-
refetchQueries: [{
|
|
51
|
-
query: LIST_ROLES
|
|
52
|
-
}]
|
|
53
|
-
});
|
|
54
|
-
const loading = [getQuery, createMutation, updateMutation].find(item => item.loading);
|
|
55
|
-
const onSubmit = useCallback(async ({
|
|
56
|
-
id,
|
|
57
|
-
name,
|
|
58
|
-
description,
|
|
59
|
-
slug,
|
|
60
|
-
permissions,
|
|
61
|
-
createdOn
|
|
62
|
-
}) => {
|
|
63
|
-
if (!permissions || !permissions.length) {
|
|
64
|
-
showSnackbar(t`You must configure permissions before saving!`, {
|
|
65
|
-
timeout: 60000,
|
|
66
|
-
dismissesOnAction: true
|
|
67
|
-
});
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
const isUpdate = createdOn;
|
|
71
|
-
const [operation, args] = isUpdate ? [update, {
|
|
72
|
-
variables: {
|
|
73
|
-
id,
|
|
74
|
-
data: {
|
|
75
|
-
name,
|
|
76
|
-
permissions,
|
|
77
|
-
...(description && {
|
|
78
|
-
description
|
|
79
|
-
})
|
|
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
|
+
}
|
|
80
31
|
}
|
|
81
|
-
}
|
|
82
|
-
}] : [create, {
|
|
83
|
-
variables: {
|
|
84
|
-
data: {
|
|
85
|
-
name,
|
|
86
|
-
slug,
|
|
87
|
-
description,
|
|
88
|
-
permissions
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}];
|
|
92
|
-
const response = await operation(args);
|
|
93
|
-
const {
|
|
94
|
-
data: role,
|
|
95
|
-
error
|
|
96
|
-
} = response.data.security.role;
|
|
97
|
-
if (error) {
|
|
98
|
-
return showSnackbar(error.message);
|
|
99
|
-
}
|
|
100
|
-
if (!isUpdate) {
|
|
101
|
-
goToRoute(Routes.Roles.List, {
|
|
102
|
-
id: role.id
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
showSnackbar(t`Role saved successfully!`);
|
|
106
|
-
}, [id]);
|
|
107
|
-
const data = loading ? {} : get(getQuery, "data.security.role.data", {});
|
|
108
|
-
const systemRole = data.slug === "full-access" || data.system;
|
|
109
|
-
const pluginRole = data.plugin ?? false;
|
|
110
|
-
const canModifyRole = !systemRole && !pluginRole;
|
|
111
|
-
const showEmptyView = !newEntry && !loading && isEmpty(data);
|
|
112
|
-
// Render "No content" selected view.
|
|
113
|
-
if (showEmptyView) {
|
|
114
|
-
return /*#__PURE__*/React.createElement(EmptyView, {
|
|
115
|
-
icon: /*#__PURE__*/React.createElement(SettingsIcon, null),
|
|
116
|
-
title: t`Click on the left side list to display role details or create a...`,
|
|
117
|
-
action: /*#__PURE__*/React.createElement(Button, {
|
|
118
|
-
icon: /*#__PURE__*/React.createElement(AddIcon, null),
|
|
119
|
-
text: t`New Role`,
|
|
120
|
-
"data-testid": "new-record-button",
|
|
121
|
-
onClick: () => {
|
|
122
|
-
goToRoute(Routes.Roles.List, {
|
|
123
|
-
new: true
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
})
|
|
127
32
|
});
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
})
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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
|
+
})))));
|
|
187
167
|
};
|
|
188
|
-
const FormContent = props
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
}, /*#__PURE__*/React.createElement(Textarea, {
|
|
231
|
-
label: t`Description`,
|
|
232
|
-
rows: 3,
|
|
233
|
-
disabled: !canModifyRole,
|
|
234
|
-
"data-testid": "admin.am.role.new.description"
|
|
235
|
-
})))));
|
|
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
|
+
})))));
|
|
236
210
|
};
|
|
211
|
+
export { RolesForm };
|
|
237
212
|
|
|
238
213
|
//# sourceMappingURL=RolesForm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useCallback","useMutation","useQuery","get","i18n","Bind","Form","useForm","useGenerateSlug","validation","SimpleForm","SimpleFormFooter","SimpleFormContent","SimpleFormHeader","Permissions","EmptyView","useRouter","useSnackbar","CREATE_ROLE","LIST_ROLES","READ_ROLE","UPDATE_ROLE","isEmpty","ReactComponent","AddIcon","CopyIcon","SettingsIcon","Alert","Button","Grid","IconButton","Input","OverlayLoader","Textarea","Tooltip","Routes","t","ns","RolesForm","id","newEntry","goToRoute","showSnackbar","getQuery","variables","skip","onCompleted","data","error","security","role","Roles","List","message","create","createMutation","refetchQueries","query","update","updateMutation","loading","find","item","onSubmit","name","description","slug","permissions","createdOn","length","timeout","dismissesOnAction","isUpdate","operation","args","response","systemRole","system","pluginRole","plugin","canModifyRole","showEmptyView","createElement","icon","title","action","text","onClick","new","form","size","FormContent","rounded","className","content","trigger","variant","navigator","clipboard","writeText","JSON","stringify","Column","span","type","Fragment","defaultValue","bind","Object","assign","ev","submit","props","generateSlug","validators","required","label","disabled","onBlur","rows"],"sources":["RolesForm.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { useMutation, useQuery } from \"@apollo/react-hooks\";\nimport get from \"lodash/get.js\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { Bind, Form, useForm, useGenerateSlug } from \"@webiny/form\";\nimport { validation } from \"@webiny/validation\";\nimport {\n SimpleForm,\n SimpleFormFooter,\n SimpleFormContent,\n SimpleFormHeader,\n Permissions,\n EmptyView,\n useRouter,\n useSnackbar\n} from \"@webiny/app-admin\";\nimport { CREATE_ROLE, LIST_ROLES, READ_ROLE, UPDATE_ROLE } from \"./graphql.js\";\nimport isEmpty from \"lodash/isEmpty.js\";\nimport { ReactComponent as AddIcon } from \"@webiny/icons/add.svg\";\nimport { ReactComponent as CopyIcon } from \"@webiny/icons/content_copy.svg\";\nimport { ReactComponent as SettingsIcon } from \"@webiny/icons/settings.svg\";\nimport type { Role } from \"~/types.js\";\nimport {\n Alert,\n Button,\n Grid,\n IconButton,\n Input,\n OverlayLoader,\n Textarea,\n Tooltip\n} from \"@webiny/admin-ui\";\nimport { Routes } from \"~/routes.js\";\n\nconst t = i18n.ns(\"app-security/admin/roles/form\");\n\nexport interface RolesFormProps {\n newEntry: boolean;\n id: string | undefined;\n}\n\nexport const RolesForm = ({ id, newEntry }: RolesFormProps) => {\n const { goToRoute } = useRouter();\n const { showSnackbar } = useSnackbar();\n\n const getQuery = useQuery(READ_ROLE, {\n variables: { id },\n skip: !id,\n onCompleted: data => {\n if (!data) {\n return;\n }\n\n const { error } = data.security.role;\n if (error) {\n goToRoute(Routes.Roles.List);\n showSnackbar(error.message);\n }\n }\n });\n\n const [create, createMutation] = useMutation(CREATE_ROLE, {\n refetchQueries: [{ query: LIST_ROLES }]\n });\n\n const [update, updateMutation] = useMutation(UPDATE_ROLE, {\n refetchQueries: [{ query: LIST_ROLES }]\n });\n\n const loading = [getQuery, createMutation, updateMutation].find(item => item.loading);\n\n const onSubmit = useCallback(\n async ({ id, name, description, slug, permissions, createdOn }: Role) => {\n if (!permissions || !permissions.length) {\n showSnackbar(t`You must configure permissions before saving!`, {\n timeout: 60000,\n dismissesOnAction: true\n });\n return;\n }\n\n const isUpdate = createdOn;\n const [operation, args] = isUpdate\n ? [\n update,\n {\n variables: {\n id,\n data: {\n name,\n permissions,\n ...(description && { description })\n }\n }\n }\n ]\n : [\n create,\n {\n variables: {\n data: {\n name,\n slug,\n description,\n permissions\n }\n }\n }\n ];\n\n const response = await operation(args);\n\n const { data: role, error } = response.data.security.role;\n if (error) {\n return showSnackbar(error.message);\n }\n\n if (!isUpdate) {\n goToRoute(Routes.Roles.List, { id: role.id });\n }\n showSnackbar(t`Role saved successfully!`);\n },\n [id]\n );\n\n const data: Role = loading ? {} : get(getQuery, \"data.security.role.data\", {});\n\n const systemRole = data.slug === \"full-access\" || data.system;\n const pluginRole = data.plugin ?? false;\n const canModifyRole = !systemRole && !pluginRole;\n\n const showEmptyView = !newEntry && !loading && isEmpty(data);\n // Render \"No content\" selected view.\n if (showEmptyView) {\n return (\n <EmptyView\n icon={<SettingsIcon />}\n title={t`Click on the left side list to display role details or create a...`}\n action={\n <Button\n icon={<AddIcon />}\n text={t`New Role`}\n data-testid=\"new-record-button\"\n onClick={() => {\n goToRoute(Routes.Roles.List, { new: true });\n }}\n />\n }\n />\n );\n }\n\n return (\n <Form data={data} onSubmit={onSubmit}>\n {({ data, form, Bind }) => {\n return (\n <SimpleForm size={\"lg\"}>\n {loading && <OverlayLoader />}\n <SimpleFormHeader title={data.name ? data.name : \"Untitled\"} />\n <SimpleFormContent>\n <FormContent\n pluginRole={pluginRole}\n canModifyRole={canModifyRole}\n newEntry={newEntry}\n />\n </SimpleFormContent>\n <SimpleFormHeader title={\"Permissions\"} rounded={false}>\n <div className={\"flex justify-end\"}>\n <Tooltip\n content=\"Copy permissions as JSON\"\n trigger={\n <IconButton\n variant={\"ghost\"}\n icon={<CopyIcon />}\n onClick={() => {\n navigator.clipboard.writeText(\n JSON.stringify(data.permissions, null, 2)\n );\n showSnackbar(\"JSON data copied to clipboard.\");\n }}\n />\n }\n />\n </div>\n </SimpleFormHeader>\n <SimpleFormContent>\n {systemRole && (\n <Grid.Column span={12}>\n <Alert type={\"warning\"} title={\"Permissions are locked\"}>\n This is a protected system role and you can't modify\n its permissions.\n </Alert>\n </Grid.Column>\n )}\n <Grid>\n <>\n {canModifyRole && (\n <Grid.Column span={12}>\n <Bind name={\"permissions\"} defaultValue={[]}>\n {bind => (\n <Permissions id={data.id || \"new\"} {...bind} />\n )}\n </Bind>\n </Grid.Column>\n )}\n </>\n </Grid>\n </SimpleFormContent>\n <SimpleFormFooter>\n {canModifyRole && (\n <>\n <Button\n variant={\"secondary\"}\n text={t`Cancel`}\n onClick={() => {\n goToRoute(Routes.Roles.List);\n }}\n data-testid=\"pb.category.new.form.button.cancel\"\n />\n <Button\n text={t`Save`}\n data-testid=\"admin.am.role.new.save\"\n onClick={ev => {\n form.submit(ev);\n }}\n />\n </>\n )}\n </SimpleFormFooter>\n </SimpleForm>\n );\n }}\n </Form>\n );\n};\n\ninterface FormContentProps {\n pluginRole: boolean;\n canModifyRole: boolean;\n newEntry: boolean;\n}\n\nconst FormContent = (props: FormContentProps) => {\n const { pluginRole, canModifyRole, newEntry } = props;\n const form = useForm();\n const { generateSlug } = useGenerateSlug(form, \"name\", \"slug\");\n\n return (\n <Grid>\n <>\n {pluginRole && (\n <Grid.Column span={12}>\n <Alert type={\"warning\"} title={\"Permissions are locked\"}>\n This role is registered via an extension, and cannot be modified.\n </Alert>\n </Grid.Column>\n )}\n <Grid.Column span={6}>\n <Bind name=\"name\" validators={validation.create(\"required,minLength:1\")}>\n <Input\n required\n label={t`Name`}\n disabled={!canModifyRole}\n onBlur={generateSlug}\n data-testid=\"admin.am.role.new.name\"\n />\n </Bind>\n </Grid.Column>\n <Grid.Column span={6}>\n <Bind name=\"slug\" validators={validation.create(\"required,minLength:1\")}>\n <Input\n required\n disabled={!canModifyRole || !newEntry}\n label={t`Slug`}\n data-testid=\"admin.am.role.new.slug\"\n />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind\n name=\"description\"\n validators={validation.create(\"maxLength:500\")}\n defaultValue={\"\"}\n >\n <Textarea\n label={t`Description`}\n rows={3}\n disabled={!canModifyRole}\n data-testid=\"admin.am.role.new.description\"\n />\n </Bind>\n </Grid.Column>\n </>\n </Grid>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ui/views/Roles/RolesForm.js","sources":["../../../../src/ui/views/Roles/RolesForm.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { useMutation, useQuery } from \"@apollo/react-hooks\";\nimport get from \"lodash/get.js\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { Bind, Form, useForm, useGenerateSlug } from \"@webiny/form\";\nimport { validation } from \"@webiny/validation\";\nimport {\n SimpleForm,\n SimpleFormFooter,\n SimpleFormContent,\n SimpleFormHeader,\n Permissions,\n EmptyView,\n useRouter,\n useSnackbar\n} from \"@webiny/app-admin\";\nimport { CREATE_ROLE, LIST_ROLES, READ_ROLE, UPDATE_ROLE } from \"./graphql.js\";\nimport isEmpty from \"lodash/isEmpty.js\";\nimport { ReactComponent as AddIcon } from \"@webiny/icons/add.svg\";\nimport { ReactComponent as CopyIcon } from \"@webiny/icons/content_copy.svg\";\nimport { ReactComponent as SettingsIcon } from \"@webiny/icons/settings.svg\";\nimport type { Role } from \"~/types.js\";\nimport {\n Alert,\n Button,\n Grid,\n IconButton,\n Input,\n OverlayLoader,\n Textarea,\n Tooltip\n} from \"@webiny/admin-ui\";\nimport { Routes } from \"~/routes.js\";\n\nconst t = i18n.ns(\"app-security/admin/roles/form\");\n\nexport interface RolesFormProps {\n newEntry: boolean;\n id: string | undefined;\n}\n\nexport const RolesForm = ({ id, newEntry }: RolesFormProps) => {\n const { goToRoute } = useRouter();\n const { showSnackbar } = useSnackbar();\n\n const getQuery = useQuery(READ_ROLE, {\n variables: { id },\n skip: !id,\n onCompleted: data => {\n if (!data) {\n return;\n }\n\n const { error } = data.security.role;\n if (error) {\n goToRoute(Routes.Roles.List);\n showSnackbar(error.message);\n }\n }\n });\n\n const [create, createMutation] = useMutation(CREATE_ROLE, {\n refetchQueries: [{ query: LIST_ROLES }]\n });\n\n const [update, updateMutation] = useMutation(UPDATE_ROLE, {\n refetchQueries: [{ query: LIST_ROLES }]\n });\n\n const loading = [getQuery, createMutation, updateMutation].find(item => item.loading);\n\n const onSubmit = useCallback(\n async ({ id, name, description, slug, permissions, createdOn }: Role) => {\n if (!permissions || !permissions.length) {\n showSnackbar(t`You must configure permissions before saving!`, {\n timeout: 60000,\n dismissesOnAction: true\n });\n return;\n }\n\n const isUpdate = createdOn;\n const [operation, args] = isUpdate\n ? [\n update,\n {\n variables: {\n id,\n data: {\n name,\n permissions,\n ...(description && { description })\n }\n }\n }\n ]\n : [\n create,\n {\n variables: {\n data: {\n name,\n slug,\n description,\n permissions\n }\n }\n }\n ];\n\n const response = await operation(args);\n\n const { data: role, error } = response.data.security.role;\n if (error) {\n return showSnackbar(error.message);\n }\n\n if (!isUpdate) {\n goToRoute(Routes.Roles.List, { id: role.id });\n }\n showSnackbar(t`Role saved successfully!`);\n },\n [id]\n );\n\n const data: Role = loading ? {} : get(getQuery, \"data.security.role.data\", {});\n\n const systemRole = data.slug === \"full-access\" || data.system;\n const pluginRole = data.plugin ?? false;\n const canModifyRole = !systemRole && !pluginRole;\n\n const showEmptyView = !newEntry && !loading && isEmpty(data);\n // Render \"No content\" selected view.\n if (showEmptyView) {\n return (\n <EmptyView\n icon={<SettingsIcon />}\n title={t`Click on the left side list to display role details or create a...`}\n action={\n <Button\n icon={<AddIcon />}\n text={t`New Role`}\n data-testid=\"new-record-button\"\n onClick={() => {\n goToRoute(Routes.Roles.List, { new: true });\n }}\n />\n }\n />\n );\n }\n\n return (\n <Form data={data} onSubmit={onSubmit}>\n {({ data, form, Bind }) => {\n return (\n <SimpleForm size={\"lg\"}>\n {loading && <OverlayLoader />}\n <SimpleFormHeader title={data.name ? data.name : \"Untitled\"} />\n <SimpleFormContent>\n <FormContent\n pluginRole={pluginRole}\n canModifyRole={canModifyRole}\n newEntry={newEntry}\n />\n </SimpleFormContent>\n <SimpleFormHeader title={\"Permissions\"} rounded={false}>\n <div className={\"flex justify-end\"}>\n <Tooltip\n content=\"Copy permissions as JSON\"\n trigger={\n <IconButton\n variant={\"ghost\"}\n icon={<CopyIcon />}\n onClick={() => {\n navigator.clipboard.writeText(\n JSON.stringify(data.permissions, null, 2)\n );\n showSnackbar(\"JSON data copied to clipboard.\");\n }}\n />\n }\n />\n </div>\n </SimpleFormHeader>\n <SimpleFormContent>\n {systemRole && (\n <Grid.Column span={12}>\n <Alert type={\"warning\"} title={\"Permissions are locked\"}>\n This is a protected system role and you can't modify\n its permissions.\n </Alert>\n </Grid.Column>\n )}\n <Grid>\n <>\n {canModifyRole && (\n <Grid.Column span={12}>\n <Bind name={\"permissions\"} defaultValue={[]}>\n {bind => (\n <Permissions id={data.id || \"new\"} {...bind} />\n )}\n </Bind>\n </Grid.Column>\n )}\n </>\n </Grid>\n </SimpleFormContent>\n <SimpleFormFooter>\n {canModifyRole && (\n <>\n <Button\n variant={\"secondary\"}\n text={t`Cancel`}\n onClick={() => {\n goToRoute(Routes.Roles.List);\n }}\n data-testid=\"pb.category.new.form.button.cancel\"\n />\n <Button\n text={t`Save`}\n data-testid=\"admin.am.role.new.save\"\n onClick={ev => {\n form.submit(ev);\n }}\n />\n </>\n )}\n </SimpleFormFooter>\n </SimpleForm>\n );\n }}\n </Form>\n );\n};\n\ninterface FormContentProps {\n pluginRole: boolean;\n canModifyRole: boolean;\n newEntry: boolean;\n}\n\nconst FormContent = (props: FormContentProps) => {\n const { pluginRole, canModifyRole, newEntry } = props;\n const form = useForm();\n const { generateSlug } = useGenerateSlug(form, \"name\", \"slug\");\n\n return (\n <Grid>\n <>\n {pluginRole && (\n <Grid.Column span={12}>\n <Alert type={\"warning\"} title={\"Permissions are locked\"}>\n This role is registered via an extension, and cannot be modified.\n </Alert>\n </Grid.Column>\n )}\n <Grid.Column span={6}>\n <Bind name=\"name\" validators={validation.create(\"required,minLength:1\")}>\n <Input\n required\n label={t`Name`}\n disabled={!canModifyRole}\n onBlur={generateSlug}\n data-testid=\"admin.am.role.new.name\"\n />\n </Bind>\n </Grid.Column>\n <Grid.Column span={6}>\n <Bind name=\"slug\" validators={validation.create(\"required,minLength:1\")}>\n <Input\n required\n disabled={!canModifyRole || !newEntry}\n label={t`Slug`}\n data-testid=\"admin.am.role.new.slug\"\n />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind\n name=\"description\"\n validators={validation.create(\"maxLength:500\")}\n defaultValue={\"\"}\n >\n <Textarea\n label={t`Description`}\n rows={3}\n disabled={!canModifyRole}\n data-testid=\"admin.am.role.new.description\"\n />\n </Bind>\n </Grid.Column>\n </>\n </Grid>\n );\n};\n"],"names":["t","i18n","RolesForm","id","newEntry","goToRoute","useRouter","showSnackbar","useSnackbar","getQuery","useQuery","READ_ROLE","data","error","Routes","create","createMutation","useMutation","CREATE_ROLE","LIST_ROLES","update","updateMutation","UPDATE_ROLE","loading","item","onSubmit","useCallback","name","description","slug","permissions","createdOn","isUpdate","operation","args","response","role","get","systemRole","pluginRole","canModifyRole","showEmptyView","isEmpty","EmptyView","SettingsIcon","Button","AddIcon","Form","form","Bind","SimpleForm","OverlayLoader","SimpleFormHeader","SimpleFormContent","FormContent","Tooltip","IconButton","CopyIcon","navigator","JSON","Grid","Alert","bind","Permissions","SimpleFormFooter","ev","props","useForm","generateSlug","useGenerateSlug","validation","Input","Textarea"],"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
|
|
@@ -9,7 +9,7 @@ const fields = `
|
|
|
9
9
|
plugin
|
|
10
10
|
createdOn
|
|
11
11
|
`;
|
|
12
|
-
|
|
12
|
+
const LIST_ROLES = graphql_tag`
|
|
13
13
|
query listRoles {
|
|
14
14
|
security {
|
|
15
15
|
roles: listRoles {
|
|
@@ -20,7 +20,7 @@ export const LIST_ROLES = gql`
|
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
`;
|
|
23
|
-
|
|
23
|
+
const READ_ROLE = graphql_tag`
|
|
24
24
|
query getRole($id: ID!) {
|
|
25
25
|
security {
|
|
26
26
|
role: getRole(where: { id: $id }){
|
|
@@ -35,7 +35,7 @@ export const READ_ROLE = gql`
|
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
`;
|
|
38
|
-
|
|
38
|
+
const CREATE_ROLE = graphql_tag`
|
|
39
39
|
mutation createRole($data: SecurityRoleCreateInput!){
|
|
40
40
|
security {
|
|
41
41
|
role: createRole(data: $data) {
|
|
@@ -51,7 +51,7 @@ export const CREATE_ROLE = gql`
|
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
`;
|
|
54
|
-
|
|
54
|
+
const UPDATE_ROLE = graphql_tag`
|
|
55
55
|
mutation updateRole($id: ID!, $data: SecurityRoleUpdateInput!){
|
|
56
56
|
security {
|
|
57
57
|
role: updateRole(id: $id, data: $data) {
|
|
@@ -67,7 +67,7 @@ export const UPDATE_ROLE = gql`
|
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
`;
|
|
70
|
-
|
|
70
|
+
const DELETE_ROLE = graphql_tag`
|
|
71
71
|
mutation deleteRole($id: ID!) {
|
|
72
72
|
security {
|
|
73
73
|
deleteRole(id: $id) {
|
|
@@ -81,5 +81,6 @@ export const DELETE_ROLE = gql`
|
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
`;
|
|
84
|
+
export { CREATE_ROLE, DELETE_ROLE, LIST_ROLES, READ_ROLE, UPDATE_ROLE };
|
|
84
85
|
|
|
85
86
|
//# sourceMappingURL=graphql.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"ui/views/Roles/graphql.js","sources":["../../../../src/ui/views/Roles/graphql.ts"],"sourcesContent":["import gql from \"graphql-tag\";\nimport type { Role } from \"~/types.js\";\n\nconst fields = `\n id\n name\n slug\n description\n permissions\n system\n plugin\n createdOn\n`;\n\nexport interface ListRolesResponse {\n security: {\n roles: {\n data: Role[];\n };\n };\n}\n\nexport const LIST_ROLES = gql`\n query listRoles {\n security {\n roles: listRoles {\n data {\n ${fields}\n }\n }\n }\n }\n`;\n\nexport const READ_ROLE = gql`\n query getRole($id: ID!) {\n security {\n role: getRole(where: { id: $id }){\n data {\n ${fields}\n }\n error {\n code\n message\n }\n }\n }\n }\n`;\n\nexport const CREATE_ROLE = gql`\n mutation createRole($data: SecurityRoleCreateInput!){\n security {\n role: createRole(data: $data) {\n data {\n ${fields}\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n\nexport const UPDATE_ROLE = gql`\n mutation updateRole($id: ID!, $data: SecurityRoleUpdateInput!){\n security {\n role: updateRole(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_ROLE = gql`\n mutation deleteRole($id: ID!) {\n security {\n deleteRole(id: $id) {\n data\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n"],"names":["fields","LIST_ROLES","gql","READ_ROLE","CREATE_ROLE","UPDATE_ROLE","DELETE_ROLE"],"mappings":";AAGA,MAAMA,SAAS,CAAC;;;;;;;;;AAShB,CAAC;AAUM,MAAMC,aAAaC,WAAG,CAAC;;;;;oBAKV,EAAEF,OAAO;;;;;AAK7B,CAAC;AAEM,MAAMG,YAAYD,WAAG,CAAC;;;;;oBAKT,EAAEF,OAAO;;;;;;;;;AAS7B,CAAC;AAEM,MAAMI,cAAcF,WAAG,CAAC;;;;;oBAKX,EAAEF,OAAO;;;;;;;;;;AAU7B,CAAC;AAEM,MAAMK,cAAcH,WAAG,CAAC;;;;;oBAKX,EAAEF,OAAO;;;;;;;;;;AAU7B,CAAC;AAEM,MAAMM,cAAcJ,WAAG,CAAC;;;;;;;;;;;;;AAa/B,CAAC"}
|
package/ui/views/Roles/index.js
CHANGED
package/ui/views/Teams/Teams.js
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
|
-
import
|
|
1
|
+
import react from "react";
|
|
2
2
|
import { TeamsDataList } from "./TeamsDataList.js";
|
|
3
3
|
import { TeamsForm } from "./TeamsForm.js";
|
|
4
|
-
import {
|
|
4
|
+
import { LeftPanel, RightPanel, SplitView, useRoute } from "@webiny/app-admin";
|
|
5
5
|
import { Routes } from "../../../routes.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
id: route.params.id
|
|
15
|
-
})));
|
|
6
|
+
const Teams = ()=>{
|
|
7
|
+
const { route } = useRoute(Routes.Roles.List);
|
|
8
|
+
return /*#__PURE__*/ react.createElement(SplitView, null, /*#__PURE__*/ react.createElement(LeftPanel, null, /*#__PURE__*/ react.createElement(TeamsDataList, {
|
|
9
|
+
activeId: route.params.id
|
|
10
|
+
})), /*#__PURE__*/ react.createElement(RightPanel, null, /*#__PURE__*/ react.createElement(TeamsForm, {
|
|
11
|
+
newEntry: true === route.params.new,
|
|
12
|
+
id: route.params.id
|
|
13
|
+
})));
|
|
16
14
|
};
|
|
15
|
+
export { Teams };
|
|
17
16
|
|
|
18
17
|
//# sourceMappingURL=Teams.js.map
|