@topconsultnpm/sdkui-react 6.22.0-dev2.5 → 6.22.0-dev2.50

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.
Files changed (137) hide show
  1. package/lib/components/NewComponents/ContextMenu/TMContextMenu.js +1 -1
  2. package/lib/components/NewComponents/FloatingMenuBar/TMFloatingMenuBar.js +1 -1
  3. package/lib/components/base/TMDataGrid.d.ts +2 -0
  4. package/lib/components/base/TMDataGrid.js +260 -8
  5. package/lib/components/base/TMEditorBase.d.ts +2 -0
  6. package/lib/components/base/TMFileManager.js +5 -3
  7. package/lib/components/base/TMFileManagerDataGridView.js +11 -2
  8. package/lib/components/base/TMFileManagerThumbnailItems.js +19 -9
  9. package/lib/components/base/TMFileManagerUtils.d.ts +2 -0
  10. package/lib/components/base/TMFileManagerUtils.js +37 -1
  11. package/lib/components/base/TMModal.d.ts +11 -0
  12. package/lib/components/base/TMModal.js +47 -13
  13. package/lib/components/base/TMPanel.d.ts +6 -0
  14. package/lib/components/base/TMPanel.js +221 -108
  15. package/lib/components/base/TMPopUp.js +3 -0
  16. package/lib/components/base/TMTooltip.d.ts +2 -1
  17. package/lib/components/base/TMTooltip.js +24 -8
  18. package/lib/components/base/TMTreeView.js +108 -67
  19. package/lib/components/choosers/TMDcmtTypeChooser.js +4 -3
  20. package/lib/components/choosers/TMDistinctValues.d.ts +9 -7
  21. package/lib/components/choosers/TMDistinctValues.js +149 -142
  22. package/lib/components/choosers/TMMetadataChooser.js +1 -1
  23. package/lib/components/choosers/TMQuickSearchInfo.d.ts +12 -0
  24. package/lib/components/choosers/TMQuickSearchInfo.js +279 -0
  25. package/lib/components/choosers/TMQuickSearchSettingsForm.d.ts +16 -0
  26. package/lib/components/choosers/TMQuickSearchSettingsForm.js +94 -0
  27. package/lib/components/choosers/TMSelectedValuesSummary.d.ts +13 -0
  28. package/lib/components/choosers/TMSelectedValuesSummary.js +91 -0
  29. package/lib/components/editors/TMDropDown.d.ts +3 -0
  30. package/lib/components/editors/TMDropDown.js +197 -5
  31. package/lib/components/editors/TMMetadataEditor.d.ts +5 -1
  32. package/lib/components/editors/TMMetadataEditor.js +8 -3
  33. package/lib/components/editors/TMTextBox.js +2 -2
  34. package/lib/components/features/archive/TMArchive.js +17 -3
  35. package/lib/components/features/documents/TMBatchUpdateForm.js +19 -5
  36. package/lib/components/features/documents/TMDcmtBlog.d.ts +3 -0
  37. package/lib/components/features/documents/TMDcmtBlog.js +4 -4
  38. package/lib/components/features/documents/TMDcmtForm.d.ts +7 -0
  39. package/lib/components/features/documents/TMDcmtForm.js +151 -46
  40. package/lib/components/features/documents/TMDcmtFormActionButtons.d.ts +11 -0
  41. package/lib/components/features/documents/TMDcmtFormActionButtons.js +74 -7
  42. package/lib/components/features/documents/TMDcmtIcon.js +5 -3
  43. package/lib/components/features/documents/TMDcmtPreview.js +10 -6
  44. package/lib/components/features/documents/TMMasterDetailDcmts.js +95 -33
  45. package/lib/components/features/documents/TMMasterInfoFields.d.ts +19 -0
  46. package/lib/components/features/documents/TMMasterInfoFields.js +186 -0
  47. package/lib/components/features/documents/TMMergeToPdfForm.d.ts +1 -2
  48. package/lib/components/features/documents/TMMergeToPdfForm.js +30 -5
  49. package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.d.ts +45 -0
  50. package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.js +323 -0
  51. package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.d.ts +370 -0
  52. package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.js +283 -0
  53. package/lib/components/features/documents/TMRelationViewer.d.ts +14 -1
  54. package/lib/components/features/documents/TMRelationViewer.js +69 -20
  55. package/lib/components/features/search/TMSearch.js +77 -11
  56. package/lib/components/features/search/TMSearchQueryEditor.js +5 -3
  57. package/lib/components/features/search/TMSearchQueryPanel.d.ts +4 -0
  58. package/lib/components/features/search/TMSearchQueryPanel.js +141 -67
  59. package/lib/components/features/search/TMSearchResult.d.ts +16 -0
  60. package/lib/components/features/search/TMSearchResult.js +432 -109
  61. package/lib/components/features/search/TMTreeSelector.js +166 -130
  62. package/lib/components/features/workflow/TMWorkflowPopup.d.ts +10 -0
  63. package/lib/components/features/workflow/TMWorkflowPopup.js +8 -4
  64. package/lib/components/grids/TMBlogAttachments.js +13 -2
  65. package/lib/components/grids/TMBlogsPost.d.ts +2 -0
  66. package/lib/components/grids/TMBlogsPost.js +26 -3
  67. package/lib/components/grids/TMBlogsPostUtils.d.ts +1 -0
  68. package/lib/components/grids/TMBlogsPostUtils.js +14 -3
  69. package/lib/components/layout/panelManager/TMPanelManagerContainer.d.ts +1 -0
  70. package/lib/components/layout/panelManager/TMPanelManagerContainer.js +24 -14
  71. package/lib/components/layout/panelManager/TMPanelManagerContext.js +68 -93
  72. package/lib/components/layout/panelManager/TMPanelWrapper.js +2 -2
  73. package/lib/components/layout/panelManager/types.d.ts +3 -0
  74. package/lib/components/layout/panelManager/utils.js +13 -11
  75. package/lib/components/sidebar/TMHeader.js +30 -20
  76. package/lib/components/viewers/TMMidViewer.js +4 -1
  77. package/lib/components/viewers/TMTidViewer.js +83 -22
  78. package/lib/devextreme-license.d.ts +1 -0
  79. package/lib/devextreme-license.js +3 -0
  80. package/lib/helper/SDKUI_Globals.d.ts +110 -0
  81. package/lib/helper/SDKUI_Globals.js +151 -0
  82. package/lib/helper/SDKUI_Localizator.d.ts +42 -0
  83. package/lib/helper/SDKUI_Localizator.js +420 -0
  84. package/lib/helper/TMAppUpdatedModal.d.ts +1 -0
  85. package/lib/helper/TMAppUpdatedModal.js +134 -0
  86. package/lib/helper/TMIcons.d.ts +1 -0
  87. package/lib/helper/TMIcons.js +3 -0
  88. package/lib/helper/TMUtils.d.ts +7 -0
  89. package/lib/helper/TMUtils.js +15 -1
  90. package/lib/helper/dataGridSearchHelper.d.ts +28 -0
  91. package/lib/helper/dataGridSearchHelper.js +51 -0
  92. package/lib/helper/dcmtsHelper.d.ts +20 -0
  93. package/lib/helper/dcmtsHelper.js +58 -1
  94. package/lib/helper/helpers.d.ts +11 -0
  95. package/lib/helper/helpers.js +25 -1
  96. package/lib/helper/index.d.ts +2 -0
  97. package/lib/helper/index.js +2 -0
  98. package/lib/helper/queryHelper.d.ts +6 -1
  99. package/lib/helper/queryHelper.js +8 -3
  100. package/lib/hooks/tmDistinctValuesGridHelper.d.ts +16 -0
  101. package/lib/hooks/tmDistinctValuesGridHelper.js +31 -0
  102. package/lib/hooks/useArchiveListForm.d.ts +39 -0
  103. package/lib/hooks/useArchiveListForm.js +46 -0
  104. package/lib/hooks/useCaseFlowApprove.d.ts +56 -0
  105. package/lib/hooks/useCaseFlowApprove.js +157 -0
  106. package/lib/hooks/useDataUserIdItem.d.ts +1 -0
  107. package/lib/hooks/useDataUserIdItem.js +1 -0
  108. package/lib/hooks/useDocumentOperations.d.ts +4 -0
  109. package/lib/hooks/useDocumentOperations.js +50 -10
  110. package/lib/hooks/useMultiMasterDetailDcmts.d.ts +113 -0
  111. package/lib/hooks/useMultiMasterDetailDcmts.js +760 -0
  112. package/lib/hooks/useRelatedDocuments.d.ts +1 -0
  113. package/lib/hooks/useRelatedDocuments.js +22 -27
  114. package/lib/hooks/useShowDossiersV5.d.ts +12 -0
  115. package/lib/hooks/useShowDossiersV5.js +37 -0
  116. package/lib/hooks/useTMDistinctValuesMetadataDisplay.d.ts +18 -0
  117. package/lib/hooks/useTMDistinctValuesMetadataDisplay.js +103 -0
  118. package/lib/hooks/useTMDistinctValuesQuickSearch.d.ts +49 -0
  119. package/lib/hooks/useTMDistinctValuesQuickSearch.js +307 -0
  120. package/lib/hooks/useTMDistinctValuesSelection.d.ts +42 -0
  121. package/lib/hooks/useTMDistinctValuesSelection.js +103 -0
  122. package/lib/hooks/useTMDistinctValuesSource.d.ts +29 -0
  123. package/lib/hooks/useTMDistinctValuesSource.js +105 -0
  124. package/lib/index.d.ts +2 -0
  125. package/lib/index.js +5 -2
  126. package/lib/services/caseflow/CaseFlowService.d.ts +236 -0
  127. package/lib/services/caseflow/CaseFlowService.js +693 -0
  128. package/lib/services/caseflow/CaseFlowTemplateCacheService.d.ts +28 -0
  129. package/lib/services/caseflow/CaseFlowTemplateCacheService.js +121 -0
  130. package/lib/services/caseflow/caseFlowNameCache.d.ts +32 -0
  131. package/lib/services/caseflow/caseFlowNameCache.js +116 -0
  132. package/lib/services/caseflow/caseFlowWorkItemUtils.d.ts +61 -0
  133. package/lib/services/caseflow/caseFlowWorkItemUtils.js +113 -0
  134. package/lib/services/index.d.ts +4 -0
  135. package/lib/services/index.js +4 -0
  136. package/lib/services/platform_services.d.ts +1 -1
  137. package/package.json +9 -5
@@ -2,6 +2,7 @@ import React from 'react';
2
2
  import { DcmtTypeDescriptor, HomeBlogPost, LayoutModes, ObjectRef, SearchResultDescriptor, TaskDescriptor, ValidationItem } from '@topconsultnpm/sdk-ts';
3
3
  import { DcmtInfo, FormModes, MetadataValueDescriptorEx, TaskContext, IGraphometricManagerProp } from '../../../ts';
4
4
  import { IntesiCertificateData } from '../../../helper';
5
+ import { ArchiveListMode } from '../../../hooks/useArchiveListForm';
5
6
  /**
6
7
  * Definisce il contesto da cui è stato invocato il TMDcmtForm.
7
8
  * Permette di gestire logiche diverse in base alla provenienza.
@@ -77,6 +78,12 @@ interface ITMDcmtFormProps {
77
78
  mid: number;
78
79
  value: string;
79
80
  }>, tid?: number) => void;
81
+ /**
82
+ * Modalità "aggiungi a elenco" (es. archiviazione dettagli multipli): se valorizzata, in layout di archiviazione
83
+ * il form non archivia ma emette i metadati compilati al chiamante (pulsanti "Aggiungi"/"Modifica" + "Pulisci").
84
+ * Tutta la logica è incapsulata in useArchiveListForm; usata solo da TMMultiMasterDetailDcmts.
85
+ */
86
+ archiveListMode?: ArchiveListMode;
80
87
  fetchRemoteCertificates?: (email: string) => Promise<IntesiCertificateData[]>;
81
88
  datagridUtility?: {
82
89
  onRefreshSearchAsyncDatagrid?: () => Promise<void>;
@@ -5,7 +5,7 @@ import { AccessLevelsEx, AppModules, ArchiveConstraints, ArchiveEngineByID, Dcmt
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 } 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';
@@ -26,6 +26,7 @@ import { useTMPanelManagerContext } from '../../layout/panelManager/TMPanelManag
26
26
  import TMPanelManagerContainer from '../../layout/panelManager/TMPanelManagerContainer';
27
27
  import { TMPanelManagerWithPersistenceProvider } from '../../layout/panelManager/TMPanelManagerWithPersistenceProvider';
28
28
  import { useWorkflowApprove } from '../../../hooks/useWorkflowApprove';
29
+ import { useCaseFlowApprove } from '../../../hooks/useCaseFlowApprove';
29
30
  import TMBlogCommentForm from '../blog/TMBlogCommentForm';
30
31
  import WFDiagram from '../workflow/diagram/WFDiagram';
31
32
  import TMTooltip from '../../base/TMTooltip';
@@ -39,6 +40,8 @@ import TMToppyDraggableHelpCenter from '../assistant/TMToppyDraggableHelpCenter'
39
40
  import TMTaskForm from '../tasks/TMTaskForm';
40
41
  import { useDocumentOperations } from '../../../hooks/useDocumentOperations';
41
42
  import TMDcmtFormActionButtons from './TMDcmtFormActionButtons';
43
+ import { useArchiveListForm } from '../../../hooks/useArchiveListForm';
44
+ import TMMultiMasterDetailDcmtsForm from './TMMultiMasterDetailDcmtsForm';
42
45
  //#region Interfaces, Types and Enums
43
46
  /**
44
47
  * Definisce il contesto da cui è stato invocato il TMDcmtForm.
@@ -57,7 +60,7 @@ export var InvocationContext;
57
60
  let abortControllerLocal = new AbortController();
58
61
  ;
59
62
  //#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 }) => {
63
+ 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
64
  const { onRefreshSearchAsyncDatagrid, onRefreshBlogDatagrid, onRefreshPreviewDatagrid } = datagridUtility || {};
62
65
  const floatingBarContainerRef = useRef(null);
63
66
  const [id, setID] = useState('');
@@ -96,6 +99,10 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
96
99
  const [isOpenFormulaEditor, setIsOpenFormulaEditor] = useState(false);
97
100
  const [currentTIDHasDetailRelations, setCurrentTIDHasDetailRelations] = useState();
98
101
  const [currentTIDHasMasterRelations, setCurrentTIDHasMasterRelations] = useState();
102
+ // Modale "Archivia documenti di dettaglio multipli" aperto dall'azione secondaria del form di archiviazione:
103
+ // dopo aver archiviato il master si apre il modale con il master appena archiviato come documento di partenza.
104
+ const [showMultiDetailArchiveModal, setShowMultiDetailArchiveModal] = useState(false);
105
+ const [multiDetailMasterDcmts, setMultiDetailMasterDcmts] = useState([]);
99
106
  const [currentDcmt, setCurrentDcmt] = useState();
100
107
  const [dcmtFile, setDcmtFile] = useState(null);
101
108
  const [focusedMetadataValue, setFocusedMetadataValue] = useState();
@@ -116,6 +123,10 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
116
123
  const [wfError, setWfError] = useState(null);
117
124
  const [metadataDcmtOrigin, setMetadataDcmtOrigin] = useState(null);
118
125
  const { workflowApproveData, getWorkItemsByDID } = useWorkflowApprove();
126
+ // Attività delle PRATICHE (CaseFlow) su questo documento. Come per il workflow
127
+ // la scoperta avviene QUI: da qualunque punto si apra il form, l'utente trova
128
+ // le sue azioni nel Toppy.
129
+ const { caseFlowWorkItems, completeCaseFlowWorkItem, rejectCaseFlowWorkItem } = useCaseFlowApprove(TID, DID);
119
130
  // Get the current device type (e.g., mobile, tablet, desktop) using a custom hook.
120
131
  const deviceType = useDeviceType();
121
132
  // This avoids unnecessary re-renders by only recalculating when deviceType changes.
@@ -450,7 +461,7 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
450
461
  openTaskFormHandler,
451
462
  },
452
463
  });
453
- const { handleSignApprove, checkoutInfo: { showCicoWaitPanel, cicoWaitPanelTitle, showCicoPrimaryProgress, cicoPrimaryProgressText, cicoPrimaryProgressValue, cicoPrimaryProgressMax, }, dcmtOperations: { abortController, showWaitPanel, showPrimary, waitPanelTitle, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, }, relatedDocumentsInfo: { isOpenDetails, isOpenMaster, checkRelatedDcmtsArchiveCapability, checkManyToManyCapability, }, toppyOperations: { updateShowApprovePopup, updateShowRejectPopup, updateShowReAssignPopup, updateShowMoreInfoPopup } } = features;
464
+ const { handleSignApprove, checkoutInfo: { showCicoWaitPanel, cicoWaitPanelTitle, showCicoPrimaryProgress, cicoPrimaryProgressText, cicoPrimaryProgressValue, cicoPrimaryProgressMax, }, dcmtOperations: { abortController, showWaitPanel, showPrimary, waitPanelTitle, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, }, relatedDocumentsInfo: { isOpenDetails, isOpenMaster, canArchiveDetailRelation, checkRelatedDcmtsArchiveCapability, checkManyToManyCapability, }, toppyOperations: { updateShowApprovePopup, updateShowRejectPopup, updateShowReAssignPopup, updateShowMoreInfoPopup } } = features;
454
465
  useEffect(() => {
455
466
  const fetchAllUsers = async () => {
456
467
  const users = await UserListCacheService.GetAllAsync();
@@ -804,11 +815,91 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
804
815
  // Verifica che ci siano riferimenti renderizzabili (solo Dossier o WorkingGroup)
805
816
  return dcmtReferences.some(ref => ref.objClass === ObjectClasses.Dossier || ref.objClass === ObjectClasses.WorkingGroup);
806
817
  }, [allowButtonsRefs, layoutMode, dcmtReferences, isOpenDetails, isOpenMaster]);
807
- const isToppyVisible = useMemo(() => Boolean((showToppyForApprove || showToppyForCompleteMoreInfo || showToppyForReferences) && !openS4TViewer && !showTodoDcmtForm && !editPdfForm), [showToppyForApprove, showToppyForCompleteMoreInfo, showToppyForReferences, openS4TViewer, showTodoDcmtForm, editPdfForm]);
808
- const isModified = useMemo(() => calcIsModified(formData, formDataOrig), [formData, formDataOrig]);
818
+ // Attività di pratica: stesse condizioni dell'approvazione workflow (documento
819
+ // in consultazione, senza errori, non dentro master/detail).
820
+ const showToppyForCaseFlow = useMemo(() => layoutMode === LayoutModes.Update && !fetchError && caseFlowWorkItems.length > 0 && !isOpenDetails && !isOpenMaster, [layoutMode, fetchError, caseFlowWorkItems.length, isOpenDetails, isOpenMaster]);
821
+ const isToppyVisible = useMemo(() => Boolean((showToppyForApprove || showToppyForCompleteMoreInfo || showToppyForReferences || showToppyForCaseFlow) && !openS4TViewer && !showTodoDcmtForm && !editPdfForm), [showToppyForApprove, showToppyForCompleteMoreInfo, showToppyForReferences, showToppyForCaseFlow, openS4TViewer, showTodoDcmtForm, editPdfForm]);
822
+ const handleClearForm = useCallback(() => {
823
+ let data = structuredClone(formData);
824
+ if (!data || data.length === 0)
825
+ return;
826
+ for (let md of data) {
827
+ if (!md.mid)
828
+ continue;
829
+ if (md.mid > 99) {
830
+ const defaultValue = md.md?.defaultValue;
831
+ if (defaultValue) {
832
+ if (FormulaHelper.isFormula(defaultValue)) {
833
+ md.value = undefined;
834
+ }
835
+ else {
836
+ md.value = defaultValue;
837
+ }
838
+ }
839
+ else if (formDataOrig.find(metadata => metadata.mid === md.mid)?.value === undefined) {
840
+ if (md.value)
841
+ md.value = undefined;
842
+ }
843
+ else if (md.value && md.value.length > 0) {
844
+ md.value = '';
845
+ }
846
+ }
847
+ }
848
+ setFormData(data);
849
+ }, [formData, formDataOrig]);
850
+ // Modalità "aggiungi a elenco" (archiviazione dettagli multipli): tutta la logica specifica è nell'hook.
851
+ const archiveList = useArchiveListForm({
852
+ mode: archiveListMode,
853
+ editingRowValues: inputMids,
854
+ formDataOrig,
855
+ formDataRef,
856
+ dcmtFileRef,
857
+ tid: TID,
858
+ isModal,
859
+ id,
860
+ clearForm: handleClearForm,
861
+ });
862
+ const isModified = useMemo(() => calcIsModified(formData, archiveList.referenceValues), [formData, archiveList.referenceValues]);
809
863
  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]);
864
+ _jsx(ContextMenu, { items: operationItems, trigger: "left", children: _jsx(IconMenuVertical, { color: 'white', cursor: 'pointer' }) }), layoutMode === LayoutModes.Ark && !archiveList.enabled &&
865
+ _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]);
866
+ // Ricarica del pannello metadati: invalida le cache del tipo documento e del layout, così la
867
+ // definizione dei metadati e la disposizione del form vengono rilette dal server, poi ricostruisce il form
868
+ const reloadFormMetadataAsync = useCallback(async () => {
869
+ if (!TID)
870
+ return;
871
+ // refreshCache invalida la voce in cache e rilegge il tipo documento con i metadati:
872
+ // la GetWithNotGrantedAsync della load successiva trova quella appena aggiornata
873
+ await DcmtTypeListCacheService.GetAsync(TID, true, undefined, false, true);
874
+ LayoutCacheService.Remove(TID, layoutMode);
875
+ if (layoutMode === LayoutModes.Update)
876
+ LayoutCacheService.Remove(TID, LayoutModes.None);
877
+ await loadDocumentFormDataAsync();
878
+ }, [TID, layoutMode, loadDocumentFormDataAsync]);
879
+ // Il ricaricamento ricostruisce il form: con valori inseriti e non salvati chiede prima conferma.
880
+ // In archiviazione la ricostruzione sgancia anche il file, quindi va confermata pure in quel caso.
881
+ const handleRefreshFormMetadataAsync = useCallback(async () => {
882
+ const hasPendingChanges = isModified || (layoutMode === LayoutModes.Ark && !!dcmtFile);
883
+ if (!hasPendingChanges) {
884
+ await reloadFormMetadataAsync();
885
+ return;
886
+ }
887
+ const isConfirmed = await new Promise(resolve => {
888
+ let isAnswered = false;
889
+ TMMessageBoxManager.show({
890
+ parentId: isModal ? "TMDcmtFormShowConfirmForClose-" + id : undefined,
891
+ title: SDKUI_Localizator.Refresh,
892
+ message: SDKUI_Localizator.ConfirmOnCancel,
893
+ buttons: [ButtonNames.YES, ButtonNames.NO],
894
+ onButtonClick: (e) => { isAnswered = true; resolve(e === ButtonNames.YES); },
895
+ // Chiusura dalla X: senza questa la Promise non si risolverebbe e il loader resterebbe acceso
896
+ onClose: () => { if (!isAnswered)
897
+ resolve(false); }
898
+ });
899
+ });
900
+ if (isConfirmed)
901
+ await reloadFormMetadataAsync();
902
+ }, [isModified, layoutMode, dcmtFile, isModal, id, reloadFormMetadataAsync]);
812
903
  const handleUndo = useCallback(() => {
813
904
  setFormData(structuredClone(formDataOrig));
814
905
  }, [formDataOrig]);
@@ -964,9 +1055,13 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
964
1055
  const isDuplication = layoutMode === LayoutModes.Ark && DID;
965
1056
  if (isDuplication)
966
1057
  onClose?.();
1058
+ // Ritorna il DID del documento appena archiviato, così il chiamante può proseguire
1059
+ // (es. aprire il modale di archiviazione dei documenti di dettaglio sul master appena creato).
1060
+ return newDID;
967
1061
  }
968
1062
  catch (err) {
969
1063
  TMExceptionBoxManager.show({ exception: err });
1064
+ return undefined;
970
1065
  }
971
1066
  finally {
972
1067
  setShowWaitPanelLocal(false);
@@ -985,34 +1080,24 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
985
1080
  },
986
1081
  });
987
1082
  }, [isModal, id, layoutMode, handleSave, handleArchiveCompleted]);
988
- const handleClearForm = useCallback(() => {
989
- let data = structuredClone(formData);
990
- if (!data || data.length === 0)
991
- return;
992
- for (let md of data) {
993
- if (!md.mid)
994
- continue;
995
- if (md.mid > 99) {
996
- const defaultValue = md.md?.defaultValue;
997
- if (defaultValue) {
998
- if (FormulaHelper.isFormula(defaultValue)) {
999
- md.value = undefined;
1000
- }
1001
- else {
1002
- md.value = defaultValue;
1003
- }
1004
- }
1005
- else if (formDataOrig.find(metadata => metadata.mid === md.mid)?.value === undefined) {
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]);
1083
+ // Azione secondaria del form di archiviazione: archivia il master e, subito dopo,
1084
+ // apre il modale di archiviazione dei documenti di dettaglio multipli usando il master appena creato.
1085
+ const handleArchiveMasterAndDetails = useCallback(async () => {
1086
+ TMMessageBoxManager.show({
1087
+ parentId: isModal ? "TMDcmtFormShowConfirmForClose-" + id : undefined,
1088
+ buttons: [ButtonNames.YES, ButtonNames.NO],
1089
+ message: SDKUI_Localizator.ArchiveMasterAndDetails_Confirm,
1090
+ onButtonClick: async (e) => {
1091
+ if (e !== ButtonNames.YES)
1092
+ return;
1093
+ const newDID = await handleArchiveCompleted();
1094
+ if (newDID === undefined || newDID === null)
1095
+ return;
1096
+ setMultiDetailMasterDcmts([{ TID: TID, DID: newDID }]);
1097
+ setShowMultiDetailArchiveModal(true);
1098
+ },
1099
+ });
1100
+ }, [isModal, id, handleArchiveCompleted, TID]);
1016
1101
  const clearFormBtnDisabled = useMemo(() => formData.filter(md => md.mid && md.value && md.mid > 99 && md.value.length > 0).length > 0, [formData]);
1017
1102
  const archiveBtnDisabled = useMemo(() => layoutMode === LayoutModes.Update || (fromDTD?.archiveConstraint === ArchiveConstraints.ContentCompulsory && !dcmtFile) || validationItems.length > 0, [layoutMode, fromDTD?.archiveConstraint, dcmtFile, validationItems.length]);
1018
1103
  const undoBtnDisabled = useMemo(() => layoutMode === LayoutModes.Update || !isModified, [layoutMode, isModified]);
@@ -1021,10 +1106,14 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
1021
1106
  const metadataValuesSource = useMemo(() => {
1022
1107
  return applyMetadataFilter(formData, showAll, listMaxItems, TID);
1023
1108
  }, [showAll, formData, listMaxItems, TID]);
1024
- const metadataValuesSourceOrig = useMemo(() => {
1025
- return applyMetadataFilter(formDataOrig, showAll, listMaxItems, TID);
1026
- }, [showAll, formDataOrig, listMaxItems, TID]);
1109
+ const metadataValuesSourceOrig = useMemo(() =>
1110
+ // I valori di riferimento (in modifica riga includono i valori già caricati) li calcola l'hook:
1111
+ // così i campi pre-compilati non si colorano di giallo finché l'utente non li cambia davvero.
1112
+ applyMetadataFilter(archiveList.referenceValues, showAll, listMaxItems, TID), [showAll, archiveList.referenceValues, listMaxItems, TID]);
1027
1113
  const handleClose = useCallback(() => {
1114
+ // Modalità "aggiungi a elenco": la X non archivia ma aggiorna l'elenco (gestita dall'hook).
1115
+ if (archiveList.requestClose(isModified, onClose))
1116
+ return;
1028
1117
  if (!isModified) {
1029
1118
  onClose?.();
1030
1119
  return;
@@ -1045,7 +1134,7 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
1045
1134
  }
1046
1135
  }
1047
1136
  });
1048
- }, [isModified, onClose, isModal, id, handleSave]);
1137
+ }, [isModified, onClose, isModal, id, handleSave, archiveList]);
1049
1138
  const getFormula = useCallback(() => {
1050
1139
  let fd = new FormulaDescriptor();
1051
1140
  fd.expression = FormulaHelper.isFormula(focusedMetadataValue?.value) ? FormulaHelper.removeFormulaTag(focusedMetadataValue?.value) : undefined;
@@ -1118,7 +1207,14 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
1118
1207
  break;
1119
1208
  }
1120
1209
  } }), _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
- _jsxs(_Fragment, { children: [_jsx(TMButton, { disabled: archiveBtnDisabled, btnStyle: 'advanced', icon: _jsx(IconBoxArchiveIn, {}), width: 'auto', showTooltip: false, caption: SDKUI_Localizator.Archive, advancedColor: TMColors.success, onClick: handleConfirmAction }), _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 &&
1210
+ archiveList.enabled ?
1211
+ _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 })] }) :
1212
+ _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 ? [{
1213
+ name: SDKUI_Localizator.ArchiveMasterAndMultipleDetailDocuments,
1214
+ icon: _jsx(IconArchiveMultipleDetailDocuments, {}),
1215
+ disabled: archiveBtnDisabled,
1216
+ onClick: handleArchiveMasterAndDetails,
1217
+ }] : 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
1218
  !isApprView &&
1123
1219
  TID !== SystemTIDs.Drafts &&
1124
1220
  !shouldShowAll &&
@@ -1149,6 +1245,8 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
1149
1245
  handleConfirmAction,
1150
1246
  handleUndo,
1151
1247
  handleClearForm,
1248
+ canArchiveDetailRelation,
1249
+ handleArchiveMasterAndDetails,
1152
1250
  isReadOnlyOriginCallback,
1153
1251
  metadataDcmtOrigin?.fromTID,
1154
1252
  ]);
@@ -1286,6 +1384,7 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
1286
1384
  allowMaximize: !isMobile,
1287
1385
  onBack: getOnBackHandler(true),
1288
1386
  onClose: isClosable ? () => { } : undefined,
1387
+ onRefresh: handleRefreshFormMetadataAsync,
1289
1388
  toolbar: allowNavigation ? formToolbar : _jsx(_Fragment, {})
1290
1389
  },
1291
1390
  },
@@ -1375,7 +1474,7 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
1375
1474
  },
1376
1475
  ];
1377
1476
  return panels;
1378
- }, [fromDTD, showBackButton, tmDcmtForm, tmBlog, tmSysMetadata, tmDcmtPreview, tmWF, tmDcmtTasks, isPreviewDisabled, isSysMetadataDisabled, isBoardDisabled, isWFDisabled, inputFile, isClosable, allTasks, DID, TID, isReadOnlyOriginCallback, metadataDcmtOrigin?.fromTID]);
1477
+ }, [fromDTD, showBackButton, tmDcmtForm, tmBlog, tmSysMetadata, tmDcmtPreview, tmWF, tmDcmtTasks, isPreviewDisabled, isSysMetadataDisabled, isBoardDisabled, isWFDisabled, inputFile, isClosable, allTasks, DID, TID, isReadOnlyOriginCallback, metadataDcmtOrigin?.fromTID, handleRefreshFormMetadataAsync]);
1379
1478
  // Retrieves the current document form setting based on the normalized TID
1380
1479
  const getCurrentDcmtFormSetting = () => {
1381
1480
  const settings = SDKUI_Globals.userSettings.dcmtFormSettings;
@@ -1443,7 +1542,7 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
1443
1542
  for (const key of Object.keys(persistedState)) {
1444
1543
  if (key === 'tmWF') {
1445
1544
  // Hide tmWF
1446
- newState[key] = { ...persistedState[key], visible: false };
1545
+ newState[key] = { ...persistedState[key], visible: false, width: '0%' };
1447
1546
  }
1448
1547
  else if (otherVisiblePanels.includes(key)) {
1449
1548
  // Add extra width to visible panels
@@ -1470,6 +1569,8 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
1470
1569
  const persistedState = invocationContext === InvocationContext.Todo ? settings?.layoutToDo : settings?.layout;
1471
1570
  return persistedState?.['tmWF']?.visible ?? false;
1472
1571
  };
1572
+ // Persisted tmWF visibility, read once at mount
1573
+ const persistedWFVisibleRef = useRef(getPersistedWFVisible());
1473
1574
  const onBlogCommentFormCustomSave = useCallback(async (blogPost) => {
1474
1575
  try {
1475
1576
  if (!moreInfoTasks || moreInfoTasks.length === 0) {
@@ -1557,7 +1658,7 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
1557
1658
  overflow: 'hidden'
1558
1659
  }, children: [_jsxs("div", { style: { width: '100%', height: '100%', display: isOpenDetails || isOpenMaster ? 'none' : 'flex' }, children: [isNavigating && _jsx(Spinner, { description: SDKUI_Localizator.Loading, flat: false }), (fromDTD) && _jsx(TMLayoutWaitingContainer, { direction: 'vertical', showWaitPanel: useWaitPanelLocalState ? showWaitPanelLocal : showWaitPanel, showWaitPanelPrimary: useWaitPanelLocalState ? showPrimaryLocal : showPrimary, showWaitPanelSecondary: useWaitPanelLocalState ? showSecondaryLocal : showSecondary, waitPanelTitle: useWaitPanelLocalState ? waitPanelTitleLocal : waitPanelTitle, waitPanelTextPrimary: useWaitPanelLocalState ? waitPanelTextPrimaryLocal : waitPanelTextPrimary, waitPanelValuePrimary: useWaitPanelLocalState ? waitPanelValuePrimaryLocal : waitPanelValuePrimary, waitPanelMaxValuePrimary: useWaitPanelLocalState ? waitPanelMaxValuePrimaryLocal : waitPanelMaxValuePrimary, waitPanelTextSecondary: useWaitPanelLocalState ? waitPanelTextSecondaryLocal : waitPanelTextSecondary, waitPanelValueSecondary: useWaitPanelLocalState ? waitPanelValueSecondaryLocal : waitPanelValueSecondary, waitPanelMaxValueSecondary: useWaitPanelLocalState ? waitPanelMaxValueSecondaryLocal : waitPanelMaxValueSecondary, isCancelable: useWaitPanelLocalState ? dcmtFile ? dcmtFile.size >= 1000000 : false : true, abortController: useWaitPanelLocalState ? abortControllerLocal : abortController, children: _jsxs(TMLayoutWaitingContainer, { direction: 'vertical', showWaitPanel: showCicoWaitPanel, showWaitPanelPrimary: showCicoPrimaryProgress, waitPanelTitle: cicoWaitPanelTitle, waitPanelTextPrimary: cicoPrimaryProgressText, waitPanelValuePrimary: cicoPrimaryProgressValue, waitPanelMaxValuePrimary: cicoPrimaryProgressMax, isCancelable: true, abortController: abortControllerLocal, children: [(groupId && groupId.length > 0)
1559
1660
  ? _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 })] })
1560
- : _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: getPersistedWFVisible() }), _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", parentId: groupId, showToolbar: showDcmtFormSidebar })] }), isOpenDistinctValues &&
1661
+ : _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 &&
1561
1662
  _jsx(TMDistinctValues, { tid: TID, mid: focusedMetadataValue?.mid, isModal: true, showHeader: false, layoutMode: layoutMode, onClosePanelCallback: () => setIsOpenDistinctValues(false), onSelectionChanged: (e) => {
1562
1663
  if (!e)
1563
1664
  return;
@@ -1571,12 +1672,13 @@ const TMDcmtForm = ({ TID, DID, groupId, layoutMode = LayoutModes.Update, formMo
1571
1672
  isEditable: true,
1572
1673
  value: FormulaHelper.addFormulaTag(newFormula.expression)
1573
1674
  }));
1574
- } }), (isModal && onClose) && _jsx("div", { id: "TMDcmtFormShowConfirmForClose-" + id })] }) }), _jsx(TMToppyDraggableHelpCenter, { isVisible: isToppyVisible, content: _jsx(TMDcmtFormActionButtons, { showToppyForApprove: showToppyForApprove, workItems: workItems, 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) &&
1675
+ } }), (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
1676
  _jsx(TMBlogCommentForm, { maxLength: 500, context: blogCommentFormContext, onClose: handleBlogCommentFormClose, onCustomSave: onBlogCommentFormCustomSave, participants: emptyParticipants, showAttachmentsSection: false, allArchivedDocumentsFileItems: emptyArchivedDocumentsFileItems })] }), renderDcmtOperations, renderFloatingBar] }));
1576
1677
  };
1577
1678
  return (_jsxs("div", { style: { width: '100%', height: '100%' }, children: [(isModal && onClose)
1578
1679
  ? _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 })] }));
1680
+ : 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) &&
1681
+ _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
1682
  };
1581
1683
  export default TMDcmtForm;
1582
1684
  /**
@@ -1719,6 +1821,8 @@ const PanelDisabledStateHandler = ({ isWFDisabled, isSysMetadataDisabled, isBoar
1719
1821
  setToolbarButtonDisabled('tmBlog', false);
1720
1822
  }
1721
1823
  }, [isBoardDisabled]);
1824
+ // Tracks whether tmWF has already been restored from the persisted state
1825
+ const didRestoreWF = useRef(false);
1722
1826
  useEffect(() => {
1723
1827
  if (isWFDisabled) {
1724
1828
  setToolbarButtonDisabled('tmWF', true);
@@ -1727,7 +1831,8 @@ const PanelDisabledStateHandler = ({ isWFDisabled, isSysMetadataDisabled, isBoar
1727
1831
  else {
1728
1832
  setToolbarButtonDisabled('tmWF', false);
1729
1833
  // Restore persisted visibility when WF becomes enabled
1730
- if (persistedWFVisible) {
1834
+ if (persistedWFVisible && !didRestoreWF.current) {
1835
+ didRestoreWF.current = true;
1731
1836
  setPanelVisibilityById('tmWF', true);
1732
1837
  }
1733
1838
  }
@@ -2,9 +2,20 @@ import React from "react";
2
2
  import { DcmtTypeDescriptor, TaskDescriptor, ObjectRef } from "@topconsultnpm/sdk-ts";
3
3
  import { IWorkItemData } from "../../../ts";
4
4
  import { DeviceType } from "../../base/TMDeviceProvider";
5
+ import { CaseFlowDcmtWorkItem } from "../../../hooks/useCaseFlowApprove";
5
6
  interface TMDcmtFormActionButtonsProps {
6
7
  showToppyForApprove: boolean;
7
8
  workItems: Array<IWorkItemData>;
9
+ /** Attività delle PRATICHE (CaseFlow) pendenti su QUESTO documento. */
10
+ caseFlowWorkItems?: Array<CaseFlowDcmtWorkItem>;
11
+ /**
12
+ * Completa l'attività di pratica. NON usato per la FIRMA: là si apre il viewer
13
+ * di firma ed è quello, a firma riuscita, a completare — esattamente come per
14
+ * i work item del workflow.
15
+ */
16
+ onCompleteCaseFlowWorkItem?: (item: CaseFlowDcmtWorkItem, comment?: string) => Promise<void>;
17
+ /** Rifiuta l'attività di pratica con un motivo. */
18
+ onRejectCaseFlowWorkItem?: (item: CaseFlowDcmtWorkItem, reason: string) => Promise<void>;
8
19
  deviceType: DeviceType | undefined;
9
20
  isMobile: boolean;
10
21
  handleSignApprove: () => void;
@@ -1,18 +1,34 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useCallback, useMemo, useRef, useState } from "react";
3
3
  import { ObjectClasses, SDK_Globals } from "@topconsultnpm/sdk-ts";
4
- import { TASK_MORE_INFO_PREFIX_NAME, SDKUI_Localizator, PDGS_COLORS, calcResponsiveSizes } from "../../../helper";
4
+ import { TASK_MORE_INFO_PREFIX_NAME, SDKUI_Localizator, PDGS_COLORS, calcResponsiveSizes, isSign4TopEnabled } from "../../../helper";
5
5
  import { TMColors } from "../../../utils/theme";
6
6
  import { StyledReferenceButton } from "../../base/Styled";
7
7
  import TMButton from "../../base/TMButton";
8
8
  import TMModal from "../../base/TMModal";
9
9
  import TMTooltip from "../../base/TMTooltip";
10
10
  import { WorkFlowOperationButtons } from "../workflow/TMWorkflowPopup";
11
+ import { getWorkItemActionName, isSignatureWorkItem } from "../../../services/caseflow/caseFlowWorkItemUtils";
11
12
  const TMDcmtFormActionButtons = (props) => {
12
- const { showToppyForApprove, workItems, deviceType, isMobile, handleSignApprove, updateShowApprovePopup, updateShowRejectPopup, updateShowReAssignPopup, updateShowMoreInfoPopup, fromDTD, showToppyForCompleteMoreInfo, moreInfoTasks, setShowCommentForm, showToppyForReferences, dcmtReferences, referenceActionMap, handleNavigateToReference, setShowMoreInfoTaskPopup, setShowMoreInfoTaskTask } = props;
13
+ const { showToppyForApprove, workItems, caseFlowWorkItems, onCompleteCaseFlowWorkItem, onRejectCaseFlowWorkItem, deviceType, isMobile, handleSignApprove, updateShowApprovePopup, updateShowRejectPopup, updateShowReAssignPopup, updateShowMoreInfoPopup, fromDTD, showToppyForCompleteMoreInfo, moreInfoTasks, setShowCommentForm, showToppyForReferences, dcmtReferences, referenceActionMap, handleNavigateToReference, setShowMoreInfoTaskPopup, setShowMoreInfoTaskTask } = props;
13
14
  const [showAllMoreInfoModal, setShowAllMoreInfoModal] = useState(false);
14
15
  const [showAllDossiersModal, setShowAllDossiersModal] = useState(false);
15
16
  const [showAllWorkingGroupsModal, setShowAllWorkingGroupsModal] = useState(false);
17
+ // Rifiuto di un'attività di pratica: il motivo è obbligatorio, quindi si passa
18
+ // da un dialogo. `busyItemId` disabilita i pulsanti dell'attività in corso.
19
+ const [rejectingItem, setRejectingItem] = useState(null);
20
+ const [rejectReason, setRejectReason] = useState('');
21
+ const [busyItemId, setBusyItemId] = useState(null);
22
+ const cfItems = useMemo(() => caseFlowWorkItems ?? [], [caseFlowWorkItems]);
23
+ const runCaseFlowAction = useCallback(async (item, action) => {
24
+ setBusyItemId(item.workItem.id ?? null);
25
+ try {
26
+ await action();
27
+ }
28
+ finally {
29
+ setBusyItemId(null);
30
+ }
31
+ }, []);
16
32
  const tasksNumber = useMemo(() => moreInfoTasks?.length ?? 0, [moreInfoTasks]);
17
33
  const firstTask = useMemo(() => {
18
34
  if (!moreInfoTasks || moreInfoTasks.length === 0)
@@ -31,19 +47,63 @@ const TMDcmtFormActionButtons = (props) => {
31
47
  return false;
32
48
  return true;
33
49
  }, [firstTask]);
34
- const { hasMoreInfo, hasApprove, hasReferences } = useMemo(() => {
50
+ const { hasMoreInfo, hasApprove, hasReferences, hasCaseFlow } = useMemo(() => {
35
51
  const referencesExist = showToppyForReferences && dcmtReferences?.some(ref => ref.objClass === ObjectClasses.Dossier || ref.objClass === ObjectClasses.WorkingGroup);
36
52
  return {
37
53
  hasMoreInfo: Boolean(showToppyForCompleteMoreInfo),
38
54
  hasApprove: Boolean(showToppyForApprove),
39
- hasReferences: Boolean(referencesExist)
55
+ hasReferences: Boolean(referencesExist),
56
+ hasCaseFlow: cfItems.length > 0
40
57
  };
41
58
  }, [
42
59
  showToppyForCompleteMoreInfo,
43
60
  showToppyForApprove,
44
61
  showToppyForReferences,
45
- dcmtReferences
62
+ dcmtReferences,
63
+ cfItems
46
64
  ]);
65
+ /**
66
+ * Attività di pratica: contesto (pratica + testo dell'attività) e gli STESSI
67
+ * pulsanti dei work item del workflow (`WorkFlowOperationButtons`), così le due
68
+ * provenienze si comportano allo stesso modo davanti all'utente.
69
+ *
70
+ * La forma dei pulsanti la decide la CATEGORIA dell'attività, non il tipo
71
+ * documento: un'approvazione su un tipo abilitato alla firma non deve mostrare
72
+ * "Firma e approva" (per questo si passa `signFlow`). La firma richiede comunque
73
+ * il widget Sign4Top sul tipo, altrimenti il viewer non avrebbe come aprirsi.
74
+ *
75
+ * Per la FIRMA il pulsante apre il viewer (`handleSignApprove`, lo stesso del
76
+ * workflow) e il completamento avviene lì a firma riuscita: il form non sa
77
+ * firmare, e completare qui "a fiducia" chiuderebbe l'attività su un documento
78
+ * non firmato.
79
+ */
80
+ const renderCaseFlowWorkItemCard = (item) => {
81
+ const { caseflow, workItem } = item;
82
+ const isBusy = busyItemId === workItem.id;
83
+ const canSign = !!fromDTD?.widgets && isSign4TopEnabled(fromDTD.widgets);
84
+ const requiresSignature = isSignatureWorkItem(workItem) && canSign;
85
+ const description = workItem.description || getWorkItemActionName(caseflow, workItem);
86
+ return (_jsxs("div", { style: {
87
+ display: 'flex',
88
+ flexDirection: 'column',
89
+ alignItems: 'center',
90
+ textAlign: 'center',
91
+ gap: '10px',
92
+ cursor: 'default',
93
+ }, children: [_jsx("div", { style: {
94
+ padding: '8px 10px',
95
+ maxWidth: '240px',
96
+ color: '#FFFFFF',
97
+ background: 'linear-gradient(135deg, #7E57C2 0%, #5E35B1 60%, #4527A0 100%)',
98
+ border: '1px solid rgba(255,255,255,0.15)',
99
+ borderRadius: 10,
100
+ boxShadow: '0 8px 20px rgba(0, 0, 50, 0.4)',
101
+ }, children: description && _jsx("div", { style: { whiteSpace: 'pre-line' }, children: description }) }), _jsx(WorkFlowOperationButtons, { dtd: fromDTD, deviceType: deviceType, signFlow: requiresSignature, approveDisable: isBusy, signApproveDisable: isBusy, rejectDisable: isBusy, onSignApprove: handleSignApprove, onApprove: onCompleteCaseFlowWorkItem
102
+ ? () => void runCaseFlowAction(item, () => onCompleteCaseFlowWorkItem(item))
103
+ : undefined, onReject: onRejectCaseFlowWorkItem
104
+ ? () => { setRejectReason(''); setRejectingItem(item); }
105
+ : undefined })] }, workItem.id));
106
+ };
47
107
  // Raggruppa references per categoria
48
108
  const { dossierRefs, workingGroupRefs } = useMemo(() => {
49
109
  const dossiers = dcmtReferences?.filter(ref => ref.objClass === ObjectClasses.Dossier) ?? [];
@@ -171,10 +231,17 @@ const TMDcmtFormActionButtons = (props) => {
171
231
  e.currentTarget.style.transform = 'translateY(-50%)';
172
232
  }, children: formatBadgeCount(othersCount) }))] }));
173
233
  };
174
- return (_jsxs(_Fragment, { children: [_jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, children: [hasMoreInfo && firstTask && isMoreInfoCardVisible && (_jsx("div", { style: { display: 'flex', gap: "10px", flexDirection: 'column', alignItems: 'center', paddingRight: tasksNumber > 1 ? '36px' : '0' }, children: renderMoreInfoCard(firstTask, tasksNumber > 1) })), hasMoreInfo && isMoreInfoCardVisible && hasApprove && _jsx(Divider, {}), hasApprove && (workItems.length === 1 ?
234
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, children: [hasMoreInfo && firstTask && isMoreInfoCardVisible && (_jsx("div", { style: { display: 'flex', gap: "10px", flexDirection: 'column', alignItems: 'center', paddingRight: tasksNumber > 1 ? '36px' : '0' }, children: renderMoreInfoCard(firstTask, tasksNumber > 1) })), hasMoreInfo && isMoreInfoCardVisible && hasCaseFlow && _jsx(Divider, {}), hasCaseFlow && (_jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px', alignItems: 'center' }, children: cfItems.map(item => renderCaseFlowWorkItemCard(item)) })), hasCaseFlow && hasApprove && _jsx(Divider, {}), hasMoreInfo && isMoreInfoCardVisible && !hasCaseFlow && hasApprove && _jsx(Divider, {}), hasApprove && (workItems.length === 1 ?
175
235
  _jsx(WorkFlowOperationButtons, { dtd: fromDTD, deviceType: deviceType, onApprove: () => updateShowApprovePopup(true), onSignApprove: handleSignApprove, onReject: () => updateShowRejectPopup(true), onReAssign: () => updateShowReAssignPopup(true), onMoreInfo: () => updateShowMoreInfoPopup(true) })
176
236
  :
177
- _jsxs("div", { style: { padding: 10, color: 'white', maxWidth: '180px', borderRadius: 10, background: '#1B1464 0% 0% no-repeat padding-box', border: '1px solid #FFFFFF' }, children: [`Questo documento è associato a ${workItems.length} workitem.`, _jsx("br", {}), `Per approvare, vai alla pagina "Approvazione workflow".`] })), (hasApprove && hasReferences) || (hasMoreInfo && isMoreInfoCardVisible && !hasApprove && hasReferences) ? (_jsx(Divider, {})) : null, hasReferences && (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px', alignItems: 'center' }, children: [dossierRefs.length > 0 && (_jsx("div", { style: { paddingRight: dossierRefs.length > 1 ? '36px' : '0' }, children: renderReferenceCard(dossierRefs[0], dossierRefs, dossierRefs.length > 1, () => setShowAllDossiersModal(true)) })), workingGroupRefs.length > 0 && (_jsx("div", { style: { paddingRight: workingGroupRefs.length > 1 ? '36px' : '0' }, children: renderReferenceCard(workingGroupRefs[0], workingGroupRefs, workingGroupRefs.length > 1, () => setShowAllWorkingGroupsModal(true)) }))] }))] }), showAllMoreInfoModal && moreInfoTasks && moreInfoTasks.length > 1 && (_jsx(TMModal, { title: `Altre richieste maggiori informazioni (${moreInfoTasks.length - 1})`, onClose: () => setShowAllMoreInfoModal(false), width: calcResponsiveSizes(deviceType, '450px', '450px', '95%'), height: 'auto', children: _jsx("div", { style: {
237
+ _jsxs("div", { style: { padding: 10, color: 'white', maxWidth: '180px', borderRadius: 10, background: '#1B1464 0% 0% no-repeat padding-box', border: '1px solid #FFFFFF' }, children: [`Questo documento è associato a ${workItems.length} workitem.`, _jsx("br", {}), `Per approvare, vai alla pagina "Approvazione workflow".`] })), (hasApprove && hasReferences) || (hasMoreInfo && isMoreInfoCardVisible && !hasApprove && hasReferences) ? (_jsx(Divider, {})) : null, hasReferences && (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px', alignItems: 'center' }, children: [dossierRefs.length > 0 && (_jsx("div", { style: { paddingRight: dossierRefs.length > 1 ? '36px' : '0' }, children: renderReferenceCard(dossierRefs[0], dossierRefs, dossierRefs.length > 1, () => setShowAllDossiersModal(true)) })), workingGroupRefs.length > 0 && (_jsx("div", { style: { paddingRight: workingGroupRefs.length > 1 ? '36px' : '0' }, children: renderReferenceCard(workingGroupRefs[0], workingGroupRefs, workingGroupRefs.length > 1, () => setShowAllWorkingGroupsModal(true)) }))] }))] }), rejectingItem && onRejectCaseFlowWorkItem && (_jsx(TMModal, { title: rejectingItem.workItem.rejectLabel || SDKUI_Localizator.Reject, onClose: () => { setRejectingItem(null); setRejectReason(''); }, width: calcResponsiveSizes(deviceType, '450px', '450px', '95%'), height: 'auto', children: _jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: 12, padding: 15 }, children: [_jsx("div", { style: { fontSize: 13, color: '#555' }, children: `${SDKUI_Localizator.Description}:` }), _jsx("textarea", { value: rejectReason, onChange: (e) => setRejectReason(e.target.value), rows: 4, style: { width: '100%', resize: 'vertical', fontFamily: 'inherit', fontSize: 13, padding: 8 } }), _jsxs("div", { style: { display: 'flex', justifyContent: 'flex-end', gap: 8 }, children: [_jsx(TMButton, { caption: SDKUI_Localizator.Cancel, showTooltip: false, onClick: () => { setRejectingItem(null); setRejectReason(''); } }), _jsx(TMButton, { caption: rejectingItem.workItem.rejectLabel || SDKUI_Localizator.Reject, color: 'error', showTooltip: false, disabled: !rejectReason.trim() || busyItemId === rejectingItem.workItem.id, onClick: () => {
238
+ const item = rejectingItem;
239
+ void runCaseFlowAction(item, async () => {
240
+ await onRejectCaseFlowWorkItem(item, rejectReason.trim());
241
+ setRejectingItem(null);
242
+ setRejectReason('');
243
+ });
244
+ } })] })] }) })), showAllMoreInfoModal && moreInfoTasks && moreInfoTasks.length > 1 && (_jsx(TMModal, { title: `Altre richieste maggiori informazioni (${moreInfoTasks.length - 1})`, onClose: () => setShowAllMoreInfoModal(false), width: calcResponsiveSizes(deviceType, '450px', '450px', '95%'), height: 'auto', children: _jsx("div", { style: {
178
245
  display: 'flex',
179
246
  flexDirection: 'column',
180
247
  gap: '8px',
@@ -54,9 +54,11 @@ const TMDcmtIcon = ({ fileExtension, fileCount, isLexProt, isSigned, isMail, isS
54
54
  cursor: isMobile
55
55
  ? (isDownloadable ? "pointer" : undefined)
56
56
  : (isDownloadable ? "default" : undefined)
57
- }, ...(deviceType === DeviceType.MOBILE
58
- ? { onClick: handleDownloadAction } // Su mobile, un singolo click sull'icona avvia il download
59
- : { onDoubleClick: handleDownloadAction } // Su desktop, un doppio click sull'icona avvia il download
57
+ }, ...(downloadMode === "none"
58
+ ? {}
59
+ : deviceType === DeviceType.MOBILE
60
+ ? { onClick: handleDownloadAction } // Su mobile, un singolo click sull'icona avvia il download
61
+ : { onDoubleClick: handleDownloadAction } // Su desktop, un doppio click sull'icona avvia il download
60
62
  ), children: [icon, isLexProt == 1 && _jsx("div", { style: { position: 'absolute', left: '-7px', top: isShared ? undefined : '2px' }, children: _jsx(TMTooltip, { content: "Protezione LEX", children: _jsx(IconLexProtLock, { color: 'blue', fontSize: 13 }) }) }), isShared == 1 && _jsx("div", { style: { position: 'absolute', top: '-7px', left: '-5px' }, children: _jsx(TMTooltip, { content: "Documento condiviso", children: _jsx(IconShared, { fontSize: 16 }) }) }), isSigned == 1 && _jsx("div", { style: { position: 'absolute', bottom: '-4px', right: '-7px' }, children: _jsx(TMTooltip, { content: "Documento firmato", children: _jsx(IconSignature, { fontSize: 28 }) }) }), showWaitPanel && (usePortal ? createPortal(_jsx(TMWaitPanel, { title: waitPanelTitle, showSecondary: showSecondary, textSecondary: waitPanelTextSecondary, valueSecondary: waitPanelValueSecondary, maxValueSecondary: waitPanelMaxValueSecondary, isCancelable: true, abortController: abortController, onAbortClick: (abortController) => { setTimeout(() => { abortController?.abort(); }, 1000); }, useHighZIndex: true }), document.body) : (_jsx(TMWaitPanel, { title: waitPanelTitle, showSecondary: showSecondary, textSecondary: waitPanelTextSecondary, valueSecondary: waitPanelValueSecondary, maxValueSecondary: waitPanelMaxValueSecondary, isCancelable: true, abortController: abortController, onAbortClick: (abortController) => { setTimeout(() => { abortController?.abort(); }, 1000); } })))] }));
61
63
  };
62
64
  export default TMDcmtIcon;