@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.
Files changed (286) hide show
  1. package/lib/components/NewComponents/ContextMenu/TMContextMenu.js +3 -3
  2. package/lib/components/NewComponents/ContextMenu/hooks.d.ts +1 -1
  3. package/lib/components/NewComponents/ContextMenu/styles.d.ts +45 -43
  4. package/lib/components/NewComponents/FloatingMenuBar/TMFloatingMenuBar.js +6 -6
  5. package/lib/components/NewComponents/FloatingMenuBar/styles.d.ts +80 -73
  6. package/lib/components/base/Styled.d.ts +92 -76
  7. package/lib/components/base/Styled.js +7 -5
  8. package/lib/components/base/TMAccordionNew.js +7 -7
  9. package/lib/components/base/TMAlert.d.ts +32 -32
  10. package/lib/components/base/TMAlert.js +6 -8
  11. package/lib/components/base/TMAreaManager.js +53 -55
  12. package/lib/components/base/TMButton.d.ts +13 -0
  13. package/lib/components/base/TMButton.js +139 -7
  14. package/lib/components/base/TMClosableList.js +3 -3
  15. package/lib/components/base/TMCustomButton.js +40 -48
  16. package/lib/components/base/TMDataGrid.d.ts +4 -0
  17. package/lib/components/base/TMDataGrid.js +292 -12
  18. package/lib/components/base/TMDataGridExportForm.js +39 -30
  19. package/lib/components/base/TMDropDownMenu.js +1 -1
  20. package/lib/components/base/TMEditorBase.d.ts +2 -0
  21. package/lib/components/base/TMFileManager.js +5 -3
  22. package/lib/components/base/TMFileManagerDataGridView.js +12 -3
  23. package/lib/components/base/TMFileManagerThumbnailItems.js +20 -10
  24. package/lib/components/base/TMFileManagerUtils.d.ts +6 -6
  25. package/lib/components/base/TMFileManagerUtils.js +37 -1
  26. package/lib/components/base/TMLayout.d.ts +2 -2
  27. package/lib/components/base/TMLayout.js +3 -3
  28. package/lib/components/base/TMList.js +1 -1
  29. package/lib/components/base/TMListView.js +3 -3
  30. package/lib/components/base/TMModal.d.ts +11 -0
  31. package/lib/components/base/TMModal.js +47 -13
  32. package/lib/components/base/TMPanel.d.ts +6 -0
  33. package/lib/components/base/TMPanel.js +141 -28
  34. package/lib/components/base/TMPopUp.js +5 -2
  35. package/lib/components/base/TMResizableMenu.js +2 -2
  36. package/lib/components/base/TMRightSidebar.js +1 -1
  37. package/lib/components/base/TMShowAllOrMaxItemsButton.js +1 -1
  38. package/lib/components/base/TMSpinner.d.ts +2 -1
  39. package/lib/components/base/TMSpinner.js +9 -7
  40. package/lib/components/base/TMTab.js +2 -2
  41. package/lib/components/base/TMTabControl.d.ts +106 -0
  42. package/lib/components/base/TMTabControl.js +664 -0
  43. package/lib/components/base/TMToggleButton.js +2 -2
  44. package/lib/components/base/TMToolbarCard.js +3 -3
  45. package/lib/components/base/TMTooltip.d.ts +2 -1
  46. package/lib/components/base/TMTooltip.js +24 -8
  47. package/lib/components/base/TMTreeView.d.ts +13 -7
  48. package/lib/components/base/TMTreeView.js +143 -70
  49. package/lib/components/base/TMWaitPanel.js +3 -3
  50. package/lib/components/base/waitPanel/TMWaitPanelConfirm.d.ts +12 -0
  51. package/lib/components/base/waitPanel/TMWaitPanelConfirm.js +185 -0
  52. package/lib/components/base/waitPanel/TMWaitPanelManager.d.ts +169 -0
  53. package/lib/components/base/waitPanel/TMWaitPanelManager.js +320 -0
  54. package/lib/components/base/waitPanel/TMWaitPanelView.d.ts +53 -0
  55. package/lib/components/base/waitPanel/TMWaitPanelView.js +274 -0
  56. package/lib/components/base/waitPanel/index.d.ts +1 -0
  57. package/lib/components/base/waitPanel/index.js +1 -0
  58. package/lib/components/choosers/TMCultureIDPicker.js +2 -2
  59. package/lib/components/choosers/TMDataListItemChooser.js +1 -1
  60. package/lib/components/choosers/TMDataListItemPicker.js +2 -2
  61. package/lib/components/choosers/TMDcmtTypeChooser.js +5 -4
  62. package/lib/components/choosers/TMDiskChooser.js +1 -1
  63. package/lib/components/choosers/TMDistinctValues.d.ts +9 -7
  64. package/lib/components/choosers/TMDistinctValues.js +157 -141
  65. package/lib/components/choosers/TMDynDataListItemChooser.js +1 -1
  66. package/lib/components/choosers/TMImageIDChooser.js +1 -1
  67. package/lib/components/choosers/TMMetadataChooser.js +3 -3
  68. package/lib/components/choosers/TMPathChooser.js +17 -34
  69. package/lib/components/choosers/TMQuickSearchInfo.d.ts +13 -0
  70. package/lib/components/choosers/TMQuickSearchInfo.js +279 -0
  71. package/lib/components/choosers/TMQuickSearchSettingsForm.d.ts +16 -0
  72. package/lib/components/choosers/TMQuickSearchSettingsForm.js +94 -0
  73. package/lib/components/choosers/TMRelationChooser.js +1 -1
  74. package/lib/components/choosers/TMSelectedValuesSummary.d.ts +13 -0
  75. package/lib/components/choosers/TMSelectedValuesSummary.js +89 -0
  76. package/lib/components/choosers/TMUserChooser.js +1 -1
  77. package/lib/components/editors/TMCheckBox.js +1 -1
  78. package/lib/components/editors/TMDateBox.d.ts +16 -1
  79. package/lib/components/editors/TMDateBox.js +90 -22
  80. package/lib/components/editors/TMDropDown.d.ts +3 -0
  81. package/lib/components/editors/TMDropDown.js +197 -5
  82. package/lib/components/editors/TMEditorStyled.d.ts +21 -43
  83. package/lib/components/editors/TMFormulaEditor.js +1 -1
  84. package/lib/components/editors/TMHtmlContentDisplay.js +1 -1
  85. package/lib/components/editors/TMLocalizedTextBox.js +1 -1
  86. package/lib/components/editors/TMMetadataEditor.d.ts +5 -1
  87. package/lib/components/editors/TMMetadataEditor.js +27 -23
  88. package/lib/components/editors/TMMetadataValues.js +6 -6
  89. package/lib/components/editors/TMRadioButton.js +2 -2
  90. package/lib/components/editors/TMSummary.js +3 -3
  91. package/lib/components/editors/TMTextArea.d.ts +1 -0
  92. package/lib/components/editors/TMTextArea.js +25 -17
  93. package/lib/components/editors/TMTextBox.d.ts +2 -0
  94. package/lib/components/editors/TMTextBox.js +32 -21
  95. package/lib/components/editors/TMTextExpression.js +1 -1
  96. package/lib/components/features/archive/TMArchive.js +24 -5
  97. package/lib/components/features/assistant/TMHelpOnLineChat.d.ts +29 -0
  98. package/lib/components/features/assistant/TMHelpOnLineChat.js +1384 -0
  99. package/lib/components/features/assistant/TMToppyDraggableHelpCenter.js +4 -4
  100. package/lib/components/features/assistant/TMToppySpeechBubble.js +1 -1
  101. package/lib/components/features/assistant/dataset/Designer-Suggested-Questions.json +102 -0
  102. package/lib/components/features/assistant/dataset/Login-Suggested-Questions.json +32 -0
  103. package/lib/components/features/assistant/dataset/Surfer-Suggested-Questions.json +102 -0
  104. package/lib/components/features/documents/TMBatchUpdateForm.js +22 -9
  105. package/lib/components/features/documents/TMCopyToFolderForm.js +50 -42
  106. package/lib/components/features/documents/TMDcmtBlog.d.ts +3 -0
  107. package/lib/components/features/documents/TMDcmtBlog.js +4 -4
  108. package/lib/components/features/documents/TMDcmtForm.d.ts +7 -0
  109. package/lib/components/features/documents/TMDcmtForm.js +281 -113
  110. package/lib/components/features/documents/TMDcmtFormActionButtons.d.ts +11 -0
  111. package/lib/components/features/documents/TMDcmtFormActionButtons.js +79 -9
  112. package/lib/components/features/documents/TMDcmtIcon.d.ts +1 -3
  113. package/lib/components/features/documents/TMDcmtIcon.js +8 -8
  114. package/lib/components/features/documents/TMDcmtPreview.d.ts +7 -5
  115. package/lib/components/features/documents/TMDcmtPreview.js +16 -10
  116. package/lib/components/features/documents/TMDcmtTasks.js +2 -9
  117. package/lib/components/features/documents/TMDownloadRelationViewerSection.js +1 -1
  118. package/lib/components/features/documents/TMFileUploader.js +7 -7
  119. package/lib/components/features/documents/TMMasterDetailDcmts.d.ts +2 -0
  120. package/lib/components/features/documents/TMMasterDetailDcmts.js +95 -108
  121. package/lib/components/features/documents/TMMasterInfoFields.d.ts +20 -0
  122. package/lib/components/features/documents/TMMasterInfoFields.js +185 -0
  123. package/lib/components/features/documents/TMMergeToPdfForm.d.ts +1 -2
  124. package/lib/components/features/documents/TMMergeToPdfForm.js +83 -56
  125. package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.d.ts +46 -0
  126. package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.js +320 -0
  127. package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.d.ts +370 -0
  128. package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.js +283 -0
  129. package/lib/components/features/documents/TMRelationViewer.d.ts +29 -9
  130. package/lib/components/features/documents/TMRelationViewer.js +310 -208
  131. package/lib/components/features/documents/copyAndMergeDcmtsShared.d.ts +1 -1
  132. package/lib/components/features/documents/relationTreeState.d.ts +32 -0
  133. package/lib/components/features/documents/relationTreeState.js +89 -0
  134. package/lib/components/features/search/TMMetadataOutputForm.js +1 -1
  135. package/lib/components/features/search/TMMetadataSorterForm.js +1 -1
  136. package/lib/components/features/search/TMSavedQuerySelector.js +2 -2
  137. package/lib/components/features/search/TMSearch.d.ts +1 -1
  138. package/lib/components/features/search/TMSearch.js +172 -34
  139. package/lib/components/features/search/TMSearchQueryEditor.js +7 -5
  140. package/lib/components/features/search/TMSearchQueryPanel.d.ts +14 -4
  141. package/lib/components/features/search/TMSearchQueryPanel.js +153 -62
  142. package/lib/components/features/search/TMSearchResult.d.ts +21 -0
  143. package/lib/components/features/search/TMSearchResult.js +461 -152
  144. package/lib/components/features/search/TMSignatureInfoContent.js +1 -1
  145. package/lib/components/features/search/TMTreeSelector.js +130 -83
  146. package/lib/components/features/search/TMViewHistoryDcmt.js +14 -25
  147. package/lib/components/features/tasks/TMTaskForm.js +1 -1
  148. package/lib/components/features/tasks/TMTaskFormUtils.js +3 -3
  149. package/lib/components/features/tasks/TMTasksAgenda.js +1 -1
  150. package/lib/components/features/tasks/TMTasksCalendar.js +1 -1
  151. package/lib/components/features/tasks/TMTasksHeader.js +1 -1
  152. package/lib/components/features/tasks/TMTasksUtilsView.js +1 -1
  153. package/lib/components/features/tasks/TMTasksView.js +97 -102
  154. package/lib/components/features/wg/TMWGsCopyMoveForm.js +92 -92
  155. package/lib/components/features/workflow/TMWorkflowPopup.d.ts +10 -0
  156. package/lib/components/features/workflow/TMWorkflowPopup.js +9 -5
  157. package/lib/components/features/workflow/diagram/ConnectionComponent.js +3 -3
  158. package/lib/components/features/workflow/diagram/DiagramItemComponent.js +3 -3
  159. package/lib/components/features/workflow/diagram/DiagramItemForm.js +1 -1
  160. package/lib/components/features/workflow/diagram/DiagramItemSvgContent.js +1 -1
  161. package/lib/components/features/workflow/diagram/RecipientList.js +1 -1
  162. package/lib/components/features/workflow/diagram/WFDiagram.js +4 -4
  163. package/lib/components/features/workflow/diagram/WorkitemRecipientsEditor.d.ts +3 -1
  164. package/lib/components/forms/Login/ChangePasswordInputs.d.ts +3 -1
  165. package/lib/components/forms/Login/Menu.js +1 -1
  166. package/lib/components/forms/Login/OTPReader.js +1 -1
  167. package/lib/components/forms/Login/PasswordStrengthChecker.js +1 -1
  168. package/lib/components/forms/Login/RapidAccessLogin.js +2 -2
  169. package/lib/components/forms/Login/RecoverPasswordFlow.js +2 -2
  170. package/lib/components/forms/Login/SelectBox.js +1 -1
  171. package/lib/components/forms/Login/StepIndicator.js +1 -1
  172. package/lib/components/forms/Login/TMLoginForm.js +7 -7
  173. package/lib/components/forms/Login/TextBox.js +1 -1
  174. package/lib/components/forms/TMApplyForm.js +3 -3
  175. package/lib/components/forms/TMChooserForm.js +1 -1
  176. package/lib/components/forms/TMResultDialog.js +1 -1
  177. package/lib/components/forms/TMSaveForm.js +3 -3
  178. package/lib/components/grids/TMBlogAttachments.js +14 -3
  179. package/lib/components/grids/TMBlogHeader.js +5 -1
  180. package/lib/components/grids/TMBlogsPost.d.ts +2 -0
  181. package/lib/components/grids/TMBlogsPost.js +122 -99
  182. package/lib/components/grids/TMBlogsPostUtils.d.ts +1 -0
  183. package/lib/components/grids/TMBlogsPostUtils.js +15 -4
  184. package/lib/components/grids/TMRecentsManager.js +4 -4
  185. package/lib/components/grids/TMValidationItemsList.js +1 -1
  186. package/lib/components/index.d.ts +6 -0
  187. package/lib/components/index.js +5 -0
  188. package/lib/components/layout/panelManager/TMPanelManagerContainer.d.ts +1 -0
  189. package/lib/components/layout/panelManager/TMPanelManagerContainer.js +25 -15
  190. package/lib/components/layout/panelManager/TMPanelManagerContext.js +68 -93
  191. package/lib/components/layout/panelManager/TMPanelManagerToolbar.d.ts +4 -5
  192. package/lib/components/layout/panelManager/TMPanelManagerToolbar.js +1 -1
  193. package/lib/components/layout/panelManager/TMPanelWrapper.js +3 -3
  194. package/lib/components/layout/panelManager/types.d.ts +3 -0
  195. package/lib/components/layout/panelManager/utils.js +13 -11
  196. package/lib/components/pages/TMPage.js +30 -32
  197. package/lib/components/query/TMQueryCountButton.js +1 -1
  198. package/lib/components/query/TMQueryEditor.d.ts +17 -10
  199. package/lib/components/query/TMQueryEditor.js +9 -8
  200. package/lib/components/sidebar/TMCommandsPanel.d.ts +4 -4
  201. package/lib/components/sidebar/TMCommandsPanel.js +1 -1
  202. package/lib/components/sidebar/TMHeader.d.ts +1 -0
  203. package/lib/components/sidebar/TMHeader.js +37 -27
  204. package/lib/components/sidebar/TMSidebar.js +1 -1
  205. package/lib/components/sidebar/TMSidebarItem.js +1 -1
  206. package/lib/components/viewers/TMMidViewer.js +6 -3
  207. package/lib/components/viewers/TMTidViewer.js +89 -28
  208. package/lib/components/wizard/TMStepIndicator.js +3 -3
  209. package/lib/css/tm-sdkui.css +1 -1
  210. package/lib/devextreme-license.d.ts +1 -0
  211. package/lib/devextreme-license.js +3 -0
  212. package/lib/helper/Enum_Localizator.d.ts +4 -4
  213. package/lib/helper/Enum_Localizator.js +1 -0
  214. package/lib/helper/Globalization.d.ts +1 -1
  215. package/lib/helper/SDKUI_Globals.d.ts +110 -0
  216. package/lib/helper/SDKUI_Globals.js +151 -0
  217. package/lib/helper/SDKUI_Localizator.d.ts +756 -677
  218. package/lib/helper/SDKUI_Localizator.js +790 -0
  219. package/lib/helper/TMAppUpdatedModal.d.ts +2 -0
  220. package/lib/helper/TMAppUpdatedModal.js +134 -0
  221. package/lib/helper/TMIcons.d.ts +1 -0
  222. package/lib/helper/TMIcons.js +4 -3
  223. package/lib/helper/TMPdfViewer.js +1 -1
  224. package/lib/helper/TMToppyMessage.js +1 -1
  225. package/lib/helper/TMUtils.d.ts +51 -4
  226. package/lib/helper/TMUtils.js +273 -12
  227. package/lib/helper/ZipManager.d.ts +1 -1
  228. package/lib/helper/ZipManager.js +2 -1
  229. package/lib/helper/checkinCheckoutManager.d.ts +1 -1
  230. package/lib/helper/checkinCheckoutManager.js +1 -1
  231. package/lib/helper/dataGridSearchHelper.d.ts +28 -0
  232. package/lib/helper/dataGridSearchHelper.js +51 -0
  233. package/lib/helper/dcmtsHelper.d.ts +22 -0
  234. package/lib/helper/dcmtsHelper.js +60 -1
  235. package/lib/helper/helpers.d.ts +24 -2
  236. package/lib/helper/helpers.js +59 -3
  237. package/lib/helper/index.d.ts +2 -0
  238. package/lib/helper/index.js +2 -0
  239. package/lib/helper/queryHelper.d.ts +6 -1
  240. package/lib/helper/queryHelper.js +8 -3
  241. package/lib/hooks/tmDistinctValuesGridHelper.d.ts +16 -0
  242. package/lib/hooks/tmDistinctValuesGridHelper.js +31 -0
  243. package/lib/hooks/useArchiveListForm.d.ts +39 -0
  244. package/lib/hooks/useArchiveListForm.js +46 -0
  245. package/lib/hooks/useCaseFlowApprove.d.ts +56 -0
  246. package/lib/hooks/useCaseFlowApprove.js +157 -0
  247. package/lib/hooks/useCheckInOutOperations.d.ts +0 -6
  248. package/lib/hooks/useCheckInOutOperations.js +14 -34
  249. package/lib/hooks/useDataUserIdItem.d.ts +1 -0
  250. package/lib/hooks/useDataUserIdItem.js +1 -0
  251. package/lib/hooks/useDcmtOperations.d.ts +3 -12
  252. package/lib/hooks/useDcmtOperations.js +187 -179
  253. package/lib/hooks/useDocumentOperations.d.ts +5 -0
  254. package/lib/hooks/useDocumentOperations.js +64 -33
  255. package/lib/hooks/useInputDialog.js +1 -1
  256. package/lib/hooks/useMultiMasterDetailDcmts.d.ts +98 -0
  257. package/lib/hooks/useMultiMasterDetailDcmts.js +758 -0
  258. package/lib/hooks/usePreventFileDrop.js +9 -0
  259. package/lib/hooks/useQueryParametersDialog.js +1 -1
  260. package/lib/hooks/useRelatedDocuments.d.ts +1 -0
  261. package/lib/hooks/useRelatedDocuments.js +22 -27
  262. package/lib/hooks/useShowDossiersV5.d.ts +12 -0
  263. package/lib/hooks/useShowDossiersV5.js +37 -0
  264. package/lib/hooks/useTMDistinctValuesMetadataDisplay.d.ts +18 -0
  265. package/lib/hooks/useTMDistinctValuesMetadataDisplay.js +103 -0
  266. package/lib/hooks/useTMDistinctValuesQuickSearch.d.ts +49 -0
  267. package/lib/hooks/useTMDistinctValuesQuickSearch.js +307 -0
  268. package/lib/hooks/useTMDistinctValuesSelection.d.ts +42 -0
  269. package/lib/hooks/useTMDistinctValuesSelection.js +103 -0
  270. package/lib/hooks/useTMDistinctValuesSource.d.ts +29 -0
  271. package/lib/hooks/useTMDistinctValuesSource.js +105 -0
  272. package/lib/hooks/useWorkflowApprove.js +33 -17
  273. package/lib/index.d.ts +2 -0
  274. package/lib/index.js +5 -2
  275. package/lib/services/caseflow/CaseFlowService.d.ts +277 -0
  276. package/lib/services/caseflow/CaseFlowService.js +761 -0
  277. package/lib/services/caseflow/CaseFlowTemplateCacheService.d.ts +28 -0
  278. package/lib/services/caseflow/CaseFlowTemplateCacheService.js +121 -0
  279. package/lib/services/caseflow/caseFlowNameCache.d.ts +32 -0
  280. package/lib/services/caseflow/caseFlowNameCache.js +116 -0
  281. package/lib/services/caseflow/caseFlowWorkItemUtils.d.ts +61 -0
  282. package/lib/services/caseflow/caseFlowWorkItemUtils.js +113 -0
  283. package/lib/services/index.d.ts +4 -0
  284. package/lib/services/index.js +4 -0
  285. package/lib/services/platform_services.d.ts +4 -4
  286. package/package.json +16 -13
@@ -1,11 +1,11 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
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 { TMLayoutWaitingContainer } from '../../base/TMWaitPanel';
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, 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;
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
- 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]);
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
- if (firstBlock) {
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
- // Cambia subito il titolo alla fase 2 quando l'upload termina
928
- // e mostra la progress bar primaria con valore iniziale 20%
929
- setWaitPanelTitleLocal(SDKUI_Localizator.ArchivingCompletionInProgress);
930
- setShowSecondaryLocal(false);
931
- setShowPrimaryLocal(true);
932
- setWaitPanelMaxValuePrimaryLocal(3);
933
- setWaitPanelValuePrimaryLocal(0.6); // 20% di 3
934
- setWaitPanelTextPrimaryLocal(SDKUI_Localizator.ArchivingCompletionInProgress);
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 progress bar primaria è già visibile dal callback)
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
- setWaitPanelTitleLocal(SDKUI_Localizator.ArchivingCompletionInProgress);
1033
+ panel.update({ title: SDKUI_Localizator.ArchivingCompletionInProgress, max: 3 });
946
1034
  // Step 1/3: Aggiornamento griglia di ricerca
947
- setWaitPanelValuePrimaryLocal(1);
1035
+ panel.setValue(1);
948
1036
  await onRefreshSearchAsyncDatagrid?.();
949
1037
  // Step 2/3: Callback di salvataggio
950
- setWaitPanelValuePrimaryLocal(2);
1038
+ panel.setValue(2);
951
1039
  await onSavedAsyncCallback?.(ae.TID, newDID);
952
1040
  // Step 3/3: Aggiornamento lista metadati
953
- setWaitPanelValuePrimaryLocal(3);
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
- setShowWaitPanelLocal(false);
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: layoutMode === LayoutModes.Update ? SDKUI_Localizator.SaveQuestion : 'Sei sicuro di voler archiviare questo documento?',
981
- onButtonClick(e) {
1085
+ message: isUpdate ? SDKUI_Localizator.SaveQuestion : getArchiveConfirmMessage(),
1086
+ onButtonClick: (e) => {
982
1087
  if (e !== ButtonNames.YES)
983
1088
  return;
984
- layoutMode === LayoutModes.Update ? handleSave() : handleArchiveCompleted();
1089
+ isUpdate ? handleSave() : handleArchiveCompleted();
985
1090
  },
986
1091
  });
987
- }, [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]);
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
- return applyMetadataFilter(formDataOrig, showAll, listMaxItems, TID);
1026
- }, [showAll, formDataOrig, listMaxItems, TID]);
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, { "$isMobile": isMobile, children: _jsx(TMTooltip, { content: checkoutStatus.editLockTooltipText, position: "right", children: _jsx("span", { children: checkoutStatus.mode === 'editMode' ? SDKUI_Localizator.CheckOut : 'Locked' }) }) }));
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
- _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 &&
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) && _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
- ? _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 &&
1561
- _jsx(TMDistinctValues, { tid: TID, mid: focusedMetadataValue?.mid, isModal: true, showHeader: false, layoutMode: layoutMode, onClosePanelCallback: () => setIsOpenDistinctValues(false), onSelectionChanged: (e) => {
1562
- if (!e)
1563
- return;
1564
- setFormData((prevItems) => prevItems.map((item) => item.tid == e.tid && item.mid === e.mid ? { ...item, value: e.newValue } : item));
1565
- } }), isOpenFormulaEditor &&
1566
- _jsx(TMFormulaEditor, { isModal: true, formMode: FormModes.Update, inputData: getFormula(), showBack: false, onClose: () => setIsOpenFormulaEditor(false), onApplied: (newFormula) => {
1567
- setFormData((prevItems) => prevItems.map((item) => item.tid == newFormula.tid && item.mid === newFormula.mid ? { ...item, value: FormulaHelper.addFormulaTag(newFormula.expression), isSelected: true, isEditable: true } : item));
1568
- setFocusedMetadataValue(prevState => ({
1569
- ...prevState,
1570
- isSelected: true,
1571
- isEditable: true,
1572
- value: FormulaHelper.addFormulaTag(newFormula.expression)
1573
- }));
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) &&
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 message = `"${mvd.md.nameLoc ?? "no-name"}" ha superata massimo lunghezza di ${maxLength} caratteri.`;
1645
- validationItems.push(new ValidationItem(ResultTypes.ERROR, mvd.md.nameLoc ?? "", message));
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
  }