@topconsultnpm/sdkui-react 6.22.0-dev1.9 → 6.22.0-dev2.11

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 (52) hide show
  1. package/lib/components/base/TMButton.d.ts +13 -0
  2. package/lib/components/base/TMButton.js +137 -5
  3. package/lib/components/base/TMDataGridExportForm.js +39 -30
  4. package/lib/components/base/TMModal.js +1 -1
  5. package/lib/components/choosers/TMDynDataListItemChooser.d.ts +2 -0
  6. package/lib/components/choosers/TMDynDataListItemChooser.js +4 -6
  7. package/lib/components/editors/TMDateBox.d.ts +16 -1
  8. package/lib/components/editors/TMDateBox.js +90 -22
  9. package/lib/components/editors/TMMetadataEditor.d.ts +5 -1
  10. package/lib/components/editors/TMMetadataEditor.js +27 -23
  11. package/lib/components/editors/TMTextArea.d.ts +1 -0
  12. package/lib/components/editors/TMTextArea.js +23 -15
  13. package/lib/components/editors/TMTextBox.d.ts +2 -0
  14. package/lib/components/editors/TMTextBox.js +38 -22
  15. package/lib/components/features/documents/TMDcmtForm.d.ts +2 -1
  16. package/lib/components/features/documents/TMDcmtForm.js +107 -8
  17. package/lib/components/features/documents/TMRelationViewer.js +13 -32
  18. package/lib/components/features/search/TMSearch.d.ts +2 -1
  19. package/lib/components/features/search/TMSearch.js +31 -18
  20. package/lib/components/features/search/TMSearchQueryPanel.d.ts +1 -1
  21. package/lib/components/features/search/TMSearchQueryPanel.js +28 -7
  22. package/lib/components/features/search/TMSearchResult.d.ts +2 -1
  23. package/lib/components/features/search/TMSearchResult.js +16 -41
  24. package/lib/components/features/search/TMSignatureInfoContent.d.ts +4 -2
  25. package/lib/components/features/search/TMSignatureInfoContent.js +373 -79
  26. package/lib/components/forms/Login/TMLoginForm.d.ts +2 -0
  27. package/lib/components/forms/Login/TMLoginForm.js +17 -3
  28. package/lib/components/forms/Login/TextBox.d.ts +3 -0
  29. package/lib/components/forms/Login/TextBox.js +2 -2
  30. package/lib/components/pages/TMPage.js +3 -1
  31. package/lib/components/query/TMQueryEditor.js +1 -1
  32. package/lib/components/viewers/TMMidViewer.js +1 -1
  33. package/lib/helper/Globalization.d.ts +1 -1
  34. package/lib/helper/SDKUI_Globals.js +22 -2
  35. package/lib/helper/SDKUI_Localizator.d.ts +11 -0
  36. package/lib/helper/SDKUI_Localizator.js +110 -0
  37. package/lib/helper/TMUtils.d.ts +29 -1
  38. package/lib/helper/TMUtils.js +249 -10
  39. package/lib/helper/grafometricSignaturesCache.d.ts +45 -0
  40. package/lib/helper/grafometricSignaturesCache.js +56 -0
  41. package/lib/helper/helpers.d.ts +11 -0
  42. package/lib/helper/helpers.js +32 -0
  43. package/lib/helper/index.d.ts +1 -0
  44. package/lib/helper/index.js +1 -0
  45. package/lib/hooks/useDocumentOperations.d.ts +2 -1
  46. package/lib/hooks/useDocumentOperations.js +15 -15
  47. package/lib/hooks/usePreventFileDrop.js +14 -3
  48. package/lib/ts/graphometricTypes.d.ts +62 -0
  49. package/lib/ts/graphometricTypes.js +1 -0
  50. package/lib/ts/index.d.ts +1 -0
  51. package/lib/ts/index.js +1 -0
  52. package/package.json +7 -2
@@ -5,7 +5,7 @@ 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, removeMruTid, SDKUI_Globals, SDKUI_Localizator, updateMruTids } from '../../../helper';
8
+ import { getSysAllDcmtsSQD, 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';
@@ -20,7 +20,7 @@ var TMSearchViews;
20
20
  TMSearchViews[TMSearchViews["Search"] = 0] = "Search";
21
21
  TMSearchViews[TMSearchViews["Result"] = 1] = "Result";
22
22
  })(TMSearchViews || (TMSearchViews = {}));
23
- const TMSearch = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, handleNavigateToWGs, handleNavigateToDossiers, openInOffice, isVisible, inputTID, inputSqdID, inputMids, isExpertMode = SDKUI_Globals.userSettings.advancedSettings.expertMode === 1, floatingActionConfig, onFileOpened, onRefreshAfterAddDcmtToFavs, onTaskCreateRequest, openWGsCopyMoveForm, editPdfForm = false, openS4TViewer, onOpenS4TViewerRequest, onOpenPdfEditorRequest, openFileUploaderPdfEditor, showTodoDcmtForm, showToppyDraggableHelpCenter = true, toppyHelpCenterUsePortal = false, passToArchiveCallback, onCurrentTIDChangedCallback, onlyShowSearchQueryPanel, onReferenceClick, refreshFavoriteSavedQueries, inputDID, formAutoOpen, fetchRemoteCertificates }) => {
23
+ const TMSearch = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, handleNavigateToWGs, handleNavigateToDossiers, openInOffice, isVisible, inputTID, inputSqdID, inputMids, isExpertMode = SDKUI_Globals.userSettings.advancedSettings.expertMode === 1, floatingActionConfig, onFileOpened, onRefreshAfterAddDcmtToFavs, onTaskCreateRequest, openWGsCopyMoveForm, editPdfForm = false, openS4TViewer, onOpenS4TViewerRequest, onOpenPdfEditorRequest, openFileUploaderPdfEditor, showTodoDcmtForm, showToppyDraggableHelpCenter = true, toppyHelpCenterUsePortal = false, passToArchiveCallback, onCurrentTIDChangedCallback, onlyShowSearchQueryPanel, onReferenceClick, refreshFavoriteSavedQueries, inputDID, formAutoOpen, fetchRemoteCertificates, graphometricManager }) => {
24
24
  const [allSQDs, setAllSQDs] = useState([]);
25
25
  const [filteredByTIDSQDs, setFilteredByTIDSQDs] = useState([]);
26
26
  const [currentSQD, setCurrentSQD] = useState();
@@ -164,6 +164,32 @@ const TMSearch = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTask
164
164
  console.error("Error refreshing search:", error);
165
165
  }
166
166
  };
167
+ const handleSearchCompleted = useCallback((searchResult, qd, append) => {
168
+ if (searchResult.length <= 0) {
169
+ // In ricerca normale un array vuoto resetta i risultati; in accoda si mantiene il set accumulato
170
+ if (!append)
171
+ setSearchResult(searchResult);
172
+ return;
173
+ }
174
+ const newResult = searchResult[0];
175
+ // In modalità accoda unisce il nuovo risultato a quello precedente (più recenti in cima).
176
+ setSearchResult(prev => {
177
+ if (append && prev.length > 0 && prev[0]?.fromTID === newResult?.fromTID) {
178
+ const merged = mergeSearchResultsAppend(prev[0], newResult);
179
+ return merged ? [merged] : searchResult;
180
+ }
181
+ return searchResult;
182
+ });
183
+ setLastQdSearched(qd);
184
+ setCurrentSearchView(TMSearchViews.Result);
185
+ // Salvataggio ultimi 10 TIDs
186
+ let fromTID = searchResult?.[0].fromTID;
187
+ let newMruTIDS = updateMruTids(SDKUI_Globals.userSettings.searchSettings.mruTIDs, fromTID);
188
+ SDKUI_Globals.userSettings.searchSettings.mruTIDs = newMruTIDS;
189
+ setMruTIDs(newMruTIDS);
190
+ setCurrentMruTID(fromTID);
191
+ setShowSearchResults(true);
192
+ }, []);
167
193
  const isMobile = deviceType === DeviceType.MOBILE;
168
194
  const isTabletOrMobile = deviceType === DeviceType.TABLET || deviceType === DeviceType.MOBILE;
169
195
  // --- JSX WRAPPERS ---
@@ -182,23 +208,10 @@ const TMSearch = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTask
182
208
  SDKUI_Globals.userSettings.searchSettings.mruTIDs = newMruTIDS;
183
209
  setMruTIDs(newMruTIDS);
184
210
  } }), [mruTIDs, currentMruTID, deviceType]);
185
- 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: (searchResult, qd) => {
186
- setSearchResult(searchResult);
187
- if (searchResult.length <= 0)
188
- return;
189
- setLastQdSearched(qd);
190
- setCurrentSearchView(TMSearchViews.Result);
191
- // Salvataggio ultimi 10 TIDs
192
- let fromTID = searchResult?.[0].fromTID;
193
- let newMruTIDS = updateMruTids(SDKUI_Globals.userSettings.searchSettings.mruTIDs, fromTID);
194
- SDKUI_Globals.userSettings.searchSettings.mruTIDs = newMruTIDS;
195
- setMruTIDs(newMruTIDS);
196
- setCurrentMruTID(fromTID);
197
- setShowSearchResults(true);
198
- }, onSqdSaved: async (newSqd) => {
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) => {
199
212
  await loadDataSQDsAsync(true, newSqd.masterTID);
200
213
  await setSQDAsync(newSqd);
201
- } }), [fromDTD, showSearchResults, setShowSearchResults, currentSQD, isExpertMode, mruTIDs, searchResult, passToArchiveCallback, inputMids, maxDcmtsToBeReturned]);
214
+ } }), [fromDTD, showSearchResults, setShowSearchResults, currentSQD, isExpertMode, mruTIDs, searchResult, passToArchiveCallback, inputMids, maxDcmtsToBeReturned, handleSearchCompleted]);
202
215
  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) => {
203
216
  onSQDItemClick(sqd, setSQDAsync);
204
217
  }, 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) => {
@@ -266,7 +279,7 @@ const TMSearch = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTask
266
279
  toolbarOptions: { icon: _jsx(IconSavedQuery, { fontSize: 24 }), visible: true, orderNumber: 4, isActive: allInitialPanelVisibility['TMSavedQuerySelector'] }
267
280
  }
268
281
  ], [tmTreeSelectorElement, showSearchResults, tmRecentsManagerElement, tmSearchQueryPanelElement, tmSavedQuerySelectorElement, fromDTD, mruTIDs]);
269
- 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 })] }));
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 })] }));
270
283
  };
271
284
  export default TMSearch;
272
285
  const TMTreeSelectorWrapper = ({ isMobile, onSelectedTIDChanged }) => {
@@ -12,7 +12,7 @@ interface ITMSearchQueryPanelProps {
12
12
  onBack?: () => void;
13
13
  onBackToResult?: () => void;
14
14
  onSqdSaved?: (newSqd: SavedQueryDescriptor) => void;
15
- onSearchCompleted?: (searchResult: SearchResultDescriptor[], qd: QueryDescriptor | undefined) => void;
15
+ onSearchCompleted?: (searchResult: SearchResultDescriptor[], qd: QueryDescriptor | undefined, append?: boolean) => void;
16
16
  onClosePanel?: () => void;
17
17
  allowMaximize?: boolean;
18
18
  onMaximizePanel?: () => void;
@@ -46,6 +46,8 @@ const TMSearchQueryPanel = ({ fromDTD, showBackToResultButton, isExpertMode = SD
46
46
  let initialMaxItems = deviceType === DeviceType.MOBILE ? 8 : 12;
47
47
  const appliedInputMidsRef = useRef(null);
48
48
  const pendingMidsRef = useRef(null);
49
+ // Flag "accoda": impostato dall'azione secondaria del bottone Ricerca, consumato in executeSearch
50
+ const appendNextSearchRef = useRef(false);
49
51
  useEffect(() => {
50
52
  if (!SQD)
51
53
  return;
@@ -122,7 +124,10 @@ const TMSearchQueryPanel = ({ fromDTD, showBackToResultButton, isExpertMode = SD
122
124
  useEffect(() => {
123
125
  if (shouldSearch && qd) {
124
126
  const executeSearch = async () => {
125
- await searchAsync(qd, showAdvancedSearch);
127
+ // Legge e consuma il flag "accoda" impostato dall'azione secondaria del bottone Ricerca
128
+ const append = appendNextSearchRef.current;
129
+ appendNextSearchRef.current = false;
130
+ await searchAsync(qd, showAdvancedSearch, append);
126
131
  setShouldSearch(false); // Resetta il trigger dopo la ricerca
127
132
  };
128
133
  executeSearch();
@@ -167,8 +172,9 @@ const TMSearchQueryPanel = ({ fromDTD, showBackToResultButton, isExpertMode = SD
167
172
  });
168
173
  setQd({ ...qd, where: newWhere, orderBy: [] });
169
174
  };
170
- const searchAsync = async (qdInput, isAdvancedSearch) => {
171
- onSearchCompleted?.([], undefined); // reset results
175
+ const searchAsync = async (qdInput, isAdvancedSearch, append = false) => {
176
+ if (!append)
177
+ onSearchCompleted?.([], undefined); // reset results (solo in ricerca normale, non in accoda)
172
178
  let searchParams = { isAdvancedSearch: isAdvancedSearch, lastQdParams: lastQdParams, confirmQueryParams: confirmQueryParams, setLastQdParamsCallback: setLastQdParams };
173
179
  let searchResult = await searchByQdAsync(qdInput, searchParams);
174
180
  let dcmtsFound = searchResult?.result?.dcmtsFound ?? 0;
@@ -180,7 +186,7 @@ const TMSearchQueryPanel = ({ fromDTD, showBackToResultButton, isExpertMode = SD
180
186
  results.push(searchResult?.result);
181
187
  // Before notifying onSearchComplete, let's set the panel to NOT active
182
188
  setIsQueryPanelActive(false);
183
- onSearchCompleted?.(results, searchResult?.qd);
189
+ onSearchCompleted?.(results, searchResult?.qd, append);
184
190
  }
185
191
  };
186
192
  const updateIsModalOpen = useCallback((isOpen) => {
@@ -214,9 +220,24 @@ const TMSearchQueryPanel = ({ fromDTD, showBackToResultButton, isExpertMode = SD
214
220
  if (document.activeElement instanceof HTMLElement) {
215
221
  document.activeElement.blur();
216
222
  }
217
- // Attiva il flag di ricerca anche per il click del bottone
223
+ // Ricerca normale: azzera l'eventuale flag accoda e avvia
224
+ appendNextSearchRef.current = false;
218
225
  setShouldSearch(true);
219
226
  }, []);
227
+ const handleSearchAndAppendClick = useCallback(() => {
228
+ // Propagazione blur
229
+ if (document.activeElement instanceof HTMLElement) {
230
+ document.activeElement.blur();
231
+ }
232
+ // Ricerca e accoda: imposta il flag consumato da executeSearch
233
+ appendNextSearchRef.current = true;
234
+ setShouldSearch(true);
235
+ }, []);
236
+ const searchButtonSecondaryActions = useMemo(() => [{
237
+ name: SDKUI_Localizator.SearchAndAppend,
238
+ icon: _jsx(IconSearch, {}),
239
+ onClick: handleSearchAndAppendClick
240
+ }], [handleSearchAndAppendClick]);
220
241
  const handleQdChanged = useCallback((newQd) => {
221
242
  if (!deepCompare(qd, newQd)) {
222
243
  setQd(newQd);
@@ -270,7 +291,7 @@ const TMSearchQueryPanel = ({ fromDTD, showBackToResultButton, isExpertMode = SD
270
291
  }, [qd, fromDTD?.metadata, SQD?.masterTID]);
271
292
  const handleCloseOutputConfig = useCallback(() => setShowOutputConfig(false), []);
272
293
  const contextMenuItems = useMemo(() => [
273
- ...(showBackToResultButton ? [{ icon: _jsx(IconArrowRight, {}), name: "Vai a risultato", onClick: () => { onBackToResult?.(); } }] : []),
294
+ ...(showBackToResultButton ? [{ icon: _jsx(IconArrowRight, {}), name: SDKUI_Localizator.BackToResult, onClick: () => { onBackToResult?.(); } }] : []),
274
295
  { icon: _jsx(IconAddCircleOutline, {}), name: SDKUI_Localizator.SavedQueryNew, beginGroup: showBackToResultButton, onClick: () => { openSqdForm(FormModes.Create); } },
275
296
  { icon: _jsx(IconEdit, {}), name: SDKUI_Localizator.SavedQueryUpdate, disabled: (SQD && SQD.id == 1), onClick: () => { openSqdForm(FormModes.Update); } },
276
297
  { icon: showAdvancedSearch ? _jsx(IconEasy, {}) : _jsx(IconAdvanced, {}), beginGroup: true, name: showAdvancedSearch ? SDKUI_Localizator.Search_Easy : SDKUI_Localizator.Search_Advanced, onClick: () => { changeAdvancedSearchAsync(!showAdvancedSearch); } },
@@ -353,7 +374,7 @@ const TMSearchQueryPanel = ({ fromDTD, showBackToResultButton, isExpertMode = SD
353
374
  alignItems: 'center',
354
375
  gap: '10px',
355
376
  width: '100%'
356
- }, children: [_jsx(TMButton, { btnStyle: 'advanced', icon: _jsx(IconSearch, {}), showTooltip: false, width: '90px', caption: SDKUI_Localizator.Search, advancedColor: '#4A96D2', onClick: handleSearchButtonClick }), _jsx(TMButton, { width: '90px', btnStyle: 'advanced', advancedType: 'primary', showTooltip: false, caption: SDKUI_Localizator.Clear, icon: _jsx(IconClear, {}), advancedColor: 'white', color: 'primaryOutline', onClick: clearFilters }), (!showAdvancedSearch && qd?.where && qd.where.length > initialMaxItems) && (_jsx(TMButton, { width: '120px', btnStyle: isMobile ? 'icon' : 'advanced', advancedColor: TMColors.button_primary, caption: captionText, showTooltip: false, icon: isMobile ? (_jsx("div", { children: _jsx("p", { children: showAllMdWhere ? `-${diff}` : `+${diff}` }) })) : (_jsx("p", { children: showAllMdWhere ? `-${diff}` : `+${diff}` })), onClick: () => setShowAllMdWhere(!showAllMdWhere) }))] }), showFiltersConfig &&
377
+ }, children: [_jsx(TMButton, { btnStyle: 'advanced', icon: _jsx(IconSearch, {}), showTooltip: false, width: '120px', caption: SDKUI_Localizator.Search, advancedColor: '#4A96D2', onClick: handleSearchButtonClick, secondaryActions: searchButtonSecondaryActions }), _jsx(TMButton, { width: '90px', btnStyle: 'advanced', advancedType: 'primary', showTooltip: false, caption: SDKUI_Localizator.Clear, icon: _jsx(IconClear, {}), advancedColor: 'white', color: 'primaryOutline', onClick: clearFilters }), (!showAdvancedSearch && qd?.where && qd.where.length > initialMaxItems) && (_jsx(TMButton, { width: '120px', btnStyle: isMobile ? 'icon' : 'advanced', advancedColor: TMColors.button_primary, caption: captionText, showTooltip: false, icon: isMobile ? (_jsx("div", { children: _jsx("p", { children: showAllMdWhere ? `-${diff}` : `+${diff}` }) })) : (_jsx("p", { children: showAllMdWhere ? `-${diff}` : `+${diff}` })), onClick: () => setShowAllMdWhere(!showAllMdWhere) }))] }), showFiltersConfig &&
357
378
  _jsx(TMMetadataChooserForm, { allowMultipleSelection: true, height: '500px', width: '600px', allowSysMetadata: true, filterMetadata: (o => o.perm?.canSearch === AccessLevels.Yes), qd: qd, selectedIDs: qd?.where?.map((w) => ({ tid: w.tid, mid: w.mid })), onClose: handleCloseFiltersConfig, onChoose: handleChooseFilters }), showOutputConfig &&
358
379
  _jsx(TMMetadataOutputForm, { qd: qd, selectedSelectItems: qd?.select, allowSysMetadata: true, filterMetadata: (o => o.perm?.canView === AccessLevels.Yes || o.perm?.canUpdate === AccessLevels.Yes), onClose: handleCloseOutputConfig, onChoose: (selectItems) => {
359
380
  setQd({ ...qd, select: selectItems });
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { DcmtTypeDescriptor, HomeBlogPost, ObjectRef, SearchResultDescriptor, TaskDescriptor, WorkingGroupDescriptor } from '@topconsultnpm/sdk-ts';
3
3
  import { IntesiCertificateData } from '../../../helper';
4
- import { DcmtInfo, SearchResultContext, TaskContext } from '../../../ts';
4
+ import { DcmtInfo, IGraphometricManagerProp, SearchResultContext, TaskContext } from '../../../ts';
5
5
  import { TMSearchResultFloatingActionConfig } from './TMSearchResultFloatingActionButton';
6
6
  export declare const getSearchResultCountersSingleCategory: (searchResults: SearchResultDescriptor[]) => string;
7
7
  interface ITMSearchResultProps {
@@ -53,6 +53,7 @@ interface ITMSearchResultProps {
53
53
  openCommentFormCallback?: (documents: Array<DcmtInfo>) => void;
54
54
  openAddDocumentForm?: () => void;
55
55
  fetchRemoteCertificates?: (email: string) => Promise<IntesiCertificateData[]>;
56
+ graphometricManager?: IGraphometricManagerProp;
56
57
  allTasks?: Array<TaskDescriptor>;
57
58
  getAllTasks?: () => Promise<void>;
58
59
  deleteTaskByIdsCallback?: (deletedTaskIds: Array<number>) => Promise<void>;
@@ -2,8 +2,8 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
2
2
  import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
3
  import styled from 'styled-components';
4
4
  import { LoadIndicator } from 'devextreme-react';
5
- import { AppModules, DataColumnTypes, DataListViewModes, DcmtTypeListCacheService, LayoutCacheService, LayoutModes, MetadataDataDomains, MetadataFormats, SDK_Globals, SystemMIDsAsNumber, UserListCacheService, } from '@topconsultnpm/sdk-ts';
6
- import { deepCompare, generateUniqueColumnKeys, genUniqueId, getSearchToolbarVisibility, IconAll, IconBoard, IconDcmtTypeSys, IconDelete, IconMenuVertical, IconPlatform, IconRefresh, IconSearchCheck, IconShow, isApprovalWorkflowView, isSign4TopEnabled, searchResultDescriptorToSimpleArray, searchResultToMetadataValues, SDKUI_Globals, SDKUI_Localizator } from '../../../helper';
5
+ import { AppModules, DataColumnTypes, DataListViewModes, DcmtTypeListCacheService, LayoutCacheService, LayoutModes, MetadataDataDomains, SDK_Globals, SystemMIDsAsNumber, UserListCacheService, } from '@topconsultnpm/sdk-ts';
6
+ import { deepCompare, formatDateTimeByMetadataFormat, formatNumberByMetadataFormat, generateUniqueColumnKeys, genUniqueId, getColumnFormatInfo, getSearchToolbarVisibility, IconAll, IconBoard, IconDcmtTypeSys, IconDelete, IconMenuVertical, IconPlatform, IconRefresh, IconSearchCheck, IconShow, isApprovalWorkflowView, isSign4TopEnabled, searchResultDescriptorToSimpleArray, searchResultToMetadataValues, SDKUI_Globals, SDKUI_Localizator } from '../../../helper';
7
7
  import { CounterItemKey } from '../../base/TMCounterContainer';
8
8
  import { getDcmtCicoStatus } from '../../../helper/checkinCheckoutManager';
9
9
  import { DcmtOperationTypes, SearchResultContext, } from '../../../ts';
@@ -61,7 +61,7 @@ openInOffice, onRefreshAfterAddDcmtToFavs, onRefreshSearchAsyncDatagrid, onSelec
61
61
  // Tasks
62
62
  allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback,
63
63
  // Navigation
64
- handleNavigateToWGs, handleNavigateToDossiers, fetchRemoteCertificates, }) => {
64
+ handleNavigateToWGs, handleNavigateToDossiers, fetchRemoteCertificates, graphometricManager, }) => {
65
65
  // Ref for the floating bar container (used to position the floating action buttons)
66
66
  const floatingBarContainerRef = useRef(null);
67
67
  // Ref per tracciare se autoFocusFirstRow=false deve bloccare l'auto-focus.
@@ -341,7 +341,8 @@ handleNavigateToWGs, handleNavigateToDossiers, fetchRemoteCertificates, }) => {
341
341
  allowFloatingBar,
342
342
  enablePinIcons,
343
343
  allowRelations,
344
- showTodoDcmtForm
344
+ showTodoDcmtForm,
345
+ graphometricManager,
345
346
  },
346
347
  tasks: {
347
348
  allTasks: allTasks,
@@ -470,7 +471,9 @@ handleNavigateToWGs, handleNavigateToDossiers, fetchRemoteCertificates, }) => {
470
471
  return;
471
472
  if (focusedItem?.DID != inputDID)
472
473
  return;
473
- openFormHandler(LayoutModes.Update);
474
+ if (focusedItem?.TID === undefined)
475
+ return;
476
+ onDcmtFormOpenChange(true, LayoutModes.Update);
474
477
  }, [inputDID, formAutoOpen, focusedItem]);
475
478
  // Quando openS4TViewer è true, apri automaticamente il viewer S4T
476
479
  useEffect(() => {
@@ -999,42 +1002,14 @@ const TMSearchResultGrid = ({ openInOffice, fromDTD, operationItems, allUsers, i
999
1002
  const getDisplayFormat = useCallback((col) => {
1000
1003
  if (col.dataType === DataColumnTypes.Text)
1001
1004
  return undefined;
1002
- const format = MetadataFormats[(col.extendedProperties?.["Format"] ?? "None")];
1003
- const formatCulture = col.extendedProperties?.["FormatCulture"] ?? window.navigator.language;
1004
- if (col.dataType === DataColumnTypes.DateTime) {
1005
- return {
1006
- formatter: function (value) {
1007
- switch (format) {
1008
- case MetadataFormats.ShortDate: return value.toLocaleString(formatCulture, formatCulture == "it-IT" ? { year: "numeric", month: "2-digit", day: "2-digit" } : { dateStyle: 'short' });
1009
- case MetadataFormats.ShortTime: return value.toLocaleString(formatCulture, { timeStyle: 'short' });
1010
- case MetadataFormats.ShortDateLongTime: return value.toLocaleString(formatCulture, formatCulture == "it-IT" ? { year: "numeric", month: "2-digit", day: "2-digit", hour: '2-digit', minute: '2-digit', second: '2-digit' } : { dateStyle: 'short', timeStyle: 'medium' }).replace(',', '');
1011
- case MetadataFormats.ShortDateShortTime: return value.toLocaleString(formatCulture, formatCulture == "it-IT" ? { year: "numeric", month: "2-digit", day: "2-digit", hour: '2-digit', minute: '2-digit' } : { dateStyle: 'short', timeStyle: 'short' }).replace(',', '');
1012
- case MetadataFormats.LongDate: return value.toLocaleString(formatCulture, { weekday: "long", year: "numeric", month: "long", day: "numeric" });
1013
- case MetadataFormats.LongTime: return value.toLocaleString(formatCulture, { timeStyle: 'medium' });
1014
- case MetadataFormats.LongDateLongTime: return value.toLocaleString(formatCulture, { weekday: "long", year: "numeric", month: "long", day: "numeric", hour: '2-digit', minute: '2-digit', second: '2-digit' });
1015
- case MetadataFormats.LongDateShortTime: return value.toLocaleString(formatCulture, { weekday: "long", year: "numeric", month: "long", day: "numeric", hour: '2-digit', minute: '2-digit' });
1016
- default: return value.toLocaleString(formatCulture, formatCulture == "it-IT" ? { year: "numeric", month: "2-digit", day: "2-digit" } : { dateStyle: 'short' });
1017
- }
1018
- }
1019
- };
1020
- }
1021
- if (col.dataType === DataColumnTypes.Number) {
1022
- return {
1023
- formatter: function (value) {
1024
- return value.toLocaleString(formatCulture, { useGrouping: format == MetadataFormats.NumberWithThousandsSeparator });
1025
- }
1026
- };
1027
- }
1028
- if (format == MetadataFormats.None)
1029
- return undefined;
1030
- if (format == MetadataFormats.CurrencyEuro)
1031
- return { type: 'currency', precision: 2, currency: "EUR" };
1032
- if (format == MetadataFormats.CurrencyDollar)
1033
- return { type: 'currency', precision: 2, currency: "USD" };
1034
- if (format == MetadataFormats.CurrencyPound)
1035
- return { type: 'currency', precision: 2, currency: "GBP" };
1036
- if (format == MetadataFormats.CurrencyYen)
1037
- return { type: 'currency', currency: "JPY" };
1005
+ // Formato e cultura di visualizzazione definiti sulle proprietà estese della colonna
1006
+ const { format, formatCulture } = getColumnFormatInfo(col);
1007
+ // Date: la griglia passa al formatter un oggetto Date già istanziato
1008
+ if (col.dataType === DataColumnTypes.DateTime)
1009
+ return { formatter: (value) => formatDateTimeByMetadataFormat(value, format, formatCulture) };
1010
+ // Numeri (incluse valute): stessa formattazione usata da TMRelationViewer
1011
+ if (col.dataType === DataColumnTypes.Number)
1012
+ return { formatter: (value) => formatNumberByMetadataFormat(value, format, formatCulture) };
1038
1013
  return undefined;
1039
1014
  }, []);
1040
1015
  /**
@@ -1,6 +1,8 @@
1
- import { DcmtInfo } from "../../../ts";
1
+ import { DcmtInfo, IGraphometricManagerProp } from "../../../ts";
2
2
  interface TMSignatureInfoContentProps {
3
3
  inputDcmt: DcmtInfo;
4
+ graphometricManager?: IGraphometricManagerProp;
5
+ onClose?: () => void;
4
6
  }
5
- declare const TMSignatureInfoContent: (props: TMSignatureInfoContentProps) => import("react/jsx-runtime").JSX.Element | null;
7
+ declare const TMSignatureInfoContent: (props: TMSignatureInfoContentProps) => import("react/jsx-runtime").JSX.Element;
6
8
  export default TMSignatureInfoContent;