@topconsultnpm/sdkui-react 6.21.0-dev2.6 → 6.21.0-dev2.60

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 (82) hide show
  1. package/lib/components/base/TMAccordionNew.js +1 -0
  2. package/lib/components/base/TMAreaManager.js +19 -3
  3. package/lib/components/base/TMDataGrid.js +2 -2
  4. package/lib/components/base/TMModal.d.ts +1 -0
  5. package/lib/components/base/TMModal.js +2 -2
  6. package/lib/components/base/TMPanel.d.ts +7 -4
  7. package/lib/components/base/TMPanel.js +58 -26
  8. package/lib/components/base/TMTreeView.js +12 -2
  9. package/lib/components/base/TMWaitPanel.js +7 -4
  10. package/lib/components/choosers/TMDistinctValues.js +35 -21
  11. package/lib/components/choosers/TMUserChooser.d.ts +4 -0
  12. package/lib/components/choosers/TMUserChooser.js +7 -5
  13. package/lib/components/editors/TMFormulaEditor.d.ts +2 -0
  14. package/lib/components/editors/TMFormulaEditor.js +75 -21
  15. package/lib/components/editors/TMMetadataValues.js +2 -1
  16. package/lib/components/editors/TMRadioButton.js +7 -5
  17. package/lib/components/editors/TMTextBox.d.ts +2 -0
  18. package/lib/components/editors/TMTextBox.js +3 -3
  19. package/lib/components/features/archive/TMArchive.js +1 -1
  20. package/lib/components/features/documents/TMCopyToFolderForm.d.ts +24 -0
  21. package/lib/components/features/documents/TMCopyToFolderForm.js +379 -0
  22. package/lib/components/features/documents/TMDcmtForm.d.ts +1 -0
  23. package/lib/components/features/documents/TMDcmtForm.js +107 -29
  24. package/lib/components/features/documents/TMDcmtFormActionButtons.js +17 -2
  25. package/lib/components/features/documents/TMDcmtPreview.d.ts +1 -0
  26. package/lib/components/features/documents/TMDcmtPreview.js +2 -2
  27. package/lib/components/features/documents/TMDcmtTasks.d.ts +1 -0
  28. package/lib/components/features/documents/TMDcmtTasks.js +2 -2
  29. package/lib/components/features/documents/TMDownloadRelationViewerSection.d.ts +23 -0
  30. package/lib/components/features/documents/TMDownloadRelationViewerSection.js +173 -0
  31. package/lib/components/features/documents/TMFileUploader.js +1 -1
  32. package/lib/components/features/documents/TMMasterDetailDcmts.d.ts +4 -0
  33. package/lib/components/features/documents/TMMasterDetailDcmts.js +29 -9
  34. package/lib/components/features/documents/TMMergeToPdfForm.d.ts +26 -0
  35. package/lib/components/features/documents/TMMergeToPdfForm.js +293 -0
  36. package/lib/components/features/documents/TMRelationViewer.d.ts +13 -0
  37. package/lib/components/features/documents/TMRelationViewer.js +75 -6
  38. package/lib/components/features/documents/copyAndMergeDcmtsShared.d.ts +71 -0
  39. package/lib/components/features/documents/copyAndMergeDcmtsShared.js +304 -0
  40. package/lib/components/features/search/SignatureParamsManager.d.ts +70 -0
  41. package/lib/components/features/search/SignatureParamsManager.js +145 -0
  42. package/lib/components/features/search/TMSavedQuerySelector.d.ts +2 -2
  43. package/lib/components/features/search/TMSavedQuerySelector.js +3 -2
  44. package/lib/components/features/search/TMSearch.d.ts +6 -1
  45. package/lib/components/features/search/TMSearch.js +16 -10
  46. package/lib/components/features/search/TMSearchQueryPanel.js +1 -1
  47. package/lib/components/features/search/TMSearchResult.d.ts +4 -0
  48. package/lib/components/features/search/TMSearchResult.js +118 -22
  49. package/lib/components/features/workflow/diagram/queryDescriptorParser.js +3 -6
  50. package/lib/components/forms/Login/TMLoginForm.d.ts +9 -0
  51. package/lib/components/forms/Login/TMLoginForm.js +61 -0
  52. package/lib/components/forms/TMResultDialog.d.ts +1 -1
  53. package/lib/components/forms/TMResultDialog.js +4 -2
  54. package/lib/components/grids/TMBlogAttachments.d.ts +1 -0
  55. package/lib/components/grids/TMBlogAttachments.js +38 -12
  56. package/lib/components/grids/TMBlogsPost.js +7 -1
  57. package/lib/components/grids/TMBlogsPostUtils.js +11 -17
  58. package/lib/components/index.d.ts +1 -0
  59. package/lib/components/index.js +1 -0
  60. package/lib/components/pages/TMPage.js +3 -1
  61. package/lib/components/query/TMQueryEditor.js +1 -1
  62. package/lib/components/viewers/TMTidViewer.js +1 -1
  63. package/lib/helper/SDKUI_Globals.d.ts +15 -0
  64. package/lib/helper/SDKUI_Globals.js +15 -1
  65. package/lib/helper/SDKUI_Localizator.d.ts +106 -2
  66. package/lib/helper/SDKUI_Localizator.js +1060 -12
  67. package/lib/helper/TMPdfViewer.js +25 -24
  68. package/lib/helper/TMUtils.d.ts +20 -0
  69. package/lib/helper/TMUtils.js +17 -0
  70. package/lib/helper/ZipManager.d.ts +56 -0
  71. package/lib/helper/ZipManager.js +127 -0
  72. package/lib/helper/index.d.ts +1 -0
  73. package/lib/helper/index.js +1 -0
  74. package/lib/hooks/useDataUserIdItem.js +6 -4
  75. package/lib/hooks/useDcmtOperations.d.ts +9 -2
  76. package/lib/hooks/useDcmtOperations.js +77 -34
  77. package/lib/hooks/useDocumentOperations.d.ts +5 -0
  78. package/lib/hooks/useDocumentOperations.js +238 -27
  79. package/lib/hooks/useForm.js +5 -2
  80. package/lib/hooks/useResizeObserver.d.ts +1 -1
  81. package/lib/hooks/useResizeObserver.js +16 -15
  82. package/package.json +3 -2
@@ -14,12 +14,13 @@ import { StyledMultiViewPanel } from '../../base/Styled';
14
14
  import { useTMPanelManagerContext } from '../../layout/panelManager/TMPanelManagerContext';
15
15
  import TMPanelManagerContainer from '../../layout/panelManager/TMPanelManagerContainer';
16
16
  import { TMPanelManagerWithPersistenceProvider } from '../../layout/panelManager/TMPanelManagerWithPersistenceProvider';
17
+ import { TMExceptionBoxManager } from '../../base/TMPopUp';
17
18
  var TMSearchViews;
18
19
  (function (TMSearchViews) {
19
20
  TMSearchViews[TMSearchViews["Search"] = 0] = "Search";
20
21
  TMSearchViews[TMSearchViews["Result"] = 1] = "Result";
21
22
  })(TMSearchViews || (TMSearchViews = {}));
22
- 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 }) => {
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, mergePdfManager }) => {
23
24
  const [allSQDs, setAllSQDs] = useState([]);
24
25
  const [filteredByTIDSQDs, setFilteredByTIDSQDs] = useState([]);
25
26
  const [currentSQD, setCurrentSQD] = useState();
@@ -50,13 +51,18 @@ const TMSearch = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTask
50
51
  setCurrentSearchView(TMSearchViews.Search);
51
52
  }, [inputTID]);
52
53
  useEffect(() => {
53
- if (inputSqdID) {
54
- SavedQueryCacheService.GetAsync(inputSqdID).then(async (resultSqd) => {
54
+ const loadSqd = async () => {
55
+ try {
56
+ const resultSqd = await SavedQueryCacheService.GetAsync(inputSqdID);
55
57
  await setSQDAsync(resultSqd);
56
58
  // Mostra la vista Search per visualizzare i filtri della SavedQuery caricata
57
59
  setCurrentSearchView(TMSearchViews.Search);
58
- });
59
- }
60
+ }
61
+ catch (err) {
62
+ TMExceptionBoxManager.show({ exception: err });
63
+ }
64
+ };
65
+ loadSqd();
60
66
  }, [inputSqdID]);
61
67
  useEffect(() => {
62
68
  const newMaxDcmtsToBeReturned = SDKUI_Globals.userSettings.searchSettings?.maxDcmtsToBeReturned ?? 1000;
@@ -195,9 +201,9 @@ const TMSearch = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTask
195
201
  } }), [fromDTD, showSearchResults, setShowSearchResults, currentSQD, isExpertMode, mruTIDs, searchResult, passToArchiveCallback, inputMids, maxDcmtsToBeReturned]);
196
202
  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) => {
197
203
  onSQDItemClick(sqd, setSQDAsync);
198
- }, onDeleted: (sqd) => onSQDDeleted(sqd, sqd.id == currentSQD?.id ? filteredByTIDSQDs.find(o => o.id == 1) : currentSQD, setSQDAsync) }) }) : _jsx(_Fragment, {}), _jsx(Item, { title: SDKUI_Localizator.AllFemale, children: _jsx(TMSavedQuerySelectorWrapper, { allowShowSearch: true, items: allSQDs, manageDefault: false, onItemClick: (sqd) => {
204
+ }, 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) => {
199
205
  onSQDItemClick(sqd, setSQDAsync);
200
- }, onDeleted: (sqd) => onSQDDeleted(sqd, sqd.id == currentSQD?.id ? undefined : currentSQD, setSQDAsync) }) })] }), [currentSQDMode, currentTID, currentSQD, fromDTD, filteredByTIDSQDs, allSQDs]);
206
+ }, onDeleted: (sqd) => onSQDDeleted(sqd, sqd.id == currentSQD?.id ? undefined : currentSQD, setSQDAsync), refreshFavoriteSavedQueries: refreshFavoriteSavedQueries }) })] }), [currentSQDMode, currentTID, currentSQD, fromDTD, filteredByTIDSQDs, allSQDs]);
201
207
  // Returns the current panelLayout from user settings, falling back to an empty object if not present.
202
208
  const getPanelLayoutSetting = () => {
203
209
  return SDKUI_Globals.userSettings.searchSettings.panelLayout ?? {};
@@ -260,7 +266,7 @@ const TMSearch = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTask
260
266
  toolbarOptions: { icon: _jsx(IconSavedQuery, { fontSize: 24 }), visible: true, orderNumber: 4, isActive: allInitialPanelVisibility['TMSavedQuerySelector'] }
261
267
  }
262
268
  ], [tmTreeSelectorElement, showSearchResults, tmRecentsManagerElement, tmSearchQueryPanelElement, tmSavedQuerySelectorElement, fromDTD, mruTIDs]);
263
- 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 })] }));
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, mergePdfManager: mergePdfManager })] }));
264
270
  };
265
271
  export default TMSearch;
266
272
  const TMTreeSelectorWrapper = ({ isMobile, onSelectedTIDChanged }) => {
@@ -285,10 +291,10 @@ const TMSearchQueryPanelWrapper = ({ fromDTD, SQD, isExpertMode, showBackToResul
285
291
  const isMobile = deviceType === DeviceType.MOBILE;
286
292
  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 }));
287
293
  };
288
- const TMSavedQuerySelectorWrapper = ({ items, selectedId, allowShowSearch, manageDefault, onRefreshData, onItemClick, onDeleted }) => {
294
+ const TMSavedQuerySelectorWrapper = ({ items, selectedId, allowShowSearch, manageDefault, onRefreshData, onItemClick, onDeleted, refreshFavoriteSavedQueries }) => {
289
295
  const { setPanelVisibilityById } = useTMPanelManagerContext();
290
296
  return (_jsx(TMSavedQuerySelector, { allowShowSearch: allowShowSearch, manageDefault: manageDefault, items: items, selectedId: selectedId, onRefreshData: onRefreshData, onItemClick: (sqd) => {
291
297
  onItemClick?.(sqd);
292
298
  setPanelVisibilityById('TMSearchQueryPanel', true);
293
- }, onDeleted: onDeleted }));
299
+ }, onDeleted: onDeleted, refreshFavoriteSavedQueries: refreshFavoriteSavedQueries }));
294
300
  };
@@ -327,7 +327,7 @@ const TMSearchQueryPanel = ({ fromDTD, showBackToResultButton, isExpertMode = SD
327
327
  return (_jsxs(_Fragment, { children: [_jsxs(TMPanel, { title: fromDTD?.nameLoc ?? SDKUI_Localizator.Search_Metadata, allowMaximize: allowMaximize, onMaximize: onMaximizePanel, onHeaderDoubleClick: onMaximizePanel, onBack: onBack, onActiveChanged: handlePanelActiveChanged, toolbar: _jsx(_Fragment, { children: (SQD && !showSqdForm) ?
328
328
  _jsx(ContextMenu, { items: contextMenuItems, trigger: "left", children: _jsx(TMButton, { btnStyle: 'icon', caption: 'Altro', icon: _jsx(IconMenuVertical, { color: 'white' }), showTooltip: false, onClick: () => setIsQueryPanelActive(true) }) })
329
329
  : _jsx(_Fragment, {}) }), children: [_jsx(ConfirmQueryParamsDialog, {}), SQD
330
- ? _jsxs("div", { onContextMenu: (e) => e.preventDefault(), style: { height: '100%', width: '100%', position: 'relative', display: 'flex', flexDirection: 'column', gap: 5 }, children: [showAdvancedSearch
330
+ ? _jsxs("div", { onContextMenu: (e) => e.preventDefault(), style: { height: '100%', width: '100%', position: 'relative', display: showSqdForm ? 'none' : 'flex', flexDirection: 'column', gap: 5 }, children: [showAdvancedSearch
331
331
  ? _jsx(TMQueryEditor, { formMode: FormModes.Update, showToolbar: false, inputData: qd, validateSelect: true, showApply: false, onQDChanged: handleQdChanged, updateIsModalOpen: updateIsModalOpen })
332
332
  : _jsx(TMSearchQueryEditor, { qd: qd, dcmtTypesList: dcmtTypesList, isExpertMode: isExpertMode, showAllMdWhere: showAllMdWhere, onQdChanged: handleQdChanged, onFocusedMetadataChanged: setFocusedTidMid, onAdvancedMenuClick: handleAdvancedMenuClick, updateIsModalOpen: updateIsModalOpen }), _jsxs("div", { style: {
333
333
  display: 'flex',
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import { DcmtTypeDescriptor, HomeBlogPost, ObjectRef, SearchResultDescriptor, TaskDescriptor, WorkingGroupDescriptor } from '@topconsultnpm/sdk-ts';
3
+ import { MergePdfManagerType } from '../../../helper';
3
4
  import { DcmtInfo, SearchResultContext, TaskContext } from '../../../ts';
4
5
  import { TMSearchResultFloatingActionConfig } from './TMSearchResultFloatingActionButton';
5
6
  export declare const getSearchResultCountersSingleCategory: (searchResults: SearchResultDescriptor[]) => string;
@@ -11,6 +12,8 @@ interface ITMSearchResultProps {
11
12
  selectedSearchResultTID?: number;
12
13
  floatingActionConfig?: TMSearchResultFloatingActionConfig;
13
14
  workingGroupContext?: WorkingGroupDescriptor;
15
+ inputDID?: number;
16
+ formAutoOpen?: boolean;
14
17
  allowFloatingBar?: boolean;
15
18
  allowRelations?: boolean;
16
19
  isClosable?: boolean;
@@ -29,6 +32,7 @@ interface ITMSearchResultProps {
29
32
  showToppyDraggableHelpCenter?: boolean;
30
33
  toppyHelpCenterUsePortal?: boolean;
31
34
  showNoDcmtFoundMessage?: boolean;
35
+ mergePdfManager?: MergePdfManagerType;
32
36
  onClose?: () => void;
33
37
  openInOffice?: (selectedDcmtsOrFocused: Array<DcmtInfo>) => Promise<void>;
34
38
  onWFOperationCompleted?: () => Promise<void>;
@@ -3,7 +3,7 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
3
3
  import styled from 'styled-components';
4
4
  import { LoadIndicator } from 'devextreme-react';
5
5
  import { AppModules, DataColumnTypes, DataListViewModes, DcmtTypeListCacheService, LayoutCacheService, LayoutModes, MetadataDataDomains, MetadataFormats, SDK_Globals, SystemMIDsAsNumber, UserListCacheService, } from '@topconsultnpm/sdk-ts';
6
- import { deepCompare, generateUniqueColumnKeys, genUniqueId, getSearchToolbarVisibility, IconBoard, IconDcmtTypeSys, IconDelete, IconMenuVertical, IconPlatform, IconRefresh, IconSearchCheck, IconShow, isApprovalWorkflowView, searchResultDescriptorToSimpleArray, searchResultToMetadataValues, SDKUI_Globals, SDKUI_Localizator, } from '../../../helper';
6
+ import { deepCompare, generateUniqueColumnKeys, genUniqueId, getSearchToolbarVisibility, IconBoard, IconDcmtTypeSys, IconDelete, IconMenuVertical, IconPlatform, IconRefresh, IconSearchCheck, IconShow, isApprovalWorkflowView, isSign4TopEnabled, searchResultDescriptorToSimpleArray, searchResultToMetadataValues, SDKUI_Globals, SDKUI_Localizator, } from '../../../helper';
7
7
  import { getDcmtCicoStatus } from '../../../helper/checkinCheckoutManager';
8
8
  import { DcmtOperationTypes, SearchResultContext, } from '../../../ts';
9
9
  import { Gutters } from '../../../utils/theme';
@@ -52,9 +52,9 @@ const orderByName = (array) => {
52
52
  };
53
53
  const TMSearchResult = ({
54
54
  // Data
55
- groupId, searchResults = [], context = SearchResultContext.METADATA_SEARCH, title, selectedSearchResultTID, floatingActionConfig, workingGroupContext = undefined,
55
+ groupId, searchResults = [], context = SearchResultContext.METADATA_SEARCH, title, selectedSearchResultTID, floatingActionConfig, workingGroupContext = undefined, inputDID,
56
56
  // Boolean flags to enable/disable features
57
- isVisible = true, allowRelations = true, openDcmtFormAsModal = false, showSearchResultSidebar = true, showDcmtFormSidebar = true, showSelector = false, isClosable = false, allowFloatingBar = true, showToolbarHeader = true, showBackButton = true, disableAccordionIfSingleCategory = false, editPdfForm = false, openS4TViewer = false, showTodoDcmtForm = false, showToppyDraggableHelpCenter = true, toppyHelpCenterUsePortal = false, showNoDcmtFoundMessage = true, enablePinIcons = true,
57
+ formAutoOpen, isVisible = true, allowRelations = true, openDcmtFormAsModal = false, showSearchResultSidebar = true, showDcmtFormSidebar = true, showSelector = false, isClosable = false, allowFloatingBar = true, showToolbarHeader = true, showBackButton = true, disableAccordionIfSingleCategory = false, editPdfForm = false, openS4TViewer = false, showTodoDcmtForm = false, showToppyDraggableHelpCenter = true, toppyHelpCenterUsePortal = false, showNoDcmtFoundMessage = true, enablePinIcons = true, mergePdfManager,
58
58
  // Callbacks (optional)
59
59
  openInOffice, onRefreshAfterAddDcmtToFavs, onRefreshSearchAsyncDatagrid, onSelectedTIDChanged, onWFOperationCompleted, onClose, onFileOpened, onTaskCreateRequest, openWGsCopyMoveForm, openCommentFormCallback, openAddDocumentForm, onOpenS4TViewerRequest, onOpenPdfEditorRequest, openFileUploaderPdfEditor, passToArchiveCallback, onReferenceClick,
60
60
  // Tasks
@@ -101,6 +101,15 @@ handleNavigateToWGs, handleNavigateToDossiers, }) => {
101
101
  // State to control the layout of the custom buttons
102
102
  const [customButtonsLayout, setCustomButtonsLayout] = useState();
103
103
  const [allUsers, setAllUsers] = useState([]);
104
+ const [isBoardDisabled, setIsBoardDisabled] = useState(true);
105
+ useEffect(() => {
106
+ if (!fromDTD) {
107
+ setIsBoardDisabled(false);
108
+ return;
109
+ }
110
+ const newValue = fromDTD.hasBlog !== undefined && fromDTD.hasBlog !== 1;
111
+ setIsBoardDisabled(newValue);
112
+ }, [fromDTD]);
104
113
  useEffect(() => {
105
114
  const fetchAllUsers = async () => {
106
115
  const users = await UserListCacheService.GetAllAsync();
@@ -282,7 +291,7 @@ handleNavigateToWGs, handleNavigateToDossiers, }) => {
282
291
  createTaskFromDocumentOrWorkItem();
283
292
  }
284
293
  };
285
- const { operationItems, renderFloatingBar, renderDcmtOperations, features } = useDocumentOperations({
294
+ const { operationItems, renderFloatingBar, renderDcmtOperations, features, } = useDocumentOperations({
286
295
  context: context,
287
296
  documentData: {
288
297
  dtd: fromDTD,
@@ -318,6 +327,7 @@ handleNavigateToWGs, handleNavigateToDossiers, }) => {
318
327
  allowFloatingBar,
319
328
  enablePinIcons,
320
329
  allowRelations,
330
+ showTodoDcmtForm
321
331
  },
322
332
  tasks: {
323
333
  allTasks: allTasks,
@@ -351,8 +361,9 @@ handleNavigateToWGs, handleNavigateToDossiers, }) => {
351
361
  onTaskCreateRequest,
352
362
  openTaskFormHandler,
353
363
  },
364
+ mergePdfManager,
354
365
  });
355
- const { isOpenDcmtForm, openFormHandler, dcmtFormLayoutMode, onDcmtFormOpenChange, showSearchTMDatagrid, showExportForm, isOpenBatchUpdate, isModifiedBatchUpdate, updateBatchUpdateForm, handleSignApprove, checkoutInfo: { showCicoWaitPanel, cicoWaitPanelTitle, showCicoPrimaryProgress, cicoPrimaryProgressText, cicoPrimaryProgressValue, cicoPrimaryProgressMax, }, dcmtOperations: { abortController, showWaitPanel, showPrimary, waitPanelTitle, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, downloadDcmtsAsync, runOperationAsync, }, relatedDocumentsInfo: { isOpenDetails, isOpenMaster, checkRelatedDcmtsArchiveCapability, checkManyToManyCapability, }, toppyOperations: { showApprovePopup, showRejectPopup, showReAssignPopup, showMoreInfoPopup, updateShowApprovePopup, updateShowRejectPopup, updateShowReAssignPopup, updateShowMoreInfoPopup } } = features;
366
+ const { isOpenDcmtForm, openFormHandler, dcmtFormLayoutMode, onDcmtFormOpenChange, showSearchTMDatagrid, showExportForm, isOpenBatchUpdate, isModifiedBatchUpdate, updateBatchUpdateForm, closeDcmtFormHandler, handleSignApprove, checkoutInfo: { showCicoWaitPanel, cicoWaitPanelTitle, showCicoPrimaryProgress, cicoPrimaryProgressText, cicoPrimaryProgressValue, cicoPrimaryProgressMax, }, dcmtOperations: { abortController, showWaitPanel, showPrimary, waitPanelTitle, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, downloadDcmtsAsync, runOperationAsync, }, relatedDocumentsInfo: { isOpenDetails, isOpenMaster, checkRelatedDcmtsArchiveCapability, checkManyToManyCapability, }, toppyOperations: { showApprovePopup, showRejectPopup, showReAssignPopup, showMoreInfoPopup, updateShowApprovePopup, updateShowRejectPopup, updateShowReAssignPopup, updateShowMoreInfoPopup } } = features;
356
367
  const deviceType = useDeviceType();
357
368
  const isMobile = deviceType === DeviceType.MOBILE;
358
369
  const selectedDocs = getSelectedDcmtsOrFocused(selectedItems, focusedItem);
@@ -366,6 +377,7 @@ handleNavigateToWGs, handleNavigateToDossiers, }) => {
366
377
  useEffect(() => {
367
378
  setSelectedItems([]);
368
379
  updateBatchUpdateForm(false);
380
+ closeDcmtFormHandler();
369
381
  setCurrentSearchResults(searchResults);
370
382
  if (searchResults.length <= 0) {
371
383
  setSelectedSearchResult(undefined);
@@ -407,6 +419,54 @@ handleNavigateToWGs, handleNavigateToDossiers, }) => {
407
419
  // Se esiste almeno una riga, seleziona la prima
408
420
  setFocusedItem(newDataSource && newDataSource.length > 0 ? newDataSource[0] : undefined);
409
421
  }, [selectedSearchResult, checkRelatedDcmtsArchiveCapability, checkManyToManyCapability]);
422
+ // Quando inputDID è fornito e i dati della griglia sono pronti, seleziona il documento corrispondente
423
+ useEffect(() => {
424
+ if (!inputDID || visibleItems.length === 0)
425
+ return;
426
+ const targetItem = visibleItems.find((item) => item.DID == inputDID);
427
+ if (targetItem && focusedItem?.DID != inputDID) {
428
+ setFocusedItem(targetItem);
429
+ }
430
+ else if (!targetItem) {
431
+ ShowAlert({
432
+ message: `${SDKUI_Localizator.NoDcmtFound} (DID: ${inputDID})`,
433
+ mode: "warning",
434
+ title: 'External link',
435
+ duration: 5000
436
+ });
437
+ }
438
+ }, [inputDID, visibleItems]);
439
+ // Quando inputDID e formAutoOpen sono forniti, apri automaticamente il form del documento
440
+ useEffect(() => {
441
+ if (!inputDID || !formAutoOpen)
442
+ return;
443
+ if (focusedItem?.DID != inputDID)
444
+ return;
445
+ openFormHandler(LayoutModes.Update);
446
+ }, [inputDID, formAutoOpen, focusedItem]);
447
+ // Quando openS4TViewer è true, apri automaticamente il viewer S4T
448
+ useEffect(() => {
449
+ if (!openS4TViewer)
450
+ return;
451
+ if (!inputDID)
452
+ return;
453
+ if (!focusedItem)
454
+ return;
455
+ if (focusedItem.DID != inputDID)
456
+ return;
457
+ if (!fromDTD || !isApprovalWorkflowView(fromDTD))
458
+ return;
459
+ if (!focusedItem.FILEEXT || !fromDTD.widgets || !isSign4TopEnabled(fromDTD.widgets)) {
460
+ ShowAlert({
461
+ message: "Il documento non ha l'estensione valida per la firma.",
462
+ mode: "warning",
463
+ title: 'External link',
464
+ duration: 5000
465
+ });
466
+ return;
467
+ }
468
+ onOpenS4TViewerRequest?.([{ TID: focusedItem.TID, DID: focusedItem.DID }]);
469
+ }, [openS4TViewer, inputDID, focusedItem, fromDTD]);
410
470
  useEffect(() => {
411
471
  if (!focusedItem)
412
472
  return;
@@ -512,6 +572,21 @@ handleNavigateToWGs, handleNavigateToDossiers, }) => {
512
572
  return newResults;
513
573
  });
514
574
  };
575
+ /**
576
+ * Restituisce l'handler onBack per i pannelli, evitando duplicazione di codice.
577
+ * @param isMainPanel - Se true, è il pannello principale dei risultati di ricerca
578
+ */
579
+ const getOnBackHandler = (isMainPanel = false) => {
580
+ // Se showBackButton è false, non mostrare mai il back
581
+ if (showBackButton === false)
582
+ return undefined;
583
+ // Mobile: mostra back su tutti i pannelli (se showBackButton è definito e non è closable)
584
+ if (isMobile) {
585
+ return (showBackButton !== undefined && !isClosable) ? onBack : undefined;
586
+ }
587
+ // Desktop: mostra back solo sul pannello principale dei risultati (se showBackButton è definito e non è closable)
588
+ return (showBackButton !== undefined && isMainPanel && !isClosable) ? onBack : undefined;
589
+ };
515
590
  const removeDcmtFromFavsOrRecents = async () => {
516
591
  switch (selectedSearchResult?.category) {
517
592
  case "Favorites":
@@ -601,7 +676,7 @@ handleNavigateToWGs, handleNavigateToDossiers, }) => {
601
676
  ]);
602
677
  const tmBlog = useMemo(() => _jsx(TMDcmtBlog, { tid: focusedItem?.TID, did: focusedItem?.DID, fetchBlogDataTrigger: refreshBlogTrigger, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }), [focusedItem, allTasks, refreshBlogTrigger, handleNavigateToWGs, handleNavigateToDossiers, onRefreshBlogDatagrid]);
603
678
  const tmSysMetadata = useMemo(() => _jsx(TMMetadataValues, { layoutMode: LayoutModes.Update, openChooserBySingleClick: true, TID: focusedItem?.TID, isReadOnly: true, deviceType: deviceType, metadataValues: currentMetadataValues.filter(o => (o.mid != undefined && o.mid <= 100)), metadataValuesOrig: currentMetadataValues.filter(o => (o.mid != undefined && o.mid <= 100)), validationItems: [] }), [focusedItem, currentMetadataValues, deviceType]);
604
- const tmDcmtPreview = useMemo(() => _jsx(TMDcmtPreviewWrapper, { refreshPreviewTrigger: refreshPreviewTrigger, currentDcmt: currentDcmt }), [currentDcmt, refreshPreviewTrigger]);
679
+ const tmDcmtPreview = useMemo(() => _jsx(TMDcmtPreviewWrapper, { refreshPreviewTrigger: refreshPreviewTrigger, currentDcmt: currentDcmt, onBack: getOnBackHandler() }), [currentDcmt, refreshPreviewTrigger]);
605
680
  // Auto-fetch indexing info when drawer is open and focusedItem changes
606
681
  useEffect(() => {
607
682
  if (!focusedItem || !showIndexingInfo)
@@ -658,7 +733,6 @@ handleNavigateToWGs, handleNavigateToDossiers, }) => {
658
733
  }
659
734
  return (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', height: '100%', overflow: 'hidden', width: '100%' }, children: [_jsx("div", { style: { padding: '10px', overflow: 'auto', flex: 1 }, children: _jsx("div", { dangerouslySetInnerHTML: { __html: ftExplanation } }) }), _jsxs(StyledIndexingInfoSection, { children: [_jsxs(StyledIndexingToggle, { onClick: handleToggleIndexingInfo, disabled: loadingIndexingInfo, children: [_jsx(StyledLeftContent, { children: _jsx("span", { children: SDKUI_Localizator.IndexingInformation }) }), _jsx(StyledRightContent, { children: _jsx(StyledChevron, { "$isOpen": showIndexingInfo, children: "\u25BC" }) })] }), showIndexingInfo && indexingInfo && (_jsxs(StyledIndexingInfoBox, { children: [_jsx("div", { dangerouslySetInnerHTML: { __html: indexingInfo } }), loadingIndexingInfo && (_jsxs("div", { style: { position: 'absolute', top: '50%', left: '50%', transform: 'translate(-50%, -50%)', background: 'rgba(255, 255, 255, 0.9)', padding: '10px', borderRadius: '4px', boxShadow: '0 2px 8px rgba(0,0,0,0.15)' }, children: [SDKUI_Localizator.Loading, "..."] }))] }))] })] }));
660
735
  }, [selectedSearchResult, focusedItem, indexingInfo, showIndexingInfo, loadingIndexingInfo]);
661
- const isBoardDisabled = useMemo(() => fromDTD?.hasBlog !== 1, [fromDTD?.hasBlog]);
662
736
  const allInitialPanelVisibility = {
663
737
  'tmSearchResult': true,
664
738
  'tmBlog': false,
@@ -683,9 +757,7 @@ handleNavigateToWGs, handleNavigateToDossiers, }) => {
683
757
  title: getTitleHeader(),
684
758
  showHeader: showToolbarHeader,
685
759
  allowMaximize: !isMobile,
686
- onBack: showBackButton !== undefined
687
- ? (showBackButton ? onBack : undefined)
688
- : ((!isClosable && context === SearchResultContext.METADATA_SEARCH) || (isMobile && context !== SearchResultContext.METADATA_SEARCH && splitterSize[1] === '100%') ? onBack : undefined),
760
+ onBack: getOnBackHandler(true),
689
761
  onClose: isClosable ? onBack : undefined,
690
762
  toolbar: searchResutlToolbar
691
763
  },
@@ -695,27 +767,50 @@ handleNavigateToWGs, handleNavigateToDossiers, }) => {
695
767
  {
696
768
  id: 'tmBlog',
697
769
  name: SDKUI_Localizator.BlogCase,
698
- contentOptions: { component: tmBlog, panelContainer: { title: SDKUI_Localizator.BlogCase, allowMaximize: !isMobile } },
770
+ contentOptions: {
771
+ component: tmBlog,
772
+ panelContainer: {
773
+ title: SDKUI_Localizator.BlogCase,
774
+ allowMaximize: !isMobile,
775
+ onBack: getOnBackHandler(),
776
+ }
777
+ },
699
778
  toolbarOptions: { icon: _jsx(IconBoard, { fontSize: 24 }), visible: getSearchToolbarVisibility(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER).tmBlog, orderNumber: 2, isActive: allInitialPanelVisibility['tmBlog'] }
700
779
  },
701
780
  {
702
781
  id: 'tmSysMetadata',
703
782
  name: SDKUI_Localizator.MetadataSystem,
704
- contentOptions: { component: tmSysMetadata, panelContainer: { title: SDKUI_Localizator.MetadataSystem, allowMaximize: !isMobile } },
783
+ contentOptions: {
784
+ component: tmSysMetadata,
785
+ panelContainer: {
786
+ title: SDKUI_Localizator.MetadataSystem,
787
+ allowMaximize: !isMobile,
788
+ onBack: getOnBackHandler(),
789
+ }
790
+ },
705
791
  toolbarOptions: { icon: _jsx(IconDcmtTypeSys, { fontSize: 24 }), visible: getSearchToolbarVisibility(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER).tmSysMetadata, orderNumber: 3, isActive: allInitialPanelVisibility['tmSysMetadata'] }
706
792
  },
707
793
  ...(context === SearchResultContext.FREE_SEARCH ? [
708
794
  {
709
795
  id: 'tmFullTextSearch',
710
796
  name: SDKUI_Localizator.ResultDetails,
711
- contentOptions: { component: tmFullTextSearch, panelContainer: { title: SDKUI_Localizator.ResultDetails, allowMaximize: !isMobile } },
797
+ contentOptions: {
798
+ component: tmFullTextSearch,
799
+ panelContainer: {
800
+ title: SDKUI_Localizator.ResultDetails,
801
+ allowMaximize: !isMobile,
802
+ onBack: getOnBackHandler(),
803
+ }
804
+ },
712
805
  toolbarOptions: { icon: _jsx(IconPlatform, { fontSize: 20 }), visible: getSearchToolbarVisibility(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER).tmFullTextSearch, orderNumber: 4, isActive: allInitialPanelVisibility['tmFullTextSearch'] }
713
806
  }
714
807
  ] : []),
715
808
  {
716
809
  id: 'tmDcmtPreview',
717
810
  name: SDKUI_Localizator.PreviewDocument,
718
- contentOptions: { component: tmDcmtPreview },
811
+ contentOptions: {
812
+ component: tmDcmtPreview
813
+ },
719
814
  toolbarOptions: { icon: _jsx(IconShow, { fontSize: 24 }), visible: getSearchToolbarVisibility(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER).tmDcmtPreview, orderNumber: context === SearchResultContext.FREE_SEARCH ? 5 : 4, isActive: allInitialPanelVisibility['tmDcmtPreview'] }
720
815
  }
721
816
  ], [tmSearchResult, tmBlog, tmSysMetadata, tmDcmtPreview, tmFullTextSearch, showToolbarHeader, context, isMobile]);
@@ -1240,22 +1335,23 @@ const TMSearchResultSelector = ({ searchResults = [], disableAccordionIfSingleCa
1240
1335
  };
1241
1336
  //#endregion TMSearchResultSelector
1242
1337
  const PanelDisabledStateHandler = ({ isBoardDisabled }) => {
1243
- const { setPanelVisibilityById, setToolbarButtonDisabled, panelVisibility } = useTMPanelManagerContext();
1338
+ const { setPanelVisibilityById, setToolbarButtonDisabled } = useTMPanelManagerContext();
1244
1339
  useEffect(() => {
1245
- // Aggiorna lo stato disabled del bottone toolbar
1246
- setToolbarButtonDisabled('tmBlog', isBoardDisabled);
1247
- // Chiude il pannello solo se è attualmente visibile e deve essere disabilitato
1248
- if (isBoardDisabled && panelVisibility['tmBlog']) {
1340
+ if (isBoardDisabled) {
1341
+ setToolbarButtonDisabled('tmBlog', true);
1249
1342
  setPanelVisibilityById('tmBlog', false);
1250
1343
  }
1251
- }, [isBoardDisabled, setPanelVisibilityById, setToolbarButtonDisabled, panelVisibility]);
1344
+ else {
1345
+ setToolbarButtonDisabled('tmBlog', false);
1346
+ }
1347
+ }, [isBoardDisabled]);
1252
1348
  return null;
1253
1349
  };
1254
- const TMDcmtPreviewWrapper = ({ refreshPreviewTrigger, currentDcmt, isVisible }) => {
1350
+ const TMDcmtPreviewWrapper = ({ refreshPreviewTrigger, currentDcmt, isVisible, onBack }) => {
1255
1351
  const { setPanelVisibilityById, toggleMaximize, isResizingActive, countVisibleLeafPanels } = useTMPanelManagerContext();
1256
1352
  const deviceType = useDeviceType();
1257
1353
  const isMobile = deviceType === DeviceType.MOBILE;
1258
- return (_jsx(TMDcmtPreview, { dcmtData: currentDcmt, onClosePanel: (!isMobile && countVisibleLeafPanels() > 1) ? () => setPanelVisibilityById('tmDcmtPreview', false) : undefined, allowMaximize: !isMobile && countVisibleLeafPanels() > 1, onMaximizePanel: (!isMobile && countVisibleLeafPanels() > 1) ? () => toggleMaximize("tmDcmtPreview") : undefined, isResizingActive: isResizingActive, isVisible: isVisible }, refreshPreviewTrigger));
1354
+ return (_jsx(TMDcmtPreview, { dcmtData: currentDcmt, onClosePanel: (!isMobile && countVisibleLeafPanels() > 1) ? () => setPanelVisibilityById('tmDcmtPreview', false) : undefined, onBack: onBack, allowMaximize: !isMobile && countVisibleLeafPanels() > 1, onMaximizePanel: (!isMobile && countVisibleLeafPanels() > 1) ? () => toggleMaximize("tmDcmtPreview") : undefined, isResizingActive: isResizingActive, isVisible: isVisible }, refreshPreviewTrigger));
1259
1355
  };
1260
1356
  // Styled Components
1261
1357
  const StyledPlaceholder = styled.div `
@@ -175,14 +175,11 @@ export const parseQueryDescriptorXml = (xmlString) => {
175
175
  return SearchEngine.NormalizeQueryDescriptor(queryDescriptor);
176
176
  };
177
177
  export const serializeQueryDescriptorXml = async (qd) => {
178
- // try {
179
178
  if (!qd)
180
179
  return '';
180
+ // Per compatibilità con V5, assicurati che ogni JoinItem abbia un alias (anche se vuoto) prima della serializzazione,
181
+ // poiché la logica di serializzazione potrebbe aspettarsi questa proprietà.
182
+ qd.join?.forEach(join => { join.alias ??= ""; });
181
183
  let xml = await SDK_Globals.tmSession?.NewDcmtPlatformEngine().UtilsSerializeQdAsync(qd) ?? '';
182
184
  return xml;
183
- // } catch (error) {
184
- // console.error('Error serializing QueryDescriptor to XML:', error);
185
- //TODO: gestire errore
186
- // return '';
187
- // }
188
185
  };
@@ -31,6 +31,14 @@ export declare const cultureIDsDataSource: {
31
31
  value: CultureIDs;
32
32
  display: string;
33
33
  }[];
34
+ export interface ITMLoginDefaultValues {
35
+ endpoint: string;
36
+ archiveId?: string;
37
+ authenticationMode?: AuthenticationModes;
38
+ username?: string;
39
+ behalfUsername?: string;
40
+ domain?: string;
41
+ }
34
42
  interface ITMLoginFormProps {
35
43
  isConnector?: boolean;
36
44
  sdInput?: SessionDescriptor;
@@ -39,6 +47,7 @@ interface ITMLoginFormProps {
39
47
  onLogged: (tmSession: ITopMediaSession) => void;
40
48
  onChangeLanguage?: (e: CultureIDs) => void;
41
49
  cultureID?: CultureIDs;
50
+ defaultLoginValues?: ITMLoginDefaultValues;
42
51
  }
43
52
  declare const TMLoginForm: React.FunctionComponent<ITMLoginFormProps>;
44
53
  export default TMLoginForm;
@@ -106,6 +106,7 @@ const TMLoginForm = (props) => {
106
106
  const passwordRef = useRef(null);
107
107
  const usernameOnBehalfOfRef = useRef(null);
108
108
  const passwordOnBehalfOfRRef = useRef(null);
109
+ const defaultLoginAppliedRef = useRef(false);
109
110
  const [loginStep, setLoginStep] = useState(1);
110
111
  const [tmServer, setTmServer] = useState();
111
112
  const [tmSession, setTmSession] = useState();
@@ -201,6 +202,30 @@ const TMLoginForm = (props) => {
201
202
  setUsername(props.sdInput.userName);
202
203
  }
203
204
  }, []);
205
+ useEffect(() => {
206
+ if (!props.defaultLoginValues)
207
+ return;
208
+ const matchingEndpoint = props.endpoints.find(ep => ep.URL === props.defaultLoginValues.endpoint);
209
+ if (!matchingEndpoint) {
210
+ ShowAlert({
211
+ message: "Endpoint non trovato",
212
+ mode: "warning",
213
+ title: "External link",
214
+ duration: 5000
215
+ });
216
+ return;
217
+ }
218
+ setEndpoint(matchingEndpoint);
219
+ if (props.defaultLoginValues.archiveId)
220
+ setManualArchiveID(props.defaultLoginValues.archiveId);
221
+ setAuthMode(props.defaultLoginValues.authenticationMode ?? AuthenticationModes.TopMedia);
222
+ if (props.defaultLoginValues.username)
223
+ setUsername(props.defaultLoginValues.username);
224
+ if (props.defaultLoginValues.domain)
225
+ setAuthDomain(props.defaultLoginValues.domain);
226
+ if (props.defaultLoginValues.behalfUsername)
227
+ setUsernameOnBehalf(props.defaultLoginValues.behalfUsername);
228
+ }, [props.defaultLoginValues, props.endpoints]);
204
229
  useEffect(() => {
205
230
  if (!hasSingleOption)
206
231
  return;
@@ -216,6 +241,9 @@ const TMLoginForm = (props) => {
216
241
  setDcmtArchive(undefined);
217
242
  }, [isSuccess]);
218
243
  useEffect(() => {
244
+ // Skip all default endpoint logic when defaultLoginValues is defined (external link)
245
+ if (props.defaultLoginValues)
246
+ return;
219
247
  let preferredRapidAccess = localRa?.find(ar => ar.preferred === true);
220
248
  if (preferredRapidAccess) {
221
249
  handleRapidAccessSelection(preferredRapidAccess);
@@ -240,6 +268,36 @@ const TMLoginForm = (props) => {
240
268
  useEffect(() => {
241
269
  getArchivesAsync();
242
270
  }, [tmSession]);
271
+ // Default values and step management
272
+ useEffect(() => {
273
+ if (!props.defaultLoginValues || !props.defaultLoginValues.archiveId || defaultLoginAppliedRef.current || !tmSession || !tmSession.TopMediaServer?.BaseAddress)
274
+ return;
275
+ defaultLoginAppliedRef.current = true;
276
+ const archiveId = props.defaultLoginValues.archiveId;
277
+ const validateAndAdvance = async () => {
278
+ try {
279
+ TMSpinner.show({ description: '' });
280
+ const archiveEngine = tmSession.NewArchiveEngine();
281
+ const result = await archiveEngine.RetrieveAsync(archiveId);
282
+ setDcmtArchive(result);
283
+ setLoginStep(2);
284
+ }
285
+ catch (e) {
286
+ ShowAlert({
287
+ message: "Archive id non valido",
288
+ mode: "warning",
289
+ title: "External link",
290
+ duration: 5000
291
+ });
292
+ setManualArchiveID('');
293
+ TMExceptionBoxManager.show({ exception: e });
294
+ }
295
+ finally {
296
+ TMSpinner.hide();
297
+ }
298
+ };
299
+ validateAndAdvance();
300
+ }, [tmSession, props.defaultLoginValues]);
243
301
  useEffect(() => {
244
302
  if (!saveLoginEnable || !dcmtArchive)
245
303
  return;
@@ -396,6 +454,9 @@ const TMLoginForm = (props) => {
396
454
  if (!archives)
397
455
  return;
398
456
  setDcmtArchives(archives);
457
+ // Skip auto-selection when defaultLoginValues provides an archiveId (external link)
458
+ if (props.defaultLoginValues?.archiveId)
459
+ return;
399
460
  if (archives.length === 1) {
400
461
  setDcmtArchive(archives[0]);
401
462
  return;
@@ -16,5 +16,5 @@ interface ITMResultDialogProps {
16
16
  declare const TMResultDialog: React.FC<ITMResultDialogProps>;
17
17
  export default TMResultDialog;
18
18
  export declare class TMResultManager {
19
- static show(result: ResultInfo[], title: string, id1Caption: string | undefined, id2Caption: string | undefined, customMsg?: string, customDuration?: number): void;
19
+ static show(result: ResultInfo[], title: string, id1Caption: string | undefined, id2Caption: string | undefined, customMsg?: string, customDuration?: number, showSuccessAlert?: boolean): void;
20
20
  }
@@ -29,11 +29,13 @@ const TMResultDialog = ({ title, result, id1Caption, id2Caption }) => {
29
29
  };
30
30
  export default TMResultDialog;
31
31
  export class TMResultManager {
32
- static show(result, title, id1Caption, id2Caption, customMsg, customDuration) {
32
+ static show(result, title, id1Caption, id2Caption, customMsg, customDuration, showSuccessAlert = true) {
33
33
  const warningsCount = result.filter(o => o.resultType == ResultTypes.WARNING).length;
34
34
  const errorsCount = result.filter(o => o.resultType == ResultTypes.ERROR).length;
35
35
  if (warningsCount <= 0 && errorsCount <= 0) {
36
- ShowAlert({ message: customMsg && customMsg.length > 0 ? customMsg : SDKUI_Localizator.OperationSuccess, mode: 'success', duration: customDuration && customDuration > 0 ? customDuration : 3000, title: title });
36
+ if (showSuccessAlert) {
37
+ ShowAlert({ message: customMsg && customMsg.length > 0 ? customMsg : SDKUI_Localizator.OperationSuccess, mode: 'success', duration: customDuration && customDuration > 0 ? customDuration : 3000, title: title });
38
+ }
37
39
  return;
38
40
  }
39
41
  let container = document.createElement('div');
@@ -5,6 +5,7 @@ interface TMBlogAttachmentsProps {
5
5
  layoutMode: "compact" | "extended";
6
6
  attachments: Array<BlogPostAttachment>;
7
7
  isSelected: boolean;
8
+ isLoading?: boolean;
8
9
  searchText: string;
9
10
  dcmtTypeDescriptors: Map<number, DcmtTypeDescriptor>;
10
11
  treeFs: FileItem | undefined;