@topconsultnpm/sdkui-react 6.22.0-t1 → 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/ContextMenu/styles.d.ts +45 -43
- package/lib/components/NewComponents/FloatingMenuBar/TMFloatingMenuBar.js +6 -6
- package/lib/components/NewComponents/FloatingMenuBar/styles.d.ts +80 -73
- package/lib/components/base/Styled.d.ts +92 -76
- 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.d.ts +13 -0
- package/lib/components/base/TMButton.js +139 -7
- package/lib/components/base/TMClosableList.js +3 -3
- package/lib/components/base/TMCustomButton.js +40 -48
- package/lib/components/base/TMDataGrid.d.ts +4 -0
- package/lib/components/base/TMDataGrid.js +292 -12
- package/lib/components/base/TMDataGridExportForm.js +39 -30
- package/lib/components/base/TMDropDownMenu.js +1 -1
- package/lib/components/base/TMEditorBase.d.ts +2 -0
- package/lib/components/base/TMFileManager.js +5 -3
- package/lib/components/base/TMFileManagerDataGridView.js +12 -3
- package/lib/components/base/TMFileManagerThumbnailItems.js +20 -10
- package/lib/components/base/TMFileManagerUtils.d.ts +6 -6
- package/lib/components/base/TMFileManagerUtils.js +37 -1
- 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.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 +141 -28
- package/lib/components/base/TMPopUp.js +5 -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/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 +143 -70
- 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 +5 -4
- package/lib/components/choosers/TMDiskChooser.js +1 -1
- package/lib/components/choosers/TMDistinctValues.d.ts +9 -7
- package/lib/components/choosers/TMDistinctValues.js +157 -141
- package/lib/components/choosers/TMDynDataListItemChooser.js +1 -1
- package/lib/components/choosers/TMImageIDChooser.js +1 -1
- package/lib/components/choosers/TMMetadataChooser.js +3 -3
- package/lib/components/choosers/TMPathChooser.js +17 -34
- 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/TMRelationChooser.js +1 -1
- package/lib/components/choosers/TMSelectedValuesSummary.d.ts +13 -0
- package/lib/components/choosers/TMSelectedValuesSummary.js +89 -0
- package/lib/components/choosers/TMUserChooser.js +1 -1
- package/lib/components/editors/TMCheckBox.js +1 -1
- 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 +21 -43
- 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/TMMetadataEditor.d.ts +5 -1
- package/lib/components/editors/TMMetadataEditor.js +27 -23
- 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.d.ts +1 -0
- package/lib/components/editors/TMTextArea.js +25 -17
- package/lib/components/editors/TMTextBox.d.ts +2 -0
- package/lib/components/editors/TMTextBox.js +32 -21
- package/lib/components/editors/TMTextExpression.js +1 -1
- package/lib/components/features/archive/TMArchive.js +24 -5
- 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 +22 -9
- package/lib/components/features/documents/TMCopyToFolderForm.js +50 -42
- 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 +281 -113
- package/lib/components/features/documents/TMDcmtFormActionButtons.d.ts +11 -0
- package/lib/components/features/documents/TMDcmtFormActionButtons.js +79 -9
- package/lib/components/features/documents/TMDcmtIcon.d.ts +1 -3
- package/lib/components/features/documents/TMDcmtIcon.js +8 -8
- package/lib/components/features/documents/TMDcmtPreview.d.ts +7 -5
- package/lib/components/features/documents/TMDcmtPreview.js +16 -10
- 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 +95 -108
- package/lib/components/features/documents/TMMasterInfoFields.d.ts +20 -0
- package/lib/components/features/documents/TMMasterInfoFields.js +185 -0
- package/lib/components/features/documents/TMMergeToPdfForm.d.ts +1 -2
- package/lib/components/features/documents/TMMergeToPdfForm.js +83 -56
- package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.d.ts +46 -0
- package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.js +320 -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 +29 -9
- package/lib/components/features/documents/TMRelationViewer.js +310 -208
- 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 +172 -34
- package/lib/components/features/search/TMSearchQueryEditor.js +7 -5
- package/lib/components/features/search/TMSearchQueryPanel.d.ts +14 -4
- package/lib/components/features/search/TMSearchQueryPanel.js +153 -62
- package/lib/components/features/search/TMSearchResult.d.ts +21 -0
- package/lib/components/features/search/TMSearchResult.js +461 -152
- package/lib/components/features/search/TMSignatureInfoContent.js +1 -1
- package/lib/components/features/search/TMTreeSelector.js +130 -83
- 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.d.ts +10 -0
- package/lib/components/features/workflow/TMWorkflowPopup.js +9 -5
- 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/features/workflow/diagram/WorkitemRecipientsEditor.d.ts +3 -1
- package/lib/components/forms/Login/ChangePasswordInputs.d.ts +3 -1
- 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 +14 -3
- package/lib/components/grids/TMBlogHeader.js +5 -1
- package/lib/components/grids/TMBlogsPost.d.ts +2 -0
- package/lib/components/grids/TMBlogsPost.js +122 -99
- package/lib/components/grids/TMBlogsPostUtils.d.ts +1 -0
- package/lib/components/grids/TMBlogsPostUtils.js +15 -4
- 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.d.ts +1 -0
- package/lib/components/layout/panelManager/TMPanelManagerContainer.js +25 -15
- package/lib/components/layout/panelManager/TMPanelManagerContext.js +68 -93
- package/lib/components/layout/panelManager/TMPanelManagerToolbar.d.ts +4 -5
- package/lib/components/layout/panelManager/TMPanelManagerToolbar.js +1 -1
- package/lib/components/layout/panelManager/TMPanelWrapper.js +3 -3
- package/lib/components/layout/panelManager/types.d.ts +3 -0
- package/lib/components/layout/panelManager/utils.js +13 -11
- package/lib/components/pages/TMPage.js +30 -32
- package/lib/components/query/TMQueryCountButton.js +1 -1
- package/lib/components/query/TMQueryEditor.d.ts +17 -10
- package/lib/components/query/TMQueryEditor.js +9 -8
- package/lib/components/sidebar/TMCommandsPanel.d.ts +4 -4
- package/lib/components/sidebar/TMCommandsPanel.js +1 -1
- package/lib/components/sidebar/TMHeader.d.ts +1 -0
- package/lib/components/sidebar/TMHeader.js +37 -27
- package/lib/components/sidebar/TMSidebar.js +1 -1
- package/lib/components/sidebar/TMSidebarItem.js +1 -1
- package/lib/components/viewers/TMMidViewer.js +6 -3
- package/lib/components/viewers/TMTidViewer.js +89 -28
- package/lib/components/wizard/TMStepIndicator.js +3 -3
- 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/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_Globals.d.ts +110 -0
- package/lib/helper/SDKUI_Globals.js +151 -0
- package/lib/helper/SDKUI_Localizator.d.ts +756 -677
- package/lib/helper/SDKUI_Localizator.js +790 -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 +4 -3
- package/lib/helper/TMPdfViewer.js +1 -1
- package/lib/helper/TMToppyMessage.js +1 -1
- package/lib/helper/TMUtils.d.ts +51 -4
- package/lib/helper/TMUtils.js +273 -12
- 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/dataGridSearchHelper.d.ts +28 -0
- package/lib/helper/dataGridSearchHelper.js +51 -0
- package/lib/helper/dcmtsHelper.d.ts +22 -0
- package/lib/helper/dcmtsHelper.js +60 -1
- package/lib/helper/helpers.d.ts +24 -2
- package/lib/helper/helpers.js +59 -3
- 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/useCheckInOutOperations.d.ts +0 -6
- package/lib/hooks/useCheckInOutOperations.js +14 -34
- package/lib/hooks/useDataUserIdItem.d.ts +1 -0
- package/lib/hooks/useDataUserIdItem.js +1 -0
- package/lib/hooks/useDcmtOperations.d.ts +3 -12
- package/lib/hooks/useDcmtOperations.js +187 -179
- package/lib/hooks/useDocumentOperations.d.ts +5 -0
- package/lib/hooks/useDocumentOperations.js +64 -33
- package/lib/hooks/useInputDialog.js +1 -1
- package/lib/hooks/useMultiMasterDetailDcmts.d.ts +98 -0
- package/lib/hooks/useMultiMasterDetailDcmts.js +758 -0
- package/lib/hooks/usePreventFileDrop.js +9 -0
- package/lib/hooks/useQueryParametersDialog.js +1 -1
- 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/hooks/useWorkflowApprove.js +33 -17
- package/lib/index.d.ts +2 -0
- package/lib/index.js +5 -2
- package/lib/services/caseflow/CaseFlowService.d.ts +277 -0
- package/lib/services/caseflow/CaseFlowService.js +761 -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 +4 -4
- package/package.json +16 -13
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
3
3
|
import TMDcmtPreview from './TMDcmtPreview';
|
|
4
|
-
import { AccessLevelsEx, AppModules, ArchiveConstraints, ArchiveEngineByID, DcmtTypeListCacheService, DossierCacheService, LayoutCacheService, LayoutModes, MetadataDataDomains, MetadataDataTypes, ObjectClasses, ResultTypes, SDK_Globals, SDK_Localizator, SystemMIDsAsNumber, SystemTIDs, Task_States, TID_DID, UpdateEngineByID, UserListCacheService, ValidationItem, WorkflowCacheService, WorkingGroupCacheService, WorkItemMetadataNames } from '@topconsultnpm/sdk-ts';
|
|
4
|
+
import { AccessLevels, AccessLevelsEx, AppModules, ArchiveConstraints, ArchiveEngineByID, DcmtTypeDescriptor, DcmtTypeListCacheService, DcmtTypePermission, DossierCacheService, LayoutCacheService, LayoutModes, MetadataDataDomains, MetadataDataTypes, MetadataFormats, ObjectClasses, ResultTypes, SDK_Globals, SDK_Localizator, SystemMIDsAsNumber, SystemTIDs, Task_States, TID_DID, UpdateEngineByID, UserListCacheService, ValidationItem, WorkflowCacheService, WorkingGroupCacheService, WorkItemMetadataNames } from '@topconsultnpm/sdk-ts';
|
|
5
5
|
import { FormModes, SearchResultContext } from '../../../ts';
|
|
6
6
|
import { DeviceType, useDeviceType } from '../../base/TMDeviceProvider';
|
|
7
7
|
import { getWorkItemSetIDAsync, handleArchiveVisibility, searchResultToMetadataValues } from '../../../helper/queryHelper';
|
|
8
|
-
import { genUniqueId, IconShow, SDKUI_Localizator, updateMruTids, IconBoard, IconDcmtTypeSys, calcIsModified, IconMenuVertical, Globalization, getListMaxItems, getSystemMetadata, IconBoxArchiveIn, IconClear, IconUndo, SDKUI_Globals, IconPreview, isTaskMoreInfo, IconWorkflow, IconSearch, deepCompare, IconActivity, getExceptionMessage, isApprovalWorkflowView, getDcmtCicoStatus, buildWorkItemsFromWFCtrl, IconLock, getDcmtFormToolbarVisibility, taskModalSizes } from '../../../helper';
|
|
8
|
+
import { genUniqueId, IconShow, SDKUI_Localizator, updateMruTids, IconBoard, IconDcmtTypeSys, calcIsModified, IconMenuVertical, Globalization, getListMaxItems, getSystemMetadata, IconBoxArchiveIn, IconClear, IconUndo, SDKUI_Globals, IconPreview, isTaskMoreInfo, IconWorkflow, IconSearch, deepCompare, IconActivity, getExceptionMessage, isApprovalWorkflowView, getDcmtCicoStatus, buildWorkItemsFromWFCtrl, IconLock, getDcmtFormToolbarVisibility, taskModalSizes, IconArchiveMultipleDetailDocuments, isNotGrantedDraftsDTD } from '../../../helper';
|
|
9
9
|
import { hasDetailRelations, hasMasterRelations } from '../../../helper/dcmtsHelper';
|
|
10
10
|
import { Gutters, TMColors } from '../../../utils/theme';
|
|
11
11
|
import { StyledFormButtonsContainer, StyledLoadingContainer, StyledSpinner, StyledToolbarCardContainer } from '../../base/Styled';
|
|
@@ -13,7 +13,8 @@ import ShowAlert from '../../base/TMAlert';
|
|
|
13
13
|
import TMButton from '../../base/TMButton';
|
|
14
14
|
import { TMExceptionBoxManager, TMMessageBoxManager, ButtonNames } from '../../base/TMPopUp';
|
|
15
15
|
import TMSpinner, { Spinner } from '../../base/TMSpinner';
|
|
16
|
-
import
|
|
16
|
+
import TMLayoutContainer from '../../base/TMLayout';
|
|
17
|
+
import TMWaitPanelManager from '../../base/waitPanel/TMWaitPanelManager';
|
|
17
18
|
import TMDistinctValues from '../../choosers/TMDistinctValues';
|
|
18
19
|
import TMFormulaEditor, { FormulaDescriptor, FormulaHelper, FormulaTargets } from '../../editors/TMFormulaEditor';
|
|
19
20
|
import TMMetadataValues, { AdvancedMenuButtons } from '../../editors/TMMetadataValues';
|
|
@@ -26,6 +27,7 @@ import { useTMPanelManagerContext } from '../../layout/panelManager/TMPanelManag
|
|
|
26
27
|
import TMPanelManagerContainer from '../../layout/panelManager/TMPanelManagerContainer';
|
|
27
28
|
import { TMPanelManagerWithPersistenceProvider } from '../../layout/panelManager/TMPanelManagerWithPersistenceProvider';
|
|
28
29
|
import { useWorkflowApprove } from '../../../hooks/useWorkflowApprove';
|
|
30
|
+
import { useCaseFlowApprove } from '../../../hooks/useCaseFlowApprove';
|
|
29
31
|
import TMBlogCommentForm from '../blog/TMBlogCommentForm';
|
|
30
32
|
import WFDiagram from '../workflow/diagram/WFDiagram';
|
|
31
33
|
import TMTooltip from '../../base/TMTooltip';
|
|
@@ -39,6 +41,8 @@ import TMToppyDraggableHelpCenter from '../assistant/TMToppyDraggableHelpCenter'
|
|
|
39
41
|
import TMTaskForm from '../tasks/TMTaskForm';
|
|
40
42
|
import { useDocumentOperations } from '../../../hooks/useDocumentOperations';
|
|
41
43
|
import TMDcmtFormActionButtons from './TMDcmtFormActionButtons';
|
|
44
|
+
import { useArchiveListForm } from '../../../hooks/useArchiveListForm';
|
|
45
|
+
import TMMultiMasterDetailDcmtsForm from './TMMultiMasterDetailDcmtsForm';
|
|
42
46
|
//#region Interfaces, Types and Enums
|
|
43
47
|
/**
|
|
44
48
|
* Definisce il contesto da cui è stato invocato il TMDcmtForm.
|
|
@@ -57,21 +61,10 @@ export var InvocationContext;
|
|
|
57
61
|
let abortControllerLocal = new AbortController();
|
|
58
62
|
;
|
|
59
63
|
//#endregion
|
|
60
|
-
const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMode = FormModes.Update, invocationContext = InvocationContext.Default, showHeader = true, showBackButton = true, showDcmtFormSidebar = true, isClosable = false, showTodoDcmtForm = false, isExpertMode = SDKUI_Globals.userSettings.advancedSettings.expertMode === 1, isModal = false, titleModal, widthModal = "100%", heightModal = "100%", allowNavigation = true, canNext, canPrev, count, itemIndex, onNext, onPrev, inputFile = null, inputMids = [], connectorFileSave = undefined, isSharedDcmt = false, sharedSourceTID, sharedSourceDID, allowRelations = true, allowButtonsRefs = false, openS4TViewer = false, enableDragDropOverlay = false, editPdfForm = false, onClose, onSavedAsyncCallback, onSaveRecents, onWFOperationCompleted, allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, onTaskCompleted, onTaskCreateRequest, moreInfoTasks, taskFormDialogComponent, handleNavigateToWGs, handleNavigateToDossiers, onReferenceClick, onOpenS4TViewerRequest, onOpenPdfEditorRequest, openFileUploaderPdfEditor, s4TViewerDialogComponent, onScanRequest, passToSearch, fetchRemoteCertificates, datagridUtility, graphometricManager }) => {
|
|
64
|
+
const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMode = FormModes.Update, invocationContext = InvocationContext.Default, showHeader = true, showBackButton = true, showDcmtFormSidebar = true, isClosable = false, showTodoDcmtForm = false, isExpertMode = SDKUI_Globals.userSettings.advancedSettings.expertMode === 1, isModal = false, titleModal, widthModal = "100%", heightModal = "100%", allowNavigation = true, canNext, canPrev, count, itemIndex, onNext, onPrev, inputFile = null, inputMids = [], connectorFileSave = undefined, isSharedDcmt = false, sharedSourceTID, sharedSourceDID, allowRelations = true, allowButtonsRefs = false, openS4TViewer = false, enableDragDropOverlay = false, editPdfForm = false, onClose, onSavedAsyncCallback, onSaveRecents, onWFOperationCompleted, allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, onTaskCompleted, onTaskCreateRequest, moreInfoTasks, taskFormDialogComponent, handleNavigateToWGs, handleNavigateToDossiers, onReferenceClick, onOpenS4TViewerRequest, onOpenPdfEditorRequest, openFileUploaderPdfEditor, s4TViewerDialogComponent, onScanRequest, passToSearch, archiveListMode, fetchRemoteCertificates, datagridUtility, graphometricManager }) => {
|
|
61
65
|
const { onRefreshSearchAsyncDatagrid, onRefreshBlogDatagrid, onRefreshPreviewDatagrid } = datagridUtility || {};
|
|
62
66
|
const floatingBarContainerRef = useRef(null);
|
|
63
67
|
const [id, setID] = useState('');
|
|
64
|
-
const [showWaitPanelLocal, setShowWaitPanelLocal] = useState(false);
|
|
65
|
-
const [waitPanelTitleLocal, setWaitPanelTitleLocal] = useState('');
|
|
66
|
-
const [showPrimaryLocal, setShowPrimaryLocal] = useState(false);
|
|
67
|
-
const [waitPanelTextPrimaryLocal, setWaitPanelTextPrimaryLocal] = useState('');
|
|
68
|
-
const [waitPanelValuePrimaryLocal, setWaitPanelValuePrimaryLocal] = useState(0);
|
|
69
|
-
const [waitPanelMaxValuePrimaryLocal, setWaitPanelMaxValuePrimaryLocal] = useState(0);
|
|
70
|
-
const [showSecondaryLocal, setShowSecondaryLocal] = useState(false);
|
|
71
|
-
const [waitPanelTextSecondaryLocal, setWaitPanelTextSecondaryLocal] = useState('');
|
|
72
|
-
const [waitPanelValueSecondaryLocal, setWaitPanelValueSecondaryLocal] = useState(0);
|
|
73
|
-
const [waitPanelMaxValueSecondaryLocal, setWaitPanelMaxValueSecondaryLocal] = useState(0);
|
|
74
|
-
const [useWaitPanelLocalState, setUseWaitPanelLocalState] = useState(false);
|
|
75
68
|
const [formData, setFormData] = useState([]);
|
|
76
69
|
const [formDataOrig, setFormDataOrig] = useState([]);
|
|
77
70
|
const [validationItems, setValidationItems] = useState([]);
|
|
@@ -96,6 +89,10 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
|
|
|
96
89
|
const [isOpenFormulaEditor, setIsOpenFormulaEditor] = useState(false);
|
|
97
90
|
const [currentTIDHasDetailRelations, setCurrentTIDHasDetailRelations] = useState();
|
|
98
91
|
const [currentTIDHasMasterRelations, setCurrentTIDHasMasterRelations] = useState();
|
|
92
|
+
// Modale "Archivia documenti di dettaglio multipli" aperto dall'azione secondaria del form di archiviazione:
|
|
93
|
+
// dopo aver archiviato il master si apre il modale con il master appena archiviato come documento di partenza.
|
|
94
|
+
const [showMultiDetailArchiveModal, setShowMultiDetailArchiveModal] = useState(false);
|
|
95
|
+
const [multiDetailMasterDcmts, setMultiDetailMasterDcmts] = useState([]);
|
|
99
96
|
const [currentDcmt, setCurrentDcmt] = useState();
|
|
100
97
|
const [dcmtFile, setDcmtFile] = useState(null);
|
|
101
98
|
const [focusedMetadataValue, setFocusedMetadataValue] = useState();
|
|
@@ -116,6 +113,10 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
|
|
|
116
113
|
const [wfError, setWfError] = useState(null);
|
|
117
114
|
const [metadataDcmtOrigin, setMetadataDcmtOrigin] = useState(null);
|
|
118
115
|
const { workflowApproveData, getWorkItemsByDID } = useWorkflowApprove();
|
|
116
|
+
// Attività delle PRATICHE (CaseFlow) su questo documento. Come per il workflow
|
|
117
|
+
// la scoperta avviene QUI: da qualunque punto si apra il form, l'utente trova
|
|
118
|
+
// le sue azioni nel Toppy.
|
|
119
|
+
const { caseFlowWorkItems, completeCaseFlowWorkItem, rejectCaseFlowWorkItem } = useCaseFlowApprove(TID, DID);
|
|
119
120
|
// Get the current device type (e.g., mobile, tablet, desktop) using a custom hook.
|
|
120
121
|
const deviceType = useDeviceType();
|
|
121
122
|
// This avoids unnecessary re-renders by only recalculating when deviceType changes.
|
|
@@ -325,6 +326,14 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
|
|
|
325
326
|
}
|
|
326
327
|
// Carica DTD e metadata
|
|
327
328
|
let dtd = await DcmtTypeListCacheService.GetWithNotGrantedAsync(TID, DID, getMetadataResult);
|
|
329
|
+
// Le bozze dei gruppi di lavoro vivono su un tipo documento non autorizzato e quindi privo di
|
|
330
|
+
// permessi: si concede la sola lettura del file, altrimenti non sarebbe scaricabile dal form.
|
|
331
|
+
if (isNotGrantedDraftsDTD(dtd)) {
|
|
332
|
+
const perm = new DcmtTypePermission();
|
|
333
|
+
perm.canRetrieveFile = AccessLevels.Yes;
|
|
334
|
+
// Su una copia: GetWithNotGrantedAsync restituisce l'istanza in cache, condivisa con gli altri consumer
|
|
335
|
+
dtd = Object.assign(new DcmtTypeDescriptor(), dtd, { perm });
|
|
336
|
+
}
|
|
328
337
|
setFromDTD(dtd);
|
|
329
338
|
if (layoutMode === LayoutModes.Update || (layoutMode === LayoutModes.Ark && DID)) {
|
|
330
339
|
await setMetadataList(dtd?.metadata ?? [], getMetadataResult);
|
|
@@ -450,7 +459,7 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
|
|
|
450
459
|
openTaskFormHandler,
|
|
451
460
|
},
|
|
452
461
|
});
|
|
453
|
-
const { handleSignApprove,
|
|
462
|
+
const { handleSignApprove, relatedDocumentsInfo: { isOpenDetails, isOpenMaster, canArchiveDetailRelation, checkRelatedDcmtsArchiveCapability, checkManyToManyCapability, }, toppyOperations: { updateShowApprovePopup, updateShowRejectPopup, updateShowReAssignPopup, updateShowMoreInfoPopup } } = features;
|
|
454
463
|
useEffect(() => {
|
|
455
464
|
const fetchAllUsers = async () => {
|
|
456
465
|
const users = await UserListCacheService.GetAllAsync();
|
|
@@ -804,11 +813,91 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
|
|
|
804
813
|
// Verifica che ci siano riferimenti renderizzabili (solo Dossier o WorkingGroup)
|
|
805
814
|
return dcmtReferences.some(ref => ref.objClass === ObjectClasses.Dossier || ref.objClass === ObjectClasses.WorkingGroup);
|
|
806
815
|
}, [allowButtonsRefs, layoutMode, dcmtReferences, isOpenDetails, isOpenMaster]);
|
|
807
|
-
|
|
808
|
-
|
|
816
|
+
// Attività di pratica: stesse condizioni dell'approvazione workflow (documento
|
|
817
|
+
// in consultazione, senza errori, non dentro master/detail).
|
|
818
|
+
const showToppyForCaseFlow = useMemo(() => layoutMode === LayoutModes.Update && !fetchError && caseFlowWorkItems.length > 0 && !isOpenDetails && !isOpenMaster, [layoutMode, fetchError, caseFlowWorkItems.length, isOpenDetails, isOpenMaster]);
|
|
819
|
+
const isToppyVisible = useMemo(() => Boolean((showToppyForApprove || showToppyForCompleteMoreInfo || showToppyForReferences || showToppyForCaseFlow) && !openS4TViewer && !showTodoDcmtForm && !editPdfForm), [showToppyForApprove, showToppyForCompleteMoreInfo, showToppyForReferences, showToppyForCaseFlow, openS4TViewer, showTodoDcmtForm, editPdfForm]);
|
|
820
|
+
const handleClearForm = useCallback(() => {
|
|
821
|
+
let data = structuredClone(formData);
|
|
822
|
+
if (!data || data.length === 0)
|
|
823
|
+
return;
|
|
824
|
+
for (let md of data) {
|
|
825
|
+
if (!md.mid)
|
|
826
|
+
continue;
|
|
827
|
+
if (md.mid > 99) {
|
|
828
|
+
const defaultValue = md.md?.defaultValue;
|
|
829
|
+
if (defaultValue) {
|
|
830
|
+
if (FormulaHelper.isFormula(defaultValue)) {
|
|
831
|
+
md.value = undefined;
|
|
832
|
+
}
|
|
833
|
+
else {
|
|
834
|
+
md.value = defaultValue;
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
else if (formDataOrig.find(metadata => metadata.mid === md.mid)?.value === undefined) {
|
|
838
|
+
if (md.value)
|
|
839
|
+
md.value = undefined;
|
|
840
|
+
}
|
|
841
|
+
else if (md.value && md.value.length > 0) {
|
|
842
|
+
md.value = '';
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
setFormData(data);
|
|
847
|
+
}, [formData, formDataOrig]);
|
|
848
|
+
// Modalità "aggiungi a elenco" (archiviazione dettagli multipli): tutta la logica specifica è nell'hook.
|
|
849
|
+
const archiveList = useArchiveListForm({
|
|
850
|
+
mode: archiveListMode,
|
|
851
|
+
editingRowValues: inputMids,
|
|
852
|
+
formDataOrig,
|
|
853
|
+
formDataRef,
|
|
854
|
+
dcmtFileRef,
|
|
855
|
+
tid: TID,
|
|
856
|
+
isModal,
|
|
857
|
+
id,
|
|
858
|
+
clearForm: handleClearForm,
|
|
859
|
+
});
|
|
860
|
+
const isModified = useMemo(() => calcIsModified(formData, archiveList.referenceValues), [formData, archiveList.referenceValues]);
|
|
809
861
|
const formToolbar = useMemo(() => _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '10px' }, children: [allowNavigation && canPrev != undefined && _jsx("p", { style: { textAlign: 'center', padding: '1px 4px', display: 'flex' }, children: `${itemIndex}/${count}` }), allowNavigation && canPrev != undefined && _jsx(TMSaveFormButtonPrevious, { btnStyle: 'icon', iconColor: 'white', isModified: isModified, formMode: formMode, canPrev: canPrev, onPrev: onPrev }), allowNavigation && canNext != undefined && _jsx(TMSaveFormButtonNext, { btnStyle: 'icon', iconColor: 'white', isModified: isModified, formMode: formMode, canNext: canNext, onNext: onNext }), layoutMode === LayoutModes.Update &&
|
|
810
|
-
_jsx(ContextMenu, { items: operationItems, trigger: "left", children: _jsx(IconMenuVertical, { color: 'white', cursor: 'pointer' }) }), layoutMode === LayoutModes.Ark &&
|
|
811
|
-
_jsx(TMTooltip, { content: SDKUI_Localizator.PassToSearch, position: 'bottom', children: _jsx(IconSearch, { style: { cursor: 'pointer' }, onClick: handlePassToSearch }) })] }), [allowNavigation, canPrev, canNext, itemIndex, count, isModified, formMode, onPrev, onNext, layoutMode, operationItems, handlePassToSearch]);
|
|
862
|
+
_jsx(ContextMenu, { items: operationItems, trigger: "left", children: _jsx(IconMenuVertical, { color: 'white', cursor: 'pointer' }) }), layoutMode === LayoutModes.Ark && !archiveList.enabled &&
|
|
863
|
+
_jsx(TMTooltip, { content: SDKUI_Localizator.PassToSearch, position: 'bottom', children: _jsx(IconSearch, { style: { cursor: 'pointer' }, onClick: handlePassToSearch }) })] }), [allowNavigation, canPrev, canNext, itemIndex, count, isModified, formMode, onPrev, onNext, layoutMode, operationItems, handlePassToSearch, archiveList.enabled]);
|
|
864
|
+
// Ricarica del pannello metadati: invalida le cache del tipo documento e del layout, così la
|
|
865
|
+
// definizione dei metadati e la disposizione del form vengono rilette dal server, poi ricostruisce il form
|
|
866
|
+
const reloadFormMetadataAsync = useCallback(async () => {
|
|
867
|
+
if (!TID)
|
|
868
|
+
return;
|
|
869
|
+
// refreshCache invalida la voce in cache e rilegge il tipo documento con i metadati:
|
|
870
|
+
// la GetWithNotGrantedAsync della load successiva trova quella appena aggiornata
|
|
871
|
+
await DcmtTypeListCacheService.GetAsync(TID, true, undefined, false, true);
|
|
872
|
+
LayoutCacheService.Remove(TID, layoutMode);
|
|
873
|
+
if (layoutMode === LayoutModes.Update)
|
|
874
|
+
LayoutCacheService.Remove(TID, LayoutModes.None);
|
|
875
|
+
await loadDocumentFormDataAsync();
|
|
876
|
+
}, [TID, layoutMode, loadDocumentFormDataAsync]);
|
|
877
|
+
// Il ricaricamento ricostruisce il form: con valori inseriti e non salvati chiede prima conferma.
|
|
878
|
+
// In archiviazione la ricostruzione sgancia anche il file, quindi va confermata pure in quel caso.
|
|
879
|
+
const handleRefreshFormMetadataAsync = useCallback(async () => {
|
|
880
|
+
const hasPendingChanges = isModified || (layoutMode === LayoutModes.Ark && !!dcmtFile);
|
|
881
|
+
if (!hasPendingChanges) {
|
|
882
|
+
await reloadFormMetadataAsync();
|
|
883
|
+
return;
|
|
884
|
+
}
|
|
885
|
+
const isConfirmed = await new Promise(resolve => {
|
|
886
|
+
let isAnswered = false;
|
|
887
|
+
TMMessageBoxManager.show({
|
|
888
|
+
parentId: isModal ? "TMDcmtFormShowConfirmForClose-" + id : undefined,
|
|
889
|
+
title: SDKUI_Localizator.Refresh,
|
|
890
|
+
message: SDKUI_Localizator.ConfirmOnCancel,
|
|
891
|
+
buttons: [ButtonNames.YES, ButtonNames.NO],
|
|
892
|
+
onButtonClick: (e) => { isAnswered = true; resolve(e === ButtonNames.YES); },
|
|
893
|
+
// Chiusura dalla X: senza questa la Promise non si risolverebbe e il loader resterebbe acceso
|
|
894
|
+
onClose: () => { if (!isAnswered)
|
|
895
|
+
resolve(false); }
|
|
896
|
+
});
|
|
897
|
+
});
|
|
898
|
+
if (isConfirmed)
|
|
899
|
+
await reloadFormMetadataAsync();
|
|
900
|
+
}, [isModified, layoutMode, dcmtFile, isModal, id, reloadFormMetadataAsync]);
|
|
812
901
|
const handleUndo = useCallback(() => {
|
|
813
902
|
setFormData(structuredClone(formDataOrig));
|
|
814
903
|
}, [formDataOrig]);
|
|
@@ -871,15 +960,15 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
|
|
|
871
960
|
}
|
|
872
961
|
}, [DID, TID, getSpecificChangedKeysWithValues, refreshMetadataAsync, onSavedAsyncCallback, onClose]);
|
|
873
962
|
const handleArchiveCompleted = useCallback(async () => {
|
|
874
|
-
let firstBlock = true;
|
|
875
|
-
let maxFileSize = 0;
|
|
876
963
|
let operationTitle = SDKUI_Localizator.Archiving;
|
|
877
|
-
setUseWaitPanelLocalState(true);
|
|
878
|
-
setShowWaitPanelLocal(true);
|
|
879
|
-
setShowPrimaryLocal(false);
|
|
880
|
-
setShowSecondaryLocal(true);
|
|
881
|
-
setWaitPanelTitleLocal(operationTitle);
|
|
882
964
|
abortControllerLocal = new AbortController();
|
|
965
|
+
// Interrompi solo sopra il megabyte: sotto, l'upload finisce prima che serva.
|
|
966
|
+
const panel = TMWaitPanelManager.show({
|
|
967
|
+
title: operationTitle,
|
|
968
|
+
showCounters: false,
|
|
969
|
+
cancelable: (dcmtFileRef.current?.size ?? 0) >= 1000000,
|
|
970
|
+
onAbort: () => abortControllerLocal.abort(),
|
|
971
|
+
});
|
|
883
972
|
const ae = new ArchiveEngineByID(SDK_Globals.tmSession);
|
|
884
973
|
ae.TID = TID;
|
|
885
974
|
ae.Metadata_ClearAll();
|
|
@@ -915,42 +1004,41 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
|
|
|
915
1004
|
sharedDcmt.did = sharedSourceDID;
|
|
916
1005
|
ae.SharedDcmt = sharedDcmt;
|
|
917
1006
|
}
|
|
1007
|
+
// Fase 1: upload del file, la barra segue i byte.
|
|
918
1008
|
let newDID = await ae.ArchiveAsync(abortControllerLocal.signal, (pd) => {
|
|
919
|
-
|
|
920
|
-
maxFileSize = pd.ProgressBarMaximum ?? 0;
|
|
921
|
-
setWaitPanelMaxValueSecondaryLocal(maxFileSize);
|
|
922
|
-
firstBlock = false;
|
|
923
|
-
}
|
|
924
|
-
setWaitPanelValueSecondaryLocal(pd.ProgressBarValue);
|
|
925
|
-
setWaitPanelTextSecondaryLocal(`${SDKUI_Localizator.Archiving}... ${Globalization.getNumberDisplayValue(pd.ProgressBarValue, true)} / ${Globalization.getNumberDisplayValue(maxFileSize, true)}`);
|
|
1009
|
+
const maxFileSize = pd.ProgressBarMaximum ?? 0;
|
|
926
1010
|
if (pd.ProgressBarValue === pd.ProgressBarMaximum) {
|
|
927
|
-
//
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
firstBlock = true;
|
|
1011
|
+
// Upload finito: fase 2 sulla stessa barra, tre passi, gia' al 20%.
|
|
1012
|
+
panel.update({
|
|
1013
|
+
title: SDKUI_Localizator.ArchivingCompletionInProgress,
|
|
1014
|
+
subtitle: SDKUI_Localizator.ArchivingCompletionInProgress,
|
|
1015
|
+
value: 0.6,
|
|
1016
|
+
max: 3,
|
|
1017
|
+
});
|
|
1018
|
+
return;
|
|
936
1019
|
}
|
|
1020
|
+
panel.update({
|
|
1021
|
+
value: pd.ProgressBarValue,
|
|
1022
|
+
max: maxFileSize,
|
|
1023
|
+
subtitle: `${SDKUI_Localizator.Archiving}... ${Globalization.getNumberDisplayValue(pd.ProgressBarValue, true)} / ${Globalization.getNumberDisplayValue(maxFileSize, true)}`,
|
|
1024
|
+
});
|
|
937
1025
|
});
|
|
938
1026
|
// Aggiorna lo stato locale immediatamente dopo il salvataggio riuscito
|
|
939
1027
|
// Questo garantisce che isModified diventi false anche se il reload fallisce
|
|
940
1028
|
const savedFormData = structuredClone(formDataRef.current);
|
|
941
1029
|
setFormDataOrig(savedFormData);
|
|
942
1030
|
formDataOrigRef.current = savedFormData;
|
|
943
|
-
// Fase 2: Completamento archiviazione (la
|
|
1031
|
+
// Fase 2: Completamento archiviazione (la barra a tre passi è già visibile dal callback)
|
|
944
1032
|
// Imposta il titolo anche qui per sicurezza, nel caso il callback non venga eseguito
|
|
945
|
-
|
|
1033
|
+
panel.update({ title: SDKUI_Localizator.ArchivingCompletionInProgress, max: 3 });
|
|
946
1034
|
// Step 1/3: Aggiornamento griglia di ricerca
|
|
947
|
-
|
|
1035
|
+
panel.setValue(1);
|
|
948
1036
|
await onRefreshSearchAsyncDatagrid?.();
|
|
949
1037
|
// Step 2/3: Callback di salvataggio
|
|
950
|
-
|
|
1038
|
+
panel.setValue(2);
|
|
951
1039
|
await onSavedAsyncCallback?.(ae.TID, newDID);
|
|
952
1040
|
// Step 3/3: Aggiornamento lista metadati
|
|
953
|
-
|
|
1041
|
+
panel.setValue(3);
|
|
954
1042
|
// Usa fromDTDRef.current invece di fromDTD per evitare stale closure,
|
|
955
1043
|
// garantendo di avere il descrittore del tipo documento corrente.
|
|
956
1044
|
await setMetadataList(fromDTDRef.current?.metadata ?? [], undefined, true, newDID);
|
|
@@ -964,55 +1052,62 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
|
|
|
964
1052
|
const isDuplication = layoutMode === LayoutModes.Ark && DID;
|
|
965
1053
|
if (isDuplication)
|
|
966
1054
|
onClose?.();
|
|
1055
|
+
// Ritorna il DID del documento appena archiviato, così il chiamante può proseguire
|
|
1056
|
+
// (es. aprire il modale di archiviazione dei documenti di dettaglio sul master appena creato).
|
|
1057
|
+
return newDID;
|
|
967
1058
|
}
|
|
968
1059
|
catch (err) {
|
|
969
1060
|
TMExceptionBoxManager.show({ exception: err });
|
|
1061
|
+
return undefined;
|
|
970
1062
|
}
|
|
971
1063
|
finally {
|
|
972
|
-
|
|
973
|
-
setUseWaitPanelLocalState(false);
|
|
1064
|
+
panel.close();
|
|
974
1065
|
}
|
|
975
1066
|
}, [TID, connectorFileSave, onSavedAsyncCallback, onSaveRecents, onClose, DID, setMetadataList, handleReset, layoutMode, isSharedDcmt]);
|
|
1067
|
+
// Messaggio di conferma dell'archiviazione in base al vincolo del tipo documento (ArchiveConstraints).
|
|
1068
|
+
const getArchiveConfirmMessage = useCallback(() => {
|
|
1069
|
+
// Con connectorFileSave il file viene prodotto dal connettore solo alla conferma: si assume che ci sarà.
|
|
1070
|
+
const hasFile = !!connectorFileSave || !!dcmtFileRef.current;
|
|
1071
|
+
switch (fromDTDRef.current?.archiveConstraint) {
|
|
1072
|
+
// Solo metadati: il file non è previsto.
|
|
1073
|
+
case ArchiveConstraints.OnlyMetadata: return SDKUI_Localizator.ArchiveDocument_Confirm;
|
|
1074
|
+
// File obbligatorio: senza file il pulsante Archivia è disabilitato, quindi qui il file c'è.
|
|
1075
|
+
case ArchiveConstraints.ContentCompulsory: return SDKUI_Localizator.ArchiveDocument_Confirm;
|
|
1076
|
+
// Metadati e/o file: se il file manca lo segnala, come in v5.
|
|
1077
|
+
default: return hasFile ? SDKUI_Localizator.ArchiveDocument_Confirm : SDKUI_Localizator.ArchiveOnlyMetadata_Confirm;
|
|
1078
|
+
}
|
|
1079
|
+
}, [connectorFileSave]);
|
|
976
1080
|
const handleConfirmAction = useCallback(async () => {
|
|
1081
|
+
const isUpdate = layoutMode === LayoutModes.Update;
|
|
977
1082
|
TMMessageBoxManager.show({
|
|
978
1083
|
parentId: isModal ? "TMDcmtFormShowConfirmForClose-" + id : undefined,
|
|
979
1084
|
buttons: [ButtonNames.YES, ButtonNames.NO],
|
|
980
|
-
message:
|
|
981
|
-
onButtonClick(e) {
|
|
1085
|
+
message: isUpdate ? SDKUI_Localizator.SaveQuestion : getArchiveConfirmMessage(),
|
|
1086
|
+
onButtonClick: (e) => {
|
|
982
1087
|
if (e !== ButtonNames.YES)
|
|
983
1088
|
return;
|
|
984
|
-
|
|
1089
|
+
isUpdate ? handleSave() : handleArchiveCompleted();
|
|
985
1090
|
},
|
|
986
1091
|
});
|
|
987
|
-
}, [isModal, id, layoutMode, handleSave, handleArchiveCompleted]);
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
if (md.value)
|
|
1007
|
-
md.value = undefined;
|
|
1008
|
-
}
|
|
1009
|
-
else if (md.value && md.value.length > 0) {
|
|
1010
|
-
md.value = '';
|
|
1011
|
-
}
|
|
1012
|
-
}
|
|
1013
|
-
}
|
|
1014
|
-
setFormData(data);
|
|
1015
|
-
}, [formData, formDataOrig]);
|
|
1092
|
+
}, [isModal, id, layoutMode, getArchiveConfirmMessage, handleSave, handleArchiveCompleted]);
|
|
1093
|
+
// Azione secondaria del form di archiviazione: archivia il master e, subito dopo,
|
|
1094
|
+
// apre il modale di archiviazione dei documenti di dettaglio multipli usando il master appena creato.
|
|
1095
|
+
const handleArchiveMasterAndDetails = useCallback(async () => {
|
|
1096
|
+
TMMessageBoxManager.show({
|
|
1097
|
+
parentId: isModal ? "TMDcmtFormShowConfirmForClose-" + id : undefined,
|
|
1098
|
+
buttons: [ButtonNames.YES, ButtonNames.NO],
|
|
1099
|
+
message: SDKUI_Localizator.ArchiveMasterAndDetails_Confirm,
|
|
1100
|
+
onButtonClick: async (e) => {
|
|
1101
|
+
if (e !== ButtonNames.YES)
|
|
1102
|
+
return;
|
|
1103
|
+
const newDID = await handleArchiveCompleted();
|
|
1104
|
+
if (newDID === undefined || newDID === null)
|
|
1105
|
+
return;
|
|
1106
|
+
setMultiDetailMasterDcmts([{ TID: TID, DID: newDID }]);
|
|
1107
|
+
setShowMultiDetailArchiveModal(true);
|
|
1108
|
+
},
|
|
1109
|
+
});
|
|
1110
|
+
}, [isModal, id, handleArchiveCompleted, TID]);
|
|
1016
1111
|
const clearFormBtnDisabled = useMemo(() => formData.filter(md => md.mid && md.value && md.mid > 99 && md.value.length > 0).length > 0, [formData]);
|
|
1017
1112
|
const archiveBtnDisabled = useMemo(() => layoutMode === LayoutModes.Update || (fromDTD?.archiveConstraint === ArchiveConstraints.ContentCompulsory && !dcmtFile) || validationItems.length > 0, [layoutMode, fromDTD?.archiveConstraint, dcmtFile, validationItems.length]);
|
|
1018
1113
|
const undoBtnDisabled = useMemo(() => layoutMode === LayoutModes.Update || !isModified, [layoutMode, isModified]);
|
|
@@ -1021,10 +1116,14 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
|
|
|
1021
1116
|
const metadataValuesSource = useMemo(() => {
|
|
1022
1117
|
return applyMetadataFilter(formData, showAll, listMaxItems, TID);
|
|
1023
1118
|
}, [showAll, formData, listMaxItems, TID]);
|
|
1024
|
-
const metadataValuesSourceOrig = useMemo(() =>
|
|
1025
|
-
|
|
1026
|
-
|
|
1119
|
+
const metadataValuesSourceOrig = useMemo(() =>
|
|
1120
|
+
// I valori di riferimento (in modifica riga includono i valori già caricati) li calcola l'hook:
|
|
1121
|
+
// così i campi pre-compilati non si colorano di giallo finché l'utente non li cambia davvero.
|
|
1122
|
+
applyMetadataFilter(archiveList.referenceValues, showAll, listMaxItems, TID), [showAll, archiveList.referenceValues, listMaxItems, TID]);
|
|
1027
1123
|
const handleClose = useCallback(() => {
|
|
1124
|
+
// Modalità "aggiungi a elenco": la X non archivia ma aggiorna l'elenco (gestita dall'hook).
|
|
1125
|
+
if (archiveList.requestClose(isModified, onClose))
|
|
1126
|
+
return;
|
|
1028
1127
|
if (!isModified) {
|
|
1029
1128
|
onClose?.();
|
|
1030
1129
|
return;
|
|
@@ -1045,7 +1144,7 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
|
|
|
1045
1144
|
}
|
|
1046
1145
|
}
|
|
1047
1146
|
});
|
|
1048
|
-
}, [isModified, onClose, isModal, id, handleSave]);
|
|
1147
|
+
}, [isModified, onClose, isModal, id, handleSave, archiveList]);
|
|
1049
1148
|
const getFormula = useCallback(() => {
|
|
1050
1149
|
let fd = new FormulaDescriptor();
|
|
1051
1150
|
fd.expression = FormulaHelper.isFormula(focusedMetadataValue?.value) ? FormulaHelper.removeFormulaTag(focusedMetadataValue?.value) : undefined;
|
|
@@ -1099,7 +1198,7 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
|
|
|
1099
1198
|
const { checkoutStatus } = getDcmtCicoStatus(formData, allUsers, fromDTD);
|
|
1100
1199
|
if (!checkoutStatus.isCheckedOut)
|
|
1101
1200
|
return null;
|
|
1102
|
-
return (_jsx(Ribbon, {
|
|
1201
|
+
return (_jsx(Ribbon, { $isMobile: isMobile, children: _jsx(TMTooltip, { content: checkoutStatus.editLockTooltipText, position: "right", children: _jsx("span", { children: checkoutStatus.mode === 'editMode' ? SDKUI_Localizator.CheckOut : 'Locked' }) }) }));
|
|
1103
1202
|
}, [formData, fromDTD, isMobile]);
|
|
1104
1203
|
const tmDcmtForm = useMemo(() => {
|
|
1105
1204
|
return _jsxs(_Fragment, { children: [checkoutBadge && _jsx("div", { style: { padding: '10px', display: 'flex', justifyContent: 'center' }, children: checkoutBadge }), metadataValuesSource.length > 0 &&
|
|
@@ -1118,7 +1217,14 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
|
|
|
1118
1217
|
break;
|
|
1119
1218
|
}
|
|
1120
1219
|
} }), _jsxs(StyledFormButtonsContainer, { children: [_jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: 10 }, children: _jsx("div", { style: { display: 'flex', justifyContent: 'center', alignItems: 'center', gap: '8px' }, children: layoutMode === LayoutModes.Update ? _jsxs(_Fragment, { children: [_jsx(TMSaveFormButtonSave, { showTooltip: false, btnStyle: 'advanced', advancedColor: '#f09c0a', isModified: isModified, formMode: formMode, errorsCount: validationItems.filter(o => o.ResultType == ResultTypes.ERROR).length, onSaveAsync: handleConfirmAction }), _jsx(TMSaveFormButtonUndo, { btnStyle: 'toolbar', showTooltip: true, color: 'primary', isModified: isModified, formMode: formMode, onUndo: handleUndo })] }) :
|
|
1121
|
-
|
|
1220
|
+
archiveList.enabled ?
|
|
1221
|
+
_jsxs(_Fragment, { children: [_jsx(TMButton, { disabled: archiveBtnDisabled, btnStyle: 'advanced', icon: _jsx(IconBoxArchiveIn, {}), width: 'auto', showTooltip: false, caption: archiveList.isEditingRow ? SDKUI_Localizator.Update : SDKUI_Localizator.Add, advancedColor: TMColors.success, onClick: archiveList.submit }), _jsx(TMButton, { disabled: !clearFormBtnDisabled, btnStyle: 'advanced', icon: _jsx(IconClear, {}), width: 'auto', showTooltip: false, caption: SDKUI_Localizator.Clear, advancedColor: TMColors.tertiary, onClick: handleClearForm })] }) :
|
|
1222
|
+
_jsxs(_Fragment, { children: [_jsx(TMButton, { disabled: archiveBtnDisabled, btnStyle: 'advanced', icon: _jsx(IconBoxArchiveIn, {}), width: canArchiveDetailRelation ? '120px' : 'auto', showTooltip: false, caption: SDKUI_Localizator.Archive, advancedColor: TMColors.success, onClick: handleConfirmAction, secondaryActions: canArchiveDetailRelation ? [{
|
|
1223
|
+
name: SDKUI_Localizator.ArchiveMasterAndMultipleDetailDocuments,
|
|
1224
|
+
icon: _jsx(IconArchiveMultipleDetailDocuments, {}),
|
|
1225
|
+
disabled: archiveBtnDisabled,
|
|
1226
|
+
onClick: handleArchiveMasterAndDetails,
|
|
1227
|
+
}] : undefined }), _jsx(TMButton, { disabled: !clearFormBtnDisabled, btnStyle: 'advanced', icon: _jsx(IconClear, {}), width: 'auto', showTooltip: false, caption: SDKUI_Localizator.Clear, advancedColor: TMColors.tertiary, onClick: handleClearForm }), DID && _jsx(TMButton, { disabled: undoBtnDisabled, btnStyle: 'advanced', icon: _jsx(IconUndo, {}), width: '150px', showTooltip: false, caption: SDKUI_Localizator.Undo, advancedColor: TMColors.tertiary, onClick: handleUndo })] }) }) }), customButton && _jsx(TMCustomButton, { button: customButton, formData: formData, selectedItems: [], onClose: () => setCustomButton(undefined) }), totalItems > listMaxItems &&
|
|
1122
1228
|
!isApprView &&
|
|
1123
1229
|
TID !== SystemTIDs.Drafts &&
|
|
1124
1230
|
!shouldShowAll &&
|
|
@@ -1149,6 +1255,8 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
|
|
|
1149
1255
|
handleConfirmAction,
|
|
1150
1256
|
handleUndo,
|
|
1151
1257
|
handleClearForm,
|
|
1258
|
+
canArchiveDetailRelation,
|
|
1259
|
+
handleArchiveMasterAndDetails,
|
|
1152
1260
|
isReadOnlyOriginCallback,
|
|
1153
1261
|
metadataDcmtOrigin?.fromTID,
|
|
1154
1262
|
]);
|
|
@@ -1286,6 +1394,7 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
|
|
|
1286
1394
|
allowMaximize: !isMobile,
|
|
1287
1395
|
onBack: getOnBackHandler(true),
|
|
1288
1396
|
onClose: isClosable ? () => { } : undefined,
|
|
1397
|
+
onRefresh: handleRefreshFormMetadataAsync,
|
|
1289
1398
|
toolbar: allowNavigation ? formToolbar : _jsx(_Fragment, {})
|
|
1290
1399
|
},
|
|
1291
1400
|
},
|
|
@@ -1375,7 +1484,7 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
|
|
|
1375
1484
|
},
|
|
1376
1485
|
];
|
|
1377
1486
|
return panels;
|
|
1378
|
-
}, [fromDTD, showBackButton, tmDcmtForm, tmBlog, tmSysMetadata, tmDcmtPreview, tmWF, tmDcmtTasks, isPreviewDisabled, isSysMetadataDisabled, isBoardDisabled, isWFDisabled, inputFile, isClosable, allTasks, DID, TID, isReadOnlyOriginCallback, metadataDcmtOrigin?.fromTID]);
|
|
1487
|
+
}, [fromDTD, showBackButton, tmDcmtForm, tmBlog, tmSysMetadata, tmDcmtPreview, tmWF, tmDcmtTasks, isPreviewDisabled, isSysMetadataDisabled, isBoardDisabled, isWFDisabled, inputFile, isClosable, allTasks, DID, TID, isReadOnlyOriginCallback, metadataDcmtOrigin?.fromTID, handleRefreshFormMetadataAsync]);
|
|
1379
1488
|
// Retrieves the current document form setting based on the normalized TID
|
|
1380
1489
|
const getCurrentDcmtFormSetting = () => {
|
|
1381
1490
|
const settings = SDKUI_Globals.userSettings.dcmtFormSettings;
|
|
@@ -1443,7 +1552,7 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
|
|
|
1443
1552
|
for (const key of Object.keys(persistedState)) {
|
|
1444
1553
|
if (key === 'tmWF') {
|
|
1445
1554
|
// Hide tmWF
|
|
1446
|
-
newState[key] = { ...persistedState[key], visible: false };
|
|
1555
|
+
newState[key] = { ...persistedState[key], visible: false, width: '0%' };
|
|
1447
1556
|
}
|
|
1448
1557
|
else if (otherVisiblePanels.includes(key)) {
|
|
1449
1558
|
// Add extra width to visible panels
|
|
@@ -1470,6 +1579,8 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
|
|
|
1470
1579
|
const persistedState = invocationContext === InvocationContext.Todo ? settings?.layoutToDo : settings?.layout;
|
|
1471
1580
|
return persistedState?.['tmWF']?.visible ?? false;
|
|
1472
1581
|
};
|
|
1582
|
+
// Persisted tmWF visibility, read once at mount
|
|
1583
|
+
const persistedWFVisibleRef = useRef(getPersistedWFVisible());
|
|
1473
1584
|
const onBlogCommentFormCustomSave = useCallback(async (blogPost) => {
|
|
1474
1585
|
try {
|
|
1475
1586
|
if (!moreInfoTasks || moreInfoTasks.length === 0) {
|
|
@@ -1555,28 +1666,29 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
|
|
|
1555
1666
|
height: '100%',
|
|
1556
1667
|
position: 'relative',
|
|
1557
1668
|
overflow: 'hidden'
|
|
1558
|
-
}, children: [_jsxs("div", { style: { width: '100%', height: '100%', display: isOpenDetails || isOpenMaster ? 'none' : 'flex' }, children: [isNavigating && _jsx(Spinner, { description: SDKUI_Localizator.Loading, flat: false }), (fromDTD) &&
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1669
|
+
}, children: [_jsxs("div", { style: { width: '100%', height: '100%', display: isOpenDetails || isOpenMaster ? 'none' : 'flex' }, children: [isNavigating && _jsx(Spinner, { description: SDKUI_Localizator.Loading, flat: false }), (fromDTD) && _jsxs(TMLayoutContainer, { direction: 'vertical', children: [(groupId && groupId.length > 0)
|
|
1670
|
+
? _jsxs(_Fragment, { children: [_jsx(PanelDisabledStateHandler, { isWFDisabled: isWFDisabled, isSysMetadataDisabled: isSysMetadataDisabled, isBoardDisabled: isBoardDisabled, isDcmtTasksDisabled: isDcmtTasksDisabled, isPreviewDisabled: isPreviewDisabled }), _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", parentId: groupId, showToolbar: showDcmtFormSidebar })] })
|
|
1671
|
+
: _jsxs(TMPanelManagerWithPersistenceProvider, { panels: initialPanels, initialVisibility: allInitialPanelVisibility, defaultDimensions: defaultPanelDimensions, initialDimensions: defaultPanelDimensions, initialMobilePanelId: 'tmDcmtForm', isPersistenceEnabled: !isMobile && layoutMode !== LayoutModes.Ark ? hasSavedLayout() : false, persistPanelStates: !isMobile && layoutMode !== LayoutModes.Ark ? (state) => persistPanelStates(state) : undefined, persistedPanelStates: layoutMode !== LayoutModes.Ark ? getPersistedPanelStates() : undefined, children: [_jsx(PanelDisabledStateHandler, { isWFDisabled: isWFDisabled, isSysMetadataDisabled: isSysMetadataDisabled, isBoardDisabled: isBoardDisabled, isDcmtTasksDisabled: isDcmtTasksDisabled, isPreviewDisabled: isPreviewDisabled, persistedWFVisible: persistedWFVisibleRef.current }), _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", parentId: groupId, showToolbar: showDcmtFormSidebar })] }), isOpenDistinctValues &&
|
|
1672
|
+
_jsx(TMDistinctValues, { tid: TID, mid: focusedMetadataValue?.mid, isModal: true, showHeader: false, layoutMode: layoutMode, onClosePanelCallback: () => setIsOpenDistinctValues(false), onSelectionChanged: (e) => {
|
|
1673
|
+
if (!e)
|
|
1674
|
+
return;
|
|
1675
|
+
setFormData((prevItems) => prevItems.map((item) => item.tid == e.tid && item.mid === e.mid ? { ...item, value: e.newValue } : item));
|
|
1676
|
+
} }), isOpenFormulaEditor &&
|
|
1677
|
+
_jsx(TMFormulaEditor, { isModal: true, formMode: FormModes.Update, inputData: getFormula(), showBack: false, onClose: () => setIsOpenFormulaEditor(false), onApplied: (newFormula) => {
|
|
1678
|
+
setFormData((prevItems) => prevItems.map((item) => item.tid == newFormula.tid && item.mid === newFormula.mid ? { ...item, value: FormulaHelper.addFormulaTag(newFormula.expression), isSelected: true, isEditable: true } : item));
|
|
1679
|
+
setFocusedMetadataValue(prevState => ({
|
|
1680
|
+
...prevState,
|
|
1681
|
+
isSelected: true,
|
|
1682
|
+
isEditable: true,
|
|
1683
|
+
value: FormulaHelper.addFormulaTag(newFormula.expression)
|
|
1684
|
+
}));
|
|
1685
|
+
} }), (isModal && onClose) && _jsx("div", { id: "TMDcmtFormShowConfirmForClose-" + id })] }), _jsx(TMToppyDraggableHelpCenter, { isVisible: isToppyVisible, content: _jsx(TMDcmtFormActionButtons, { showToppyForApprove: showToppyForApprove, workItems: workItems, caseFlowWorkItems: showToppyForCaseFlow ? caseFlowWorkItems : [], onCompleteCaseFlowWorkItem: completeCaseFlowWorkItem, onRejectCaseFlowWorkItem: rejectCaseFlowWorkItem, deviceType: deviceType, isMobile: isMobile, handleSignApprove: handleSignApprove, updateShowApprovePopup: updateShowApprovePopup, updateShowRejectPopup: updateShowRejectPopup, updateShowReAssignPopup: updateShowReAssignPopup, updateShowMoreInfoPopup: updateShowMoreInfoPopup, fromDTD: fromDTD, showToppyForCompleteMoreInfo: showToppyForCompleteMoreInfo, moreInfoTasks: moreInfoTasks, setShowCommentForm: setShowCommentForm, showToppyForReferences: showToppyForReferences, dcmtReferences: dcmtReferences, referenceActionMap: referenceActionMap, handleNavigateToReference: handleNavigateToReference, setShowMoreInfoTaskPopup: setShowMoreInfoTaskPopup, setShowMoreInfoTaskTask: setShowMoreInfoTaskTask }) })] }), (showCommentForm && TID && DID) &&
|
|
1575
1686
|
_jsx(TMBlogCommentForm, { maxLength: 500, context: blogCommentFormContext, onClose: handleBlogCommentFormClose, onCustomSave: onBlogCommentFormCustomSave, participants: emptyParticipants, showAttachmentsSection: false, allArchivedDocumentsFileItems: emptyArchivedDocumentsFileItems })] }), renderDcmtOperations, renderFloatingBar] }));
|
|
1576
1687
|
};
|
|
1577
|
-
return (_jsxs("div", { style: { width: '100%', height: '100%' }, children: [(isModal && onClose)
|
|
1688
|
+
return (_jsxs("div", { style: (isModal && onClose) ? { width: 0, height: 0 } : { width: '100%', height: '100%' }, children: [(isModal && onClose)
|
|
1578
1689
|
? _jsx(TMModal, { title: titleModal, onClose: handleClose, width: widthModal ?? '100%', height: heightModal ?? '100%', hidePopup: false, askClosingConfirm: true, children: _jsx("div", { style: { width: "100%", height: "100%", display: 'block', padding: "4px", position: 'relative' }, children: renderDcmtForm() }) })
|
|
1579
|
-
: renderDcmtForm(), (showMoreInfoTaskPopup && showMoreInfoTaskTask && showMoreInfoTaskTask.id && handleNavigateToWGs && handleNavigateToDossiers && getAllTasks && deleteTaskByIdsCallback && addTaskCallback && editTaskCallback) && _jsx(TMTaskForm, { id: Number(showMoreInfoTaskTask.id), title: showMoreInfoTaskTask.name ?? 'N/A', formMode: FormModes.Update, onSaved: onSavedTaskFormCallback, editTaskCallback: editTaskCallback, onClose: () => { setShowMoreInfoTaskPopup(false); setShowMoreInfoTaskTask(undefined); }, onCancel: () => { setShowMoreInfoTaskPopup(false); setShowMoreInfoTaskTask(undefined); }, isModal: true, showBackButton: false, hasNavigation: false, width: taskModalSizes(deviceType, FormModes.Update).width, height: taskModalSizes(deviceType, FormModes.Update).height, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, visualizedTasks: [], currentTask: null, setCurrentTask: () => { }, selectedRowKeys: [], handleFocusedRowKeyChange: () => { }, onStatusChanged: () => { }, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback })
|
|
1690
|
+
: renderDcmtForm(), (showMoreInfoTaskPopup && showMoreInfoTaskTask && showMoreInfoTaskTask.id && handleNavigateToWGs && handleNavigateToDossiers && getAllTasks && deleteTaskByIdsCallback && addTaskCallback && editTaskCallback) && _jsx(TMTaskForm, { id: Number(showMoreInfoTaskTask.id), title: showMoreInfoTaskTask.name ?? 'N/A', formMode: FormModes.Update, onSaved: onSavedTaskFormCallback, editTaskCallback: editTaskCallback, onClose: () => { setShowMoreInfoTaskPopup(false); setShowMoreInfoTaskTask(undefined); }, onCancel: () => { setShowMoreInfoTaskPopup(false); setShowMoreInfoTaskTask(undefined); }, isModal: true, showBackButton: false, hasNavigation: false, width: taskModalSizes(deviceType, FormModes.Update).width, height: taskModalSizes(deviceType, FormModes.Update).height, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, visualizedTasks: [], currentTask: null, setCurrentTask: () => { }, selectedRowKeys: [], handleFocusedRowKeyChange: () => { }, onStatusChanged: () => { }, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback }), (showMultiDetailArchiveModal && fromDTD && multiDetailMasterDcmts.length > 0) &&
|
|
1691
|
+
_jsx(TMMultiMasterDetailDcmtsForm, { dtd: fromDTD, masterDcmt: multiDetailMasterDcmts[0], onClose: () => { setShowMultiDetailArchiveModal(false); setMultiDetailMasterDcmts([]); }, 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, fetchRemoteCertificates: fetchRemoteCertificates, onOpenS4TViewerRequest: onOpenS4TViewerRequest, onOpenPdfEditorRequest: onOpenPdfEditorRequest, onReferenceClick: onReferenceClick, onTaskCreateRequest: onTaskCreateRequest })] }));
|
|
1580
1692
|
};
|
|
1581
1693
|
export default TMDcmtForm;
|
|
1582
1694
|
/**
|
|
@@ -1619,6 +1731,8 @@ export const validateMetadataList = (mvdList = []) => {
|
|
|
1619
1731
|
if (isValidForValidation(mvd)) {
|
|
1620
1732
|
validateRequiredField(mvd, value, validationItems);
|
|
1621
1733
|
validateMaxLength(mvd, value, validationItems);
|
|
1734
|
+
validateCustomRegEx(mvd, value, validationItems);
|
|
1735
|
+
validateFormatRegEx(mvd, value, validationItems);
|
|
1622
1736
|
}
|
|
1623
1737
|
return validationItems;
|
|
1624
1738
|
}, []);
|
|
@@ -1641,8 +1755,59 @@ const validateMaxLength = (mvd, value, validationItems) => {
|
|
|
1641
1755
|
const isTextOrNumber = mvd.md?.dataType === MetadataDataTypes.Varchar || mvd.md?.dataType === MetadataDataTypes.Number;
|
|
1642
1756
|
const isFormula = FormulaHelper.isFormula(value);
|
|
1643
1757
|
if (isTextOrNumber && !isFormula && mvd.md?.length && value.replace(regex, '').length > maxLength) {
|
|
1644
|
-
const
|
|
1645
|
-
|
|
1758
|
+
const fieldName = mvd.md?.nameLoc ?? mvd.md?.name ?? SDKUI_Localizator.Field;
|
|
1759
|
+
const message = SDKUI_Localizator.MaxLengthExceeded.replaceParams(fieldName, maxLength);
|
|
1760
|
+
validationItems.push(new ValidationItem(ResultTypes.ERROR, fieldName, message));
|
|
1761
|
+
}
|
|
1762
|
+
};
|
|
1763
|
+
const validateCustomRegEx = (mvd, value, validationItems) => {
|
|
1764
|
+
const pattern = mvd.md?.format?.formatCustom;
|
|
1765
|
+
if (mvd.md?.format?.format !== MetadataFormats.CustomRegEx || !pattern)
|
|
1766
|
+
return;
|
|
1767
|
+
// Valore vuoto: ci pensa validateRequiredField; formule: non validabili con regex
|
|
1768
|
+
if (!value.trim() || FormulaHelper.isFormula(value))
|
|
1769
|
+
return;
|
|
1770
|
+
try {
|
|
1771
|
+
const regex = new RegExp(`^(?:${pattern})$`);
|
|
1772
|
+
if (!regex.test(value)) {
|
|
1773
|
+
const fieldName = mvd.md?.nameLoc ?? mvd.md?.name ?? SDKUI_Localizator.Field;
|
|
1774
|
+
const description = mvd.md?.description?.trim();
|
|
1775
|
+
const message = description ? description : SDKUI_Localizator.InvalidFormatValue;
|
|
1776
|
+
validationItems.push(new ValidationItem(ResultTypes.ERROR, fieldName, message));
|
|
1777
|
+
}
|
|
1778
|
+
}
|
|
1779
|
+
catch {
|
|
1780
|
+
// Pattern regex non valido: nessuna validazione, accetta qualsiasi valore
|
|
1781
|
+
}
|
|
1782
|
+
};
|
|
1783
|
+
// Regex predefinite per i formati standard (EMail, Partita IVA, Codice Fiscale)
|
|
1784
|
+
const FORMAT_REGEX_RULES = [
|
|
1785
|
+
{
|
|
1786
|
+
format: MetadataFormats.EMail,
|
|
1787
|
+
regex: /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/,
|
|
1788
|
+
message: (name) => SDKUI_Localizator.InvalidEmailAddress.replaceParams(name)
|
|
1789
|
+
},
|
|
1790
|
+
{
|
|
1791
|
+
format: MetadataFormats.PartitaIva,
|
|
1792
|
+
regex: /^[0-9]{11}$/,
|
|
1793
|
+
message: (name) => SDKUI_Localizator.InvalidVatNumber.replaceParams(name)
|
|
1794
|
+
},
|
|
1795
|
+
{
|
|
1796
|
+
// Persone fisiche (16 caratteri, incluse le lettere di omocodia) o soggetti giuridici (11 cifre)
|
|
1797
|
+
format: MetadataFormats.CodiceFiscale,
|
|
1798
|
+
regex: /^(?:[A-Z]{6}[0-9LMNPQRSTUV]{2}[ABCDEHLMPRST][0-9LMNPQRSTUV]{2}[A-Z][0-9LMNPQRSTUV]{3}[A-Z]|[0-9]{11})$/i,
|
|
1799
|
+
message: (name) => SDKUI_Localizator.InvalidTaxCode.replaceParams(name)
|
|
1800
|
+
}
|
|
1801
|
+
];
|
|
1802
|
+
const validateFormatRegEx = (mvd, value, validationItems) => {
|
|
1803
|
+
const rule = FORMAT_REGEX_RULES.find(r => r.format === mvd.md?.format?.format);
|
|
1804
|
+
if (!rule)
|
|
1805
|
+
return;
|
|
1806
|
+
// Valore vuoto: ci pensa validateRequiredField; formule: non validabili con regex
|
|
1807
|
+
if (!value.trim() || FormulaHelper.isFormula(value))
|
|
1808
|
+
return;
|
|
1809
|
+
if (!rule.regex.test(value)) {
|
|
1810
|
+
validationItems.push(new ValidationItem(ResultTypes.ERROR, mvd.md?.nameLoc ?? "", rule.message(mvd.md?.nameLoc ?? SDKUI_Localizator.Field)));
|
|
1646
1811
|
}
|
|
1647
1812
|
};
|
|
1648
1813
|
//#endregion Validation
|
|
@@ -1667,6 +1832,8 @@ const PanelDisabledStateHandler = ({ isWFDisabled, isSysMetadataDisabled, isBoar
|
|
|
1667
1832
|
setToolbarButtonDisabled('tmBlog', false);
|
|
1668
1833
|
}
|
|
1669
1834
|
}, [isBoardDisabled]);
|
|
1835
|
+
// Tracks whether tmWF has already been restored from the persisted state
|
|
1836
|
+
const didRestoreWF = useRef(false);
|
|
1670
1837
|
useEffect(() => {
|
|
1671
1838
|
if (isWFDisabled) {
|
|
1672
1839
|
setToolbarButtonDisabled('tmWF', true);
|
|
@@ -1675,7 +1842,8 @@ const PanelDisabledStateHandler = ({ isWFDisabled, isSysMetadataDisabled, isBoar
|
|
|
1675
1842
|
else {
|
|
1676
1843
|
setToolbarButtonDisabled('tmWF', false);
|
|
1677
1844
|
// Restore persisted visibility when WF becomes enabled
|
|
1678
|
-
if (persistedWFVisible) {
|
|
1845
|
+
if (persistedWFVisible && !didRestoreWF.current) {
|
|
1846
|
+
didRestoreWF.current = true;
|
|
1679
1847
|
setPanelVisibilityById('tmWF', true);
|
|
1680
1848
|
}
|
|
1681
1849
|
}
|