@topconsultnpm/sdkui-react-beta 6.12.36 → 6.12.38
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/lib/components/base/Styled.d.ts +12 -0
- package/lib/components/base/Styled.js +49 -3
- package/lib/components/base/TMFloatingToolbar.d.ts +9 -0
- package/lib/components/base/TMFloatingToolbar.js +99 -0
- package/lib/components/base/TMRightSidebar.d.ts +0 -4
- package/lib/components/base/TMRightSidebar.js +2 -10
- package/lib/components/base/TMShowAllOrMaxItemsButton.d.ts +8 -0
- package/lib/components/base/TMShowAllOrMaxItemsButton.js +14 -0
- package/lib/components/base/TMTreeView.d.ts +27 -0
- package/lib/components/base/TMTreeView.js +199 -0
- package/lib/components/grids/TMBlogs.d.ts +84 -0
- package/lib/components/grids/TMBlogs.js +566 -0
- package/lib/components/grids/TMBlogsUtils.d.ts +83 -0
- package/lib/components/grids/TMBlogsUtils.js +258 -0
- package/lib/components/index.d.ts +2 -0
- package/lib/components/index.js +2 -0
- package/lib/components/query/TMBatchUpdateForm.d.ts +12 -0
- package/lib/components/query/TMBatchUpdateForm.js +149 -0
- package/lib/components/query/TMDcmtBlog.d.ts +7 -0
- package/lib/components/query/TMDcmtBlog.js +33 -0
- package/lib/components/query/TMDcmtForm.d.ts +32 -0
- package/lib/components/query/TMDcmtForm.js +544 -0
- package/lib/components/query/TMDcmtIcon.d.ts +10 -0
- package/lib/components/query/TMDcmtIcon.js +52 -0
- package/lib/components/query/TMDcmtPreview.d.ts +26 -0
- package/lib/components/query/TMDcmtPreview.js +200 -0
- package/lib/components/query/TMFileUploader.d.ts +11 -0
- package/lib/components/query/TMFileUploader.js +101 -0
- package/lib/components/query/TMMasterDetailDcmts.d.ts +23 -0
- package/lib/components/query/TMMasterDetailDcmts.js +475 -0
- package/lib/components/query/TMQueryEditor.js +2 -2
- package/lib/components/query/TMQueryResultForm.d.ts +1 -7
- package/lib/components/query/TMQueryResultForm.js +1 -9
- package/lib/components/query/TMWorkflowPopup.d.ts +29 -0
- package/lib/components/query/TMWorkflowPopup.js +131 -0
- package/lib/components/search/TMSearchResult.d.ts +31 -0
- package/lib/components/search/TMSearchResult.js +727 -0
- package/lib/components/search/TMSearchResultsMenuItems.d.ts +6 -0
- package/lib/components/search/TMSearchResultsMenuItems.js +376 -0
- package/lib/helper/Enum_Localizator.d.ts +2 -1
- package/lib/helper/Enum_Localizator.js +20 -1
- package/lib/helper/SDKUI_Localizator.d.ts +24 -0
- package/lib/helper/SDKUI_Localizator.js +240 -0
- package/lib/helper/dcmtsHelper.d.ts +4 -0
- package/lib/helper/dcmtsHelper.js +15 -0
- package/lib/helper/helpers.d.ts +2 -1
- package/lib/helper/helpers.js +74 -1
- package/lib/helper/queryHelper.d.ts +7 -1
- package/lib/helper/queryHelper.js +105 -1
- package/lib/hooks/useDcmtOperations.d.ts +24 -0
- package/lib/hooks/useDcmtOperations.js +387 -0
- package/lib/hooks/useInputDialog.d.ts +5 -0
- package/lib/hooks/useInputDialog.js +73 -0
- package/lib/hooks/usePreventFileDrop.d.ts +3 -0
- package/lib/hooks/usePreventFileDrop.js +37 -0
- package/lib/index.d.ts +0 -1
- package/lib/index.js +0 -1
- package/lib/services/platform_services.d.ts +1 -1
- package/lib/ts/types.d.ts +54 -1
- package/lib/ts/types.js +34 -0
- package/package.json +1 -1
@@ -0,0 +1,544 @@
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
2
|
+
import { useEffect, useMemo, useState } from 'react';
|
3
|
+
import styled from 'styled-components';
|
4
|
+
import TMDcmtPreview from './TMDcmtPreview';
|
5
|
+
import { ArchiveConstraints, ArchiveEngineByID, DcmtTypeListCacheService, LayoutModes, LocalStorageService, MetadataDataTypes, ResultTypes, SDK_Globals, SystemMIDsAsNumber, TemplateTIDs, UpdateEngineByID, ValidationItem } from '@topconsultnpm/sdk-ts-beta';
|
6
|
+
import { ContextMenu } from 'devextreme-react';
|
7
|
+
import { WorkFlowApproveRejectPopUp, WorkFlowOperationButtons, WorkFlowReAssignPopUp } from './TMWorkflowPopup';
|
8
|
+
import { FormModes } from '../../ts';
|
9
|
+
import { DeviceType, useDeviceType } from '../base/TMDeviceProvider';
|
10
|
+
import { useDcmtOperations } from '../../hooks/useDcmtOperations';
|
11
|
+
import { handleArchiveVisibility, searchResultToMetadataValues } from '../../helper/queryHelper';
|
12
|
+
import { genUniqueId, IconCloseCircle, IconShow, SDKUI_Localizator, IconBoard, IconDcmtTypeSys, IconDataList, IconDetailDcmts, svgToString, IconDownload, IconHide, calcIsModified, IconMenuVertical, Globalization, getListMaxItems, getSystemMetadata, IconBoxArchiveIn, IconClear, IconUndo } from '../../helper';
|
13
|
+
import { hasDetailRelations, hasMasterRelations } from '../../helper/dcmtsHelper';
|
14
|
+
import { TMColors } from '../../utils/theme';
|
15
|
+
import { StyledFormButtonsContainer, StyledModalContainer, StyledToolbarCardContainer } from '../base/Styled';
|
16
|
+
import ShowAlert from '../base/TMAlert';
|
17
|
+
import TMButton from '../base/TMButton';
|
18
|
+
import { TMSplitterLayout, TMLayoutItem } from '../base/TMLayout';
|
19
|
+
import { TMExceptionBoxManager, TMMessageBoxManager, ButtonNames } from '../base/TMPopUp';
|
20
|
+
import TMSpinner from '../base/TMSpinner';
|
21
|
+
import TMToolbarCard from '../base/TMToolbarCard';
|
22
|
+
import { TMLayoutWaitingContainer } from '../base/TMWaitPanel';
|
23
|
+
import TMDistinctValues from '../choosers/TMDistinctValues';
|
24
|
+
import TMFormulaEditor, { FormulaDescriptor, FormulaHelper, FormulaTargets } from '../editors/TMFormulaEditor';
|
25
|
+
import TMMetadataValues, { AdvancedMenuButtons } from '../editors/TMMetadataValues';
|
26
|
+
import { TMSaveFormButtonPrevious, TMSaveFormButtonNext, TMSaveFormButtonSave, TMSaveFormButtonUndo } from '../forms/TMSaveForm';
|
27
|
+
import TMShowAllOrMaxItemsButton from '../base/TMShowAllOrMaxItemsButton';
|
28
|
+
import TMFileUploader from './TMFileUploader';
|
29
|
+
import TMMasterDetailDcmts from './TMMasterDetailDcmts';
|
30
|
+
import TMDcmtBlog from './TMDcmtBlog';
|
31
|
+
let abortControllerLocal = new AbortController();
|
32
|
+
//#endregion
|
33
|
+
const TMDcmtForm = ({ showHeader = true, onSaveRecents, layoutMode = LayoutModes.Update, onClose, onSavedAsyncCallback, TID, DID, formMode = FormModes.Update, canNext, canPrev, count, itemIndex, onNext, onPrev, customRightSidebarItems = [], allowNavigation = true, allowRelations = true, isClosable = false, showDcmtForm = true, showDcmtFormSidebar = true, showPreview = false, showBoard = false, showSysMetadata = false, onClosePreview }) => {
|
34
|
+
const mruTIDs = LocalStorageService.getItem(`ARCHIVEPAGE_MRU_TIDS_${SDK_Globals.tmSession?.SessionDescr?.archiveID}_${SDK_Globals.tmSession?.SessionDescr?.userID}`);
|
35
|
+
const [id, setID] = useState('');
|
36
|
+
const [showWaitPanelLocal, setShowWaitPanelLocal] = useState(false);
|
37
|
+
const [waitPanelTitleLocal, setWaitPanelTitleLocal] = useState('');
|
38
|
+
const [showPrimaryLocal, setShowPrimaryLocal] = useState(false);
|
39
|
+
const [waitPanelTextPrimaryLocal, setWaitPanelTextPrimaryLocal] = useState('');
|
40
|
+
const [waitPanelValuePrimaryLocal, setWaitPanelValuePrimaryLocal] = useState(0);
|
41
|
+
const [waitPanelMaxValuePrimaryLocal, setWaitPanelMaxValuePrimaryLocal] = useState(0);
|
42
|
+
const [showSecondaryLocal, setShowSecondaryLocal] = useState(false);
|
43
|
+
const [waitPanelTextSecondaryLocal, setWaitPanelTextSecondaryLocal] = useState('');
|
44
|
+
const [waitPanelValueSecondaryLocal, setWaitPanelValueSecondaryLocal] = useState(0);
|
45
|
+
const [waitPanelMaxValueSecondaryLocal, setWaitPanelMaxValueSecondaryLocal] = useState(0);
|
46
|
+
const [useWaitPanelLocalState, setUseWaitPanelLocalState] = useState(false);
|
47
|
+
const [formData, setFormData] = useState([]);
|
48
|
+
const [formDataOrig, setFormDataOrig] = useState([]);
|
49
|
+
const [validationItems, setValidationItems] = useState([]);
|
50
|
+
const [changedMetadata, setChangedMetadata] = useState([]);
|
51
|
+
const [fromDTD, setFromDTD] = useState();
|
52
|
+
const [showAdvancedMenu, setShowAdvancedMenu] = useState(false);
|
53
|
+
const [showApprovePopup, setShowApprovePopup] = useState(false);
|
54
|
+
const [showRejectPopup, setShowRejectPopup] = useState(false);
|
55
|
+
const [showReAssignPopup, setShowReAssignPopup] = useState(false);
|
56
|
+
const [isOpenDetails, setIsOpenDetails] = useState(false);
|
57
|
+
const [isOpenMaster, setIsOpenMaster] = useState(false);
|
58
|
+
const [secondaryMasterDcmts, setSecondaryMasterDcmts] = useState([]);
|
59
|
+
const [isOpenDcmtForm, setIsOpenDcmtForm] = useState(false);
|
60
|
+
const [isOpenPreview, setIsOpenPreview] = useState(false);
|
61
|
+
const [isOpenSysMetadata, setIsOpenSysMetadata] = useState(false);
|
62
|
+
const [isOpenBoard, setIsOpenBoard] = useState(false);
|
63
|
+
const [isOpenDistinctValues, setIsOpenDistinctValues] = useState(false);
|
64
|
+
const [isOpenFormulaEditor, setIsOpenFormulaEditor] = useState(false);
|
65
|
+
const [isOpenTags, setIsOpenTags] = useState(false);
|
66
|
+
const [currentTIDHasDetailRelations, setCurrentTIDHasDetailRelations] = useState();
|
67
|
+
const [currentTIDHasMasterRelations, setCurrentTIDHasMasterRelations] = useState();
|
68
|
+
const [currentDcmt, setCurrentDcmt] = useState();
|
69
|
+
const [dcmtFile, setDcmtFile] = useState(null);
|
70
|
+
const [focusedMetadataValue, setFocusedMetadataValue] = useState();
|
71
|
+
const [showAll, setShowAll] = useState(false);
|
72
|
+
const { abortController, showWaitPanel, waitPanelTitle, showPrimary, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, downloadDcmtsAsync } = useDcmtOperations();
|
73
|
+
const deviceType = useDeviceType();
|
74
|
+
const isOpenMiddlePanel = () => isOpenSysMetadata || isOpenBoard || isOpenTags || isOpenDistinctValues || isOpenFormulaEditor;
|
75
|
+
const retrieveMetadataAsync = async () => {
|
76
|
+
try {
|
77
|
+
await DcmtTypeListCacheService.GetAsync(TID).then(async (dtd) => {
|
78
|
+
setFromDTD(dtd);
|
79
|
+
let mdList = dtd?.metadata ?? [];
|
80
|
+
if (layoutMode === LayoutModes.Update || (layoutMode === LayoutModes.Ark && DID)) {
|
81
|
+
await setMetadataListAsync(mdList);
|
82
|
+
}
|
83
|
+
else {
|
84
|
+
const renderedMetadata = dtd?.metadata?.filter((metadata) => handleArchiveVisibility(metadata)) ?? [];
|
85
|
+
const metadataList = searchResultToMetadataValues(dtd?.id, undefined, [], [], renderedMetadata, layoutMode);
|
86
|
+
setFormDataOrig(structuredClone(metadataList));
|
87
|
+
setFormData(structuredClone(metadataList));
|
88
|
+
}
|
89
|
+
layoutMode === LayoutModes.Ark && resetHandler();
|
90
|
+
});
|
91
|
+
}
|
92
|
+
catch (e) {
|
93
|
+
let err = e;
|
94
|
+
TMExceptionBoxManager.show({ exception: err });
|
95
|
+
}
|
96
|
+
};
|
97
|
+
useEffect(() => { setID(genUniqueId()); }, []);
|
98
|
+
useEffect(() => {
|
99
|
+
retrieveMetadataAsync();
|
100
|
+
}, [TID, DID]);
|
101
|
+
useEffect(() => {
|
102
|
+
if (formData.length > 0) {
|
103
|
+
setValidationItems(validateMetadataList(formData));
|
104
|
+
let changes = getSpecificChangedKeysWithValues(formDataOrig, formData);
|
105
|
+
setChangedMetadata(changes);
|
106
|
+
const newDcmt = {
|
107
|
+
tid: formData.find(o => o.mid == SystemMIDsAsNumber.TID)?.value,
|
108
|
+
did: formData.find(o => o.mid == SystemMIDsAsNumber.DID)?.value,
|
109
|
+
fileCount: formData.find(o => o.mid == SystemMIDsAsNumber.FileCount)?.value,
|
110
|
+
fileSize: formData.find(o => o.mid == SystemMIDsAsNumber.FileSize)?.value,
|
111
|
+
fileExt: formData.find(o => o.mid == SystemMIDsAsNumber.FileExt)?.value
|
112
|
+
};
|
113
|
+
if (!currentDcmt ||
|
114
|
+
currentDcmt.tid !== newDcmt.tid ||
|
115
|
+
currentDcmt.did !== newDcmt.did ||
|
116
|
+
currentDcmt.fileExt !== newDcmt.fileExt ||
|
117
|
+
currentDcmt.fileSize !== newDcmt.fileSize ||
|
118
|
+
currentDcmt.fileCount !== newDcmt.fileCount) {
|
119
|
+
setCurrentDcmt(newDcmt);
|
120
|
+
}
|
121
|
+
}
|
122
|
+
}, [formData]);
|
123
|
+
useEffect(() => { setIsOpenBoard(showBoard); }, [showBoard]);
|
124
|
+
useEffect(() => { setIsOpenSysMetadata(showSysMetadata); }, [showSysMetadata]);
|
125
|
+
useEffect(() => { setIsOpenDcmtForm(showDcmtForm); }, [showDcmtForm]);
|
126
|
+
useEffect(() => { setIsOpenPreview(showPreview); }, [showPreview]);
|
127
|
+
useEffect(() => {
|
128
|
+
hasDetailRelations(TID).then((value) => setCurrentTIDHasDetailRelations(value));
|
129
|
+
hasMasterRelations(TID).then((value) => setCurrentTIDHasMasterRelations(value));
|
130
|
+
}, [TID]);
|
131
|
+
useEffect(() => {
|
132
|
+
if (layoutMode !== LayoutModes.Ark)
|
133
|
+
return;
|
134
|
+
setFocusedMetadataValue(undefined);
|
135
|
+
}, [fromDTD, layoutMode]);
|
136
|
+
const fileIsNotValid = (fromDTD?.archiveConstraint === ArchiveConstraints.ContentCompulsory && !dcmtFile);
|
137
|
+
const sideBarItems = useMemo(() => {
|
138
|
+
let fixedItems = [
|
139
|
+
{ icon: (layoutMode === LayoutModes.Ark && fileIsNotValid) ? _jsx(IconCloseCircle, { color: TMColors.error }) : _jsx(IconShow, {}), id: 'Preview', visibleName: (layoutMode === LayoutModes.Ark && fileIsNotValid) ? SDKUI_Localizator.RequiredField : 'Anteprima', isActive: isOpenPreview, onClick: () => { setIsOpenPreview(!isOpenPreview); }, disabled: layoutMode === LayoutModes.Ark && fromDTD?.archiveConstraint === ArchiveConstraints.OnlyMetadata },
|
140
|
+
{ icon: _jsx(IconBoard, {}), id: 'Board', visibleName: 'Bacheca', disabled: layoutMode !== LayoutModes.Update, beginGroup: true, isActive: isOpenBoard, visible: layoutMode !== LayoutModes.Ark, onClick: () => { closeMiddlePanel(); setIsOpenBoard(!isOpenBoard); } },
|
141
|
+
{ icon: _jsx(IconDcmtTypeSys, {}), id: 'SystemMetadata', visibleName: 'Metadati di sistema', disabled: layoutMode !== LayoutModes.Update, isActive: isOpenSysMetadata, visible: layoutMode !== LayoutModes.Ark, onClick: () => { closeMiddlePanel(); setIsOpenSysMetadata(!isOpenSysMetadata); } },
|
142
|
+
{ icon: _jsx(IconDataList, {}), id: 'DistinctValues', disabled: !focusedMetadataValue, visibleName: 'Valori distiniti', isActive: isOpenDistinctValues, onClick: () => { closeMiddlePanel(); setIsOpenDistinctValues(!isOpenDistinctValues); } },
|
143
|
+
{ icon: _jsx(IconDetailDcmts, { fontSize: 20, transform: 'scale(-1, 1)' }), id: 'Master', beginGroup: true, visible: layoutMode !== LayoutModes.Ark && allowRelations && currentTIDHasMasterRelations, visibleName: SDKUI_Localizator.DcmtsMaster, disabled: layoutMode !== LayoutModes.Update || !DID, isActive: isOpenMaster, onClick: () => { setIsOpenMaster(!isOpenMaster); } },
|
144
|
+
{ icon: _jsx(IconDetailDcmts, { fontSize: 20 }), id: 'Details', visibleName: SDKUI_Localizator.DcmtsDetail, disabled: layoutMode !== LayoutModes.Update || !DID, isActive: isOpenDetails, visible: layoutMode !== LayoutModes.Ark && allowRelations && currentTIDHasDetailRelations, onClick: () => { setIsOpenDetails(!isOpenDetails); } },
|
145
|
+
];
|
146
|
+
return customRightSidebarItems.length === 0
|
147
|
+
? fixedItems
|
148
|
+
: [...fixedItems.filter(item => item.id !== 'DistinctValues'), ...customRightSidebarItems, ...fixedItems.filter(item => item.id === 'DistinctValues')];
|
149
|
+
}, [customRightSidebarItems, layoutMode, isOpenDistinctValues, isOpenPreview, focusedMetadataValue]);
|
150
|
+
const closeMiddlePanel = () => {
|
151
|
+
setIsOpenBoard(false);
|
152
|
+
setIsOpenSysMetadata(false);
|
153
|
+
setIsOpenTags(false);
|
154
|
+
setIsOpenDistinctValues(false);
|
155
|
+
setIsOpenFormulaEditor(false);
|
156
|
+
};
|
157
|
+
const titleText = () => {
|
158
|
+
if (isOpenTags)
|
159
|
+
return 'Tags';
|
160
|
+
if (isOpenSysMetadata)
|
161
|
+
return 'Metadati di sistema';
|
162
|
+
if (isOpenBoard)
|
163
|
+
return 'Bacheca';
|
164
|
+
if (isOpenDistinctValues)
|
165
|
+
return `${SDKUI_Localizator.DistinctValues} (${focusedMetadataValue?.md?.nameLoc})`;
|
166
|
+
if (isOpenFormulaEditor)
|
167
|
+
return `${SDKUI_Localizator.FormulaEditorTitle} (${focusedMetadataValue?.md?.nameLoc})`;
|
168
|
+
return '';
|
169
|
+
};
|
170
|
+
const middlePanelToolbar = _jsxs("div", { style: { width: 'max-content', display: 'flex', alignItems: 'center', gap: '10px' }, children: [layoutMode === LayoutModes.Update && _jsx(TMSaveFormButtonPrevious, { btnStyle: 'icon', isModified: false, formMode: FormModes.ReadOnly, canPrev: canPrev, onPrev: () => onPrev?.() }), layoutMode === LayoutModes.Update && _jsx(TMSaveFormButtonNext, { btnStyle: 'icon', isModified: false, formMode: FormModes.ReadOnly, canNext: canNext, onNext: () => onNext?.() })] });
|
171
|
+
const getPrimarySplitterStartLayout = () => {
|
172
|
+
let size = isOpenDcmtForm ? ['100%', '0'] : ['0%', '100%'];
|
173
|
+
if (deviceType !== DeviceType.MOBILE) {
|
174
|
+
if (isOpenPreview || isOpenMiddlePanel()) {
|
175
|
+
if (layoutMode === LayoutModes.Ark) {
|
176
|
+
size = ['50%', '50%'];
|
177
|
+
}
|
178
|
+
else if (isOpenDcmtForm) {
|
179
|
+
size = ['50%', '50%'];
|
180
|
+
}
|
181
|
+
else
|
182
|
+
size = ['0%', '100%'];
|
183
|
+
}
|
184
|
+
}
|
185
|
+
else {
|
186
|
+
size = (isOpenPreview || isOpenMiddlePanel()) ? ['0', '100%'] : ['100%', '0'];
|
187
|
+
}
|
188
|
+
return size;
|
189
|
+
};
|
190
|
+
const getSecondarySplitterStartLayout = () => {
|
191
|
+
if (isOpenPreview && !isOpenMiddlePanel()) {
|
192
|
+
return ['0', '100%'];
|
193
|
+
}
|
194
|
+
if (!isOpenPreview && isOpenMiddlePanel()) {
|
195
|
+
return ['100%', '0'];
|
196
|
+
}
|
197
|
+
return ['40%', '60%'];
|
198
|
+
};
|
199
|
+
const getSelectionDcmtInfo = () => {
|
200
|
+
let dcmts = [];
|
201
|
+
dcmts.push({ TID: TID ?? 0, DID: DID ?? 0 });
|
202
|
+
return dcmts;
|
203
|
+
};
|
204
|
+
const handleAddItem = (tid, did) => {
|
205
|
+
let newItem = { TID: tid ?? 0, DID: did ?? 0 };
|
206
|
+
setSecondaryMasterDcmts((prevItems) => [...prevItems, newItem]);
|
207
|
+
};
|
208
|
+
const handleRemoveItem = (tid, did) => {
|
209
|
+
setSecondaryMasterDcmts((prevItems) => prevItems.filter(item => item.TID !== tid && item.DID !== did));
|
210
|
+
};
|
211
|
+
const getDcmts = () => { return [{ TID: TID, DID: DID }]; };
|
212
|
+
const commandsMenuItems = [
|
213
|
+
{ icon: svgToString(_jsx(IconDownload, {})), operationType: 'singleRow', text: "Download file", onClick: async () => await downloadDcmtsAsync(getDcmts()) },
|
214
|
+
{ icon: svgToString(showAdvancedMenu ? _jsx(IconHide, {}) : _jsx(IconShow, {})), operationType: 'singleRow', text: showAdvancedMenu ? SDKUI_Localizator.StandardMode : SDKUI_Localizator.ExpertMode, onClick: () => setShowAdvancedMenu(!showAdvancedMenu) },
|
215
|
+
];
|
216
|
+
const formToolbar = _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '10px' }, children: [canPrev != undefined && _jsx("p", { style: { backgroundColor: `white`, color: TMColors.primaryColor, textAlign: 'center', padding: '1px 4px', borderRadius: '3px', display: 'flex' }, children: `${itemIndex}/${count}` }), canPrev != undefined && _jsx(TMSaveFormButtonPrevious, { btnStyle: 'icon', iconColor: 'white', isModified: calcIsModified(formData, formDataOrig), formMode: formMode, canPrev: canPrev, onPrev: onPrev }), canNext != undefined && _jsx(TMSaveFormButtonNext, { btnStyle: 'icon', iconColor: 'white', isModified: calcIsModified(formData, formDataOrig), formMode: formMode, canNext: canNext, onNext: onNext }), layoutMode === LayoutModes.Update && _jsx(IconMenuVertical, { id: `commands-detail-${id}`, color: 'white', cursor: 'pointer' }), layoutMode === LayoutModes.Update && _jsx(ContextMenu, { showEvent: 'click', dataSource: commandsMenuItems, target: `#commands-detail-${id}` })] });
|
217
|
+
function createChange(mid, metadataType, modifiedValue) {
|
218
|
+
return { mid, metadataType, modifiedValue };
|
219
|
+
}
|
220
|
+
function getSpecificChangedKeysWithValues(originalList, modifiedList) {
|
221
|
+
const changes = [];
|
222
|
+
if (!originalList || !modifiedList)
|
223
|
+
return changes;
|
224
|
+
const originalMap = new Map(originalList.map(item => [item.mid, item]));
|
225
|
+
for (const modified of modifiedList) {
|
226
|
+
if (modified.mid === undefined)
|
227
|
+
continue;
|
228
|
+
const original = originalMap.get(modified.mid);
|
229
|
+
if (!original)
|
230
|
+
continue;
|
231
|
+
if (original.value !== modified.value) {
|
232
|
+
changes.push(createChange(modified.mid, modified.md?.dataType ?? MetadataDataTypes.Varchar, modified.value));
|
233
|
+
}
|
234
|
+
}
|
235
|
+
return changes;
|
236
|
+
}
|
237
|
+
const setMetadataListAsync = async (mdList, archived = false, currentDID) => {
|
238
|
+
try {
|
239
|
+
let did = currentDID ?? DID;
|
240
|
+
if (!did)
|
241
|
+
return;
|
242
|
+
TMSpinner.show({ description: 'Loading Metadata...' });
|
243
|
+
let res = await SDK_Globals.tmSession?.NewSearchEngine().GetMetadataAsync(TID, did, true);
|
244
|
+
let dtd = res?.dtdResult;
|
245
|
+
let rows = dtd.rows ? dtd.rows[0] : [];
|
246
|
+
let mids = res?.selectMIDs;
|
247
|
+
let metadataList = searchResultToMetadataValues(TID, dtd, rows, mids, mdList, layoutMode);
|
248
|
+
if (archived) {
|
249
|
+
let tempMetadataList = [];
|
250
|
+
for (let md of metadataList) {
|
251
|
+
if (md.value === null) {
|
252
|
+
if (formDataOrig.find(metadata => metadata.mid === md.mid)?.value === '') {
|
253
|
+
tempMetadataList.push({ ...md, value: '' });
|
254
|
+
}
|
255
|
+
if (formDataOrig.find(metadata => metadata.mid === md.mid)?.value === undefined) {
|
256
|
+
tempMetadataList.push({ ...md, value: undefined });
|
257
|
+
}
|
258
|
+
if (formDataOrig.find(metadata => metadata.mid === md.mid)?.value === null) {
|
259
|
+
tempMetadataList.push(md);
|
260
|
+
}
|
261
|
+
}
|
262
|
+
else {
|
263
|
+
tempMetadataList.push(md);
|
264
|
+
}
|
265
|
+
}
|
266
|
+
setFormData(tempMetadataList);
|
267
|
+
return;
|
268
|
+
}
|
269
|
+
setFormDataOrig(structuredClone(metadataList));
|
270
|
+
setFormData(structuredClone(metadataList));
|
271
|
+
}
|
272
|
+
catch (e) {
|
273
|
+
TMExceptionBoxManager.show({ exception: e });
|
274
|
+
}
|
275
|
+
finally {
|
276
|
+
TMSpinner.hide();
|
277
|
+
}
|
278
|
+
};
|
279
|
+
const onUndoHandler = () => {
|
280
|
+
setFormData(structuredClone(formDataOrig));
|
281
|
+
};
|
282
|
+
const confirmActionPopup = async () => {
|
283
|
+
TMMessageBoxManager.show({
|
284
|
+
buttons: [ButtonNames.YES, ButtonNames.NO],
|
285
|
+
message: layoutMode === LayoutModes.Update ? SDKUI_Localizator.SaveQuestion : 'Sei sicuro di voler archiviare questo documento?',
|
286
|
+
onButtonClick(e) {
|
287
|
+
if (e !== ButtonNames.YES)
|
288
|
+
return;
|
289
|
+
layoutMode === LayoutModes.Update ? onSavedAsync() : onArchiveAsync();
|
290
|
+
},
|
291
|
+
});
|
292
|
+
};
|
293
|
+
const onSavedAsync = async () => {
|
294
|
+
const ue = new UpdateEngineByID(SDK_Globals.tmSession);
|
295
|
+
ue.DID = DID;
|
296
|
+
ue.TID = TID;
|
297
|
+
ue.Metadata_ClearAll();
|
298
|
+
try {
|
299
|
+
TMSpinner.show({ description: 'Aggiornamento in corso...' });
|
300
|
+
for (let metadata of changedMetadata) {
|
301
|
+
if (!metadata.modifiedValue)
|
302
|
+
ue.Metadata_AddNull(metadata.mid);
|
303
|
+
else {
|
304
|
+
switch (metadata.metadataType) {
|
305
|
+
case MetadataDataTypes.DateTime:
|
306
|
+
ue.Metadata_AddDateTime(metadata.mid, new Date(metadata.modifiedValue));
|
307
|
+
break;
|
308
|
+
case MetadataDataTypes.Number:
|
309
|
+
ue.Metadata_AddNumber(metadata.mid, metadata.modifiedValue);
|
310
|
+
break;
|
311
|
+
case MetadataDataTypes.Varchar:
|
312
|
+
ue.Metadata_AddString(metadata.mid, metadata.modifiedValue);
|
313
|
+
break;
|
314
|
+
default: ue.Metadata_AddNull(metadata.mid);
|
315
|
+
}
|
316
|
+
}
|
317
|
+
}
|
318
|
+
await ue.UpdateAsync();
|
319
|
+
await onSavedAsyncCallback?.(TID, DID);
|
320
|
+
await setMetadataListAsync(fromDTD?.metadata);
|
321
|
+
ShowAlert({ mode: 'success', title: 'Form di documento', message: 'Le modifiche sono state salvate con successo', duration: 3000 });
|
322
|
+
}
|
323
|
+
catch (e) {
|
324
|
+
TMExceptionBoxManager.show({ exception: e });
|
325
|
+
}
|
326
|
+
finally {
|
327
|
+
TMSpinner.hide();
|
328
|
+
}
|
329
|
+
};
|
330
|
+
const resetHandler = () => {
|
331
|
+
setDcmtFile(null);
|
332
|
+
};
|
333
|
+
let firstBlock = true;
|
334
|
+
let maxFileSize = 0;
|
335
|
+
const onArchiveAsync = async () => {
|
336
|
+
let operationTitle = 'Archiviazione';
|
337
|
+
setUseWaitPanelLocalState(true);
|
338
|
+
setShowWaitPanelLocal(true);
|
339
|
+
setShowPrimaryLocal(false);
|
340
|
+
setShowSecondaryLocal(true);
|
341
|
+
setWaitPanelTitleLocal(operationTitle);
|
342
|
+
abortControllerLocal = new AbortController();
|
343
|
+
const ae = new ArchiveEngineByID(SDK_Globals.tmSession);
|
344
|
+
ae.TID = TID;
|
345
|
+
ae.Metadata_ClearAll();
|
346
|
+
try {
|
347
|
+
for (let metadata of formData) {
|
348
|
+
if (!metadata.value)
|
349
|
+
continue;
|
350
|
+
switch (metadata.md?.dataType) {
|
351
|
+
case MetadataDataTypes.DateTime:
|
352
|
+
ae.Metadata_AddDateTime(metadata.mid, new Date(metadata.value));
|
353
|
+
break;
|
354
|
+
case MetadataDataTypes.Number:
|
355
|
+
ae.Metadata_AddNumber(metadata.mid, parseFloat(metadata.value));
|
356
|
+
break;
|
357
|
+
case MetadataDataTypes.Varchar:
|
358
|
+
ae.Metadata_AddString(metadata.mid, metadata.value);
|
359
|
+
break;
|
360
|
+
default: ae.Metadata_AddNull(metadata.mid);
|
361
|
+
}
|
362
|
+
}
|
363
|
+
ae.ArchivingFile = dcmtFile;
|
364
|
+
let res = await ae.ArchiveAsync(abortControllerLocal.signal, (pd) => {
|
365
|
+
if (firstBlock) {
|
366
|
+
maxFileSize = pd.ProgressBarMaximum ?? 0;
|
367
|
+
setWaitPanelMaxValueSecondaryLocal(maxFileSize);
|
368
|
+
firstBlock = false;
|
369
|
+
}
|
370
|
+
setWaitPanelValueSecondaryLocal(pd.ProgressBarValue);
|
371
|
+
setWaitPanelTextSecondaryLocal(`Archiviazione... ${Globalization.getNumberDisplayValue(pd.ProgressBarValue, true)} / ${Globalization.getNumberDisplayValue(maxFileSize, true)}`);
|
372
|
+
if (pd.ProgressBarValue === pd.ProgressBarMaximum) {
|
373
|
+
setWaitPanelMaxValueSecondaryLocal(0);
|
374
|
+
setWaitPanelValueSecondaryLocal(0);
|
375
|
+
setWaitPanelTextSecondaryLocal('');
|
376
|
+
firstBlock = true;
|
377
|
+
}
|
378
|
+
});
|
379
|
+
await setMetadataListAsync(fromDTD?.metadata ?? [], true, res);
|
380
|
+
resetHandler();
|
381
|
+
let newMruTIDS = mruTIDs ? mruTIDs.slice() : [];
|
382
|
+
let index = newMruTIDS.findIndex((o) => o == TID);
|
383
|
+
if (index >= 0)
|
384
|
+
newMruTIDS.splice(index, 1);
|
385
|
+
if (newMruTIDS.length >= 10)
|
386
|
+
newMruTIDS.splice(0, 1);
|
387
|
+
newMruTIDS.push(TID);
|
388
|
+
LocalStorageService.setItem(`ARCHIVEPAGE_MRU_TIDS_${SDK_Globals.tmSession?.SessionDescr?.archiveID}_${SDK_Globals.tmSession?.SessionDescr?.userID}`, newMruTIDS.filter((tid) => tid != undefined && tid != null));
|
389
|
+
onSaveRecents?.(newMruTIDS);
|
390
|
+
ShowAlert({ mode: 'success', title: 'Archiviazione', message: 'Il documento è stato archiviato con successo', duration: 3000 });
|
391
|
+
}
|
392
|
+
catch (err) {
|
393
|
+
TMExceptionBoxManager.show({ exception: err });
|
394
|
+
}
|
395
|
+
finally {
|
396
|
+
setWaitPanelTextPrimaryLocal('');
|
397
|
+
setWaitPanelMaxValuePrimaryLocal(0);
|
398
|
+
setWaitPanelValuePrimaryLocal(0);
|
399
|
+
setWaitPanelTextSecondaryLocal('');
|
400
|
+
setWaitPanelMaxValueSecondaryLocal(0);
|
401
|
+
setWaitPanelValueSecondaryLocal(0);
|
402
|
+
setShowWaitPanelLocal(false);
|
403
|
+
setUseWaitPanelLocalState(false);
|
404
|
+
}
|
405
|
+
};
|
406
|
+
const clearFormHandler = () => {
|
407
|
+
let data = structuredClone(formData);
|
408
|
+
if (!data || data.length === 0)
|
409
|
+
return;
|
410
|
+
for (let md of data) {
|
411
|
+
if (!md.mid)
|
412
|
+
continue;
|
413
|
+
if (md.mid > 99) {
|
414
|
+
if (formDataOrig.find(metadata => metadata.mid === md.mid)?.value === undefined) {
|
415
|
+
if (md.value)
|
416
|
+
md.value = undefined;
|
417
|
+
}
|
418
|
+
else if (md.value && md.value.length > 0)
|
419
|
+
md.value = '';
|
420
|
+
}
|
421
|
+
}
|
422
|
+
setFormData(data);
|
423
|
+
};
|
424
|
+
const handleClose = () => {
|
425
|
+
if (!isModified) {
|
426
|
+
onClose?.();
|
427
|
+
return;
|
428
|
+
}
|
429
|
+
TMMessageBoxManager.show({
|
430
|
+
message: SDKUI_Localizator.SaveQuestion, buttons: [ButtonNames.YES, ButtonNames.NO, ButtonNames.CANCEL],
|
431
|
+
onButtonClick: async (e) => {
|
432
|
+
try {
|
433
|
+
if (e == ButtonNames.CANCEL)
|
434
|
+
return;
|
435
|
+
if (e == ButtonNames.YES)
|
436
|
+
await onSavedAsync?.();
|
437
|
+
onClose?.();
|
438
|
+
}
|
439
|
+
catch (ex) {
|
440
|
+
TMExceptionBoxManager.show({ exception: ex });
|
441
|
+
}
|
442
|
+
}
|
443
|
+
});
|
444
|
+
};
|
445
|
+
const isModified = calcIsModified(formData, formDataOrig);
|
446
|
+
const clearFormBtnDisabled = formData.filter(md => md.mid && md.value && md.mid > 99 && md.value.length > 0).length > 0;
|
447
|
+
const archiveBtnDisabled = layoutMode === LayoutModes.Update || (fromDTD?.archiveConstraint === ArchiveConstraints.ContentCompulsory && !dcmtFile) || validationItems.length > 0;
|
448
|
+
const undoBtnDisabled = layoutMode === LayoutModes.Update || !calcIsModified(formData, formDataOrig);
|
449
|
+
const listMaxItems = getListMaxItems(deviceType ?? DeviceType.DESKTOP);
|
450
|
+
const totalItems = formData.filter(o => o.mid && o.mid > 100).length;
|
451
|
+
const metadataValuesSource = useMemo(() => {
|
452
|
+
return showAll ? formData.filter(o => o.mid && o.mid > 100) : formData.filter(o => o.mid && o.mid > 100).slice(0, listMaxItems);
|
453
|
+
}, [showAll, formData]);
|
454
|
+
const metadataValuesSourceOrig = useMemo(() => {
|
455
|
+
return showAll ? formDataOrig.filter(o => o.mid && o.mid > 100) : formDataOrig.filter(o => o.mid && o.mid > 100).slice(0, listMaxItems);
|
456
|
+
}, [showAll, formDataOrig]);
|
457
|
+
const getFormula = () => {
|
458
|
+
let fd = new FormulaDescriptor();
|
459
|
+
fd.expression = FormulaHelper.isFormula(focusedMetadataValue?.value) ? FormulaHelper.removeFormulaTag(focusedMetadataValue?.value) : undefined;
|
460
|
+
fd.formulaTarget = FormulaTargets.BatchUpdate;
|
461
|
+
fd.items = FormulaHelper.TreeViewList(TID ?? 0, getSystemMetadata(true), undefined, FormulaTargets.BatchUpdate, SDK_Globals.dbBrand);
|
462
|
+
fd.mid = focusedMetadataValue?.mid ?? 0;
|
463
|
+
fd.tid = TID;
|
464
|
+
return fd;
|
465
|
+
};
|
466
|
+
return (_jsxs(TMLayoutWaitingContainer, { direction: 'vertical', showWaitPanel: useWaitPanelLocalState ? showWaitPanelLocal : showWaitPanel, showWaitPanelPrimary: useWaitPanelLocalState ? showPrimaryLocal : showPrimary, showWaitPanelSecondary: useWaitPanelLocalState ? showSecondaryLocal : showSecondary, waitPanelTitle: useWaitPanelLocalState ? waitPanelTitleLocal : waitPanelTitle, waitPanelTextPrimary: useWaitPanelLocalState ? waitPanelTextPrimaryLocal : waitPanelTextPrimary, waitPanelValuePrimary: useWaitPanelLocalState ? waitPanelValuePrimaryLocal : waitPanelValuePrimary, waitPanelMaxValuePrimary: useWaitPanelLocalState ? waitPanelMaxValuePrimaryLocal : waitPanelMaxValuePrimary, waitPanelTextSecondary: useWaitPanelLocalState ? waitPanelTextSecondaryLocal : waitPanelTextSecondary, waitPanelValueSecondary: useWaitPanelLocalState ? waitPanelValueSecondaryLocal : waitPanelValueSecondary, waitPanelMaxValueSecondary: useWaitPanelLocalState ? waitPanelMaxValueSecondaryLocal : waitPanelMaxValueSecondary, isCancelable: useWaitPanelLocalState ? dcmtFile ? dcmtFile.size >= 1000000 : false : true, abortController: useWaitPanelLocalState ? abortControllerLocal : abortController, children: [_jsxs(TMSplitterLayout, { separatorSize: 5, separatorColor: 'transparent', showSeparator: (isOpenPreview || isOpenMiddlePanel()) && deviceType !== DeviceType.MOBILE && isOpenDcmtForm, start: getPrimarySplitterStartLayout(), min: deviceType !== DeviceType.MOBILE && isOpenDcmtForm ? ['150px', '0'] : ['0', '0'], direction: 'horizontal', children: [_jsx(TMLayoutItem, { children: _jsx(TMToolbarCard, { showHeader: showHeader, title: fromDTD?.nameLoc, toolbar: allowNavigation ? formToolbar : _jsx(_Fragment, {}), items: showDcmtFormSidebar ? sideBarItems : undefined, onBack: isClosable ? undefined : handleClose, onClose: isClosable ? handleClose : undefined, children: metadataValuesSource.length > 0 && _jsxs(StyledToolbarCardContainer, { children: [_jsx(TMMetadataValues, { TID: TID, metadataValues: metadataValuesSource, metadataValuesOrig: metadataValuesSourceOrig, showAdvancedMenu: showAdvancedMenu, isOpenDistinctValues: isOpenDistinctValues, openChooserBySingleClick: !isOpenDistinctValues, selectedMID: focusedMetadataValue?.mid, layoutMode: layoutMode, deviceType: deviceType, validationItems: validationItems, onFocusedItemChanged: (item) => { (item?.mid !== focusedMetadataValue?.mid) && setFocusedMetadataValue(item); }, onValueChanged: (newItems) => {
|
467
|
+
setFormData((prevItems) => prevItems.map((item) => {
|
468
|
+
const newItem = newItems.find((newItem) => newItem.tid === item.tid && newItem.mid === item.mid);
|
469
|
+
return newItem ? { ...item, ...newItem } : item;
|
470
|
+
}));
|
471
|
+
}, onAdvancedMenuClick: (e) => {
|
472
|
+
switch (e.button) {
|
473
|
+
case AdvancedMenuButtons.DistinctValues:
|
474
|
+
setIsOpenDistinctValues(!isOpenDistinctValues);
|
475
|
+
break;
|
476
|
+
case AdvancedMenuButtons.FormulaEditor:
|
477
|
+
setIsOpenFormulaEditor(!isOpenFormulaEditor);
|
478
|
+
break;
|
479
|
+
}
|
480
|
+
} }), _jsxs(StyledFormButtonsContainer, { children: [_jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: 10 }, children: [fromDTD?.templateTID === TemplateTIDs.WF_WIApprView && _jsx(WorkFlowOperationButtons, { onApprove: () => setShowApprovePopup(true), onReject: () => setShowRejectPopup(true), onReAssign: () => setShowReAssignPopup(true), isInDcmtForm: true }), _jsx("div", { style: { display: 'flex', justifyContent: 'center', alignItems: 'center', gap: '8px' }, children: layoutMode === LayoutModes.Update ? _jsxs(_Fragment, { children: [_jsx(TMSaveFormButtonSave, { showTooltip: false, btnStyle: 'advanced', advancedColor: '#f09c0a', isModified: isModified, formMode: formMode, errorsCount: validationItems.filter(o => o.ResultType == ResultTypes.ERROR).length, onSaveAsync: confirmActionPopup }), _jsx(TMSaveFormButtonUndo, { btnStyle: 'toolbar', showTooltip: true, color: 'primary', isModified: isModified, formMode: formMode, onUndo: onUndoHandler })] }) :
|
481
|
+
_jsxs(_Fragment, { children: [_jsx(TMButton, { disabled: archiveBtnDisabled, btnStyle: 'advanced', icon: _jsx(IconBoxArchiveIn, {}), showTooltip: false, caption: 'Archivia', advancedColor: TMColors.success, onClick: confirmActionPopup }), _jsx(TMButton, { disabled: !clearFormBtnDisabled, btnStyle: 'advanced', icon: _jsx(IconClear, {}), showTooltip: false, caption: 'Pulisci', advancedColor: TMColors.tertiary, onClick: clearFormHandler }), DID && _jsx(TMButton, { disabled: undoBtnDisabled, btnStyle: 'advanced', icon: _jsx(IconUndo, {}), width: '150px', showTooltip: false, caption: 'Annulla modifiche', advancedColor: TMColors.tertiary, onClick: onUndoHandler })] }) })] }), totalItems > listMaxItems && _jsx(TMShowAllOrMaxItemsButton, { showAll: showAll, dataSourceLength: totalItems, onClick: () => { setShowAll(!showAll); } })] }), showApprovePopup && _jsx(WorkFlowApproveRejectPopUp, { deviceType: deviceType, TID: TID, DID: DID, op: 0, onClose: () => setShowApprovePopup(false) }), showRejectPopup && _jsx(WorkFlowApproveRejectPopUp, { deviceType: deviceType, TID: TID, DID: DID, op: 1, onClose: () => setShowRejectPopup(false) }), showReAssignPopup && _jsx(WorkFlowReAssignPopUp, { deviceType: deviceType, TID: TID, DID: DID, onClose: () => setShowReAssignPopup(false) })] }) }) }), isOpenPreview || isOpenMiddlePanel() ?
|
482
|
+
_jsx(TMLayoutItem, { children: _jsxs(TMSplitterLayout, { separatorSize: 5, direction: 'horizontal', showSeparator: deviceType !== DeviceType.MOBILE && (isOpenPreview && isOpenMiddlePanel()), start: getSecondarySplitterStartLayout(), min: ['0', '0'], separatorColor: 'transparent', children: [isOpenMiddlePanel()
|
483
|
+
? _jsx(TMLayoutItem, { children: _jsx(TMToolbarCard, { padding: '0', showHeader: !(isOpenDetails && layoutMode === LayoutModes.Update), color: TMColors.primaryColor, backgroundColor: `${TMColors.primaryColor}25`, title: titleText(), toolbar: middlePanelToolbar, onClose: () => { closeMiddlePanel(); }, children: _jsx(StyledToolbarCardContainer, { children: _jsx(StyledSectionContainer, { children: _jsxs(StyledSidebarItemsContentContainer, { children: [isOpenBoard && layoutMode === LayoutModes.Update &&
|
484
|
+
_jsx(TMDcmtBlog, { tid: TID, did: DID }), isOpenSysMetadata && layoutMode === LayoutModes.Update &&
|
485
|
+
_jsx(TMMetadataValues, { layoutMode: layoutMode, openChooserBySingleClick: !isOpenDistinctValues, TID: TID, deviceType: deviceType, metadataValues: formData.filter(o => (o.mid != undefined && o.mid <= 100)), metadataValuesOrig: formData.filter(o => (o.mid != undefined && o.mid <= 100)), validationItems: [] }), isOpenDistinctValues &&
|
486
|
+
_jsx(TMDistinctValues, { tid: TID, mid: focusedMetadataValue?.mid, showHeader: false, layoutMode: layoutMode, onSelectionChanged: (e) => {
|
487
|
+
if (!e)
|
488
|
+
return;
|
489
|
+
setFormData((prevItems) => prevItems.map((item) => item.tid == e.tid && item.mid === e.mid ? { ...item, value: e.newValue } : item));
|
490
|
+
} }), isOpenFormulaEditor &&
|
491
|
+
_jsx(TMFormulaEditor, { isModal: false, formMode: FormModes.Update, inputData: getFormula(), showBack: false, onClose: () => setIsOpenFormulaEditor(false), onApplied: (newFormula) => {
|
492
|
+
setFormData((prevItems) => prevItems.map((item) => item.tid == newFormula.tid && item.mid === newFormula.mid ? { ...item, value: FormulaHelper.addFormulaTag(newFormula.expression), isSelected: true, isEditable: true } : item));
|
493
|
+
setFocusedMetadataValue(prevState => ({
|
494
|
+
...prevState,
|
495
|
+
isSelected: true,
|
496
|
+
isEditable: true,
|
497
|
+
value: FormulaHelper.addFormulaTag(newFormula.expression)
|
498
|
+
}));
|
499
|
+
} })] }) }) }) }) })
|
500
|
+
: _jsx(_Fragment, {}), isOpenPreview
|
501
|
+
? _jsxs(TMLayoutItem, { children: [layoutMode === LayoutModes.Update ?
|
502
|
+
_jsx(TMDcmtPreview, { onClose: () => { setIsOpenPreview(false); onClosePreview?.(); }, dcmtData: currentDcmt, canNext: canNext, canPrev: canPrev, onNext: onNext, onPrev: onPrev }) :
|
503
|
+
_jsx(TMFileUploader, { onFileUpload: (file) => setDcmtFile(file), onClose: () => setIsOpenPreview(false), isRequired: fromDTD?.archiveConstraint === ArchiveConstraints.ContentCompulsory && dcmtFile === null, defaultBlob: dcmtFile, deviceType: deviceType }), " "] })
|
504
|
+
: _jsx(_Fragment, {})] }) }) : _jsx(_Fragment, {})] }), isOpenDetails &&
|
505
|
+
_jsx(StyledModalContainer, { style: { backgroundColor: 'white' }, children: _jsx(TMMasterDetailDcmts, { deviceType: deviceType, isForMaster: false, inputDcmts: getSelectionDcmtInfo(), allowNavigation: allowNavigation, canNext: canNext, canPrev: canPrev, onNext: onNext, onPrev: onPrev, onBack: () => setIsOpenDetails(false) }) }), isOpenMaster &&
|
506
|
+
_jsxs(StyledModalContainer, { style: { backgroundColor: 'white' }, children: [_jsx(TMMasterDetailDcmts, { deviceType: deviceType, inputDcmts: getSelectionDcmtInfo(), isForMaster: true, allowNavigation: allowNavigation, canNext: canNext, canPrev: canPrev, onNext: onNext, onPrev: onPrev, onBack: () => setIsOpenMaster(false), appendMasterDcmts: handleAddItem }), secondaryMasterDcmts.length > 0 && secondaryMasterDcmts.map((dcmt, index) => {
|
507
|
+
return (_jsx(StyledModalContainer, { style: { backgroundColor: 'white' }, children: _jsx(TMMasterDetailDcmts, { deviceType: deviceType, inputDcmts: [dcmt], isForMaster: true, allowNavigation: false, onBack: () => handleRemoveItem(dcmt.TID, dcmt.DID), appendMasterDcmts: handleAddItem }) }, `${index}-${dcmt.DID}`));
|
508
|
+
})] })] }));
|
509
|
+
};
|
510
|
+
export default TMDcmtForm;
|
511
|
+
//#region Styled Components
|
512
|
+
const StyledSectionContainer = styled.div ` width: 100%; height: 100%; display:flex; flex-direction: column; `;
|
513
|
+
const StyledSidebarItemsContentContainer = styled.div `width: 100%; height: 100%; overflow:auto;`;
|
514
|
+
//#endregion Styled Components
|
515
|
+
//#region Validaion
|
516
|
+
const validateMetadataList = (mvdList = []) => {
|
517
|
+
if (!Array.isArray(mvdList)) {
|
518
|
+
throw new TypeError("metadataList must be an array of ITMMetadataProps.");
|
519
|
+
}
|
520
|
+
return mvdList.reduce((validationItems, md) => {
|
521
|
+
const value = md.value?.toString() ?? "";
|
522
|
+
if (isValidForValidation(md)) {
|
523
|
+
validateRequiredField(md, value, validationItems);
|
524
|
+
validateMaxLength(md, value, validationItems);
|
525
|
+
}
|
526
|
+
return validationItems;
|
527
|
+
}, []);
|
528
|
+
};
|
529
|
+
const isValidForValidation = (mvd) => { return mvd.mid > 99; };
|
530
|
+
const validateRequiredField = (mvd, value, validationItems) => {
|
531
|
+
if (mvd.isRequired === '1' && !value.trim()) {
|
532
|
+
const message = SDKUI_Localizator.RequiredField;
|
533
|
+
validationItems.push(new ValidationItem(ResultTypes.ERROR, mvd.md?.nameLoc ?? "", message));
|
534
|
+
}
|
535
|
+
};
|
536
|
+
const validateMaxLength = (mvd, value, validationItems) => {
|
537
|
+
const regex = /[!?[\],./*-+'<>:";]/g;
|
538
|
+
const maxLength = mvd.md?.length ?? 0;
|
539
|
+
const isTextOrNumber = mvd.md?.dataType === MetadataDataTypes.Varchar || mvd.md?.dataType === MetadataDataTypes.Number;
|
540
|
+
if (isTextOrNumber && mvd.md?.length && value.replace(regex, '').length > maxLength) {
|
541
|
+
const message = `"${mvd.md.nameLoc ?? "no-name"}" ha superata massimo lunghezza di ${maxLength} caratteri.`;
|
542
|
+
validationItems.push(new ValidationItem(ResultTypes.ERROR, mvd.md.nameLoc ?? "", message));
|
543
|
+
}
|
544
|
+
};
|
@@ -0,0 +1,10 @@
|
|
1
|
+
interface ITMDcmtIconProps {
|
2
|
+
fileExtension: string | undefined;
|
3
|
+
fileCount: number | undefined;
|
4
|
+
isLexProt: number | undefined;
|
5
|
+
isSigned: number | undefined;
|
6
|
+
isMail: number | undefined;
|
7
|
+
isShared: number | undefined;
|
8
|
+
}
|
9
|
+
declare const TMDcmtIcon: ({ fileExtension, fileCount, isLexProt, isSigned, isMail, isShared }: ITMDcmtIconProps) => import("react/jsx-runtime").JSX.Element;
|
10
|
+
export default TMDcmtIcon;
|
@@ -0,0 +1,52 @@
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
2
|
+
import styled from 'styled-components';
|
3
|
+
import { getFileIcon } from '../../helper';
|
4
|
+
import TMTooltip from '../base/TMTooltip';
|
5
|
+
const StyledCellRenderDcmtIcon = styled.div `
|
6
|
+
display: flex;
|
7
|
+
flex-direction: row;
|
8
|
+
align-items: center;
|
9
|
+
justify-content: center;
|
10
|
+
overflow: visible;
|
11
|
+
position: relative;
|
12
|
+
`;
|
13
|
+
const TMDcmtIcon = ({ fileExtension, fileCount, isLexProt, isSigned, isMail, isShared }) => {
|
14
|
+
return (_jsxs(StyledCellRenderDcmtIcon, { children: [getFileIcon(isMail == 2 ? "PEC" : fileExtension, fileCount), isLexProt == 1 && _jsx("div", { style: { position: 'absolute', left: '-7px', top: isShared ? undefined : '2px' }, children: _jsx(TMTooltip, { content: "Protezione LEX", children: _jsx(IconLexProtLock, { color: 'blue', fontSize: 13 }) }) }), isShared == 1 && _jsx("div", { style: { position: 'absolute', top: '-7px', left: '-5px' }, children: _jsx(TMTooltip, { content: "Documento condiviso", children: _jsx(IconShared, { fontSize: 16 }) }) }), isSigned == 1 && _jsx("div", { style: { position: 'absolute', bottom: '-4px', right: '-7px' }, children: _jsx(TMTooltip, { content: "Documento firmato", children: _jsx(IconSignature, { fontSize: 28 }) }) })] }));
|
15
|
+
};
|
16
|
+
export default TMDcmtIcon;
|
17
|
+
function IconLexProtLock(props) {
|
18
|
+
return (_jsxs("svg", { viewBox: "0 0 512 512", height: "1em", width: "1em", ...props, children: [_jsx("path", { fill: "#455A64", d: "M256,0c-76.544,0.094-138.573,62.122-138.667,138.667V224c0,5.891,4.776,10.667,10.667,10.667h42.667\r\n c5.891,0,10.667-4.776,10.667-10.667v-85.333C181.333,97.429,214.763,64,256,64s74.667,33.429,74.667,74.667V224\r\n c0,5.891,4.776,10.667,10.667,10.667H384c5.891,0,10.667-4.776,10.667-10.667v-85.333C394.573,62.122,332.544,0.094,256,0z" }), _jsx("path", { fill: "#FFC107", d: "M128,213.333h256c29.455,0,53.333,23.878,53.333,53.333v192C437.333,488.122,413.455,512,384,512H128\r\n c-29.455,0-53.333-23.878-53.333-53.333v-192C74.667,237.211,98.545,213.333,128,213.333z" }), _jsx("path", { fill: "#455A64", d: "M309.333,330.667c0.124-29.455-23.653-53.434-53.108-53.558\r\n c-29.455-0.124-53.434,23.653-53.558,53.108c-0.086,20.36,11.427,38.992,29.674,48.023l-8.235,57.6\r\n c-0.825,5.833,3.235,11.23,9.068,12.055c0.494,0.07,0.993,0.105,1.492,0.105h42.667c5.891,0.06,10.715-4.667,10.774-10.558\r\n c0.005-0.543-0.03-1.086-0.108-1.623l-8.235-57.6C297.788,369.199,309.216,350.82,309.333,330.667z" }), _jsx("g", { children: " " }), " ", _jsx("g", { children: " " }), " ", _jsx("g", { children: " " }), " ", _jsx("g", { children: " " }), " ", _jsx("g", { children: " " }), " ", _jsx("g", { children: " " }), " ", _jsx("g", { children: " " }), " ", _jsx("g", { children: " " }), " ", _jsx("g", { children: " " }), " ", _jsx("g", { children: " " }), " ", _jsx("g", { children: " " }), " ", _jsx("g", { children: " " }), " ", _jsx("g", { children: " " }), " ", _jsx("g", { children: " " }), " ", _jsx("g", { children: " " })] })
|
19
|
+
// <svg
|
20
|
+
// viewBox="0 0 24 24"
|
21
|
+
// fill="currentColor"
|
22
|
+
// height="1em"
|
23
|
+
// width="1em"
|
24
|
+
// {...props}
|
25
|
+
// >
|
26
|
+
// <path d="M12 2C9.243 2 7 4.243 7 7v3H6a2 2 0 00-2 2v8a2 2 0 002 2h12a2 2 0 002-2v-8a2 2 0 00-2-2h-1V7c0-2.757-2.243-5-5-5zM9 7c0-1.654 1.346-3 3-3s3 1.346 3 3v3H9V7zm4 10.723V20h-2v-2.277a1.993 1.993 0 01.567-3.677A2.001 2.001 0 0114 16a1.99 1.99 0 01-1 1.723z" />
|
27
|
+
// </svg>
|
28
|
+
);
|
29
|
+
}
|
30
|
+
function IconShared(props) {
|
31
|
+
return (_jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", height: "1em", width: "1em", ...props, children: _jsx("path", { d: "M11 9V5l7 7-7 7v-4.1c-5 0-8.5 1.6-11 5.1 1-5 4-10 11-11m6-1V5l7 7-7 7v-3l4-4-4-4z" }) }));
|
32
|
+
}
|
33
|
+
function IconSignature(props) {
|
34
|
+
return (
|
35
|
+
// <svg viewBox="0 0 128 128" fill="currentColor"
|
36
|
+
// height="1em"
|
37
|
+
// width="1em"
|
38
|
+
// {...props}>
|
39
|
+
// <g><path d="m128 82.7c0-.3-.1-.6-.2-.8l-6.4-10.9c-2.2-3.7-4.8-7.1-7.9-10.2l-39.8-39.8c-2.7-2.7-7-2.7-9.7 0s-2.7 7 0 9.7l39.8 39.8c3.1 3.1 6.5 5.7 10.2 7.9l8.3 4.8c-.3.2-.7.5-1 .7-1.4 1-2.9 2-4.3 3.1-1.2.9-2.3 1.9-3.3 2.9-2.5 2.2-4.8 4.3-7.8 5.6-3.5 1.5-8.9 2.2-12.6-.9-.7-.6-1.4-1.4-2.2-2.2-2-2.2-4.3-4.7-7.8-4.6-2.9.1-4.9 2-6.7 3.7-.8.8-1.6 1.5-2.4 2-1 .6-2.1.9-3.2.9 1.9-3.5 2.5-7.1 1.7-10.5-.6-2.4-3.1-8.7-7.7-8.5-1.8.1-3.3 1-4.3 2.6-2.2 3.5-1.4 9.7-.4 12.2 1 2.4 2.6 4.4 4.5 5.9-3.9 4.3-9.6 7.4-15.9 8.6-6.4 1.2-12.9-.7-18.2-4.8 4.7-2 9.1-5.2 12.7-9.4 5.7-6.8 8-14.5 6.1-21.1-1.2-4.1-3.8-7.2-7.8-8.9-4.7-2-10.7-1.6-15.6 1.1-11.1 6.1-12.2 20.3-6.8 30.6 1.1 2.1 2.3 4 3.7 5.7-.5.1-1 .1-1.4.1-4.5.1-8.3-1.4-11.4-4.7-9.8-10.2-7-27.9 1.1-38.5 8.4-11 23.5-14.9 35.1-9.1 1 .5 2.2.1 2.7-.9s.1-2.2-.9-2.7c-13.2-6.6-30.4-2.2-40 10.2-9.2 12-12.2 32-.9 43.7 3.9 4 8.9 6.1 14.4 5.9 1.5 0 3-.3 4.5-.6 5.3 4.9 11.9 7.7 18.7 7.7 1.5 0 3-.1 4.6-.4 7.7-1.4 14.4-5.2 18.9-10.6 2.7.8 5.4.4 7.8-1.1 1.1-.7 2.1-1.6 3-2.5 1.4-1.4 2.7-2.5 4-2.6 1.6 0 2.8 1.2 4.7 3.3.8.9 1.6 1.8 2.6 2.6 4.2 3.5 10.8 4.1 16.8 1.5 3.6-1.6 6.3-4 8.9-6.3 1-.9 2.1-1.9 3.2-2.7 1.3-1 2.6-1.9 4-2.9 1.2-.8 2.5-1.7 3.7-2.6.7-.6 1-1.3.9-2zm-12-7.8c-3.4-2-6.5-4.4-9.4-7.2l-39.8-39.8c-1.1-1.1-1.1-2.9 0-4 .6-.6 1.3-.8 2-.8s1.5.3 2 .8l39.8 39.8c2.8 2.8 5.3 6 7.2 9.4l2.7 4.6zm-93.1 15.4c-4.5-8.5-3.8-20.3 5.2-25.2 2.2-1.2 4.8-1.8 7.3-1.8 1.7 0 3.4.3 4.9.9 1.9.8 4.4 2.6 5.5 6.3 2.1 7.6-3 14.7-5.3 17.4-3.5 4.2-8.2 7.4-12.9 9-1.9-2-3.4-4.2-4.7-6.6zm44.3 2.6c-1.4-1-2.5-2.5-3.2-4.2-.7-1.8-1.2-6.5.1-8.6.3-.5.6-.7 1.1-.7 1.2 0 3 3 3.5 5.4.8 3.2-.3 6.1-1.5 8.1z"></path></g>
|
40
|
+
// </svg>
|
41
|
+
_jsx("svg", { height: "1em", viewBox: "0 0 450 450", width: "1em", fill: "currentColor", ...props, children: _jsx("g", { children: _jsx("g", { children: _jsxs("g", { clipRule: "evenodd", fill: "rgb(0,0,0)", fillRule: "evenodd", children: [_jsx("path", { d: "m366.6 67.8 1.1-4c.4-1.5.6-3 .6-4.5 0-8.1-5.5-15.2-13.3-17.3-9.5-2.5-19.3 3.2-21.8 12.8l-20.4 77.9 34.6 9z" }), _jsx("path", { d: "m234.9 198.9h148.6v35.7h-148.6z", transform: "matrix(.253 -.968 .968 .253 21.311 461.088)" }), _jsx("path", { d: "m292.8 316 8.4 2.2 4.5-17.3-34.6-9.1-4.5 17.4 8.3 2.2z" }), _jsx("path", { d: "m275.3 319.7-12.7 14.7 5.4 40.3 24.4-32.5-3.9-19.1zm6.5 23.3c-.8 2.9-3.7 4.6-6.6 3.9s-4.6-3.7-3.9-6.6 3.7-4.6 6.6-3.9 4.6 3.7 3.9 6.6z" }), _jsx("path", { d: "m395.6 71.5-20.3-5.5-2 7.7 16.5 4.4-24.8 95c-.6 2.1.7 4.3 2.8 4.8.3.1.7.1 1 .1 1.8 0 3.4-1.2 3.8-3l25.8-98.8c.6-2-.7-4.2-2.8-4.7z" }), _jsx("path", { d: "" }), _jsx("path", { d: "m243.4 379.8c-1.8-1.2-4.3-.8-5.5 1.1-9.6 14.1-29.9 19.6-45.3 12.2-.5-.2-.9-.5-1.4-.7-3.5-1.8-7.9-4-12.8-2.7-2.7.7-4.7 2.3-6.5 3.6-1.5 1.2-2.8 2.2-3.9 2.2-2 .1-4-3-5-5.9-.2-.5-.4-1-.5-1.5-1.4-4.1-3.1-9.1-7.8-11.8-5.8-3.3-12.9-.9-17.4 3-2.4 2-4.2 4.4-6 6.7-1.2 1.5-2.3 2.9-3.4 4.1-7.5 7.9-20.3 10-30.2 5.6 7.6-6.9 13-15.5 15.4-24.9s1-21.1-7.8-25.8c-4.5-2.4-9.9-2.4-15.2.2-4.4 2.2-8.4 5.9-10.9 10.3-3.9 7-5.1 15.4-3.3 23.8 1.4 6.3 4.3 12 8.4 16.5-8.4 4.9-18.2 7.3-27.8 6.1-2.2-.3-4.2 1.2-4.5 3.4s1.2 4.2 3.4 4.5c2.1.3 4.1.4 6.2.4 10 0 20.1-3.1 29.1-9 6.1 3.7 13.5 5.4 21.1 4.7 8.5-.8 16.3-4.4 21.8-10.2 1.5-1.5 2.7-3.1 3.9-4.7 1.6-2.1 3.1-4 4.9-5.6 2.4-2 6-3.4 8.3-2.1 2.1 1.2 3.1 4.2 4.2 7.5.2.5.4 1.1.6 1.6 2.5 7 7.1 11.1 12.4 11.1h.6c3.6-.2 6.2-2.2 8.3-3.9 1.3-1 2.5-2 3.6-2.2 2-.5 4.5.8 7.2 2.1.5.3 1 .5 1.5.7 5.7 2.7 11.9 4 18.2 4 14.4 0 29-6.9 37.1-18.9 1.3-1.8.9-4.3-1-5.5zm-152.6 11.3c-8.1-8-10.4-21.8-4.8-31.7 2.5-4.5 7.5-8.2 12-8.2 1.2 0 2.3.3 3.4.8 5 2.7 5.5 10.6 3.9 16.8-2.2 8.7-7.5 16.5-14.5 22.3z" })] }) }) }) })
|
42
|
+
// <svg
|
43
|
+
// viewBox="0 0 24 24"
|
44
|
+
// fill="currentColor"
|
45
|
+
// height="1em"
|
46
|
+
// width="1em"
|
47
|
+
// {...props}
|
48
|
+
// >
|
49
|
+
// <path d="M22 22H2v-2h20v2M2.26 16.83L5.09 14l-2.83-2.83 1.41-1.41 2.83 2.83 2.83-2.83 1.41 1.41L7.91 14l2.83 2.83-1.41 1.41-2.83-2.83-2.83 2.83-1.41-1.41z" />
|
50
|
+
// </svg>
|
51
|
+
);
|
52
|
+
}
|