tycho-components 0.44.3 → 0.44.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/configs/api/index.d.ts +1 -0
  2. package/dist/configs/api/index.js +4 -1
  3. package/dist/configs/index.d.ts +41 -41
  4. package/dist/configs/index.js +23 -23
  5. package/dist/configs/localization/CommonTexts.d.ts +12 -0
  6. package/dist/configs/localization/CommonTexts.js +12 -0
  7. package/dist/configs/types/Access.d.ts +23 -0
  8. package/dist/configs/types/Access.js +14 -0
  9. package/dist/features/AccessControl/AccessControlService.d.ts +53 -0
  10. package/dist/features/AccessControl/AccessControlService.js +85 -0
  11. package/dist/features/AccessControl/AccessGrant/AccessGrant.d.ts +10 -0
  12. package/dist/features/AccessControl/AccessGrant/AccessGrant.js +75 -0
  13. package/dist/features/AccessControl/AccessGrant/index.d.ts +2 -0
  14. package/dist/features/AccessControl/AccessGrant/index.js +2 -0
  15. package/dist/features/AccessControl/AccessGrant/style.scss +27 -0
  16. package/dist/features/AccessControl/AccessUser/AccessData.d.ts +10 -0
  17. package/dist/features/AccessControl/AccessUser/AccessData.js +50 -0
  18. package/dist/features/AccessControl/AccessUser/AccessPortal.d.ts +9 -0
  19. package/dist/features/AccessControl/AccessUser/AccessPortal.js +40 -0
  20. package/dist/features/AccessControl/AccessUser/AccessUser.d.ts +14 -0
  21. package/dist/features/AccessControl/AccessUser/AccessUser.js +44 -0
  22. package/dist/features/AccessControl/AccessUser/AccessUserResources.d.ts +9 -0
  23. package/dist/features/AccessControl/AccessUser/AccessUserResources.js +57 -0
  24. package/dist/features/AccessControl/AccessUser/index.d.ts +2 -0
  25. package/dist/features/AccessControl/AccessUser/index.js +2 -0
  26. package/dist/features/AccessControl/AccessUser/style.scss +193 -0
  27. package/dist/features/AccessControl/AccessUsers/AccessUsers.d.ts +8 -0
  28. package/dist/features/AccessControl/AccessUsers/AccessUsers.js +112 -0
  29. package/dist/features/AccessControl/AccessUsers/AccessUsersFilter.d.ts +9 -0
  30. package/dist/features/AccessControl/AccessUsers/AccessUsersFilter.js +5 -0
  31. package/dist/features/AccessControl/AccessUsers/index.d.ts +4 -0
  32. package/dist/features/AccessControl/AccessUsers/index.js +3 -0
  33. package/dist/features/AccessControl/AccessUsers/styles.scss +9 -0
  34. package/dist/features/AccessControl/index.d.ts +10 -0
  35. package/dist/features/AccessControl/index.js +6 -0
  36. package/dist/features/AccessControl/types/PortalInformation.d.ts +20 -0
  37. package/dist/features/AccessControl/types/PortalInformation.js +11 -0
  38. package/dist/features/AccessControl/types/UserAccessResponse.d.ts +27 -0
  39. package/dist/features/AccessControl/types/UserAccessResponse.js +1 -0
  40. package/dist/features/index.d.ts +2 -0
  41. package/dist/features/index.js +1 -0
  42. package/package.json +4 -4
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { yupResolver } from '@hookform/resolvers/yup';
3
+ import { useEffect } from 'react';
4
+ import { useForm } from 'react-hook-form';
5
+ import { useTranslation } from 'react-i18next';
6
+ import { Button, SelectField, TextField } from 'tycho-storybook';
7
+ import * as yup from 'yup';
8
+ import { useMessageUtils } from '../../../configs/useMessageUtils';
9
+ import FormUtils from '../../../functions/FormUtils';
10
+ import AccessControlService from '../AccessControlService';
11
+ import { EMPTY_PORTAL, PortalRoleName, } from '../types/PortalInformation';
12
+ export default function AccessPortal({ resourceUid, user, onChange }) {
13
+ const { t } = useTranslation('access');
14
+ const { dispatchMessage } = useMessageUtils();
15
+ const createdForm = useForm({
16
+ resolver: yupResolver(getFormSchema(t)),
17
+ mode: 'onChange',
18
+ });
19
+ const handleSave = () => {
20
+ if (!resourceUid)
21
+ return;
22
+ const request = createdForm.getValues();
23
+ AccessControlService.updatePortal(user.uid, resourceUid, request).then(() => {
24
+ dispatchMessage({ key: 'update.success', t });
25
+ onChange({ ...request, corpus: resourceUid });
26
+ });
27
+ };
28
+ useEffect(() => {
29
+ createdForm.reset(user.portals?.find((p) => p.corpus === resourceUid) || EMPTY_PORTAL);
30
+ }, [user, resourceUid]);
31
+ return (_jsxs("div", { className: "portal-container", children: [_jsxs("div", { className: "header", children: [_jsx("span", { className: "title", children: t('portal.title.label') }), _jsx("span", { className: "desc", children: t('portal.desc.label') })] }), _jsxs("div", { className: "body", children: [_jsx(SelectField, { label: t('portal.input.display'), attr: "display", createdForm: createdForm, options: FormUtils.booleanOptions(t), showEndAdornment: false }), _jsx(SelectField, { label: t('table.label.role'), attr: "role", createdForm: createdForm, options: FormUtils.convertEnum(PortalRoleName, t), showEndAdornment: false }), _jsx(TextField, { label: t('portal.input.profile'), attr: "urlProfile", createdForm: createdForm, showEndAdornment: false }), _jsx(Button, { text: t('common:button.save'), disabled: !createdForm.formState.isValid, onClick: handleSave, size: "small" })] })] }));
32
+ }
33
+ const getFormSchema = (t) => yup.object().shape({
34
+ urlProfile: yup.string().required(t('message:validation.required')),
35
+ display: yup.boolean().required(t('message:validation.required')),
36
+ role: yup
37
+ .string()
38
+ .oneOf(Object.keys(PortalRoleName))
39
+ .required(t('message:validation.required')),
40
+ });
@@ -0,0 +1,14 @@
1
+ import { AppPage } from '../../../common';
2
+ import { AccessMode } from '../../../configs/types/Access';
3
+ import { UserAccessResponse } from '../types/UserAccessResponse';
4
+ import './style.scss';
5
+ type Props = {
6
+ mode: AccessMode;
7
+ resourceUid: string;
8
+ user: UserAccessResponse;
9
+ setItems: React.Dispatch<React.SetStateAction<AppPage<UserAccessResponse>>>;
10
+ onClose: () => void;
11
+ onReload: () => void;
12
+ };
13
+ export default function AccessUser({ mode, resourceUid, user, onClose, onReload, setItems, }: Props): import("react").JSX.Element;
14
+ export {};
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useTranslation } from 'react-i18next';
3
+ import { AppModal } from '../../../common';
4
+ import { useCorpusUtils } from '../../../configs/useCorpusUtils';
5
+ import AccessData from './AccessData';
6
+ import AccessPortal from './AccessPortal';
7
+ import AccessUserResources from './AccessUserResources';
8
+ import './style.scss';
9
+ export default function AccessUser({ mode, resourceUid, user, onClose, onReload, setItems, }) {
10
+ const { t } = useTranslation('access');
11
+ const { getCorpus, hasCorpus } = useCorpusUtils();
12
+ const showAccessData = mode !== 'corpus' || (hasCorpus() && getCorpus().opened);
13
+ const showPortal = mode === 'corpus';
14
+ const handleChangeAccess = (r) => {
15
+ setItems((prevState) => {
16
+ if (!prevState)
17
+ return prevState;
18
+ const updatedContent = prevState.content.map((item) => item.uid === user.uid ? { ...user, ...r } : item);
19
+ return { ...prevState, content: updatedContent };
20
+ });
21
+ };
22
+ const handleChangePortal = (r) => {
23
+ setItems((prevState) => {
24
+ if (!prevState)
25
+ return prevState;
26
+ const updatedContent = prevState.content.map((item) => {
27
+ if (item.uid !== user.uid)
28
+ return item;
29
+ const existingPortals = item.portals || [];
30
+ const portalIndex = existingPortals.findIndex((p) => p.corpus === r.corpus);
31
+ let newPortals;
32
+ if (portalIndex !== -1) {
33
+ newPortals = existingPortals.map((p, i) => i === portalIndex ? r : p);
34
+ }
35
+ else {
36
+ newPortals = [...existingPortals, r];
37
+ }
38
+ return { ...item, portals: newPortals };
39
+ });
40
+ return { ...prevState, content: updatedContent };
41
+ });
42
+ };
43
+ return (_jsxs(AppModal, { title: user.name, className: "modal-access-user", close: onClose, disableCancel: true, hideFooter: true, children: [_jsxs("div", { className: "row-info", children: [_jsxs("div", { className: "col-profile", children: [_jsxs("div", { className: "info", children: [_jsx("img", { className: "avatar", src: user.picture, referrerPolicy: "no-referrer" }), _jsxs("div", { className: "texts", children: [_jsxs("span", { children: [_jsx("b", { children: t('access.label.name') }), " ", user.name] }), _jsxs("span", { children: [_jsx("b", { children: t('access.label.email') }), " ", user.email] })] })] }), showAccessData && (_jsx(AccessData, { mode: mode, resourceUid: resourceUid, user: user, onChange: handleChangeAccess }))] }), showPortal && (_jsx(AccessPortal, { resourceUid: resourceUid, user: user, onChange: handleChangePortal })), _jsx(AccessUserResources, { mode: mode, user: user, onReload: onReload })] }), _jsx("div", { className: "uid", children: user.uid })] }));
44
+ }
@@ -0,0 +1,9 @@
1
+ import { AccessMode } from '../../../configs/types/Access';
2
+ import { UserAccessResponse } from '../types/UserAccessResponse';
3
+ type Props = {
4
+ mode: AccessMode;
5
+ user: UserAccessResponse;
6
+ onReload: () => void;
7
+ };
8
+ export default function AccessUserResources({ mode, user, onReload, }: Props): import("react").JSX.Element;
9
+ export {};
@@ -0,0 +1,57 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import SecurityUtils from '../../../functions/SecurityUtils';
3
+ import { AppPicture } from '../../../common';
4
+ import { useEffect, useState } from 'react';
5
+ import { useTranslation } from 'react-i18next';
6
+ import { Button } from 'tycho-storybook';
7
+ import AccessControlService from '../AccessControlService';
8
+ const TITLE_KEY = {
9
+ corpus: 'corpora.label.available',
10
+ parser: 'parsers.label.available',
11
+ lexicon: 'lexicons.label.available',
12
+ };
13
+ const REVOKE_KEY = {
14
+ corpus: 'corpora.button.revoke',
15
+ parser: 'parsers.button.revoke',
16
+ lexicon: 'lexicons.button.revoke',
17
+ };
18
+ function toResourceItem(item) {
19
+ return {
20
+ uid: item.uid,
21
+ name: item.name,
22
+ picture: item.picture ?? '',
23
+ };
24
+ }
25
+ export default function AccessUserResources({ mode, user, onReload, }) {
26
+ const { t } = useTranslation('access');
27
+ const [resources, setResources] = useState([]);
28
+ const handleRevoke = (uid) => {
29
+ AccessControlService.revoke(mode, user.uid, uid).then(() => {
30
+ onReload();
31
+ });
32
+ };
33
+ const loadResources = () => {
34
+ const apply = (items) => {
35
+ setResources((items ?? []).map(toResourceItem));
36
+ };
37
+ if (mode === 'corpus') {
38
+ AccessControlService.findCorporaByUser(user.uid)
39
+ .then((r) => apply(r.data))
40
+ .catch(() => apply([]));
41
+ return;
42
+ }
43
+ if (mode === 'parser') {
44
+ AccessControlService.findParsersByUser(user.uid)
45
+ .then((r) => apply(r.data))
46
+ .catch(() => apply([]));
47
+ return;
48
+ }
49
+ AccessControlService.findLexiconsByUser(user.uid)
50
+ .then((r) => apply(r.data))
51
+ .catch(() => apply([]));
52
+ };
53
+ useEffect(() => {
54
+ loadResources();
55
+ }, [user, mode]);
56
+ return (_jsxs("div", { className: "corpora-container", children: [_jsx("div", { className: "title", children: t(TITLE_KEY[mode]) }), resources.map((resource, idx) => (_jsxs("div", { className: "corpus-line", children: [_jsx(AppPicture, { className: "avatar", src: resource.picture }), _jsx("span", { children: resource.name }), SecurityUtils.hasAccess(resource.uid, ['ADMIN'], mode) && (_jsx(Button, { text: t(REVOKE_KEY[mode]), onClick: () => handleRevoke(resource.uid), size: "x-small", color: "danger" }))] }, idx.valueOf())))] }));
57
+ }
@@ -0,0 +1,2 @@
1
+ import AccessUser from './AccessUser';
2
+ export default AccessUser;
@@ -0,0 +1,2 @@
1
+ import AccessUser from './AccessUser';
2
+ export default AccessUser;
@@ -0,0 +1,193 @@
1
+ .modal-access-user {
2
+ width: 50vw !important;
3
+ max-width: 50vw !important;
4
+ top: 40% !important;
5
+
6
+ .body {
7
+ display: flex;
8
+ flex-direction: column;
9
+ gap: 16px;
10
+
11
+ .uid {
12
+ margin-top: auto;
13
+ @include helper-small-1;
14
+ }
15
+
16
+ > .row-info {
17
+ display: flex;
18
+ gap: 16px;
19
+
20
+ .col-profile {
21
+ display: flex;
22
+ flex-direction: column;
23
+ flex: 1;
24
+
25
+ > .title {
26
+ @include label-large-2;
27
+ color: var(--text-primary);
28
+ margin-bottom: 16px;
29
+ }
30
+
31
+ .info {
32
+ display: flex;
33
+ padding-bottom: 16px;
34
+ gap: 32px;
35
+
36
+ .avatar {
37
+ width: 64px;
38
+ height: 64px;
39
+ }
40
+
41
+ .texts {
42
+ display: flex;
43
+ flex-direction: column;
44
+ gap: 16px;
45
+
46
+ > span {
47
+ display: block;
48
+ }
49
+ }
50
+ }
51
+
52
+ .access-container {
53
+ display: flex;
54
+ flex-direction: column;
55
+ padding-top: 16px;
56
+ border-top: 1px solid var(--border-subtle-1);
57
+ gap: 16px;
58
+
59
+ > .header {
60
+ display: flex;
61
+ flex-direction: column;
62
+
63
+ > .title {
64
+ @include label-large-2;
65
+ color: var(--text-primary);
66
+ }
67
+
68
+ > .desc {
69
+ @include body-medium-1;
70
+ color: var(--text-secondary);
71
+ }
72
+ }
73
+
74
+ > .body {
75
+ display: flex;
76
+ flex-direction: column;
77
+ gap: 16px;
78
+
79
+ > .ds-button {
80
+ margin-left: auto;
81
+ }
82
+ }
83
+ }
84
+ }
85
+
86
+ .portal-container {
87
+ flex: 1;
88
+ border-left: var(--border-default);
89
+ padding-left: 16px;
90
+
91
+ > .header {
92
+ display: flex;
93
+ flex-direction: column;
94
+
95
+ > .title {
96
+ @include label-large-2;
97
+ color: var(--text-primary);
98
+ }
99
+
100
+ > .desc {
101
+ @include body-medium-1;
102
+ color: var(--text-secondary);
103
+ }
104
+ }
105
+
106
+ > .body {
107
+ display: flex;
108
+ flex-direction: column;
109
+ padding-top: 16px;
110
+ gap: 16px;
111
+
112
+ > .ds-button {
113
+ margin-left: auto;
114
+ }
115
+ }
116
+ }
117
+
118
+ .corpora-container {
119
+ flex: 1.5;
120
+ padding: 0px 16px;
121
+ border-left: var(--border-default);
122
+ max-height: 60vh;
123
+ overflow-y: auto;
124
+
125
+ > .title {
126
+ @include label-large-2;
127
+ color: var(--text-primary);
128
+ margin-bottom: 16px;
129
+ }
130
+
131
+ .corpus-line {
132
+ display: flex;
133
+ align-items: center;
134
+ margin-top: 24px;
135
+ border-bottom: var(--border-default);
136
+ padding-bottom: 8px;
137
+
138
+ .avatar {
139
+ width: 40px;
140
+ height: 40px;
141
+ margin-right: 24px;
142
+ }
143
+
144
+ > span {
145
+ @include body-xmedium-1;
146
+ }
147
+
148
+ > .ds-button {
149
+ margin-left: auto;
150
+ }
151
+ }
152
+ }
153
+ }
154
+ }
155
+ }
156
+
157
+ .modal-footer {
158
+ > .btn {
159
+ margin-left: auto;
160
+ }
161
+ }
162
+
163
+ @media (max-width: 1366px) {
164
+ .modal-access-user {
165
+ width: 70vw !important;
166
+ max-width: 70vw !important;
167
+ top: 50% !important;
168
+ }
169
+ }
170
+
171
+ @media (max-width: 768px) {
172
+ .modal-access-user {
173
+ width: 90vw !important;
174
+ max-width: 90vw !important;
175
+ top: 30% !important;
176
+
177
+ .body {
178
+ flex-direction: column;
179
+
180
+ .corpora-container {
181
+ border-left: none;
182
+ border-top: var(--border-default);
183
+ padding: 16px 0px 0px;
184
+ }
185
+ }
186
+ }
187
+ }
188
+
189
+ @media (max-width: 767px) {
190
+ .modal-access-user {
191
+ top: 35% !important;
192
+ }
193
+ }
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import { AccessMode } from '../../../configs/types/Access';
3
+ import './styles.scss';
4
+ export type AccessUsersProps = {
5
+ mode: AccessMode;
6
+ resourceUid: string;
7
+ };
8
+ export default function AccessUsers({ mode, resourceUid }: AccessUsersProps): React.JSX.Element;
@@ -0,0 +1,112 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useEffect, useState } from 'react';
3
+ import { useTranslation } from 'react-i18next';
4
+ import { Tag } from 'tycho-storybook';
5
+ import { AppCard, AppLoading, AppPicture, AppPlaceholder, AppTable, EMPTY_PAGE, } from '../../../common';
6
+ import DateUtils from '../../../functions/DateUtils';
7
+ import AccessControlService from '../AccessControlService';
8
+ import AccessGrant from '../AccessGrant';
9
+ import AccessUser from '../AccessUser';
10
+ import { EMPTY_ACCESS_SEARCH_FILTER, } from './AccessUsersFilter';
11
+ import './styles.scss';
12
+ const STATUS_TAG_COLOR = {
13
+ ACTIVE: 'green',
14
+ INACTIVE: 'gray',
15
+ };
16
+ const ROLE_TAG_COLOR = {
17
+ ADMIN: 'violet',
18
+ EDITOR: 'blue',
19
+ READER: 'yellow',
20
+ };
21
+ export default function AccessUsers({ mode, resourceUid }) {
22
+ const { t } = useTranslation('access');
23
+ const [filter, setFilter] = useState(EMPTY_ACCESS_SEARCH_FILTER);
24
+ const [open, setOpen] = useState(false);
25
+ const [loading, setLoading] = useState(true);
26
+ const [data, setData] = useState(EMPTY_PAGE);
27
+ const [selected, setSelected] = useState();
28
+ const paginate = () => {
29
+ if (!resourceUid)
30
+ return;
31
+ setLoading(true);
32
+ AccessControlService.page(mode, resourceUid, filter).then((r) => {
33
+ setData(r.data);
34
+ setLoading(false);
35
+ });
36
+ };
37
+ const onClickRow = (row) => {
38
+ setSelected(row);
39
+ };
40
+ const handleCreate = () => {
41
+ setOpen(true);
42
+ document.body.click();
43
+ };
44
+ const reloadFilter = () => setFilter({
45
+ ...EMPTY_ACCESS_SEARCH_FILTER,
46
+ seed: DateUtils.millis(),
47
+ });
48
+ const menuOptions = [
49
+ {
50
+ icon: 'add',
51
+ label: t('common:button.add'),
52
+ onClick: handleCreate,
53
+ },
54
+ ];
55
+ const addImageToCell = (props) => {
56
+ return (_jsx(AppPicture, { className: "avatar", src: props.row.original.picture, person: true }));
57
+ };
58
+ const addStatusToCell = (props) => {
59
+ const status = props.row.original.status;
60
+ return (_jsx(Tag, { text: t(`status.label.${status?.toLowerCase() ?? ''}`), color: status ? STATUS_TAG_COLOR[status] : 'gray', size: "small" }));
61
+ };
62
+ const addRoleToCell = (props) => {
63
+ const role = props.row.original.role;
64
+ return (_jsx(Tag, { text: t(`role.label.${role.toLowerCase()}`), color: ROLE_TAG_COLOR[role], size: "small" }));
65
+ };
66
+ const addNameToCell = (props) => {
67
+ const user = props.row.original;
68
+ return user.name || user.email;
69
+ };
70
+ const columns = React.useMemo(() => [
71
+ {
72
+ id: 'original',
73
+ header: '',
74
+ cell: addImageToCell,
75
+ size: 10,
76
+ },
77
+ {
78
+ id: 'name',
79
+ header: t('table.label.name'),
80
+ accessorFn: (row) => row.name || row.email,
81
+ cell: addNameToCell,
82
+ size: 35,
83
+ },
84
+ {
85
+ id: 'status',
86
+ header: t('table.label.status'),
87
+ accessorKey: 'status',
88
+ cell: addStatusToCell,
89
+ size: 15,
90
+ },
91
+ {
92
+ id: 'role',
93
+ header: t('table.label.role'),
94
+ accessorKey: 'role',
95
+ cell: addRoleToCell,
96
+ size: 35,
97
+ },
98
+ ], [resourceUid, data, t]);
99
+ useEffect(() => {
100
+ paginate();
101
+ }, [filter, resourceUid, mode]);
102
+ return (_jsxs(AppCard, { title: t('title.users'), options: menuOptions, className: "access-users-container", children: [loading && _jsx(AppLoading, { pageLoading: true }), !loading && data.totalElements > 0 && (_jsx(AppTable, { columns: columns, data: data, className: "users-table", onClickRow: onClickRow, pagination: { pageIndex: filter.page, pageSize: filter.size }, setPagination: (p) => {
103
+ setFilter({ ...filter, page: p.pageIndex, size: p.pageSize });
104
+ }, sorting: filter.sort || [], setSorting: (s) => {
105
+ setFilter({ ...filter, sort: s });
106
+ } })), !loading && data.totalElements === 0 && (_jsx(AppPlaceholder, { text: t('access.placeholder') })), selected && (_jsx(AccessUser, { mode: mode, resourceUid: resourceUid, user: selected, setItems: setData, onClose: () => {
107
+ setSelected(undefined);
108
+ }, onReload: () => {
109
+ setSelected(undefined);
110
+ reloadFilter();
111
+ } })), open && (_jsx(AccessGrant, { mode: mode, resourceUid: resourceUid, onClose: () => setOpen(false), reload: reloadFilter }))] }));
112
+ }
@@ -0,0 +1,9 @@
1
+ import { AppPageable } from '../../../common';
2
+ import { UserStatus } from '../../../configs/types/User';
3
+ type Filter = {
4
+ text: string;
5
+ status?: UserStatus[];
6
+ };
7
+ export type AccessUsersFilter = Filter & AppPageable;
8
+ export declare const EMPTY_ACCESS_SEARCH_FILTER: AccessUsersFilter;
9
+ export {};
@@ -0,0 +1,5 @@
1
+ export const EMPTY_ACCESS_SEARCH_FILTER = {
2
+ text: '',
3
+ page: 0,
4
+ size: 10,
5
+ };
@@ -0,0 +1,4 @@
1
+ import AccessUsers from './AccessUsers';
2
+ export default AccessUsers;
3
+ export type { AccessUsersProps } from './AccessUsers';
4
+ export { EMPTY_ACCESS_SEARCH_FILTER, type AccessUsersFilter, } from './AccessUsersFilter';
@@ -0,0 +1,3 @@
1
+ import AccessUsers from './AccessUsers';
2
+ export default AccessUsers;
3
+ export { EMPTY_ACCESS_SEARCH_FILTER, } from './AccessUsersFilter';
@@ -0,0 +1,9 @@
1
+ .access-users-container {
2
+ > .body {
3
+ padding: 0px;
4
+
5
+ .users-table {
6
+ border: none;
7
+ }
8
+ }
9
+ }
@@ -0,0 +1,10 @@
1
+ export { default as AccessUsers } from './AccessUsers';
2
+ export type { AccessUsersProps } from './AccessUsers';
3
+ export { EMPTY_ACCESS_SEARCH_FILTER, type AccessUsersFilter, } from './AccessUsers';
4
+ export { default as AccessUser } from './AccessUser';
5
+ export { default as AccessGrant } from './AccessGrant';
6
+ export { default as AccessControlService } from './AccessControlService';
7
+ export type { AccessResponse, UserAccessRequest, UserAccessResponse, } from './types/UserAccessResponse';
8
+ export type { default as PortalInformation } from './types/PortalInformation';
9
+ export type { PortalInformationRequest, PortalRole, } from './types/PortalInformation';
10
+ export { EMPTY_PORTAL, PortalRoleName } from './types/PortalInformation';
@@ -0,0 +1,6 @@
1
+ export { default as AccessUsers } from './AccessUsers';
2
+ export { EMPTY_ACCESS_SEARCH_FILTER, } from './AccessUsers';
3
+ export { default as AccessUser } from './AccessUser';
4
+ export { default as AccessGrant } from './AccessGrant';
5
+ export { default as AccessControlService } from './AccessControlService';
6
+ export { EMPTY_PORTAL, PortalRoleName } from './types/PortalInformation';
@@ -0,0 +1,20 @@
1
+ export type PortalRole = 'COORDINATOR' | 'RESEARCHER' | 'PRINCIPAL' | 'COLLABORATOR';
2
+ export declare const PortalRoleName: {
3
+ COORDINATOR: string;
4
+ RESEARCHER: string;
5
+ PRINCIPAL: string;
6
+ COLLABORATOR: string;
7
+ };
8
+ export type PortalInformationRequest = {
9
+ urlProfile: string;
10
+ display: boolean;
11
+ role: PortalRole;
12
+ };
13
+ export declare const EMPTY_PORTAL: PortalInformationRequest;
14
+ type PortalInformation = {
15
+ corpus: string;
16
+ urlProfile: string;
17
+ display: boolean;
18
+ role: PortalRole;
19
+ };
20
+ export default PortalInformation;
@@ -0,0 +1,11 @@
1
+ export const PortalRoleName = {
2
+ COORDINATOR: 'portal.role.coordinator',
3
+ RESEARCHER: 'portal.role.researcher',
4
+ PRINCIPAL: 'portal.role.principal',
5
+ COLLABORATOR: 'portal.role.collaborator',
6
+ };
7
+ export const EMPTY_PORTAL = {
8
+ urlProfile: '',
9
+ display: false,
10
+ role: 'COLLABORATOR',
11
+ };
@@ -0,0 +1,27 @@
1
+ import Access, { AccessRole, AccessStatus } from '../../../configs/types/Access';
2
+ import PortalInformation from './PortalInformation';
3
+ export type AccessResponse = {
4
+ uid: string;
5
+ name: string;
6
+ picture: string;
7
+ status: AccessStatus;
8
+ role: AccessRole;
9
+ };
10
+ export type UserAccessResponse = {
11
+ uid: string;
12
+ name: string;
13
+ email: string;
14
+ picture: string;
15
+ viewer: boolean;
16
+ status: AccessStatus;
17
+ role: AccessRole;
18
+ corpora: AccessResponse[];
19
+ parsers: AccessResponse[];
20
+ lexicons: AccessResponse[];
21
+ authorities: Access[];
22
+ portals?: PortalInformation[];
23
+ };
24
+ export type UserAccessRequest = {
25
+ status: AccessStatus;
26
+ role: AccessRole;
27
+ };
@@ -2,6 +2,8 @@ export { default as CommentComponent } from "./Comments";
2
2
  export { default as HeaderNotifications } from "./Comments/HeaderNotifications";
3
3
  export type { Comment, CommentRequest } from "./Comments/types/Comment";
4
4
  export { default as CommentService } from "./Comments/CommentService";
5
+ export { AccessUsers, AccessUser, AccessGrant, AccessControlService, EMPTY_ACCESS_SEARCH_FILTER, EMPTY_PORTAL, PortalRoleName, } from "./AccessControl";
6
+ export type { AccessUsersProps, AccessUsersFilter, AccessResponse, UserAccessRequest, UserAccessResponse, PortalInformation, PortalInformationRequest, PortalRole, } from "./AccessControl";
5
7
  export { default as Parameters } from "./Parameters";
6
8
  export { default as SentenceView } from "./SentenceView";
7
9
  export { default as TreeView } from "./TreeView";
@@ -1,6 +1,7 @@
1
1
  export { default as CommentComponent } from "./Comments";
2
2
  export { default as HeaderNotifications } from "./Comments/HeaderNotifications";
3
3
  export { default as CommentService } from "./Comments/CommentService";
4
+ export { AccessUsers, AccessUser, AccessGrant, AccessControlService, EMPTY_ACCESS_SEARCH_FILTER, EMPTY_PORTAL, PortalRoleName, } from "./AccessControl";
4
5
  export { default as Parameters } from "./Parameters";
5
6
  export { default as SentenceView } from "./SentenceView";
6
7
  export { default as TreeView } from "./TreeView";