@topconsultnpm/sdkui-react 6.22.0-dev2.9 → 6.22.0-t2

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 (214) hide show
  1. package/lib/components/NewComponents/ContextMenu/TMContextMenu.js +1 -1
  2. package/lib/components/NewComponents/ContextMenu/styles.d.ts +45 -43
  3. package/lib/components/NewComponents/FloatingMenuBar/TMFloatingMenuBar.js +1 -1
  4. package/lib/components/NewComponents/FloatingMenuBar/styles.d.ts +67 -60
  5. package/lib/components/base/Styled.d.ts +93 -77
  6. package/lib/components/base/TMCounterBar.d.ts +2 -2
  7. package/lib/components/base/TMCounterContainer.d.ts +2 -1
  8. package/lib/components/base/TMCustomButton.d.ts +1 -1
  9. package/lib/components/base/TMDataGrid.d.ts +2 -0
  10. package/lib/components/base/TMDataGrid.js +260 -8
  11. package/lib/components/base/TMDataGridExportForm.d.ts +2 -1
  12. package/lib/components/base/TMEditorBase.d.ts +2 -0
  13. package/lib/components/base/TMFileManager.d.ts +2 -1
  14. package/lib/components/base/TMFileManager.js +5 -3
  15. package/lib/components/base/TMFileManagerDataGridView.d.ts +2 -1
  16. package/lib/components/base/TMFileManagerDataGridView.js +11 -2
  17. package/lib/components/base/TMFileManagerThumbnailItems.d.ts +1 -1
  18. package/lib/components/base/TMFileManagerThumbnailItems.js +19 -9
  19. package/lib/components/base/TMFileManagerThumbnailsView.d.ts +1 -1
  20. package/lib/components/base/TMFileManagerUtils.d.ts +6 -6
  21. package/lib/components/base/TMFileManagerUtils.js +37 -1
  22. package/lib/components/base/TMLayout.d.ts +4 -4
  23. package/lib/components/base/TMList.d.ts +2 -1
  24. package/lib/components/base/TMListView.d.ts +1 -1
  25. package/lib/components/base/TMModal.d.ts +11 -0
  26. package/lib/components/base/TMModal.js +47 -13
  27. package/lib/components/base/TMPanel.d.ts +6 -0
  28. package/lib/components/base/TMPanel.js +138 -25
  29. package/lib/components/base/TMPopUp.js +3 -0
  30. package/lib/components/base/TMSpinner.d.ts +2 -1
  31. package/lib/components/base/TMTab.d.ts +4 -3
  32. package/lib/components/base/TMTooltip.d.ts +2 -1
  33. package/lib/components/base/TMTooltip.js +24 -8
  34. package/lib/components/base/TMTreeView.d.ts +14 -8
  35. package/lib/components/base/TMTreeView.js +108 -67
  36. package/lib/components/base/TMUserAvatar.d.ts +2 -1
  37. package/lib/components/base/TMVilViewer.d.ts +2 -1
  38. package/lib/components/base/TMWaitPanel.d.ts +3 -2
  39. package/lib/components/choosers/TMDcmtTypeChooser.js +4 -3
  40. package/lib/components/choosers/TMDistinctValues.d.ts +9 -7
  41. package/lib/components/choosers/TMDistinctValues.js +149 -142
  42. package/lib/components/choosers/TMDynDataListItemChooser.d.ts +1 -1
  43. package/lib/components/choosers/TMInvoiceRetrieveFormats.d.ts +2 -1
  44. package/lib/components/choosers/TMMetadataChooser.js +1 -1
  45. package/lib/components/choosers/TMOrderRetrieveFormats.d.ts +2 -1
  46. package/lib/components/choosers/TMQuickSearchInfo.d.ts +13 -0
  47. package/lib/components/choosers/TMQuickSearchInfo.js +279 -0
  48. package/lib/components/choosers/TMQuickSearchSettingsForm.d.ts +16 -0
  49. package/lib/components/choosers/TMQuickSearchSettingsForm.js +94 -0
  50. package/lib/components/choosers/TMRelationChooser.d.ts +3 -3
  51. package/lib/components/choosers/TMSelectedValuesSummary.d.ts +13 -0
  52. package/lib/components/choosers/TMSelectedValuesSummary.js +91 -0
  53. package/lib/components/choosers/TMUserChooser.d.ts +2 -2
  54. package/lib/components/editors/TMDropDown.d.ts +3 -0
  55. package/lib/components/editors/TMDropDown.js +197 -5
  56. package/lib/components/editors/TMEditorStyled.d.ts +20 -42
  57. package/lib/components/editors/TMFormulaEditor.d.ts +1 -1
  58. package/lib/components/editors/TMHtmlContentDisplay.d.ts +2 -1
  59. package/lib/components/editors/TMHtmlEditor.d.ts +2 -1
  60. package/lib/components/editors/TMTreeDropDown.d.ts +1 -1
  61. package/lib/components/features/archive/TMArchive.js +17 -3
  62. package/lib/components/features/assistant/TMToppyDraggableHelpCenter.d.ts +1 -1
  63. package/lib/components/features/blog/TMBlogCommentForm.d.ts +2 -1
  64. package/lib/components/features/documents/TMBatchUpdateForm.js +19 -5
  65. package/lib/components/features/documents/TMDcmtBlog.d.ts +3 -0
  66. package/lib/components/features/documents/TMDcmtBlog.js +4 -4
  67. package/lib/components/features/documents/TMDcmtForm.d.ts +7 -0
  68. package/lib/components/features/documents/TMDcmtForm.js +178 -51
  69. package/lib/components/features/documents/TMDcmtFormActionButtons.d.ts +12 -1
  70. package/lib/components/features/documents/TMDcmtFormActionButtons.js +77 -7
  71. package/lib/components/features/documents/TMDcmtIcon.d.ts +2 -1
  72. package/lib/components/features/documents/TMDcmtIcon.js +5 -3
  73. package/lib/components/features/documents/TMDcmtPreview.d.ts +8 -6
  74. package/lib/components/features/documents/TMDcmtPreview.js +10 -6
  75. package/lib/components/features/documents/TMDcmtTasks.d.ts +2 -1
  76. package/lib/components/features/documents/TMDragDropOverlay.d.ts +1 -1
  77. package/lib/components/features/documents/TMMasterDetailDcmts.js +95 -33
  78. package/lib/components/features/documents/TMMasterInfoFields.d.ts +20 -0
  79. package/lib/components/features/documents/TMMasterInfoFields.js +186 -0
  80. package/lib/components/features/documents/TMMergeToPdfForm.d.ts +3 -3
  81. package/lib/components/features/documents/TMMergeToPdfForm.js +30 -5
  82. package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.d.ts +46 -0
  83. package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.js +323 -0
  84. package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.d.ts +370 -0
  85. package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.js +283 -0
  86. package/lib/components/features/documents/TMRelationViewer.d.ts +14 -1
  87. package/lib/components/features/documents/TMRelationViewer.js +69 -20
  88. package/lib/components/features/search/TMDcmtCheckoutInfoForm.d.ts +2 -1
  89. package/lib/components/features/search/TMMetadataOutputForm.d.ts +2 -1
  90. package/lib/components/features/search/TMMetadataSorterForm.d.ts +2 -1
  91. package/lib/components/features/search/TMSavedQuerySelector.d.ts +2 -2
  92. package/lib/components/features/search/TMSearch.js +77 -11
  93. package/lib/components/features/search/TMSearchQueryEditor.js +5 -3
  94. package/lib/components/features/search/TMSearchQueryPanel.d.ts +13 -3
  95. package/lib/components/features/search/TMSearchQueryPanel.js +141 -67
  96. package/lib/components/features/search/TMSearchResult.d.ts +16 -0
  97. package/lib/components/features/search/TMSearchResult.js +429 -108
  98. package/lib/components/features/search/TMSearchResultFloatingActionButton.d.ts +1 -1
  99. package/lib/components/features/search/TMSignatureInfoContent.d.ts +2 -1
  100. package/lib/components/features/search/TMTreeSelector.js +109 -64
  101. package/lib/components/features/search/TMViewHistoryDcmt.d.ts +2 -1
  102. package/lib/components/features/tasks/TMTaskForm.d.ts +1 -1
  103. package/lib/components/features/tasks/TMTaskFormUtils.d.ts +10 -10
  104. package/lib/components/features/tasks/TMTasksAgenda.d.ts +1 -1
  105. package/lib/components/features/tasks/TMTasksCalendar.d.ts +1 -1
  106. package/lib/components/features/tasks/TMTasksHeader.d.ts +1 -1
  107. package/lib/components/features/tasks/TMTasksPanelContent.d.ts +1 -1
  108. package/lib/components/features/tasks/TMTasksUtilsView.d.ts +5 -5
  109. package/lib/components/features/tasks/TMTasksView.d.ts +1 -1
  110. package/lib/components/features/wg/TMWGsCopyMoveForm.d.ts +3 -2
  111. package/lib/components/features/workflow/TMWorkflowPopup.d.ts +18 -7
  112. package/lib/components/features/workflow/TMWorkflowPopup.js +8 -4
  113. package/lib/components/features/workflow/diagram/WorkitemRecipientsEditor.d.ts +3 -1
  114. package/lib/components/forms/Login/ChangePasswordInputs.d.ts +3 -1
  115. package/lib/components/forms/Login/Chooser.d.ts +2 -2
  116. package/lib/components/forms/TMChooserForm.d.ts +2 -1
  117. package/lib/components/forms/TMSaveForm.d.ts +4 -4
  118. package/lib/components/grids/TMBlogAttachments.d.ts +2 -1
  119. package/lib/components/grids/TMBlogAttachments.js +13 -2
  120. package/lib/components/grids/TMBlogHeader.d.ts +1 -1
  121. package/lib/components/grids/TMBlogHeader.js +5 -1
  122. package/lib/components/grids/TMBlogsPost.d.ts +3 -1
  123. package/lib/components/grids/TMBlogsPost.js +31 -4
  124. package/lib/components/grids/TMBlogsPostUtils.d.ts +10 -9
  125. package/lib/components/grids/TMBlogsPostUtils.js +14 -3
  126. package/lib/components/grids/TMValidationItemsList.d.ts +2 -1
  127. package/lib/components/layout/panelManager/TMPanelManagerContainer.d.ts +3 -1
  128. package/lib/components/layout/panelManager/TMPanelManagerContainer.js +24 -14
  129. package/lib/components/layout/panelManager/TMPanelManagerContext.d.ts +2 -2
  130. package/lib/components/layout/panelManager/TMPanelManagerContext.js +68 -93
  131. package/lib/components/layout/panelManager/TMPanelManagerToolbar.d.ts +5 -6
  132. package/lib/components/layout/panelManager/TMPanelManagerWithPersistenceProvider.d.ts +2 -2
  133. package/lib/components/layout/panelManager/TMPanelWrapper.d.ts +2 -2
  134. package/lib/components/layout/panelManager/TMPanelWrapper.js +2 -2
  135. package/lib/components/layout/panelManager/types.d.ts +3 -0
  136. package/lib/components/layout/panelManager/utils.js +13 -11
  137. package/lib/components/pages/TMPage.d.ts +1 -1
  138. package/lib/components/query/TMQueryEditor.d.ts +14 -10
  139. package/lib/components/settings/SettingsAppearance.d.ts +2 -1
  140. package/lib/components/sidebar/TMAboutApp.d.ts +2 -1
  141. package/lib/components/sidebar/TMCommandsPanel.d.ts +4 -4
  142. package/lib/components/sidebar/TMHeader.d.ts +3 -3
  143. package/lib/components/sidebar/TMHeader.js +30 -20
  144. package/lib/components/viewers/TMDataListItemViewer.d.ts +3 -2
  145. package/lib/components/viewers/TMDataUserIdItemViewer.d.ts +3 -2
  146. package/lib/components/viewers/TMMidViewer.d.ts +2 -2
  147. package/lib/components/viewers/TMMidViewer.js +4 -1
  148. package/lib/components/viewers/TMTidViewer.d.ts +2 -2
  149. package/lib/components/viewers/TMTidViewer.js +86 -25
  150. package/lib/css/tm-sdkui.css +1 -1
  151. package/lib/devextreme-license.d.ts +1 -0
  152. package/lib/devextreme-license.js +3 -0
  153. package/lib/helper/SDKUI_Globals.d.ts +110 -0
  154. package/lib/helper/SDKUI_Globals.js +151 -0
  155. package/lib/helper/SDKUI_Localizator.d.ts +44 -0
  156. package/lib/helper/SDKUI_Localizator.js +440 -0
  157. package/lib/helper/TMAppUpdatedModal.d.ts +2 -0
  158. package/lib/helper/TMAppUpdatedModal.js +134 -0
  159. package/lib/helper/TMCommandsContextMenu.d.ts +1 -1
  160. package/lib/helper/TMIcons.d.ts +280 -279
  161. package/lib/helper/TMIcons.js +3 -0
  162. package/lib/helper/TMPdfViewer.d.ts +2 -1
  163. package/lib/helper/TMToppyMessage.d.ts +2 -2
  164. package/lib/helper/TMUtils.d.ts +23 -4
  165. package/lib/helper/TMUtils.js +24 -2
  166. package/lib/helper/dataGridSearchHelper.d.ts +28 -0
  167. package/lib/helper/dataGridSearchHelper.js +51 -0
  168. package/lib/helper/dcmtsHelper.d.ts +20 -0
  169. package/lib/helper/dcmtsHelper.js +58 -1
  170. package/lib/helper/helpers.d.ts +12 -1
  171. package/lib/helper/helpers.js +25 -1
  172. package/lib/helper/index.d.ts +2 -0
  173. package/lib/helper/index.js +2 -0
  174. package/lib/helper/queryHelper.d.ts +6 -1
  175. package/lib/helper/queryHelper.js +8 -3
  176. package/lib/hooks/tmDistinctValuesGridHelper.d.ts +16 -0
  177. package/lib/hooks/tmDistinctValuesGridHelper.js +31 -0
  178. package/lib/hooks/useArchiveListForm.d.ts +39 -0
  179. package/lib/hooks/useArchiveListForm.js +46 -0
  180. package/lib/hooks/useCaseFlowApprove.d.ts +56 -0
  181. package/lib/hooks/useCaseFlowApprove.js +157 -0
  182. package/lib/hooks/useDataUserIdItem.d.ts +1 -0
  183. package/lib/hooks/useDataUserIdItem.js +1 -0
  184. package/lib/hooks/useDocumentOperations.d.ts +4 -0
  185. package/lib/hooks/useDocumentOperations.js +52 -10
  186. package/lib/hooks/useInputDialog.d.ts +2 -1
  187. package/lib/hooks/useMultiMasterDetailDcmts.d.ts +113 -0
  188. package/lib/hooks/useMultiMasterDetailDcmts.js +760 -0
  189. package/lib/hooks/useRelatedDocuments.d.ts +1 -0
  190. package/lib/hooks/useRelatedDocuments.js +22 -27
  191. package/lib/hooks/useShowDossiersV5.d.ts +12 -0
  192. package/lib/hooks/useShowDossiersV5.js +37 -0
  193. package/lib/hooks/useTMDistinctValuesMetadataDisplay.d.ts +18 -0
  194. package/lib/hooks/useTMDistinctValuesMetadataDisplay.js +103 -0
  195. package/lib/hooks/useTMDistinctValuesQuickSearch.d.ts +49 -0
  196. package/lib/hooks/useTMDistinctValuesQuickSearch.js +307 -0
  197. package/lib/hooks/useTMDistinctValuesSelection.d.ts +42 -0
  198. package/lib/hooks/useTMDistinctValuesSelection.js +103 -0
  199. package/lib/hooks/useTMDistinctValuesSource.d.ts +29 -0
  200. package/lib/hooks/useTMDistinctValuesSource.js +105 -0
  201. package/lib/index.d.ts +2 -0
  202. package/lib/index.js +5 -2
  203. package/lib/services/caseflow/CaseFlowService.d.ts +236 -0
  204. package/lib/services/caseflow/CaseFlowService.js +693 -0
  205. package/lib/services/caseflow/CaseFlowTemplateCacheService.d.ts +28 -0
  206. package/lib/services/caseflow/CaseFlowTemplateCacheService.js +121 -0
  207. package/lib/services/caseflow/caseFlowNameCache.d.ts +32 -0
  208. package/lib/services/caseflow/caseFlowNameCache.js +116 -0
  209. package/lib/services/caseflow/caseFlowWorkItemUtils.d.ts +61 -0
  210. package/lib/services/caseflow/caseFlowWorkItemUtils.js +113 -0
  211. package/lib/services/index.d.ts +4 -0
  212. package/lib/services/index.js +4 -0
  213. package/lib/services/platform_services.d.ts +4 -3
  214. package/package.json +9 -5
@@ -132,6 +132,19 @@ export interface TMRelationViewerProps {
132
132
  * Useful to disable interactions (like context menu) during loading.
133
133
  */
134
134
  onLoadingStateChanged?: (isLoading: boolean) => void;
135
+ /**
136
+ * Invoked on mount to hand over a function that stops the ongoing correlations
137
+ * calculation: no further GetMetadata calls are performed and only the
138
+ * correlations already calculated are kept.
139
+ * The function is synchronous, so it can be safely called right before
140
+ * unmounting the viewer (e.g. when navigating back).
141
+ */
142
+ onStopCalculationReady?: (stopCalculation: () => void) => void;
143
+ /**
144
+ * Callback invoked when the calculation has actually been stopped
145
+ * (loadData terminated after an abort request).
146
+ */
147
+ onCalculationStopped?: () => void;
135
148
  }
136
149
  /**
137
150
  * Check if document type has detail relations
@@ -150,7 +163,7 @@ export declare const getDisplayValueByColumn: (col: DataColumnDescriptor | undef
150
163
  * For each document, fetches complete metadata using GetMetadataAsync to ensure
151
164
  * all metadata properties (isSpecialSearchOutput, permissions, etc.) are available
152
165
  */
153
- export declare const searchResultToDataSource: (searchResult: SearchResultDescriptor | undefined, hideSysMetadata?: boolean) => Promise<any[]>;
166
+ export declare const searchResultToDataSource: (searchResult: SearchResultDescriptor | undefined, hideSysMetadata?: boolean, signal?: AbortSignal) => Promise<any[]>;
154
167
  export declare const DEFAULT_RELATION_EXPAND_LEVEL = 4;
155
168
  declare const TMRelationViewer: React.FC<TMRelationViewerProps>;
156
169
  export default TMRelationViewer;
@@ -70,7 +70,7 @@ export const getDisplayValueByColumn = (col, value) => {
70
70
  * For each document, fetches complete metadata using GetMetadataAsync to ensure
71
71
  * all metadata properties (isSpecialSearchOutput, permissions, etc.) are available
72
72
  */
73
- export const searchResultToDataSource = async (searchResult, hideSysMetadata) => {
73
+ export const searchResultToDataSource = async (searchResult, hideSysMetadata, signal) => {
74
74
  const rows = searchResult?.dtdResult?.rows ?? [];
75
75
  const output = [];
76
76
  // Find TID and DID column indices
@@ -78,6 +78,9 @@ export const searchResultToDataSource = async (searchResult, hideSysMetadata) =>
78
78
  const tidColIndex = columns.findIndex(col => col.caption?.toUpperCase() === 'TID');
79
79
  const didColIndex = columns.findIndex(col => col.caption?.toUpperCase() === 'DID');
80
80
  for (let index = 0; index < rows.length; index++) {
81
+ // Interruzione richiesta dall'utente: restituisce i documenti già elaborati
82
+ if (signal?.aborted)
83
+ break;
81
84
  const row = rows[index];
82
85
  // Extract TID and DID from row
83
86
  const tid = tidColIndex >= 0 ? Number(row[tidColIndex]) : searchResult?.fromTID;
@@ -144,7 +147,7 @@ export const searchResultToDataSource = async (searchResult, hideSysMetadata) =>
144
147
  return output;
145
148
  };
146
149
  export const DEFAULT_RELATION_EXPAND_LEVEL = 4; // Default maximum depth level for expansion (can be adjusted)
147
- const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndicator = true, allowShowZeroDcmts = true, initialShowZeroDcmts = false, allowedTIDs, allowMultipleSelection = false, focusedItem, selectedItems, onFocusedItemChanged, onSelectedItemsChanged, onAllItemsChanged, onDocumentDoubleClick, customItemRender, customDocumentStyle, customMainContainerContent, customDocumentContent, showMetadataNames = false, maxDepthLevel = 2, invertMasterNavigation = true, additionalStaticItems, showMainDocument = true, labelMainContainer, onNoRelationsFound, onItemContextMenu, focusedItemFormData = [], showExpandAllButton = false, defaultExpandAll = false, onLoadingStateChanged }) => {
150
+ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndicator = true, allowShowZeroDcmts = true, initialShowZeroDcmts = false, allowedTIDs, allowMultipleSelection = false, focusedItem, selectedItems, onFocusedItemChanged, onSelectedItemsChanged, onAllItemsChanged, onDocumentDoubleClick, customItemRender, customDocumentStyle, customMainContainerContent, customDocumentContent, showMetadataNames = false, maxDepthLevel = 2, invertMasterNavigation = true, additionalStaticItems, showMainDocument = true, labelMainContainer, onNoRelationsFound, onItemContextMenu, focusedItemFormData = [], showExpandAllButton = false, defaultExpandAll = false, onLoadingStateChanged, onStopCalculationReady, onCalculationStopped }) => {
148
151
  // State
149
152
  const [dcmtTypes, setDcmtTypes] = useState([]);
150
153
  const [treeData, setTreeData] = useState([]);
@@ -159,6 +162,8 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
159
162
  const [waitPanelValuePrimary, setWaitPanelValuePrimary] = useState(0);
160
163
  const [waitPanelMaxValuePrimary, setWaitPanelMaxValuePrimary] = useState(0);
161
164
  const [abortController] = useState(new AbortController());
165
+ // True quando l'utente ha interrotto il calcolo delle correlazioni (pulsante "Interrompi")
166
+ const [loadStoppedByUser, setLoadStoppedByUser] = useState(false);
162
167
  const [showExpansionWaitPanel, setShowExpansionWaitPanel] = useState(false);
163
168
  const [expansionWaitPanelText, setExpansionWaitPanelText] = useState('');
164
169
  const [expansionWaitPanelValue, setExpansionWaitPanelValue] = useState(0);
@@ -191,6 +196,27 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
191
196
  const isLoading = showWaitPanel || showExpansionWaitPanel;
192
197
  onLoadingStateChanged?.(isLoading);
193
198
  }, [showWaitPanel, showExpansionWaitPanel, onLoadingStateChanged]);
199
+ // Mantiene l'AbortController dell'espansione in corso accessibile da callback stabili
200
+ const expansionAbortControllerRef = React.useRef(undefined);
201
+ useEffect(() => {
202
+ expansionAbortControllerRef.current = expansionAbortController;
203
+ }, [expansionAbortController]);
204
+ /**
205
+ * Interrompe il calcolo delle correlazioni (iniziale e/o espansione in corso):
206
+ * non vengono eseguite ulteriori chiamate GetMetadata e vengono mantenute
207
+ * solo le correlazioni già calcolate.
208
+ * È sincrona: può essere invocata immediatamente prima di smontare il viewer
209
+ * (es. pulsante "Indietro"), quando un effect non farebbe in tempo.
210
+ */
211
+ const stopCalculation = useCallback(() => {
212
+ if (!abortController.signal.aborted)
213
+ abortController.abort();
214
+ expansionAbortControllerRef.current?.abort();
215
+ }, [abortController]);
216
+ // Espone la funzione di interruzione al componente padre
217
+ useEffect(() => {
218
+ onStopCalculationReady?.(stopCalculation);
219
+ }, [onStopCalculationReady, stopCalculation]);
194
220
  // Sincronizza expandLevel quando userSettings.searchSettings.relationExpandLevel cambia
195
221
  useEffect(() => {
196
222
  const globalExpandLevel = SDKUI_Globals.userSettings?.searchSettings?.relationExpandLevel;
@@ -220,7 +246,7 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
220
246
  /**
221
247
  * Recursively retrieve detail documents (adapted from TMMasterDetailDcmts.tsx)
222
248
  */
223
- const getDetailDcmtsAsync = useCallback(async (mTID, mDID, maxLevel) => {
249
+ const getDetailDcmtsAsync = useCallback(async (mTID, mDID, maxLevel, signal) => {
224
250
  const items = [];
225
251
  if (!mTID)
226
252
  return [];
@@ -240,6 +266,9 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
240
266
  return items;
241
267
  const results = await searchEngine.GetAllDetailDcmtsAsync(mTID, mDID) ?? [];
242
268
  for (const searchResult of results) {
269
+ // Interruzione richiesta dall'utente: restituisce le correlazioni già calcolate
270
+ if (signal?.aborted)
271
+ break;
243
272
  // Skip if allowedTIDs is set and this TID is not allowed
244
273
  if (allowedTIDs && searchResult.fromTID && !allowedTIDs.includes(searchResult.fromTID)) {
245
274
  continue;
@@ -261,7 +290,7 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
261
290
  expanded: false,
262
291
  hidden: false
263
292
  };
264
- const source = await searchResultToDataSource(searchResult);
293
+ const source = await searchResultToDataSource(searchResult, undefined, signal);
265
294
  if (source && source.length > 0) {
266
295
  const dcmtDetails = [];
267
296
  // Check once if this document type can have detail relations
@@ -307,7 +336,7 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
307
336
  /**
308
337
  * Recursively retrieve master documents
309
338
  */
310
- const getMasterDcmtsAsync = useCallback(async (dTID, dDID, maxLevel) => {
339
+ const getMasterDcmtsAsync = useCallback(async (dTID, dDID, maxLevel, signal) => {
311
340
  const items = [];
312
341
  if (!dTID)
313
342
  return [];
@@ -327,6 +356,9 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
327
356
  return items;
328
357
  const results = await searchEngine.GetAllMasterDcmtsAsync(dTID, dDID) ?? [];
329
358
  for (const searchResult of results) {
359
+ // Interruzione richiesta dall'utente: restituisce le correlazioni già calcolate
360
+ if (signal?.aborted)
361
+ break;
330
362
  // Skip if allowedTIDs is set and this TID is not allowed
331
363
  if (allowedTIDs && searchResult.fromTID && !allowedTIDs.includes(searchResult.fromTID)) {
332
364
  continue;
@@ -348,7 +380,7 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
348
380
  expanded: false,
349
381
  hidden: false
350
382
  };
351
- const source = await searchResultToDataSource(searchResult);
383
+ const source = await searchResultToDataSource(searchResult, undefined, signal);
352
384
  if (source && source.length > 0) {
353
385
  const dcmtMasters = [];
354
386
  // Check once if this document type can have master relations (for inverted mode)
@@ -576,7 +608,7 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
576
608
  }
577
609
  const dtd = await DcmtTypeListCacheService.GetAsync(dcmt.TID);
578
610
  // Parse document values
579
- const docValues = await searchResultToDataSource(result);
611
+ const docValues = await searchResultToDataSource(result, undefined, abortController.signal);
580
612
  const docRow = docValues.length > 0 ? docValues[0] : undefined;
581
613
  // Generate unique GUID for this container
582
614
  const containerGUID = genUniqueId();
@@ -585,16 +617,21 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
585
617
  // ========================================================================
586
618
  if (isForMaster && !invertMasterNavigation) {
587
619
  // Carica i master documents
588
- const masterDocs = await getMasterDcmtsAsync(dcmt.TID, dcmt.DID, maxDepthLevel);
620
+ const masterDocs = await getMasterDcmtsAsync(dcmt.TID, dcmt.DID, maxDepthLevel, abortController.signal);
589
621
  // Per ogni master, carica i suoi detail (incluso il documento corrente)
590
622
  for (const masterContainer of masterDocs) {
623
+ if (abortController.signal.aborted)
624
+ break;
591
625
  if (!masterContainer.items)
592
626
  continue;
593
627
  // Per ogni master document nel container, carica i detail
594
628
  for (const masterDoc of masterContainer.items) {
629
+ // Interruzione richiesta dall'utente: mantiene i dati già calcolati
630
+ if (abortController.signal.aborted)
631
+ break;
595
632
  if (masterDoc.tid && masterDoc.did) {
596
633
  // Carica i detail del master (incluso il documento di partenza)
597
- const detailDocs = await getDetailDcmtsAsync(masterDoc.tid, masterDoc.did, 1);
634
+ const detailDocs = await getDetailDcmtsAsync(masterDoc.tid, masterDoc.did, 1, abortController.signal);
598
635
  masterDoc.items = detailDocs;
599
636
  masterDoc.itemsCount = detailDocs.length;
600
637
  masterDoc.isLoaded = true;
@@ -627,8 +664,8 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
627
664
  else {
628
665
  // Load related documents (detail or master based on isForMaster flag)
629
666
  const relatedDocs = isForMaster
630
- ? await getMasterDcmtsAsync(dcmt.TID, dcmt.DID, maxDepthLevel)
631
- : await getDetailDcmtsAsync(dcmt.TID, dcmt.DID, maxDepthLevel);
667
+ ? await getMasterDcmtsAsync(dcmt.TID, dcmt.DID, maxDepthLevel, abortController.signal)
668
+ : await getDetailDcmtsAsync(dcmt.TID, dcmt.DID, maxDepthLevel, abortController.signal);
632
669
  // Se showMainDocument è false, mostra i container dei dettagli direttamente sotto il container principale
633
670
  if (!showMainDocument) {
634
671
  // Check if a container for this TID already exists in the tree
@@ -775,8 +812,15 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
775
812
  // Check recursively if there are any actual documents
776
813
  return hasNoActualDocuments(container.items);
777
814
  });
815
+ // Calcolo interrotto dall'utente: mostra solo ciò che è stato calcolato,
816
+ // senza notificare l'assenza di correlazioni (il risultato è parziale, non definitivo)
817
+ const wasStopped = abortController.signal.aborted;
818
+ if (wasStopped) {
819
+ setLoadStoppedByUser(true);
820
+ onCalculationStopped?.();
821
+ }
778
822
  // If no relations found, notify parent
779
- if (hasNoRelations && onNoRelationsFound) {
823
+ if (!wasStopped && hasNoRelations && onNoRelationsFound) {
780
824
  onNoRelationsFound();
781
825
  }
782
826
  // Update metadata error count state
@@ -804,7 +848,7 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
804
848
  // Now it will correctly detect expanded nodes and add infoMessage if all children are hidden
805
849
  const processedTree = updateHiddenProperty(expandedTree);
806
850
  setTreeData(processedTree);
807
- }, [inputDcmts, dcmtTypes, maxDepthLevel, isForMaster, invertMasterNavigation, getDetailDcmtsAsync, getMasterDcmtsAsync, abortController, updateHiddenProperty, showMainDocument, labelMainContainer, onNoRelationsFound]);
851
+ }, [inputDcmts, dcmtTypes, maxDepthLevel, isForMaster, invertMasterNavigation, getDetailDcmtsAsync, getMasterDcmtsAsync, abortController, updateHiddenProperty, showMainDocument, labelMainContainer, onNoRelationsFound, onCalculationStopped]);
808
852
  /**
809
853
  * Merge main tree data with additional static items
810
854
  */
@@ -1047,15 +1091,15 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
1047
1091
  let loadedItems = [];
1048
1092
  if (isForMaster && !invertMasterNavigation) {
1049
1093
  // Original mode: detail documents load detail documents (natural detail→detail navigation)
1050
- loadedItems = await getDetailDcmtsAsync(node.tid, node.did, 1);
1094
+ loadedItems = await getDetailDcmtsAsync(node.tid, node.did, 1, newAbortController.signal);
1051
1095
  }
1052
1096
  else if (isForMaster) {
1053
1097
  // Inverted master mode: load master documents
1054
- loadedItems = await getMasterDcmtsAsync(node.tid, node.did, 1);
1098
+ loadedItems = await getMasterDcmtsAsync(node.tid, node.did, 1, newAbortController.signal);
1055
1099
  }
1056
1100
  else {
1057
1101
  // Standard mode: load detail documents
1058
- loadedItems = await getDetailDcmtsAsync(node.tid, node.did, 1);
1102
+ loadedItems = await getDetailDcmtsAsync(node.tid, node.did, 1, newAbortController.signal);
1059
1103
  }
1060
1104
  // Espandi automaticamente il primo container se ci sono documenti correlati
1061
1105
  if (loadedItems.length > 0 && loadedItems[0].isContainer) {
@@ -1417,13 +1461,13 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
1417
1461
  let loadedItems = [];
1418
1462
  // Carica i documenti correlati (detail o master in base alla modalità)
1419
1463
  if (isForMaster && !invertMasterNavigation) {
1420
- loadedItems = await getDetailDcmtsAsync(node.tid, node.did, 1);
1464
+ loadedItems = await getDetailDcmtsAsync(node.tid, node.did, 1, newAbortController.signal);
1421
1465
  }
1422
1466
  else if (isForMaster) {
1423
- loadedItems = await getMasterDcmtsAsync(node.tid, node.did, 1);
1467
+ loadedItems = await getMasterDcmtsAsync(node.tid, node.did, 1, newAbortController.signal);
1424
1468
  }
1425
1469
  else {
1426
- loadedItems = await getDetailDcmtsAsync(node.tid, node.did, 1);
1470
+ loadedItems = await getDetailDcmtsAsync(node.tid, node.did, 1, newAbortController.signal);
1427
1471
  }
1428
1472
  // Applica le regole di visibilità (showZeroDcmts)
1429
1473
  expandedNode.items = updateHiddenProperty(loadedItems);
@@ -1524,6 +1568,10 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
1524
1568
  return _jsx("div", { style: { padding: '20px', textAlign: 'center' }, children: _jsx(TMWaitPanel, { title: SDKUI_Localizator.LoadingDetailDocuments, showPrimary: true, textPrimary: waitPanelTextPrimary, valuePrimary: waitPanelValuePrimary, maxValuePrimary: waitPanelMaxValuePrimary, isCancelable: true, abortController: abortController, onAbortClick: () => { setTimeout(() => { abortController.abort(); }, 1000); } }) });
1525
1569
  }
1526
1570
  if (mergedTreeData.length === 0) {
1571
+ // Calcolo interrotto dall'utente prima di aver calcolato qualsiasi correlazione
1572
+ if (loadStoppedByUser) {
1573
+ return _jsx(TMToppyMessage, { message: SDKUI_Localizator.RelationsCalculationStopped });
1574
+ }
1527
1575
  // Se NON isForMaster e tutti i GetMetadataAsync sono falliti
1528
1576
  if (!isForMaster && metadataErrorCount === inputDcmts.length) {
1529
1577
  return _jsx(TMToppyMessage, { message: SDKUI_Localizator.DocumentsNotAvailableOrNoCorrelations });
@@ -1534,7 +1582,8 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
1534
1582
  return _jsx("div", { style: { padding: '20px', textAlign: 'center', color: '#666' }, children: SDKUI_Localizator.NoRelationsAvailable });
1535
1583
  }
1536
1584
  // Se isForMaster e non ci sono master documents disponibili
1537
- if (isForMaster && totalMasterDocuments === 0) {
1585
+ // (se il calcolo è stato interrotto l'albero parziale viene comunque mostrato)
1586
+ if (isForMaster && totalMasterDocuments === 0 && !loadStoppedByUser) {
1538
1587
  return _jsx(TMToppyMessage, { message: SDKUI_Localizator.NoMasterDocumentsAvailable });
1539
1588
  }
1540
1589
  return (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', height: '100%', minHeight: 0, width: '100%' }, children: [showExpandAllButton && (_jsxs("div", { style: { flexShrink: 0, display: 'flex', alignItems: 'center', gap: '6px', height: '40px', paddingLeft: '10px', backgroundColor: TMColors.toolbar_background }, children: [_jsx(TMTooltip, { content: expandLevel === 0
@@ -1,8 +1,9 @@
1
+ import React from "react";
1
2
  import { DcmtInfo } from "../../../ts";
2
3
  interface TMDcmtCheckoutInfoFormProps {
3
4
  dtdName: string;
4
5
  selectedDcmtOrFocused: DcmtInfo;
5
6
  onClose: () => void;
6
7
  }
7
- declare const TMDcmtCheckoutInfoForm: (props: TMDcmtCheckoutInfoFormProps) => import("react/jsx-runtime").JSX.Element;
8
+ declare const TMDcmtCheckoutInfoForm: (props: TMDcmtCheckoutInfoFormProps) => React.JSX.Element;
8
9
  export default TMDcmtCheckoutInfoForm;
@@ -1,3 +1,4 @@
1
+ import React from "react";
1
2
  import { MetadataDescriptor, QueryDescriptor, SelectItem } from "@topconsultnpm/sdk-ts";
2
3
  interface TMMetadataOutputFormProps {
3
4
  /** QueryDescriptor da cui estrarre i metadati disponibili */
@@ -13,5 +14,5 @@ interface TMMetadataOutputFormProps {
13
14
  /** Callback chiamata quando l'utente conferma la selezione dei SelectItem */
14
15
  onChoose?: (selectItems: SelectItem[] | undefined) => void;
15
16
  }
16
- declare const TMMetadataOutputForm: (props: TMMetadataOutputFormProps) => import("react/jsx-runtime").JSX.Element;
17
+ declare const TMMetadataOutputForm: (props: TMMetadataOutputFormProps) => React.JSX.Element;
17
18
  export default TMMetadataOutputForm;
@@ -1,3 +1,4 @@
1
+ import React from "react";
1
2
  import { MetadataDescriptor, OrderByItem, QueryDescriptor } from "@topconsultnpm/sdk-ts";
2
3
  interface TMMetadataSorterFormProps {
3
4
  /** QueryDescriptor da cui estrarre i metadati disponibili */
@@ -13,5 +14,5 @@ interface TMMetadataSorterFormProps {
13
14
  /** Callback chiamata quando l'utente conferma la selezione degli OrderByItem */
14
15
  onChoose?: (orderByItems: OrderByItem[] | undefined) => void;
15
16
  }
16
- declare const TMMetadataSorterForm: (props: TMMetadataSorterFormProps) => import("react/jsx-runtime").JSX.Element;
17
+ declare const TMMetadataSorterForm: (props: TMMetadataSorterFormProps) => React.JSX.Element;
17
18
  export default TMMetadataSorterForm;
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { SavedQueryDescriptor } from '@topconsultnpm/sdk-ts';
3
- export declare const getTooltipBySqd: (sqd: SavedQueryDescriptor | undefined) => import("react/jsx-runtime").JSX.Element | null;
3
+ export declare const getTooltipBySqd: (sqd: SavedQueryDescriptor | undefined) => React.JSX.Element | null;
4
4
  interface ITMSavedQuerySelectorProps {
5
5
  height?: string;
6
6
  items?: SavedQueryDescriptor[];
@@ -12,5 +12,5 @@ interface ITMSavedQuerySelectorProps {
12
12
  refreshFavoriteSavedQueries?: (sqd: SavedQueryDescriptor) => void;
13
13
  onRefreshData?: () => void;
14
14
  }
15
- declare const TMSavedQuerySelector: React.MemoExoticComponent<({ items, selectedId, allowShowSearch, height, manageDefault, onItemClick, onDeleted, refreshFavoriteSavedQueries, onRefreshData }: ITMSavedQuerySelectorProps) => import("react/jsx-runtime").JSX.Element>;
15
+ declare const TMSavedQuerySelector: React.MemoExoticComponent<({ items, selectedId, allowShowSearch, height, manageDefault, onItemClick, onDeleted, refreshFavoriteSavedQueries, onRefreshData }: ITMSavedQuerySelectorProps) => React.JSX.Element>;
16
16
  export default TMSavedQuerySelector;
@@ -5,13 +5,13 @@ import TMSavedQuerySelector from './TMSavedQuerySelector';
5
5
  import TMTreeSelector from './TMTreeSelector';
6
6
  import { TabPanel, Item } from 'devextreme-react/tab-panel';
7
7
  import TMSearchQueryPanel, { refreshLastSearch } from './TMSearchQueryPanel';
8
- import { getSysAllDcmtsSQD, IconFilter, IconRecentlyViewed, IconSavedQuery, IconTree, mergeSearchResultsAppend, removeMruTid, SDKUI_Globals, SDKUI_Localizator, updateMruTids } from '../../../helper';
8
+ import { getSysAllDcmtsSQD, SYS_ALL_DCMTS_SQD_ID, IconFilter, IconRecentlyViewed, IconSavedQuery, IconTree, mergeSearchResultsAppend, removeMruTid, SDKUI_Globals, SDKUI_Localizator, updateMruTids } from '../../../helper';
9
9
  import TMSearchResult from './TMSearchResult';
10
10
  import TMRecentsManager from '../../grids/TMRecentsManager';
11
11
  import { SearchResultContext } from '../../../ts';
12
12
  import { useDeviceType, DeviceType } from '../../base/TMDeviceProvider';
13
13
  import { StyledMultiViewPanel } from '../../base/Styled';
14
- import { useTMPanelManagerContext } from '../../layout/panelManager/TMPanelManagerContext';
14
+ import { TMPanelManagerProvider, useTMPanelManagerContext } from '../../layout/panelManager/TMPanelManagerContext';
15
15
  import TMPanelManagerContainer from '../../layout/panelManager/TMPanelManagerContainer';
16
16
  import { TMPanelManagerWithPersistenceProvider } from '../../layout/panelManager/TMPanelManagerWithPersistenceProvider';
17
17
  import { TMExceptionBoxManager } from '../../base/TMPopUp';
@@ -32,7 +32,7 @@ const TMSearch = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTask
32
32
  const [currentSearchView, setCurrentSearchView] = useState(TMSearchViews.Search);
33
33
  const [currentSQDMode, setCurrentSQDMode] = useState(1);
34
34
  const [lastQdSearched, setLastQdSearched] = useState();
35
- const [showSearchResults, setShowSearchResults] = useState(true);
35
+ const [showSearchResults, setShowSearchResults] = useState(!onlyShowSearchQueryPanel);
36
36
  const [maxDcmtsToBeReturned, setMaxDcmtsToBeReturned] = useState(SDKUI_Globals.userSettings.searchSettings?.maxDcmtsToBeReturned ?? 1000);
37
37
  const deviceType = useDeviceType();
38
38
  useEffect(() => {
@@ -152,6 +152,42 @@ const TMSearch = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTask
152
152
  if (sqdToBeSet)
153
153
  await setSqdAsync?.(sqdToBeSet);
154
154
  }, []);
155
+ // --- REFRESH DEI PANNELLI ---
156
+ // Scorciatoie: rilegge dal server l'elenco dei tipi documento, così le scorciatoie riflettono
157
+ // quelli aggiunti o rimossi. La nuova identità di mruTIDs fa ricaricare i descrittori a TMRecentsManager.
158
+ const refreshRecentsAsync = useCallback(async () => {
159
+ DcmtTypeListCacheService.RemoveAllWithoutMetadata();
160
+ await DcmtTypeListCacheService.GetAllWithoutMetadataAsync();
161
+ setMruTIDs([...SDKUI_Globals.userSettings.searchSettings.mruTIDs]);
162
+ }, []);
163
+ // Ricerche rapide: invalida la cache delle saved query e ricarica l'elenco del tipo documento corrente
164
+ const refreshSavedQueriesAsync = useCallback(async () => {
165
+ // loadDataSQDsAsync riporta la selezione sulla prima tab: il refresh non deve spostare quella scelta dall'utente
166
+ const sqdMode = currentSQDMode;
167
+ await loadDataSQDsAsync(true, fromDTD?.id ?? currentTID);
168
+ setCurrentSQDMode(sqdMode);
169
+ }, [fromDTD?.id, currentTID, currentSQDMode]);
170
+ // Pannello dei metadati: rilegge dal server i metadati del tipo documento e la definizione della
171
+ // ricerca rapida corrente, con cui il pannello ricostruisce i filtri (i valori digitati vengono persi)
172
+ const refreshSearchQueryPanelAsync = useCallback(async () => {
173
+ const tid = fromDTD?.id ?? currentTID;
174
+ if (!tid)
175
+ return;
176
+ const dtd = await DcmtTypeListCacheService.GetAsync(tid, true, undefined, false, true);
177
+ setFromDTD(dtd);
178
+ // Passare da undefined forza la ricostruzione dei filtri anche quando la query selezionata non cambia
179
+ const sqdToRestore = currentSQD;
180
+ SavedQueryCacheService.Remove();
181
+ await setSQDAsync(undefined);
182
+ // La ricerca di sistema non è in cache: va ricostruita, così recepisce i metadati appena riletti
183
+ await setSQDAsync(sqdToRestore?.id === SYS_ALL_DCMTS_SQD_ID ? await getSysAllDcmtsSQD(tid, false) : sqdToRestore);
184
+ // mruTIDs è tra le dipendenze perché setSQDAsync lo legge
185
+ }, [fromDTD?.id, currentTID, currentSQD, mruTIDs]);
186
+ // Prima di ogni ricerca il pannello rilegge i metadati del tipo documento: si recepisce il descrittore
187
+ // aggiornato, così anche il resto della vista (titoli, badge, form dei metadati) lavora sulla lista corrente
188
+ const handleDcmtTypeReloaded = useCallback((dtd) => {
189
+ setFromDTD(dtd);
190
+ }, []);
155
191
  const onRefreshSearchAsyncDatagrid = async () => {
156
192
  try {
157
193
  if (lastQdSearched) {
@@ -208,10 +244,11 @@ const TMSearch = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTask
208
244
  SDKUI_Globals.userSettings.searchSettings.mruTIDs = newMruTIDS;
209
245
  setMruTIDs(newMruTIDS);
210
246
  } }), [mruTIDs, currentMruTID, deviceType]);
211
- const tmSearchQueryPanelElement = useMemo(() => _jsx(TMSearchQueryPanelWrapper, { passToArchiveCallback: passToArchiveCallback, isExpertMode: isExpertMode, showBackToResultButton: searchResult.length > 0, fromDTD: fromDTD, SQD: currentSQD, inputMids: inputMids, maxDcmtsToBeReturned: maxDcmtsToBeReturned, onBackToResult: () => { setCurrentSearchView(TMSearchViews.Result); }, onSearchCompleted: handleSearchCompleted, onSqdSaved: async (newSqd) => {
247
+ const tmSearchQueryPanelElement = useMemo(() => _jsx(TMSearchQueryPanelWrapper, { isSearchViewOnScreen: currentSearchView === TMSearchViews.Search, passToArchiveCallback: passToArchiveCallback, isExpertMode: isExpertMode, showBackToResultButton: searchResult.length > 0, fromDTD: fromDTD, SQD: currentSQD, inputMids: inputMids, maxDcmtsToBeReturned: maxDcmtsToBeReturned, onBackToResult: () => { if (onlyShowSearchQueryPanel)
248
+ setShowSearchResults(true); setCurrentSearchView(TMSearchViews.Result); }, onSearchCompleted: handleSearchCompleted, onRefreshRequested: refreshSearchQueryPanelAsync, onDcmtTypeReloaded: handleDcmtTypeReloaded, onSqdSaved: async (newSqd) => {
212
249
  await loadDataSQDsAsync(true, newSqd.masterTID);
213
250
  await setSQDAsync(newSqd);
214
- } }), [fromDTD, showSearchResults, setShowSearchResults, currentSQD, isExpertMode, mruTIDs, searchResult, passToArchiveCallback, inputMids, maxDcmtsToBeReturned, handleSearchCompleted]);
251
+ } }), [fromDTD, showSearchResults, setShowSearchResults, currentSQD, currentSearchView, isExpertMode, mruTIDs, searchResult, passToArchiveCallback, inputMids, maxDcmtsToBeReturned, handleSearchCompleted, refreshSearchQueryPanelAsync, handleDcmtTypeReloaded, onlyShowSearchQueryPanel]);
215
252
  const tmSavedQuerySelectorElement = useMemo(() => _jsxs(TabPanel, { width: "100%", height: "100%", showNavButtons: true, repaintChangesOnly: true, selectedIndex: currentSQDMode, onSelectedIndexChange: (index) => setCurrentSQDMode(index), children: [(currentTID || currentSQD) ? _jsx(Item, { title: fromDTD?.nameLoc, children: _jsx(TMSavedQuerySelectorWrapper, { allowShowSearch: false, items: filteredByTIDSQDs, selectedId: currentSQD?.id, onRefreshData: () => { loadDataSQDsAsync(true); }, onItemClick: (sqd) => {
216
253
  onSQDItemClick(sqd, setSQDAsync);
217
254
  }, onDeleted: (sqd) => onSQDDeleted(sqd, sqd.id == currentSQD?.id ? filteredByTIDSQDs.find(o => o.id == 1) : currentSQD, setSQDAsync), refreshFavoriteSavedQueries: refreshFavoriteSavedQueries }) }) : _jsx(_Fragment, {}), _jsx(Item, { title: SDKUI_Localizator.AllFemale, children: _jsx(TMSavedQuerySelectorWrapper, { allowShowSearch: true, items: allSQDs, manageDefault: false, onItemClick: (sqd) => {
@@ -263,7 +300,14 @@ const TMSearch = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTask
263
300
  {
264
301
  id: 'TMRecentsManager',
265
302
  name: SDKUI_Localizator.Shortcuts,
266
- contentOptions: { component: tmRecentsManagerElement, panelContainer: { title: SDKUI_Localizator.Shortcuts, totalItems: mruTIDs.length } },
303
+ contentOptions: {
304
+ component: tmRecentsManagerElement,
305
+ panelContainer: {
306
+ title: SDKUI_Localizator.Shortcuts,
307
+ totalItems: mruTIDs.length,
308
+ onRefresh: refreshRecentsAsync
309
+ }
310
+ },
267
311
  toolbarOptions: { icon: _jsx(IconRecentlyViewed, { fontSize: 24 }), visible: true, orderNumber: 2, isActive: allInitialPanelVisibility['TMRecentsManager'] }
268
312
  },
269
313
  {
@@ -275,11 +319,33 @@ const TMSearch = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTask
275
319
  {
276
320
  id: 'TMSavedQuerySelector',
277
321
  name: SDK_Localizator.SavedQueries,
278
- contentOptions: { component: tmSavedQuerySelectorElement, panelContainer: { title: SDK_Localizator.SavedQueries } },
322
+ contentOptions: {
323
+ component: tmSavedQuerySelectorElement,
324
+ panelContainer: {
325
+ title: SDK_Localizator.SavedQueries,
326
+ onRefresh: refreshSavedQueriesAsync
327
+ }
328
+ },
279
329
  toolbarOptions: { icon: _jsx(IconSavedQuery, { fontSize: 24 }), visible: true, orderNumber: 4, isActive: allInitialPanelVisibility['TMSavedQuerySelector'] }
280
330
  }
281
- ], [tmTreeSelectorElement, showSearchResults, tmRecentsManagerElement, tmSearchQueryPanelElement, tmSavedQuerySelectorElement, fromDTD, mruTIDs]);
282
- return (_jsxs(_Fragment, { children: [showSearchResults ? _jsx(StyledMultiViewPanel, { "$isVisible": currentSearchView === TMSearchViews.Search, children: _jsx(TMPanelManagerWithPersistenceProvider, { panels: initialPanels, initialVisibility: allInitialPanelVisibility, defaultDimensions: initialPanelDimensions, initialDimensions: initialPanelDimensions, initialMobilePanelId: 'TMRecentsManager', isPersistenceEnabled: !isMobile ? hasSavedLayout() : false, persistPanelStates: !isMobile ? (state) => persistPanelStates(state) : undefined, persistedPanelStates: getPersistedPanelStates(), children: _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", showToolbar: true, minPanelSizePx: !isMobile ? 250 : 150 }) }) }) : tmSearchQueryPanelElement, showSearchResults && _jsx(TMSearchResult, { isVisible: isVisible && currentSearchView === TMSearchViews.Result, context: SearchResultContext.METADATA_SEARCH, searchResults: searchResult, floatingActionConfig: floatingActionConfig, onRefreshAfterAddDcmtToFavs: onRefreshAfterAddDcmtToFavs, openInOffice: openInOffice, onRefreshSearchAsyncDatagrid: onRefreshSearchAsyncDatagrid, onClose: () => { onlyShowSearchQueryPanel ? setShowSearchResults(false) : setCurrentSearchView(TMSearchViews.Search); }, onFileOpened: onFileOpened, onTaskCreateRequest: onTaskCreateRequest, openWGsCopyMoveForm: openWGsCopyMoveForm, editPdfForm: editPdfForm, onOpenPdfEditorRequest: onOpenPdfEditorRequest, openS4TViewer: openS4TViewer, onOpenS4TViewerRequest: onOpenS4TViewerRequest, openFileUploaderPdfEditor: openFileUploaderPdfEditor, passToArchiveCallback: passToArchiveCallback, onSelectedTIDChanged: onCurrentTIDChangedCallback, showTodoDcmtForm: showTodoDcmtForm, showToppyDraggableHelpCenter: showToppyDraggableHelpCenter, toppyHelpCenterUsePortal: toppyHelpCenterUsePortal, onReferenceClick: onReferenceClick, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, inputDID: inputDID, formAutoOpen: formAutoOpen, fetchRemoteCertificates: fetchRemoteCertificates, graphometricManager: graphometricManager })] }));
331
+ ], [tmTreeSelectorElement, showSearchResults, tmRecentsManagerElement, tmSearchQueryPanelElement, tmSavedQuerySelectorElement, fromDTD, mruTIDs, refreshRecentsAsync, refreshSavedQueriesAsync]);
332
+ // Quando è visibile solo il pannello di ricerca (es. modale di abbinamento molti a molti) serve
333
+ const singlePanelVisibility = { 'TMSearchQueryPanel': true };
334
+ const singlePanelDimensions = { 'TMSearchQueryPanel': { width: '100%', height: '100%' } };
335
+ const singlePanelDefinition = useMemo(() => [
336
+ {
337
+ id: 'TMSearchQueryPanel',
338
+ name: fromDTD?.nameLoc ?? SDKUI_Localizator.Search_Metadata,
339
+ contentOptions: { component: tmSearchQueryPanelElement },
340
+ toolbarOptions: { icon: _jsx(IconFilter, { fontSize: 24 }), visible: false, orderNumber: 1, isActive: true }
341
+ }
342
+ ], [tmSearchQueryPanelElement, fromDTD]);
343
+ return (_jsxs(_Fragment, { children: [onlyShowSearchQueryPanel
344
+ // Il pannello di ricerca resta montato anche quando sono a schermo i risultati: tornando
345
+ // indietro si ritrova l'ultima ricerca impostata, senza rimontaggi che ne resettano i filtri
346
+ ? _jsx(StyledMultiViewPanel, { "$isVisible": !showSearchResults, children: _jsx(TMPanelManagerProvider, { panels: singlePanelDefinition, initialVisibility: singlePanelVisibility, defaultDimensions: singlePanelDimensions, initialDimensions: singlePanelDimensions, initialMobilePanelId: 'TMSearchQueryPanel', children: tmSearchQueryPanelElement }) })
347
+ : _jsx(StyledMultiViewPanel, { "$isVisible": currentSearchView === TMSearchViews.Search, children: _jsx(TMPanelManagerWithPersistenceProvider, { panels: initialPanels, initialVisibility: allInitialPanelVisibility, defaultDimensions: initialPanelDimensions, initialDimensions: initialPanelDimensions, initialMobilePanelId: 'TMRecentsManager', isPersistenceEnabled: !isMobile ? hasSavedLayout() : false, persistPanelStates: !isMobile ? (state) => persistPanelStates(state) : undefined, persistedPanelStates: getPersistedPanelStates(), children: _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", showToolbar: true, minPanelSizePx: !isMobile ? 250 : 150 }) }) }), showSearchResults && _jsx(TMSearchResult, { isVisible: isVisible && currentSearchView === TMSearchViews.Result, context: SearchResultContext.METADATA_SEARCH, searchResults: searchResult, floatingActionConfig: floatingActionConfig, onRefreshAfterAddDcmtToFavs: onRefreshAfterAddDcmtToFavs, openInOffice: openInOffice, onRefreshSearchAsyncDatagrid: onRefreshSearchAsyncDatagrid, onClose: () => { if (onlyShowSearchQueryPanel)
348
+ setShowSearchResults(false); setCurrentSearchView(TMSearchViews.Search); }, backCaption: onlyShowSearchQueryPanel ? SDKUI_Localizator.BackToSearch : undefined, onFileOpened: onFileOpened, onTaskCreateRequest: onTaskCreateRequest, openWGsCopyMoveForm: openWGsCopyMoveForm, editPdfForm: editPdfForm, onOpenPdfEditorRequest: onOpenPdfEditorRequest, openS4TViewer: openS4TViewer, onOpenS4TViewerRequest: onOpenS4TViewerRequest, openFileUploaderPdfEditor: openFileUploaderPdfEditor, passToArchiveCallback: passToArchiveCallback, onSelectedTIDChanged: onCurrentTIDChangedCallback, showTodoDcmtForm: showTodoDcmtForm, showToppyDraggableHelpCenter: showToppyDraggableHelpCenter, toppyHelpCenterUsePortal: toppyHelpCenterUsePortal, onReferenceClick: onReferenceClick, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, inputDID: inputDID, formAutoOpen: formAutoOpen, fetchRemoteCertificates: fetchRemoteCertificates, graphometricManager: graphometricManager })] }));
283
349
  };
284
350
  export default TMSearch;
285
351
  const TMTreeSelectorWrapper = ({ isMobile, onSelectedTIDChanged }) => {
@@ -298,11 +364,11 @@ const TMRecentsManagerWrapper = ({ mruTIDs, currentMruTID, deviceType, onSelecte
298
364
  onDeletedTID?.(tid);
299
365
  } }));
300
366
  };
301
- const TMSearchQueryPanelWrapper = ({ fromDTD, SQD, isExpertMode, showBackToResultButton, onSearchCompleted, onSqdSaved, onBackToResult, passToArchiveCallback, inputMids, maxDcmtsToBeReturned }) => {
367
+ const TMSearchQueryPanelWrapper = ({ isSearchViewOnScreen, fromDTD, SQD, isExpertMode, showBackToResultButton, onSearchCompleted, onSqdSaved, onBackToResult, passToArchiveCallback, inputMids, maxDcmtsToBeReturned, onRefreshRequested, onDcmtTypeReloaded }) => {
302
368
  const { setPanelVisibilityById, toggleMaximize, countVisibleLeafPanels } = useTMPanelManagerContext();
303
369
  const deviceType = useDeviceType();
304
370
  const isMobile = deviceType === DeviceType.MOBILE;
305
- return (_jsx(TMSearchQueryPanel, { onClosePanel: (!isMobile && countVisibleLeafPanels() > 1) ? () => setPanelVisibilityById('TMSearchQueryPanel', false) : undefined, allowMaximize: !isMobile && countVisibleLeafPanels() > 1, onMaximizePanel: (!isMobile && countVisibleLeafPanels() > 1) ? () => toggleMaximize("TMSearchQueryPanel") : undefined, isExpertMode: isExpertMode, fromDTD: fromDTD, SQD: SQD, inputMids: inputMids, onSearchCompleted: onSearchCompleted, onSqdSaved: onSqdSaved, showBackToResultButton: showBackToResultButton, onBackToResult: onBackToResult, passToArchiveCallback: passToArchiveCallback, maxDcmtsToBeReturned: maxDcmtsToBeReturned }));
371
+ return (_jsx(TMSearchQueryPanel, { isSearchViewOnScreen: isSearchViewOnScreen, onClosePanel: (!isMobile && countVisibleLeafPanels() > 1) ? () => setPanelVisibilityById('TMSearchQueryPanel', false) : undefined, allowMaximize: !isMobile && countVisibleLeafPanels() > 1, onMaximizePanel: (!isMobile && countVisibleLeafPanels() > 1) ? () => toggleMaximize("TMSearchQueryPanel") : undefined, isExpertMode: isExpertMode, fromDTD: fromDTD, SQD: SQD, inputMids: inputMids, onSearchCompleted: onSearchCompleted, onRefreshRequested: onRefreshRequested, onDcmtTypeReloaded: onDcmtTypeReloaded, onSqdSaved: onSqdSaved, showBackToResultButton: showBackToResultButton, onBackToResult: onBackToResult, passToArchiveCallback: passToArchiveCallback, maxDcmtsToBeReturned: maxDcmtsToBeReturned }));
306
372
  };
307
373
  const TMSavedQuerySelectorWrapper = ({ items, selectedId, allowShowSearch, manageDefault, onRefreshData, onItemClick, onDeleted, refreshFavoriteSavedQueries }) => {
308
374
  const { setPanelVisibilityById } = useTMPanelManagerContext();
@@ -58,10 +58,12 @@ const TMSearchQueryEditor = ({ qd, dcmtTypesList = [], isExpertMode = SDKUI_Glob
58
58
  const handleItemSelect = useCallback((tid, mid) => {
59
59
  if (currentEditingMID !== mid)
60
60
  setCurrentEditingMID(mid);
61
- if (!focusedTidMid || mid !== focusedTidMid.mid) {
62
- setFocusedTidMid({ tid: tid, mid: mid });
61
+ if (!focusedTidMid || mid !== focusedTidMid.mid || tid !== focusedTidMid.tid) {
62
+ const newFocusedTidMid = { tid: tid, mid: mid };
63
+ setFocusedTidMid(newFocusedTidMid);
64
+ onFocusedMetadataChanged?.(newFocusedTidMid);
63
65
  }
64
- }, [currentEditingMID, focusedTidMid]);
66
+ }, [currentEditingMID, focusedTidMid, onFocusedMetadataChanged]);
65
67
  const handleAdvancedMenuClick = useCallback((e) => {
66
68
  if (e.button === AdvancedMenuButtons.MakeEditable && e.mid) {
67
69
  addOrRemoveEditableList(e.mid);
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import { DcmtTypeDescriptor, QueryDescriptor, SavedQueryDescriptor, SearchResultDescriptor } from '@topconsultnpm/sdk-ts';
3
3
  interface ITMSearchQueryPanelProps {
4
+ isSearchViewOnScreen?: boolean;
4
5
  fromDTD?: DcmtTypeDescriptor;
5
6
  SQD?: SavedQueryDescriptor;
6
7
  isExpertMode?: boolean;
@@ -21,10 +22,19 @@ interface ITMSearchQueryPanelProps {
21
22
  value: string;
22
23
  }>, tid?: number) => void;
23
24
  maxDcmtsToBeReturned?: number;
25
+ onRefreshRequested?: () => Promise<void>;
26
+ /** Notifica il tipo documento riletto dal server prima di ogni ricerca, così il chiamante allinea il proprio descrittore */
27
+ onDcmtTypeReloaded?: (dtd: DcmtTypeDescriptor) => void;
24
28
  }
25
29
  declare const TMSearchQueryPanel: React.FunctionComponent<ITMSearchQueryPanelProps>;
26
30
  export default TMSearchQueryPanel;
27
31
  export declare const refreshLastSearch: (qd: QueryDescriptor | undefined) => Promise<SearchResultDescriptor[] | undefined>;
28
- export declare const StyledToppyTextContainer: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never> & Partial<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>>> & string;
29
- export declare const StyledToppyText: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>, never> & Partial<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>, never>>> & string;
30
- export declare const StyledToppyImage: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<React.DetailedHTMLProps<React.ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, never> & Partial<Pick<React.DetailedHTMLProps<React.ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, never>>> & string;
32
+ export declare const StyledToppyTextContainer: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
33
+ style?: React.CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
34
+ }> & string;
35
+ export declare const StyledToppyText: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>, "style"> & {
36
+ style?: React.CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
37
+ }> & string;
38
+ export declare const StyledToppyImage: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<React.DetailedHTMLProps<React.ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, "style"> & {
39
+ style?: React.CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
40
+ }> & string;