@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.
- package/index.esm.css +115 -0
- package/index.esm.d.ts +1 -0
- package/index.esm.js +68195 -0
- package/package.json +13 -2
- package/src/index.d.ts +1 -0
- package/src/lib/app.d.ts +16 -0
- package/src/lib/components/error-page/404.d.ts +1 -0
- package/src/lib/components/routes/main-routes.d.ts +6 -0
- package/src/lib/layouts/blank/blank-layout.d.ts +2 -0
- package/src/lib/layouts/main/app-bar.d.ts +9 -0
- package/src/lib/layouts/main/app-layout.d.ts +5 -0
- package/src/lib/layouts/main/content.d.ts +2 -0
- package/src/lib/layouts/main/footer-bar.d.ts +5 -0
- package/src/lib/layouts/main/navbar-item.d.ts +12 -0
- package/src/lib/layouts/main/navbar.d.ts +1 -0
- package/src/lib/layouts/main/search-bar.d.ts +5 -0
- package/src/lib/layouts/main/shell-spotlight.d.ts +2 -0
- package/src/lib/models/app-jit.d.ts +5 -0
- package/src/lib/pages/general/fluxo-plugin-loader.d.ts +7 -0
- package/src/lib/pages/login/account-confirmation.d.ts +2 -0
- package/src/lib/pages/login/change-password.d.ts +2 -0
- package/src/lib/pages/login/forgot-password.d.ts +2 -0
- package/src/lib/pages/login/login-page.d.ts +2 -0
- package/src/lib/pages/login/reset-password.d.ts +2 -0
- package/src/lib/pages/settings/apps/add-jit-app.d.ts +5 -0
- package/src/lib/pages/settings/apps/app-item.d.ts +10 -0
- package/src/lib/pages/settings/apps/app-jit-item.d.ts +8 -0
- package/src/lib/pages/settings/apps/apps-list.d.ts +6 -0
- package/src/lib/pages/settings/apps/embedded-module-item.d.ts +10 -0
- package/src/lib/pages/settings/apps/install-or-upgrade-app.d.ts +6 -0
- package/src/lib/pages/settings/menu-designer/custom-node.d.ts +14 -0
- package/src/lib/pages/settings/menu-designer/menu-create-form.d.ts +5 -0
- package/src/lib/pages/settings/menu-designer/menu-designer.d.ts +1 -0
- package/src/lib/pages/settings/menu-designer/menu-item-edit.d.ts +8 -0
- package/src/lib/pages/settings/menu-designer/placeholder.d.ts +8 -0
- package/src/lib/pages/settings/security/components/domani-role/domain-role-form.d.ts +6 -0
- package/src/lib/pages/settings/security/components/domani-role/domain-role-grid.d.ts +1 -0
- package/src/lib/pages/settings/security/components/permission/create-custom-permission-form.d.ts +7 -0
- package/src/lib/pages/settings/security/components/permission/create-scope-form.d.ts +7 -0
- package/src/lib/pages/settings/security/components/permission/permission-grid.d.ts +1 -0
- package/src/lib/pages/settings/security/components/permission/permission-navigator.d.ts +8 -0
- package/src/lib/pages/settings/security/components/permission/update-permission.d.ts +5 -0
- package/src/lib/pages/settings/security/components/route-rule/route-rule-create-form.d.ts +7 -0
- package/src/lib/pages/settings/security/components/route-rule/route-rule-grid.d.ts +1 -0
- package/src/lib/pages/settings/security/components/user/user-form.d.ts +7 -0
- package/src/lib/pages/settings/security/components/user/users-grid.d.ts +1 -0
- package/src/lib/pages/settings/settings.d.ts +6 -0
- package/src/lib/pages/settings/token/token-row.d.ts +7 -0
- package/src/lib/pages/settings/token/tokens.d.ts +2 -0
- package/src/lib/pages/settings/ui/ui.d.ts +1 -0
- package/src/lib/services/app-jit-manager.d.ts +10 -0
- package/src/lib/services/app-menu.service.d.ts +5 -0
- package/src/lib/utils/icon-factory.d.ts +9 -0
- package/src/lib/utils/security/only-not-logged-route.d.ts +2 -0
- package/src/lib/utils/security/protected-route.d.ts +2 -0
- package/.babelrc +0 -12
- package/.eslintrc.json +0 -18
- package/jest.config.ts +0 -11
- package/project.json +0 -43
- package/src/index.ts +0 -1
- package/src/lib/app.module.css +0 -1
- package/src/lib/app.spec.tsx +0 -17
- package/src/lib/app.tsx +0 -374
- package/src/lib/components/error-page/404.tsx +0 -16
- package/src/lib/components/routes/main-routes.tsx +0 -26
- package/src/lib/layouts/blank/blank-layout.tsx +0 -10
- package/src/lib/layouts/main/app-bar.tsx +0 -192
- package/src/lib/layouts/main/app-layout.tsx +0 -52
- package/src/lib/layouts/main/content.tsx +0 -10
- package/src/lib/layouts/main/footer-bar.tsx +0 -76
- package/src/lib/layouts/main/navbar-item.module.css +0 -49
- package/src/lib/layouts/main/navbar-item.tsx +0 -129
- package/src/lib/layouts/main/navbar.tsx +0 -38
- package/src/lib/layouts/main/search-bar.tsx +0 -44
- package/src/lib/layouts/main/shell-spotlight.tsx +0 -58
- package/src/lib/models/app-jit.ts +0 -6
- package/src/lib/pages/general/fluxo-plugin-loader.tsx +0 -22
- package/src/lib/pages/login/account-confirmation.tsx +0 -86
- package/src/lib/pages/login/change-password.tsx +0 -58
- package/src/lib/pages/login/forgot-password.tsx +0 -53
- package/src/lib/pages/login/login-page.tsx +0 -70
- package/src/lib/pages/login/reset-password.tsx +0 -91
- package/src/lib/pages/settings/apps/add-jit-app.tsx +0 -79
- package/src/lib/pages/settings/apps/app-item.tsx +0 -157
- package/src/lib/pages/settings/apps/app-jit-item.tsx +0 -105
- package/src/lib/pages/settings/apps/apps-list.tsx +0 -171
- package/src/lib/pages/settings/apps/embedded-module-item.tsx +0 -66
- package/src/lib/pages/settings/apps/install-or-upgrade-app.tsx +0 -105
- package/src/lib/pages/settings/menu-designer/custom-node.module.css +0 -34
- package/src/lib/pages/settings/menu-designer/custom-node.tsx +0 -160
- package/src/lib/pages/settings/menu-designer/menu-create-form.tsx +0 -109
- package/src/lib/pages/settings/menu-designer/menu-designer.module.css +0 -19
- package/src/lib/pages/settings/menu-designer/menu-designer.tsx +0 -463
- package/src/lib/pages/settings/menu-designer/menu-item-edit.tsx +0 -115
- package/src/lib/pages/settings/menu-designer/placeholder.module.css +0 -8
- package/src/lib/pages/settings/menu-designer/placeholder.tsx +0 -13
- package/src/lib/pages/settings/security/components/domani-role/domain-role-form.tsx +0 -67
- package/src/lib/pages/settings/security/components/domani-role/domain-role-grid.tsx +0 -139
- package/src/lib/pages/settings/security/components/permission/create-custom-permission-form.tsx +0 -64
- package/src/lib/pages/settings/security/components/permission/create-scope-form.tsx +0 -158
- package/src/lib/pages/settings/security/components/permission/permission-grid.tsx +0 -304
- package/src/lib/pages/settings/security/components/permission/permission-navigator.tsx +0 -320
- package/src/lib/pages/settings/security/components/permission/update-permission.tsx +0 -54
- package/src/lib/pages/settings/security/components/route-rule/route-rule-create-form.tsx +0 -59
- package/src/lib/pages/settings/security/components/route-rule/route-rule-grid.tsx +0 -229
- package/src/lib/pages/settings/security/components/user/user-form.tsx +0 -123
- package/src/lib/pages/settings/security/components/user/users-grid.tsx +0 -127
- package/src/lib/pages/settings/settings.tsx +0 -298
- package/src/lib/pages/settings/token/token-row.tsx +0 -69
- package/src/lib/pages/settings/token/tokens.tsx +0 -73
- package/src/lib/pages/settings/ui/ui.tsx +0 -149
- package/src/lib/services/app-jit-manager.ts +0 -92
- package/src/lib/services/app-menu.service.ts +0 -35
- package/src/lib/utils/icon-factory.tsx +0 -25
- package/src/lib/utils/security/only-not-logged-route.tsx +0 -17
- package/src/lib/utils/security/protected-route.tsx +0 -47
- package/tsconfig.json +0 -20
- package/tsconfig.lib.json +0 -24
- package/tsconfig.spec.json +0 -20
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
EmbeddedModule, FluxoClientSys
|
|
3
|
-
} from "@fluxo-dev/api-client-base";
|
|
4
|
-
import {Badge, Button, Group, Stack} from "@mantine/core";
|
|
5
|
-
import React from "react";
|
|
6
|
-
import {IconRefresh} from '@tabler/icons-react';
|
|
7
|
-
import {showNotification} from "@mantine/notifications";
|
|
8
|
-
|
|
9
|
-
export interface EmbeddedModuleItemProps {
|
|
10
|
-
app: EmbeddedModule;
|
|
11
|
-
onUpgrade?: (app: EmbeddedModule) => void;
|
|
12
|
-
upgradable: {state: 'uptodate' | 'upgradable' | 'installable', version: string};
|
|
13
|
-
}
|
|
14
|
-
export function EmbeddedModuleItem(props: EmbeddedModuleItemProps) {
|
|
15
|
-
|
|
16
|
-
const [updateInProgress, setUpdateInProgress] = React.useState(false);
|
|
17
|
-
|
|
18
|
-
const installOrUpgrade = () => {
|
|
19
|
-
|
|
20
|
-
setUpdateInProgress(true);
|
|
21
|
-
|
|
22
|
-
FluxoClientSys.Instance.apps.installEmbeddedModule(props.app.getEmbeddedModule())
|
|
23
|
-
.then(() => {
|
|
24
|
-
showNotification({
|
|
25
|
-
title: 'Operazione completata',
|
|
26
|
-
message: `Il modulo (${props.app.name} - ${props.app.version}) è stata installata con successo`,
|
|
27
|
-
color: 'green',
|
|
28
|
-
})
|
|
29
|
-
props.onUpgrade?.(props.app);
|
|
30
|
-
setUpdateInProgress(false);
|
|
31
|
-
})
|
|
32
|
-
.catch(() => {
|
|
33
|
-
showNotification({
|
|
34
|
-
title: 'Operazione fallita',
|
|
35
|
-
message: `Il modulo (${props.app.name} - ${props.app.version}) non è stata installata`,
|
|
36
|
-
color: 'red',
|
|
37
|
-
})
|
|
38
|
-
setUpdateInProgress(false);
|
|
39
|
-
})
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
return (
|
|
43
|
-
<Group justify='space-between' style={{ border: '1px solid #dedede', padding: 15 }}>
|
|
44
|
-
<Group>
|
|
45
|
-
<Stack gap={0}>
|
|
46
|
-
<span>{props.app.description} <small>({props.app.version})</small></span>
|
|
47
|
-
<small>{props.app.name} - <b>{props.app.author}</b></small>
|
|
48
|
-
</Stack>
|
|
49
|
-
</Group>
|
|
50
|
-
<Group>
|
|
51
|
-
{props.upgradable?.state === 'upgradable' &&
|
|
52
|
-
<Button loading={updateInProgress} leftSection={<IconRefresh size={18} />} onClick={installOrUpgrade} color="yellow">Aggiorna → {props.upgradable.version}</Button>
|
|
53
|
-
}
|
|
54
|
-
{props.upgradable?.state === 'uptodate' &&
|
|
55
|
-
<>
|
|
56
|
-
<Badge color="gray">Ultima versione</Badge>
|
|
57
|
-
<Button onClick={installOrUpgrade}>Aggiorna menu</Button>
|
|
58
|
-
</>
|
|
59
|
-
}
|
|
60
|
-
{props.upgradable?.state === 'installable' &&
|
|
61
|
-
<Button loading={updateInProgress} leftSection={<IconRefresh size={18} />} onClick={installOrUpgrade} color="green">Installa → {props.upgradable.version}</Button>
|
|
62
|
-
}
|
|
63
|
-
</Group>
|
|
64
|
-
</Group>
|
|
65
|
-
)
|
|
66
|
-
}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import {Group, Text, useMantineTheme, rem, useMantineColorScheme} from '@mantine/core';
|
|
2
|
-
import React from "react";
|
|
3
|
-
import {IconApps, IconUpload, IconX} from '@tabler/icons-react';
|
|
4
|
-
import {Dropzone, FileWithPath} from "@mantine/dropzone";
|
|
5
|
-
import {FluxoClientSys} from "@fluxo-dev/api-client-base";
|
|
6
|
-
import {showNotification} from "@mantine/notifications";
|
|
7
|
-
|
|
8
|
-
export interface InstallOrUpgradeAppProps {
|
|
9
|
-
onInstall?: () => void;
|
|
10
|
-
mode: 'install' | 'upgrade';
|
|
11
|
-
appIdToUpgrade?: number;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export function InstallOrUpgradeApp(props: InstallOrUpgradeAppProps) {
|
|
15
|
-
const theme = useMantineTheme();
|
|
16
|
-
const colorScheme = useMantineColorScheme();
|
|
17
|
-
|
|
18
|
-
const installApp = (files: FileWithPath[]) => {
|
|
19
|
-
|
|
20
|
-
const formData = new FormData();
|
|
21
|
-
formData.append('file', files[0]);
|
|
22
|
-
|
|
23
|
-
if(props.mode === 'install') {
|
|
24
|
-
FluxoClientSys.Instance.apps.installApp(formData).then(() => {
|
|
25
|
-
showNotification({
|
|
26
|
-
title: 'Operazione completata',
|
|
27
|
-
message: `L'applicazione è stata installata con successo`,
|
|
28
|
-
color: 'green',
|
|
29
|
-
})
|
|
30
|
-
props.onInstall?.();
|
|
31
|
-
}).catch((err) => {
|
|
32
|
-
showNotification({
|
|
33
|
-
title: 'Operazione fallita',
|
|
34
|
-
message: `L'applicazione non è stata installata: ${err.message}`,
|
|
35
|
-
color: 'red',
|
|
36
|
-
})
|
|
37
|
-
})
|
|
38
|
-
} else {
|
|
39
|
-
|
|
40
|
-
if(!props.appIdToUpgrade)
|
|
41
|
-
return;
|
|
42
|
-
|
|
43
|
-
FluxoClientSys.Instance.apps.upgradeApp(props.appIdToUpgrade, formData).then(() => {
|
|
44
|
-
showNotification({
|
|
45
|
-
title: 'Operazione completata',
|
|
46
|
-
message: `L'applicazione è stata aggiornata con successo`,
|
|
47
|
-
color: 'green',
|
|
48
|
-
})
|
|
49
|
-
props.onInstall?.();
|
|
50
|
-
}).catch((err) => {
|
|
51
|
-
showNotification({
|
|
52
|
-
title: 'Operazione fallita',
|
|
53
|
-
message: `L'applicazione non è stata aggiornata: ${err.message}`,
|
|
54
|
-
color: 'red',
|
|
55
|
-
})
|
|
56
|
-
})
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return (
|
|
61
|
-
<Dropzone
|
|
62
|
-
onDrop={installApp}
|
|
63
|
-
onReject={(files) => {
|
|
64
|
-
showNotification({
|
|
65
|
-
title: 'Operazione fallita',
|
|
66
|
-
message: `L'applicazione non è stata installata: ${files[0].file.name} non è un file zip o la dimensione supera i 30mb`,
|
|
67
|
-
color: 'red',
|
|
68
|
-
})
|
|
69
|
-
}}
|
|
70
|
-
maxSize={1024 * 3 * 10000}
|
|
71
|
-
multiple={false}
|
|
72
|
-
accept={['zip']}
|
|
73
|
-
{...props}
|
|
74
|
-
>
|
|
75
|
-
<Group justify="center" gap="xl" style={{ minHeight: rem(220), pointerEvents: 'none' }}>
|
|
76
|
-
<Dropzone.Accept>
|
|
77
|
-
<IconUpload
|
|
78
|
-
size="3.2rem"
|
|
79
|
-
stroke={1.5}
|
|
80
|
-
color={theme.colors[theme.primaryColor][colorScheme.colorScheme === 'dark' ? 4 : 6]}
|
|
81
|
-
/>
|
|
82
|
-
</Dropzone.Accept>
|
|
83
|
-
<Dropzone.Reject>
|
|
84
|
-
<IconX
|
|
85
|
-
size="3.2rem"
|
|
86
|
-
stroke={1.5}
|
|
87
|
-
color={theme.colors.red[colorScheme.colorScheme === 'dark' ? 4 : 6]}
|
|
88
|
-
/>
|
|
89
|
-
</Dropzone.Reject>
|
|
90
|
-
<Dropzone.Idle>
|
|
91
|
-
<IconApps size="3.2rem" stroke={1.5} />
|
|
92
|
-
</Dropzone.Idle>
|
|
93
|
-
|
|
94
|
-
<div>
|
|
95
|
-
<Text size="xl" inline>
|
|
96
|
-
Trascina il bundle dell'applicazione qui.
|
|
97
|
-
</Text>
|
|
98
|
-
<Text size="sm" color="dimmed" inline mt={7}>
|
|
99
|
-
Il bundle deve essere in formato .zip e non deve superare i 30mb.
|
|
100
|
-
</Text>
|
|
101
|
-
</div>
|
|
102
|
-
</Group>
|
|
103
|
-
</Dropzone>
|
|
104
|
-
);
|
|
105
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
.root {
|
|
2
|
-
align-items: center;
|
|
3
|
-
display: grid;
|
|
4
|
-
grid-template-columns: auto auto 1fr auto;
|
|
5
|
-
height: 32px;
|
|
6
|
-
padding-inline-end: 8px;
|
|
7
|
-
cursor: pointer;
|
|
8
|
-
/*border-bottom: solid 1px #eee;*/
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
.root:hover {
|
|
12
|
-
background: #e9ecef54;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
.expandIconWrapper {
|
|
16
|
-
align-items: center;
|
|
17
|
-
font-size: 0;
|
|
18
|
-
cursor: pointer;
|
|
19
|
-
display: flex;
|
|
20
|
-
height: 24px;
|
|
21
|
-
justify-content: center;
|
|
22
|
-
width: 32px;
|
|
23
|
-
transition: transform linear 0.1s;
|
|
24
|
-
transform: rotate(0deg);
|
|
25
|
-
margin-left: 8px;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
.expandIconWrapper.isOpen {
|
|
29
|
-
transform: rotate(90deg);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
.labelGridItem {
|
|
33
|
-
padding-inline-start: 8px;
|
|
34
|
-
}
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
import React, {useState} from "react";
|
|
2
|
-
import { NodeModel } from "@minoru/react-dnd-treeview";
|
|
3
|
-
import styles from "./custom-node.module.css";
|
|
4
|
-
import {
|
|
5
|
-
IconBoxMultiple,
|
|
6
|
-
IconChevronRight, IconEdit,
|
|
7
|
-
IconExternalLink, IconEye,
|
|
8
|
-
IconLock, IconPlus, IconSearch,
|
|
9
|
-
IconTrash
|
|
10
|
-
} from '@tabler/icons-react';
|
|
11
|
-
import {ActionIcon, Badge, Group, Modal, Text, ThemeIcon, Tooltip} from "@mantine/core";
|
|
12
|
-
import {AppMenuItem} from "@fluxo-dev/api-client-base";
|
|
13
|
-
import {IconFactory} from "../../../utils/icon-factory";
|
|
14
|
-
import {PermissionNavigator} from "../security/components/permission/permission-navigator";
|
|
15
|
-
|
|
16
|
-
type Props = {
|
|
17
|
-
nodes: NodeModel<AppMenuItem>[];
|
|
18
|
-
node: NodeModel<AppMenuItem>;
|
|
19
|
-
depth: number;
|
|
20
|
-
isOpen: boolean;
|
|
21
|
-
onToggle: (id: NodeModel["id"]) => void;
|
|
22
|
-
onEditButtonClick: (item: AppMenuItem) => void;
|
|
23
|
-
onDeleteButtonClick: (nodeId: string | number) => void;
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
export const CustomNode: React.FC<Props> = (props) => {
|
|
27
|
-
const { droppable, data } = props.node;
|
|
28
|
-
const indent = props.depth * 24;
|
|
29
|
-
|
|
30
|
-
const [mouseHover, setMouseHover] = useState<boolean>(false);
|
|
31
|
-
const [updatePermissionModalOpen, setUpdatePermissionModalOpen] = useState<boolean>(false);
|
|
32
|
-
const [hasPermission, setHasPermission] = useState<boolean>(props.node!.data!.hasPermissions ?? false);
|
|
33
|
-
|
|
34
|
-
const handleToggle = (e: React.MouseEvent) => {
|
|
35
|
-
e.stopPropagation();
|
|
36
|
-
props.onToggle(props.node.id);
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
const isLeaf = (): boolean => {
|
|
40
|
-
const res = props.nodes.find(a => a.parent === props.node.id);
|
|
41
|
-
|
|
42
|
-
return res !== undefined;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const updatePermissionButton = () => {
|
|
46
|
-
return <ActionIcon color={!props.node.data!.id ? 'red' : hasPermission ? 'green' : undefined} onClick={() => {
|
|
47
|
-
if(!props.node.data!.id) return;
|
|
48
|
-
setUpdatePermissionModalOpen(true);
|
|
49
|
-
}}><IconEye size={16} /></ActionIcon>;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
return (
|
|
53
|
-
<div
|
|
54
|
-
id={props.node.id.toString()}
|
|
55
|
-
className={`tree-node ${styles["root"]}`}
|
|
56
|
-
style={{
|
|
57
|
-
marginLeft: indent,
|
|
58
|
-
marginBottom: 16,
|
|
59
|
-
height: 48,
|
|
60
|
-
border: '1px solid #e9ecef'
|
|
61
|
-
}}
|
|
62
|
-
>
|
|
63
|
-
<div className={styles["expandIconWrapper"]}>
|
|
64
|
-
<ThemeIcon variant="light" size={30}>
|
|
65
|
-
{IconFactory.getIcon(props.node.data!.icon!)}
|
|
66
|
-
</ThemeIcon>
|
|
67
|
-
</div>
|
|
68
|
-
|
|
69
|
-
<div className={styles["labelGridItem"]}
|
|
70
|
-
onClick={handleToggle}>
|
|
71
|
-
<Text variant="text" size={'xs'}>{`${props.node.text}`}</Text>
|
|
72
|
-
</div>
|
|
73
|
-
|
|
74
|
-
<div
|
|
75
|
-
onClick={handleToggle}
|
|
76
|
-
style={{width: isLeaf() ? 24 : 8}}
|
|
77
|
-
className={`${styles["expandIconWrapper"]} ${
|
|
78
|
-
props.isOpen ? styles["isOpen"] : ""
|
|
79
|
-
}`}
|
|
80
|
-
>
|
|
81
|
-
{isLeaf() && (
|
|
82
|
-
<div onClick={handleToggle}>
|
|
83
|
-
<IconChevronRight size={16} />
|
|
84
|
-
</div>
|
|
85
|
-
)}
|
|
86
|
-
</div>
|
|
87
|
-
|
|
88
|
-
<div>
|
|
89
|
-
<Group gap={8}>
|
|
90
|
-
|
|
91
|
-
{props.node.data?.isProtectedByRule &&
|
|
92
|
-
<Badge leftSection={
|
|
93
|
-
<ActionIcon size="xs" radius="xl" variant="transparent">
|
|
94
|
-
<IconLock size={12} />
|
|
95
|
-
</ActionIcon>
|
|
96
|
-
}>Regola attiva</Badge>
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
{!props.node.data!.id &&
|
|
100
|
-
<Badge color={'green'} leftSection={
|
|
101
|
-
<ActionIcon size="xs" radius="xl" variant="transparent">
|
|
102
|
-
<IconPlus color={'green'} size={12} />
|
|
103
|
-
</ActionIcon>
|
|
104
|
-
}>Nuovo</Badge>
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
{props.node.data?.isGroup &&
|
|
108
|
-
<Badge color={'red'} leftSection={
|
|
109
|
-
<ActionIcon size="xs" radius="xl" variant="transparent">
|
|
110
|
-
<IconBoxMultiple color={'red'} size={12} />
|
|
111
|
-
</ActionIcon>
|
|
112
|
-
}>Gruppo</Badge>
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
{!props.node.data?.isGroup && props.node.data?.hasIndex &&
|
|
116
|
-
<Badge color={'yellow'} leftSection={
|
|
117
|
-
<ActionIcon size="xs" radius="xl" variant="transparent">
|
|
118
|
-
<IconSearch color={'orange'} size={12} />
|
|
119
|
-
</ActionIcon>
|
|
120
|
-
}>Indicizzato</Badge>
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
{props.node.data?.featureIdentifier === 'webclient.routing.externallink' &&
|
|
124
|
-
<Badge color={'green'} leftSection={
|
|
125
|
-
<ActionIcon size="xs" radius="xl" variant="transparent">
|
|
126
|
-
<IconExternalLink color={'green'} size={12} />
|
|
127
|
-
</ActionIcon>
|
|
128
|
-
}>Esterno</Badge>
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
{!props.node.data?.id ?
|
|
132
|
-
<Tooltip label={"Devi salvare il menu prima di impostare i permessi"}>
|
|
133
|
-
{updatePermissionButton()}
|
|
134
|
-
</Tooltip> :
|
|
135
|
-
<>{updatePermissionButton()}</>
|
|
136
|
-
}
|
|
137
|
-
<ActionIcon onClick={() => props.onEditButtonClick(props.node.data!)}><IconEdit size={16} /></ActionIcon>
|
|
138
|
-
<ActionIcon onClick={() => props.onDeleteButtonClick(props.node.id)}><IconTrash size={16} /></ActionIcon>
|
|
139
|
-
</Group>
|
|
140
|
-
</div>
|
|
141
|
-
|
|
142
|
-
{props.node!.data!.id &&
|
|
143
|
-
<Modal
|
|
144
|
-
size={'60%'}
|
|
145
|
-
centered
|
|
146
|
-
opened={updatePermissionModalOpen}
|
|
147
|
-
onClose={() => {
|
|
148
|
-
setUpdatePermissionModalOpen(false);
|
|
149
|
-
}}
|
|
150
|
-
title={`Gestione permessi ${props.node!.data!.label}`}>
|
|
151
|
-
<PermissionNavigator
|
|
152
|
-
context={{type: 'menu', id: props.node!.data!.id!.toString()}}
|
|
153
|
-
onUpdate={(pc) => setHasPermission(pc > 0)}
|
|
154
|
-
/>
|
|
155
|
-
</Modal>
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
</div>
|
|
159
|
-
);
|
|
160
|
-
};
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import {Button, Group, Select, Stack, TextInput} from "@mantine/core";
|
|
2
|
-
import {useCallback, useEffect, useState} from "react";
|
|
3
|
-
import {AppMenuContextType, DomainRole, FluxoClientSys, User} from "@fluxo-dev/api-client-base";
|
|
4
|
-
import {showNotification} from "@mantine/notifications";
|
|
5
|
-
|
|
6
|
-
export interface MenuCreateFormProps {
|
|
7
|
-
onCreated: () => void;
|
|
8
|
-
onCancel: () => void;
|
|
9
|
-
}
|
|
10
|
-
export function MenuCreateForm(props: MenuCreateFormProps) {
|
|
11
|
-
|
|
12
|
-
const [context, setContext] = useState<string | null>('1');
|
|
13
|
-
const [user, setUser] = useState<string | null>();
|
|
14
|
-
const [role, setRole] = useState<string | null>();
|
|
15
|
-
const [name, setName] = useState<string>();
|
|
16
|
-
|
|
17
|
-
const [roles, setRoles] = useState<DomainRole[]>([]);
|
|
18
|
-
const [users, setUsers] = useState<User[]>([]);
|
|
19
|
-
|
|
20
|
-
useEffect(() => {
|
|
21
|
-
FluxoClientSys.Instance.security.domainRole.find(999,0).then((roles) => {
|
|
22
|
-
setRoles(roles.results);
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
FluxoClientSys.Instance.security.user.getAllUsers().then((users) => {
|
|
26
|
-
setUsers(users);
|
|
27
|
-
})
|
|
28
|
-
}, []);
|
|
29
|
-
|
|
30
|
-
const saveButtonIsDisabled = useCallback(() => {
|
|
31
|
-
if(context === '1' && !role) return true;
|
|
32
|
-
if(context === '2' && !user) return true;
|
|
33
|
-
if(!name) return true;
|
|
34
|
-
|
|
35
|
-
return false;
|
|
36
|
-
}, [context, role, user, name]);
|
|
37
|
-
|
|
38
|
-
const onSubmit = () => {
|
|
39
|
-
if(saveButtonIsDisabled()) return;
|
|
40
|
-
|
|
41
|
-
FluxoClientSys.Instance.configuration.createAppMenu({
|
|
42
|
-
contextType: context === '1' ? AppMenuContextType.DomainRole : AppMenuContextType.User,
|
|
43
|
-
name: name!,
|
|
44
|
-
domainRoleId: context === '1' ? +role! : 0,
|
|
45
|
-
copyItemsFromWebMenuId: 0,
|
|
46
|
-
userId: context === '2' ? user! : undefined,
|
|
47
|
-
}).then(() => {
|
|
48
|
-
props.onCreated();
|
|
49
|
-
showNotification({
|
|
50
|
-
title: 'Menu creato',
|
|
51
|
-
message: 'Il menu è stato creato con successo',
|
|
52
|
-
color: 'green',
|
|
53
|
-
autoClose: 5000,
|
|
54
|
-
})
|
|
55
|
-
})
|
|
56
|
-
.catch((err) => {
|
|
57
|
-
showNotification({
|
|
58
|
-
title: 'Errore',
|
|
59
|
-
message: 'Si è verificato un errore durante la creazione del menu',
|
|
60
|
-
color: 'red',
|
|
61
|
-
autoClose: 5000,
|
|
62
|
-
})
|
|
63
|
-
})
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
return (
|
|
67
|
-
<Stack>
|
|
68
|
-
<TextInput
|
|
69
|
-
label={'Descrizione'}
|
|
70
|
-
value={name}
|
|
71
|
-
onChange={(e) => setName(e.currentTarget.value)}
|
|
72
|
-
placeholder={'Ruolo amministrazione'} />
|
|
73
|
-
<Select
|
|
74
|
-
allowDeselect={false}
|
|
75
|
-
label={'Contesto'}
|
|
76
|
-
value={context}
|
|
77
|
-
description={'Seleziona il contesto in cui il menu sarà visibile (Ruolo o Utente)'}
|
|
78
|
-
onChange={(value) => setContext(value)}
|
|
79
|
-
data={[{label: 'Ruolo', value: '1'}, {label: 'Utente', value: '2'}]}
|
|
80
|
-
/>
|
|
81
|
-
|
|
82
|
-
{context === '1' &&
|
|
83
|
-
<Select
|
|
84
|
-
label={'Ruolo'}
|
|
85
|
-
value={role}
|
|
86
|
-
onChange={(value) => setRole(value)}
|
|
87
|
-
description={'Seleziona il ruolo a cui il menu sarà visibile'}
|
|
88
|
-
data={roles.map((role) => ({label: `${role.name} (${role.identifier})`, value: role.id!.toString()}))}
|
|
89
|
-
/>
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
{context === '2' &&
|
|
93
|
-
<Select
|
|
94
|
-
label={'Utente'}
|
|
95
|
-
value={user}
|
|
96
|
-
onChange={(value) => setUser(value)}
|
|
97
|
-
description={'Seleziona l\'utente a cui il menu sarà visibile'}
|
|
98
|
-
data={users.map((user) => ({label: `${user.userData.FirstName} ${user.userData.LastName} (${user.email})`, value: user.id!.toString()}))}
|
|
99
|
-
/>
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
<Group justify={'end'}>
|
|
103
|
-
<Button onClick={props.onCancel} variant={'outline'}>Annulla</Button>
|
|
104
|
-
<Button disabled={saveButtonIsDisabled()} onClick={onSubmit}>Salva</Button>
|
|
105
|
-
</Group>
|
|
106
|
-
|
|
107
|
-
</Stack>
|
|
108
|
-
)
|
|
109
|
-
}
|