@topconsultnpm/sdkui-react 6.22.0-t1 → 6.22.0-t2
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/NewComponents/ContextMenu/TMContextMenu.js +1 -1
- package/lib/components/NewComponents/ContextMenu/styles.d.ts +45 -43
- package/lib/components/NewComponents/FloatingMenuBar/TMFloatingMenuBar.js +1 -1
- package/lib/components/NewComponents/FloatingMenuBar/styles.d.ts +67 -60
- package/lib/components/base/Styled.d.ts +92 -76
- package/lib/components/base/TMButton.d.ts +13 -0
- package/lib/components/base/TMButton.js +137 -5
- package/lib/components/base/TMDataGrid.d.ts +2 -0
- package/lib/components/base/TMDataGrid.js +260 -8
- package/lib/components/base/TMDataGridExportForm.js +39 -30
- package/lib/components/base/TMEditorBase.d.ts +2 -0
- package/lib/components/base/TMFileManager.js +5 -3
- package/lib/components/base/TMFileManagerDataGridView.js +11 -2
- package/lib/components/base/TMFileManagerThumbnailItems.js +19 -9
- package/lib/components/base/TMFileManagerUtils.d.ts +6 -6
- package/lib/components/base/TMFileManagerUtils.js +37 -1
- package/lib/components/base/TMModal.d.ts +11 -0
- package/lib/components/base/TMModal.js +47 -13
- package/lib/components/base/TMPanel.d.ts +6 -0
- package/lib/components/base/TMPanel.js +138 -25
- package/lib/components/base/TMPopUp.js +3 -0
- package/lib/components/base/TMTooltip.d.ts +2 -1
- package/lib/components/base/TMTooltip.js +24 -8
- package/lib/components/base/TMTreeView.d.ts +13 -7
- package/lib/components/base/TMTreeView.js +108 -67
- package/lib/components/choosers/TMDcmtTypeChooser.js +4 -3
- package/lib/components/choosers/TMDistinctValues.d.ts +9 -7
- package/lib/components/choosers/TMDistinctValues.js +149 -142
- package/lib/components/choosers/TMMetadataChooser.js +1 -1
- package/lib/components/choosers/TMQuickSearchInfo.d.ts +13 -0
- package/lib/components/choosers/TMQuickSearchInfo.js +279 -0
- package/lib/components/choosers/TMQuickSearchSettingsForm.d.ts +16 -0
- package/lib/components/choosers/TMQuickSearchSettingsForm.js +94 -0
- package/lib/components/choosers/TMSelectedValuesSummary.d.ts +13 -0
- package/lib/components/choosers/TMSelectedValuesSummary.js +91 -0
- package/lib/components/editors/TMDateBox.d.ts +16 -1
- package/lib/components/editors/TMDateBox.js +90 -22
- package/lib/components/editors/TMDropDown.d.ts +3 -0
- package/lib/components/editors/TMDropDown.js +197 -5
- package/lib/components/editors/TMEditorStyled.d.ts +20 -42
- package/lib/components/editors/TMMetadataEditor.d.ts +5 -1
- package/lib/components/editors/TMMetadataEditor.js +27 -23
- package/lib/components/editors/TMTextArea.d.ts +1 -0
- package/lib/components/editors/TMTextArea.js +23 -15
- package/lib/components/editors/TMTextBox.d.ts +2 -0
- package/lib/components/editors/TMTextBox.js +30 -19
- package/lib/components/features/archive/TMArchive.js +17 -3
- package/lib/components/features/documents/TMBatchUpdateForm.js +19 -5
- package/lib/components/features/documents/TMDcmtBlog.d.ts +3 -0
- package/lib/components/features/documents/TMDcmtBlog.js +4 -4
- package/lib/components/features/documents/TMDcmtForm.d.ts +7 -0
- package/lib/components/features/documents/TMDcmtForm.js +232 -53
- package/lib/components/features/documents/TMDcmtFormActionButtons.d.ts +11 -0
- package/lib/components/features/documents/TMDcmtFormActionButtons.js +77 -7
- package/lib/components/features/documents/TMDcmtIcon.js +5 -3
- package/lib/components/features/documents/TMDcmtPreview.d.ts +7 -5
- package/lib/components/features/documents/TMDcmtPreview.js +10 -6
- package/lib/components/features/documents/TMMasterDetailDcmts.js +95 -33
- package/lib/components/features/documents/TMMasterInfoFields.d.ts +20 -0
- package/lib/components/features/documents/TMMasterInfoFields.js +186 -0
- package/lib/components/features/documents/TMMergeToPdfForm.d.ts +1 -2
- package/lib/components/features/documents/TMMergeToPdfForm.js +30 -5
- package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.d.ts +46 -0
- package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.js +323 -0
- package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.d.ts +370 -0
- package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.js +283 -0
- package/lib/components/features/documents/TMRelationViewer.d.ts +14 -1
- package/lib/components/features/documents/TMRelationViewer.js +82 -52
- package/lib/components/features/search/TMSearch.js +103 -24
- package/lib/components/features/search/TMSearchQueryEditor.js +5 -3
- package/lib/components/features/search/TMSearchQueryPanel.d.ts +14 -4
- package/lib/components/features/search/TMSearchQueryPanel.js +152 -57
- package/lib/components/features/search/TMSearchResult.d.ts +16 -0
- package/lib/components/features/search/TMSearchResult.js +438 -145
- package/lib/components/features/search/TMTreeSelector.js +109 -64
- package/lib/components/features/workflow/TMWorkflowPopup.d.ts +10 -0
- package/lib/components/features/workflow/TMWorkflowPopup.js +8 -4
- package/lib/components/features/workflow/diagram/WorkitemRecipientsEditor.d.ts +3 -1
- package/lib/components/forms/Login/ChangePasswordInputs.d.ts +3 -1
- package/lib/components/grids/TMBlogAttachments.js +13 -2
- package/lib/components/grids/TMBlogHeader.js +5 -1
- package/lib/components/grids/TMBlogsPost.d.ts +2 -0
- package/lib/components/grids/TMBlogsPost.js +31 -4
- package/lib/components/grids/TMBlogsPostUtils.d.ts +1 -0
- package/lib/components/grids/TMBlogsPostUtils.js +14 -3
- package/lib/components/layout/panelManager/TMPanelManagerContainer.d.ts +1 -0
- package/lib/components/layout/panelManager/TMPanelManagerContainer.js +24 -14
- package/lib/components/layout/panelManager/TMPanelManagerContext.js +68 -93
- package/lib/components/layout/panelManager/TMPanelManagerToolbar.d.ts +4 -5
- package/lib/components/layout/panelManager/TMPanelWrapper.js +2 -2
- package/lib/components/layout/panelManager/types.d.ts +3 -0
- package/lib/components/layout/panelManager/utils.js +13 -11
- package/lib/components/query/TMQueryEditor.d.ts +14 -10
- package/lib/components/sidebar/TMCommandsPanel.d.ts +4 -4
- package/lib/components/sidebar/TMHeader.js +30 -20
- package/lib/components/viewers/TMMidViewer.js +5 -2
- package/lib/components/viewers/TMTidViewer.js +86 -25
- package/lib/css/tm-sdkui.css +1 -1
- package/lib/devextreme-license.d.ts +1 -0
- package/lib/devextreme-license.js +3 -0
- package/lib/helper/Globalization.d.ts +1 -1
- package/lib/helper/SDKUI_Globals.d.ts +110 -0
- package/lib/helper/SDKUI_Globals.js +151 -0
- package/lib/helper/SDKUI_Localizator.d.ts +55 -0
- package/lib/helper/SDKUI_Localizator.js +550 -0
- package/lib/helper/TMAppUpdatedModal.d.ts +2 -0
- package/lib/helper/TMAppUpdatedModal.js +134 -0
- package/lib/helper/TMIcons.d.ts +1 -0
- package/lib/helper/TMIcons.js +3 -0
- package/lib/helper/TMUtils.d.ts +51 -4
- package/lib/helper/TMUtils.js +272 -11
- package/lib/helper/dataGridSearchHelper.d.ts +28 -0
- package/lib/helper/dataGridSearchHelper.js +51 -0
- package/lib/helper/dcmtsHelper.d.ts +20 -0
- package/lib/helper/dcmtsHelper.js +58 -1
- package/lib/helper/helpers.d.ts +23 -1
- package/lib/helper/helpers.js +57 -1
- package/lib/helper/index.d.ts +2 -0
- package/lib/helper/index.js +2 -0
- package/lib/helper/queryHelper.d.ts +6 -1
- package/lib/helper/queryHelper.js +8 -3
- package/lib/hooks/tmDistinctValuesGridHelper.d.ts +16 -0
- package/lib/hooks/tmDistinctValuesGridHelper.js +31 -0
- package/lib/hooks/useArchiveListForm.d.ts +39 -0
- package/lib/hooks/useArchiveListForm.js +46 -0
- package/lib/hooks/useCaseFlowApprove.d.ts +56 -0
- package/lib/hooks/useCaseFlowApprove.js +157 -0
- package/lib/hooks/useDataUserIdItem.d.ts +1 -0
- package/lib/hooks/useDataUserIdItem.js +1 -0
- package/lib/hooks/useDocumentOperations.d.ts +4 -0
- package/lib/hooks/useDocumentOperations.js +52 -10
- package/lib/hooks/useMultiMasterDetailDcmts.d.ts +113 -0
- package/lib/hooks/useMultiMasterDetailDcmts.js +760 -0
- package/lib/hooks/useRelatedDocuments.d.ts +1 -0
- package/lib/hooks/useRelatedDocuments.js +22 -27
- package/lib/hooks/useShowDossiersV5.d.ts +12 -0
- package/lib/hooks/useShowDossiersV5.js +37 -0
- package/lib/hooks/useTMDistinctValuesMetadataDisplay.d.ts +18 -0
- package/lib/hooks/useTMDistinctValuesMetadataDisplay.js +103 -0
- package/lib/hooks/useTMDistinctValuesQuickSearch.d.ts +49 -0
- package/lib/hooks/useTMDistinctValuesQuickSearch.js +307 -0
- package/lib/hooks/useTMDistinctValuesSelection.d.ts +42 -0
- package/lib/hooks/useTMDistinctValuesSelection.js +103 -0
- package/lib/hooks/useTMDistinctValuesSource.d.ts +29 -0
- package/lib/hooks/useTMDistinctValuesSource.js +105 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +5 -2
- package/lib/services/caseflow/CaseFlowService.d.ts +236 -0
- package/lib/services/caseflow/CaseFlowService.js +693 -0
- package/lib/services/caseflow/CaseFlowTemplateCacheService.d.ts +28 -0
- package/lib/services/caseflow/CaseFlowTemplateCacheService.js +121 -0
- package/lib/services/caseflow/caseFlowNameCache.d.ts +32 -0
- package/lib/services/caseflow/caseFlowNameCache.js +116 -0
- package/lib/services/caseflow/caseFlowWorkItemUtils.d.ts +61 -0
- package/lib/services/caseflow/caseFlowWorkItemUtils.js +113 -0
- package/lib/services/index.d.ts +4 -0
- package/lib/services/index.js +4 -0
- package/lib/services/platform_services.d.ts +1 -1
- package/package.json +9 -5
|
@@ -1,18 +1,34 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useCallback, useMemo, useRef, useState } from "react";
|
|
3
3
|
import { ObjectClasses, SDK_Globals } from "@topconsultnpm/sdk-ts";
|
|
4
|
-
import { TASK_MORE_INFO_PREFIX_NAME, SDKUI_Localizator, PDGS_COLORS, calcResponsiveSizes } from "../../../helper";
|
|
4
|
+
import { TASK_MORE_INFO_PREFIX_NAME, SDKUI_Localizator, PDGS_COLORS, calcResponsiveSizes, isSign4TopEnabled } from "../../../helper";
|
|
5
5
|
import { TMColors } from "../../../utils/theme";
|
|
6
6
|
import { StyledReferenceButton } from "../../base/Styled";
|
|
7
7
|
import TMButton from "../../base/TMButton";
|
|
8
8
|
import TMModal from "../../base/TMModal";
|
|
9
9
|
import TMTooltip from "../../base/TMTooltip";
|
|
10
10
|
import { WorkFlowOperationButtons } from "../workflow/TMWorkflowPopup";
|
|
11
|
+
import { getWorkItemActionName, isSignatureWorkItem } from "../../../services/caseflow/caseFlowWorkItemUtils";
|
|
11
12
|
const TMDcmtFormActionButtons = (props) => {
|
|
12
|
-
const { showToppyForApprove, workItems, deviceType, isMobile, handleSignApprove, updateShowApprovePopup, updateShowRejectPopup, updateShowReAssignPopup, updateShowMoreInfoPopup, fromDTD, showToppyForCompleteMoreInfo, moreInfoTasks, setShowCommentForm, showToppyForReferences, dcmtReferences, referenceActionMap, handleNavigateToReference, setShowMoreInfoTaskPopup, setShowMoreInfoTaskTask } = props;
|
|
13
|
+
const { showToppyForApprove, workItems, caseFlowWorkItems, onCompleteCaseFlowWorkItem, onRejectCaseFlowWorkItem, deviceType, isMobile, handleSignApprove, updateShowApprovePopup, updateShowRejectPopup, updateShowReAssignPopup, updateShowMoreInfoPopup, fromDTD, showToppyForCompleteMoreInfo, moreInfoTasks, setShowCommentForm, showToppyForReferences, dcmtReferences, referenceActionMap, handleNavigateToReference, setShowMoreInfoTaskPopup, setShowMoreInfoTaskTask } = props;
|
|
13
14
|
const [showAllMoreInfoModal, setShowAllMoreInfoModal] = useState(false);
|
|
14
15
|
const [showAllDossiersModal, setShowAllDossiersModal] = useState(false);
|
|
15
16
|
const [showAllWorkingGroupsModal, setShowAllWorkingGroupsModal] = useState(false);
|
|
17
|
+
// Rifiuto di un'attività di pratica: il motivo è obbligatorio, quindi si passa
|
|
18
|
+
// da un dialogo. `busyItemId` disabilita i pulsanti dell'attività in corso.
|
|
19
|
+
const [rejectingItem, setRejectingItem] = useState(null);
|
|
20
|
+
const [rejectReason, setRejectReason] = useState('');
|
|
21
|
+
const [busyItemId, setBusyItemId] = useState(null);
|
|
22
|
+
const cfItems = useMemo(() => caseFlowWorkItems ?? [], [caseFlowWorkItems]);
|
|
23
|
+
const runCaseFlowAction = useCallback(async (item, action) => {
|
|
24
|
+
setBusyItemId(item.workItem.id ?? null);
|
|
25
|
+
try {
|
|
26
|
+
await action();
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
setBusyItemId(null);
|
|
30
|
+
}
|
|
31
|
+
}, []);
|
|
16
32
|
const tasksNumber = useMemo(() => moreInfoTasks?.length ?? 0, [moreInfoTasks]);
|
|
17
33
|
const firstTask = useMemo(() => {
|
|
18
34
|
if (!moreInfoTasks || moreInfoTasks.length === 0)
|
|
@@ -31,19 +47,66 @@ const TMDcmtFormActionButtons = (props) => {
|
|
|
31
47
|
return false;
|
|
32
48
|
return true;
|
|
33
49
|
}, [firstTask]);
|
|
34
|
-
const { hasMoreInfo, hasApprove, hasReferences } = useMemo(() => {
|
|
50
|
+
const { hasMoreInfo, hasApprove, hasReferences, hasCaseFlow } = useMemo(() => {
|
|
35
51
|
const referencesExist = showToppyForReferences && dcmtReferences?.some(ref => ref.objClass === ObjectClasses.Dossier || ref.objClass === ObjectClasses.WorkingGroup);
|
|
36
52
|
return {
|
|
37
53
|
hasMoreInfo: Boolean(showToppyForCompleteMoreInfo),
|
|
38
54
|
hasApprove: Boolean(showToppyForApprove),
|
|
39
|
-
hasReferences: Boolean(referencesExist)
|
|
55
|
+
hasReferences: Boolean(referencesExist),
|
|
56
|
+
hasCaseFlow: cfItems.length > 0
|
|
40
57
|
};
|
|
41
58
|
}, [
|
|
42
59
|
showToppyForCompleteMoreInfo,
|
|
43
60
|
showToppyForApprove,
|
|
44
61
|
showToppyForReferences,
|
|
45
|
-
dcmtReferences
|
|
62
|
+
dcmtReferences,
|
|
63
|
+
cfItems
|
|
46
64
|
]);
|
|
65
|
+
/**
|
|
66
|
+
* Attività di pratica: contesto (pratica + testo dell'attività) e gli STESSI
|
|
67
|
+
* pulsanti dei work item del workflow (`WorkFlowOperationButtons`), così le due
|
|
68
|
+
* provenienze si comportano allo stesso modo davanti all'utente.
|
|
69
|
+
*
|
|
70
|
+
* La forma dei pulsanti la decide la CATEGORIA dell'attività, non il tipo
|
|
71
|
+
* documento: un'approvazione su un tipo abilitato alla firma non deve mostrare
|
|
72
|
+
* "Firma e approva" (per questo si passa `signFlow`). La firma richiede comunque
|
|
73
|
+
* il widget Sign4Top sul tipo, altrimenti il viewer non avrebbe come aprirsi.
|
|
74
|
+
*
|
|
75
|
+
* Per la FIRMA il pulsante apre il viewer (`handleSignApprove`, lo stesso del
|
|
76
|
+
* workflow) e il completamento avviene lì a firma riuscita: il form non sa
|
|
77
|
+
* firmare, e completare qui "a fiducia" chiuderebbe l'attività su un documento
|
|
78
|
+
* non firmato.
|
|
79
|
+
*/
|
|
80
|
+
const renderCaseFlowWorkItemCard = (item) => {
|
|
81
|
+
const { caseflow, workItem } = item;
|
|
82
|
+
const isBusy = busyItemId === workItem.id;
|
|
83
|
+
const canSign = !!fromDTD?.widgets && isSign4TopEnabled(fromDTD.widgets);
|
|
84
|
+
const requiresSignature = isSignatureWorkItem(workItem) && canSign;
|
|
85
|
+
const description = workItem.description || getWorkItemActionName(caseflow, workItem);
|
|
86
|
+
return (_jsxs("div", { style: {
|
|
87
|
+
display: 'flex',
|
|
88
|
+
flexDirection: 'column',
|
|
89
|
+
alignItems: 'center',
|
|
90
|
+
textAlign: 'center',
|
|
91
|
+
gap: '10px',
|
|
92
|
+
cursor: 'default',
|
|
93
|
+
}, children: [description && (_jsx("div", { style: {
|
|
94
|
+
maxWidth: '240px',
|
|
95
|
+
paddingBottom: '8px',
|
|
96
|
+
borderBottom: '1px solid rgba(255,255,255,0.25)',
|
|
97
|
+
color: '#FFFFFF',
|
|
98
|
+
fontSize: '0.95rem',
|
|
99
|
+
fontWeight: 600,
|
|
100
|
+
lineHeight: 1.3,
|
|
101
|
+
letterSpacing: '0.2px',
|
|
102
|
+
textShadow: '0 1px 2px rgba(0,0,0,0.35)',
|
|
103
|
+
whiteSpace: 'pre-line',
|
|
104
|
+
}, children: description })), _jsx(WorkFlowOperationButtons, { dtd: fromDTD, deviceType: deviceType, signFlow: requiresSignature, approveDisable: isBusy, signApproveDisable: isBusy, rejectDisable: isBusy, onSignApprove: handleSignApprove, onApprove: onCompleteCaseFlowWorkItem
|
|
105
|
+
? () => void runCaseFlowAction(item, () => onCompleteCaseFlowWorkItem(item))
|
|
106
|
+
: undefined, onReject: onRejectCaseFlowWorkItem
|
|
107
|
+
? () => { setRejectReason(''); setRejectingItem(item); }
|
|
108
|
+
: undefined })] }, workItem.id));
|
|
109
|
+
};
|
|
47
110
|
// Raggruppa references per categoria
|
|
48
111
|
const { dossierRefs, workingGroupRefs } = useMemo(() => {
|
|
49
112
|
const dossiers = dcmtReferences?.filter(ref => ref.objClass === ObjectClasses.Dossier) ?? [];
|
|
@@ -171,10 +234,17 @@ const TMDcmtFormActionButtons = (props) => {
|
|
|
171
234
|
e.currentTarget.style.transform = 'translateY(-50%)';
|
|
172
235
|
}, children: formatBadgeCount(othersCount) }))] }));
|
|
173
236
|
};
|
|
174
|
-
return (_jsxs(_Fragment, { children: [_jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, children: [hasMoreInfo && firstTask && isMoreInfoCardVisible && (_jsx("div", { style: { display: 'flex', gap: "10px", flexDirection: 'column', alignItems: 'center', paddingRight: tasksNumber > 1 ? '36px' : '0' }, children: renderMoreInfoCard(firstTask, tasksNumber > 1) })), hasMoreInfo && isMoreInfoCardVisible && hasApprove && _jsx(Divider, {}), hasApprove && (workItems.length === 1 ?
|
|
237
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, children: [hasMoreInfo && firstTask && isMoreInfoCardVisible && (_jsx("div", { style: { display: 'flex', gap: "10px", flexDirection: 'column', alignItems: 'center', paddingRight: tasksNumber > 1 ? '36px' : '0' }, children: renderMoreInfoCard(firstTask, tasksNumber > 1) })), hasMoreInfo && isMoreInfoCardVisible && hasCaseFlow && _jsx(Divider, {}), hasCaseFlow && (_jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px', alignItems: 'center' }, children: cfItems.map(item => renderCaseFlowWorkItemCard(item)) })), hasCaseFlow && hasApprove && _jsx(Divider, {}), hasMoreInfo && isMoreInfoCardVisible && !hasCaseFlow && hasApprove && _jsx(Divider, {}), hasApprove && (workItems.length === 1 ?
|
|
175
238
|
_jsx(WorkFlowOperationButtons, { dtd: fromDTD, deviceType: deviceType, onApprove: () => updateShowApprovePopup(true), onSignApprove: handleSignApprove, onReject: () => updateShowRejectPopup(true), onReAssign: () => updateShowReAssignPopup(true), onMoreInfo: () => updateShowMoreInfoPopup(true) })
|
|
176
239
|
:
|
|
177
|
-
_jsxs("div", { style: { padding: 10, color: 'white', maxWidth: '180px', borderRadius: 10, background: '#1B1464 0% 0% no-repeat padding-box', border: '1px solid #FFFFFF' }, children: [`Questo documento è associato a ${workItems.length} workitem.`, _jsx("br", {}), `Per approvare, vai alla pagina "Approvazione workflow".`] })), (hasApprove && hasReferences) || (hasMoreInfo && isMoreInfoCardVisible && !hasApprove && hasReferences) ? (_jsx(Divider, {})) : null, hasReferences && (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px', alignItems: 'center' }, children: [dossierRefs.length > 0 && (_jsx("div", { style: { paddingRight: dossierRefs.length > 1 ? '36px' : '0' }, children: renderReferenceCard(dossierRefs[0], dossierRefs, dossierRefs.length > 1, () => setShowAllDossiersModal(true)) })), workingGroupRefs.length > 0 && (_jsx("div", { style: { paddingRight: workingGroupRefs.length > 1 ? '36px' : '0' }, children: renderReferenceCard(workingGroupRefs[0], workingGroupRefs, workingGroupRefs.length > 1, () => setShowAllWorkingGroupsModal(true)) }))] }))] }),
|
|
240
|
+
_jsxs("div", { style: { padding: 10, color: 'white', maxWidth: '180px', borderRadius: 10, background: '#1B1464 0% 0% no-repeat padding-box', border: '1px solid #FFFFFF' }, children: [`Questo documento è associato a ${workItems.length} workitem.`, _jsx("br", {}), `Per approvare, vai alla pagina "Approvazione workflow".`] })), (hasApprove && hasReferences) || (hasMoreInfo && isMoreInfoCardVisible && !hasApprove && hasReferences) ? (_jsx(Divider, {})) : null, hasReferences && (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px', alignItems: 'center' }, children: [dossierRefs.length > 0 && (_jsx("div", { style: { paddingRight: dossierRefs.length > 1 ? '36px' : '0' }, children: renderReferenceCard(dossierRefs[0], dossierRefs, dossierRefs.length > 1, () => setShowAllDossiersModal(true)) })), workingGroupRefs.length > 0 && (_jsx("div", { style: { paddingRight: workingGroupRefs.length > 1 ? '36px' : '0' }, children: renderReferenceCard(workingGroupRefs[0], workingGroupRefs, workingGroupRefs.length > 1, () => setShowAllWorkingGroupsModal(true)) }))] }))] }), rejectingItem && onRejectCaseFlowWorkItem && (_jsx(TMModal, { title: rejectingItem.workItem.rejectLabel || SDKUI_Localizator.Reject, onClose: () => { setRejectingItem(null); setRejectReason(''); }, width: calcResponsiveSizes(deviceType, '450px', '450px', '95%'), height: 'auto', children: _jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: 12, padding: 15 }, children: [_jsx("div", { style: { fontSize: 13, color: '#555' }, children: `${SDKUI_Localizator.Description}:` }), _jsx("textarea", { value: rejectReason, onChange: (e) => setRejectReason(e.target.value), rows: 4, style: { width: '100%', resize: 'vertical', fontFamily: 'inherit', fontSize: 13, padding: 8 } }), _jsxs("div", { style: { display: 'flex', justifyContent: 'flex-end', gap: 8 }, children: [_jsx(TMButton, { caption: SDKUI_Localizator.Cancel, showTooltip: false, onClick: () => { setRejectingItem(null); setRejectReason(''); } }), _jsx(TMButton, { caption: rejectingItem.workItem.rejectLabel || SDKUI_Localizator.Reject, color: 'error', showTooltip: false, disabled: !rejectReason.trim() || busyItemId === rejectingItem.workItem.id, onClick: () => {
|
|
241
|
+
const item = rejectingItem;
|
|
242
|
+
void runCaseFlowAction(item, async () => {
|
|
243
|
+
await onRejectCaseFlowWorkItem(item, rejectReason.trim());
|
|
244
|
+
setRejectingItem(null);
|
|
245
|
+
setRejectReason('');
|
|
246
|
+
});
|
|
247
|
+
} })] })] }) })), showAllMoreInfoModal && moreInfoTasks && moreInfoTasks.length > 1 && (_jsx(TMModal, { title: `Altre richieste maggiori informazioni (${moreInfoTasks.length - 1})`, onClose: () => setShowAllMoreInfoModal(false), width: calcResponsiveSizes(deviceType, '450px', '450px', '95%'), height: 'auto', children: _jsx("div", { style: {
|
|
178
248
|
display: 'flex',
|
|
179
249
|
flexDirection: 'column',
|
|
180
250
|
gap: '8px',
|
|
@@ -54,9 +54,11 @@ const TMDcmtIcon = ({ fileExtension, fileCount, isLexProt, isSigned, isMail, isS
|
|
|
54
54
|
cursor: isMobile
|
|
55
55
|
? (isDownloadable ? "pointer" : undefined)
|
|
56
56
|
: (isDownloadable ? "default" : undefined)
|
|
57
|
-
}, ...(
|
|
58
|
-
? {
|
|
59
|
-
:
|
|
57
|
+
}, ...(downloadMode === "none"
|
|
58
|
+
? {}
|
|
59
|
+
: deviceType === DeviceType.MOBILE
|
|
60
|
+
? { onClick: handleDownloadAction } // Su mobile, un singolo click sull'icona avvia il download
|
|
61
|
+
: { onDoubleClick: handleDownloadAction } // Su desktop, un doppio click sull'icona avvia il download
|
|
60
62
|
), children: [icon, 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 }) }) }), showWaitPanel && (usePortal ? createPortal(_jsx(TMWaitPanel, { title: waitPanelTitle, showSecondary: showSecondary, textSecondary: waitPanelTextSecondary, valueSecondary: waitPanelValueSecondary, maxValueSecondary: waitPanelMaxValueSecondary, isCancelable: true, abortController: abortController, onAbortClick: (abortController) => { setTimeout(() => { abortController?.abort(); }, 1000); }, useHighZIndex: true }), document.body) : (_jsx(TMWaitPanel, { title: waitPanelTitle, showSecondary: showSecondary, textSecondary: waitPanelTextSecondary, valueSecondary: waitPanelValueSecondary, maxValueSecondary: waitPanelMaxValueSecondary, isCancelable: true, abortController: abortController, onAbortClick: (abortController) => { setTimeout(() => { abortController?.abort(); }, 1000); } })))] }));
|
|
61
63
|
};
|
|
62
64
|
export default TMDcmtIcon;
|
|
@@ -26,9 +26,11 @@ export declare const TMNothingToShow: ({ text, secondText, fileExt, icon }: {
|
|
|
26
26
|
fileExt?: string;
|
|
27
27
|
icon?: any;
|
|
28
28
|
}) => React.JSX.Element;
|
|
29
|
-
export declare const StyledHeaderIcon: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").
|
|
29
|
+
export declare const StyledHeaderIcon: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Merged<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
|
|
30
|
+
style?: React.CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
31
|
+
}, {
|
|
30
32
|
$color: string;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
}>> & string;
|
|
34
|
+
export declare const StyledPanelStatusContainer: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
|
|
35
|
+
style?: React.CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
36
|
+
}> & string;
|
|
@@ -50,13 +50,17 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
|
|
|
50
50
|
return;
|
|
51
51
|
}
|
|
52
52
|
const currentCacheKey = isBasketMode ? `basket-${dcmtData.btid}-${dcmtData.bid}-${dcmtData.bfid}` : `${dcmtData.tid}-${dcmtData.did}`;
|
|
53
|
-
|
|
53
|
+
// Fuori campo non si carica: l'anteprima nativa creata in una pagina non a video resta rotta
|
|
54
|
+
if (!isVisible)
|
|
55
|
+
return;
|
|
56
|
+
// Documento già caricato: ricaricarlo ricreerebbe il visualizzatore senza motivo
|
|
57
|
+
if (hasLoadedDataOnce && currentCacheKey === lastLoadedDid)
|
|
58
|
+
return;
|
|
54
59
|
if (isDcmtFileInCache(currentCacheKey)) {
|
|
55
60
|
isBasketMode ? loadBasketFile() : loadDocumentWithCache();
|
|
56
61
|
setShowPreview(true);
|
|
57
|
-
return;
|
|
58
62
|
}
|
|
59
|
-
|
|
63
|
+
else {
|
|
60
64
|
setDcmtBlob(undefined);
|
|
61
65
|
setError('');
|
|
62
66
|
setIsAbortError(false);
|
|
@@ -71,10 +75,10 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
|
|
|
71
75
|
else {
|
|
72
76
|
setShowPreview(false);
|
|
73
77
|
}
|
|
74
|
-
setHasLoadedDataOnce(true);
|
|
75
|
-
setLastLoadedDid(currentCacheKey);
|
|
76
78
|
}
|
|
77
|
-
|
|
79
|
+
setHasLoadedDataOnce(true);
|
|
80
|
+
setLastLoadedDid(currentCacheKey);
|
|
81
|
+
}, [dcmtData?.tid, dcmtData?.did, isVisible, hasLoadedDataOnce, lastLoadedDid]);
|
|
78
82
|
const loadBasketFile = async () => {
|
|
79
83
|
try {
|
|
80
84
|
// Check cache first
|
|
@@ -3,7 +3,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
|
3
3
|
import { DcmtTypeListCacheService, LayoutModes, ObjectClasses, SDK_Globals, SDK_Localizator } from '@topconsultnpm/sdk-ts';
|
|
4
4
|
import TMRelationViewer from './TMRelationViewer';
|
|
5
5
|
import TMContextMenu from '../../NewComponents/ContextMenu/TMContextMenu';
|
|
6
|
-
import { IconMultipleSelection, IconCheckFile, IconDetailDcmts, SDKUI_Localizator, IconMenuVertical, IconDataList, IconPreview, IconSearchCheck, IconBoard, IconDcmtTypeSys, IconShow, getMoreInfoTasksForDocument, isApprovalWorkflowView, searchResultToMetadataValues, IconRefresh } from '../../../helper';
|
|
6
|
+
import { IconMultipleSelection, IconCheckFile, IconDetailDcmts, SDKUI_Localizator, IconMenuVertical, IconDataList, IconPreview, IconSearchCheck, IconBoard, IconDcmtTypeSys, IconShow, getMoreInfoTasksForDocument, isApprovalWorkflowView, searchResultToMetadataValues, IconRefresh, SDKUI_Globals } from '../../../helper';
|
|
7
7
|
import { FormModes, SearchResultContext } from '../../../ts';
|
|
8
8
|
import { TMColors } from '../../../utils/theme';
|
|
9
9
|
import ShowAlert from '../../base/TMAlert';
|
|
@@ -23,7 +23,7 @@ const TMMasterDetailDcmts = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallba
|
|
|
23
23
|
const floatingBarContainerRef = useRef(null);
|
|
24
24
|
const [focusedItem, setFocusedItem] = useState();
|
|
25
25
|
const [selectedItems, setSelectedItems] = useState([]);
|
|
26
|
-
const [showZeroDcmts, setShowZeroDcmts] = useState(false);
|
|
26
|
+
const [showZeroDcmts, setShowZeroDcmts] = useState(() => SDKUI_Globals.userSettings?.searchSettings?.relationShowZeroDcmts ?? false);
|
|
27
27
|
const [allowMultipleSelection, setAllowMultipleSelection] = useState(false);
|
|
28
28
|
const [dtdMaster, setDtdMaster] = useState();
|
|
29
29
|
const [noRelationsOnFirstLoad, setNoRelationsOnFirstLoad] = useState(false);
|
|
@@ -32,6 +32,11 @@ const TMMasterDetailDcmts = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallba
|
|
|
32
32
|
const [contextMenuPosition, setContextMenuPosition] = useState({ x: 0, y: 0 });
|
|
33
33
|
// Track if TMRelationViewer is loading (used to disable context menu during loading)
|
|
34
34
|
const [isRelationViewerLoading, setIsRelationViewerLoading] = useState(false);
|
|
35
|
+
// Funzione fornita da TMRelationViewer per interrompere il calcolo delle correlazioni
|
|
36
|
+
// (nessuna ulteriore chiamata GetMetadata). È sincrona: invocabile anche subito prima di uscire.
|
|
37
|
+
const stopRelationsCalculationRef = useRef(undefined);
|
|
38
|
+
// True quando si sta uscendo dalla maschera: evita l'alert sui risultati parziali
|
|
39
|
+
const isLeavingRef = useRef(false);
|
|
35
40
|
// Track if loading has ever been TRUE (to distinguish initial false from post-load false)
|
|
36
41
|
const hasLoadingBeenTrueRef = useRef(false);
|
|
37
42
|
// Track the previous loading state to detect transitions
|
|
@@ -63,6 +68,39 @@ const TMMasterDetailDcmts = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallba
|
|
|
63
68
|
const onRefreshOperationsDatagrid = useCallback(async () => {
|
|
64
69
|
setRefreshOperationsTrigger(prev => prev + 1);
|
|
65
70
|
}, []);
|
|
71
|
+
// Riceve da TMRelationViewer la funzione per interrompere il calcolo
|
|
72
|
+
const handleStopCalculationReady = useCallback((stopCalculation) => {
|
|
73
|
+
stopRelationsCalculationRef.current = stopCalculation;
|
|
74
|
+
}, []);
|
|
75
|
+
// Interrompe il calcolo delle correlazioni: mostra subito quelle già calcolate
|
|
76
|
+
// senza attendere le restanti chiamate GetMetadata
|
|
77
|
+
const handleStopRelationsCalculation = useCallback(() => {
|
|
78
|
+
stopRelationsCalculationRef.current?.();
|
|
79
|
+
setIsCheckingFirstLoad(false); // Nasconde l'overlay e mostra l'albero (parziale)
|
|
80
|
+
}, []);
|
|
81
|
+
// Esce dalla maschera interrompendo anche le chiamate GetMetadata ancora in coda:
|
|
82
|
+
// l'interruzione è invocata in modo sincrono perché onBack può smontare il componente
|
|
83
|
+
// (un effect non farebbe in tempo a propagare l'interruzione)
|
|
84
|
+
const handleBack = useCallback(() => {
|
|
85
|
+
isLeavingRef.current = true;
|
|
86
|
+
stopRelationsCalculationRef.current?.();
|
|
87
|
+
onBack?.();
|
|
88
|
+
}, [onBack]);
|
|
89
|
+
const handleCancelFirstLoad = useCallback(() => {
|
|
90
|
+
setIsCheckingFirstLoad(false);
|
|
91
|
+
handleBack();
|
|
92
|
+
}, [handleBack]);
|
|
93
|
+
// Notifica all'utente che i dati mostrati sono parziali (non quando si sta uscendo)
|
|
94
|
+
const handleRelationsCalculationStopped = useCallback(() => {
|
|
95
|
+
if (isLeavingRef.current)
|
|
96
|
+
return;
|
|
97
|
+
ShowAlert({
|
|
98
|
+
message: SDKUI_Localizator.RelationsCalculationStopped,
|
|
99
|
+
title: SDKUI_Localizator.Attention,
|
|
100
|
+
duration: 4000,
|
|
101
|
+
mode: 'info',
|
|
102
|
+
});
|
|
103
|
+
}, []);
|
|
66
104
|
// Refresh ALL panels (tree view + search results) with fade-out -> update -> fade-in transition
|
|
67
105
|
const onRefreshAllPanels = async () => {
|
|
68
106
|
await dcmtUtility?.onRefreshPreviewForm?.(); // Refresh preview form data
|
|
@@ -238,6 +276,12 @@ const TMMasterDetailDcmts = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallba
|
|
|
238
276
|
},
|
|
239
277
|
});
|
|
240
278
|
const { dcmtOperations: { abortController, showWaitPanel, showPrimary, waitPanelTitle, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, }, } = features;
|
|
279
|
+
// Nuovi documenti in input: il componente non sta più uscendo dalla maschera
|
|
280
|
+
// (chiave stabile: l'array inputDcmts può essere ricreato a ogni render)
|
|
281
|
+
const inputDcmtsKey = useMemo(() => (inputDcmts ?? []).map(d => `${d.TID}-${d.DID}`).join('|'), [inputDcmts]);
|
|
282
|
+
useEffect(() => {
|
|
283
|
+
isLeavingRef.current = false;
|
|
284
|
+
}, [inputDcmtsKey]);
|
|
241
285
|
// Load dtdMaster when inputDcmts changes
|
|
242
286
|
useEffect(() => {
|
|
243
287
|
const loadDtdMaster = async () => {
|
|
@@ -300,7 +344,11 @@ const TMMasterDetailDcmts = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallba
|
|
|
300
344
|
icon: _jsx(IconCheckFile, { color: showZeroDcmts ? TMColors.tertiary : TMColors.text_normal }),
|
|
301
345
|
name: showZeroDcmts ? SDKUI_Localizator.HideDetailsWithZeroDocs : SDKUI_Localizator.ShowDetailsWithZeroDocs,
|
|
302
346
|
onClick: () => {
|
|
303
|
-
setShowZeroDcmts(prev =>
|
|
347
|
+
setShowZeroDcmts(prev => {
|
|
348
|
+
const newValue = !prev;
|
|
349
|
+
SDKUI_Globals.userSettings.searchSettings.relationShowZeroDcmts = newValue;
|
|
350
|
+
return newValue;
|
|
351
|
+
});
|
|
304
352
|
}
|
|
305
353
|
},
|
|
306
354
|
{
|
|
@@ -331,11 +379,11 @@ const TMMasterDetailDcmts = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallba
|
|
|
331
379
|
setContextMenuVisible(true);
|
|
332
380
|
}, children: [_jsx(TMRelationViewerWrapper, { refreshKey: refreshKey, inputDcmts: inputDcmts, isForMaster: isForMaster, showCurrentDcmtIndicator: showCurrentDcmtIndicator, showZeroDcmts: showZeroDcmts,
|
|
333
381
|
// customItemRender={customItemRender}
|
|
334
|
-
allowMultipleSelection: allowMultipleSelection, focusedItem: focusedItem, selectedItems: selectedItems, onFocusedItemChanged: handleFocusedItemChanged, onSelectedItemsChanged: handleSelectedItemsChanged, onNoRelationsFound: handleNoRelationsFound, onItemContextMenu: isRelationViewerLoading ? undefined : onItemContextMenu, focusedItemFormData: focusedItemFormData, onLoadingStateChanged: setIsRelationViewerLoading }), _jsx(TMContextMenu, { items: operationItems, externalControl: {
|
|
382
|
+
allowMultipleSelection: allowMultipleSelection, focusedItem: focusedItem, selectedItems: selectedItems, onFocusedItemChanged: handleFocusedItemChanged, onSelectedItemsChanged: handleSelectedItemsChanged, onNoRelationsFound: handleNoRelationsFound, onItemContextMenu: isRelationViewerLoading ? undefined : onItemContextMenu, focusedItemFormData: focusedItemFormData, onLoadingStateChanged: setIsRelationViewerLoading, onStopCalculationReady: handleStopCalculationReady, onCalculationStopped: handleRelationsCalculationStopped }), _jsx(TMContextMenu, { items: operationItems, externalControl: {
|
|
335
383
|
visible: contextMenuVisible,
|
|
336
384
|
position: contextMenuPosition,
|
|
337
385
|
onClose: () => setContextMenuVisible(false)
|
|
338
|
-
} })] }) }), [inputDcmts, isForMaster, showCurrentDcmtIndicator, showZeroDcmts, allowMultipleSelection, focusedItem, selectedItems, handleFocusedItemChanged, handleSelectedItemsChanged, handleNoRelationsFound, onItemContextMenu, contextMenuVisible, contextMenuPosition, refreshKey, focusedItemFormData, isRelationViewerLoading]);
|
|
386
|
+
} })] }) }), [inputDcmts, isForMaster, showCurrentDcmtIndicator, showZeroDcmts, allowMultipleSelection, focusedItem, selectedItems, handleFocusedItemChanged, handleSelectedItemsChanged, handleNoRelationsFound, onItemContextMenu, contextMenuVisible, contextMenuPosition, refreshKey, focusedItemFormData, isRelationViewerLoading, handleStopCalculationReady, handleRelationsCalculationStopped]);
|
|
339
387
|
const tmFormOrResult = useMemo(() => _jsx(TMFormOrResultWrapper, { refreshKey: refreshKeyFormOrResult, deviceType: deviceType, focusedItem: focusedItem, onTaskCreateRequest: onTaskCreateRequest, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, handleNavigateToReference: handleNavigateToReference, onRefreshAfterAddDcmtToFavs: onRefreshAfterAddDcmtToFavs, editPdfForm: editPdfForm, openS4TViewer: openS4TViewer, onOpenS4TViewerRequest: onOpenS4TViewerRequest, onOpenPdfEditorRequest: onOpenPdfEditorRequest, onRefreshSearchResults: onRefreshAllPanels }), [focusedItem, deviceType, allTasks, handleNavigateToWGs, handleNavigateToDossiers, handleNavigateToReference, editPdfForm, openS4TViewer, onOpenS4TViewerRequest, onOpenPdfEditorRequest, onRefreshAfterAddDcmtToFavs, refreshKeyFormOrResult]);
|
|
340
388
|
const initialPanelDimensions = {
|
|
341
389
|
'tmTreeView': { width: '50%', height: '100%' },
|
|
@@ -366,7 +414,9 @@ const TMMasterDetailDcmts = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallba
|
|
|
366
414
|
title: getTitle(),
|
|
367
415
|
toolbar: toolbar,
|
|
368
416
|
allowMaximize: !isMobile,
|
|
369
|
-
|
|
417
|
+
// handleBack interrompe il calcolo prima di uscire.
|
|
418
|
+
// Resta undefined se il padre non ha passato onBack (nessun pulsante indietro)
|
|
419
|
+
onBack: onBack ? handleBack : undefined
|
|
370
420
|
}
|
|
371
421
|
},
|
|
372
422
|
toolbarOptions: {
|
|
@@ -413,10 +463,7 @@ const TMMasterDetailDcmts = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallba
|
|
|
413
463
|
toolbarOptions: { icon: _jsx(IconSearchCheck, { fontSize: 24 }), visible: false, orderNumber: 2, isActive: allInitialPanelVisibility['tmFormOrResult'] }
|
|
414
464
|
}
|
|
415
465
|
], [tmTreeView, tmFormOrResult, focusedItem?.isDcmt, dtdMaster]);
|
|
416
|
-
return (_jsxs("div", { style: { width: '100%', height: '100%', position: 'relative' }, children: [isCheckingFirstLoad && (_jsx(TMLoadingOverlay, { onCancel: ()
|
|
417
|
-
setIsCheckingFirstLoad(false);
|
|
418
|
-
onBack?.();
|
|
419
|
-
} })), _jsxs("div", { style: isCheckingFirstLoad ? { position: 'absolute', width: 0, height: 0, overflow: 'hidden', opacity: 0, pointerEvents: 'none' } : { width: '100%', height: '100%' }, children: [_jsx(TMLayoutWaitingContainer, { direction: 'vertical', showWaitPanel: showWaitPanel, showWaitPanelPrimary: showPrimary, showWaitPanelSecondary: showSecondary, waitPanelTitle: waitPanelTitle, waitPanelTextPrimary: waitPanelTextPrimary, waitPanelValuePrimary: waitPanelValuePrimary, waitPanelMaxValuePrimary: waitPanelMaxValuePrimary, waitPanelTextSecondary: waitPanelTextSecondary, waitPanelValueSecondary: waitPanelValueSecondary, waitPanelMaxValueSecondary: waitPanelMaxValueSecondary, isCancelable: true, abortController: abortController, children: _jsx(TMPanelManagerProvider, { panels: initialPanels, initialVisibility: allInitialPanelVisibility, defaultDimensions: initialPanelDimensions, initialDimensions: initialPanelDimensions, initialMobilePanelId: 'tmTreeView', children: _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", showToolbar: true }) }) }), renderDcmtOperations, renderFloatingBar] })] }));
|
|
466
|
+
return (_jsxs("div", { style: { width: '100%', height: '100%', position: 'relative' }, children: [isCheckingFirstLoad && (_jsx(TMLoadingOverlay, { onCancel: handleCancelFirstLoad, onStop: handleStopRelationsCalculation })), _jsxs("div", { style: isCheckingFirstLoad ? { position: 'absolute', width: 0, height: 0, overflow: 'hidden', opacity: 0, pointerEvents: 'none' } : { width: '100%', height: '100%' }, children: [_jsx(TMLayoutWaitingContainer, { direction: 'vertical', showWaitPanel: showWaitPanel, showWaitPanelPrimary: showPrimary, showWaitPanelSecondary: showSecondary, waitPanelTitle: waitPanelTitle, waitPanelTextPrimary: waitPanelTextPrimary, waitPanelValuePrimary: waitPanelValuePrimary, waitPanelMaxValuePrimary: waitPanelMaxValuePrimary, waitPanelTextSecondary: waitPanelTextSecondary, waitPanelValueSecondary: waitPanelValueSecondary, waitPanelMaxValueSecondary: waitPanelMaxValueSecondary, isCancelable: true, abortController: abortController, children: _jsx(TMPanelManagerProvider, { panels: initialPanels, initialVisibility: allInitialPanelVisibility, defaultDimensions: initialPanelDimensions, initialDimensions: initialPanelDimensions, initialMobilePanelId: 'tmTreeView', children: _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", showToolbar: true }) }) }), renderDcmtOperations, renderFloatingBar] })] }));
|
|
420
467
|
};
|
|
421
468
|
export default TMMasterDetailDcmts;
|
|
422
469
|
/**
|
|
@@ -425,7 +472,7 @@ export default TMMasterDetailDcmts;
|
|
|
425
472
|
* - Panel visibility toggling
|
|
426
473
|
* - Focus delay handling
|
|
427
474
|
*/
|
|
428
|
-
const TMRelationViewerWrapper = ({ refreshKey, inputDcmts, isForMaster, showCurrentDcmtIndicator, showZeroDcmts, customItemRender, allowMultipleSelection, focusedItem, selectedItems, onFocusedItemChanged, onSelectedItemsChanged, onNoRelationsFound, onItemContextMenu, focusedItemFormData, onLoadingStateChanged }) => {
|
|
475
|
+
const TMRelationViewerWrapper = ({ refreshKey, inputDcmts, isForMaster, showCurrentDcmtIndicator, showZeroDcmts, customItemRender, allowMultipleSelection, focusedItem, selectedItems, onFocusedItemChanged, onSelectedItemsChanged, onNoRelationsFound, onItemContextMenu, focusedItemFormData, onLoadingStateChanged, onStopCalculationReady, onCalculationStopped }) => {
|
|
429
476
|
const { setPanelVisibilityById, setToolbarButtonVisibility } = useTMPanelManagerContext();
|
|
430
477
|
// Monitor device type changes to restore panel visibility when switching from mobile to desktop
|
|
431
478
|
const deviceType = useDeviceType();
|
|
@@ -485,7 +532,7 @@ const TMRelationViewerWrapper = ({ refreshKey, inputDcmts, isForMaster, showCurr
|
|
|
485
532
|
onItemContextMenu?.(item, e);
|
|
486
533
|
}, 100);
|
|
487
534
|
}, [onItemContextMenu, handleFocusedItemChanged]);
|
|
488
|
-
return (_jsx(TMRelationViewer, { inputDcmts: inputDcmts, isForMaster: isForMaster, showCurrentDcmtIndicator: showCurrentDcmtIndicator, initialShowZeroDcmts: showZeroDcmts, customItemRender: customItemRender, allowMultipleSelection: allowMultipleSelection, focusedItem: focusedItem, selectedItems: selectedItems, onFocusedItemChanged: handleFocusedItemChanged, onSelectedItemsChanged: onSelectedItemsChanged, maxDepthLevel: 1, invertMasterNavigation: false, showExpandAllButton: true, onNoRelationsFound: onNoRelationsFound, onItemContextMenu: onContextMenu, focusedItemFormData: focusedItemFormData, onLoadingStateChanged: onLoadingStateChanged }, refreshKey));
|
|
535
|
+
return (_jsx(TMRelationViewer, { inputDcmts: inputDcmts, isForMaster: isForMaster, showCurrentDcmtIndicator: showCurrentDcmtIndicator, initialShowZeroDcmts: showZeroDcmts, customItemRender: customItemRender, allowMultipleSelection: allowMultipleSelection, focusedItem: focusedItem, selectedItems: selectedItems, onFocusedItemChanged: handleFocusedItemChanged, onSelectedItemsChanged: onSelectedItemsChanged, maxDepthLevel: 1, invertMasterNavigation: false, showExpandAllButton: true, onNoRelationsFound: onNoRelationsFound, onItemContextMenu: onContextMenu, focusedItemFormData: focusedItemFormData, onLoadingStateChanged: onLoadingStateChanged, onStopCalculationReady: onStopCalculationReady, onCalculationStopped: onCalculationStopped }, refreshKey));
|
|
489
536
|
};
|
|
490
537
|
const TMFormOrResultWrapper = ({ refreshKey, deviceType, focusedItem, onTaskCreateRequest, allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, handleNavigateToWGs, handleNavigateToDossiers, onRefreshAfterAddDcmtToFavs, editPdfForm, openS4TViewer, onOpenS4TViewerRequest, onOpenPdfEditorRequest, onRefreshSearchAsyncDatagrid, onRefreshSearchResults, handleNavigateToReference, fetchRemoteCertificates }) => {
|
|
491
538
|
const { setPanelVisibilityById } = useTMPanelManagerContext();
|
|
@@ -495,7 +542,7 @@ const TMFormOrResultWrapper = ({ refreshKey, deviceType, focusedItem, onTaskCrea
|
|
|
495
542
|
}, fetchRemoteCertificates: fetchRemoteCertificates }, refreshKey) :
|
|
496
543
|
focusedItem?.searchResult === undefined ? (_jsx(TMPanel, { title: SDKUI_Localizator.SearchResult, children: _jsx(TMToppyMessage, { message: SDKUI_Localizator.SelectDocumentToViewSearchResults }) })) : (_jsx(TMSearchResult, { groupId: 'tmFormOrResult', isClosable: deviceType !== DeviceType.MOBILE, context: SearchResultContext.METADATA_SEARCH, allowFloatingBar: false, allowRelations: false, openDcmtFormAsModal: true, searchResults: focusedItem?.searchResult ?? [], showSearchResultSidebar: false, showDcmtFormSidebar: false, autoFocusFirstRow: false, onTaskCreateRequest: onTaskCreateRequest, onClose: () => { setPanelVisibilityById('tmTreeView', true); }, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, editPdfForm: editPdfForm, onOpenPdfEditorRequest: onOpenPdfEditorRequest, openS4TViewer: openS4TViewer, onOpenS4TViewerRequest: onOpenS4TViewerRequest, enablePinIcons: false, onRefreshAfterAddDcmtToFavs: onRefreshAfterAddDcmtToFavs, showBackButton: false, onRefreshSearchAsyncDatagrid: onRefreshSearchResults, onReferenceClick: handleNavigateToReference, fetchRemoteCertificates: fetchRemoteCertificates }, refreshKey)) }));
|
|
497
544
|
};
|
|
498
|
-
const TMLoadingOverlay = ({ onCancel, description, cancelText }) => {
|
|
545
|
+
const TMLoadingOverlay = ({ onCancel, onStop, description, cancelText, stopText }) => {
|
|
499
546
|
return (_jsx("div", { style: {
|
|
500
547
|
position: 'absolute',
|
|
501
548
|
top: 0,
|
|
@@ -565,24 +612,39 @@ const TMLoadingOverlay = ({ onCancel, description, cancelText }) => {
|
|
|
565
612
|
.tm-spinner-animation div:nth-child(7):after { top: 63px; left: 17px; background: #782b7d; }
|
|
566
613
|
.tm-spinner-animation div:nth-child(8) { animation-delay: -0.288s; }
|
|
567
614
|
.tm-spinner-animation div:nth-child(8):after { top: 56px; left: 12px; background: #782b7d; }
|
|
568
|
-
` }), _jsxs("div", { className: "tm-spinner-animation", children: [_jsx("div", {}), _jsx("div", {}), _jsx("div", {}), _jsx("div", {}), _jsx("div", {}), _jsx("div", {}), _jsx("div", {}), _jsx("div", {})] })] }), _jsx("span", { style: { fontSize: '14px', color: '#334155', textAlign: 'center' }, children: description ?? SDKUI_Localizator.Loading }), onCancel && (_jsx("button", { onClick:
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
615
|
+
` }), _jsxs("div", { className: "tm-spinner-animation", children: [_jsx("div", {}), _jsx("div", {}), _jsx("div", {}), _jsx("div", {}), _jsx("div", {}), _jsx("div", {}), _jsx("div", {}), _jsx("div", {})] })] }), _jsx("span", { style: { fontSize: '14px', color: '#334155', textAlign: 'center' }, children: description ?? SDKUI_Localizator.Loading }), (onStop || onCancel) && (_jsxs("div", { style: { marginTop: '4px', display: 'flex', alignItems: 'center', justifyContent: 'center', flexWrap: 'wrap', gap: '10px' }, children: [onStop && (_jsx("button", { onClick: onStop, title: SDKUI_Localizator.StopRelationsCalculation, style: {
|
|
616
|
+
padding: '8px 24px',
|
|
617
|
+
fontSize: '13px',
|
|
618
|
+
fontWeight: 500,
|
|
619
|
+
color: 'white',
|
|
620
|
+
background: '#0c448e',
|
|
621
|
+
border: '1.5px solid #0c448e',
|
|
622
|
+
borderRadius: '6px',
|
|
623
|
+
cursor: 'pointer',
|
|
624
|
+
transition: 'all 0.2s ease',
|
|
625
|
+
}, onMouseEnter: (e) => {
|
|
626
|
+
e.currentTarget.style.background = '#0a3872';
|
|
627
|
+
e.currentTarget.style.borderColor = '#0a3872';
|
|
628
|
+
}, onMouseLeave: (e) => {
|
|
629
|
+
e.currentTarget.style.background = '#0c448e';
|
|
630
|
+
e.currentTarget.style.borderColor = '#0c448e';
|
|
631
|
+
}, children: stopText ?? SDKUI_Localizator.ShowPartialResults })), onCancel && (_jsx("button", { onClick: onCancel, style: {
|
|
632
|
+
padding: '8px 24px',
|
|
633
|
+
fontSize: '13px',
|
|
634
|
+
fontWeight: 500,
|
|
635
|
+
color: '#64748b',
|
|
636
|
+
background: 'transparent',
|
|
637
|
+
border: '1.5px solid #cbd5e1',
|
|
638
|
+
borderRadius: '6px',
|
|
639
|
+
cursor: 'pointer',
|
|
640
|
+
transition: 'all 0.2s ease',
|
|
641
|
+
}, onMouseEnter: (e) => {
|
|
642
|
+
e.currentTarget.style.background = '#f1f5f9';
|
|
643
|
+
e.currentTarget.style.borderColor = '#94a3b8';
|
|
644
|
+
e.currentTarget.style.color = '#475569';
|
|
645
|
+
}, onMouseLeave: (e) => {
|
|
646
|
+
e.currentTarget.style.background = 'transparent';
|
|
647
|
+
e.currentTarget.style.borderColor = '#cbd5e1';
|
|
648
|
+
e.currentTarget.style.color = '#64748b';
|
|
649
|
+
}, children: cancelText ?? SDKUI_Localizator.Back }))] }))] }) }));
|
|
588
650
|
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { DcmtTypeDescriptor } from '@topconsultnpm/sdk-ts';
|
|
3
|
+
import { DcmtInfo } from '../../../ts';
|
|
4
|
+
interface TMMasterInfoFieldsProps {
|
|
5
|
+
/** Tipo documento: definisce i metadati (utente) da mostrare e come formattarli */
|
|
6
|
+
dtd: DcmtTypeDescriptor | undefined;
|
|
7
|
+
/** Documento di cui mostrare i metadati: se cambia, i valori vengono riletti */
|
|
8
|
+
dcmt: DcmtInfo | undefined;
|
|
9
|
+
/** Legge i valori del documento indicizzati per mid (il chiamante li tiene in cache) */
|
|
10
|
+
getValuesByMidAsync: () => Promise<Map<number, any>>;
|
|
11
|
+
/** Incrementare per forzare la rilettura dei valori (es. dopo il salvataggio del documento) */
|
|
12
|
+
reloadToken?: number;
|
|
13
|
+
/**
|
|
14
|
+
* Vista a tutto schermo: c'è spazio per tutti i metadati, quindi niente limite dell'anteprima
|
|
15
|
+
* ed è qui che compare la ricerca per nome/valore.
|
|
16
|
+
*/
|
|
17
|
+
isExpandedView?: boolean;
|
|
18
|
+
}
|
|
19
|
+
declare const TMMasterInfoFields: ({ dtd, dcmt, getValuesByMidAsync, reloadToken, isExpandedView }: TMMasterInfoFieldsProps) => React.JSX.Element;
|
|
20
|
+
export default TMMasterInfoFields;
|