@topconsultnpm/sdkui-react 6.19.0-dev1.5 → 6.19.0-dev1.50

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 (55) hide show
  1. package/lib/components/base/Styled.d.ts +1 -0
  2. package/lib/components/base/Styled.js +40 -0
  3. package/lib/components/base/TMFileManagerDataGridView.js +4 -1
  4. package/lib/components/base/TMTreeView.js +3 -2
  5. package/lib/components/editors/TMHtmlEditor.d.ts +5 -0
  6. package/lib/components/editors/TMHtmlEditor.js +72 -12
  7. package/lib/components/editors/TMMetadataValues.js +90 -40
  8. package/lib/components/features/archive/TMArchive.d.ts +2 -0
  9. package/lib/components/features/archive/TMArchive.js +56 -25
  10. package/lib/components/features/blog/TMBlogCommentForm.js +57 -41
  11. package/lib/components/features/documents/TMDcmtForm.d.ts +10 -3
  12. package/lib/components/features/documents/TMDcmtForm.js +134 -36
  13. package/lib/components/features/documents/TMDragDropOverlay.js +2 -1
  14. package/lib/components/features/documents/TMMasterDetailDcmts.js +1 -1
  15. package/lib/components/features/documents/TMRelationViewer.d.ts +53 -3
  16. package/lib/components/features/documents/TMRelationViewer.js +232 -85
  17. package/lib/components/features/search/TMSearch.d.ts +3 -1
  18. package/lib/components/features/search/TMSearch.js +13 -4
  19. package/lib/components/features/search/TMSearchQueryPanel.d.ts +1 -1
  20. package/lib/components/features/search/TMSearchQueryPanel.js +36 -7
  21. package/lib/components/features/search/TMSearchResult.d.ts +3 -1
  22. package/lib/components/features/search/TMSearchResult.js +102 -328
  23. package/lib/components/features/search/TMSearchResultsMenuItems.d.ts +2 -2
  24. package/lib/components/features/search/TMSearchResultsMenuItems.js +32 -15
  25. package/lib/components/features/workflow/TMWorkflowPopup.d.ts +3 -1
  26. package/lib/components/features/workflow/TMWorkflowPopup.js +17 -4
  27. package/lib/components/forms/TMChooserForm.d.ts +1 -1
  28. package/lib/components/forms/TMChooserForm.js +2 -2
  29. package/lib/components/grids/TMBlogsUtils.d.ts +1 -0
  30. package/lib/components/grids/TMBlogsUtils.js +40 -4
  31. package/lib/components/index.d.ts +3 -0
  32. package/lib/components/index.js +3 -0
  33. package/lib/components/viewers/TMTidViewer.js +29 -4
  34. package/lib/css/tm-sdkui.css +1 -1
  35. package/lib/helper/SDKUI_Globals.d.ts +2 -1
  36. package/lib/helper/SDKUI_Globals.js +1 -0
  37. package/lib/helper/SDKUI_Localizator.d.ts +4 -0
  38. package/lib/helper/SDKUI_Localizator.js +46 -0
  39. package/lib/helper/TMIcons.d.ts +2 -0
  40. package/lib/helper/TMIcons.js +6 -0
  41. package/lib/helper/TMToppyMessage.d.ts +7 -0
  42. package/lib/helper/TMToppyMessage.js +42 -0
  43. package/lib/helper/TMUtils.d.ts +7 -0
  44. package/lib/helper/TMUtils.js +16 -0
  45. package/lib/helper/index.d.ts +1 -0
  46. package/lib/helper/index.js +1 -0
  47. package/lib/hooks/useRelatedDocuments.d.ts +72 -0
  48. package/lib/hooks/useRelatedDocuments.js +655 -0
  49. package/lib/index.d.ts +1 -0
  50. package/lib/index.js +1 -0
  51. package/lib/ts/types.d.ts +14 -0
  52. package/lib/ts/types.js +15 -0
  53. package/lib/utils/theme.d.ts +1 -0
  54. package/lib/utils/theme.js +1 -0
  55. package/package.json +2 -2
@@ -1,11 +1,12 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React, { useCallback, useEffect, useMemo, useState } from 'react';
3
- import { SDK_Globals, DataColumnTypes, MetadataDataDomains, DataListViewModes, MetadataFormats, LayoutModes, TemplateTIDs, DcmtTypeListCacheService, AccessLevels, SystemMIDsAsNumber, RelationCacheService, RelationTypes } from '@topconsultnpm/sdk-ts';
3
+ import { SDK_Globals, DataColumnTypes, MetadataDataDomains, DataListViewModes, MetadataFormats, LayoutModes, TemplateTIDs, DcmtTypeListCacheService, AccessLevels, SystemMIDsAsNumber, RetrieveFileOptions, DcmtOpers, GeneralRetrieveFormats } from '@topconsultnpm/sdk-ts';
4
4
  import styled from 'styled-components';
5
5
  import { getCommandsMenuItems, getSelectedDcmtsOrFocused } from './TMSearchResultsMenuItems';
6
6
  import { genUniqueId, IconShow, IconBoard, IconDcmtTypeSys, IconDetailDcmts, SDKUI_Localizator, IconDelete, IconRefresh, IconMenuVertical, IconDownload, deepCompare, getDataColumnName, searchResultDescriptorToSimpleArray, searchResultToMetadataValues, IconSearchCheck, TMCommandsContextMenu } from '../../../helper';
7
7
  import { useDcmtOperations } from '../../../hooks/useDcmtOperations';
8
8
  import { useInputAttachmentsDialog, useInputCvtFormatDialog } from '../../../hooks/useInputDialog';
9
+ import { useRelatedDocuments } from '../../../hooks/useRelatedDocuments';
9
10
  import { DcmtOperationTypes, FormModes, SearchResultContext, DownloadTypes } from '../../../ts';
10
11
  import { Gutters, TMColors } from '../../../utils/theme';
11
12
  import { StyledModalContainer, StyledBadge, StyledMultiViewPanel } from '../../base/Styled';
@@ -21,7 +22,6 @@ import TMMetadataValues from '../../editors/TMMetadataValues';
21
22
  import { TMSaveFormButtonPrevious, TMSaveFormButtonNext } from '../../forms/TMSaveForm';
22
23
  import TMDataListItemViewer from '../../viewers/TMDataListItemViewer';
23
24
  import TMTidViewer from '../../viewers/TMTidViewer';
24
- import { hasDetailRelations, hasMasterRelations } from '../../../helper/dcmtsHelper';
25
25
  import TMDcmtPreview from '../documents/TMDcmtPreview';
26
26
  import TMFloatingToolbar from '../../base/TMFloatingToolbar';
27
27
  import { WorkFlowApproveRejectPopUp, WorkFlowMoreInfoPopUp, WorkFlowOperationButtons, WorkFlowReAssignPopUp } from '../workflow/TMWorkflowPopup';
@@ -40,6 +40,8 @@ import ShowAlert from '../../base/TMAlert';
40
40
  import TMSpinner from '../../base/TMSpinner';
41
41
  import TMChooserForm from '../../forms/TMChooserForm';
42
42
  import TMModal from '../../base/TMModal';
43
+ import TMSearch from './TMSearch';
44
+ import TMArchive from '../archive/TMArchive';
43
45
  //#region Helper Methods
44
46
  export const getSearchResultCountersSingleCategory = (searchResults) => {
45
47
  // let totDcmtTypes = searchResults.length;
@@ -57,7 +59,7 @@ const orderByName = (array) => {
57
59
  return 1;
58
60
  } return 0; });
59
61
  };
60
- const TMSearchResult = ({ context = SearchResultContext.METADATA_SEARCH, isVisible = true, allowRelations = true, openDcmtFormAsModal = false, searchResults = [], showSearchResultSidebar = true, showSelector = false, groupId, title, isClosable = false, allowFloatingBar = true, showToolbarHeader = true, selectedSearchResultTID, workingGroupContext = undefined, disableAccordionIfSingleCategory = false, floatingActionConfig, openInOffice, onRefreshAfterAddDcmtToFavs, onRefreshSearchAsync, onSelectedTIDChanged, onWFOperationCompleted, onClose, onFileOpened, onTaskCreateRequest, openWGsCopyMoveForm, openEditPdf, openCommentFormCallback, openAddDocumentForm, openS4TViewer = false, onOpenS4TViewerRequest, passToArchiveCallback, showTodoDcmtForm = false }) => {
62
+ const TMSearchResult = ({ context = SearchResultContext.METADATA_SEARCH, isVisible = true, allowRelations = true, openDcmtFormAsModal = false, searchResults = [], showSearchResultSidebar = true, showSelector = false, groupId, title, isClosable = false, allowFloatingBar = true, showToolbarHeader = true, showBackButton = true, selectedSearchResultTID, workingGroupContext = undefined, disableAccordionIfSingleCategory = false, floatingActionConfig, openInOffice, onRefreshAfterAddDcmtToFavs, onRefreshSearchAsync, onSelectedTIDChanged, onWFOperationCompleted, onClose, onFileOpened, onTaskCreateRequest, openWGsCopyMoveForm, openEditPdf, openCommentFormCallback, openAddDocumentForm, openS4TViewer = false, onOpenS4TViewerRequest, passToArchiveCallback, showTodoDcmtForm = false, onReferenceClick }) => {
61
63
  const [id, setID] = useState('');
62
64
  const [showApprovePopup, setShowApprovePopup] = useState(false);
63
65
  const [showRejectPopup, setShowRejectPopup] = useState(false);
@@ -70,29 +72,11 @@ const TMSearchResult = ({ context = SearchResultContext.METADATA_SEARCH, isVisib
70
72
  const [selectedSearchResult, setSelectedSearchResult] = useState();
71
73
  const [currentSearchResults, setCurrentSearchResults] = useState(searchResults || []);
72
74
  const [showSearch, setShowSearch] = useState(false);
73
- // States for Related Documents
74
- const [relatedDcmts, setRelatedDcmts] = useState(undefined);
75
- const [showRelatedDcmtsChooser, setShowRelatedDcmtsChooser] = useState(false);
76
- const [archiveType, setArchiveType] = useState(undefined);
77
- const [isOpenDetails, setIsOpenDetails] = useState(false);
78
- const [isOpenMaster, setIsOpenMaster] = useState(false);
79
- const [isOpenArchiveRelationForm, setIsOpenArchiveRelationForm] = useState(false);
80
- const [archiveRelatedDcmtFormTID, setArchiveRelatedDcmtFormTID] = useState(undefined);
81
- const [archiveRelatedDcmtFormMids, setArchiveRelatedDcmtFormMids] = useState([]);
82
- const [relatedDcmtsChooserDataSource, setRelatedDcmtsChooserDataSource] = useState(undefined);
83
- const [showPairDcmtsModal, setShowPairDcmtsModal] = useState(false);
84
- const [isPairingManyToMany, setIsPairingManyToMany] = useState(false);
85
- const [pairedSearchResults, setPairedSearchResults] = useState([]);
86
- const [manyToManyRelations, setManyToManyRelations] = useState(undefined);
87
- const [showManyToManyChooser, setShowManyToManyChooser] = useState(false);
88
- const [manyToManyChooserDataSource, setManyToManyChooserDataSource] = useState(undefined);
75
+ const [sharedDcmtSearchResults, setSharedDcmtSearchResults] = useState([]);
89
76
  const [secondaryMasterDcmts, setSecondaryMasterDcmts] = useState([]);
90
77
  const [isOpenDcmtForm, setIsOpenDcmtForm] = useState(false);
91
- const [currentTIDHasDetailRelations, setCurrentTIDHasDetailRelations] = useState();
92
- const [currentTIDHasMasterRelations, setCurrentTIDHasMasterRelations] = useState();
93
- const [canArchiveMasterRelation, setCanArchiveMasterRelation] = useState(false);
94
- const [canArchiveDetailRelation, setCanArchiveDetailRelation] = useState(false);
95
78
  const [isOpenBatchUpdate, setIsOpenBatchUpdate] = useState(false);
79
+ const [isOpenSharedArchive, setIsOpenSharedArchive] = useState(false);
96
80
  const [visibleItems, setVisibleItems] = useState([]);
97
81
  const [focusedItem, setFocusedItem] = useState();
98
82
  const [selectedItems, setSelectedItems] = useState([]);
@@ -100,18 +84,21 @@ const TMSearchResult = ({ context = SearchResultContext.METADATA_SEARCH, isVisib
100
84
  const [currentMetadataValues, setCurrentMetadataValues] = useState([]);
101
85
  const [dcmtFormLayoutMode, setDcmtFormLayoutMode] = useState(LayoutModes.Update);
102
86
  const [isModifiedBatchUpdate, setIsModifiedBatchUpdate] = useState(false);
87
+ const [sharedDcmtFile, setSharedDcmtFile] = useState(undefined);
103
88
  // State to control whether the export form (for exporting to Excel/CSV/txt and others) should be shown
104
89
  const [showExportForm, setShowExportForm] = useState(false);
105
90
  const [confirmFormat, ConfirmFormatDialog] = useInputCvtFormatDialog();
106
91
  const { openConfirmAttachmentsDialog, ConfirmAttachmentsDialog } = useInputAttachmentsDialog();
107
- const { abortController, showWaitPanel, waitPanelTitle, showPrimary, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, downloadDcmtsAsync, runOperationAsync } = useDcmtOperations();
92
+ const { abortController, showWaitPanel, waitPanelTitle, showPrimary, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, downloadDcmtsAsync, runOperationAsync, getDcmtFileAsync } = useDcmtOperations();
93
+ const relatedDocuments = useRelatedDocuments({ selectedSearchResult, focusedItem, currentSearchResults });
94
+ const { relatedDcmts, showRelatedDcmtsChooser, archiveType, isOpenDetails, isOpenMaster, isOpenArchiveRelationForm, archiveRelatedDcmtFormTID, archiveRelatedDcmtFormMids, relatedDcmtsChooserDataSource, showPairDcmtsModal, isPairingManyToMany, pairedSearchResults, manyToManyRelations, selectedManyToManyRelation, showManyToManyChooser, manyToManyChooserDataSource, showPairSearchModal, pairSearchModalTargetTID, pairSearchModalParentTID, pairSearchModalParentDID, pairSearchModalRelation, pairSearchModalInputMids, currentTIDHasDetailRelations, currentTIDHasMasterRelations, canArchiveMasterRelation, canArchiveDetailRelation, hasManyToManyRelation, setIsOpenDetails, setIsOpenMaster, setShowRelatedDcmtsChooser, setShowManyToManyChooser, setShowPairDcmtsModal, setShowPairSearchModal, setIsOpenArchiveRelationForm, setArchiveType, setArchiveRelatedDcmtFormTID, setArchiveRelatedDcmtFormMids, pairFloatingActionConfig, pairSearchModalFloatingActionConfig, archiveMasterDocuments, archiveDetailDocuments, pairManyToMany, checkRelatedDcmtsArchiveCapability, checkManyToManyCapability, archiveRelatedDcmtHandler, executeManyToManyPairing, } = relatedDocuments;
108
95
  const deviceType = useDeviceType();
109
96
  const isMobile = deviceType === DeviceType.MOBILE;
110
- const disable = getSelectedDcmtsOrFocused(selectedItems, focusedItem).length === 0;
97
+ const selectedDocs = getSelectedDcmtsOrFocused(selectedItems, focusedItem);
111
98
  // Disable the "Sign/Approve" button if:
112
99
  // 1. No document or multiple documents are selected, OR
113
100
  // 2. Exactly one document is selected but its FILEEXT property is null
114
- const disableSignApproveDisable = getSelectedDcmtsOrFocused(selectedItems, focusedItem).length !== 1 || (getSelectedDcmtsOrFocused(selectedItems, focusedItem).length === 1 && getSelectedDcmtsOrFocused(selectedItems, focusedItem)[0].FILEEXT === null);
101
+ const disableSignApproveDisable = selectedDocs.length !== 1 || (selectedDocs.length === 1 && selectedDocs[0].FILEEXT === null);
115
102
  const dcmtsReturned = (searchResults?.length > 1 ? selectedSearchResult?.dcmtsReturned : searchResults[0]?.dcmtsReturned ?? 0);
116
103
  const dcmtsFound = (searchResults?.length > 1 ? selectedSearchResult?.dcmtsFound : searchResults[0]?.dcmtsFound ?? 0);
117
104
  useEffect(() => { setID(genUniqueId()); }, []);
@@ -134,15 +121,13 @@ const TMSearchResult = ({ context = SearchResultContext.METADATA_SEARCH, isVisib
134
121
  DcmtTypeListCacheService.GetWithNotGrantedAsync(selectedSearchResult?.fromTID, Number(selectedSearchResult?.dtdResult?.rows?.[0]?.[1])).then((dtd) => {
135
122
  setFromDTD(dtd);
136
123
  });
137
- hasDetailRelations(selectedSearchResult?.fromTID).then((value) => setCurrentTIDHasDetailRelations(value));
138
- hasMasterRelations(selectedSearchResult?.fromTID).then((value) => setCurrentTIDHasMasterRelations(value));
139
124
  checkRelatedDcmtsArchiveCapability();
125
+ checkManyToManyCapability();
140
126
  // Ricava il nuovo dataSource
141
127
  const newDataSource = searchResultDescriptorToSimpleArray(selectedSearchResult);
142
128
  // Se esiste almeno una riga, seleziona la prima
143
129
  setFocusedItem(newDataSource && newDataSource.length > 0 ? newDataSource[0] : undefined);
144
- setSelectedItems([]);
145
- }, [selectedSearchResult]);
130
+ }, [selectedSearchResult, checkRelatedDcmtsArchiveCapability, checkManyToManyCapability]);
146
131
  useEffect(() => {
147
132
  if (!focusedItem)
148
133
  return;
@@ -166,6 +151,46 @@ const TMSearchResult = ({ context = SearchResultContext.METADATA_SEARCH, isVisib
166
151
  });
167
152
  }, [currentMetadataValues]);
168
153
  const openFormHandler = (layoutMode) => { setIsOpenDcmtForm(true); setDcmtFormLayoutMode(layoutMode); };
154
+ const openSharedArchiveHandler = async () => {
155
+ const dcmts = getSelectedDcmtsOrFocused(selectedItems, focusedItem);
156
+ if (dcmts.length === 0) {
157
+ ShowAlert({ message: "Nessun documento selezionato", mode: "warning", title: 'Archivio Condivisa', duration: 3000 });
158
+ return;
159
+ }
160
+ try {
161
+ const rfo = new RetrieveFileOptions();
162
+ rfo.retrieveReason = DcmtOpers.None;
163
+ rfo.generalRetrieveFormat = GeneralRetrieveFormats.OriginalUnsigned;
164
+ let dcmtFile = await getDcmtFileAsync({ TID: focusedItem?.TID, DID: focusedItem?.DID }, rfo, 'Archiviazione Condivisa', false, true);
165
+ if (dcmtFile) {
166
+ setSharedDcmtFile(dcmtFile?.file);
167
+ }
168
+ setIsOpenSharedArchive(true);
169
+ }
170
+ catch (e) {
171
+ TMExceptionBoxManager.show({ exception: e });
172
+ }
173
+ };
174
+ const showSharedDcmtsHandler = async () => {
175
+ try {
176
+ TMSpinner.show({ description: "Caricamento documenti condivisi..." });
177
+ const se = SDK_Globals.tmSession?.NewSearchEngine();
178
+ const sharedDcmts = await se?.GetSharedDcmtsAsync(getSelectedDcmtsOrFocused(selectedItems, focusedItem)[0].TID, getSelectedDcmtsOrFocused(selectedItems, focusedItem)[0].DID);
179
+ if (sharedDcmts && sharedDcmts.length > 0) {
180
+ console.log(sharedDcmts);
181
+ setSharedDcmtSearchResults(sharedDcmts);
182
+ }
183
+ else {
184
+ ShowAlert({ message: "Nessun documento condiviso trovato.", mode: "info", title: 'Documenti Condivisi', duration: 5000 });
185
+ }
186
+ }
187
+ catch (e) {
188
+ TMExceptionBoxManager.show({ exception: e });
189
+ }
190
+ finally {
191
+ TMSpinner.hide();
192
+ }
193
+ };
169
194
  const openTaskFormHandler = (onTaskCreated) => {
170
195
  if (selectedItems.length > 1)
171
196
  return;
@@ -260,7 +285,7 @@ const TMSearchResult = ({ context = SearchResultContext.METADATA_SEARCH, isVisib
260
285
  return;
261
286
  if (e.target === 'content') {
262
287
  e.items = e.items || [];
263
- const menuItems = getCommandsMenuItems(isMobile, fromDTD, selectedItems, focusedItem, context, showFloatingBar, workingGroupContext, showSearch, setShowFloatingBar, openFormHandler, downloadDcmtsAsync, runOperationAsync, onRefreshSearchAsync, refreshSelectionDataRowsAsync, onRefreshAfterAddDcmtToFavs, confirmFormat, openConfirmAttachmentsDialog, openTaskFormHandler, openDetailDcmtsFormHandler, openMasterDcmtsFormHandler, openBatchUpdateFormHandler, openExportForm, handleToggleSearch, handleSignApprove, openWGsCopyMoveForm, openCommentFormCallback, openEditPdf, openAddDocumentForm, passToArchiveCallback, archiveMasterDocuments, archiveDetailDocuments, currentTIDHasMasterRelations, currentTIDHasDetailRelations, canArchiveMasterRelation, canArchiveDetailRelation, pairManyToMany);
288
+ const menuItems = getCommandsMenuItems(isMobile, fromDTD, selectedItems, focusedItem, context, showFloatingBar, workingGroupContext, showSearch, setShowFloatingBar, openFormHandler, openSharedArchiveHandler, showSharedDcmtsHandler, downloadDcmtsAsync, runOperationAsync, onRefreshSearchAsync, refreshSelectionDataRowsAsync, onRefreshAfterAddDcmtToFavs, confirmFormat, openConfirmAttachmentsDialog, openTaskFormHandler, openDetailDcmtsFormHandler, openMasterDcmtsFormHandler, openBatchUpdateFormHandler, openExportForm, handleToggleSearch, handleSignApprove, openWGsCopyMoveForm, openCommentFormCallback, openEditPdf, openAddDocumentForm, passToArchiveCallback, archiveMasterDocuments, archiveDetailDocuments, currentTIDHasMasterRelations, currentTIDHasDetailRelations, canArchiveMasterRelation, canArchiveDetailRelation, pairManyToMany, hasManyToManyRelation);
264
289
  e.items.push(...menuItems);
265
290
  }
266
291
  };
@@ -424,297 +449,8 @@ const TMSearchResult = ({ context = SearchResultContext.METADATA_SEARCH, isVisib
424
449
  break;
425
450
  }
426
451
  };
427
- //#region Related Documents Archive Section
428
- const getAllRelationsAsync = async () => {
429
- const tmSession = SDK_Globals.tmSession;
430
- try {
431
- TMSpinner.show({ description: SDKUI_Localizator.Loading });
432
- let relations = await RelationCacheService.GetAllAsync(tmSession);
433
- if (!relations)
434
- throw new Error("Impossibile caricare le relazioni.");
435
- return relations;
436
- }
437
- catch (error) {
438
- TMExceptionBoxManager.show({ exception: error });
439
- return undefined;
440
- }
441
- finally {
442
- TMSpinner.hide();
443
- }
444
- };
445
- const checkRelatedDcmtsArchiveCapability = async () => {
446
- const tid = selectedSearchResult?.fromTID;
447
- if (!tid) {
448
- setCanArchiveMasterRelation(false);
449
- setCanArchiveDetailRelation(false);
450
- return;
451
- }
452
- try {
453
- const relations = await getAllRelationsAsync();
454
- if (!relations) {
455
- setCanArchiveMasterRelation(false);
456
- setCanArchiveDetailRelation(false);
457
- return;
458
- }
459
- const detailRelations = relations.filter(r => r.detailTID === tid);
460
- const hasMasterWithAssociations = detailRelations.some(rel => rel.associations && rel.associations.length > 0);
461
- setCanArchiveMasterRelation(hasMasterWithAssociations);
462
- const masterRelations = relations.filter(r => r.masterTID === tid);
463
- const hasDetailWithAssociations = masterRelations.some(rel => rel.associations && rel.associations.length > 0);
464
- setCanArchiveDetailRelation(hasDetailWithAssociations);
465
- }
466
- catch (error) {
467
- console.error("Error checking archive capability:", error);
468
- setCanArchiveMasterRelation(false);
469
- setCanArchiveDetailRelation(false);
470
- }
471
- };
472
- const getFocusedItem = () => {
473
- if (!focusedItem || currentSearchResults.length !== 1)
474
- return undefined;
475
- return { mdList: currentSearchResults[0].dtdResult?.rows?.[focusedItem?.rowIndex ?? 0], mids: currentSearchResults[0].selectMIDs ?? [] };
476
- };
477
- const fetchAssociatedValues = (mid) => {
478
- let mdList = getFocusedItem();
479
- if (!mdList)
480
- return;
481
- let index = mdList.mids.findIndex(m => m == mid);
482
- if (index === -1)
483
- return;
484
- return mdList.mdList?.[index];
485
- };
486
- const filterRelationsByType = (relations, tid, type) => {
487
- return type === 'detail'
488
- ? relations.filter(r => r.masterTID == tid)
489
- : relations.filter(r => r.detailTID == tid);
490
- };
491
- const filterRelationsWithAssociations = (relations) => {
492
- return relations.filter(rel => rel.associations && rel.associations.length > 0);
493
- };
494
- const getRelatedDcmt = async (relation, type) => {
495
- return await DcmtTypeListCacheService.GetAsync(type === 'detail' ? relation.detailTID : relation.masterTID);
496
- };
497
- const showNoRelationsAlert = (type) => {
498
- ShowAlert({
499
- message: type === 'detail'
500
- ? "Nessun documento di dettaglio trovato per l'archiviazione."
501
- : "Nessun documento di master trovato per l'archiviazione.",
502
- mode: 'info',
503
- title: type === 'detail' ? SDKUI_Localizator.DcmtsDetail : SDKUI_Localizator.DcmtsMaster,
504
- duration: 5000
505
- });
506
- };
507
- const showNoAssociationsAlert = (type) => {
508
- ShowAlert({
509
- message: type === 'detail'
510
- ? "Nessuna associazione trovata per i documenti di dettaglio."
511
- : "Nessuna associazione trovata per i documenti di master.",
512
- mode: 'info',
513
- title: type === 'detail' ? SDKUI_Localizator.DcmtsDetail : SDKUI_Localizator.DcmtsMaster,
514
- duration: 5000
515
- });
516
- };
517
- const mapAssociationsToMids = (relation, type) => {
518
- return relation.associations?.map(assoc => ({
519
- mid: type === 'detail' ? (assoc.item2 ?? 0) : (assoc.item1 ?? 0),
520
- value: fetchAssociatedValues(type === 'detail' ? (assoc.item1 ?? 0) : (assoc.item2 ?? 0)) ?? ''
521
- })) ?? [];
522
- };
523
- const archiveRelatedDcmtHandler = (relation, type) => {
524
- const targetTID = type === 'detail' ? relation.detailTID : relation.masterTID;
525
- if (!targetTID)
526
- return;
527
- const mids = mapAssociationsToMids(relation, type);
528
- setArchiveType(type);
529
- setArchiveRelatedDcmtFormTID(targetTID);
530
- setArchiveRelatedDcmtFormMids(mids);
531
- setIsOpenArchiveRelationForm(true);
532
- };
533
- const archiveRelatedDocuments = async (tid, type) => {
534
- try {
535
- TMSpinner.show({ description: SDKUI_Localizator.Loading });
536
- const relations = await getAllRelationsAsync();
537
- if (!relations || !tid)
538
- return;
539
- const filteredRelations = filterRelationsByType(relations, tid, type);
540
- if (!filteredRelations || filteredRelations.length === 0) {
541
- showNoRelationsAlert(type);
542
- return;
543
- }
544
- const withAssociations = filterRelationsWithAssociations(filteredRelations);
545
- if (withAssociations.length === 0) {
546
- showNoAssociationsAlert(type);
547
- return;
548
- }
549
- setRelatedDcmts(withAssociations);
550
- if (withAssociations.length > 1) {
551
- const dataSourcePromises = withAssociations.map(async (rel) => {
552
- const relatedDcmt = await getRelatedDcmt(rel, type);
553
- return { id: rel?.id, name: relatedDcmt?.name };
554
- });
555
- const dataSource = await Promise.all(dataSourcePromises);
556
- setRelatedDcmtsChooserDataSource(dataSource);
557
- setArchiveType(type);
558
- setShowRelatedDcmtsChooser(true);
559
- }
560
- else {
561
- archiveRelatedDcmtHandler(withAssociations[0], type);
562
- }
563
- }
564
- catch (error) {
565
- TMExceptionBoxManager.show({ exception: error });
566
- }
567
- finally {
568
- TMSpinner.hide();
569
- }
570
- };
571
- const archiveDetailDocuments = async (tid) => {
572
- await archiveRelatedDocuments(tid, 'detail');
573
- };
574
- const archiveMasterDocuments = async (tid) => {
575
- await archiveRelatedDocuments(tid, 'master');
576
- };
577
- const executeManyToManyPairing = async (relation, isPairing) => {
578
- const searchEngine = SDK_Globals.tmSession?.NewSearchEngine();
579
- if (!focusedItem?.TID || !focusedItem?.DID) {
580
- alert("Seleziona un documento per eseguire la ricerca molti-a-molti.");
581
- return;
582
- }
583
- let qd;
584
- if (relation.detailTID === selectedSearchResult?.fromTID) {
585
- qd = relation.retrieveMastersQuery;
586
- }
587
- if (relation.masterTID === selectedSearchResult?.fromTID) {
588
- qd = relation.retrieveDetailsQuery;
589
- }
590
- if (!qd) {
591
- alert("La relazione molti-a-molti selezionata non ha una query di ricerca definita.");
592
- return;
593
- }
594
- qd = structuredClone(qd);
595
- if (qd.select) {
596
- for (const s of qd.select) {
597
- s.visibility = 1;
598
- }
599
- }
600
- const qdRetrieveParamsValue = {
601
- from: { tid: focusedItem.TID },
602
- select: [],
603
- where: [
604
- {
605
- tid: focusedItem.TID,
606
- mid: 5,
607
- leftBrackets: "(",
608
- rightBrackets: ")",
609
- operator: 0,
610
- value1: focusedItem.DID.toString()
611
- }
612
- ]
613
- };
614
- let notMappedMIDs = false;
615
- if (qd.params && qd.params.length > 0) {
616
- for (const param of qd.params) {
617
- if (!param.mappedMID)
618
- continue;
619
- qdRetrieveParamsValue.select.push({
620
- tid: param.mappedTID ?? focusedItem.TID,
621
- mid: param.mappedMID,
622
- visibility: 1
623
- });
624
- const currentRowValue = currentSearchResults[0]?.dtdResult?.rows?.[focusedItem.rowIndex];
625
- const midIndex = currentSearchResults[0]?.selectMIDs?.indexOf(param.mappedMID);
626
- if (currentRowValue && midIndex !== undefined && midIndex >= 0) {
627
- const value = currentRowValue[midIndex];
628
- param.value = value ?? '';
629
- if (param.value === null || param.value === '')
630
- notMappedMIDs = true;
631
- }
632
- else {
633
- notMappedMIDs = true;
634
- }
635
- }
636
- if (notMappedMIDs && qdRetrieveParamsValue.select && qdRetrieveParamsValue.select.length > 0) {
637
- const paramMetadata = await searchEngine.SearchByIDAsync(qdRetrieveParamsValue);
638
- if (paramMetadata?.dtdResult?.rows?.[0]) {
639
- for (const param of qd.params) {
640
- if (!param.mappedMID)
641
- continue;
642
- const colIndex = paramMetadata.selectMIDs?.indexOf(param.mappedMID);
643
- if (colIndex !== undefined && colIndex >= 0) {
644
- const value = paramMetadata.dtdResult.rows[0][colIndex];
645
- param.value = value ?? '';
646
- }
647
- }
648
- }
649
- }
650
- if (qd.where && qd.where.length > 0) {
651
- for (const whereItem of qd.where) {
652
- for (const param of qd.params) {
653
- if (!param.name)
654
- continue;
655
- param.value ??= '';
656
- const paramValue = param.value.toString();
657
- if (whereItem.value1) {
658
- whereItem.value1 = whereItem.value1.replace(param.name, paramValue);
659
- }
660
- if (whereItem.value2) {
661
- whereItem.value2 = whereItem.value2.replace(param.name, paramValue);
662
- }
663
- }
664
- }
665
- }
666
- }
667
- const sq = await searchEngine.SearchByIDAsync(qd);
668
- if (!sq?.dtdResult?.rows || sq.dtdResult.rows.length === 0) {
669
- alert("Nessun documento trovato.");
670
- return;
671
- }
672
- setPairedSearchResults([sq]);
673
- setIsPairingManyToMany(isPairing);
674
- setShowPairDcmtsModal(true);
675
- };
676
- const pairManyToMany = async (isPairing) => {
677
- try {
678
- TMSpinner.show({ description: SDKUI_Localizator.Loading });
679
- const relations = await getAllRelationsAsync();
680
- if (!relations)
681
- return;
682
- if (!relations.some(r => r.relationType === RelationTypes.ManyToMany)) {
683
- alert("Nessuna relazione molti-a-molti definita nel sistema.");
684
- return;
685
- }
686
- const manyToManyRels = relations.filter(r => r.relationType === RelationTypes.ManyToMany);
687
- if (!manyToManyRels.some(r => r.masterTID === selectedSearchResult?.fromTID || r.detailTID === selectedSearchResult?.fromTID)) {
688
- alert("Nessuna relazione molti-a-molti definita per il tipo di documento selezionato.");
689
- return;
690
- }
691
- const relsManyToMany = manyToManyRels.filter(r => r.masterTID === selectedSearchResult?.fromTID || r.detailTID === selectedSearchResult?.fromTID);
692
- setManyToManyRelations(relsManyToMany);
693
- if (relsManyToMany.length > 1) {
694
- const dataSourcePromises = relsManyToMany.map(async (rel) => {
695
- const targetTID = rel.masterTID === selectedSearchResult?.fromTID ? rel.detailTID : rel.masterTID;
696
- const relatedDcmt = await DcmtTypeListCacheService.GetAsync(targetTID);
697
- return { id: rel?.id, name: relatedDcmt?.name };
698
- });
699
- const dataSource = await Promise.all(dataSourcePromises);
700
- setManyToManyChooserDataSource(dataSource);
701
- setIsPairingManyToMany(isPairing);
702
- setShowManyToManyChooser(true);
703
- }
704
- else {
705
- await executeManyToManyPairing(relsManyToMany[0], isPairing);
706
- }
707
- }
708
- catch (error) {
709
- TMExceptionBoxManager.show({ exception: error });
710
- }
711
- finally {
712
- TMSpinner.hide();
713
- }
714
- };
715
- //#endregion Related Documents Archive Section
716
452
  const searchResutlToolbar = _jsxs(_Fragment, { children: [(dcmtsReturned != dcmtsFound) && _jsx("p", { style: { backgroundColor: `white`, color: TMColors.primaryColor, textAlign: 'center', padding: '1px 4px', borderRadius: '3px', display: 'flex' }, children: `${dcmtsReturned}/${dcmtsFound} restituiti` }), context === SearchResultContext.FAVORITES_AND_RECENTS &&
717
- _jsx("div", { style: { display: 'flex', alignItems: 'center', gap: '5px' }, children: _jsx(TMButton, { btnStyle: 'icon', icon: _jsx(IconDelete, { color: 'white' }), caption: "Rimuovi da " + (selectedSearchResult?.category === "Favorites" ? '"Preferiti"' : '"Recenti"'), disabled: getSelectedDcmtsOrFocused(selectedItems, focusedItem).length <= 0, onClick: removeDcmtFromFavsOrRecents }) }), _jsx(TMButton, { btnStyle: 'icon', icon: _jsx(IconRefresh, { color: 'white' }), caption: SDKUI_Localizator.Refresh, onClick: onRefreshSearchAsync }), _jsx(IconMenuVertical, { id: `commands-header-${id}`, color: 'white', cursor: 'pointer' }), _jsx(TMCommandsContextMenu, { target: `#commands-header-${id}`, showEvent: "click", menuItems: getCommandsMenuItems(isMobile, fromDTD, selectedItems, focusedItem, context, showFloatingBar, workingGroupContext, showSearch, setShowFloatingBar, openFormHandler, downloadDcmtsAsync, runOperationAsync, onRefreshSearchAsync, refreshSelectionDataRowsAsync, onRefreshAfterAddDcmtToFavs, confirmFormat, openConfirmAttachmentsDialog, openTaskFormHandler, openDetailDcmtsFormHandler, openMasterDcmtsFormHandler, openBatchUpdateFormHandler, openExportForm, handleToggleSearch, handleSignApprove, openWGsCopyMoveForm, openCommentFormCallback, openEditPdf, openAddDocumentForm, passToArchiveCallback, archiveMasterDocuments, archiveDetailDocuments, currentTIDHasMasterRelations, currentTIDHasDetailRelations, canArchiveMasterRelation, canArchiveDetailRelation, pairManyToMany) })] });
453
+ _jsx("div", { style: { display: 'flex', alignItems: 'center', gap: '5px' }, children: _jsx(TMButton, { btnStyle: 'icon', icon: _jsx(IconDelete, { color: 'white' }), caption: "Rimuovi da " + (selectedSearchResult?.category === "Favorites" ? '"Preferiti"' : '"Recenti"'), disabled: getSelectedDcmtsOrFocused(selectedItems, focusedItem).length <= 0, onClick: removeDcmtFromFavsOrRecents }) }), _jsx(TMButton, { btnStyle: 'icon', icon: _jsx(IconRefresh, { color: 'white' }), caption: SDKUI_Localizator.Refresh, onClick: onRefreshSearchAsync }), _jsx(IconMenuVertical, { id: `commands-header-${id}`, color: 'white', cursor: 'pointer' }), _jsx(TMCommandsContextMenu, { target: `#commands-header-${id}`, showEvent: "click", menuItems: getCommandsMenuItems(isMobile, fromDTD, selectedItems, focusedItem, context, showFloatingBar, workingGroupContext, showSearch, setShowFloatingBar, openFormHandler, openSharedArchiveHandler, showSharedDcmtsHandler, downloadDcmtsAsync, runOperationAsync, onRefreshSearchAsync, refreshSelectionDataRowsAsync, onRefreshAfterAddDcmtToFavs, confirmFormat, openConfirmAttachmentsDialog, openTaskFormHandler, openDetailDcmtsFormHandler, openMasterDcmtsFormHandler, openBatchUpdateFormHandler, openExportForm, handleToggleSearch, handleSignApprove, openWGsCopyMoveForm, openCommentFormCallback, openEditPdf, openAddDocumentForm, passToArchiveCallback, archiveMasterDocuments, archiveDetailDocuments, currentTIDHasMasterRelations, currentTIDHasDetailRelations, canArchiveMasterRelation, canArchiveDetailRelation, pairManyToMany, hasManyToManyRelation) })] });
718
454
  const middlePanelToolbar = _jsxs("div", { style: { width: 'max-content', display: 'flex', alignItems: 'center', gap: '10px' }, children: [_jsx(TMSaveFormButtonPrevious, { btnStyle: 'icon', isModified: false, iconColor: TMColors.default_background, formMode: FormModes.ReadOnly, canPrev: canNavigateHandler('prev'), onPrev: () => onNavigateHandler('prev') }), _jsx(TMSaveFormButtonNext, { btnStyle: 'icon', isModified: false, iconColor: TMColors.default_background, formMode: FormModes.ReadOnly, canNext: canNavigateHandler('next'), onNext: () => onNavigateHandler('next') })] });
719
455
  const handleAddItem = (tid, did) => {
720
456
  let newItem = { TID: tid ?? 0, DID: did ?? 0 };
@@ -731,14 +467,24 @@ const TMSearchResult = ({ context = SearchResultContext.METADATA_SEARCH, isVisib
731
467
  _jsx(TMLayoutItem, { children: _jsx(TMSearchResultSelector, { searchResults: currentSearchResults, disableAccordionIfSingleCategory: disableAccordionIfSingleCategory, selectedTID: selectedSearchResultTID, onSelectionChanged: onSearchResultSelectionChanged }) })
732
468
  :
733
469
  _jsx(_Fragment, {}), _jsxs(TMLayoutItem, { children: [_jsx(TMSearchResultGrid, { showSearch: showSearch, inputFocusedItem: focusedItem, inputSelectedItems: selectedItems, searchResult: searchResults.length > 1 ? selectedSearchResult : searchResults[0], lastUpdateSearchTime: lastUpdateSearchTime, openInOffice: openInOffice, onDblClick: () => openFormHandler(LayoutModes.Update), onContextMenuPreparing: onContextMenuPreparing, onSelectionChanged: (items) => { setSelectedItems(items); }, onVisibleItemChanged: setVisibleItems, onFocusedItemChanged: setFocusedItem, onDownloadDcmtsAsync: async (inputDcmts, downloadType, downloadMode, _y, confirmAttachments) => await downloadDcmtsAsync(inputDcmts, downloadType, downloadMode, onFileOpened, confirmAttachments), showExportForm: showExportForm, onCloseExportForm: onCloseExportForm }), allowFloatingBar && showFloatingBar && deviceType !== DeviceType.MOBILE &&
734
- _jsxs(TMFloatingToolbar, { backgroundColor: TMColors.primaryColor, initialLeft: '10px', initialTop: 'calc(100% - 75px)', children: [fromDTD?.perm?.canRetrieveFile === AccessLevels.Yes && _jsx(TMButton, { btnStyle: 'icon', caption: "Download file", disabled: fromDTD?.perm?.canRetrieveFile !== AccessLevels.Yes || !focusedItem?.DID, icon: _jsx(IconDownload, { color: 'white' }), onClick: () => { downloadDcmtsAsync(getSelectedDcmtsOrFocused(selectedItems, focusedItem), DownloadTypes.Dcmt, "download"); } }), allowRelations && _jsx(TMButton, { btnStyle: 'icon', disabled: !currentTIDHasDetailRelations || !focusedItem?.DID, icon: _jsx(IconDetailDcmts, { color: 'white' }), caption: SDKUI_Localizator.DcmtsDetail, onClick: () => setIsOpenDetails(true) }), allowRelations && _jsx(TMButton, { btnStyle: 'icon', disabled: !currentTIDHasMasterRelations || !focusedItem?.DID, icon: _jsx(IconDetailDcmts, { color: 'white', transform: 'scale(-1, 1)' }), caption: SDKUI_Localizator.DcmtsMaster, onClick: () => setIsOpenMaster(true) }), _jsx(IconMenuVertical, { id: `commands-floating-${id}`, color: 'white', cursor: 'pointer' }), _jsx(TMCommandsContextMenu, { target: `#commands-floating-${id}`, showEvent: "click", menuItems: getCommandsMenuItems(isMobile, fromDTD, selectedItems, focusedItem, context, showFloatingBar, workingGroupContext, showSearch, setShowFloatingBar, openFormHandler, downloadDcmtsAsync, runOperationAsync, onRefreshSearchAsync, refreshSelectionDataRowsAsync, onRefreshAfterAddDcmtToFavs, confirmFormat, openConfirmAttachmentsDialog, openTaskFormHandler, openDetailDcmtsFormHandler, openMasterDcmtsFormHandler, openBatchUpdateFormHandler, openExportForm, handleToggleSearch, handleSignApprove, openWGsCopyMoveForm, openCommentFormCallback, openEditPdf, openAddDocumentForm, passToArchiveCallback, archiveMasterDocuments, archiveDetailDocuments, currentTIDHasMasterRelations, currentTIDHasDetailRelations, canArchiveMasterRelation, canArchiveDetailRelation, pairManyToMany) })] })] })] }), showApprovePopup && _jsx(WorkFlowApproveRejectPopUp, { deviceType: deviceType, onCompleted: onWFOperationCompleted, selectedItems: getSelectedDcmtsOrFocused(selectedItems, focusedItem), isReject: 0, onClose: () => setShowApprovePopup(false) }), showRejectPopup && _jsx(WorkFlowApproveRejectPopUp, { deviceType: deviceType, onCompleted: onWFOperationCompleted, selectedItems: getSelectedDcmtsOrFocused(selectedItems, focusedItem), isReject: 1, onClose: () => setShowRejectPopup(false) }), showReAssignPopup && _jsx(WorkFlowReAssignPopUp, { deviceType: deviceType, onCompleted: onWFOperationCompleted, selectedItems: getSelectedDcmtsOrFocused(selectedItems, focusedItem), onClose: () => setShowReAssignPopup(false) }), showMoreInfoPopup && _jsx(WorkFlowMoreInfoPopUp, { TID: focusedItem?.TID, DID: focusedItem?.DID, deviceType: deviceType, onCompleted: onWFOperationCompleted, onClose: () => setShowMoreInfoPopup(false) }), isOpenBatchUpdate && _jsx(TMBatchUpdateForm, { isModal: true, titleModal: `${SDKUI_Localizator.BatchUpdate} (${getSelectionDcmtInfo().length} documenti selezionati)`, inputDcmts: getSelectionDcmtInfo(), TID: focusedItem ? focusedItem?.TID : selectedItems[0]?.TID, DID: focusedItem ? focusedItem?.DID : selectedItems[0]?.DID, onBack: () => {
470
+ _jsxs(TMFloatingToolbar, { backgroundColor: TMColors.primaryColor, initialLeft: '10px', initialTop: 'calc(100% - 75px)', children: [fromDTD?.perm?.canRetrieveFile === AccessLevels.Yes && _jsx(TMButton, { btnStyle: 'icon', caption: "Download file", disabled: fromDTD?.perm?.canRetrieveFile !== AccessLevels.Yes || !focusedItem?.DID, icon: _jsx(IconDownload, { color: 'white' }), onClick: () => { downloadDcmtsAsync(getSelectedDcmtsOrFocused(selectedItems, focusedItem), DownloadTypes.Dcmt, "download"); } }), allowRelations && _jsx(TMButton, { btnStyle: 'icon', disabled: !currentTIDHasDetailRelations || !focusedItem?.DID, icon: _jsx(IconDetailDcmts, { color: 'white' }), caption: SDKUI_Localizator.DcmtsDetail, onClick: () => setIsOpenDetails(true) }), allowRelations && _jsx(TMButton, { btnStyle: 'icon', disabled: !currentTIDHasMasterRelations || !focusedItem?.DID, icon: _jsx(IconDetailDcmts, { color: 'white', transform: 'scale(-1, 1)' }), caption: SDKUI_Localizator.DcmtsMaster, onClick: () => setIsOpenMaster(true) }), _jsx(IconMenuVertical, { id: `commands-floating-${id}`, color: 'white', cursor: 'pointer' }), _jsx(TMCommandsContextMenu, { target: `#commands-floating-${id}`, showEvent: "click", menuItems: getCommandsMenuItems(isMobile, fromDTD, selectedItems, focusedItem, context, showFloatingBar, workingGroupContext, showSearch, setShowFloatingBar, openFormHandler, openSharedArchiveHandler, showSharedDcmtsHandler, downloadDcmtsAsync, runOperationAsync, onRefreshSearchAsync, refreshSelectionDataRowsAsync, onRefreshAfterAddDcmtToFavs, confirmFormat, openConfirmAttachmentsDialog, openTaskFormHandler, openDetailDcmtsFormHandler, openMasterDcmtsFormHandler, openBatchUpdateFormHandler, openExportForm, handleToggleSearch, handleSignApprove, openWGsCopyMoveForm, openCommentFormCallback, openEditPdf, openAddDocumentForm, passToArchiveCallback, archiveMasterDocuments, archiveDetailDocuments, currentTIDHasMasterRelations, currentTIDHasDetailRelations, canArchiveMasterRelation, canArchiveDetailRelation, pairManyToMany, hasManyToManyRelation) })] })] })] }), showApprovePopup && _jsx(WorkFlowApproveRejectPopUp, { deviceType: deviceType, onCompleted: onWFOperationCompleted, selectedItems: getSelectedDcmtsOrFocused(selectedItems, focusedItem), isReject: 0, onClose: () => setShowApprovePopup(false) }), showRejectPopup && _jsx(WorkFlowApproveRejectPopUp, { deviceType: deviceType, onCompleted: onWFOperationCompleted, selectedItems: getSelectedDcmtsOrFocused(selectedItems, focusedItem), isReject: 1, onClose: () => setShowRejectPopup(false) }), showReAssignPopup && _jsx(WorkFlowReAssignPopUp, { deviceType: deviceType, onCompleted: onWFOperationCompleted, selectedItems: getSelectedDcmtsOrFocused(selectedItems, focusedItem), onClose: () => setShowReAssignPopup(false) }), showMoreInfoPopup && _jsx(WorkFlowMoreInfoPopUp, { TID: focusedItem?.TID, DID: focusedItem?.DID, deviceType: deviceType, onCompleted: onWFOperationCompleted, onClose: () => setShowMoreInfoPopup(false) }), isOpenBatchUpdate && _jsx(TMBatchUpdateForm, { isModal: true, titleModal: `${SDKUI_Localizator.BatchUpdate} (${getSelectionDcmtInfo().length} documenti selezionati)`, inputDcmts: getSelectionDcmtInfo(), TID: focusedItem ? focusedItem?.TID : selectedItems[0]?.TID, DID: focusedItem ? focusedItem?.DID : selectedItems[0]?.DID, onBack: () => {
735
471
  setIsOpenBatchUpdate(false);
736
472
  }, onSavedCallbackAsync: async () => {
737
473
  setIsOpenBatchUpdate(false);
738
474
  setIsModifiedBatchUpdate(false);
739
475
  await refreshSelectionDataRowsAsync();
740
476
  }, onStatusChanged: (isModified) => { setIsModifiedBatchUpdate(isModified); } }), (showToppyForApprove && !showApprovePopup && !showRejectPopup && !showReAssignPopup && !showMoreInfoPopup && !openS4TViewer && !showTodoDcmtForm) &&
741
- _jsx(ToppyHelpCenter, { deviceType: deviceType, content: _jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, children: _jsx(WorkFlowOperationButtons, { deviceType: deviceType, onApprove: () => setShowApprovePopup(true), onSignApprove: handleSignApprove, onReject: () => setShowRejectPopup(true), onReAssign: () => setShowReAssignPopup(true), onMoreInfo: () => setShowMoreInfoPopup(true), approveDisable: disable, signApproveDisable: disableSignApproveDisable, rejectDisable: disable, reassignDisable: disable, infoDisable: getSelectedDcmtsOrFocused(selectedItems, focusedItem).length !== 1 }) }) })] }), _jsx(ConfirmFormatDialog, {}), _jsx(ConfirmAttachmentsDialog, {}), showRelatedDcmtsChooser &&
477
+ _jsx(ToppyHelpCenter, { deviceType: deviceType, content: _jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, children: _jsx(WorkFlowOperationButtons, { deviceType: deviceType, onApprove: () => {
478
+ setShowApprovePopup(true);
479
+ }, onSignApprove: () => {
480
+ handleSignApprove();
481
+ }, onReject: () => {
482
+ setShowRejectPopup(true);
483
+ }, onReAssign: () => {
484
+ setShowReAssignPopup(true);
485
+ }, onMoreInfo: () => {
486
+ setShowMoreInfoPopup(true);
487
+ }, approveDisable: selectedDocs.length === 0, signApproveDisable: disableSignApproveDisable, rejectDisable: selectedDocs.length === 0, reassignDisable: selectedDocs.length === 0, infoDisable: selectedDocs.length !== 1, dtd: fromDTD }) }) })] }), _jsx(ConfirmFormatDialog, {}), _jsx(ConfirmAttachmentsDialog, {}), showRelatedDcmtsChooser &&
742
488
  _jsx(TMChooserForm, { dataSource: relatedDcmtsChooserDataSource, onChoose: async (selectedRelation) => {
743
489
  try {
744
490
  setShowRelatedDcmtsChooser(false);
@@ -746,7 +492,7 @@ const TMSearchResult = ({ context = SearchResultContext.METADATA_SEARCH, isVisib
746
492
  const relation = relatedDcmts?.find(r => r.id === selectedRelation[0]);
747
493
  if (!relation || !archiveType)
748
494
  return;
749
- archiveRelatedDcmtHandler(relation, archiveType);
495
+ await archiveRelatedDcmtHandler(relation, archiveType);
750
496
  }
751
497
  catch (error) {
752
498
  TMExceptionBoxManager.show({ exception: error });
@@ -771,7 +517,16 @@ const TMSearchResult = ({ context = SearchResultContext.METADATA_SEARCH, isVisib
771
517
  TMSpinner.hide();
772
518
  }
773
519
  }, onClose: () => setShowManyToManyChooser(false), manageUseLocalizedName: false }), showPairDcmtsModal &&
774
- _jsx(TMModal, { title: (isPairingManyToMany ? "Abbina" : "Disabbina") + " documenti", onClose: () => setShowPairDcmtsModal(false), children: _jsx(TMSearchResult, { searchResults: pairedSearchResults, onRefreshAfterAddDcmtToFavs: onRefreshAfterAddDcmtToFavs, onRefreshSearchAsync: onRefreshSearchAsync, onFileOpened: onFileOpened, onTaskCreateRequest: onTaskCreateRequest, openWGsCopyMoveForm: openWGsCopyMoveForm, openEditPdf: openEditPdf, openS4TViewer: openS4TViewer, onOpenS4TViewerRequest: onOpenS4TViewerRequest, passToArchiveCallback: passToArchiveCallback, showTodoDcmtForm: showTodoDcmtForm }) }), (floatingActionConfig && floatingActionConfig.isVisible) && _jsx(TMSearchResultFloatingActionButton, { selectedDcmtsOrFocused: getSelectedDcmtsOrFocused(selectedItems, focusedItem), config: floatingActionConfig })] }), [
520
+ _jsx(TMModal, { title: (isPairingManyToMany ? "Abbina" : "Disabbina") + " documenti", onClose: () => setShowPairDcmtsModal(false), width: isMobile ? '90%' : '50%', height: isMobile ? '90%' : '70%', children: _jsx(TMSearchResult, { searchResults: pairedSearchResults, onRefreshAfterAddDcmtToFavs: onRefreshAfterAddDcmtToFavs, onRefreshSearchAsync: onRefreshSearchAsync, onFileOpened: onFileOpened, onTaskCreateRequest: onTaskCreateRequest, openWGsCopyMoveForm: openWGsCopyMoveForm, openEditPdf: openEditPdf, openS4TViewer: openS4TViewer, onOpenS4TViewerRequest: onOpenS4TViewerRequest, passToArchiveCallback: passToArchiveCallback, showTodoDcmtForm: showTodoDcmtForm, allowFloatingBar: false, floatingActionConfig: pairFloatingActionConfig, showBackButton: false }) }), showPairSearchModal &&
521
+ _jsx(TMModal, { title: "Ricerca documenti", onClose: () => setShowPairSearchModal(false), width: isMobile ? '90%' : '50%', height: isMobile ? '90%' : '70%', children: _jsx(TMSearch, { onlyShowSearchQueryPanel: true, inputTID: pairSearchModalTargetTID, inputMids: pairSearchModalInputMids, floatingActionConfig: pairSearchModalFloatingActionConfig }) }), isOpenSharedArchive && _jsx(TMModal, { title: "Archiviazione condivisa", onClose: () => {
522
+ setIsOpenSharedArchive(false);
523
+ }, width: isMobile ? '90%' : '60%', height: isMobile ? '90%' : '80%', children: _jsx(TMArchive, { inputDID: focusedItem?.DID, inputTID: focusedItem?.TID, inputMids: currentMetadataValues.filter(md => md.mid && md.mid > 100).map(md => ({ mid: md.mid, value: md.value ?? '' })), isSharedArchive: true, inputFile: sharedDcmtFile, onSavedAsyncCallback: async (tid, did) => {
524
+ setIsOpenSharedArchive(false);
525
+ await onRefreshSearchAsync?.();
526
+ } }) }), sharedDcmtSearchResults.length > 0 &&
527
+ _jsx(TMModal, { title: "Documenti condivisi", onClose: () => {
528
+ setSharedDcmtSearchResults([]);
529
+ }, width: isMobile ? '90%' : '60%', height: isMobile ? '90%' : '80%', children: _jsx(TMSearchResult, { searchResults: sharedDcmtSearchResults, allowFloatingBar: false, showSelector: true, showBackButton: false }) }), (floatingActionConfig && floatingActionConfig.isVisible) && _jsx(TMSearchResultFloatingActionButton, { selectedDcmtsOrFocused: getSelectedDcmtsOrFocused(selectedItems, focusedItem), config: floatingActionConfig })] }), [
775
530
  searchResults,
776
531
  selectedSearchResult,
777
532
  lastUpdateSearchTime,
@@ -806,6 +561,23 @@ const TMSearchResult = ({ context = SearchResultContext.METADATA_SEARCH, isVisib
806
561
  showPairDcmtsModal,
807
562
  isPairingManyToMany,
808
563
  pairedSearchResults,
564
+ selectedManyToManyRelation,
565
+ pairFloatingActionConfig,
566
+ hasManyToManyRelation,
567
+ showPairSearchModal,
568
+ pairSearchModalFloatingActionConfig,
569
+ pairSearchModalTargetTID,
570
+ pairSearchModalParentTID,
571
+ pairSearchModalParentDID,
572
+ pairSearchModalRelation,
573
+ pairSearchModalInputMids,
574
+ isOpenSharedArchive,
575
+ sharedDcmtSearchResults,
576
+ showBackButton,
577
+ isMobile,
578
+ currentMetadataValues,
579
+ sharedDcmtFile,
580
+ onRefreshSearchAsync
809
581
  ]);
810
582
  const tmBlog = useMemo(() => _jsx(TMDcmtBlog, { tid: focusedItem?.TID, did: focusedItem?.DID }), [focusedItem]);
811
583
  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]);
@@ -832,7 +604,9 @@ const TMSearchResult = ({ context = SearchResultContext.METADATA_SEARCH, isVisib
832
604
  title: getTitleHeader(),
833
605
  showHeader: showToolbarHeader,
834
606
  allowMaximize: !isMobile,
835
- onBack: (!isClosable && context === SearchResultContext.METADATA_SEARCH) || (isMobile && context !== SearchResultContext.METADATA_SEARCH && splitterSize[1] === '100%') ? onBack : undefined,
607
+ onBack: showBackButton !== undefined
608
+ ? (showBackButton ? onBack : undefined)
609
+ : ((!isClosable && context === SearchResultContext.METADATA_SEARCH) || (isMobile && context !== SearchResultContext.METADATA_SEARCH && splitterSize[1] === '100%') ? onBack : undefined),
836
610
  onClose: isClosable ? onBack : undefined,
837
611
  toolbar: searchResutlToolbar
838
612
  },
@@ -870,9 +644,9 @@ const TMSearchResult = ({ context = SearchResultContext.METADATA_SEARCH, isVisib
870
644
  :
871
645
  _jsx(TMPanelManagerProvider, { panels: initialPanels, initialVisibility: allInitialPanelVisibility, defaultDimensions: initialPanelDimensions, initialDimensions: initialPanelDimensions, initialMobilePanelId: 'tmSearchResult', children: _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", parentId: groupId, showToolbar: showSearchResultSidebar }) }) }) }), _jsx(StyledMultiViewPanel, { "$isVisible": isOpenDetails, children: isOpenDetails && _jsx(TMMasterDetailDcmts, { deviceType: deviceType, isForMaster: false, inputDcmts: getSelectionDcmtInfo(), allowNavigation: focusedItem && selectedItems.length <= 0, canNext: canNavigateHandler('next'), canPrev: canNavigateHandler('prev'), onNext: () => onNavigateHandler('next'), onPrev: () => onNavigateHandler('prev'), onBack: () => setIsOpenDetails(false) }) }), _jsxs(StyledMultiViewPanel, { "$isVisible": isOpenMaster, children: [isOpenMaster && _jsx(TMMasterDetailDcmts, { deviceType: deviceType, inputDcmts: getSelectionDcmtInfo(), isForMaster: true, allowNavigation: focusedItem && selectedItems.length <= 0, canNext: canNavigateHandler('next'), canPrev: canNavigateHandler('prev'), onNext: () => onNavigateHandler('next'), onPrev: () => onNavigateHandler('prev'), onBack: () => setIsOpenMaster(false), appendMasterDcmts: handleAddItem }), secondaryMasterDcmts.length > 0 && secondaryMasterDcmts.map((dcmt, index) => {
872
646
  return (_jsx(StyledModalContainer, { style: { backgroundColor: 'white' }, children: _jsx(TMMasterDetailDcmts, { deviceType: deviceType, inputDcmts: [dcmt], isForMaster: true, allowNavigation: false, onBack: () => handleRemoveItem(dcmt.TID, dcmt.DID), appendMasterDcmts: handleAddItem }) }, `${index}-${dcmt.DID}`));
873
- })] }), _jsx(StyledMultiViewPanel, { "$isVisible": isOpenDcmtForm, children: isOpenDcmtForm && _jsx(TMDcmtForm, { isModal: openDcmtFormAsModal || (dcmtFormLayoutMode === LayoutModes.Ark && focusedItem?.DID), titleModal: fromDTD?.name ?? '', TID: focusedItem?.TID, DID: focusedItem?.DID, layoutMode: dcmtFormLayoutMode, count: visibleItems.length, itemIndex: visibleItems.findIndex(o => o.rowIndex === focusedItem?.rowIndex) + 1, canNext: canNavigateHandler('next'), canPrev: canNavigateHandler('prev'), onNext: () => onNavigateHandler('next'), onPrev: () => onNavigateHandler('prev'), onClose: () => { setIsOpenDcmtForm(false); }, onWFOperationCompleted: onWFOperationCompleted, onTaskCreateRequest: onTaskCreateRequest, onSavedAsyncCallback: async (tid, did, metadataResult) => {
647
+ })] }), _jsx(StyledMultiViewPanel, { "$isVisible": isOpenDcmtForm, children: isOpenDcmtForm && _jsx(TMDcmtForm, { isModal: openDcmtFormAsModal || (dcmtFormLayoutMode === LayoutModes.Ark && focusedItem?.DID), titleModal: fromDTD?.name ?? '', TID: focusedItem?.TID, DID: focusedItem?.DID, allowButtonsRefs: true, layoutMode: dcmtFormLayoutMode, count: visibleItems.length, itemIndex: visibleItems.findIndex(o => o.rowIndex === focusedItem?.rowIndex) + 1, canNext: canNavigateHandler('next'), canPrev: canNavigateHandler('prev'), onNext: () => onNavigateHandler('next'), onPrev: () => onNavigateHandler('prev'), onClose: () => { setIsOpenDcmtForm(false); }, onWFOperationCompleted: onWFOperationCompleted, onTaskCreateRequest: onTaskCreateRequest, onSavedAsyncCallback: async (tid, did, metadataResult) => {
874
648
  await refreshFocusedDataRowAsync(tid, did, true, metadataResult);
875
- }, onOpenS4TViewerRequest: onOpenS4TViewerRequest }) }), isOpenArchiveRelationForm && _jsx(TMDcmtForm, { isModal: true, titleModal: SDKUI_Localizator.Archive + ' - ' + (archiveType === 'detail' ? SDKUI_Localizator.DcmtsDetail : SDKUI_Localizator.DcmtsMaster), TID: archiveRelatedDcmtFormTID, layoutMode: LayoutModes.Ark, inputMids: archiveRelatedDcmtFormMids, onClose: () => {
649
+ }, onOpenS4TViewerRequest: onOpenS4TViewerRequest, onReferenceClick: onReferenceClick }) }), isOpenArchiveRelationForm && _jsx(TMDcmtForm, { isModal: true, titleModal: SDKUI_Localizator.Archive + ' - ' + (archiveType === 'detail' ? SDKUI_Localizator.DcmtsDetail : SDKUI_Localizator.DcmtsMaster), TID: archiveRelatedDcmtFormTID, layoutMode: LayoutModes.Ark, inputMids: archiveRelatedDcmtFormMids, showBackButton: false, allowButtonsRefs: false, onClose: () => {
876
650
  setIsOpenArchiveRelationForm(false);
877
651
  setArchiveType(undefined);
878
652
  setArchiveRelatedDcmtFormTID(undefined);
@@ -4,7 +4,7 @@ import { TMDataGridContextMenuItem } from '../../base/TMDataGrid';
4
4
  import { DcmtInfo, DcmtOperationTypes, DownloadModes, DownloadTypes, SearchResultContext } from '../../../ts';
5
5
  export declare const getSelectedDcmtsOrFocused: (selectedItems: Array<any>, focusedItem: any, fileFormat?: FileFormats) => DcmtInfo[];
6
6
  export declare const signatureInformationCallback: (isMobile: boolean, inputDcmts: DcmtInfo[] | undefined) => Promise<void>;
7
- export declare const getCommandsMenuItems: (isMobile: boolean, dtd: DcmtTypeDescriptor | undefined, selectedItems: Array<any>, focusedItem: any, context: SearchResultContext, showFloatingBar: boolean, workingGroupContext: WorkingGroupDescriptor | undefined, showSearch: boolean, setShowFloatingBar: React.Dispatch<React.SetStateAction<boolean>>, openFormHandler: (layoutMode: LayoutModes) => void, downloadDcmtsAsync: (inputDcmts: DcmtInfo[] | undefined, downloadType: DownloadTypes, downloadMode: DownloadModes, onFileDownloaded?: (dcmtFile: File | undefined) => void, confirmAttachments?: (list: FileDescriptor[]) => Promise<string[] | undefined>) => Promise<void>, runOperationAsync: (inputDcmts: DcmtInfo[] | undefined, dcmtOperationType: DcmtOperationTypes, actionAfterOperationAsync?: () => Promise<void>) => Promise<void>, onRefreshSearchAsync: (() => Promise<void>) | undefined, onRefreshDataRowsAsync: (() => Promise<void>) | undefined, onRefreshAfterAddDcmtToFavs: (() => void) | undefined, confirmFormat: () => Promise<FileFormats>, confirmAttachments: (list: FileDescriptor[]) => Promise<string[] | undefined>, openTaskFormHandler: () => void, openDetailDcmtsFormHandler: (value: boolean) => void, openMasterDcmtsFormHandler: (value: boolean) => void, openBatchUpdateFormHandler: (value: boolean) => void, openExportForm: () => void, handleToggleSearch: () => void, handleSignApprove: () => void, openWGsCopyMoveForm?: ((mode: "copyToWgDraft" | "copyToWgArchivedDoc", dcmtTypeDescriptor: DcmtTypeDescriptor, documents: Array<DcmtInfo>) => void), openCommentFormCallback?: ((documents: Array<DcmtInfo>) => void), openEditPdf?: ((documents: Array<DcmtInfo>) => void), openAddDocumentForm?: () => void, passToArchiveCallback?: (outputMids: Array<{
7
+ export declare const getCommandsMenuItems: (isMobile: boolean, dtd: DcmtTypeDescriptor | undefined, selectedItems: Array<any>, focusedItem: any, context: SearchResultContext, showFloatingBar: boolean, workingGroupContext: WorkingGroupDescriptor | undefined, showSearch: boolean, setShowFloatingBar: React.Dispatch<React.SetStateAction<boolean>>, openFormHandler: (layoutMode: LayoutModes) => void, openSharedArchiveHandler: () => Promise<void>, showSharedDcmtsHandler: () => Promise<void>, downloadDcmtsAsync: (inputDcmts: DcmtInfo[] | undefined, downloadType: DownloadTypes, downloadMode: DownloadModes, onFileDownloaded?: (dcmtFile: File | undefined) => void, confirmAttachments?: (list: FileDescriptor[]) => Promise<string[] | undefined>) => Promise<void>, runOperationAsync: (inputDcmts: DcmtInfo[] | undefined, dcmtOperationType: DcmtOperationTypes, actionAfterOperationAsync?: () => Promise<void>) => Promise<void>, onRefreshSearchAsync: (() => Promise<void>) | undefined, onRefreshDataRowsAsync: (() => Promise<void>) | undefined, onRefreshAfterAddDcmtToFavs: (() => void) | undefined, confirmFormat: () => Promise<FileFormats>, confirmAttachments: (list: FileDescriptor[]) => Promise<string[] | undefined>, openTaskFormHandler: () => void, openDetailDcmtsFormHandler: (value: boolean) => void, openMasterDcmtsFormHandler: (value: boolean) => void, openBatchUpdateFormHandler: (value: boolean) => void, openExportForm: () => void, handleToggleSearch: () => void, handleSignApprove: () => void, openWGsCopyMoveForm?: ((mode: "copyToWgDraft" | "copyToWgArchivedDoc", dcmtTypeDescriptor: DcmtTypeDescriptor, documents: Array<DcmtInfo>) => void), openCommentFormCallback?: ((documents: Array<DcmtInfo>) => void), openEditPdf?: ((documents: Array<DcmtInfo>) => void), openAddDocumentForm?: () => void, passToArchiveCallback?: (outputMids: Array<{
8
8
  mid: number;
9
9
  value: string;
10
- }>) => void, archiveMasterDocuments?: (tid: number | undefined) => Promise<void>, archiveDetailDocuments?: (tid: number | undefined) => Promise<void>, hasMasterRelation?: boolean, hasDetailRelation?: boolean, canArchiveMasterRelation?: boolean, canArchiveDetailRelation?: boolean, pairManyToManyDocuments?: (isPairing: boolean) => Promise<void>) => Array<TMDataGridContextMenuItem>;
10
+ }>, tid?: number) => void, archiveMasterDocuments?: (tid: number | undefined) => Promise<void>, archiveDetailDocuments?: (tid: number | undefined) => Promise<void>, hasMasterRelation?: boolean, hasDetailRelation?: boolean, canArchiveMasterRelation?: boolean, canArchiveDetailRelation?: boolean, pairManyToManyDocuments?: (isPairing: boolean) => Promise<void>, hasManyToManyRelation?: boolean) => Array<TMDataGridContextMenuItem>;