@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,4 +1,4 @@
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 { useEffect, useMemo, useRef, useState } from 'react';
3
3
  import ReactDOM from 'react-dom';
4
4
  import styled from 'styled-components';
@@ -60,7 +60,7 @@ const TMToppyButton = styled.div.attrs((props) => ({
60
60
  height: ${(props) => props.$isCollapsed ? '56px' : '110px'};
61
61
  max-width: 100%;
62
62
  max-height: 100%;
63
- z-index: 2147483647;
63
+ z-index: 2147483600;
64
64
  background-color: ${(props) => props.$isCollapsed ? '#ffffff' : 'transparent'};
65
65
  border: ${(props) => props.$isCollapsed ? '3px solid #3b82f6' : 'none'};
66
66
  border-radius: ${(props) => props.$isCollapsed ? '50%' : '0'};
@@ -130,7 +130,7 @@ const DragOverlay = styled.div `
130
130
  left: 0;
131
131
  right: 0;
132
132
  bottom: 0;
133
- z-index: 2147483646;
133
+ z-index: 2147483599;
134
134
  cursor: grabbing;
135
135
  `;
136
136
  const TMToppyDraggableHelpCenter = (props) => {
@@ -433,7 +433,7 @@ const TMToppyDraggableHelpCenter = (props) => {
433
433
  window.removeEventListener('resize', handleResize);
434
434
  };
435
435
  }, []);
436
- const toppyContent = (_jsxs(_Fragment, { children: [isDragging && _jsx(DragOverlay, {}), _jsxs(TMToppyButton, { ref: toppyButtonRef, "$align": align, "$isDragging": isDragging, "$isVisible": isVisible, "$isCollapsed": isCollapsed, "$isMobile": isMobile, "$usePortal": usePortal, onContextMenu: (e) => e.preventDefault(), onMouseDown: !isMobile ? handleMouseDown : undefined, onTouchStart: isMobile ? handleTouchStart : undefined, onDoubleClick: !isMobile ? toggleCollapse : undefined, "$x": position?.x, "$y": position?.y, children: [(content && !isCollapsed) && _jsx(TMToppySpeechBubble, { ref: bubbleRef, align: align, onClose: toggleCollapse, children: content }), (content && isCollapsed) && (_jsx(ExpandButton, { onMouseDown: (e) => {
436
+ const toppyContent = (_jsxs(_Fragment, { children: [isDragging && _jsx(DragOverlay, {}), _jsxs(TMToppyButton, { ref: toppyButtonRef, $align: align, $isDragging: isDragging, $isVisible: isVisible, $isCollapsed: isCollapsed, $isMobile: isMobile, $usePortal: usePortal, onContextMenu: (e) => e.preventDefault(), onMouseDown: !isMobile ? handleMouseDown : undefined, onTouchStart: isMobile ? handleTouchStart : undefined, onDoubleClick: !isMobile ? toggleCollapse : undefined, $x: position?.x, $y: position?.y, children: [(content && !isCollapsed) && _jsx(TMToppySpeechBubble, { ref: bubbleRef, align: align, onClose: toggleCollapse, children: content }), (content && isCollapsed) && (_jsx(ExpandButton, { onMouseDown: (e) => {
437
437
  isExpandButtonDraggingRef.current = false;
438
438
  expandButtonMouseDownPosRef.current = { x: e.clientX, y: e.clientY };
439
439
  }, onMouseMove: (e) => {
@@ -120,7 +120,7 @@ const TMToppySpeechBubble = forwardRef((props, ref) => {
120
120
  e.stopPropagation();
121
121
  onClose?.();
122
122
  };
123
- return (_jsx(BubbleContainer, { "$align": align, children: _jsxs(BubbleWrapper, { ref: ref, "$hasCloseButton": !!onClose, children: [onClose && (_jsx(CloseButton, { onMouseDown: handleMouseDown, onMouseMove: handleMouseMove, onMouseUp: handleMouseUp, onClick: handleClick, "aria-label": SDKUI_Localizator.Minimize, title: SDKUI_Localizator.Minimize, type: "button", children: _jsx(IconWindowMinimize, {}) })), _jsx(Bubble, { "$align": align, children: _jsx(Content, { children: children }) })] }) }));
123
+ return (_jsx(BubbleContainer, { $align: align, children: _jsxs(BubbleWrapper, { ref: ref, $hasCloseButton: !!onClose, children: [onClose && (_jsx(CloseButton, { onMouseDown: handleMouseDown, onMouseMove: handleMouseMove, onMouseUp: handleMouseUp, onClick: handleClick, "aria-label": SDKUI_Localizator.Minimize, title: SDKUI_Localizator.Minimize, type: "button", children: _jsx(IconWindowMinimize, {}) })), _jsx(Bubble, { $align: align, children: _jsx(Content, { children: children }) })] }) }));
124
124
  });
125
125
  TMToppySpeechBubble.displayName = 'TMToppySpeechBubble';
126
126
  export default TMToppySpeechBubble;
@@ -0,0 +1,102 @@
1
+ [
2
+ "Come metto un tipo documento dentro un albero?",
3
+ "Perché l'area di appoggio non mostra i file?",
4
+ "Che differenza c'è fra uno a molti e molti a molti?",
5
+ "A che servono i tre pulsanti della pagina certificati?",
6
+ "Che differenza c'è fra firma e marca temporale?",
7
+ "Posso cambiare il percorso di un disco?",
8
+ "Come esporto la configurazione?",
9
+ "Che differenza c'è fra la finestra dell'errore e il contatore rosso?",
10
+ "Ho archiviato un documento ma la ricerca libera non lo trova, perché?",
11
+ "Perché un gruppo non ha l'elenco degli utenti?",
12
+ "Come importo una configurazione?",
13
+ "Perché il cestino è grigio nei server LDAP?",
14
+ "Cosa succede ai documenti se elimino un valore di una lista dati?",
15
+ "Perché il cestino è grigio nei server di marca temporale?",
16
+ "Cosa sono i parametri fra parentesi graffe?",
17
+ "Come impedisco di riusare le vecchie password?",
18
+ "Perché la griglia dei permessi è vuota?",
19
+ "Che differenza c'è fra Direct e LoadBalance?",
20
+ "Quali campi ha un tipo serbatoio?",
21
+ "Come capisco se un utente sta davvero lavorando?",
22
+ "Perché il cestino è grigio nei server di firma?",
23
+ "Come aggiungo un campo a un tipo documento?",
24
+ "Quanti documenti ci sono in archivio?",
25
+ "A che serve «Usa autenticazione sicura» su un utente?",
26
+ "In che formato vengono mostrate le fatture elettroniche?",
27
+ "Come definisco quali documenti entrano in una vista?",
28
+ "Dove trovo la vista approvativa di un workflow?",
29
+ "Perché salva è grigio negli alberi?",
30
+ "Perché salva è grigio nelle aree di appoggio?",
31
+ "Perché la correlazione funziona solo in un verso?",
32
+ "Perché la firma non riesce pur essendo tutto compilato?",
33
+ "Perché non riesco a creare il certificato?",
34
+ "Che differenza c'è fra disco e area di appoggio?",
35
+ "Come esporto un tipo documento con tutto ciò che gli serve?",
36
+ "Che cosa vuol dire «Proseguendo le modifiche apportate andranno perse»?",
37
+ "A che serve la coda della ricerca full text?",
38
+ "Come metto una persona in un gruppo?",
39
+ "Come importo un tipo documento che usa liste dati che qui non esistono?",
40
+ "Dove metto utente e password del dominio?",
41
+ "Perché salva è grigio nelle liste dati?",
42
+ "Posso usare un certificatore diverso dai tre proposti?",
43
+ "Come faccio ripartire il protocollo da 1 ogni anno?",
44
+ "Come faccio scadere le password?",
45
+ "Cosa vuol dire autorizzato e non autorizzato?",
46
+ "Che cos'è un «Login SAP» e a che cosa serve?",
47
+ "Perché salva è grigio nei tipi serbatoio?",
48
+ "Dove trovo l'ID di sessione da dare all'assistenza?",
49
+ "Quali campi ha un server di firma?",
50
+ "Dove finiscono i file di questo tipo documento?",
51
+ "Quanti documenti sono senza file?",
52
+ "Ho creato un utente ma non vede niente, perché?",
53
+ "Perché il link di un documento non funziona?",
54
+ "Perché la stessa vista mostra cose diverse a persone diverse?",
55
+ "Che differenza c'è fra partecipante e responsabile?",
56
+ "Che cos'è un albero e a che cosa serve?",
57
+ "Che cos'è un'area di appoggio e a che cosa serve?",
58
+ "Perché dice «nessuna proprietà da definire»?",
59
+ "A che cosa servono «OTP Provider» e «OTP ID» del certificato?",
60
+ "Come aggiungo spazio all'archivio?",
61
+ "Perché dopo l'importazione i gruppi non vedono nulla?",
62
+ "Perché a volte è «Campo Obbligatorio» con la maiuscola?",
63
+ "Perché questo gruppo non si lascia modificare?",
64
+ "Devo importare tutto il file?",
65
+ "Perché salva è grigio nel server LDAP?",
66
+ "Che cos'è una lista dati e a che cosa serve?",
67
+ "Perché salva è grigio nel server di marca temporale?",
68
+ "Perché il numeratore dà sempre lo stesso numero?",
69
+ "A cosa servono i tre puntini nella cella dei permessi?",
70
+ "Dove si configura il collegamento a SAP?",
71
+ "Che differenza c'è fra serbatoio, disco e area di appoggio?",
72
+ "Quali colonne ha l'elenco delle sessioni?",
73
+ "Dove si configura il servizio che manda il codice OTP?",
74
+ "Che differenza c'è fra chiave primaria e indice univoco?",
75
+ "Perché un utente non riesce più ad accedere?",
76
+ "Come faccio vedere un documento a chi non ha un'utenza?",
77
+ "Perché la linguetta «Metadati» di un tipo documento è obbligatoria?",
78
+ "Perché la modifica al workflow non ha effetto?",
79
+ "Perché non riesco a salvare un albero nuovo?",
80
+ "Quali campi servono per un'area di appoggio?",
81
+ "Come risolvo l'errore sulla seconda query di una correlazione?",
82
+ "Perché salva è grigio nel certificato di firma?",
83
+ "Cosa succede ai documenti se elimino il disco?",
84
+ "Dove cambio il nome del file di esportazione?",
85
+ "Perché il salvataggio riesce ma l'oggetto non funziona?",
86
+ "Che cos'è un gruppo e perché i permessi si danno ai gruppi?",
87
+ "Perché non vedo il pulsante delle opzioni di importazione?",
88
+ "Che cos'è un server LDAP?",
89
+ "Perché la lista nuova non compare da nessuna parte?",
90
+ "Che cos'è un server di marca temporale?",
91
+ "Che cos'è un numeratore e a che cosa serve?",
92
+ "Perché non trovo l'oggetto nella griglia dei permessi?",
93
+ "Posso recuperare un profilo eliminato?",
94
+ "Dove si creano i tipi serbatoio?",
95
+ "Come faccio uscire qualcuno dall'applicazione?",
96
+ "Come provo che un server di firma funzioni?",
97
+ "Che cosa sono le opzioni del tipo documento?",
98
+ "Che cos'è il numero rosso nella scheda?",
99
+ "In che lingua vede il documento chi riceve il link?",
100
+ "Perché una vista ha meno opzioni di un tipo documento?",
101
+ "Che differenza c'è fra errore e avviso?"
102
+ ]
@@ -0,0 +1,32 @@
1
+ [
2
+ "Che cos'è la schermata di accesso?",
3
+ "Quanti passaggi servono per entrare e come torno indietro?",
4
+ "Che cos'è il punto di accesso?",
5
+ "Come verifico che il punto di accesso risponda?",
6
+ "Che cos'è l'archivio documentale che mi viene chiesto?",
7
+ "Come si sceglie da un elenco a tendina o a finestra?",
8
+ "Quali sono le cinque modalità di autenticazione?",
9
+ "A che cosa servono i campi nome utente e password?",
10
+ "Che cos'è l'accesso «per conto di»?",
11
+ "Quali campi sono obbligatori per accedere?",
12
+ "Quali controlli ci sono sul cambio e sul recupero della password?",
13
+ "Che cos'è l'autenticazione a più fattori?",
14
+ "Come si compilano le sei caselle del codice?",
15
+ "Quali comandi ho accanto alle caselle del codice?",
16
+ "Come ottengo il codice per posta elettronica o da applicazione?",
17
+ "Quando compaiono «Cambia password» e «Password dimenticata»?",
18
+ "Come si cambia la password dalla schermata di accesso?",
19
+ "Ho dimenticato la password, come la recupero?",
20
+ "Quali requisiti deve avere la nuova password?",
21
+ "Che cosa sono gli accessi rapidi?",
22
+ "Come creo un accesso rapido prima di entrare?",
23
+ "Com'è fatto il pannello degli accessi rapidi?",
24
+ "Come personalizzo nome, icona e colore di un accesso rapido?",
25
+ "Come esporto e importo gli accessi rapidi?",
26
+ "Come cambio la lingua della schermata di accesso?",
27
+ "Quali versioni sono indicate nella schermata?",
28
+ "Che cosa vogliono dire i messaggi della schermata di accesso?",
29
+ "L'accesso non riesce: come capisco il motivo?",
30
+ "Come accedo a TopMedia da telefono?",
31
+ "La password nuova non viene accettata, perché?"
32
+ ]
@@ -0,0 +1,102 @@
1
+ [
2
+ "Che cos'è l'Archiviazione?",
3
+ "Che cosa succede facendo clic su un risultato?",
4
+ "Che cosa significa tipo documento?",
5
+ "Che cosa sono i metadati di output?",
6
+ "Che cosa cambia negli elenchi e nelle finestre su Mobile?",
7
+ "Che cos'è la ricerca naturale?",
8
+ "Come effettuo una ricerca?",
9
+ "Come apro la sezione Ricerca?",
10
+ "Dove trovo i tipi documento in archiviazione?",
11
+ "A cosa servono i metadati?",
12
+ "Che cos'è un filtro di ricerca?",
13
+ "Come si apre la ricerca naturale?",
14
+ "In quale sezione di Surfer si cercano i documenti?",
15
+ "Che cos'è la ricerca avanzata?",
16
+ "Posso vedere il contenuto del file che sto archiviando?",
17
+ "A cosa serve il tipo documento?",
18
+ "Quali operatori di ricerca esistono?",
19
+ "Come evito errori di battitura?",
20
+ "Che cos'è la scheda del documento?",
21
+ "Devo convertire il file prima di archiviarlo?",
22
+ "Che cosa sono i metadati?",
23
+ "Che cos'è l'ordinamento del risultato?",
24
+ "Come cerco documenti di un certo periodo?",
25
+ "Come vengono nominati i file copiati?",
26
+ "Come scelgo il tipo documento da archiviare?",
27
+ "Che cos'è la ricerca per metadati?",
28
+ "Come cerco i documenti di oggi?",
29
+ "Che cos'è l'editor delle formule?",
30
+ "Dove metto il file da archiviare?",
31
+ "Che cos'è un documento in Surfer?",
32
+ "Come personalizzo i pannelli della ricerca?",
33
+ "Come si apre il pannello «Impostazioni» e come è fatto?",
34
+ "Come archivio una fattura elettronica?",
35
+ "Cosa vuol dire prendere in carico un documento?",
36
+ "Come aggiungo una colonna al risultato?",
37
+ "Che cosa vedo dopo la ricerca?",
38
+ "Che cosa sono i documenti master e dettaglio?",
39
+ "Come ordino cliccando sulla colonna?",
40
+ "Che cosa sono i metadati di sistema?",
41
+ "Come non reimposto ogni volta i filtri?",
42
+ "Come riconosco il tipo di dato di un metadato?",
43
+ "Perché non posso modificare la ricerca?",
44
+ "Che cos'è una vista e perché è scritta in rosso?",
45
+ "Come unisco due ricerche?",
46
+ "Che cos'è Toppy e in quanti modi compare nella Ricerca?",
47
+ "Come scarico un documento?",
48
+ "A cosa serve il check out?",
49
+ "Come elimino un documento dall'archivio?",
50
+ "Come prendo in carico un documento?",
51
+ "Come esporto i risultati?",
52
+ "Come metto un documento tra i preferiti?",
53
+ "Come aggiorno i risultati?",
54
+ "Dove sono finiti i documenti che avevo trovato?",
55
+ "Come faccio a rivedere le ricerche rapide?",
56
+ "Come scelgo il tipo documento dall'albero?",
57
+ "Come cambio l'albero che si apre all'inizio?",
58
+ "Come pulisco l'elenco delle scorciatoie?",
59
+ "Come filtro l'elenco dei tipi documento?",
60
+ "Perché non posso eliminare una ricerca?",
61
+ "Come faccio partire sempre la stessa ricerca?",
62
+ "Come richiamo una ricerca dalla pagina iniziale?",
63
+ "Come annullo le modifiche ai filtri?",
64
+ "Come aggiungo un campo di ricerca che non c'è?",
65
+ "Come scelgo quali colonne vedere nel risultato?",
66
+ "Come stabilisco la priorità dell'ordinamento?",
67
+ "Come faccio partire subito una ricerca salvata?",
68
+ "Come aggiungo un comando alla barra flottante?",
69
+ "Come leggo il documento senza aprirlo?",
70
+ "Come trovo un documento nei risultati?",
71
+ "Come tolgo una colonna dalla vista?",
72
+ "Come sostituisco il file?",
73
+ "Come firmo un documento?",
74
+ "Come trasformo un documento in pdf?",
75
+ "Come cambio un valore su tanti documenti?",
76
+ "Come trovo il documento principale?",
77
+ "Come collego due documenti?",
78
+ "Come archivio un documento simile?",
79
+ "Come tengo aperta l'anteprima?",
80
+ "Come faccio vedere l'anteprima dei file grandi?",
81
+ "Come copio i file in una cartella?",
82
+ "Come unisco più documenti?",
83
+ "Perché la ricerca full text non lo trova?",
84
+ "Come tolgo un documento dal gruppo di lavoro?",
85
+ "Chi ha preso il documento in passato?",
86
+ "Dove vedo i documenti condivisi?",
87
+ "Come assegno un compito su un documento?",
88
+ "Come scarico gli allegati di una fattura?",
89
+ "Come scarico la lista dei documenti?",
90
+ "Come cambio i dati di un documento?",
91
+ "Come archivio partendo da una ricerca?",
92
+ "Come faccio una ricerca complessa?",
93
+ "Perché il risultato non è quello che mi aspetto?",
94
+ "Come cerco una parola dentro i documenti?",
95
+ "Come chiedo a Toppy di trovare un documento?",
96
+ "Come copio i dati della firma?",
97
+ "Chi ha modificato il documento e quando?",
98
+ "Come risalgo dalla fattura all'ordine?",
99
+ "Come imposto una ricerca per trovare un documento?",
100
+ "Dove si cercano i documenti di un certo tipo?",
101
+ "Come vedo la cronologia dei check out di un documento?"
102
+ ]
@@ -1,4 +1,4 @@
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 { useEffect, useState } from 'react';
3
3
  import { AccessLevels, DcmtTypeListCacheService, LayoutModes, MetadataDataDomains, ResultTypes, SDK_Globals, ValidationItem } from '@topconsultnpm/sdk-ts';
4
4
  import { searchResultToMetadataValues, getSystemMetadata, calcIsModified, getListMaxItems, SDKUI_Localizator, SDKUI_Globals } from '../../../helper';
@@ -6,11 +6,10 @@ import { useDcmtOperations } from '../../../hooks/useDcmtOperations';
6
6
  import { DcmtOperationTypes, FormModes } from '../../../ts';
7
7
  import { StyledToolbarCardContainer, StyledFormButtonsContainer } from '../../base/Styled';
8
8
  import { useDeviceType, DeviceType } from '../../base/TMDeviceProvider';
9
- import { TMSplitterLayout } from '../../base/TMLayout';
10
- import { TMExceptionBoxManager } from '../../base/TMPopUp';
9
+ import TMLayoutContainer, { TMSplitterLayout } from '../../base/TMLayout';
10
+ import { TMExceptionBoxManager, TMMessageBoxManager, ButtonNames } from '../../base/TMPopUp';
11
11
  import TMShowAllOrMaxItemsButton from '../../base/TMShowAllOrMaxItemsButton';
12
12
  import TMSpinner from '../../base/TMSpinner';
13
- import { TMLayoutWaitingContainer } from '../../base/TMWaitPanel';
14
13
  import TMDistinctValues from '../../choosers/TMDistinctValues';
15
14
  import TMFormulaEditor, { FormulaDescriptor, FormulaHelper, FormulaTargets } from '../../editors/TMFormulaEditor';
16
15
  import { useMetadataEditableList } from '../../editors/TMMetadataEditor';
@@ -28,7 +27,7 @@ const TMBatchUpdateForm = ({ inputDcmts, TID, DID, isExpertMode = SDKUI_Globals.
28
27
  const [showFormulaEditor, setShowFormulaEditor] = useState(false);
29
28
  const [focusedMetadataValue, setFocusedMetadataValue] = useState();
30
29
  const [addOrRemoveEditableList] = useMetadataEditableList();
31
- const { abortController, runOperationAsync, showWaitPanel, waitPanelTitle, showPrimary, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary } = useDcmtOperations();
30
+ const { runOperationAsync } = useDcmtOperations();
32
31
  const deviceType = useDeviceType();
33
32
  useEffect(() => {
34
33
  if (!TID)
@@ -114,10 +113,24 @@ const TMBatchUpdateForm = ({ inputDcmts, TID, DID, isExpertMode = SDKUI_Globals.
114
113
  const totalItems = metadataValues.filter(o => o.mid && o.mid > 100).length;
115
114
  const metadataValuesSource = metadataValues.filter(o => o.mid && o.mid > 100).slice(0, showAll ? metadataValues.filter(o => o.mid && o.mid > 100).length : listMaxItems);
116
115
  const metadataValuesSourceOrig = metadataValuesOrig.filter(o => o.mid && o.mid > 100).slice(0, showAll ? metadataValuesOrig.filter(o => o.mid && o.mid > 100).length : listMaxItems);
116
+ /**
117
+ * Chiusura del form: con modifiche pendenti chiede conferma prima di scartarle.
118
+ * Il TMModal è montato con askClosingConfirm, quindi non si auto-nasconde: la chiusura
119
+ * effettiva avviene solo quando onBack smonta il componente.
120
+ */
121
+ const handleClose = () => {
122
+ if (!isModified) {
123
+ onBack?.();
124
+ return;
125
+ }
126
+ TMMessageBoxManager.show({
127
+ title: SDKUI_Localizator.Cancel, message: SDKUI_Localizator.ConfirmOnCancel, buttons: [ButtonNames.YES, ButtonNames.NO],
128
+ onButtonClick: (e) => { if (e === ButtonNames.YES)
129
+ onBack?.(); }
130
+ });
131
+ };
117
132
  const renderContent = () => {
118
- return (_jsx(TMLayoutWaitingContainer, { showWaitPanel: showWaitPanel, showWaitPanelPrimary: showPrimary, waitPanelTitle: waitPanelTitle, waitPanelTextPrimary: waitPanelTextPrimary, waitPanelValuePrimary: waitPanelValuePrimary, waitPanelMaxValuePrimary: waitPanelMaxValuePrimary, isCancelable: true, abortController: abortController, children: _jsxs(TMSplitterLayout, { direction: 'horizontal', overflow: 'visible', separatorSize: Gutters.getGutters(), separatorColor: 'transparent', separatorActiveColor: 'transparent', showSeparator: showFormulaEditor, start: showFormulaEditor ? ['50%', '50%'] : ['100%', '0%'], min: ['0', '0'], children: [_jsx(TMPanel, { title: isModal ? 'Modifica i metadati' : `${SDKUI_Localizator.BatchUpdate} (${inputDcmts.length} documenti selezionati)`, onBack: deviceType === DeviceType.MOBILE ? onBack : undefined,
119
- // onClose={deviceType !== DeviceType.MOBILE ? onBack : undefined}
120
- allowMaximize: !isModal, showHeader: !isModal, children: _jsxs(StyledToolbarCardContainer, { children: [_jsx(TMMetadataValues, { TID: TID, isExpertMode: isExpertMode, showCheckBoxes: ShowCheckBoxesMode.Always, showNullValueCheckBoxes: true, metadataValues: metadataValuesSource, metadataValuesOrig: metadataValuesSourceOrig, validationItems: validationItems, isOpenDistinctValues: showDistinctValuesPanel, selectedMID: focusedMetadataValue?.mid, onFocusedItemChanged: (item) => { setFocusedMetadataValue(item); }, onValueChanged: (newItems) => {
133
+ return (_jsx(TMLayoutContainer, { children: _jsxs(TMSplitterLayout, { direction: 'horizontal', overflow: 'visible', separatorSize: Gutters.getGutters(), separatorColor: 'transparent', separatorActiveColor: 'transparent', showSeparator: showFormulaEditor, start: showFormulaEditor ? ['50%', '50%'] : ['100%', '0%'], min: ['0', '0'], children: [_jsx(TMPanel, { title: isModal ? 'Modifica i metadati' : `${SDKUI_Localizator.BatchUpdate} (${inputDcmts.length} documenti selezionati)`, onBack: deviceType === DeviceType.MOBILE ? handleClose : undefined, allowMaximize: !isModal, showHeader: !isModal, children: _jsxs(StyledToolbarCardContainer, { children: [_jsx(TMMetadataValues, { TID: TID, isExpertMode: isExpertMode, showCheckBoxes: ShowCheckBoxesMode.Always, showNullValueCheckBoxes: true, metadataValues: metadataValuesSource, metadataValuesOrig: metadataValuesSourceOrig, validationItems: validationItems, isOpenDistinctValues: showDistinctValuesPanel, selectedMID: focusedMetadataValue?.mid, onFocusedItemChanged: (item) => { setFocusedMetadataValue(item); }, onValueChanged: (newItems) => {
121
134
  setMetadataValues((prevItems) => prevItems.map((item) => {
122
135
  const newItem = newItems.find((newItem) => newItem.tid === item.tid && newItem.mid === item.mid);
123
136
  return newItem ? { ...item, ...newItem } : item;
@@ -153,7 +166,7 @@ const TMBatchUpdateForm = ({ inputDcmts, TID, DID, isExpertMode = SDKUI_Globals.
153
166
  } })] }) })] }) }));
154
167
  };
155
168
  return (_jsx(_Fragment, { children: (isModal && onBack)
156
- ? _jsx(TMModal, { title: titleModal, onClose: onBack, width: widthModal ?? '100%', height: heightModal ?? '100%', hidePopup: false, askClosingConfirm: true, children: _jsx("div", { style: { width: "100%", height: "100%", display: 'block', padding: "4px" }, children: renderContent() }) })
169
+ ? _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" }, children: renderContent() }) })
157
170
  : renderContent() }));
158
171
  };
159
172
  export default TMBatchUpdateForm;
@@ -13,8 +13,8 @@ import TMOrderRetrieveFormats from '../../choosers/TMOrderRetrieveFormats';
13
13
  import TMButton from '../../base/TMButton';
14
14
  import { ButtonNames, TMMessageBoxManager } from '../../base/TMPopUp';
15
15
  import { useDcmtOperations } from '../../../hooks/useDcmtOperations';
16
- import { TMLayoutWaitingContainer } from '../../base/TMWaitPanel';
17
16
  import { TMSplitterLayout } from '../../base/TMLayout';
17
+ import TMWaitPanelManager from '../../base/waitPanel/TMWaitPanelManager';
18
18
  import TMCheckBox from '../../editors/TMCheckBox';
19
19
  import ShowAlert from '../../base/TMAlert';
20
20
  import { TMColors } from '../../../utils/theme';
@@ -26,17 +26,13 @@ import { buildInitialDownloadSettings, fileExists, generateTargetFileName, gener
26
26
  * e TMDownloadRelationViewerSection.
27
27
  */
28
28
  const TMCopyToFolderForm = ({ mode, selectedDcmtInfos, onClose, showTMRelationViewer, allTasks, getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, handleNavigateToWGs, handleNavigateToDossiers }) => {
29
- const { abortController, showWaitPanel, waitPanelTitle, showPrimary, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, downloadDcmtsAsync, } = useDcmtOperations();
29
+ // Il wait panel del download lo apre e lo aggiorna l'hook: qui serve solo la funzione.
30
+ const { downloadDcmtsAsync } = useDcmtOperations();
30
31
  // Get the current device type (e.g., mobile, tablet, desktop) using a custom hook.
31
32
  const deviceType = useDeviceType();
32
33
  // ---- Stato dei settings ----
33
34
  const [settings, setSettings] = useState(() => buildInitialDownloadSettings(SDKUI_Globals.userSettings.documentDownloadSettings, SDKUI_Globals.userSettings.searchSettings.invoiceRetrieveFormat, SDKUI_Globals.userSettings.searchSettings.orderRetrieveFormat));
34
35
  const [selectedItemsRelationViewer, setSelectedItemsRelationViewer] = useState([]);
35
- // ---- Stato per la creazione ZIP (spinner separato) ----
36
- const [isCreatingZip, setIsCreatingZip] = useState(false);
37
- const [zipProgressText, setZipProgressText] = useState('');
38
- const [zipProgressValue, setZipProgressValue] = useState(0);
39
- const [zipProgressMax, setZipProgressMax] = useState(0);
40
36
  const [hasSavedLayout, setHasSavedLayout] = useState(() => {
41
37
  const saved = SDKUI_Globals.userSettings.documentDownloadSettings;
42
38
  const defaults = new DocumentDownloadSettings();
@@ -114,7 +110,7 @@ const TMCopyToFolderForm = ({ mode, selectedDcmtInfos, onClose, showTMRelationVi
114
110
  // ---- Scrittura file nel filesystem locale ----
115
111
  const writeFileToFolder = async (file, dcmtInfo) => {
116
112
  try {
117
- let targetFileName = await generateTargetFileName(file, dcmtInfo, {
113
+ const baseFileName = await generateTargetFileName(file, dcmtInfo, {
118
114
  fileNamingMode: settings.fileNamingMode,
119
115
  separatorChar: settings.separatorChar,
120
116
  });
@@ -123,7 +119,7 @@ const TMCopyToFolderForm = ({ mode, selectedDcmtInfos, onClose, showTMRelationVi
123
119
  const url = URL.createObjectURL(file);
124
120
  const a = document.createElement('a');
125
121
  a.href = url;
126
- a.download = targetFileName;
122
+ a.download = baseFileName;
127
123
  document.body.appendChild(a);
128
124
  a.target = '_blank';
129
125
  a.rel = 'noreferrer';
@@ -132,20 +128,22 @@ const TMCopyToFolderForm = ({ mode, selectedDcmtInfos, onClose, showTMRelationVi
132
128
  URL.revokeObjectURL(url);
133
129
  return;
134
130
  }
135
- const exists = await fileExists(folderHandleRef.current, targetFileName);
131
+ const folderHandle = folderHandleRef.current;
132
+ let targetFileName = baseFileName;
133
+ const exists = await fileExists(folderHandle, targetFileName);
136
134
  if (exists) {
137
135
  switch (settings.fileExistsMode) {
138
136
  case 'skip':
139
137
  return;
140
138
  case 'rename':
141
- targetFileName = await generateUniqueFileName(folderHandleRef.current, targetFileName);
139
+ targetFileName = await generateUniqueFileName(folderHandle, targetFileName);
142
140
  break;
143
141
  case 'overwrite':
144
142
  default:
145
143
  break;
146
144
  }
147
145
  }
148
- const fileHandle = await folderHandleRef.current.getFileHandle(targetFileName, { create: true });
146
+ const fileHandle = await folderHandle.getFileHandle(targetFileName, { create: true });
149
147
  const writable = await fileHandle.createWritable();
150
148
  await writable.write(file);
151
149
  await writable.close();
@@ -179,7 +177,6 @@ const TMCopyToFolderForm = ({ mode, selectedDcmtInfos, onClose, showTMRelationVi
179
177
  await downloadDcmtsAsync({ inputDcmts: dcmtInfosToDownload, downloadType: DownloadTypes.Dcmt, downloadMode: 'download', onFileDownloaded: writeFileToFolder, skipConfirmation: true, retrieveOptions, useCache: false });
180
178
  }
181
179
  else if (settings.exportMode === 'zip') {
182
- const zipEntries = [];
183
180
  const fileNameCounts = new Map();
184
181
  const getUniqueZipFileName = (fileName) => {
185
182
  const lowerName = fileName.toLowerCase();
@@ -192,30 +189,41 @@ const TMCopyToFolderForm = ({ mode, selectedDcmtInfos, onClose, showTMRelationVi
192
189
  const ext = dotIndex > 0 ? fileName.substring(dotIndex) : '';
193
190
  return `${baseName} (${count})${ext}`;
194
191
  };
192
+ // I file scaricati si raccolgono in mappa (nome incluso) e l'archivio viene costruito
193
+ // dopo, nell'ordine di selezione, così i suffissi di deduplica restano coerenti.
194
+ const downloadedEntries = new Map();
195
195
  const collectFileForZip = async (file, dcmtInfo) => {
196
196
  const targetFileName = await generateTargetFileName(file, dcmtInfo, {
197
197
  fileNamingMode: settings.fileNamingMode,
198
198
  separatorChar: settings.separatorChar,
199
199
  });
200
- zipEntries.push({ filename: getUniqueZipFileName(targetFileName), data: file });
200
+ downloadedEntries.set(`${dcmtInfo.TID}_${dcmtInfo.DID}`, { file, targetFileName });
201
201
  };
202
202
  await downloadDcmtsAsync({ inputDcmts: dcmtInfosToDownload, downloadType: DownloadTypes.Dcmt, downloadMode: 'download', onFileDownloaded: collectFileForZip, skipConfirmation: true, retrieveOptions, useCache: false });
203
+ const zipEntries = [];
204
+ for (const dcmtInfo of dcmtInfosToDownload) {
205
+ const entry = downloadedEntries.get(`${dcmtInfo.TID}_${dcmtInfo.DID}`);
206
+ if (!entry)
207
+ continue;
208
+ zipEntries.push({ filename: getUniqueZipFileName(entry.targetFileName), data: entry.file });
209
+ }
203
210
  if (zipEntries.length > 0) {
204
211
  const zipFileName = settings.zipFileName.trim().toLowerCase().endsWith('.zip')
205
212
  ? settings.zipFileName.trim()
206
213
  : settings.zipFileName.trim() + '.zip';
207
- // Crea il blob ZIP
208
- setIsCreatingZip(true);
209
- setZipProgressMax(zipEntries.length);
210
- setZipProgressValue(0);
211
- setZipProgressText(SDKUI_Localizator.CompressToZipFile);
214
+ // Crea il blob ZIP: la compressione non e' interrompibile, quindi niente Interrompi.
215
+ const zipPanel = TMWaitPanelManager.show({
216
+ title: SDKUI_Localizator.CompressToZipFile,
217
+ subtitle: SDKUI_Localizator.CompressToZipFile,
218
+ max: zipEntries.length,
219
+ showCounters: false,
220
+ });
212
221
  try {
213
222
  const zipBlob = await ZipManager.createZip(zipEntries, {
214
223
  compressionLevel: 6,
215
224
  password: settings.zipPassword.trim() || undefined,
216
225
  onProgress: (current, total, filename) => {
217
- setZipProgressValue(current);
218
- setZipProgressText(`${SDKUI_Localizator.CompressToZipFile}: ${filename}`);
226
+ zipPanel.update({ value: current, subtitle: `${SDKUI_Localizator.CompressToZipFile}: ${filename}` });
219
227
  },
220
228
  });
221
229
  // Se c'è un handle della cartella: salva direttamente nella cartella selezionata
@@ -247,7 +255,7 @@ const TMCopyToFolderForm = ({ mode, selectedDcmtInfos, onClose, showTMRelationVi
247
255
  ShowAlert({ message: SDKUI_Localizator.Error, mode: 'error', duration: 5000, title: SDKUI_Localizator.CompressToZipFile });
248
256
  }
249
257
  finally {
250
- setIsCreatingZip(false);
258
+ zipPanel.close();
251
259
  }
252
260
  }
253
261
  }
@@ -377,25 +385,25 @@ const TMCopyToFolderForm = ({ mode, selectedDcmtInfos, onClose, showTMRelationVi
377
385
  { value: 'skip', display: SDKUI_Localizator.DoNotCopy },
378
386
  { value: 'rename', display: SDKUI_Localizator.CopyButRename },
379
387
  ], value: isUsingDefaultDownloads ? 'rename' : settings.fileExistsMode, direction: "row", disabled: isUsingDefaultDownloads, onValueChanged: (value) => updateSettings('fileExistsMode', value), fontSize: '0.9rem' }) }), isUsingDefaultDownloads && (_jsx("span", { style: { fontSize: '0.8rem', color: '#888', fontStyle: 'italic', marginTop: '4px', display: 'block' }, children: SDKUI_Localizator.BrowserAutoRenamesDuplicateFilesInDownloadsFolder }))] }) }), fileNamingRow, formatSelectorsRow] })), settings.exportMode === 'zip' && (_jsxs("div", { style: { display: 'flex', flexWrap: 'wrap', columnGap: '10px' }, children: [_jsxs("div", { style: { display: 'flex', flexWrap: 'wrap', columnGap: '10px', width: '100%' }, children: [folderSelector, _jsx("div", { style: { flex: '1 1 280px', minWidth: '280px' }, children: _jsx(TMTextBox, { label: SDKUI_Localizator.ZipFileName, value: settings.zipFileName, validationItems: zipValidationItems, autoComplete: "one-time-code", onValueChanged: (e) => updateSettings('zipFileName', e.target.value) }) }), _jsx("div", { style: { flex: '1 1 280px', minWidth: '280px' }, children: _jsx(TMTextBox, { label: SDKUI_Localizator.ProtectWithPasswordOptional, value: settings.zipPassword, type: "password", autoComplete: "one-time-code", onValueChanged: (e) => updateSettings('zipPassword', e.target.value) }) })] }), fileNamingRow, formatSelectorsRow] }))] })] }));
380
- return (_jsx(TMLayoutWaitingContainer, { direction: 'vertical', showWaitPanel: showWaitPanel || isCreatingZip, showWaitPanelPrimary: isCreatingZip ? true : showPrimary, showWaitPanelSecondary: isCreatingZip ? false : showSecondary, waitPanelTitle: isCreatingZip ? SDKUI_Localizator.CompressToZipFile : waitPanelTitle, waitPanelTextPrimary: isCreatingZip ? zipProgressText : waitPanelTextPrimary, waitPanelValuePrimary: isCreatingZip ? zipProgressValue : waitPanelValuePrimary, waitPanelMaxValuePrimary: isCreatingZip ? zipProgressMax : waitPanelMaxValuePrimary, waitPanelTextSecondary: isCreatingZip ? '' : waitPanelTextSecondary, waitPanelValueSecondary: isCreatingZip ? 0 : waitPanelValueSecondary, waitPanelMaxValueSecondary: isCreatingZip ? 0 : waitPanelMaxValueSecondary, isCancelable: !isCreatingZip, abortController: abortController, usePortal: true, children: _jsx(TMModal, { width: calcResponsiveSizes(deviceType, showTMRelationViewer ? '95%' : '950px', '95%', '95%'), height: showTMRelationViewer ? '95%' : 'auto', title: getTitle(), onClose: onClose, showCloseButton: true, children: _jsxs("div", { onContextMenu: (e) => e.preventDefault(), style: { display: 'flex', flexDirection: 'column', padding: '4px 4px 16px 4px', width: '100%', height: '100%', boxSizing: 'border-box', overflow: 'hidden' }, children: [showTMRelationViewer ? (_jsx("div", { style: { flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' }, children: _jsxs(TMSplitterLayout, { direction: 'vertical', showSeparator: true, separatorSize: 8, separatorColor: 'transparent', separatorActiveColor: 'transparent', overflow: 'hidden', min: ["50", "50"], start: ['65%', '35%'], children: [_jsx(TMDownloadRelationViewerSection, { selectedDcmtInfos: selectedDcmtInfos, onSelectionChanged: setSelectedItemsRelationViewer, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }), configSection] }, "TMCopyToFolder-relation-config") })) : (configSection), _jsx("div", { style: { display: 'flex', justifyContent: 'center', alignItems: 'center', flexShrink: 0, marginTop: '12px' }, children: _jsxs("button", { disabled: !isFormValid() || (showTMRelationViewer && selectedItemsRelationViewer.filter(i => i.isDcmt).length === 0), onClick: run, style: {
381
- display: 'flex',
382
- alignItems: 'center',
383
- justifyContent: 'center',
384
- gap: '6px',
385
- padding: '8px 20px',
386
- fontSize: '0.95rem',
387
- fontWeight: 600,
388
- color: '#fff',
389
- background: (!isFormValid() || (showTMRelationViewer && selectedItemsRelationViewer.filter(i => i.isDcmt).length === 0))
390
- ? '#b0b0b0'
391
- : 'linear-gradient(135deg, #28a745 0%, #218838 100%)',
392
- border: 'none',
393
- borderRadius: '6px',
394
- cursor: (!isFormValid() || (showTMRelationViewer && selectedItemsRelationViewer.filter(i => i.isDcmt).length === 0)) ? 'not-allowed' : 'pointer',
395
- boxShadow: (!isFormValid() || (showTMRelationViewer && selectedItemsRelationViewer.filter(i => i.isDcmt).length === 0))
396
- ? 'none'
397
- : '0 2px 8px rgba(40, 167, 69, 0.35)',
398
- transition: 'all 0.2s ease',
399
- }, children: [_jsx(IconPlay, {}), _jsx("span", { children: SDKUI_Localizator.Execute })] }) })] }) }) }));
388
+ return (_jsx(TMModal, { width: calcResponsiveSizes(deviceType, showTMRelationViewer ? '95%' : '950px', '95%', '95%'), height: showTMRelationViewer ? '95%' : 'auto', title: getTitle(), onClose: onClose, showCloseButton: true, children: _jsxs("div", { onContextMenu: (e) => e.preventDefault(), style: { display: 'flex', flexDirection: 'column', padding: '4px 4px 16px 4px', width: '100%', height: '100%', boxSizing: 'border-box', overflow: 'hidden' }, children: [showTMRelationViewer ? (_jsx("div", { style: { flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' }, children: _jsxs(TMSplitterLayout, { direction: 'vertical', showSeparator: true, separatorSize: 8, separatorColor: 'transparent', separatorActiveColor: 'transparent', overflow: 'hidden', min: ["50", "50"], start: ['65%', '35%'], children: [_jsx(TMDownloadRelationViewerSection, { selectedDcmtInfos: selectedDcmtInfos, onSelectionChanged: setSelectedItemsRelationViewer, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }), configSection] }, "TMCopyToFolder-relation-config") })) : (configSection), _jsx("div", { style: { display: 'flex', justifyContent: 'center', alignItems: 'center', flexShrink: 0, marginTop: '12px' }, children: _jsxs("button", { disabled: !isFormValid() || (showTMRelationViewer && selectedItemsRelationViewer.filter(i => i.isDcmt).length === 0), onClick: run, style: {
389
+ display: 'flex',
390
+ alignItems: 'center',
391
+ justifyContent: 'center',
392
+ gap: '6px',
393
+ padding: '8px 20px',
394
+ fontSize: '0.95rem',
395
+ fontWeight: 600,
396
+ color: '#fff',
397
+ background: (!isFormValid() || (showTMRelationViewer && selectedItemsRelationViewer.filter(i => i.isDcmt).length === 0))
398
+ ? '#b0b0b0'
399
+ : 'linear-gradient(135deg, #28a745 0%, #218838 100%)',
400
+ border: 'none',
401
+ borderRadius: '6px',
402
+ cursor: (!isFormValid() || (showTMRelationViewer && selectedItemsRelationViewer.filter(i => i.isDcmt).length === 0)) ? 'not-allowed' : 'pointer',
403
+ boxShadow: (!isFormValid() || (showTMRelationViewer && selectedItemsRelationViewer.filter(i => i.isDcmt).length === 0))
404
+ ? 'none'
405
+ : '0 2px 8px rgba(40, 167, 69, 0.35)',
406
+ transition: 'all 0.2s ease',
407
+ }, children: [_jsx(IconPlay, {}), _jsx("span", { children: SDKUI_Localizator.Execute })] }) })] }) }));
400
408
  };
401
409
  export default TMCopyToFolderForm;
@@ -3,7 +3,10 @@ import { HomeBlogPost, TaskDescriptor } from '@topconsultnpm/sdk-ts';
3
3
  interface ITMDcmtBlogProps {
4
4
  tid: number | undefined;
5
5
  did: number | undefined;
6
+ /** Il pannello è aperto. La inietta TMPanelWrapper, non va passata dal chiamante */
6
7
  isVisible?: boolean;
8
+ /** La pagina che contiene il pannello è a video: quelle in secondo piano restano montate e non devono caricare */
9
+ isPageVisible?: boolean;
7
10
  fetchBlogDataTrigger?: number;
8
11
  onRefreshBlogDatagrid?: () => Promise<void>;
9
12
  showFloatingCommentButton?: boolean;
@@ -8,7 +8,7 @@ import TMBlogCommentForm from '../blog/TMBlogCommentForm';
8
8
  import TMBlogsPost from '../../grids/TMBlogsPost';
9
9
  import TMSpinner from '../../base/TMSpinner';
10
10
  import { TMExceptionBoxManager } from '../../base/TMPopUp';
11
- const TMDcmtBlog = ({ tid, did, isVisible, fetchBlogDataTrigger, onRefreshBlogDatagrid, showFloatingCommentButton = true, allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, handleNavigateToWGs, handleNavigateToDossiers }) => {
11
+ const TMDcmtBlog = ({ tid, did, isVisible, isPageVisible = true, fetchBlogDataTrigger, onRefreshBlogDatagrid, showFloatingCommentButton = true, allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, handleNavigateToWGs, handleNavigateToDossiers }) => {
12
12
  const [blogsDatasource, setBlogsDatasource] = useState([]);
13
13
  const [hasLoadedDataOnce, setHasLoadedDataOnce] = useState(false); //traccia se *qualsiasi* dato è stato caricato per la prima volta
14
14
  const [lastLoadedDid, setLastLoadedDid] = useState(undefined); // `lastLoadedDid` tiene traccia dell'ultimo `did` per cui abbiamo caricato i dati
@@ -47,15 +47,15 @@ const TMDcmtBlog = ({ tid, did, isVisible, fetchBlogDataTrigger, onRefreshBlogDa
47
47
  return;
48
48
  }
49
49
  // Condizione per eseguire il fetch:
50
- // 1. Il pannello è visibile
50
+ // 1. Il pannello è visibile in una pagina a video
51
51
  // 2. E (non abbiamo ancora caricato dati o il `did` è cambiato rispetto all'ultima volta)
52
- const shouldFetch = isVisible && (!hasLoadedDataOnce || did !== lastLoadedDid);
52
+ const shouldFetch = isVisible && isPageVisible && (!hasLoadedDataOnce || did !== lastLoadedDid);
53
53
  // Esegui la chiamata API solo se il pannello è visibile E i dati non sono già stati caricati
54
54
  // O, se vuoi ricaricare ogni volta che diventa visibile (ma è meno efficiente per "pesante")
55
55
  if (shouldFetch) {
56
56
  fetchBlogDataAsync(tid, did);
57
57
  }
58
- }, [tid, did, isVisible, hasLoadedDataOnce, lastLoadedDid]);
58
+ }, [tid, did, isVisible, isPageVisible, hasLoadedDataOnce, lastLoadedDid]);
59
59
  const refreshCallback = async () => {
60
60
  await fetchBlogDataAsync(tid, did);
61
61
  await onRefreshBlogDatagrid?.();
@@ -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>;