@topconsultnpm/sdkui-react 6.22.0-t2 → 6.22.0-t3
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 +3 -3
- package/lib/components/NewComponents/ContextMenu/hooks.d.ts +1 -1
- package/lib/components/NewComponents/FloatingMenuBar/TMFloatingMenuBar.js +6 -6
- package/lib/components/NewComponents/FloatingMenuBar/styles.d.ts +15 -15
- package/lib/components/base/Styled.js +7 -5
- package/lib/components/base/TMAccordionNew.js +7 -7
- package/lib/components/base/TMAlert.d.ts +32 -32
- package/lib/components/base/TMAlert.js +6 -8
- package/lib/components/base/TMAreaManager.js +53 -55
- package/lib/components/base/TMButton.js +4 -4
- package/lib/components/base/TMClosableList.js +3 -3
- package/lib/components/base/TMCustomButton.js +40 -48
- package/lib/components/base/TMDataGrid.d.ts +2 -0
- package/lib/components/base/TMDataGrid.js +35 -7
- package/lib/components/base/TMDropDownMenu.js +1 -1
- package/lib/components/base/TMFileManagerDataGridView.js +1 -1
- package/lib/components/base/TMFileManagerThumbnailItems.js +2 -2
- package/lib/components/base/TMLayout.d.ts +2 -2
- package/lib/components/base/TMLayout.js +3 -3
- package/lib/components/base/TMList.js +1 -1
- package/lib/components/base/TMListView.js +3 -3
- package/lib/components/base/TMModal.js +1 -1
- package/lib/components/base/TMPanel.js +8 -8
- package/lib/components/base/TMPopUp.js +2 -2
- package/lib/components/base/TMResizableMenu.js +2 -2
- package/lib/components/base/TMRightSidebar.js +1 -1
- package/lib/components/base/TMShowAllOrMaxItemsButton.js +1 -1
- package/lib/components/base/TMSpinner.d.ts +2 -1
- package/lib/components/base/TMSpinner.js +9 -7
- package/lib/components/base/TMTab.js +2 -2
- package/lib/components/base/TMTabControl.d.ts +106 -0
- package/lib/components/base/TMTabControl.js +664 -0
- package/lib/components/base/TMToggleButton.js +2 -2
- package/lib/components/base/TMToolbarCard.js +3 -3
- package/lib/components/base/TMTreeView.js +35 -3
- package/lib/components/base/TMWaitPanel.js +3 -3
- package/lib/components/base/waitPanel/TMWaitPanelConfirm.d.ts +12 -0
- package/lib/components/base/waitPanel/TMWaitPanelConfirm.js +185 -0
- package/lib/components/base/waitPanel/TMWaitPanelManager.d.ts +169 -0
- package/lib/components/base/waitPanel/TMWaitPanelManager.js +320 -0
- package/lib/components/base/waitPanel/TMWaitPanelView.d.ts +53 -0
- package/lib/components/base/waitPanel/TMWaitPanelView.js +274 -0
- package/lib/components/base/waitPanel/index.d.ts +1 -0
- package/lib/components/base/waitPanel/index.js +1 -0
- package/lib/components/choosers/TMCultureIDPicker.js +2 -2
- package/lib/components/choosers/TMDataListItemChooser.js +1 -1
- package/lib/components/choosers/TMDataListItemPicker.js +2 -2
- package/lib/components/choosers/TMDcmtTypeChooser.js +1 -1
- package/lib/components/choosers/TMDiskChooser.js +1 -1
- package/lib/components/choosers/TMDistinctValues.js +28 -19
- package/lib/components/choosers/TMDynDataListItemChooser.js +1 -1
- package/lib/components/choosers/TMImageIDChooser.js +1 -1
- package/lib/components/choosers/TMMetadataChooser.js +2 -2
- package/lib/components/choosers/TMPathChooser.js +17 -34
- package/lib/components/choosers/TMQuickSearchInfo.js +4 -4
- package/lib/components/choosers/TMQuickSearchSettingsForm.js +1 -1
- package/lib/components/choosers/TMRelationChooser.js +1 -1
- package/lib/components/choosers/TMSelectedValuesSummary.js +1 -3
- package/lib/components/choosers/TMUserChooser.js +1 -1
- package/lib/components/editors/TMCheckBox.js +1 -1
- package/lib/components/editors/TMDropDown.js +7 -7
- package/lib/components/editors/TMEditorStyled.d.ts +1 -1
- package/lib/components/editors/TMFormulaEditor.js +1 -1
- package/lib/components/editors/TMHtmlContentDisplay.js +1 -1
- package/lib/components/editors/TMLocalizedTextBox.js +1 -1
- package/lib/components/editors/TMMetadataValues.js +6 -6
- package/lib/components/editors/TMRadioButton.js +2 -2
- package/lib/components/editors/TMSummary.js +3 -3
- package/lib/components/editors/TMTextArea.js +3 -3
- package/lib/components/editors/TMTextBox.js +3 -3
- package/lib/components/editors/TMTextExpression.js +1 -1
- package/lib/components/features/archive/TMArchive.js +7 -2
- package/lib/components/features/assistant/TMHelpOnLineChat.d.ts +29 -0
- package/lib/components/features/assistant/TMHelpOnLineChat.js +1384 -0
- package/lib/components/features/assistant/TMToppyDraggableHelpCenter.js +4 -4
- package/lib/components/features/assistant/TMToppySpeechBubble.js +1 -1
- package/lib/components/features/assistant/dataset/Designer-Suggested-Questions.json +102 -0
- package/lib/components/features/assistant/dataset/Login-Suggested-Questions.json +32 -0
- package/lib/components/features/assistant/dataset/Surfer-Suggested-Questions.json +102 -0
- package/lib/components/features/documents/TMBatchUpdateForm.js +4 -5
- package/lib/components/features/documents/TMCopyToFolderForm.js +50 -42
- package/lib/components/features/documents/TMDcmtForm.js +53 -64
- package/lib/components/features/documents/TMDcmtFormActionButtons.js +2 -2
- package/lib/components/features/documents/TMDcmtIcon.d.ts +1 -3
- package/lib/components/features/documents/TMDcmtIcon.js +3 -5
- package/lib/components/features/documents/TMDcmtPreview.js +6 -4
- package/lib/components/features/documents/TMDcmtTasks.js +2 -9
- package/lib/components/features/documents/TMDownloadRelationViewerSection.js +1 -1
- package/lib/components/features/documents/TMFileUploader.js +7 -7
- package/lib/components/features/documents/TMMasterDetailDcmts.d.ts +2 -0
- package/lib/components/features/documents/TMMasterDetailDcmts.js +55 -130
- package/lib/components/features/documents/TMMasterInfoFields.js +4 -5
- package/lib/components/features/documents/TMMergeToPdfForm.js +56 -54
- package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.js +3 -6
- package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.d.ts +1 -1
- package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.js +4 -4
- package/lib/components/features/documents/TMRelationViewer.d.ts +16 -9
- package/lib/components/features/documents/TMRelationViewer.js +240 -168
- package/lib/components/features/documents/copyAndMergeDcmtsShared.d.ts +1 -1
- package/lib/components/features/documents/relationTreeState.d.ts +32 -0
- package/lib/components/features/documents/relationTreeState.js +89 -0
- package/lib/components/features/search/TMMetadataOutputForm.js +1 -1
- package/lib/components/features/search/TMMetadataSorterForm.js +1 -1
- package/lib/components/features/search/TMSavedQuerySelector.js +2 -2
- package/lib/components/features/search/TMSearch.d.ts +1 -1
- package/lib/components/features/search/TMSearch.js +71 -12
- package/lib/components/features/search/TMSearchQueryEditor.js +2 -2
- package/lib/components/features/search/TMSearchQueryPanel.js +1 -5
- package/lib/components/features/search/TMSearchResult.d.ts +5 -0
- package/lib/components/features/search/TMSearchResult.js +34 -18
- package/lib/components/features/search/TMSignatureInfoContent.js +1 -1
- package/lib/components/features/search/TMTreeSelector.js +38 -36
- package/lib/components/features/search/TMViewHistoryDcmt.js +14 -25
- package/lib/components/features/tasks/TMTaskForm.js +1 -1
- package/lib/components/features/tasks/TMTaskFormUtils.js +3 -3
- package/lib/components/features/tasks/TMTasksAgenda.js +1 -1
- package/lib/components/features/tasks/TMTasksCalendar.js +1 -1
- package/lib/components/features/tasks/TMTasksHeader.js +1 -1
- package/lib/components/features/tasks/TMTasksUtilsView.js +1 -1
- package/lib/components/features/tasks/TMTasksView.js +97 -102
- package/lib/components/features/wg/TMWGsCopyMoveForm.js +92 -92
- package/lib/components/features/workflow/TMWorkflowPopup.js +2 -2
- package/lib/components/features/workflow/diagram/ConnectionComponent.js +3 -3
- package/lib/components/features/workflow/diagram/DiagramItemComponent.js +3 -3
- package/lib/components/features/workflow/diagram/DiagramItemForm.js +1 -1
- package/lib/components/features/workflow/diagram/DiagramItemSvgContent.js +1 -1
- package/lib/components/features/workflow/diagram/RecipientList.js +1 -1
- package/lib/components/features/workflow/diagram/WFDiagram.js +4 -4
- package/lib/components/forms/Login/Menu.js +1 -1
- package/lib/components/forms/Login/OTPReader.js +1 -1
- package/lib/components/forms/Login/PasswordStrengthChecker.js +1 -1
- package/lib/components/forms/Login/RapidAccessLogin.js +2 -2
- package/lib/components/forms/Login/RecoverPasswordFlow.js +2 -2
- package/lib/components/forms/Login/SelectBox.js +1 -1
- package/lib/components/forms/Login/StepIndicator.js +1 -1
- package/lib/components/forms/Login/TMLoginForm.js +7 -7
- package/lib/components/forms/Login/TextBox.js +1 -1
- package/lib/components/forms/TMApplyForm.js +3 -3
- package/lib/components/forms/TMChooserForm.js +1 -1
- package/lib/components/forms/TMResultDialog.js +1 -1
- package/lib/components/forms/TMSaveForm.js +3 -3
- package/lib/components/grids/TMBlogAttachments.js +1 -1
- package/lib/components/grids/TMBlogsPost.js +92 -96
- package/lib/components/grids/TMBlogsPostUtils.js +1 -1
- package/lib/components/grids/TMRecentsManager.js +4 -4
- package/lib/components/grids/TMValidationItemsList.js +1 -1
- package/lib/components/index.d.ts +6 -0
- package/lib/components/index.js +5 -0
- package/lib/components/layout/panelManager/TMPanelManagerContainer.js +3 -3
- package/lib/components/layout/panelManager/TMPanelManagerToolbar.js +1 -1
- package/lib/components/layout/panelManager/TMPanelWrapper.js +1 -1
- package/lib/components/pages/TMPage.js +30 -32
- package/lib/components/query/TMQueryCountButton.js +1 -1
- package/lib/components/query/TMQueryEditor.d.ts +3 -0
- package/lib/components/query/TMQueryEditor.js +9 -8
- package/lib/components/sidebar/TMCommandsPanel.js +1 -1
- package/lib/components/sidebar/TMHeader.d.ts +1 -0
- package/lib/components/sidebar/TMHeader.js +9 -9
- package/lib/components/sidebar/TMSidebar.js +1 -1
- package/lib/components/sidebar/TMSidebarItem.js +1 -1
- package/lib/components/viewers/TMMidViewer.js +2 -2
- package/lib/components/viewers/TMTidViewer.js +3 -3
- package/lib/components/wizard/TMStepIndicator.js +3 -3
- package/lib/helper/Enum_Localizator.d.ts +4 -4
- package/lib/helper/Enum_Localizator.js +1 -0
- package/lib/helper/Globalization.d.ts +1 -1
- package/lib/helper/SDKUI_Localizator.d.ts +736 -712
- package/lib/helper/SDKUI_Localizator.js +240 -0
- package/lib/helper/TMAppUpdatedModal.js +2 -2
- package/lib/helper/TMIcons.js +1 -3
- package/lib/helper/TMPdfViewer.js +1 -1
- package/lib/helper/TMToppyMessage.js +1 -1
- package/lib/helper/TMUtils.js +1 -1
- package/lib/helper/ZipManager.d.ts +1 -1
- package/lib/helper/ZipManager.js +2 -1
- package/lib/helper/checkinCheckoutManager.d.ts +1 -1
- package/lib/helper/checkinCheckoutManager.js +1 -1
- package/lib/helper/dcmtsHelper.d.ts +4 -2
- package/lib/helper/dcmtsHelper.js +3 -1
- package/lib/helper/helpers.d.ts +1 -1
- package/lib/helper/helpers.js +2 -2
- package/lib/hooks/tmDistinctValuesGridHelper.d.ts +1 -1
- package/lib/hooks/useCaseFlowApprove.d.ts +3 -3
- package/lib/hooks/useCheckInOutOperations.d.ts +0 -6
- package/lib/hooks/useCheckInOutOperations.js +14 -34
- package/lib/hooks/useDcmtOperations.d.ts +3 -12
- package/lib/hooks/useDcmtOperations.js +187 -179
- package/lib/hooks/useDocumentOperations.d.ts +1 -0
- package/lib/hooks/useDocumentOperations.js +16 -27
- package/lib/hooks/useInputDialog.js +1 -1
- package/lib/hooks/useMultiMasterDetailDcmts.d.ts +1 -16
- package/lib/hooks/useMultiMasterDetailDcmts.js +65 -67
- package/lib/hooks/usePreventFileDrop.js +9 -0
- package/lib/hooks/useQueryParametersDialog.js +1 -1
- package/lib/hooks/useWorkflowApprove.js +33 -17
- package/lib/services/caseflow/CaseFlowService.d.ts +47 -6
- package/lib/services/caseflow/CaseFlowService.js +82 -14
- package/lib/services/platform_services.d.ts +4 -4
- package/package.json +9 -10
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useRef, useState } from "react";
|
|
3
3
|
import { AccessLevels, AccessLevelsEx, AppModules, DcmtOpers, DcmtTypeListCacheService, FileFormats, GeneralRetrieveFormats, LayoutModes, RetrieveFileOptions, SDK_Globals } from "@topconsultnpm/sdk-ts";
|
|
4
4
|
import { DcmtOperationTypes, DownloadTypes, SearchResultContext } from "../ts";
|
|
@@ -86,7 +86,7 @@ export const useDocumentOperations = (props) => {
|
|
|
86
86
|
const { dataColumns, dataSource, selectedRowKeys, } = exportData ?? {};
|
|
87
87
|
const { visibleItems = [], onRefreshSearchAsyncDatagrid, onRefreshDataRowsAsync, refreshFocusedDataRowAsync, onRefreshBlogDatagrid, onRefreshPreviewDatagrid, refreshOperationsTrigger = 0, onRefreshOperationsDatagrid, } = datagridUtility ?? {};
|
|
88
88
|
const { approvalVID, dcmtDataRowForCicoStatus, selectedDcmtSearchResultRelations, dcmtTIDHasDetailRelations = false, dcmtTIDHasMasterRelations = false, updateCurrentDcmt, onCloseDcmtForm, onRefreshBlogForm, onRefreshPreviewForm, taskFormDialogComponent, s4TViewerDialogComponent } = dcmtUtility ?? {};
|
|
89
|
-
const { floatingBarContainerRef, customButtonsLayout, workingGroupContext, openS4TViewer = false, openDcmtFormAsModal = false, showDcmtFormSidebar = true, allowFloatingBar = true, enablePinIcons = true, allowRelations = true, showTodoDcmtForm = false, showToppyDraggableHelpCenter = true, toppyHelpCenterUsePortal = false, editPdfForm = false, inputDcmtFormLayoutMode = LayoutModes.Update, graphometricManager, } = uiConfig;
|
|
89
|
+
const { floatingBarContainerRef, customButtonsLayout, workingGroupContext, openS4TViewer = false, openDcmtFormAsModal = false, showDcmtFormSidebar = true, allowFloatingBar = true, enablePinIcons = true, allowRelations = true, showTodoDcmtForm = false, showToppyDraggableHelpCenter = true, toppyHelpCenterUsePortal = false, editPdfForm = false, inputDcmtFormLayoutMode = LayoutModes.Update, graphometricManager, showSelector = false, } = uiConfig;
|
|
90
90
|
const { allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback } = tasks;
|
|
91
91
|
const {
|
|
92
92
|
// Refresh operations (data consistency)
|
|
@@ -109,10 +109,10 @@ export const useDocumentOperations = (props) => {
|
|
|
109
109
|
// Context helpers
|
|
110
110
|
const isDcmtFormContext = context === SearchResultContext.DCMT_FORM;
|
|
111
111
|
const isMasterDetailContext = context === SearchResultContext.MASTER_DETAIL;
|
|
112
|
-
const { showHistory, showHistoryCallback, hideHistoryCallback, showCheckoutInformationForm, commentFormState, hideCommentFormCallback, showCheckoutInformationFormCallback, hideCheckoutInformationFormCallback, copyCheckoutPathToClipboardCallback, handleCheckOutCallback, handleCheckInCallback,
|
|
112
|
+
const { showHistory, showHistoryCallback, hideHistoryCallback, showCheckoutInformationForm, commentFormState, hideCommentFormCallback, showCheckoutInformationFormCallback, hideCheckoutInformationFormCallback, copyCheckoutPathToClipboardCallback, handleCheckOutCallback, handleCheckInCallback, } = useCheckInOutOperations({
|
|
113
113
|
onRefreshPreview: onRefreshPreviewCallback
|
|
114
114
|
});
|
|
115
|
-
const {
|
|
115
|
+
const { downloadDcmtsAsync, runOperationAsync, getDcmtFileAsync, clearDcmtsFileCache, removeDcmtsFileCache, isDcmtFileInCache, FileSourceDialog } = useDcmtOperations();
|
|
116
116
|
const {
|
|
117
117
|
// Data
|
|
118
118
|
relatedDcmts, pairedSearchResults, manyToManyRelations, selectedManyToManyRelation, manyToManyChooserDataSource, relatedDcmtsChooserDataSource,
|
|
@@ -178,8 +178,14 @@ export const useDocumentOperations = (props) => {
|
|
|
178
178
|
const [isOpenDetailsModal, setIsOpenDetailsModal] = useState(false);
|
|
179
179
|
const [isOpenMasterModal, setIsOpenMasterModal] = useState(false);
|
|
180
180
|
const [isOpenMultiDetailModal, setIsOpenMultiDetailModal] = useState(false);
|
|
181
|
-
|
|
182
|
-
|
|
181
|
+
// La maschera delle correlazioni viene montata subito (parte il calcolo, con il wait panel)
|
|
182
|
+
// ma resa visibile (isOpen...) solo a calcolo finito: intanto sotto restano i risultati.
|
|
183
|
+
const [isMountedDetails, setIsMountedDetails] = useState(false);
|
|
184
|
+
const [isMountedMaster, setIsMountedMaster] = useState(false);
|
|
185
|
+
const openDetailDcmtsFormHandler = (value) => { setIsMountedDetails(value); if (!value)
|
|
186
|
+
setIsOpenDetails(false); };
|
|
187
|
+
const openMasterDcmtsFormHandler = (value) => { setIsMountedMaster(value); if (!value)
|
|
188
|
+
setIsOpenMaster(false); };
|
|
183
189
|
const openDetailDcmtsModalHandler = (value) => { setIsOpenDetailsModal(value); };
|
|
184
190
|
const openMasterDcmtsModalHandler = (value) => { setIsOpenMasterModal(value); };
|
|
185
191
|
// State to control whether the export form (for exporting to Excel/CSV/txt and others) should be shown
|
|
@@ -1073,7 +1079,7 @@ export const useDocumentOperations = (props) => {
|
|
|
1073
1079
|
]
|
|
1074
1080
|
};
|
|
1075
1081
|
};
|
|
1076
|
-
const canToggleDcmtTypesSelection = !isMobile &&
|
|
1082
|
+
const canToggleDcmtTypesSelection = !isMobile && showSelector && currentSearchResults?.length === 1;
|
|
1077
1083
|
const otherOperationsMenuItem = () => {
|
|
1078
1084
|
return {
|
|
1079
1085
|
id: 'oth',
|
|
@@ -1405,7 +1411,7 @@ export const useDocumentOperations = (props) => {
|
|
|
1405
1411
|
dcmtUtility,
|
|
1406
1412
|
fetchRemoteCertificates
|
|
1407
1413
|
};
|
|
1408
|
-
const renderDcmtOperations = (_jsxs(_Fragment, { children: [(showExportForm && searchResult && dataColumns && dataSource && selectedRowKeys) && (_jsx(TMDataGridExportForm, { dataColumns: dataColumns, dataSource: dataSource, selectedRowKeys: selectedRowKeys, onCloseExportForm: () => setShowExportForm(false), searchResult: searchResult })), _jsx(StyledMultiViewPanel, {
|
|
1414
|
+
const renderDcmtOperations = (_jsxs(_Fragment, { children: [(showExportForm && searchResult && dataColumns && dataSource && selectedRowKeys) && (_jsx(TMDataGridExportForm, { dataColumns: dataColumns, dataSource: dataSource, selectedRowKeys: selectedRowKeys, onCloseExportForm: () => setShowExportForm(false), searchResult: searchResult })), _jsx(StyledMultiViewPanel, { $isVisible: isOpenDcmtForm && !isDcmtFormModal, children: ((isOpenDcmtForm && focusedItem?.TID !== undefined && focusedItem?.DID !== undefined) &&
|
|
1409
1415
|
_jsx(TMDcmtForm, { isModal: isDcmtFormModal, titleModal: dtd?.name ?? '', TID: focusedItem.TID, DID: focusedItem.DID, allowButtonsRefs: true, showTodoDcmtForm: showTodoDcmtForm, layoutMode: dcmtFormLayoutMode, count: visibleItems?.length, itemIndex: visibleItems ? visibleItems.findIndex(o => o.rowIndex === focusedItem?.rowIndex) + 1 : undefined, canNext: canNavigateHandler ? canNavigateHandler('next') : false, canPrev: canNavigateHandler ? canNavigateHandler('prev') : false, onNext: () => onNavigateHandler && onNavigateHandler('next'), onPrev: () => onNavigateHandler && onNavigateHandler('prev'), onClose: () => { (false); onDcmtFormOpenChange(false, LayoutModes.Update); }, onWFOperationCompleted: onWFOperationCompleted, onTaskCreateRequest: onTaskCreateRequest, onSavedAsyncCallback: onSavedAsyncCallback, openS4TViewer: openS4TViewer, onOpenS4TViewerRequest: onOpenS4TViewerRequest, editPdfForm: editPdfForm, onOpenPdfEditorRequest: onOpenPdfEditorRequest, openFileUploaderPdfEditor: openFileUploaderPdfEditor, onReferenceClick: onReferenceClick, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, moreInfoTasks: getMoreInfoTasksForDocument(allTasks, focusedItem?.TID, focusedItem?.DID), showDcmtFormSidebar: showDcmtFormSidebar, datagridUtility: {
|
|
1410
1416
|
onRefreshSearchAsyncDatagrid,
|
|
1411
1417
|
onRefreshDataRowsAsync,
|
|
@@ -1413,8 +1419,8 @@ export const useDocumentOperations = (props) => {
|
|
|
1413
1419
|
onRefreshBlogDatagrid,
|
|
1414
1420
|
onRefreshPreviewDatagrid
|
|
1415
1421
|
}, fetchRemoteCertificates: fetchRemoteCertificates, graphometricManager: graphometricManager })) }), (showHistory && dtd && selectedDcmtInfos.length > 0) && _jsx(TMViewHistoryDcmt, { fromDTD: dtd, deviceType: deviceType, inputDcmt: selectedDcmtInfos[0], onClose: hideHistoryCallback, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }), (commentFormState.show && selectedDcmtInfos.length > 0) && _jsx(TMBlogCommentForm, { context: { engine: 'SearchEngine', object: { tid: selectedDcmtInfos[0].TID, did: selectedDcmtInfos[0].DID } }, onClose: hideCommentFormCallback, refreshCallback: onRefreshBlog, participants: [], showAttachmentsSection: true, allArchivedDocumentsFileItems: convertSearchResultDescriptorToFileItems(currentSearchResults ?? []), isCommentRequired: commentFormState.isRequired, removeAndEditAttachment: commentFormState.removeAndEditAttachment, selectedAttachmentDid: [Number(selectedDcmtInfos[0].DID)] }), (showCheckoutInformationForm && dtd && selectedDcmtInfos.length > 0) &&
|
|
1416
|
-
_jsx(TMDcmtCheckoutInfoForm, { dtdName: dtd.name ?? SDKUI_Localizator.SearchResult, selectedDcmtOrFocused: selectedDcmtInfos[0], onClose: hideCheckoutInformationFormCallback }), isOpenDetailsModal && _jsx(TMModal, { width: "95%", height: "95%", onClose: () => setIsOpenDetailsModal(false), title: SDKUI_Localizator.Relations, children: _jsx(TMMasterDetailDcmts, { ...masterDetailDetailsCommonProps, onBack: () => setIsOpenDetailsModal(false) }) }), _jsx(StyledMultiViewPanel, {
|
|
1417
|
-
_jsx(TMMultiMasterDetailDcmtsForm, { dtd: dtd, masterDcmt: selectedDcmtInfos[0], onClose: () => setIsOpenMultiDetailModal(false), canNavigateMaster: canNavigateMultiDetailMaster ? canNavigateHandler : undefined, onNavigateMaster: canNavigateMultiDetailMaster ? onNavigateHandler : undefined, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, showDcmtFormSidebar: showDcmtFormSidebar, showTodoDcmtForm: showTodoDcmtForm, openFileUploaderPdfEditor: openFileUploaderPdfEditor, graphometricManager: graphometricManager, editPdfForm: editPdfForm, openS4TViewer: openS4TViewer, showToppyDraggableHelpCenter: showToppyDraggableHelpCenter, toppyHelpCenterUsePortal: toppyHelpCenterUsePortal, fetchRemoteCertificates: fetchRemoteCertificates, onOpenS4TViewerRequest: onOpenS4TViewerRequest, onOpenPdfEditorRequest: onOpenPdfEditorRequest, onReferenceClick: onReferenceClick, onTaskCreateRequest: onTaskCreateRequest, onRefreshAfterAddDcmtToFavs: onRefreshAfterAddDcmtToFavs, onFileOpened: onFileOpened, passToArchiveCallback: passToArchiveCallback, openWGsCopyMoveForm: openWGsCopyMoveForm }), isOpenMasterModal && _jsx(TMModal, { width: "95%", height: "95%", onClose: () => setIsOpenMasterModal(false), title: SDKUI_Localizator.Relations, children: _jsx(TMMasterDetailDcmts, { ...masterDetailMasterCommonProps, onBack: () => setIsOpenMasterModal(false) }) }), _jsxs(StyledMultiViewPanel, {
|
|
1422
|
+
_jsx(TMDcmtCheckoutInfoForm, { dtdName: dtd.name ?? SDKUI_Localizator.SearchResult, selectedDcmtOrFocused: selectedDcmtInfos[0], onClose: hideCheckoutInformationFormCallback }), isOpenDetailsModal && _jsx(TMModal, { width: "95%", height: "95%", onClose: () => setIsOpenDetailsModal(false), title: SDKUI_Localizator.Relations, children: _jsx(TMMasterDetailDcmts, { ...masterDetailDetailsCommonProps, onBack: () => setIsOpenDetailsModal(false) }) }), _jsx(StyledMultiViewPanel, { $isVisible: isOpenDetails, children: isMountedDetails && _jsx(TMMasterDetailDcmts, { ...masterDetailDetailsCommonProps, onFirstLoadCompleted: () => setIsOpenDetails(true), onBack: () => openDetailDcmtsFormHandler(false) }) }), (isOpenMultiDetailModal && dtd) &&
|
|
1423
|
+
_jsx(TMMultiMasterDetailDcmtsForm, { dtd: dtd, masterDcmt: selectedDcmtInfos[0], onClose: () => setIsOpenMultiDetailModal(false), canNavigateMaster: canNavigateMultiDetailMaster ? canNavigateHandler : undefined, onNavigateMaster: canNavigateMultiDetailMaster ? onNavigateHandler : undefined, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, showDcmtFormSidebar: showDcmtFormSidebar, showTodoDcmtForm: showTodoDcmtForm, openFileUploaderPdfEditor: openFileUploaderPdfEditor, graphometricManager: graphometricManager, editPdfForm: editPdfForm, openS4TViewer: openS4TViewer, showToppyDraggableHelpCenter: showToppyDraggableHelpCenter, toppyHelpCenterUsePortal: toppyHelpCenterUsePortal, fetchRemoteCertificates: fetchRemoteCertificates, onOpenS4TViewerRequest: onOpenS4TViewerRequest, onOpenPdfEditorRequest: onOpenPdfEditorRequest, onReferenceClick: onReferenceClick, onTaskCreateRequest: onTaskCreateRequest, onRefreshAfterAddDcmtToFavs: onRefreshAfterAddDcmtToFavs, onFileOpened: onFileOpened, passToArchiveCallback: passToArchiveCallback, openWGsCopyMoveForm: openWGsCopyMoveForm }), isOpenMasterModal && _jsx(TMModal, { width: "95%", height: "95%", onClose: () => setIsOpenMasterModal(false), title: SDKUI_Localizator.Relations, children: _jsx(TMMasterDetailDcmts, { ...masterDetailMasterCommonProps, onBack: () => setIsOpenMasterModal(false) }) }), _jsxs(StyledMultiViewPanel, { $isVisible: isOpenMaster, children: [isMountedMaster && _jsx(TMMasterDetailDcmts, { ...masterDetailMasterCommonProps, onFirstLoadCompleted: () => setIsOpenMaster(true), onBack: () => openMasterDcmtsFormHandler(false) }), secondaryMasterDcmts.length > 0 && secondaryMasterDcmts.map((dcmt, index) => {
|
|
1418
1424
|
return (_jsx(StyledModalContainer, { style: { backgroundColor: 'white' }, children: _jsx(TMMasterDetailDcmts, { ...masterDetailMasterCommonProps, inputDcmts: [dcmt], allowNavigation: false, onBack: () => handleRemoveItem(dcmt.TID, dcmt.DID) }) }, `${index}-${dcmt.DID}`));
|
|
1419
1425
|
})] }), isOpenArchiveRelationForm && _jsx(TMDcmtForm, { isModal: true, titleModal: SDKUI_Localizator.Archive + ' - ' + (archiveType === 'detail' ? SDKUI_Localizator.DcmtsDetail : SDKUI_Localizator.DcmtsMaster), TID: archiveRelatedDcmtFormTID, layoutMode: LayoutModes.Ark, inputMids: archiveRelatedDcmtFormMids, showBackButton: false, allowButtonsRefs: false, onClose: () => {
|
|
1420
1426
|
setIsOpenArchiveRelationForm(false);
|
|
@@ -1513,25 +1519,8 @@ export const useDocumentOperations = (props) => {
|
|
|
1513
1519
|
copyCheckoutPathToClipboardCallback,
|
|
1514
1520
|
handleCheckOutCallback,
|
|
1515
1521
|
handleCheckInCallback,
|
|
1516
|
-
showCicoWaitPanel,
|
|
1517
|
-
cicoWaitPanelTitle,
|
|
1518
|
-
showCicoPrimaryProgress,
|
|
1519
|
-
cicoPrimaryProgressText,
|
|
1520
|
-
cicoPrimaryProgressValue,
|
|
1521
|
-
cicoPrimaryProgressMax,
|
|
1522
1522
|
},
|
|
1523
1523
|
dcmtOperations: {
|
|
1524
|
-
abortController,
|
|
1525
|
-
showWaitPanel,
|
|
1526
|
-
showPrimary,
|
|
1527
|
-
waitPanelTitle,
|
|
1528
|
-
waitPanelTextPrimary,
|
|
1529
|
-
waitPanelValuePrimary,
|
|
1530
|
-
waitPanelMaxValuePrimary,
|
|
1531
|
-
showSecondary,
|
|
1532
|
-
waitPanelTextSecondary,
|
|
1533
|
-
waitPanelValueSecondary,
|
|
1534
|
-
waitPanelMaxValueSecondary,
|
|
1535
1524
|
downloadDcmtsAsync,
|
|
1536
1525
|
getDcmtFileAsync,
|
|
1537
1526
|
clearDcmtsFileCache,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useState } from "react";
|
|
3
3
|
import { FileFormats } from '@topconsultnpm/sdk-ts';
|
|
4
4
|
import { TMModal, TMRadioButton, TMButton, TMChooserForm } from "../components";
|
|
@@ -16,19 +16,6 @@ export type MidValue = {
|
|
|
16
16
|
mid: number;
|
|
17
17
|
value: string;
|
|
18
18
|
};
|
|
19
|
-
/** Stato del wait panel: le chiavi sono quelle dei props di TMLayoutWaitingContainer */
|
|
20
|
-
export type WaitPanelState = {
|
|
21
|
-
showWaitPanel: boolean;
|
|
22
|
-
waitPanelTitle: string;
|
|
23
|
-
showWaitPanelPrimary: boolean;
|
|
24
|
-
waitPanelTextPrimary: string;
|
|
25
|
-
waitPanelValuePrimary: number;
|
|
26
|
-
waitPanelMaxValuePrimary: number;
|
|
27
|
-
showWaitPanelSecondary: boolean;
|
|
28
|
-
waitPanelTextSecondary: string;
|
|
29
|
-
waitPanelValueSecondary: number;
|
|
30
|
-
waitPanelMaxValueSecondary: number;
|
|
31
|
-
};
|
|
32
19
|
interface UseMultiMasterDetailDcmtsParams {
|
|
33
20
|
/** Tipo documento del master */
|
|
34
21
|
dtd: DcmtTypeDescriptor;
|
|
@@ -61,7 +48,7 @@ export declare const useMultiMasterDetailDcmts: ({ dtd, masterDcmt, onClose, can
|
|
|
61
48
|
isMasterNavigationEnabled: boolean;
|
|
62
49
|
canNavigateMasterPrev: boolean;
|
|
63
50
|
canNavigateMasterNext: boolean;
|
|
64
|
-
navigateMaster: (dir:
|
|
51
|
+
navigateMaster: (dir: 'next' | 'prev') => void;
|
|
65
52
|
sectionsOpen: Record<AccordionSection, boolean>;
|
|
66
53
|
setSectionOpen: (section: AccordionSection, isOpen: boolean) => void;
|
|
67
54
|
openAllSections: () => void;
|
|
@@ -108,6 +95,4 @@ export declare const useMultiMasterDetailDcmts: ({ dtd, masterDcmt, onClose, can
|
|
|
108
95
|
setStopOnFirstError: import("react").Dispatch<import("react").SetStateAction<boolean>>;
|
|
109
96
|
isArchiving: boolean;
|
|
110
97
|
archiveAllAsync: () => Promise<void>;
|
|
111
|
-
waitPanel: WaitPanelState;
|
|
112
|
-
abortController: AbortController | undefined;
|
|
113
98
|
};
|
|
@@ -2,9 +2,10 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
|
2
2
|
import { AccessLevels, ArchiveConstraints, ArchiveEngineByID, DcmtOpers, GeneralRetrieveFormats, MetadataDataDomains, MetadataDataTypes, RelationCacheService, RelationTypes, ResultTypes, RetrieveFileOptions, SDK_Globals, SystemMIDsAsNumber } from '@topconsultnpm/sdk-ts';
|
|
3
3
|
import { MetadataValueDescriptorEx } from '../ts';
|
|
4
4
|
import { clearMultiDetailLayout, Globalization, getExceptionMessage, getMultiDetailSectionsOpen, handleArchiveVisibility, hasMultiDetailLayout, saveMultiDetailSectionsOpen, SDKUI_Localizator } from '../helper';
|
|
5
|
-
import { getDcmtMetadataByMid, getUserMetadataSorted, mapAssociationsFromMetadata } from '../helper/dcmtsHelper';
|
|
5
|
+
import { canViewMetadata, getDcmtMetadataByMid, getUserMetadataSorted, mapAssociationsFromMetadata } from '../helper/dcmtsHelper';
|
|
6
6
|
import { ButtonNames, TMExceptionBoxManager, TMMessageBoxManager } from '../components/base/TMPopUp';
|
|
7
7
|
import TMSpinner from '../components/base/TMSpinner';
|
|
8
|
+
import { TMWaitPanelManager } from '../components/base/waitPanel';
|
|
8
9
|
import ShowAlert from '../components/base/TMAlert';
|
|
9
10
|
import { TMResultManager } from '../components/forms/TMResultDialog';
|
|
10
11
|
import { useDataListItem } from './useDataListItem';
|
|
@@ -17,18 +18,6 @@ export var MultiDetailArchivePhase;
|
|
|
17
18
|
/** Riepilogo delle archiviazioni */
|
|
18
19
|
MultiDetailArchivePhase[MultiDetailArchivePhase["ArchiveSummary"] = 1] = "ArchiveSummary";
|
|
19
20
|
})(MultiDetailArchivePhase || (MultiDetailArchivePhase = {}));
|
|
20
|
-
const CLOSED_WAIT_PANEL = {
|
|
21
|
-
showWaitPanel: false,
|
|
22
|
-
waitPanelTitle: '',
|
|
23
|
-
showWaitPanelPrimary: false,
|
|
24
|
-
waitPanelTextPrimary: '',
|
|
25
|
-
waitPanelValuePrimary: 0,
|
|
26
|
-
waitPanelMaxValuePrimary: 0,
|
|
27
|
-
showWaitPanelSecondary: false,
|
|
28
|
-
waitPanelTextSecondary: '',
|
|
29
|
-
waitPanelValueSecondary: 0,
|
|
30
|
-
waitPanelMaxValueSecondary: 0,
|
|
31
|
-
};
|
|
32
21
|
/**
|
|
33
22
|
* Logica dell'archiviazione multipla dei dettagli: relazioni, sezioni, righe del riepilogo e
|
|
34
23
|
* archiviazione. Il rendering sta in TMMultiMasterDetailDcmtsForm
|
|
@@ -76,12 +65,11 @@ export const useMultiMasterDetailDcmts = ({ dtd, masterDcmt, onClose, canNavigat
|
|
|
76
65
|
// Archiviazione finale
|
|
77
66
|
const [stopOnFirstError, setStopOnFirstError] = useState(true);
|
|
78
67
|
const [isArchiving, setIsArchiving] = useState(false);
|
|
79
|
-
const [waitPanel, setWaitPanel] = useState(CLOSED_WAIT_PANEL);
|
|
80
|
-
const abortControllerRef = useRef(undefined);
|
|
81
68
|
const selectedItem = detailRelationItems.find(item => item.relation === selectedRelation);
|
|
82
69
|
const hasMultipleTypes = detailRelationItems.length > 1;
|
|
83
70
|
const canUpdateMaster = canUpdateMasterCallback(dtd, masterDcmt);
|
|
84
|
-
|
|
71
|
+
// Stessi metadati delle card del master (vedi TMMasterInfoFields): quelli non visibili non contano
|
|
72
|
+
const masterFieldsCount = useMemo(() => getUserMetadataSorted(dtd).filter(canViewMetadata).length, [dtd]);
|
|
85
73
|
// Nel riepilogo si mostrano solo le righe del tipo selezionato
|
|
86
74
|
const currentRows = useMemo(() => archiveRows.filter(r => r.__tid === selectedRelation?.detailTID), [archiveRows, selectedRelation?.detailTID]);
|
|
87
75
|
const archivedDetailsCount = archivedDetailResults.reduce((total, r) => total + (r.dcmtsFound ?? r.jsonResult?.length ?? 0), 0);
|
|
@@ -619,44 +607,68 @@ export const useMultiMasterDetailDcmts = ({ dtd, masterDcmt, onClose, canNavigat
|
|
|
619
607
|
dataTypeByMid.set(md.id, md.dataType); });
|
|
620
608
|
// Collegamenti della relazione valorizzati dal master (prevalgono sui valori del form)
|
|
621
609
|
const associationMids = await getMasterAssociationsForDetailAsync(selectedRelation);
|
|
622
|
-
//
|
|
623
|
-
const
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
610
|
+
// Con piu' righe: primaria sui documenti, secondaria sui byte. Con una riga sola solo i byte.
|
|
611
|
+
const isBatch = rowsToArchive.length > 1;
|
|
612
|
+
const waitPanel = TMWaitPanelManager.show({
|
|
613
|
+
title: SDKUI_Localizator.Archiving,
|
|
614
|
+
max: isBatch ? rowsToArchive.length : 0,
|
|
615
|
+
cancelable: true,
|
|
616
|
+
showSecondary: isBatch,
|
|
617
|
+
showCounters: isBatch,
|
|
618
|
+
primaryLabel: isBatch ? SDKUI_Localizator.Documents : undefined,
|
|
619
|
+
secondaryLabel: isBatch ? 'File corrente' : undefined,
|
|
632
620
|
});
|
|
621
|
+
const publishBytes = (loaded, total) => {
|
|
622
|
+
const text = total > 0
|
|
623
|
+
? `Uploading... ${Globalization.getNumberDisplayValue(loaded, true)} / ${Globalization.getNumberDisplayValue(total, true)}`
|
|
624
|
+
: '';
|
|
625
|
+
if (isBatch)
|
|
626
|
+
waitPanel.setSecondary({ value: loaded, max: total, text });
|
|
627
|
+
else
|
|
628
|
+
waitPanel.update({ value: loaded, max: total, subtitle: text });
|
|
629
|
+
};
|
|
633
630
|
const result = [];
|
|
634
631
|
const archivedRowIds = new Set();
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
const rowData = rowsToArchive[i];
|
|
641
|
-
try {
|
|
642
|
-
setWaitPanel(prev => ({ ...prev, waitPanelTextPrimary: `${SDKUI_Localizator.Archiving} ${i + 1} / ${rowsToArchive.length}` }));
|
|
643
|
-
const newDID = await archiveRowAsync(rowData, detailTID, dataTypeByMid, associationMids, abortController.signal);
|
|
644
|
-
setWaitPanel(prev => ({ ...prev, waitPanelValuePrimary: i + 1 }));
|
|
645
|
-
archivedRowIds.add(rowData.id);
|
|
646
|
-
result.push({ rowIndex: i, id1: detailTID, id2: newDID, resultType: ResultTypes.SUCCESS });
|
|
647
|
-
}
|
|
648
|
-
catch (error) {
|
|
649
|
-
const err = error;
|
|
650
|
-
// Annullamento richiesto dall'utente: interrompe senza mostrare l'errore
|
|
651
|
-
if (err?.name === 'CanceledError' || abortController.signal.aborted) {
|
|
632
|
+
try {
|
|
633
|
+
for (let i = 0; i < rowsToArchive.length; i++) {
|
|
634
|
+
// Con la conferma di interruzione aperta il loop resta in pausa qui
|
|
635
|
+
await waitPanel.waitWhilePaused();
|
|
636
|
+
if (waitPanel.aborted) {
|
|
652
637
|
result.push({ rowIndex: i, id1: detailTID, id2: undefined, resultType: ResultTypes.WARNING, description: `Operazione interrotta. Elaborati ${i} documenti` });
|
|
638
|
+
waitPanel.warning();
|
|
653
639
|
break;
|
|
654
640
|
}
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
641
|
+
if (isBatch)
|
|
642
|
+
waitPanel.setSubtitle(`${SDKUI_Localizator.Archiving} ${i + 1} / ${rowsToArchive.length}`);
|
|
643
|
+
const rowData = rowsToArchive[i];
|
|
644
|
+
try {
|
|
645
|
+
const newDID = await archiveRowAsync(rowData, detailTID, dataTypeByMid, associationMids, waitPanel.signal, publishBytes);
|
|
646
|
+
archivedRowIds.add(rowData.id);
|
|
647
|
+
result.push({ rowIndex: i, id1: detailTID, id2: newDID, resultType: ResultTypes.SUCCESS });
|
|
648
|
+
waitPanel.ok();
|
|
649
|
+
}
|
|
650
|
+
catch (error) {
|
|
651
|
+
const err = error;
|
|
652
|
+
// Annullamento richiesto dall'utente: interrompe senza mostrare l'errore
|
|
653
|
+
if (err?.name === 'CanceledError' || waitPanel.aborted) {
|
|
654
|
+
result.push({ rowIndex: i, id1: detailTID, id2: undefined, resultType: ResultTypes.WARNING, description: `Operazione interrotta. Elaborati ${i} documenti` });
|
|
655
|
+
waitPanel.warning();
|
|
656
|
+
break;
|
|
657
|
+
}
|
|
658
|
+
result.push({ rowIndex: i, id1: detailTID, id2: undefined, resultType: ResultTypes.ERROR, description: getExceptionMessage(error) });
|
|
659
|
+
waitPanel.error();
|
|
660
|
+
if (stopOnFirstError)
|
|
661
|
+
break;
|
|
662
|
+
}
|
|
663
|
+
// Avanza a elaborazione conclusa: la barra non arriva al 100% prima dell'ultimo documento
|
|
664
|
+
if (isBatch)
|
|
665
|
+
await waitPanel.step();
|
|
658
666
|
}
|
|
659
667
|
}
|
|
668
|
+
finally {
|
|
669
|
+
// Chiuso prima del riepilogo dei risultati
|
|
670
|
+
waitPanel.close();
|
|
671
|
+
}
|
|
660
672
|
// Le righe archiviate escono dal riepilogo
|
|
661
673
|
if (archivedRowIds.size > 0) {
|
|
662
674
|
setArchiveRows(prev => prev.filter(r => !archivedRowIds.has(r.id)));
|
|
@@ -676,13 +688,11 @@ export const useMultiMasterDetailDcmts = ({ dtd, masterDcmt, onClose, canNavigat
|
|
|
676
688
|
TMExceptionBoxManager.show({ exception: error });
|
|
677
689
|
}
|
|
678
690
|
finally {
|
|
679
|
-
abortControllerRef.current = undefined;
|
|
680
|
-
setWaitPanel(CLOSED_WAIT_PANEL);
|
|
681
691
|
setIsArchiving(false);
|
|
682
692
|
}
|
|
683
693
|
};
|
|
684
|
-
// Archiviazione di una singola riga, con avanzamento dell'upload
|
|
685
|
-
const archiveRowAsync = async (row, detailTID, dataTypeByMid, associationMids, signal) => {
|
|
694
|
+
// Archiviazione di una singola riga, con avanzamento dell'upload notificato a onBytes
|
|
695
|
+
const archiveRowAsync = async (row, detailTID, dataTypeByMid, associationMids, signal, onBytes) => {
|
|
686
696
|
const ae = new ArchiveEngineByID(SDK_Globals.tmSession);
|
|
687
697
|
ae.TID = detailTID;
|
|
688
698
|
ae.Metadata_ClearAll();
|
|
@@ -714,23 +724,12 @@ export const useMultiMasterDetailDcmts = ({ dtd, masterDcmt, onClose, canNavigat
|
|
|
714
724
|
});
|
|
715
725
|
if (row.__file)
|
|
716
726
|
ae.ArchivingFile = row.__file;
|
|
717
|
-
let firstBlock = true;
|
|
718
|
-
let maxFileSize = 0;
|
|
719
727
|
return ae.ArchiveAsync(signal, (pd) => {
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
setWaitPanel(prev => ({
|
|
726
|
-
...prev,
|
|
727
|
-
waitPanelValueSecondary: pd.ProgressBarValue,
|
|
728
|
-
waitPanelTextSecondary: `Uploading... ${Globalization.getNumberDisplayValue(pd.ProgressBarValue, true)} / ${Globalization.getNumberDisplayValue(maxFileSize, true)}`,
|
|
729
|
-
}));
|
|
730
|
-
if (pd.ProgressBarValue === pd.ProgressBarMaximum) {
|
|
731
|
-
setWaitPanel(prev => ({ ...prev, waitPanelValueSecondary: 0, waitPanelMaxValueSecondary: 0, waitPanelTextSecondary: '' }));
|
|
732
|
-
firstBlock = true;
|
|
733
|
-
}
|
|
728
|
+
// Upload completato: la barra si azzera per il file successivo
|
|
729
|
+
if (pd.ProgressBarValue === pd.ProgressBarMaximum)
|
|
730
|
+
onBytes(0, 0);
|
|
731
|
+
else
|
|
732
|
+
onBytes(pd.ProgressBarValue ?? 0, pd.ProgressBarMaximum ?? 0);
|
|
734
733
|
});
|
|
735
734
|
};
|
|
736
735
|
return {
|
|
@@ -755,6 +754,5 @@ export const useMultiMasterDetailDcmts = ({ dtd, masterDcmt, onClose, canNavigat
|
|
|
755
754
|
openAddForm, openEditForm, closeAddForm, deleteRow, duplicateRow, upsertRow, updateRowValues, copyArchivedDetailToRows,
|
|
756
755
|
// Archiviazione
|
|
757
756
|
stopOnFirstError, setStopOnFirstError, isArchiving, archiveAllAsync,
|
|
758
|
-
waitPanel, abortController: abortControllerRef.current,
|
|
759
757
|
};
|
|
760
758
|
};
|
|
@@ -2,7 +2,12 @@ import { useEffect } from "react";
|
|
|
2
2
|
const usePreventFileDrop = (allowedDropZones) => {
|
|
3
3
|
useEffect(() => {
|
|
4
4
|
const isOverAllowedZone = (event) => allowedDropZones.some((ref) => ref.current?.contains(event.target));
|
|
5
|
+
// Il blocco vale solo per i file trascinati da fuori: i drag interni all'applicazione
|
|
6
|
+
// (riordino di metadati, colonne, tab, ...) devono restare liberi di completarsi
|
|
7
|
+
const isFileDrag = (event) => event.dataTransfer?.types?.includes("Files") === true;
|
|
5
8
|
const handleDragOver = (event) => {
|
|
9
|
+
if (!isFileDrag(event))
|
|
10
|
+
return;
|
|
6
11
|
if (isOverAllowedZone(event)) {
|
|
7
12
|
// Riafferma "copy" ad ogni dragover: altrimenti un "none"
|
|
8
13
|
// impostato mentre si era fuori zona resta e mostra "not-allowed"
|
|
@@ -17,6 +22,8 @@ const usePreventFileDrop = (allowedDropZones) => {
|
|
|
17
22
|
}
|
|
18
23
|
};
|
|
19
24
|
const handleDragEnter = (event) => {
|
|
25
|
+
if (!isFileDrag(event))
|
|
26
|
+
return;
|
|
20
27
|
if (isOverAllowedZone(event)) {
|
|
21
28
|
document.body.style.cursor = "default";
|
|
22
29
|
}
|
|
@@ -28,6 +35,8 @@ const usePreventFileDrop = (allowedDropZones) => {
|
|
|
28
35
|
document.body.style.cursor = "default";
|
|
29
36
|
};
|
|
30
37
|
const handleDrop = (event) => {
|
|
38
|
+
if (!isFileDrag(event))
|
|
39
|
+
return;
|
|
31
40
|
if (!isOverAllowedZone(event)) {
|
|
32
41
|
event.preventDefault();
|
|
33
42
|
document.body.style.cursor = "default";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useState } from "react";
|
|
3
3
|
import { QueryParameterDescriptor } from '@topconsultnpm/sdk-ts';
|
|
4
4
|
import { TMModal, TMTextBox, TMButton, TMCard, StyledDivHorizontal } from "../components";
|
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
import { useState, useEffect, useCallback } from 'react';
|
|
2
2
|
import { SDK_Globals } from '@topconsultnpm/sdk-ts';
|
|
3
|
+
const WORKFLOW_APPROVE_CHANGED_EVENT = 'onWorkflowApproveChange';
|
|
4
|
+
/** Totale dei documenti da approvare: somma dei dcmtsFound delle singole categorie. */
|
|
5
|
+
const calcTotalDcmtsFound = (data) => {
|
|
6
|
+
return data.reduce((sum, item) => sum + (item.dcmtsFound || 0), 0);
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Fetch in corso.
|
|
10
|
+
*
|
|
11
|
+
* La WFAppr non porta un contatore ma l'intera lista di approvazione con le righe
|
|
12
|
+
* dei documenti, ed è chiesta da più istanze del hook a ridosso l'una dell'altra
|
|
13
|
+
* (coda del login, pagina di approvazione, widget della home). Chi arriva mentre
|
|
14
|
+
* è già in volo aspetta la stessa risposta invece di aprire una seconda richiesta.
|
|
15
|
+
*/
|
|
16
|
+
let inFlight;
|
|
17
|
+
/** Ricarica i dati e notifica tutte le istanze del hook. */
|
|
18
|
+
const load = async () => {
|
|
19
|
+
const result = await SDK_Globals.tmSession?.NewWorkflowEngine().WFApprAsync(1);
|
|
20
|
+
SDK_Globals.currentWorkflowApproveData = result ?? [];
|
|
21
|
+
window.dispatchEvent(new CustomEvent(WORKFLOW_APPROVE_CHANGED_EVENT));
|
|
22
|
+
};
|
|
3
23
|
/**
|
|
4
24
|
* Hook per gestire i dati di approvazione del workflow.
|
|
5
25
|
* Fornisce il dataSource, lo stato di caricamento e una funzione per aggiornare i dati.
|
|
@@ -7,13 +27,10 @@ import { SDK_Globals } from '@topconsultnpm/sdk-ts';
|
|
|
7
27
|
export const useWorkflowApprove = () => {
|
|
8
28
|
const [workflowApproveData, setWorkflowApproveData] = useState(SDK_Globals.currentWorkflowApproveData);
|
|
9
29
|
const [isLoading, setIsLoading] = useState(false);
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const calculateTotalDcmtsFound = useCallback((data) => {
|
|
15
|
-
return data.reduce((sum, item) => sum + (item.dcmtsFound || 0), 0);
|
|
16
|
-
}, []);
|
|
30
|
+
// Seminato dai dati già in cache: un'istanza montata a login concluso parte dal
|
|
31
|
+
// totale reale e non da zero, altrimenti chi confronta questo valore con il
|
|
32
|
+
// contatore della home vede una differenza inesistente e ricarica a vuoto.
|
|
33
|
+
const [totalDcmtsFound, setTotalDcmtsFound] = useState(() => calcTotalDcmtsFound(SDK_Globals.currentWorkflowApproveData));
|
|
17
34
|
/**
|
|
18
35
|
* Ottiene tutti i work items che corrispondono a un determinato DID.
|
|
19
36
|
* Restituisce un array di oggetti { tid, did }.
|
|
@@ -40,12 +57,10 @@ export const useWorkflowApprove = () => {
|
|
|
40
57
|
}
|
|
41
58
|
setIsLoading(true);
|
|
42
59
|
try {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
// Notifica tutte le istanze del hook che i dati sono cambiati.
|
|
48
|
-
window.dispatchEvent(new CustomEvent('onWorkflowApproveChange'));
|
|
60
|
+
if (!inFlight) {
|
|
61
|
+
inFlight = load().finally(() => { inFlight = undefined; });
|
|
62
|
+
}
|
|
63
|
+
await inFlight;
|
|
49
64
|
}
|
|
50
65
|
catch (error) {
|
|
51
66
|
console.error("Errore durante il fetch dei dati di approvazione workflow:", error);
|
|
@@ -53,18 +68,19 @@ export const useWorkflowApprove = () => {
|
|
|
53
68
|
finally {
|
|
54
69
|
setIsLoading(false);
|
|
55
70
|
}
|
|
56
|
-
}, [
|
|
71
|
+
}, []);
|
|
57
72
|
// Questo useEffect serve a sincronizzare lo stato tra diverse istanze del hook.
|
|
58
73
|
// Se il componente A chiama refreshWorkflowApprove, il componente B (che usa lo stesso hook)
|
|
59
74
|
// riceverà l'evento e aggiornerà il suo stato locale.
|
|
60
75
|
useEffect(() => {
|
|
61
76
|
const handleUpdate = () => {
|
|
62
77
|
setWorkflowApproveData(SDK_Globals.currentWorkflowApproveData);
|
|
78
|
+
setTotalDcmtsFound(calcTotalDcmtsFound(SDK_Globals.currentWorkflowApproveData));
|
|
63
79
|
};
|
|
64
|
-
window.addEventListener(
|
|
80
|
+
window.addEventListener(WORKFLOW_APPROVE_CHANGED_EVENT, handleUpdate);
|
|
65
81
|
return () => {
|
|
66
|
-
window.removeEventListener(
|
|
82
|
+
window.removeEventListener(WORKFLOW_APPROVE_CHANGED_EVENT, handleUpdate);
|
|
67
83
|
};
|
|
68
|
-
}, [
|
|
84
|
+
}, []);
|
|
69
85
|
return { workflowApproveData, isLoading, refreshWorkflowApprove, totalDcmtsFound, getWorkItemsByDID };
|
|
70
86
|
};
|
|
@@ -103,6 +103,17 @@ export declare class CaseFlowService {
|
|
|
103
103
|
* @returns id della nuova istanza.
|
|
104
104
|
*/
|
|
105
105
|
static CreateCaseFlowInstance(template: CaseFlowTemplateDescriptor, instanceName: string, instanceDescription: string | undefined, metadataValues: Record<number, string>): Promise<number>;
|
|
106
|
+
/**
|
|
107
|
+
* Avvia un'istanza tramite StartAsync(cftid, id): il backend porta la pratica
|
|
108
|
+
* da `New` a `InProgress` e materializza i workitem della prima azione.
|
|
109
|
+
*
|
|
110
|
+
* NON va chiamata dopo `CreateCaseFlowInstance`: la Create dell'API REST
|
|
111
|
+
* esegue già lo start internamente, quindi un'istanza appena creata è
|
|
112
|
+
* ancora `New` solo nel descrittore inviato, non lato server. Questa resta
|
|
113
|
+
* per le istanze che si trovano davvero in `New` (avvio differito); sulle
|
|
114
|
+
* altre il backend rifiuta.
|
|
115
|
+
*/
|
|
116
|
+
static startCaseflow(caseFlowId: number, cftid?: number): Promise<void>;
|
|
106
117
|
/**
|
|
107
118
|
* Elimina un'istanza tramite DeleteAsync(cftid, id). Il cftid è preso dal
|
|
108
119
|
* template fornito (se disponibile) oppure risolto dall'istanza.
|
|
@@ -144,6 +155,17 @@ export declare class CaseFlowService {
|
|
|
144
155
|
* cftid quando non passato (come per bacheca e partecipanti).
|
|
145
156
|
*/
|
|
146
157
|
private static dcmtAddOrRemove;
|
|
158
|
+
/**
|
|
159
|
+
* Allega un file alla pratica tramite AttachAddAsync(cftid, id, ...).
|
|
160
|
+
* @returns il DID dell'allegato appena archiviato.
|
|
161
|
+
*/
|
|
162
|
+
static addAttachment(caseFlowId: number, file: File, name?: string, description?: string, cftid?: number): Promise<number | undefined>;
|
|
163
|
+
/**
|
|
164
|
+
* Toglie l'allegato dalla pratica tramite AttachRemoveAsync(cftid, id, attachDID).
|
|
165
|
+
* A differenza dello sgancio di un documento d'archivio, qui il file viene
|
|
166
|
+
* anche cancellato: un allegato fuori dalla sua pratica non ha più senso.
|
|
167
|
+
*/
|
|
168
|
+
static removeAttachment(caseFlowId: number, attachDID: number, cftid?: number): Promise<void>;
|
|
147
169
|
/**
|
|
148
170
|
* Aggiunge un partecipante all'istanza (o ne aggiorna ruolo/permessi se già
|
|
149
171
|
* presente) tramite ParticipantsAddOrRemoveAsync(remove=false).
|
|
@@ -179,11 +201,10 @@ export declare class CaseFlowService {
|
|
|
179
201
|
/**
|
|
180
202
|
* Stato "l'utente corrente segue questa pratica" letto dal descrittore.
|
|
181
203
|
*
|
|
182
|
-
*
|
|
183
|
-
*
|
|
184
|
-
* `
|
|
185
|
-
*
|
|
186
|
-
* arrivare come booleano, come 0/1 o come stringa.
|
|
204
|
+
* `isFollow` fa ormai parte del contratto (`CaseFlowInstanceDescriptor`):
|
|
205
|
+
* arriva valorizzato da `usp_Cfi_RetrieveAll`/`usp_Cfi_Retrieve`. Resta
|
|
206
|
+
* `undefined` solo quando il descrittore proviene da una sorgente che non
|
|
207
|
+
* popola il campo.
|
|
187
208
|
*
|
|
188
209
|
* Da NON dedurre dalla bacheca Home come fanno pratiche-dossier e gruppi di
|
|
189
210
|
* lavoro (filtro su `HomeBlogPost.classID`): quella query prende `TOP 30`
|
|
@@ -202,7 +223,27 @@ export declare class CaseFlowService {
|
|
|
202
223
|
static completeDataCompletionWorkItem(caseFlowId: number, workItemId: number, metadataValues: Record<number, string>, response?: string, cftid?: number): Promise<void>;
|
|
203
224
|
/** Rifiuta un workitem. Il motivo viene pubblicato in bacheca dal backend. */
|
|
204
225
|
static rejectWorkItem(caseFlowId: number, workItemId: number, response?: string, cftid?: number): Promise<void>;
|
|
205
|
-
/**
|
|
226
|
+
/**
|
|
227
|
+
* Prende in carico un'azione per se stessi (operazione Claim): il backend
|
|
228
|
+
* crea il workitem intestato al chiamante e porta l'azione in lavorazione.
|
|
229
|
+
*
|
|
230
|
+
* Non e' un caso particolare di `createWorkItemForAction`: assegnare e'
|
|
231
|
+
* riservato a Owner e Supervisore, prendere in carico e' di chiunque lavori
|
|
232
|
+
* alla pratica. Passando dall'operazione Assign, un Partecipante si vedeva
|
|
233
|
+
* rifiutare la presa in carico (TMC-2789).
|
|
234
|
+
*/
|
|
235
|
+
static claimAction(caseFlowId: number, actionID: number, cftid?: number): Promise<void>;
|
|
236
|
+
/**
|
|
237
|
+
* Rilascia un workitem preso in carico (operazione ReleaseClaim): il backend
|
|
238
|
+
* lo cancella e, se per quell'azione non restano altri destinatari, la riporta
|
|
239
|
+
* disponibile per la presa in carico.
|
|
240
|
+
*
|
|
241
|
+
* Stessa chiamata per due gesti diversi, e' la guardia della SP a distinguerli:
|
|
242
|
+
* il detentore rilascia il proprio workitem, un Owner/Supervisore annulla
|
|
243
|
+
* l'assegnazione di un altro. Chi chiama non deve dire quale dei due sta facendo.
|
|
244
|
+
*/
|
|
245
|
+
static releaseClaim(caseFlowId: number, workItemId: number, cftid?: number): Promise<void>;
|
|
246
|
+
/** Assegna un'azione a un ALTRO utente creando il relativo workitem (operazione Assign). */
|
|
206
247
|
static createWorkItemForAction(caseFlowId: number, actionID: number, toUserID: number, description?: string, cftid?: number): Promise<void>;
|
|
207
248
|
/** Forza il completamento di un'azione (supervisor). */
|
|
208
249
|
static forceCompleteAction(caseFlowId: number, actionID: number, reason?: string, cftid?: number): Promise<void>;
|