@strapi/plugin-users-permissions 0.0.0-4fc90398602f
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/LICENSE +22 -0
- package/README.md +1 -0
- package/admin/src/components/BoundRoute/getMethodColor.js +41 -0
- package/admin/src/components/BoundRoute/index.js +72 -0
- package/admin/src/components/FormModal/Input/index.js +121 -0
- package/admin/src/components/FormModal/index.js +121 -0
- package/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.js +30 -0
- package/admin/src/components/Permissions/PermissionRow/SubCategory.js +114 -0
- package/admin/src/components/Permissions/PermissionRow/index.js +53 -0
- package/admin/src/components/Permissions/index.js +56 -0
- package/admin/src/components/Permissions/init.js +9 -0
- package/admin/src/components/Permissions/reducer.js +27 -0
- package/admin/src/components/Policies/index.js +60 -0
- package/admin/src/components/UsersPermissions/index.js +94 -0
- package/admin/src/components/UsersPermissions/init.js +10 -0
- package/admin/src/components/UsersPermissions/reducer.js +60 -0
- package/admin/src/contexts/UsersPermissionsContext/index.js +17 -0
- package/admin/src/hooks/index.js +5 -0
- package/admin/src/hooks/useFetchRole/index.js +64 -0
- package/admin/src/hooks/useFetchRole/reducer.js +31 -0
- package/admin/src/hooks/useForm/index.js +70 -0
- package/admin/src/hooks/useForm/reducer.js +40 -0
- package/admin/src/hooks/usePlugins/index.js +65 -0
- package/admin/src/hooks/usePlugins/init.js +5 -0
- package/admin/src/hooks/usePlugins/reducer.js +34 -0
- package/admin/src/hooks/useRolesList/index.js +63 -0
- package/admin/src/hooks/useRolesList/init.js +5 -0
- package/admin/src/hooks/useRolesList/reducer.js +31 -0
- package/admin/src/index.js +123 -0
- package/admin/src/pages/AdvancedSettings/index.js +238 -0
- package/admin/src/pages/AdvancedSettings/utils/api.js +13 -0
- package/admin/src/pages/AdvancedSettings/utils/layout.js +96 -0
- package/admin/src/pages/AdvancedSettings/utils/schema.js +19 -0
- package/admin/src/pages/EmailTemplates/components/EmailForm.js +173 -0
- package/admin/src/pages/EmailTemplates/components/EmailTable.js +121 -0
- package/admin/src/pages/EmailTemplates/index.js +162 -0
- package/admin/src/pages/EmailTemplates/utils/api.js +13 -0
- package/admin/src/pages/EmailTemplates/utils/schema.js +22 -0
- package/admin/src/pages/Providers/index.js +274 -0
- package/admin/src/pages/Providers/reducer.js +54 -0
- package/admin/src/pages/Providers/utils/api.js +21 -0
- package/admin/src/pages/Providers/utils/createProvidersArray.js +21 -0
- package/admin/src/pages/Providers/utils/forms.js +244 -0
- package/admin/src/pages/Roles/CreatePage/index.js +177 -0
- package/admin/src/pages/Roles/CreatePage/utils/schema.js +9 -0
- package/admin/src/pages/Roles/EditPage/index.js +190 -0
- package/admin/src/pages/Roles/EditPage/utils/schema.js +9 -0
- package/admin/src/pages/Roles/ListPage/components/TableBody.js +96 -0
- package/admin/src/pages/Roles/ListPage/index.js +216 -0
- package/admin/src/pages/Roles/ListPage/utils/api.js +28 -0
- package/admin/src/pages/Roles/ProtectedCreatePage/index.js +12 -0
- package/admin/src/pages/Roles/ProtectedEditPage/index.js +12 -0
- package/admin/src/pages/Roles/ProtectedListPage/index.js +15 -0
- package/admin/src/pages/Roles/index.js +27 -0
- package/admin/src/permissions.js +31 -0
- package/admin/src/pluginId.js +5 -0
- package/admin/src/translations/ar.json +40 -0
- package/admin/src/translations/cs.json +46 -0
- package/admin/src/translations/de.json +58 -0
- package/admin/src/translations/dk.json +83 -0
- package/admin/src/translations/en.json +83 -0
- package/admin/src/translations/es.json +83 -0
- package/admin/src/translations/fr.json +46 -0
- package/admin/src/translations/id.json +58 -0
- package/admin/src/translations/it.json +58 -0
- package/admin/src/translations/ja.json +44 -0
- package/admin/src/translations/ko.json +83 -0
- package/admin/src/translations/ms.json +45 -0
- package/admin/src/translations/nl.json +44 -0
- package/admin/src/translations/pl.json +83 -0
- package/admin/src/translations/pt-BR.json +40 -0
- package/admin/src/translations/pt.json +44 -0
- package/admin/src/translations/ru.json +58 -0
- package/admin/src/translations/sk.json +46 -0
- package/admin/src/translations/sv.json +58 -0
- package/admin/src/translations/th.json +56 -0
- package/admin/src/translations/tr.json +44 -0
- package/admin/src/translations/uk.json +45 -0
- package/admin/src/translations/vi.json +46 -0
- package/admin/src/translations/zh-Hans.json +62 -0
- package/admin/src/translations/zh.json +44 -0
- package/admin/src/utils/axiosInstance.js +36 -0
- package/admin/src/utils/cleanPermissions.js +25 -0
- package/admin/src/utils/formatPluginName.js +26 -0
- package/admin/src/utils/formatPolicies.js +8 -0
- package/admin/src/utils/getRequestURL.js +5 -0
- package/admin/src/utils/getTrad.js +5 -0
- package/admin/src/utils/index.js +5 -0
- package/documentation/content-api.yaml +848 -0
- package/jest.config.front.js +10 -0
- package/package.json +60 -0
- package/server/bootstrap/grant-config.js +123 -0
- package/server/bootstrap/index.js +133 -0
- package/server/bootstrap/users-permissions-actions.js +80 -0
- package/server/config.js +23 -0
- package/server/content-types/index.js +11 -0
- package/server/content-types/permission/index.js +34 -0
- package/server/content-types/role/index.js +51 -0
- package/server/content-types/user/index.js +72 -0
- package/server/content-types/user/schema-config.js +15 -0
- package/server/controllers/auth.js +398 -0
- package/server/controllers/content-manager-user.js +175 -0
- package/server/controllers/index.js +17 -0
- package/server/controllers/permissions.js +26 -0
- package/server/controllers/role.js +77 -0
- package/server/controllers/settings.js +85 -0
- package/server/controllers/user.js +198 -0
- package/server/controllers/validation/auth.js +57 -0
- package/server/controllers/validation/email-template.js +50 -0
- package/server/controllers/validation/user.js +26 -0
- package/server/graphql/index.js +44 -0
- package/server/graphql/mutations/auth/change-password.js +38 -0
- package/server/graphql/mutations/auth/email-confirmation.js +39 -0
- package/server/graphql/mutations/auth/forgot-password.js +35 -0
- package/server/graphql/mutations/auth/login.js +35 -0
- package/server/graphql/mutations/auth/register.js +36 -0
- package/server/graphql/mutations/auth/reset-password.js +38 -0
- package/server/graphql/mutations/crud/role/create-role.js +34 -0
- package/server/graphql/mutations/crud/role/delete-role.js +25 -0
- package/server/graphql/mutations/crud/role/update-role.js +35 -0
- package/server/graphql/mutations/crud/user/create-user.js +45 -0
- package/server/graphql/mutations/crud/user/delete-user.js +39 -0
- package/server/graphql/mutations/crud/user/update-user.js +46 -0
- package/server/graphql/mutations/index.js +43 -0
- package/server/graphql/queries/index.js +13 -0
- package/server/graphql/queries/me.js +17 -0
- package/server/graphql/resolvers-configs.js +42 -0
- package/server/graphql/types/create-role-payload.js +11 -0
- package/server/graphql/types/delete-role-payload.js +11 -0
- package/server/graphql/types/index.js +21 -0
- package/server/graphql/types/login-input.js +13 -0
- package/server/graphql/types/login-payload.js +12 -0
- package/server/graphql/types/me-role.js +14 -0
- package/server/graphql/types/me.js +16 -0
- package/server/graphql/types/password-payload.js +11 -0
- package/server/graphql/types/register-input.js +13 -0
- package/server/graphql/types/update-role-payload.js +11 -0
- package/server/graphql/utils.js +27 -0
- package/server/index.js +21 -0
- package/server/middlewares/index.js +7 -0
- package/server/middlewares/rateLimit.js +27 -0
- package/server/register.js +23 -0
- package/server/routes/admin/index.js +10 -0
- package/server/routes/admin/permissions.js +20 -0
- package/server/routes/admin/role.js +79 -0
- package/server/routes/admin/settings.js +95 -0
- package/server/routes/content-api/auth.js +82 -0
- package/server/routes/content-api/index.js +11 -0
- package/server/routes/content-api/permissions.js +9 -0
- package/server/routes/content-api/role.js +29 -0
- package/server/routes/content-api/user.js +60 -0
- package/server/routes/index.js +6 -0
- package/server/services/index.js +17 -0
- package/server/services/jwt.js +55 -0
- package/server/services/providers-registry.js +292 -0
- package/server/services/providers.js +115 -0
- package/server/services/role.js +177 -0
- package/server/services/user.js +140 -0
- package/server/services/users-permissions.js +236 -0
- package/server/strategies/users-permissions.js +102 -0
- package/server/utils/index.d.ts +16 -0
- package/server/utils/index.js +12 -0
- package/server/utils/sanitize/index.js +9 -0
- package/server/utils/sanitize/sanitizers.js +19 -0
- package/server/utils/sanitize/visitors/index.js +5 -0
- package/server/utils/sanitize/visitors/remove-user-relation-from-role-entities.js +11 -0
- package/strapi-admin.js +3 -0
- package/strapi-server.js +3 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import { IconButton } from '@strapi/design-system/IconButton';
|
|
4
|
+
import { Typography } from '@strapi/design-system/Typography';
|
|
5
|
+
import { Flex } from '@strapi/design-system/Flex';
|
|
6
|
+
import { Tbody, Tr, Td } from '@strapi/design-system/Table';
|
|
7
|
+
import Pencil from '@strapi/icons/Pencil';
|
|
8
|
+
import Trash from '@strapi/icons/Trash';
|
|
9
|
+
import { CheckPermissions, onRowClick, stopPropagation } from '@strapi/helper-plugin';
|
|
10
|
+
import { useIntl } from 'react-intl';
|
|
11
|
+
import { useHistory } from 'react-router-dom';
|
|
12
|
+
|
|
13
|
+
import pluginId from '../../../../pluginId';
|
|
14
|
+
|
|
15
|
+
const TableBody = ({ sortedRoles, canDelete, permissions, setRoleToDelete, onDelete }) => {
|
|
16
|
+
const { formatMessage } = useIntl();
|
|
17
|
+
const { push } = useHistory();
|
|
18
|
+
const [showConfirmDelete, setShowConfirmDelete] = onDelete;
|
|
19
|
+
|
|
20
|
+
const checkCanDeleteRole = (role) =>
|
|
21
|
+
canDelete && !['public', 'authenticated'].includes(role.type);
|
|
22
|
+
|
|
23
|
+
const handleClickDelete = (id) => {
|
|
24
|
+
setRoleToDelete(id);
|
|
25
|
+
setShowConfirmDelete(!showConfirmDelete);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const handleClickEdit = (id) => {
|
|
29
|
+
push(`/settings/${pluginId}/roles/${id}`);
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<Tbody>
|
|
34
|
+
{sortedRoles?.map((role) => (
|
|
35
|
+
<Tr key={role.name} {...onRowClick({ fn: () => handleClickEdit(role.id) })}>
|
|
36
|
+
<Td width="20%">
|
|
37
|
+
<Typography>{role.name}</Typography>
|
|
38
|
+
</Td>
|
|
39
|
+
<Td width="50%">
|
|
40
|
+
<Typography>{role.description}</Typography>
|
|
41
|
+
</Td>
|
|
42
|
+
<Td width="30%">
|
|
43
|
+
<Typography>
|
|
44
|
+
{`${role.nb_users} ${formatMessage({
|
|
45
|
+
id: 'global.users',
|
|
46
|
+
defaultMessage: 'users',
|
|
47
|
+
}).toLowerCase()}`}
|
|
48
|
+
</Typography>
|
|
49
|
+
</Td>
|
|
50
|
+
<Td>
|
|
51
|
+
<Flex justifyContent="end" {...stopPropagation}>
|
|
52
|
+
<CheckPermissions permissions={permissions.updateRole}>
|
|
53
|
+
<IconButton
|
|
54
|
+
onClick={() => handleClickEdit(role.id)}
|
|
55
|
+
noBorder
|
|
56
|
+
icon={<Pencil />}
|
|
57
|
+
label={formatMessage(
|
|
58
|
+
{ id: 'app.component.table.edit', defaultMessage: 'Edit {target}' },
|
|
59
|
+
{ target: `${role.name}` }
|
|
60
|
+
)}
|
|
61
|
+
/>
|
|
62
|
+
</CheckPermissions>
|
|
63
|
+
{checkCanDeleteRole(role) && (
|
|
64
|
+
<CheckPermissions permissions={permissions.deleteRole}>
|
|
65
|
+
<IconButton
|
|
66
|
+
onClick={() => handleClickDelete(role.id)}
|
|
67
|
+
noBorder
|
|
68
|
+
icon={<Trash />}
|
|
69
|
+
label={formatMessage(
|
|
70
|
+
{ id: 'global.delete-target', defaultMessage: 'Delete {target}' },
|
|
71
|
+
{ target: `${role.name}` }
|
|
72
|
+
)}
|
|
73
|
+
/>
|
|
74
|
+
</CheckPermissions>
|
|
75
|
+
)}
|
|
76
|
+
</Flex>
|
|
77
|
+
</Td>
|
|
78
|
+
</Tr>
|
|
79
|
+
))}
|
|
80
|
+
</Tbody>
|
|
81
|
+
);
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export default TableBody;
|
|
85
|
+
|
|
86
|
+
TableBody.defaultProps = {
|
|
87
|
+
canDelete: false,
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
TableBody.propTypes = {
|
|
91
|
+
onDelete: PropTypes.array.isRequired,
|
|
92
|
+
permissions: PropTypes.object.isRequired,
|
|
93
|
+
setRoleToDelete: PropTypes.func.isRequired,
|
|
94
|
+
sortedRoles: PropTypes.array.isRequired,
|
|
95
|
+
canDelete: PropTypes.bool,
|
|
96
|
+
};
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import React, { useMemo, useState } from 'react';
|
|
2
|
+
import { Button } from '@strapi/design-system/Button';
|
|
3
|
+
import { HeaderLayout, Layout, ContentLayout, ActionLayout } from '@strapi/design-system/Layout';
|
|
4
|
+
import { Main } from '@strapi/design-system/Main';
|
|
5
|
+
import { Table, Tr, Thead, Th } from '@strapi/design-system/Table';
|
|
6
|
+
import { VisuallyHidden } from '@strapi/design-system/VisuallyHidden';
|
|
7
|
+
import { Typography } from '@strapi/design-system/Typography';
|
|
8
|
+
import { useNotifyAT } from '@strapi/design-system/LiveRegions';
|
|
9
|
+
import Plus from '@strapi/icons/Plus';
|
|
10
|
+
import {
|
|
11
|
+
useTracking,
|
|
12
|
+
SettingsPageTitle,
|
|
13
|
+
CheckPermissions,
|
|
14
|
+
useNotification,
|
|
15
|
+
useRBAC,
|
|
16
|
+
NoPermissions,
|
|
17
|
+
LoadingIndicatorPage,
|
|
18
|
+
SearchURLQuery,
|
|
19
|
+
useFocusWhenNavigate,
|
|
20
|
+
useQueryParams,
|
|
21
|
+
EmptyStateLayout,
|
|
22
|
+
ConfirmDialog,
|
|
23
|
+
} from '@strapi/helper-plugin';
|
|
24
|
+
import { useIntl } from 'react-intl';
|
|
25
|
+
import { useHistory } from 'react-router-dom';
|
|
26
|
+
import { useMutation, useQuery, useQueryClient } from 'react-query';
|
|
27
|
+
import matchSorter from 'match-sorter';
|
|
28
|
+
|
|
29
|
+
import { fetchData, deleteData } from './utils/api';
|
|
30
|
+
import { getTrad } from '../../../utils';
|
|
31
|
+
import pluginId from '../../../pluginId';
|
|
32
|
+
import permissions from '../../../permissions';
|
|
33
|
+
import TableBody from './components/TableBody';
|
|
34
|
+
|
|
35
|
+
const RoleListPage = () => {
|
|
36
|
+
const { trackUsage } = useTracking();
|
|
37
|
+
const { formatMessage } = useIntl();
|
|
38
|
+
const { push } = useHistory();
|
|
39
|
+
const toggleNotification = useNotification();
|
|
40
|
+
const { notifyStatus } = useNotifyAT();
|
|
41
|
+
const [{ query }] = useQueryParams();
|
|
42
|
+
const _q = query?._q || '';
|
|
43
|
+
const [showConfirmDelete, setShowConfirmDelete] = useState(false);
|
|
44
|
+
const [isConfirmButtonLoading, setIsConfirmButtonLoading] = useState(false);
|
|
45
|
+
const [roleToDelete, setRoleToDelete] = useState();
|
|
46
|
+
useFocusWhenNavigate();
|
|
47
|
+
|
|
48
|
+
const queryClient = useQueryClient();
|
|
49
|
+
|
|
50
|
+
const updatePermissions = useMemo(() => {
|
|
51
|
+
return {
|
|
52
|
+
create: permissions.createRole,
|
|
53
|
+
read: permissions.readRoles,
|
|
54
|
+
update: permissions.updateRole,
|
|
55
|
+
delete: permissions.deleteRole,
|
|
56
|
+
};
|
|
57
|
+
}, []);
|
|
58
|
+
|
|
59
|
+
const {
|
|
60
|
+
isLoading: isLoadingForPermissions,
|
|
61
|
+
allowedActions: { canRead, canDelete },
|
|
62
|
+
} = useRBAC(updatePermissions);
|
|
63
|
+
|
|
64
|
+
const {
|
|
65
|
+
isLoading: isLoadingForData,
|
|
66
|
+
data: { roles },
|
|
67
|
+
isFetching,
|
|
68
|
+
} = useQuery('get-roles', () => fetchData(toggleNotification, notifyStatus), {
|
|
69
|
+
initialData: {},
|
|
70
|
+
enabled: canRead,
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
const isLoading = isLoadingForData || isFetching;
|
|
74
|
+
|
|
75
|
+
const handleNewRoleClick = () => {
|
|
76
|
+
trackUsage('willCreateRole');
|
|
77
|
+
push(`/settings/${pluginId}/roles/new`);
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const handleShowConfirmDelete = () => {
|
|
81
|
+
setShowConfirmDelete(!showConfirmDelete);
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
const emptyLayout = {
|
|
85
|
+
roles: {
|
|
86
|
+
id: getTrad('Roles.empty'),
|
|
87
|
+
defaultMessage: "You don't have any roles yet.",
|
|
88
|
+
},
|
|
89
|
+
search: {
|
|
90
|
+
id: getTrad('Roles.empty.search'),
|
|
91
|
+
defaultMessage: 'No roles match the search.',
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const pageTitle = formatMessage({
|
|
96
|
+
id: 'global.roles',
|
|
97
|
+
defaultMessage: 'Roles',
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
const deleteMutation = useMutation((id) => deleteData(id, toggleNotification), {
|
|
101
|
+
async onSuccess() {
|
|
102
|
+
await queryClient.invalidateQueries('get-roles');
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
const handleConfirmDelete = async () => {
|
|
107
|
+
setIsConfirmButtonLoading(true);
|
|
108
|
+
await deleteMutation.mutateAsync(roleToDelete);
|
|
109
|
+
setShowConfirmDelete(!showConfirmDelete);
|
|
110
|
+
setIsConfirmButtonLoading(false);
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
const sortedRoles = matchSorter(roles || [], _q, { keys: ['name', 'description'] });
|
|
114
|
+
const emptyContent = _q && !sortedRoles.length ? 'search' : 'roles';
|
|
115
|
+
|
|
116
|
+
const colCount = 4;
|
|
117
|
+
const rowCount = (roles?.length || 0) + 1;
|
|
118
|
+
|
|
119
|
+
return (
|
|
120
|
+
<Layout>
|
|
121
|
+
<SettingsPageTitle name={pageTitle} />
|
|
122
|
+
<Main aria-busy={isLoading}>
|
|
123
|
+
<HeaderLayout
|
|
124
|
+
title={formatMessage({
|
|
125
|
+
id: 'global.roles',
|
|
126
|
+
defaultMessage: 'Roles',
|
|
127
|
+
})}
|
|
128
|
+
subtitle={formatMessage({
|
|
129
|
+
id: 'Settings.roles.list.description',
|
|
130
|
+
defaultMessage: 'List of roles',
|
|
131
|
+
})}
|
|
132
|
+
primaryAction={
|
|
133
|
+
<CheckPermissions permissions={permissions.createRole}>
|
|
134
|
+
<Button onClick={handleNewRoleClick} startIcon={<Plus />} size="L">
|
|
135
|
+
{formatMessage({
|
|
136
|
+
id: getTrad('List.button.roles'),
|
|
137
|
+
defaultMessage: 'Add new role',
|
|
138
|
+
})}
|
|
139
|
+
</Button>
|
|
140
|
+
</CheckPermissions>
|
|
141
|
+
}
|
|
142
|
+
/>
|
|
143
|
+
|
|
144
|
+
<ActionLayout
|
|
145
|
+
startActions={
|
|
146
|
+
<SearchURLQuery
|
|
147
|
+
label={formatMessage({
|
|
148
|
+
id: 'app.component.search.label',
|
|
149
|
+
defaultMessage: 'Search',
|
|
150
|
+
})}
|
|
151
|
+
/>
|
|
152
|
+
}
|
|
153
|
+
/>
|
|
154
|
+
|
|
155
|
+
<ContentLayout>
|
|
156
|
+
{!canRead && <NoPermissions />}
|
|
157
|
+
{(isLoading || isLoadingForPermissions) && <LoadingIndicatorPage />}
|
|
158
|
+
{canRead && sortedRoles && sortedRoles?.length ? (
|
|
159
|
+
<Table colCount={colCount} rowCount={rowCount}>
|
|
160
|
+
<Thead>
|
|
161
|
+
<Tr>
|
|
162
|
+
<Th>
|
|
163
|
+
<Typography variant="sigma" textColor="neutral600">
|
|
164
|
+
{formatMessage({ id: 'global.name', defaultMessage: 'Name' })}
|
|
165
|
+
</Typography>
|
|
166
|
+
</Th>
|
|
167
|
+
<Th>
|
|
168
|
+
<Typography variant="sigma" textColor="neutral600">
|
|
169
|
+
{formatMessage({
|
|
170
|
+
id: 'global.description',
|
|
171
|
+
defaultMessage: 'Description',
|
|
172
|
+
})}
|
|
173
|
+
</Typography>
|
|
174
|
+
</Th>
|
|
175
|
+
<Th>
|
|
176
|
+
<Typography variant="sigma" textColor="neutral600">
|
|
177
|
+
{formatMessage({
|
|
178
|
+
id: 'global.users',
|
|
179
|
+
defaultMessage: 'Users',
|
|
180
|
+
})}
|
|
181
|
+
</Typography>
|
|
182
|
+
</Th>
|
|
183
|
+
<Th>
|
|
184
|
+
<VisuallyHidden>
|
|
185
|
+
{formatMessage({
|
|
186
|
+
id: 'global.actions',
|
|
187
|
+
defaultMessage: 'Actions',
|
|
188
|
+
})}
|
|
189
|
+
</VisuallyHidden>
|
|
190
|
+
</Th>
|
|
191
|
+
</Tr>
|
|
192
|
+
</Thead>
|
|
193
|
+
<TableBody
|
|
194
|
+
sortedRoles={sortedRoles}
|
|
195
|
+
canDelete={canDelete}
|
|
196
|
+
permissions={permissions}
|
|
197
|
+
setRoleToDelete={setRoleToDelete}
|
|
198
|
+
onDelete={[showConfirmDelete, setShowConfirmDelete]}
|
|
199
|
+
/>
|
|
200
|
+
</Table>
|
|
201
|
+
) : (
|
|
202
|
+
<EmptyStateLayout content={emptyLayout[emptyContent]} />
|
|
203
|
+
)}
|
|
204
|
+
</ContentLayout>
|
|
205
|
+
<ConfirmDialog
|
|
206
|
+
isConfirmButtonLoading={isConfirmButtonLoading}
|
|
207
|
+
onConfirm={handleConfirmDelete}
|
|
208
|
+
onToggleDialog={handleShowConfirmDelete}
|
|
209
|
+
isOpen={showConfirmDelete}
|
|
210
|
+
/>
|
|
211
|
+
</Main>
|
|
212
|
+
</Layout>
|
|
213
|
+
);
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
export default RoleListPage;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { getRequestURL, axiosInstance } from '../../../../utils';
|
|
2
|
+
|
|
3
|
+
export const fetchData = async (toggleNotification, notifyStatus) => {
|
|
4
|
+
try {
|
|
5
|
+
const { data } = await axiosInstance.get(getRequestURL('roles'));
|
|
6
|
+
notifyStatus('The roles have loaded successfully');
|
|
7
|
+
|
|
8
|
+
return data;
|
|
9
|
+
} catch (err) {
|
|
10
|
+
toggleNotification({
|
|
11
|
+
type: 'warning',
|
|
12
|
+
message: { id: 'notification.error' },
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
throw new Error('error');
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export const deleteData = async (id, toggleNotification) => {
|
|
20
|
+
try {
|
|
21
|
+
await axiosInstance.delete(`${getRequestURL('roles')}/${id}`);
|
|
22
|
+
} catch (error) {
|
|
23
|
+
toggleNotification({
|
|
24
|
+
type: 'warning',
|
|
25
|
+
message: { id: 'notification.error', defaultMessage: 'An error occured' },
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { CheckPagePermissions } from '@strapi/helper-plugin';
|
|
3
|
+
import pluginPermissions from '../../../permissions';
|
|
4
|
+
import RolesCreatePage from '../CreatePage';
|
|
5
|
+
|
|
6
|
+
const ProtectedRolesCreatePage = () => (
|
|
7
|
+
<CheckPagePermissions permissions={pluginPermissions.createRole}>
|
|
8
|
+
<RolesCreatePage />
|
|
9
|
+
</CheckPagePermissions>
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
export default ProtectedRolesCreatePage;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { CheckPagePermissions } from '@strapi/helper-plugin';
|
|
3
|
+
import pluginPermissions from '../../../permissions';
|
|
4
|
+
import RolesEditPage from '../EditPage';
|
|
5
|
+
|
|
6
|
+
const ProtectedRolesEditPage = () => (
|
|
7
|
+
<CheckPagePermissions permissions={pluginPermissions.updateRole}>
|
|
8
|
+
<RolesEditPage />
|
|
9
|
+
</CheckPagePermissions>
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
export default ProtectedRolesEditPage;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { CheckPagePermissions } from '@strapi/helper-plugin';
|
|
3
|
+
import pluginPermissions from '../../../permissions';
|
|
4
|
+
|
|
5
|
+
import RolesListPage from '../ListPage';
|
|
6
|
+
|
|
7
|
+
const ProtectedRolesListPage = () => {
|
|
8
|
+
return (
|
|
9
|
+
<CheckPagePermissions permissions={pluginPermissions.accessRoles}>
|
|
10
|
+
<RolesListPage />
|
|
11
|
+
</CheckPagePermissions>
|
|
12
|
+
);
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export default ProtectedRolesListPage;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Switch, Route } from 'react-router-dom';
|
|
3
|
+
import { CheckPagePermissions, NotFound } from '@strapi/helper-plugin';
|
|
4
|
+
import pluginId from '../../pluginId';
|
|
5
|
+
import pluginPermissions from '../../permissions';
|
|
6
|
+
import ProtectedRolesListPage from './ProtectedListPage';
|
|
7
|
+
import ProtectedRolesEditPage from './ProtectedEditPage';
|
|
8
|
+
import ProtectedRolesCreatePage from './ProtectedCreatePage';
|
|
9
|
+
|
|
10
|
+
const Roles = () => {
|
|
11
|
+
return (
|
|
12
|
+
<CheckPagePermissions permissions={pluginPermissions.accessRoles}>
|
|
13
|
+
<Switch>
|
|
14
|
+
<Route
|
|
15
|
+
path={`/settings/${pluginId}/roles/new`}
|
|
16
|
+
component={ProtectedRolesCreatePage}
|
|
17
|
+
exact
|
|
18
|
+
/>
|
|
19
|
+
<Route path={`/settings/${pluginId}/roles/:id`} component={ProtectedRolesEditPage} exact />
|
|
20
|
+
<Route path={`/settings/${pluginId}/roles`} component={ProtectedRolesListPage} exact />
|
|
21
|
+
<Route path="" component={NotFound} />
|
|
22
|
+
</Switch>
|
|
23
|
+
</CheckPagePermissions>
|
|
24
|
+
);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default Roles;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const pluginPermissions = {
|
|
2
|
+
// Roles
|
|
3
|
+
accessRoles: [
|
|
4
|
+
{ action: 'plugin::users-permissions.roles.create', subject: null },
|
|
5
|
+
{ action: 'plugin::users-permissions.roles.read', subject: null },
|
|
6
|
+
],
|
|
7
|
+
createRole: [{ action: 'plugin::users-permissions.roles.create', subject: null }],
|
|
8
|
+
deleteRole: [{ action: 'plugin::users-permissions.roles.delete', subject: null }],
|
|
9
|
+
readRoles: [{ action: 'plugin::users-permissions.roles.read', subject: null }],
|
|
10
|
+
updateRole: [{ action: 'plugin::users-permissions.roles.update', subject: null }],
|
|
11
|
+
|
|
12
|
+
// AdvancedSettings
|
|
13
|
+
readAdvancedSettings: [
|
|
14
|
+
{ action: 'plugin::users-permissions.advanced-settings.read', subject: null },
|
|
15
|
+
],
|
|
16
|
+
updateAdvancedSettings: [
|
|
17
|
+
{ action: 'plugin::users-permissions.advanced-settings.update', subject: null },
|
|
18
|
+
],
|
|
19
|
+
|
|
20
|
+
// Emails
|
|
21
|
+
readEmailTemplates: [{ action: 'plugin::users-permissions.email-templates.read', subject: null }],
|
|
22
|
+
updateEmailTemplates: [
|
|
23
|
+
{ action: 'plugin::users-permissions.email-templates.update', subject: null },
|
|
24
|
+
],
|
|
25
|
+
|
|
26
|
+
// Providers
|
|
27
|
+
readProviders: [{ action: 'plugin::users-permissions.providers.read', subject: null }],
|
|
28
|
+
updateProviders: [{ action: 'plugin::users-permissions.providers.update', subject: null }],
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export default pluginPermissions;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"BoundRoute.title": "Bound route to",
|
|
3
|
+
"EditForm.inputSelect.description.role": "سيتم إرفاق المستخدم المصادق الجديد بالدور المحدد.",
|
|
4
|
+
"EditForm.inputSelect.label.role": "الدور الافتراضي للمستخدمين المصادقين",
|
|
5
|
+
"EditForm.inputToggle.description.email": "عدم السماح للمستخدم بإنشاء حسابات متعددة باستخدام نفس عنوان البريد الإلكتروني مع موفري مصادقة مختلفين.",
|
|
6
|
+
"EditForm.inputToggle.description.sign-up": "عند تعطيل (OFF) ، يتم حظر عملية التسجيل. لا أحد يستطيع الاشتراك بعد الآن بغض النظر عن المزود المستخدم.",
|
|
7
|
+
"EditForm.inputToggle.label.email": "حساب واحد لكل بريد الاكتروني",
|
|
8
|
+
"EditForm.inputToggle.label.sign-up": "تفعيل التسجيل",
|
|
9
|
+
"HeaderNav.link.advancedSettings": "إعدادات متقدمة",
|
|
10
|
+
"HeaderNav.link.emailTemplates": "قوالب الإيميل",
|
|
11
|
+
"HeaderNav.link.providers": "مزودين",
|
|
12
|
+
"Plugin.permissions.plugins.description": "حدد جميع الإجراءات المسموح بها للإضافة {name}.",
|
|
13
|
+
"Plugins.header.description": "يتم سرد الإجراءات المحددة المرتبطة بالمسار أدناه.",
|
|
14
|
+
"Plugins.header.title": "الصلاحيات",
|
|
15
|
+
"Policies.header.hint": "حدد إجراءات التطبيق أو إجراءات الإضافة وانقر على رمز الترس لعرض المسار المرتبط",
|
|
16
|
+
"Policies.header.title": "إعدادات متقدمة",
|
|
17
|
+
"PopUpForm.Email.email_templates.inputDescription": "إذا كنت غير متأكد من كيفية استخدام المتغيرات ، {link}",
|
|
18
|
+
"PopUpForm.Email.options.from.email.label": "البريد الإلكتروني للشاحن",
|
|
19
|
+
"PopUpForm.Email.options.from.email.placeholder": "kai@doe.com",
|
|
20
|
+
"PopUpForm.Email.options.from.name.label": "أسم المورد",
|
|
21
|
+
"PopUpForm.Email.options.from.name.placeholder": "Kai Doe",
|
|
22
|
+
"PopUpForm.Email.options.message.label": "الرسالة",
|
|
23
|
+
"PopUpForm.Email.options.object.label": "موضوع",
|
|
24
|
+
"PopUpForm.Email.options.response_email.label": "البريد الإلكتروني للاستجابة",
|
|
25
|
+
"PopUpForm.Email.options.response_email.placeholder": "kai@doe.com",
|
|
26
|
+
"PopUpForm.Providers.enabled.description": "في حالة التعطيل ، لن يتمكن المستخدمون من استخدام هذا الموفر.",
|
|
27
|
+
"PopUpForm.Providers.enabled.label": "مفعل",
|
|
28
|
+
"PopUpForm.Providers.key.label": "معرف العميل",
|
|
29
|
+
"PopUpForm.Providers.key.placeholder": "نص",
|
|
30
|
+
"PopUpForm.Providers.redirectURL.front-end.label": "عنوان URL لإعادة التوجيه إلى تطبيق الواجهة الأمامية (front-end)",
|
|
31
|
+
"PopUpForm.Providers.secret.label": "سر العميل (Client Secret)",
|
|
32
|
+
"PopUpForm.Providers.secret.placeholder": "نص",
|
|
33
|
+
"PopUpForm.Providers.subdomain.label": "Host URI (Subdomain)",
|
|
34
|
+
"PopUpForm.Providers.subdomain.placeholder": "my.subdomain.com",
|
|
35
|
+
"PopUpForm.header.edit.email-templates": "تحرير قوالب البريد الإلكتروني",
|
|
36
|
+
"notification.success.submit": "تم تحديث الإعدادات",
|
|
37
|
+
"plugin.description.long": "حماية الـAPI الخاص بك مع عملية مصادقة كاملة استناداً إلى JWT. يأتي هذا الملحق أيضًا مع إستراتيجية ACL التي تسمح لك بإدارة الأذونات بين مجموعات المستخدمين.",
|
|
38
|
+
"plugin.description.short": "حماية الـAPI الخاص بك مع عملية مصادقة كاملة استناداً إلى JWT",
|
|
39
|
+
"plugin.name": "الأدوار والصلاحية"
|
|
40
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"BoundRoute.title": "Spojit adresu s",
|
|
3
|
+
"EditForm.inputSelect.description.role": "Připojí nově autentifikovaného uživatele ke svolené roli.",
|
|
4
|
+
"EditForm.inputSelect.label.role": "Výchozí role pro autentifikovaného uživatele",
|
|
5
|
+
"EditForm.inputToggle.description.email": "Zabránit uživateli vytvářet různé účty se stejným e-mailem a jinými poskytovateli autentifikace.",
|
|
6
|
+
"EditForm.inputToggle.description.email-confirmation": "Pokud je tato funkce povolena (ON), nově registrovaní uživatelé dostanou potvrzující e-mail.",
|
|
7
|
+
"EditForm.inputToggle.description.email-confirmation-redirection": "Po potvrzení e-mailu, zvolte kam budete přesměrováni.",
|
|
8
|
+
"EditForm.inputToggle.description.email-reset-password": "Adresa stránky obnovení hesla vaší aplikace",
|
|
9
|
+
"EditForm.inputToggle.description.sign-up": "Pokud je tato možnost zakázána (OFF), není možno projít registrací. Nikdo se již nemůže připojit, bez ohledu jakého použije poskytovatele.",
|
|
10
|
+
"EditForm.inputToggle.label.email": "Jeden účet na e-mail",
|
|
11
|
+
"EditForm.inputToggle.label.email-confirmation": "Povolit potvrzení z e-mailu",
|
|
12
|
+
"EditForm.inputToggle.label.email-confirmation-redirection": "Adresa pro přesměrování",
|
|
13
|
+
"EditForm.inputToggle.label.email-reset-password": "Stránka pro obnovení hesla",
|
|
14
|
+
"EditForm.inputToggle.label.sign-up": "Povolit registrace",
|
|
15
|
+
"HeaderNav.link.advancedSettings": "Pokročilá nastavení",
|
|
16
|
+
"HeaderNav.link.emailTemplates": "E-mailové šablony",
|
|
17
|
+
"HeaderNav.link.providers": "Poskytovatelé",
|
|
18
|
+
"Plugin.permissions.plugins.description": "Nastavit všechny akce pro zásuvný modul {name}.",
|
|
19
|
+
"Plugins.header.description": "Pouze akce spojené s adresou jsou vypsány níže.",
|
|
20
|
+
"Plugins.header.title": "Povolení",
|
|
21
|
+
"Policies.header.hint": "Vyberte akce aplikace, nebo akce zásuvného modulu a klikněte na ikonku ozubeného kolečka pro zobrazení adresy s nimi spojenou.",
|
|
22
|
+
"Policies.header.title": "Pokročilá nastavení",
|
|
23
|
+
"PopUpForm.Email.email_templates.inputDescription": "Pokud si nejste jisti jak používat proměnné, {link}",
|
|
24
|
+
"PopUpForm.Email.options.from.email.label": "Odesilatelův e-mail",
|
|
25
|
+
"PopUpForm.Email.options.from.email.placeholder": "jannovak@gmail.com",
|
|
26
|
+
"PopUpForm.Email.options.from.name.label": "Jméno odesilatele",
|
|
27
|
+
"PopUpForm.Email.options.from.name.placeholder": "Jan Novák",
|
|
28
|
+
"PopUpForm.Email.options.message.label": "Zpráva",
|
|
29
|
+
"PopUpForm.Email.options.object.label": "Předmět",
|
|
30
|
+
"PopUpForm.Email.options.response_email.label": "Response e-mail",
|
|
31
|
+
"PopUpForm.Email.options.response_email.placeholder": "jannovak@gmail.com",
|
|
32
|
+
"PopUpForm.Providers.enabled.description": "If disabled, users won't be able to use this provider.",
|
|
33
|
+
"PopUpForm.Providers.enabled.label": "Povolit",
|
|
34
|
+
"PopUpForm.Providers.key.label": "Client ID",
|
|
35
|
+
"PopUpForm.Providers.key.placeholder": "TEXT",
|
|
36
|
+
"PopUpForm.Providers.redirectURL.front-end.label": "Adresa pro přesměrování na vaši front-end aplikaci",
|
|
37
|
+
"PopUpForm.Providers.secret.label": "Client Secret",
|
|
38
|
+
"PopUpForm.Providers.secret.placeholder": "TEXT",
|
|
39
|
+
"PopUpForm.Providers.subdomain.label": "Host URI (Subdomain)",
|
|
40
|
+
"PopUpForm.Providers.subdomain.placeholder": "my.subdomain.com",
|
|
41
|
+
"PopUpForm.header.edit.email-templates": "Upravit e-mailové šablony",
|
|
42
|
+
"notification.success.submit": "Nastavení bylo aktualizování",
|
|
43
|
+
"plugin.description.long": "Chraňte své API pomocí kompletního autentifikačního procesu, založeného na JWT. Tento zásuvný modul obsahuje ACL strategii, která vám umožní spravovat oprávnění mezi skupinami uživatelů.",
|
|
44
|
+
"plugin.description.short": "Chraňte své API pomocí kompletního autentifikačního procesu, založeného na JWT",
|
|
45
|
+
"plugin.name": "Role a oprávnění"
|
|
46
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"BoundRoute.title": "Pfad gebunden an",
|
|
3
|
+
"EditForm.inputSelect.description.role": "Die Rolle, die neu authentifizierten Benutzern automatisch zugewiesen wird.",
|
|
4
|
+
"EditForm.inputSelect.label.role": "Standardrolle für authentifizierte Benutzer",
|
|
5
|
+
"EditForm.inputToggle.description.email": "Verbiete das Anlegen verschiedener Accounts mit der gleichen E-Mail-Adresse bei unterschiedlichen Anmeldemethoden.",
|
|
6
|
+
"EditForm.inputToggle.description.email-confirmation": "Wenn aktiviert (ON) erhalten neu registrierte Benutzer eine Bestätigungs-E-Mail.",
|
|
7
|
+
"EditForm.inputToggle.description.email-confirmation-redirection": "Nachdem Sie die E-Mail bestätigt haben, wähle wohin sie weitergeleitet wird.",
|
|
8
|
+
"EditForm.inputToggle.description.email-reset-password": "URL deiner Passwort-Zurücksetzen-Seite deiner Anwendung",
|
|
9
|
+
"EditForm.inputToggle.description.sign-up": "Wenn deaktiviert (OFF), wird der Registrationsprozess unterbunden. Niemand kann sich mehr registrieren.",
|
|
10
|
+
"EditForm.inputToggle.label.email": "Ein Account pro E-Mail-Adresse",
|
|
11
|
+
"EditForm.inputToggle.label.email-confirmation": "Aktiviere E-Mail Benachrichtigungen",
|
|
12
|
+
"EditForm.inputToggle.label.email-confirmation-redirection": "Weiterleitungs-URL",
|
|
13
|
+
"EditForm.inputToggle.label.email-reset-password": "Passwort-Zurücksetzen-Seite",
|
|
14
|
+
"EditForm.inputToggle.label.sign-up": "Registration ermöglichen",
|
|
15
|
+
"Email.template.email_confirmation": "Bestätigung der E-Mail-Addresse",
|
|
16
|
+
"HeaderNav.link.advancedSettings": "Erweiterte Einstellungen",
|
|
17
|
+
"HeaderNav.link.emailTemplates": "E-Mail-Templates",
|
|
18
|
+
"HeaderNav.link.providers": "Methoden",
|
|
19
|
+
"Plugin.permissions.plugins.description": "Definiere die möglichen Aktionen des {name} Plugins.",
|
|
20
|
+
"Plugins.header.description": "Nur Aktionen, die an einen Pfad gebunden sind, werden hier gelistet.",
|
|
21
|
+
"Plugins.header.title": "Berechtigungen",
|
|
22
|
+
"Policies.header.hint": "Wähle eine Aktion aus und klicke auf das Zahnrad, um den an diese Aktion gebundenen Pfad anzuzeigen",
|
|
23
|
+
"Policies.header.title": "Fortgeschrittene Einstellungen",
|
|
24
|
+
"PopUpForm.Email.email_templates.inputDescription": "{link} für mehr Informationen",
|
|
25
|
+
"PopUpForm.Email.link.documentation": "Lies die Dokumentation",
|
|
26
|
+
"PopUpForm.Email.options.from.email.label": "E-Mail-Adresse des Absenders",
|
|
27
|
+
"PopUpForm.Email.options.from.email.placeholder": "kai@doe.com",
|
|
28
|
+
"PopUpForm.Email.options.from.name.label": "Name des Absenders",
|
|
29
|
+
"PopUpForm.Email.options.from.name.placeholder": "Kai Doe",
|
|
30
|
+
"PopUpForm.Email.options.message.label": "Nachricht",
|
|
31
|
+
"PopUpForm.Email.options.object.label": "Betreff",
|
|
32
|
+
"PopUpForm.Email.options.object.placeholder": "Bitte bestätige deine E-Mail-Adresse für %APP_NAME%",
|
|
33
|
+
"PopUpForm.Email.options.response_email.label": "Antwort E-Mail-Adresse",
|
|
34
|
+
"PopUpForm.Email.options.response_email.placeholder": "kai@doe.com",
|
|
35
|
+
"PopUpForm.Providers.enabled.description": "Wenn deaktiviert, kann diese Methode nicht verwendet werden.",
|
|
36
|
+
"PopUpForm.Providers.enabled.label": "Aktivieren",
|
|
37
|
+
"PopUpForm.Providers.key.label": "Client ID",
|
|
38
|
+
"PopUpForm.Providers.key.placeholder": "TEXT",
|
|
39
|
+
"PopUpForm.Providers.redirectURL.front-end.label": "Die URL zur Weiterleitung zu deiner Frontend-App",
|
|
40
|
+
"PopUpForm.Providers.redirectURL.label": "Die Weiterleitungs-URL für die App-Einstellungen von {provider}",
|
|
41
|
+
"PopUpForm.Providers.secret.label": "Client Secret",
|
|
42
|
+
"PopUpForm.Providers.secret.placeholder": "TEXT",
|
|
43
|
+
"PopUpForm.Providers.subdomain.label": "Host URI (Subdomain)",
|
|
44
|
+
"PopUpForm.Providers.subdomain.placeholder": "my.subdomain.com",
|
|
45
|
+
"PopUpForm.header.edit.email-templates": "E-Mail-Templates bearbeiten",
|
|
46
|
+
"PopUpForm.header.edit.providers": "Anbieter bearbeiten",
|
|
47
|
+
"Settings.roles.deleted": "Rolle gelöscht",
|
|
48
|
+
"Settings.roles.edited": "Rolle bearbeitet",
|
|
49
|
+
"Settings.section-label": "Nutzer- & Berechtigungen-Plugin",
|
|
50
|
+
"notification.success.submit": "Einstellungen aktualisiert",
|
|
51
|
+
"plugin.description.long": "Beschütze deine API mit einem vollständigen Authentifikationsprozess basierend auf JWT. Zudem bietet dieses Plugin eine ACL-Strategie, die erlaubt, die Berechtigungen für Benutzergruppen festzulegen.",
|
|
52
|
+
"plugin.description.short": "Beschütze deine API mit einem vollständigen Authentifikationsprozess basierend auf JWT.",
|
|
53
|
+
"plugin.name": "Nutzer- & Berechtigungen-Plugin",
|
|
54
|
+
"popUpWarning.button.cancel": "Abbrechen",
|
|
55
|
+
"popUpWarning.button.confirm": "Bestätigen",
|
|
56
|
+
"popUpWarning.title": "Bitte bestätigen",
|
|
57
|
+
"popUpWarning.warning.cancel": "Willst du wirklich alle deine Änderungen verwerfen?"
|
|
58
|
+
}
|