@fluxo-dev/shell 0.0.8 → 0.0.12

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 (119) hide show
  1. package/index.esm.css +115 -0
  2. package/index.esm.d.ts +1 -0
  3. package/index.esm.js +68195 -0
  4. package/package.json +13 -2
  5. package/src/index.d.ts +1 -0
  6. package/src/lib/app.d.ts +16 -0
  7. package/src/lib/components/error-page/404.d.ts +1 -0
  8. package/src/lib/components/routes/main-routes.d.ts +6 -0
  9. package/src/lib/layouts/blank/blank-layout.d.ts +2 -0
  10. package/src/lib/layouts/main/app-bar.d.ts +9 -0
  11. package/src/lib/layouts/main/app-layout.d.ts +5 -0
  12. package/src/lib/layouts/main/content.d.ts +2 -0
  13. package/src/lib/layouts/main/footer-bar.d.ts +5 -0
  14. package/src/lib/layouts/main/navbar-item.d.ts +12 -0
  15. package/src/lib/layouts/main/navbar.d.ts +1 -0
  16. package/src/lib/layouts/main/search-bar.d.ts +5 -0
  17. package/src/lib/layouts/main/shell-spotlight.d.ts +2 -0
  18. package/src/lib/models/app-jit.d.ts +5 -0
  19. package/src/lib/pages/general/fluxo-plugin-loader.d.ts +7 -0
  20. package/src/lib/pages/login/account-confirmation.d.ts +2 -0
  21. package/src/lib/pages/login/change-password.d.ts +2 -0
  22. package/src/lib/pages/login/forgot-password.d.ts +2 -0
  23. package/src/lib/pages/login/login-page.d.ts +2 -0
  24. package/src/lib/pages/login/reset-password.d.ts +2 -0
  25. package/src/lib/pages/settings/apps/add-jit-app.d.ts +5 -0
  26. package/src/lib/pages/settings/apps/app-item.d.ts +10 -0
  27. package/src/lib/pages/settings/apps/app-jit-item.d.ts +8 -0
  28. package/src/lib/pages/settings/apps/apps-list.d.ts +6 -0
  29. package/src/lib/pages/settings/apps/embedded-module-item.d.ts +10 -0
  30. package/src/lib/pages/settings/apps/install-or-upgrade-app.d.ts +6 -0
  31. package/src/lib/pages/settings/menu-designer/custom-node.d.ts +14 -0
  32. package/src/lib/pages/settings/menu-designer/menu-create-form.d.ts +5 -0
  33. package/src/lib/pages/settings/menu-designer/menu-designer.d.ts +1 -0
  34. package/src/lib/pages/settings/menu-designer/menu-item-edit.d.ts +8 -0
  35. package/src/lib/pages/settings/menu-designer/placeholder.d.ts +8 -0
  36. package/src/lib/pages/settings/security/components/domani-role/domain-role-form.d.ts +6 -0
  37. package/src/lib/pages/settings/security/components/domani-role/domain-role-grid.d.ts +1 -0
  38. package/src/lib/pages/settings/security/components/permission/create-custom-permission-form.d.ts +7 -0
  39. package/src/lib/pages/settings/security/components/permission/create-scope-form.d.ts +7 -0
  40. package/src/lib/pages/settings/security/components/permission/permission-grid.d.ts +1 -0
  41. package/src/lib/pages/settings/security/components/permission/permission-navigator.d.ts +8 -0
  42. package/src/lib/pages/settings/security/components/permission/update-permission.d.ts +5 -0
  43. package/src/lib/pages/settings/security/components/route-rule/route-rule-create-form.d.ts +7 -0
  44. package/src/lib/pages/settings/security/components/route-rule/route-rule-grid.d.ts +1 -0
  45. package/src/lib/pages/settings/security/components/user/user-form.d.ts +7 -0
  46. package/src/lib/pages/settings/security/components/user/users-grid.d.ts +1 -0
  47. package/src/lib/pages/settings/settings.d.ts +6 -0
  48. package/src/lib/pages/settings/token/token-row.d.ts +7 -0
  49. package/src/lib/pages/settings/token/tokens.d.ts +2 -0
  50. package/src/lib/pages/settings/ui/ui.d.ts +1 -0
  51. package/src/lib/services/app-jit-manager.d.ts +10 -0
  52. package/src/lib/services/app-menu.service.d.ts +5 -0
  53. package/src/lib/utils/icon-factory.d.ts +9 -0
  54. package/src/lib/utils/security/only-not-logged-route.d.ts +2 -0
  55. package/src/lib/utils/security/protected-route.d.ts +2 -0
  56. package/.babelrc +0 -12
  57. package/.eslintrc.json +0 -18
  58. package/jest.config.ts +0 -11
  59. package/project.json +0 -43
  60. package/src/index.ts +0 -1
  61. package/src/lib/app.module.css +0 -1
  62. package/src/lib/app.spec.tsx +0 -17
  63. package/src/lib/app.tsx +0 -374
  64. package/src/lib/components/error-page/404.tsx +0 -16
  65. package/src/lib/components/routes/main-routes.tsx +0 -26
  66. package/src/lib/layouts/blank/blank-layout.tsx +0 -10
  67. package/src/lib/layouts/main/app-bar.tsx +0 -192
  68. package/src/lib/layouts/main/app-layout.tsx +0 -52
  69. package/src/lib/layouts/main/content.tsx +0 -10
  70. package/src/lib/layouts/main/footer-bar.tsx +0 -76
  71. package/src/lib/layouts/main/navbar-item.module.css +0 -49
  72. package/src/lib/layouts/main/navbar-item.tsx +0 -129
  73. package/src/lib/layouts/main/navbar.tsx +0 -38
  74. package/src/lib/layouts/main/search-bar.tsx +0 -44
  75. package/src/lib/layouts/main/shell-spotlight.tsx +0 -58
  76. package/src/lib/models/app-jit.ts +0 -6
  77. package/src/lib/pages/general/fluxo-plugin-loader.tsx +0 -22
  78. package/src/lib/pages/login/account-confirmation.tsx +0 -86
  79. package/src/lib/pages/login/change-password.tsx +0 -58
  80. package/src/lib/pages/login/forgot-password.tsx +0 -53
  81. package/src/lib/pages/login/login-page.tsx +0 -70
  82. package/src/lib/pages/login/reset-password.tsx +0 -91
  83. package/src/lib/pages/settings/apps/add-jit-app.tsx +0 -79
  84. package/src/lib/pages/settings/apps/app-item.tsx +0 -157
  85. package/src/lib/pages/settings/apps/app-jit-item.tsx +0 -105
  86. package/src/lib/pages/settings/apps/apps-list.tsx +0 -171
  87. package/src/lib/pages/settings/apps/embedded-module-item.tsx +0 -66
  88. package/src/lib/pages/settings/apps/install-or-upgrade-app.tsx +0 -105
  89. package/src/lib/pages/settings/menu-designer/custom-node.module.css +0 -34
  90. package/src/lib/pages/settings/menu-designer/custom-node.tsx +0 -160
  91. package/src/lib/pages/settings/menu-designer/menu-create-form.tsx +0 -109
  92. package/src/lib/pages/settings/menu-designer/menu-designer.module.css +0 -19
  93. package/src/lib/pages/settings/menu-designer/menu-designer.tsx +0 -463
  94. package/src/lib/pages/settings/menu-designer/menu-item-edit.tsx +0 -115
  95. package/src/lib/pages/settings/menu-designer/placeholder.module.css +0 -8
  96. package/src/lib/pages/settings/menu-designer/placeholder.tsx +0 -13
  97. package/src/lib/pages/settings/security/components/domani-role/domain-role-form.tsx +0 -67
  98. package/src/lib/pages/settings/security/components/domani-role/domain-role-grid.tsx +0 -139
  99. package/src/lib/pages/settings/security/components/permission/create-custom-permission-form.tsx +0 -64
  100. package/src/lib/pages/settings/security/components/permission/create-scope-form.tsx +0 -158
  101. package/src/lib/pages/settings/security/components/permission/permission-grid.tsx +0 -304
  102. package/src/lib/pages/settings/security/components/permission/permission-navigator.tsx +0 -320
  103. package/src/lib/pages/settings/security/components/permission/update-permission.tsx +0 -54
  104. package/src/lib/pages/settings/security/components/route-rule/route-rule-create-form.tsx +0 -59
  105. package/src/lib/pages/settings/security/components/route-rule/route-rule-grid.tsx +0 -229
  106. package/src/lib/pages/settings/security/components/user/user-form.tsx +0 -123
  107. package/src/lib/pages/settings/security/components/user/users-grid.tsx +0 -127
  108. package/src/lib/pages/settings/settings.tsx +0 -298
  109. package/src/lib/pages/settings/token/token-row.tsx +0 -69
  110. package/src/lib/pages/settings/token/tokens.tsx +0 -73
  111. package/src/lib/pages/settings/ui/ui.tsx +0 -149
  112. package/src/lib/services/app-jit-manager.ts +0 -92
  113. package/src/lib/services/app-menu.service.ts +0 -35
  114. package/src/lib/utils/icon-factory.tsx +0 -25
  115. package/src/lib/utils/security/only-not-logged-route.tsx +0 -17
  116. package/src/lib/utils/security/protected-route.tsx +0 -47
  117. package/tsconfig.json +0 -20
  118. package/tsconfig.lib.json +0 -24
  119. package/tsconfig.spec.json +0 -20
@@ -1,139 +0,0 @@
1
- import {IconDotsVertical, IconEdit, IconLock, IconPlus, IconTrash} from "@tabler/icons-react";
2
- import {ActionIcon, Menu, Modal, Table} from "@mantine/core";
3
- import {DataCard} from "@fluxo-dev/ui-components";
4
- import React, {useEffect, useState} from "react";
5
- import {DomainRole, FluxoClientSys} from "@fluxo-dev/api-client-base";
6
- import {showNotification} from "@mantine/notifications";
7
- import {DomainRoleForm} from "./domain-role-form";
8
- import {PermissionNavigator} from "../permission/permission-navigator";
9
-
10
- export function DomainRoleGrid() {
11
-
12
- const [domainRoles, setDomainRoles] = useState<DomainRole[]>([]);
13
- const [currentDomainRole, setCurrentDomainRole] = useState<DomainRole>();
14
- const [domainRoleModalOpen, setDomainRoleModalOpen] = useState<boolean>(false);
15
- const [updateDomainRolePermissionsModal, setUpdateDomainRolePermissionsModal] = useState<boolean>(false);
16
-
17
- useEffect(() => {
18
- getAllDomainRoles();
19
- }, [])
20
-
21
- const getAllDomainRoles = () => {
22
- FluxoClientSys.Instance.security.domainRole.find(9999,0, undefined, "DomainRolePermissions,DomainRolePermissions.Permission")
23
- .then((res) => {
24
- setDomainRoles(res.results);
25
- });
26
- }
27
-
28
- const deleteDomainRole = (id: number | undefined) => {
29
-
30
- if(!id)
31
- return;
32
-
33
- FluxoClientSys.Instance.security.domainRole.delete(id.toString())
34
- .then((res) => {
35
-
36
- showNotification({
37
- title: 'Cancellazione completata',
38
- message: `Il ruolo è stato cancellato con successo`,
39
- color: 'green',
40
- });
41
-
42
- getAllDomainRoles();
43
-
44
- })
45
- .catch((err) => {
46
- showNotification({
47
- title: 'Errore',
48
- message: `Errore durante la cancellazione`,
49
- color: 'red',
50
- });
51
- });
52
- }
53
-
54
- return (
55
- <DataCard title={'Ruoli utente'}
56
- actions={[{icon: <IconPlus size={18}/>, label: 'Nuovo ruolo', onClick: () => {
57
- setCurrentDomainRole(undefined);
58
- setDomainRoleModalOpen(true);
59
- }}]}>
60
- <Table highlightOnHover>
61
- <Table.Thead>
62
- <Table.Tr>
63
- <Table.Th>Id</Table.Th>
64
- <Table.Th>Identificatore</Table.Th>
65
- <Table.Th>Nome</Table.Th>
66
- <Table.Th>Descrizione</Table.Th>
67
- <Table.Th>Permessi</Table.Th>
68
- <Table.Th></Table.Th>
69
- </Table.Tr>
70
- </Table.Thead>
71
- <tbody>
72
- {
73
- domainRoles.map((element, i) =>
74
- <Table.Tr key={i}>
75
- <td>{element.id}</td>
76
- <td>{element.identifier}</td>
77
- <td>{element.name}</td>
78
- <td>{element.description}</td>
79
- <td>{element.permissionCount}</td>
80
- <Table.Td align="right">
81
- <Menu shadow="md" width={200}>
82
- <Menu.Target>
83
- <ActionIcon><IconDotsVertical size={18} /></ActionIcon>
84
- </Menu.Target>
85
-
86
- <Menu.Dropdown>
87
- <Menu.Item leftSection={<IconLock size={14} />} onClick={() => {
88
- setCurrentDomainRole(element);
89
- setUpdateDomainRolePermissionsModal(true)
90
- }}>
91
- Permessi
92
- </Menu.Item>
93
- <Menu.Item onClick={() => {
94
- setCurrentDomainRole(element);
95
- setDomainRoleModalOpen(true);
96
- }} leftSection={<IconEdit size={14} />}>Modifica</Menu.Item>
97
- <Menu.Divider />
98
- <Menu.Item color={'red'} onClick={() => deleteDomainRole(element.id)} leftSection={<IconTrash color={'red'} size={14} />}>Elimina</Menu.Item>
99
- </Menu.Dropdown>
100
- </Menu>
101
- </Table.Td>
102
- </Table.Tr>
103
- )
104
- }
105
- </tbody>
106
- </Table>
107
-
108
- <Modal centered opened={domainRoleModalOpen} onClose={() => {
109
- setDomainRoleModalOpen(false);
110
- setCurrentDomainRole(undefined);
111
- }} title={`${currentDomainRole ? 'Modifica ruolo' : 'Crea ruolo'}`}>
112
- <DomainRoleForm onCreate={() => {
113
- setDomainRoleModalOpen(false);
114
- getAllDomainRoles();
115
- setCurrentDomainRole(undefined);
116
- }} domainRole={currentDomainRole}/>
117
- </Modal>
118
-
119
- {currentDomainRole &&
120
- <Modal
121
- size={'60%'}
122
- centered
123
- opened={updateDomainRolePermissionsModal}
124
- onClose={() => {
125
- setUpdateDomainRolePermissionsModal(false);
126
- setCurrentDomainRole(undefined);
127
- getAllDomainRoles();
128
- }}
129
- title={`Gestione permessi ${currentDomainRole.name}`}>
130
- <PermissionNavigator
131
- context={{type: 'domainRole', id: currentDomainRole.id!.toString()}}
132
- onUpdate={() => {}}
133
- />
134
- </Modal>
135
- }
136
-
137
- </DataCard>
138
- )
139
- }
@@ -1,64 +0,0 @@
1
- import {Alert, Button, Divider, Group, Stack, TextInput} from "@mantine/core";
2
- import {CreateCustomPermissionCommand, FluxoClientSys, PermissionScope} from "@fluxo-dev/api-client-base";
3
- import React, {useState} from "react";
4
- import {showNotification} from "@mantine/notifications";
5
- import {IconInfoCircle} from "@tabler/icons-react";
6
-
7
- export interface CreateCustomPermissionFormProps {
8
- permissionScope: PermissionScope;
9
- onCanceled: () => void;
10
- onCreated: () => void;
11
- }
12
- export function CreateCustomPermissionForm(props: CreateCustomPermissionFormProps) {
13
-
14
- const [identifier, setIdentifier] = useState<string>('');
15
- const [description, setDescription] = useState<string>('');
16
-
17
- const createCustomPermission = () => {
18
- if(!identifier || !description) return;
19
-
20
- const command: CreateCustomPermissionCommand = {
21
- scope: props.permissionScope.scope,
22
- packageName: props.permissionScope.packageName,
23
- namespace: props.permissionScope.namespace,
24
- identifier: identifier,
25
- description: description
26
- }
27
- FluxoClientSys.Instance.security.permission.createCustomPermission(command)
28
- .then(() => {
29
- showNotification({
30
- title: 'Permesso creato',
31
- message: `Il permesso ${props.permissionScope.scope}.${props.permissionScope.packageName}.${props.permissionScope.namespace}.${identifier} è stato creato con successo.`,
32
- color: 'green'
33
- })
34
- props.onCreated();
35
- })
36
- .catch(() => {
37
- showNotification({
38
- title: 'Errore',
39
- message: `Si è verificato un errore durante la creazione del permesso ${props.permissionScope.scope}.${props.permissionScope.packageName}.${props.permissionScope.namespace}.${identifier}.`,
40
- color: 'red'
41
- })
42
- });
43
- }
44
-
45
- return (
46
- <Stack>
47
- <Alert color={'yellow'} icon={<IconInfoCircle />}>
48
- <b>Informazioni: </b> crea nuovi permessi personalizzati da utilizzare nei servizi dinamici, nei menu e nelle pagine DynamicUI.
49
- </Alert>
50
- <TextInput label={"Identificatore"} placeholder={'Es: create'} required onChange={(v) => setIdentifier(v.target.value)} />
51
- <TextInput label={"Descrizione"} placeholder={'Es: Crea'} required onChange={(v) => setDescription(v.target.value)} />
52
-
53
- <Divider />
54
- <Group justify={'right'}>
55
- <Button variant={'subtle'} onClick={props.onCanceled}>Annulla</Button>
56
- <Button
57
- disabled={!identifier || !description}
58
- onClick={createCustomPermission}>
59
- Salva
60
- </Button>
61
- </Group>
62
- </Stack>
63
- )
64
- }
@@ -1,158 +0,0 @@
1
- import React, {useState} from "react";
2
- import {Button, Divider, Group, Select, Stack, TextInput} from "@mantine/core";
3
- import {CreatePermissionScopeCommand, FluxoClientSys, PermissionScope} from "@fluxo-dev/api-client-base";
4
- import {showNotification} from "@mantine/notifications";
5
-
6
- export interface CreateScopeFormProps {
7
- permissionScopes: PermissionScope[],
8
- onCreated: () => void;
9
- onCanceled: () => void;
10
- }
11
-
12
- export function CreateScopeForm(props: CreateScopeFormProps) {
13
-
14
- const [permissionScopes] = useState<PermissionScope[]>(props.permissionScopes);
15
- const [createdScopes, setCreatedScopes] = useState<string[]>([]);
16
- const [createdPackageNames, setCreatedPackageNames] = useState<string[]>([]);
17
- const [createdNamespaces, setCreatedNamespaces] = useState<string[]>([]);
18
-
19
- const [currentScope, setCurrentScope] = useState<string | null>(null);
20
- const [currentPackageName, setCurrentPackageName] = useState<string | null>(null);
21
- const [currentNamespace, setCurrentNamespace] = useState<string | undefined>(undefined);
22
- const [namespaceDescription, setNamespaceDescription] = useState<string>('');
23
- const [namespaceIdentifierError, setNamespaceIdentifierError] = useState<string | null>(null);
24
- const createPermissionScope = () => {
25
- if(!currentScope || !currentPackageName || !currentNamespace) {
26
- return;
27
- }
28
-
29
- const command: CreatePermissionScopeCommand = {
30
- scope: currentScope,
31
- packageName: currentPackageName,
32
- namespace: currentNamespace,
33
- namespaceDescription: namespaceDescription
34
- }
35
-
36
- FluxoClientSys.Instance.security.permission.createPermissionScope(command)
37
- .then((res) => {
38
- showNotification({
39
- title: 'Scope creato',
40
- message: `Lo scope ${currentScope}.${currentPackageName}.${currentNamespace} è stato creato con successo.`,
41
- color: 'green'
42
- });
43
- props.onCreated();
44
- })
45
- .catch(() => {
46
- showNotification({
47
- title: 'Errore',
48
- message: `Si è verificato un errore durante la creazione dello scope ${currentScope}.${currentPackageName}.${currentNamespace}.`,
49
- color: 'red'
50
- });
51
- })
52
- }
53
-
54
- const getScopes = () => {
55
- if(permissionScopes === undefined) return [];
56
- return [...new Set(permissionScopes.map(a => a.scope))];
57
- }
58
-
59
- const getPackageNames = (scope: string | null) => {
60
- if(permissionScopes === undefined || !scope) return [];
61
- return [...new Set(permissionScopes.filter(a => a.scope === scope).map(a => a.packageName))];
62
- }
63
-
64
- const getNamespaces = (scope: string | null, packageName: string | null) => {
65
- if(permissionScopes === undefined || !scope || !packageName) return [];
66
- return [...new Set(permissionScopes.filter(a => a.scope === scope && a.packageName === packageName).map(a => a.namespace))];
67
- }
68
-
69
- return (
70
- <Stack>
71
- {/*<Select
72
- label="Scope"
73
- description={'Seleziona uno scope esistente oppure crea un nuovo scope.'}
74
- data={[...getScopes(), ...createdScopes]}
75
- nothingFoundMessage="Nessuno scope trovato"
76
- searchable
77
- onChange={(v) => setCurrentScope(v)}
78
- creatable
79
- getCreateLabel={(query) => `+ Crea ${query}`}
80
- onCreate={(query) => {
81
- setCreatedScopes([query]);
82
- return query;
83
- }}
84
- />
85
-
86
- <Select
87
- label="Package Name"
88
- description={'Seleziona un package name esistente oppure crea un nuovo package name.'}
89
- data={[...getPackageNames(currentScope), ...createdPackageNames]}
90
- disabled={!currentScope}
91
- nothingFoundMessage="Nessuno package name trovato"
92
- searchable
93
- creatable
94
- onChange={(v) => setCurrentPackageName(v)}
95
- getCreateLabel={(query) => `+ Crea ${query}`}
96
- onCreate={(query) => {
97
- setCreatedPackageNames([query]);
98
- return query;
99
- }}
100
- />*/}
101
-
102
- <Select
103
- label="Scope"
104
- description={'Seleziona uno scope esistente oppure crea un nuovo scope.'}
105
- data={[...getScopes(), ...createdScopes]}
106
- nothingFoundMessage="Nessuno scope trovato"
107
- searchable
108
- onChange={(v) => setCurrentScope(v)}
109
- />
110
-
111
- <Select
112
- label="Package Name"
113
- description={'Seleziona un package name esistente oppure crea un nuovo package name.'}
114
- data={[...getPackageNames(currentScope), ...createdPackageNames]}
115
- disabled={!currentScope}
116
- nothingFoundMessage="Nessuno package name trovato"
117
- searchable
118
- />
119
-
120
- <TextInput
121
- disabled={!currentPackageName}
122
- description={'Identificatore del nuovo namespace. Non è possibile selezionare un namespace già esistente.'}
123
- label={'Identificatore del namespace'}
124
- value={currentNamespace}
125
- error={namespaceIdentifierError}
126
- onChange={(e) => {
127
- if(getNamespaces(currentScope, currentPackageName).includes(e.currentTarget.value)) {
128
- setNamespaceIdentifierError(`Il namespace inserito è già presente nel percorso ${currentScope}.${currentPackageName}.`);
129
- } else {
130
- setNamespaceIdentifierError(null);
131
- }
132
-
133
- setCurrentNamespace(e.currentTarget.value)
134
- }}
135
- />
136
-
137
- <TextInput
138
- disabled={!currentNamespace}
139
- label={'Descrizione del namespace'}
140
- placeholder={'Descrizione del namespace'}
141
- value={namespaceDescription}
142
- onChange={(e) => {
143
- setNamespaceDescription(e.currentTarget.value)
144
- }}
145
- />
146
-
147
- <Divider />
148
- <Group justify={'right'}>
149
- <Button variant={'subtle'} onClick={props.onCanceled}>Annulla</Button>
150
- <Button
151
- disabled={!currentScope || !currentPackageName || !currentNamespace || !namespaceDescription || namespaceIdentifierError !== null}
152
- onClick={createPermissionScope}>
153
- Salva
154
- </Button>
155
- </Group>
156
- </Stack>
157
- )
158
- }
@@ -1,304 +0,0 @@
1
- import {
2
- ActionIcon,
3
- Badge,
4
- Button,
5
- Center,
6
- Divider,
7
- Grid,
8
- Group,
9
- Loader,
10
- Modal,
11
- Select,
12
- Stack,
13
- Table,
14
- Text
15
- } from "@mantine/core";
16
- import React, {useEffect, useState} from "react";
17
- import {UpdatePermission} from "./update-permission";
18
- import {FluxoClientSys, Permission, PermissionScope} from "@fluxo-dev/api-client-base";
19
- import {IconArrowDown, IconCloudOff, IconPlus, IconRefresh, IconTrash} from '@tabler/icons-react';
20
- import {DataCard, WaitData} from "@fluxo-dev/ui-components";
21
- import {CreateScopeForm} from "./create-scope-form";
22
- import {CreateCustomPermissionForm} from "./create-custom-permission-form";
23
- import {showNotification} from "@mantine/notifications";
24
-
25
- export function PermissionGrid() {
26
-
27
- const [permissions, setPermissions] = useState<Permission[]>([]);
28
- const [updatePermissionModal, setUpdatePermissionModal] = useState<boolean>(false);
29
-
30
- const [permissionScopes, setPermissionScopes] = useState<PermissionScope[]>([]);
31
- const [permissionScopesLoaded, setPermissionScopesLoaded] = useState<boolean>(false);
32
-
33
- const [currentScope, setCurrentScope] = useState<string | null>(null);
34
- const [currentPackageName, setCurrentPackageName] = useState<string | null>(null);
35
- const [currentNamespace, setCurrentNamespace] = useState<string | null>(null);
36
- const [permissionLoading, setPermissionLoading] = useState<boolean>(false);
37
-
38
- const [createPermissionScopeModalOpened, setCreatePermissionScopeModalOpened] = useState<boolean>(false);
39
- const [createCustomPermissionModalOpened, setCreateCustomPermissionModalOpened] = useState<boolean>(false);
40
-
41
- useEffect(() => {
42
- loadPermissionScopes();
43
- }, [])
44
-
45
- const loadPermissionScopes = () => {
46
- FluxoClientSys.Instance.security.permission.getPermissionScopes()
47
- .then((res) => {
48
- setPermissionScopes(res);
49
- setPermissionScopesLoaded(true);
50
- })
51
- }
52
-
53
- useEffect(() => {
54
- if(currentScope && currentPackageName && currentNamespace)
55
- getPermissionInScope();
56
- else
57
- setPermissions([]);
58
- }, [currentScope, currentPackageName, currentNamespace]);
59
-
60
- const getPermissionInScope = () => {
61
-
62
- if(!currentScope || !currentPackageName || !currentNamespace) {
63
- return;
64
- }
65
-
66
- setPermissionLoading(true);
67
-
68
- FluxoClientSys.Instance.security.permission.getPermissionsInScope(currentScope, currentPackageName, currentNamespace)
69
- .then((res) => {
70
- setPermissions(res);
71
- setPermissionLoading(false);
72
- })
73
- }
74
-
75
- const deleteCustomPermission = (permissionId: number) => {
76
- FluxoClientSys.Instance.security.permission.deleteCustomPermission(permissionId)
77
- .then(() => {
78
- showNotification({
79
- title: 'Operazione completata',
80
- message: 'Il permesso è stato eliminato con successo',
81
- color: 'green',
82
- })
83
- getPermissionInScope();
84
- })
85
- .catch(() => {
86
- showNotification({
87
- title: 'Operazione fallita',
88
- message: 'Non è stato possibile eliminare il permesso',
89
- color: 'red',
90
- })
91
- });
92
- }
93
-
94
- const deletePermissionScope = () => {
95
-
96
- if(!currentScope || !currentPackageName || !currentNamespace) {
97
- return;
98
- }
99
-
100
- FluxoClientSys.Instance.security.permission.deletePermissionScope(currentScope, currentPackageName, currentNamespace)
101
- .then(() => {
102
- showNotification({
103
- title: 'Operazione completata',
104
- message: 'Lo scope è stato eliminato con successo',
105
- color: 'green',
106
- })
107
- setCurrentScope(null);
108
- setCurrentPackageName(null);
109
- setCurrentNamespace(null);
110
- setPermissions([]);
111
- loadPermissionScopes();
112
- })
113
- .catch(() => {
114
- showNotification({
115
- title: 'Operazione fallita',
116
- message: 'Non è stato possibile eliminare lo scope',
117
- color: 'red',
118
- })
119
- });
120
- }
121
-
122
- const getScopes = () => {
123
- if(permissionScopes === undefined) return [];
124
- return [...new Set(permissionScopes.map(a => a.scope))];
125
- }
126
-
127
- const getPackageNames = (scope: string | null) => {
128
- if(permissionScopes === undefined || !scope) return [];
129
- return [...new Set(permissionScopes.filter(a => a.scope === scope).map(a => a.packageName))];
130
- }
131
-
132
- const getNamespaces = (scope: string | null, packageName: string | null) => {
133
- if(permissionScopes === undefined || !scope || !packageName) return [];
134
- return [...new Set(permissionScopes.filter(a => a.scope === scope && a.packageName === packageName).map(a => a.namespace))];
135
- }
136
-
137
- return (
138
- <DataCard title={'Permessi'}
139
- actions={[
140
- {
141
- icon: <IconArrowDown size={18}/>,
142
- label: 'Installa permessi',
143
- onClick: () => {
144
- setUpdatePermissionModal(true)
145
- }
146
- },
147
- {
148
- icon: <IconPlus size={18}/>,
149
- label: 'Crea nuovo scope',
150
- onClick: () => {
151
- setCreatePermissionScopeModalOpened(true)
152
- }
153
- }]}>
154
-
155
- <Stack>
156
- <Grid>
157
- <Grid.Col span={4}>
158
- <Select
159
- data={getScopes()}
160
- searchable
161
- placeholder={'Seleziona uno scope'}
162
- value={currentScope}
163
- label={'Scope'}
164
- onChange={(v) => {
165
- setCurrentScope(v)
166
- setCurrentPackageName(null);
167
- setCurrentNamespace(null);
168
- }} />
169
- </Grid.Col>
170
- <Grid.Col span={4}>
171
- <Select
172
- disabled={!currentScope}
173
- searchable
174
- placeholder={'Seleziona un package name'}
175
- data={getPackageNames(currentScope)}
176
- value={currentPackageName}
177
- label={'Package name'}
178
- onChange={(v) => {
179
- setCurrentPackageName(v)
180
- setCurrentNamespace(null);
181
- }} />
182
- </Grid.Col>
183
- <Grid.Col span={4}>
184
- <Select
185
- disabled={!currentPackageName}
186
- searchable
187
- placeholder={'Seleziona un namespace'}
188
- data={getNamespaces(currentScope, currentPackageName)}
189
- value={currentNamespace}
190
- label={'Namespace'}
191
- onChange={(v) => {
192
- setCurrentNamespace(v)
193
- }} />
194
- </Grid.Col>
195
- </Grid>
196
-
197
- <Divider />
198
-
199
- {permissionLoading &&
200
- <Loader />
201
- }
202
-
203
- {(currentScope && currentPackageName && currentNamespace && !permissionLoading && permissions.length) === 0 &&
204
- <Stack>
205
- <Group justify={'right'} align={'center'}>
206
- <Button color={'red'} disabled={permissions.length > 0} onClick={deletePermissionScope} leftSection={<IconTrash size={18}/>}>Elimina scope</Button>
207
- <Button leftSection={<IconPlus size={18}/>} onClick={() => setCreateCustomPermissionModalOpened(true)}>Crea permesso custom</Button>
208
- </Group>
209
- <Center>
210
- <Text size={'md'}>Nessun permesso esistente.</Text>
211
- </Center>
212
- </Stack>
213
- }
214
-
215
- {(!currentScope || !currentPackageName || !currentNamespace) &&
216
- <Stack align={'center'} mt={32} mb={32}>
217
- <IconCloudOff color={'gray'} size={64} />
218
- <Center>
219
- <Text size={'md'}>Seleziona uno scope, un package name e un namespace per visualizzare i permessi associati.</Text>
220
- </Center>
221
- </Stack>
222
- }
223
-
224
- {!permissionLoading && permissions.length > 0 &&
225
- <Stack>
226
- <Group justify={'right'} align={'center'}>
227
- <Button disabled={permissions.length > 0} leftSection={<IconTrash size={18}/>}>Elimina scope</Button>
228
- <Button leftSection={<IconPlus size={18}/>} onClick={() => setCreateCustomPermissionModalOpened(true)}>Crea permesso custom</Button>
229
- </Group>
230
- <Table highlightOnHover>
231
- <Table.Thead>
232
- <Table.Tr>
233
- <Table.Th>Id</Table.Th>
234
- <Table.Th>Scope</Table.Th>
235
- <Table.Th>Identificatore</Table.Th>
236
- <Table.Th>Descrizione</Table.Th>
237
- <Table.Th style={{maxWidth: 130, width: 130}}>Personalizzato</Table.Th>
238
- <Table.Th style={{maxWidth: 80, width: 80}}>Azioni</Table.Th>
239
- </Table.Tr>
240
- </Table.Thead>
241
- <tbody>
242
- {permissions.map((element, i) => {
243
- return (
244
- <Table.Tr key={i}>
245
- <Table.Td>{element.id}</Table.Td>
246
- <Table.Td>{`${element.scope}.${element.packageName}.${element.namespace}`}</Table.Td>
247
- <Table.Td>{element.identifier}</Table.Td>
248
- <Table.Td>{element.description}</Table.Td>
249
- <Table.Td style={{maxWidth: 130, width: 130}}>
250
- {element.isCustom ?
251
- <Badge w={'100%'} color={'green'}>Si</Badge> :
252
- <Badge w={'100%'} color={'red'}>No</Badge>
253
- }
254
- </Table.Td>
255
- <Table.Td style={{maxWidth: 130, width: 130}}>
256
- <ActionIcon
257
- onClick={() => deleteCustomPermission(element.id)}
258
- disabled={!element.isCustom}>
259
- <IconTrash size={18} />
260
- </ActionIcon>
261
- </Table.Td>
262
- </Table.Tr>
263
- )
264
- })}
265
- </tbody>
266
- </Table>
267
- </Stack>
268
- }
269
-
270
-
271
-
272
- <Modal centered opened={updatePermissionModal} onClose={() => {
273
- setUpdatePermissionModal(false);
274
- }} title="Aggiorna permessi">
275
- <UpdatePermission onUpdated={() => {
276
- setUpdatePermissionModal(false)
277
- }} onCanceled={() => setUpdatePermissionModal(false)} />
278
- </Modal>
279
-
280
- <Modal centered opened={createPermissionScopeModalOpened} onClose={() => {
281
- setCreatePermissionScopeModalOpened(false);
282
- }} title="Crea nuovo scope">
283
- <CreateScopeForm
284
- permissionScopes={permissionScopes}
285
- onCreated={() => { setCreatePermissionScopeModalOpened(false); loadPermissionScopes() }}
286
- onCanceled={() => {setCreatePermissionScopeModalOpened(false)}}
287
- />
288
- </Modal>
289
-
290
- <Modal centered opened={createCustomPermissionModalOpened} onClose={() => {
291
- setCreatePermissionScopeModalOpened(false);
292
- }} title="Crea nuovo permesso custom">
293
- <CreateCustomPermissionForm
294
- permissionScope={permissionScopes.filter(a => a.scope === currentScope && a.packageName === currentPackageName && a.namespace === currentNamespace)[0]}
295
- onCreated={() => {setCreateCustomPermissionModalOpened(false); getPermissionInScope()}}
296
- onCanceled={() => {setCreateCustomPermissionModalOpened(false)}}
297
- />
298
- </Modal>
299
-
300
- </Stack>
301
-
302
- </DataCard>
303
- )
304
- }