@topconsultnpm/sdkui-react 6.19.0-test2 → 6.20.0-dev1.2

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 (57) hide show
  1. package/lib/components/NewComponents/ContextMenu/TMContextMenu.d.ts +4 -0
  2. package/lib/components/NewComponents/ContextMenu/TMContextMenu.js +187 -0
  3. package/lib/components/NewComponents/ContextMenu/hooks.d.ts +11 -0
  4. package/lib/components/NewComponents/ContextMenu/hooks.js +48 -0
  5. package/lib/components/NewComponents/ContextMenu/index.d.ts +2 -0
  6. package/lib/components/NewComponents/ContextMenu/index.js +1 -0
  7. package/lib/components/NewComponents/ContextMenu/styles.d.ts +27 -0
  8. package/lib/components/NewComponents/ContextMenu/styles.js +308 -0
  9. package/lib/components/NewComponents/ContextMenu/types.d.ts +26 -0
  10. package/lib/components/NewComponents/ContextMenu/types.js +1 -0
  11. package/lib/components/NewComponents/FloatingMenuBar/TMFloatingMenuBar.d.ts +4 -0
  12. package/lib/components/NewComponents/FloatingMenuBar/TMFloatingMenuBar.js +370 -0
  13. package/lib/components/NewComponents/FloatingMenuBar/index.d.ts +2 -0
  14. package/lib/components/NewComponents/FloatingMenuBar/index.js +2 -0
  15. package/lib/components/NewComponents/FloatingMenuBar/styles.d.ts +38 -0
  16. package/lib/components/NewComponents/FloatingMenuBar/styles.js +267 -0
  17. package/lib/components/NewComponents/FloatingMenuBar/types.d.ts +30 -0
  18. package/lib/components/NewComponents/FloatingMenuBar/types.js +1 -0
  19. package/lib/components/NewComponents/Notification/Notification.d.ts +4 -0
  20. package/lib/components/NewComponents/Notification/Notification.js +60 -0
  21. package/lib/components/NewComponents/Notification/NotificationContainer.d.ts +8 -0
  22. package/lib/components/NewComponents/Notification/NotificationContainer.js +33 -0
  23. package/lib/components/NewComponents/Notification/index.d.ts +2 -0
  24. package/lib/components/NewComponents/Notification/index.js +2 -0
  25. package/lib/components/NewComponents/Notification/styles.d.ts +21 -0
  26. package/lib/components/NewComponents/Notification/styles.js +180 -0
  27. package/lib/components/NewComponents/Notification/types.d.ts +18 -0
  28. package/lib/components/NewComponents/Notification/types.js +1 -0
  29. package/lib/components/choosers/TMDynDataListItemChooser.js +5 -4
  30. package/lib/components/editors/TMMetadataValues.js +34 -12
  31. package/lib/components/features/assistant/ToppyDraggableHelpCenter.js +74 -63
  32. package/lib/components/features/documents/TMDcmtForm.d.ts +1 -0
  33. package/lib/components/features/documents/TMDcmtForm.js +12 -5
  34. package/lib/components/features/documents/TMDcmtPreview.js +31 -37
  35. package/lib/components/features/search/TMSavedQuerySelector.js +1 -1
  36. package/lib/components/features/search/TMSearchQueryPanel.js +1 -1
  37. package/lib/components/features/search/TMSearchResult.js +106 -26
  38. package/lib/components/features/search/TMSearchResultCheckoutInfoForm.d.ts +8 -0
  39. package/lib/components/features/search/TMSearchResultCheckoutInfoForm.js +134 -0
  40. package/lib/components/features/search/TMSearchResultsMenuItems.d.ts +2 -2
  41. package/lib/components/features/search/TMSearchResultsMenuItems.js +40 -62
  42. package/lib/components/features/search/TMTreeSelector.js +1 -1
  43. package/lib/components/features/search/TMViewHistoryDcmt.d.ts +18 -0
  44. package/lib/components/features/search/TMViewHistoryDcmt.js +285 -0
  45. package/lib/components/grids/TMRecentsManager.js +1 -1
  46. package/lib/helper/SDKUI_Globals.d.ts +7 -0
  47. package/lib/helper/SDKUI_Globals.js +1 -0
  48. package/lib/helper/SDKUI_Localizator.d.ts +9 -0
  49. package/lib/helper/SDKUI_Localizator.js +121 -6
  50. package/lib/helper/TMIcons.d.ts +3 -1
  51. package/lib/helper/TMIcons.js +9 -1
  52. package/lib/helper/cicoHelper.d.ts +31 -0
  53. package/lib/helper/cicoHelper.js +155 -0
  54. package/lib/helper/helpers.d.ts +7 -0
  55. package/lib/helper/helpers.js +37 -5
  56. package/lib/helper/queryHelper.js +13 -1
  57. package/package.json +53 -53
@@ -1,9 +1,9 @@
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, RetrieveFileOptions, DcmtOpers, GeneralRetrieveFormats, AccessLevelsEx, ResultTypes, LayoutCacheService } from '@topconsultnpm/sdk-ts';
3
+ import { SDK_Globals, DataColumnTypes, MetadataDataDomains, DataListViewModes, MetadataFormats, LayoutModes, TemplateTIDs, DcmtTypeListCacheService, AccessLevels, SystemMIDsAsNumber, RetrieveFileOptions, DcmtOpers, GeneralRetrieveFormats, AccessLevelsEx, ResultTypes, LayoutCacheService, UserListCacheService } from '@topconsultnpm/sdk-ts';
4
4
  import styled from 'styled-components';
5
5
  import { getAllFieldSelectedDcmtsOrFocused, getCommandsMenuItems, getSelectedDcmtsOrFocused } from './TMSearchResultsMenuItems';
6
- import { genUniqueId, IconShow, IconBoard, IconDcmtTypeSys, IconDetailDcmts, SDKUI_Localizator, IconDelete, IconRefresh, IconMenuVertical, IconDownload, deepCompare, getDataColumnName, searchResultDescriptorToSimpleArray, searchResultToMetadataValues, IconSearchCheck, TMCommandsContextMenu, getExceptionMessage, IconCheck, svgToString, TMImageLibrary } from '../../../helper';
6
+ import { genUniqueId, IconShow, IconBoard, IconDcmtTypeSys, IconDetailDcmts, SDKUI_Localizator, IconDelete, IconRefresh, IconMenuVertical, IconDownload, deepCompare, generateUniqueColumnKeys, searchResultDescriptorToSimpleArray, searchResultToMetadataValues, IconSearchCheck, TMCommandsContextMenu, getExceptionMessage, IconCheck, svgToString, TMImageLibrary } from '../../../helper';
7
7
  import { useDcmtOperations } from '../../../hooks/useDcmtOperations';
8
8
  import { useInputAttachmentsDialog, useInputCvtFormatDialog } from '../../../hooks/useInputDialog';
9
9
  import { useRelatedDocuments } from '../../../hooks/useRelatedDocuments';
@@ -43,6 +43,9 @@ import { TMResultManager } from '../../forms/TMResultDialog';
43
43
  import TMCustomButton from '../../base/TMCustomButton';
44
44
  import ToppyDraggableHelpCenter from '../assistant/ToppyDraggableHelpCenter';
45
45
  import TMSignSettingsForm from './TMSignSettingsForm';
46
+ import { cicoIsEnabled, downloadFilesCallback, updateDcmtCheckoutItem } from '../../../helper/cicoHelper';
47
+ import TMSearchResultCheckoutInfoForm from './TMSearchResultCheckoutInfoForm';
48
+ import TMViewHistoryDcmt from './TMViewHistoryDcmt';
46
49
  //#region Helper Methods
47
50
  export const getSearchResultCountersSingleCategory = (searchResults) => {
48
51
  // let totDcmtTypes = searchResults.length;
@@ -110,23 +113,42 @@ const TMSearchResult = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, a
110
113
  const [blogsDatasource, setBlogsDatasource] = useState([]);
111
114
  const [hasLoadedDataOnce, setHasLoadedDataOnce] = useState(false); //traccia se *qualsiasi* dato è stato caricato per la prima volta
112
115
  const [lastLoadedDid, setLastLoadedDid] = useState(undefined); // `lastLoadedDid` tiene traccia dell'ultimo `did` per cui abbiamo caricato i dati
116
+ // State to manage show history selected file
117
+ const [showHistory, setShowHistory] = useState(false);
118
+ const [allUsers, setAllUsers] = useState([]);
119
+ // State to manage show history selected file
120
+ const [showCheckoutInformationForm, setShowCheckoutInformationForm] = useState(false);
121
+ useEffect(() => {
122
+ const fetchAllUsers = async () => {
123
+ const users = await UserListCacheService.GetAllAsync();
124
+ setAllUsers(users ?? []);
125
+ };
126
+ fetchAllUsers();
127
+ }, []);
113
128
  useEffect(() => { setID(genUniqueId()); }, []);
114
129
  useEffect(() => {
115
130
  setSelectedItems([]);
116
- setFocusedItem(undefined);
117
131
  setIsOpenBatchUpdate(false);
118
132
  setCurrentSearchResults(searchResults);
119
- if (searchResults.length <= 0)
133
+ if (searchResults.length <= 0) {
134
+ setSelectedSearchResult(undefined);
120
135
  return;
136
+ }
121
137
  if (searchResults.length === 1) {
122
138
  setSelectedSearchResult(searchResults[0]);
123
139
  return;
124
140
  }
141
+ // Seleziona sempre il primo risultato ordinato, sia su mobile che desktop
125
142
  setSelectedSearchResult(orderByName(searchResults)[0]);
126
143
  }, [searchResults]);
127
144
  useEffect(() => {
128
- setFocusedItem(undefined);
129
145
  setSelectedItems([]);
146
+ // Se non c'è un selectedSearchResult, resetta tutto
147
+ if (!selectedSearchResult) {
148
+ setFocusedItem(undefined);
149
+ setFromDTD(undefined);
150
+ return;
151
+ }
130
152
  DcmtTypeListCacheService.GetWithNotGrantedAsync(selectedSearchResult?.fromTID, Number(selectedSearchResult?.dtdResult?.rows?.[0]?.[1])).then((dtd) => {
131
153
  setFromDTD(dtd);
132
154
  });
@@ -167,6 +189,16 @@ const TMSearchResult = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, a
167
189
  fetchLayout();
168
190
  }, [currentMetadataValues]);
169
191
  const openFormHandler = (layoutMode) => {
192
+ // Verifica che ci sia un documento selezionato con TID e DID validi
193
+ if (!focusedItem || focusedItem.TID === undefined || focusedItem.DID === undefined) {
194
+ ShowAlert({
195
+ message: SDKUI_Localizator.InvalidDcmt,
196
+ mode: "warning",
197
+ title: layoutMode === LayoutModes.Ark ? SDKUI_Localizator.Archive : SDKUI_Localizator.OpenTheDocument,
198
+ duration: 3000
199
+ });
200
+ return;
201
+ }
170
202
  setIsOpenDcmtForm(true);
171
203
  setDcmtFormLayoutMode(layoutMode);
172
204
  };
@@ -205,7 +237,6 @@ const TMSearchResult = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, a
205
237
  const se = SDK_Globals.tmSession?.NewSearchEngine();
206
238
  const sharedDcmts = await se?.GetSharedDcmtsAsync(getSelectedDcmtsOrFocused(selectedItems, focusedItem)[0].TID, getSelectedDcmtsOrFocused(selectedItems, focusedItem)[0].DID);
207
239
  if (sharedDcmts && sharedDcmts.length > 0) {
208
- console.log(sharedDcmts);
209
240
  setSharedDcmtSearchResults(sharedDcmts);
210
241
  }
211
242
  else {
@@ -260,6 +291,12 @@ const TMSearchResult = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, a
260
291
  const closeSignSettingsForm = useCallback(() => {
261
292
  setShowSignSettingsForm(false);
262
293
  }, []);
294
+ const viewHistoryCallback = useCallback(() => {
295
+ setShowHistory(true);
296
+ }, []);
297
+ const showCheckoutInformationFormCallback = useCallback(() => {
298
+ setShowCheckoutInformationForm(true);
299
+ }, []);
263
300
  const getTitleHeader = () => {
264
301
  let counters = (showSelector && disableAccordionIfSingleCategory && searchResults.length > 1) ? getSearchResultCountersSingleCategory(searchResults) : "";
265
302
  if (title)
@@ -310,6 +347,9 @@ const TMSearchResult = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, a
310
347
  setIsOpenDcmtForm(false);
311
348
  }
312
349
  else {
350
+ if (isMobile && currentSearchResults.length > 1) {
351
+ setSelectedSearchResult(undefined);
352
+ }
313
353
  setSplitterSize(['100%', '0']);
314
354
  onClose?.();
315
355
  }
@@ -332,7 +372,7 @@ const TMSearchResult = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, a
332
372
  return;
333
373
  if (e.target === 'content') {
334
374
  e.items = e.items || [];
335
- 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, openSignSettingsForm, handleCheckOutOperationCallback, openWGsCopyMoveForm, openCommentFormCallback, openEditPdf, openAddDocumentForm, passToArchiveCallback, archiveMasterDocuments, archiveDetailDocuments, currentTIDHasMasterRelations, currentTIDHasDetailRelations, canArchiveMasterRelation, canArchiveDetailRelation, pairManyToMany, hasManyToManyRelation);
375
+ const menuItems = getCommandsMenuItems(isMobile, fromDTD, allUsers, selectedItems, focusedItem, context, showFloatingBar, workingGroupContext, showSearch, setShowFloatingBar, openFormHandler, openSharedArchiveHandler, showSharedDcmtsHandler, downloadDcmtsAsync, runOperationAsync, onRefreshSearchAsync, refreshSelectionDataRowsAsync, onRefreshAfterAddDcmtToFavs, confirmFormat, openConfirmAttachmentsDialog, openTaskFormHandler, openDetailDcmtsFormHandler, openMasterDcmtsFormHandler, openBatchUpdateFormHandler, openExportForm, handleToggleSearch, handleSignApprove, openSignSettingsForm, handleCheckOutOperationCallback, showCheckoutInformationFormCallback, viewHistoryCallback, openWGsCopyMoveForm, openCommentFormCallback, openEditPdf, openAddDocumentForm, passToArchiveCallback, archiveMasterDocuments, archiveDetailDocuments, currentTIDHasMasterRelations, currentTIDHasDetailRelations, canArchiveMasterRelation, canArchiveDetailRelation, pairManyToMany, hasManyToManyRelation);
336
376
  e.items.push(...menuItems);
337
377
  //disabilitato per ora
338
378
  //e.items.push(customButtonMenuItems());
@@ -361,9 +401,9 @@ const TMSearchResult = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, a
361
401
  if (checkout) {
362
402
  await ue.CheckOutAsync()
363
403
  .then(async () => {
364
- await downloadDcmtsAsync(getSelectedDcmtsOrFocused(selectedItems, focusedItem), DownloadTypes.Dcmt, "download");
404
+ const filename = fromDTD?.nameLoc || SDKUI_Localizator.SearchResult;
405
+ await downloadFilesCallback(filename, [firstDoc], true, downloadDcmtsAsync);
365
406
  result.push({ rowIndex: 0, id1: firstDoc.TID, id2: firstDoc.DID, description: SDKUI_Localizator.UpdateCompletedSuccessfully, resultType: ResultTypes.SUCCESS });
366
- // await refreshSelectionDataRowsAsync();
367
407
  await refreshFocusedDataRowAsync(firstDoc.TID, firstDoc.DID, true);
368
408
  })
369
409
  .catch((error) => {
@@ -375,7 +415,13 @@ const TMSearchResult = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, a
375
415
  await ue.UndoCheckOutAsync()
376
416
  .then(async () => {
377
417
  result.push({ rowIndex: 0, id1: firstDoc.TID, id2: firstDoc.DID, description: SDKUI_Localizator.UpdateCompletedSuccessfully, resultType: ResultTypes.SUCCESS });
378
- // await refreshSelectionDataRowsAsync();
418
+ // Remove the corresponding draft checkout item
419
+ updateDcmtCheckoutItem({
420
+ TID: firstDoc.TID.toString(),
421
+ DID: firstDoc.DID.toString(),
422
+ checkoutFolder: "",
423
+ checkoutName: ""
424
+ }, "remove");
379
425
  await refreshFocusedDataRowAsync(firstDoc.TID, firstDoc.DID, true);
380
426
  })
381
427
  .catch((error) => {
@@ -572,7 +618,7 @@ const TMSearchResult = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, a
572
618
  }
573
619
  };
574
620
  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 &&
575
- _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, openSignSettingsForm, handleCheckOutOperationCallback, openWGsCopyMoveForm, openCommentFormCallback, openEditPdf, openAddDocumentForm, passToArchiveCallback, archiveMasterDocuments, archiveDetailDocuments, currentTIDHasMasterRelations, currentTIDHasDetailRelations, canArchiveMasterRelation, canArchiveDetailRelation, pairManyToMany, hasManyToManyRelation).concat([customButtonMenuItems()]) })] });
621
+ _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, allUsers, selectedItems, focusedItem, context, showFloatingBar, workingGroupContext, showSearch, setShowFloatingBar, openFormHandler, openSharedArchiveHandler, showSharedDcmtsHandler, downloadDcmtsAsync, runOperationAsync, onRefreshSearchAsync, refreshSelectionDataRowsAsync, onRefreshAfterAddDcmtToFavs, confirmFormat, openConfirmAttachmentsDialog, openTaskFormHandler, openDetailDcmtsFormHandler, openMasterDcmtsFormHandler, openBatchUpdateFormHandler, openExportForm, handleToggleSearch, handleSignApprove, openSignSettingsForm, handleCheckOutOperationCallback, showCheckoutInformationFormCallback, viewHistoryCallback, openWGsCopyMoveForm, openCommentFormCallback, openEditPdf, openAddDocumentForm, passToArchiveCallback, archiveMasterDocuments, archiveDetailDocuments, currentTIDHasMasterRelations, currentTIDHasDetailRelations, canArchiveMasterRelation, canArchiveDetailRelation, pairManyToMany, hasManyToManyRelation) /*.concat([customButtonMenuItems()])*/ })] });
576
622
  const handleAddItem = (tid, did) => {
577
623
  let newItem = { TID: tid ?? 0, DID: did ?? 0 };
578
624
  setSecondaryMasterDcmts((prevItems) => [...prevItems, newItem]);
@@ -604,10 +650,10 @@ const TMSearchResult = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, a
604
650
  ? _jsxs("div", { style: { display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: '100%', width: '100%' }, children: [_jsx(IconBoard, { fontSize: 96 }), _jsx("div", { style: { fontSize: "15px", marginTop: "10px" }, children: SDKUI_Localizator.NoDcmtFound }), openAddDocumentForm && _jsx("div", { style: { marginTop: "10px" }, children: _jsx(TMButton, { fontSize: "15px", icon: _jsx("i", { className: 'dx-icon-share' }), caption: SDKUI_Localizator.Share, onClick: openAddDocumentForm }) })] })
605
651
  :
606
652
  _jsxs(_Fragment, { children: [_jsxs(TMLayoutItem, { height: '100%', children: [_jsxs(TMSplitterLayout, { direction: 'horizontal', overflow: 'visible', separatorSize: Gutters.getGutters(), separatorActiveColor: 'transparent', separatorColor: 'transparent', min: ['0', '0'], showSeparator: showSelector && deviceType !== DeviceType.MOBILE, start: showSelector ? deviceType !== DeviceType.MOBILE ? ['30%', '70%'] : splitterSize : ['0%', '100%'], children: [showSelector ?
607
- _jsx(TMLayoutItem, { children: _jsx(TMSearchResultSelector, { searchResults: currentSearchResults, disableAccordionIfSingleCategory: disableAccordionIfSingleCategory, selectedTID: selectedSearchResultTID, onSelectionChanged: onSearchResultSelectionChanged }) })
653
+ _jsx(TMLayoutItem, { children: _jsx(TMSearchResultSelector, { searchResults: currentSearchResults, disableAccordionIfSingleCategory: disableAccordionIfSingleCategory, selectedTID: selectedSearchResultTID, selectedSearchResult: selectedSearchResult, autoSelectFirst: !isMobile || currentSearchResults.length === 1, onSelectionChanged: onSearchResultSelectionChanged }) })
608
654
  :
609
- _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 &&
610
- _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, openSignSettingsForm, handleCheckOutOperationCallback, openWGsCopyMoveForm, openCommentFormCallback, openEditPdf, openAddDocumentForm, passToArchiveCallback, archiveMasterDocuments, archiveDetailDocuments, currentTIDHasMasterRelations, currentTIDHasDetailRelations, canArchiveMasterRelation, canArchiveDetailRelation, pairManyToMany, hasManyToManyRelation).concat([customButtonMenuItems()]) })] })] })] }), 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: () => {
655
+ _jsx(_Fragment, {}), _jsxs(TMLayoutItem, { children: [_jsx(TMSearchResultGrid, { showSearch: showSearch, fromDTD: fromDTD, allUsers: allUsers, 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 &&
656
+ _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, allUsers, selectedItems, focusedItem, context, showFloatingBar, workingGroupContext, showSearch, setShowFloatingBar, openFormHandler, openSharedArchiveHandler, showSharedDcmtsHandler, downloadDcmtsAsync, runOperationAsync, onRefreshSearchAsync, refreshSelectionDataRowsAsync, onRefreshAfterAddDcmtToFavs, confirmFormat, openConfirmAttachmentsDialog, openTaskFormHandler, openDetailDcmtsFormHandler, openMasterDcmtsFormHandler, openBatchUpdateFormHandler, openExportForm, handleToggleSearch, handleSignApprove, openSignSettingsForm, handleCheckOutOperationCallback, showCheckoutInformationFormCallback, viewHistoryCallback, openWGsCopyMoveForm, openCommentFormCallback, openEditPdf, openAddDocumentForm, passToArchiveCallback, archiveMasterDocuments, archiveDetailDocuments, currentTIDHasMasterRelations, currentTIDHasDetailRelations, canArchiveMasterRelation, canArchiveDetailRelation, pairManyToMany, hasManyToManyRelation) /*.concat([customButtonMenuItems()])*/ })] })] })] }), 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: () => {
611
657
  setIsOpenBatchUpdate(false);
612
658
  }, onSavedCallbackAsync: async () => {
613
659
  setIsOpenBatchUpdate(false);
@@ -665,7 +711,8 @@ const TMSearchResult = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, a
665
711
  }, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }) }), sharedDcmtSearchResults.length > 0 &&
666
712
  _jsx(TMModal, { title: "Documenti condivisi", onClose: () => {
667
713
  setSharedDcmtSearchResults([]);
668
- }, width: isMobile ? '90%' : '60%', height: isMobile ? '90%' : '80%', children: _jsx(TMSearchResult, { searchResults: sharedDcmtSearchResults, allowFloatingBar: false, showSelector: true, showBackButton: false, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }) }), (floatingActionConfig && floatingActionConfig.isVisible) && _jsx(TMSearchResultFloatingActionButton, { selectedDcmtsOrFocused: getSelectedDcmtsOrFocused(selectedItems, focusedItem), config: floatingActionConfig })] }), [
714
+ }, width: isMobile ? '90%' : '60%', height: isMobile ? '90%' : '80%', children: _jsx(TMSearchResult, { searchResults: sharedDcmtSearchResults, allowFloatingBar: false, showSelector: true, disableAccordionIfSingleCategory: true, showBackButton: isMobile, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }) }), (showCheckoutInformationForm && fromDTD && getSelectedDcmtsOrFocused(selectedItems, focusedItem).length > 0) &&
715
+ _jsx(TMSearchResultCheckoutInfoForm, { dtdName: fromDTD.name ?? SDKUI_Localizator.SearchResult, selectedDcmtOrFocused: getSelectedDcmtsOrFocused(selectedItems, focusedItem)[0], onClose: () => setShowCheckoutInformationForm(false) }), (floatingActionConfig && floatingActionConfig.isVisible) && _jsx(TMSearchResultFloatingActionButton, { selectedDcmtsOrFocused: getSelectedDcmtsOrFocused(selectedItems, focusedItem), config: floatingActionConfig })] }), [
669
716
  searchResults,
670
717
  selectedSearchResult,
671
718
  lastUpdateSearchTime,
@@ -783,7 +830,7 @@ const TMSearchResult = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, a
783
830
  :
784
831
  _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), allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }) }), _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, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }), secondaryMasterDcmts.length > 0 && secondaryMasterDcmts.map((dcmt, index) => {
785
832
  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, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }) }, `${index}-${dcmt.DID}`));
786
- })] }), _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: handleSavedAsyncCallback, onOpenS4TViewerRequest: onOpenS4TViewerRequest, onReferenceClick: onReferenceClick, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }) }), 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: () => {
833
+ })] }), _jsx(StyledMultiViewPanel, { "$isVisible": isOpenDcmtForm, children: isOpenDcmtForm && focusedItem?.TID !== undefined && focusedItem?.DID !== undefined && _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: handleSavedAsyncCallback, openS4TViewer: openS4TViewer, onOpenS4TViewerRequest: onOpenS4TViewerRequest, onReferenceClick: onReferenceClick, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }) }), 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: () => {
787
834
  setIsOpenArchiveRelationForm(false);
788
835
  setArchiveType(undefined);
789
836
  setArchiveRelatedDcmtFormTID(undefined);
@@ -794,13 +841,13 @@ const TMSearchResult = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, a
794
841
  setArchiveRelatedDcmtFormTID(undefined);
795
842
  setArchiveRelatedDcmtFormMids([]);
796
843
  await onRefreshSearchAsync?.();
797
- }, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }), (showSignSettingsForm && fromDTD) && _jsx(TMSignSettingsForm, { fromDTD: fromDTD, inputDcmts: allFieldSelectedDocs, onCloseSignSettingsForm: closeSignSettingsForm, onSavedAsyncCallback: handleSavedAsyncCallback })] }));
844
+ }, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }), (showSignSettingsForm && fromDTD) && _jsx(TMSignSettingsForm, { fromDTD: fromDTD, inputDcmts: allFieldSelectedDocs, onCloseSignSettingsForm: closeSignSettingsForm, onSavedAsyncCallback: handleSavedAsyncCallback }), (showHistory && fromDTD && getSelectedDcmtsOrFocused(selectedItems, focusedItem).length > 0) && _jsx(TMViewHistoryDcmt, { fromDTD: fromDTD, deviceType: deviceType, inputDcmt: getSelectedDcmtsOrFocused(selectedItems, focusedItem)[0], onClose: () => setShowHistory(false), allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers })] }));
798
845
  };
799
846
  export default TMSearchResult;
800
847
  const renderDcmtIcon = (cellData, onDownloadDcmtsAsync, openInOffice) => {
801
848
  return _jsx(TMDcmtIcon, { tid: cellData.data.TID, did: cellData.data.DID, fileExtension: cellData.data.FILEEXT, fileCount: cellData.data.FILECOUNT, isLexProt: cellData.data.IsLexProt, isMail: cellData.data.ISMAIL, isShared: cellData.data.ISSHARED, isSigned: cellData.data.ISSIGNED, downloadMode: 'openInNewWindow', onDownloadDcmtsAsync: onDownloadDcmtsAsync, openInOffice: openInOffice });
802
849
  };
803
- const TMSearchResultGrid = ({ openInOffice, inputFocusedItem, showSearch, allowMultipleSelection = true, showExportForm = false, onCloseExportForm, onFocusedItemChanged, onDownloadDcmtsAsync, onVisibleItemChanged, inputSelectedItems = [], lastUpdateSearchTime, searchResult, onContextMenuPreparing, onSelectionChanged, onDblClick }) => {
850
+ const TMSearchResultGrid = ({ openInOffice, fromDTD, allUsers, inputFocusedItem, showSearch, allowMultipleSelection = true, showExportForm = false, onCloseExportForm, onFocusedItemChanged, onDownloadDcmtsAsync, onVisibleItemChanged, inputSelectedItems = [], lastUpdateSearchTime, searchResult, onContextMenuPreparing, onSelectionChanged, onDblClick }) => {
804
851
  const [dataSource, setDataSource] = useState();
805
852
  const [columns, setColumns] = useState([]);
806
853
  // State to store selected row keys
@@ -880,12 +927,20 @@ const TMSearchResultGrid = ({ openInOffice, inputFocusedItem, showSearch, allowM
880
927
  return null;
881
928
  const isLogDel = cellData.data.ISLOGDEL == 1;
882
929
  const isLexProt = cellData.data.IsLexProt == 1;
930
+ // Prima colonna: la colonna numero 2 (dopo icona e selezione)
931
+ const isFirstColumn = cellData.columnIndex === 2;
932
+ const { checkoutStatus } = cicoIsEnabled(cellData.data, allUsers, fromDTD);
933
+ const shouldShowCheckoutIcon = isFirstColumn && checkoutStatus.isCheckedOut && checkoutStatus.icon;
883
934
  let style = {};
884
935
  if (isLogDel) {
885
936
  style = { color: 'gray', textDecoration: 'line-through' };
886
937
  }
887
- else if (isLexProt)
938
+ else if (isLexProt) {
888
939
  style = { color: 'blue' };
940
+ }
941
+ if (shouldShowCheckoutIcon) {
942
+ style = { ...style, display: 'flex', gap: '4px', whiteSpace: 'nowrap' };
943
+ }
889
944
  let child = _jsx("div", { children: cellData.text });
890
945
  if (dataDomain === MetadataDataDomains.DataList) {
891
946
  child = _jsx(TMDataListItemViewer, { dataListId: dataListID, viewMode: dataListViewMode, value: cellData.value });
@@ -893,8 +948,8 @@ const TMSearchResultGrid = ({ openInOffice, inputFocusedItem, showSearch, allowM
893
948
  if (dataDomain === MetadataDataDomains.UserID) {
894
949
  child = _jsx(TMUserIdViewer, { userId: cellData.value, showIcon: true, noneSelectionText: '' });
895
950
  }
896
- return _jsx("div", { style: style, children: child });
897
- }, []);
951
+ return (_jsxs("div", { style: style, children: [shouldShowCheckoutIcon && checkoutStatus.icon, child] }));
952
+ }, [fromDTD, allUsers]);
898
953
  const dataType = useCallback((col) => {
899
954
  switch (col.dataType) {
900
955
  case DataColumnTypes.DateTime: return "datetime";
@@ -945,16 +1000,19 @@ const TMSearchResultGrid = ({ openInOffice, inputFocusedItem, showSearch, allowM
945
1000
  return undefined;
946
1001
  }, []);
947
1002
  useEffect(() => {
1003
+ if (fromDTD === undefined || searchResult === undefined)
1004
+ return;
948
1005
  setFocusedItem(undefined); // resetta sempre prima
949
1006
  let cols = [];
1007
+ // Generate unique keys for all columns
1008
+ const uniqueKeys = generateUniqueColumnKeys(searchResult?.dtdResult?.columns, searchResult?.fromTID);
950
1009
  searchResult?.dtdResult?.columns?.map((col, index) => {
951
- let keyField = getDataColumnName(searchResult?.fromTID, col);
952
1010
  const isVisible = col.extendedProperties?.["Visibility"] != "Hidden";
953
1011
  const dataDomain = MetadataDataDomains[(col.extendedProperties?.["DataDomain"] ?? "None")];
954
1012
  const dataListID = Number(col.extendedProperties?.["DataListID"]);
955
1013
  const dataListViewMode = DataListViewModes[(col.extendedProperties?.["DataListViewMode"] ?? "None")];
956
1014
  cols.push({
957
- dataField: keyField,
1015
+ dataField: uniqueKeys[index],
958
1016
  dataType: dataType(col),
959
1017
  visible: isVisible,
960
1018
  cellRender: (cellData) => cellRender(cellData, dataDomain, dataListID, dataListViewMode),
@@ -966,7 +1024,7 @@ const TMSearchResultGrid = ({ openInOffice, inputFocusedItem, showSearch, allowM
966
1024
  let newDataSource = searchResultDescriptorToSimpleArray(searchResult);
967
1025
  setDataSource(newDataSource);
968
1026
  // setFocusedItem(newDataSource && newDataSource.length > 0 ? newDataSource[0] : undefined);
969
- }, [searchResult]);
1027
+ }, [searchResult, fromDTD, allUsers]);
970
1028
  useEffect(() => {
971
1029
  let newDataSource = searchResultDescriptorToSimpleArray(searchResult);
972
1030
  setDataSource(newDataSource);
@@ -999,6 +1057,16 @@ const TMSearchResultGrid = ({ openInOffice, inputFocusedItem, showSearch, allowM
999
1057
  // Era sull'icona, non fare nulla
1000
1058
  return;
1001
1059
  }
1060
+ // Verifica che il documento abbia TID e DID validi prima di procedere
1061
+ if (!e.data.TID || !e.data.DID) {
1062
+ ShowAlert({
1063
+ message: SDKUI_Localizator.InvalidDcmt,
1064
+ mode: "warning",
1065
+ title: SDKUI_Localizator.OpenForm,
1066
+ duration: 3000
1067
+ });
1068
+ return;
1069
+ }
1002
1070
  // setFocusedItem(e.data);
1003
1071
  onFocusedItemChanged?.(e.data);
1004
1072
  onDblClick();
@@ -1035,7 +1103,7 @@ const StyledItemTemplate = styled.div `
1035
1103
  cursor: pointer;
1036
1104
  `;
1037
1105
  const MemoizedStyledItemTemplate = React.memo(StyledItemTemplate);
1038
- const TMSearchResultSelector = ({ searchResults = [], disableAccordionIfSingleCategory = false, selectedTID, onSelectionChanged }) => {
1106
+ const TMSearchResultSelector = ({ searchResults = [], disableAccordionIfSingleCategory = false, selectedTID, selectedSearchResult, autoSelectFirst = true, onSelectionChanged }) => {
1039
1107
  const [selectedResult, setSelectedResult] = useState(undefined);
1040
1108
  /** Group results by category */
1041
1109
  const groupedResults = useMemo(() => {
@@ -1059,7 +1127,19 @@ const TMSearchResultSelector = ({ searchResults = [], disableAccordionIfSingleCa
1059
1127
  sortedCategories.forEach((category) => {
1060
1128
  groupedResults[category].sort((a, b) => (a.fromName ?? '').localeCompare(b.fromName ?? ''));
1061
1129
  });
1130
+ // Reset internal selection when parent sets selectedSearchResult to undefined
1131
+ // (this happens on mobile when clicking back to return to the list)
1062
1132
  useEffect(() => {
1133
+ if (selectedSearchResult === undefined) {
1134
+ setSelectedResult(undefined);
1135
+ }
1136
+ }, [selectedSearchResult]);
1137
+ // Auto-seleziona il primo risultato di ricerca solo se autoSelectFirst è true.
1138
+ // Su mobile con più risultati, autoSelectFirst è false per permettere all'utente
1139
+ // di vedere prima la lista dei tipi documento e scegliere manualmente.
1140
+ useEffect(() => {
1141
+ if (!autoSelectFirst)
1142
+ return;
1063
1143
  if (sortedCategories.length > 0) {
1064
1144
  const firstCategory = sortedCategories[0];
1065
1145
  if (groupedResults[firstCategory].length > 0) {
@@ -1067,7 +1147,7 @@ const TMSearchResultSelector = ({ searchResults = [], disableAccordionIfSingleCa
1067
1147
  onSelectionChanged?.(groupedResults[firstCategory][0]);
1068
1148
  }
1069
1149
  }
1070
- }, [sortedCategories.length]);
1150
+ }, [sortedCategories.length, autoSelectFirst]);
1071
1151
  useEffect(() => {
1072
1152
  if (selectedTID !== undefined) {
1073
1153
  const found = searchResults.find(r => Number(r.fromTID) === selectedTID);
@@ -0,0 +1,8 @@
1
+ import { DcmtInfo } from "../../../ts";
2
+ interface TMSearchResultCheckoutInfoFormProps {
3
+ dtdName: string;
4
+ selectedDcmtOrFocused: DcmtInfo;
5
+ onClose: () => void;
6
+ }
7
+ declare const TMSearchResultCheckoutInfoForm: (props: TMSearchResultCheckoutInfoFormProps) => import("react/jsx-runtime").JSX.Element;
8
+ export default TMSearchResultCheckoutInfoForm;
@@ -0,0 +1,134 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from "react";
3
+ import TMSaveForm from "../../forms/TMSaveForm";
4
+ import { IconBxInfo, IconFileDots, IconFolder, SDKUI_Globals, SDKUI_Localizator } from "../../../helper";
5
+ import { FormModes } from "../../../ts";
6
+ import { ResultTypes, ValidationItem } from "@topconsultnpm/sdk-ts";
7
+ import { SaveFormOptions, useSaveForm } from "../../../hooks/useForm";
8
+ import { getCicoDownloadFileName, updateDcmtCheckoutItem } from "../../../helper/cicoHelper";
9
+ import { TMColors } from "../../../utils/theme";
10
+ import TMLayoutContainer, { TMLayoutItem } from "../../base/TMLayout";
11
+ import TMTooltip from "../../base/TMTooltip";
12
+ import TMTextBox from "../../editors/TMTextBox";
13
+ import ShowAlert from "../../base/TMAlert";
14
+ import { TMExceptionBoxManager } from "../../base/TMPopUp";
15
+ const TMSearchResultCheckoutInfoForm = (props) => {
16
+ const { dtdName, selectedDcmtOrFocused, onClose } = props;
17
+ const [initialDcmtCheckoutFolder, setInitialDcmtCheckoutFolder] = useState("");
18
+ const [initialDcmtCheckoutName, setInitialDcmtCheckoutName] = useState("");
19
+ const validator = async (params) => {
20
+ const validations = [];
21
+ if (!params.checkoutName?.trim()) {
22
+ validations.push(new ValidationItem(ResultTypes.ERROR, SDKUI_Localizator.Name, SDKUI_Localizator.RequiredField));
23
+ }
24
+ return validations;
25
+ };
26
+ const { formData, setFormData, validationItems, exception } = useSaveForm(FormModes.Create, 0, new SaveFormOptions(), validator);
27
+ const isDisabled = !formData || !formData.checkoutName?.trim() || (formData.checkoutFolder === initialDcmtCheckoutFolder && formData.checkoutName === initialDcmtCheckoutName);
28
+ useEffect(() => {
29
+ if (!selectedDcmtOrFocused.TID || !selectedDcmtOrFocused.DID)
30
+ return;
31
+ const dcmtCheckoutInfoCurrentItems = [...SDKUI_Globals.userSettings.dcmtCheckoutInfo];
32
+ const existingItem = dcmtCheckoutInfoCurrentItems.find((item) => item.TID === selectedDcmtOrFocused.TID.toString() && item.DID === selectedDcmtOrFocused.DID.toString());
33
+ const folder = existingItem?.checkoutFolder ?? "";
34
+ const name = existingItem?.checkoutName ?? getCicoDownloadFileName(dtdName ?? SDKUI_Localizator.SearchResult, selectedDcmtOrFocused, true, false);
35
+ // Set form data
36
+ setFormData({
37
+ ...formData,
38
+ checkoutFolder: folder,
39
+ checkoutName: name,
40
+ });
41
+ // Save initial values
42
+ setInitialDcmtCheckoutFolder(folder);
43
+ setInitialDcmtCheckoutName(name);
44
+ }, []);
45
+ const calcIsModifiedWrapper = (formData) => {
46
+ if (!formData)
47
+ return false;
48
+ if (formData.checkoutFolder !== initialDcmtCheckoutFolder || formData.checkoutName !== initialDcmtCheckoutName) {
49
+ return true;
50
+ }
51
+ return false;
52
+ };
53
+ const onSaveAsync = () => {
54
+ try {
55
+ if (isDisabled)
56
+ return;
57
+ // Check: formData must exist, selectedDcmtOrFocused.TID and selectedDcmtOrFocused.DID must exist, and at least one of checkoutFolder or checkoutName must be filled
58
+ if (formData && selectedDcmtOrFocused.TID && selectedDcmtOrFocused.DID) {
59
+ // Create a new draft checkout item with TID, DID, and folder/name values
60
+ const newItem = {
61
+ TID: selectedDcmtOrFocused.TID.toString(),
62
+ DID: selectedDcmtOrFocused.DID.toString(),
63
+ checkoutFolder: formData.checkoutFolder ?? "",
64
+ checkoutName: formData.checkoutName ?? ""
65
+ };
66
+ updateDcmtCheckoutItem(newItem, "addOrUpdate");
67
+ onClose();
68
+ ShowAlert({ mode: 'success', title: SDKUI_Localizator.CheckoutInfo, message: SDKUI_Localizator.OperationSuccess, duration: 3000 });
69
+ }
70
+ }
71
+ catch (error) {
72
+ console.error('Error in onSaveAsync:', error);
73
+ TMExceptionBoxManager.show({ title: SDKUI_Localizator.Error, exception: error });
74
+ }
75
+ };
76
+ return _jsx(TMSaveForm, { title: dtdName + " \u2014 " + SDKUI_Localizator.CheckoutInfo, showTitleFormMode: false, isModal: true, width: "470px", height: "240px", showBackButton: false, showErrorCount: false, showSaveButton: false, showUndoButton: false, showToolbar: false, hasNavigation: false, formMode: FormModes.Create, validationItems: validationItems, exception: exception, isModified: calcIsModifiedWrapper(formData), onClose: onClose, children: _jsx("div", { style: { margin: "0px 10px" }, children: _jsx(TMLayoutContainer, { direction: 'vertical', children: _jsx(TMLayoutContainer, { gap: 5, children: _jsxs(TMLayoutItem, { height: 'max-content', children: [_jsxs("div", { style: { display: "flex", alignItems: "center", gap: "10px", marginTop: "5px", marginBottom: "5px" }, children: [_jsx(TMTooltip, { content: SDKUI_Localizator.CheckInOutSettingsNotice, children: _jsx(IconBxInfo, {}) }), _jsxs("span", { children: [SDKUI_Localizator.DefaultFolder, ":", " ", _jsx("i", { children: SDKUI_Globals.userSettings.defaultCheckInOutFolder !== ""
77
+ ? SDKUI_Globals.userSettings.defaultCheckInOutFolder
78
+ : SDKUI_Localizator.UndefinedText })] })] }), _jsx(TMTextBox, { icon: _jsx(IconFolder, {}), label: SDKUI_Localizator.Folder, value: formData?.checkoutFolder ?? '', isModifiedWhen: formData?.checkoutFolder !== initialDcmtCheckoutFolder, onValueChanged: (e) => {
79
+ const newValue = e.target.value;
80
+ setFormData(prev => ({
81
+ ...prev,
82
+ checkoutFolder: newValue,
83
+ checkoutName: prev?.checkoutName ?? "",
84
+ }));
85
+ }, validationItems: validationItems?.filter(o => o.PropertyName === SDKUI_Localizator.Folder), autoFocus: true, fromModal: true }), _jsx(TMTextBox, { icon: _jsx(IconFileDots, {}), label: SDKUI_Localizator.Name, value: formData?.checkoutName ?? '', isModifiedWhen: formData?.checkoutName !== initialDcmtCheckoutName, onValueChanged: (e) => {
86
+ const newValue = e.target.value;
87
+ setFormData(prev => ({
88
+ ...prev,
89
+ checkoutFolder: prev?.checkoutFolder ?? "",
90
+ checkoutName: newValue,
91
+ }));
92
+ }, validationItems: validationItems?.filter(o => o.PropertyName === SDKUI_Localizator.Name) }), _jsxs("div", { style: {
93
+ width: "100%",
94
+ height: '50px',
95
+ marginTop: "10px",
96
+ display: 'flex',
97
+ justifyContent: 'flex-end',
98
+ alignItems: 'center',
99
+ gap: '10px'
100
+ }, children: [_jsx("button", { onClick: () => onSaveAsync(), disabled: false, style: {
101
+ background: 'none',
102
+ border: 'none',
103
+ color: isDisabled ? '#a0a0a0' : TMColors.primary,
104
+ cursor: isDisabled ? 'not-allowed' : 'pointer',
105
+ padding: '6px 14px',
106
+ borderRadius: '6px',
107
+ transition: 'background-color 0.3s, color 0.3s',
108
+ }, onMouseEnter: e => {
109
+ if (!isDisabled) {
110
+ e.currentTarget.style.backgroundColor = '#e6f0ff';
111
+ e.currentTarget.style.color = '#004a99';
112
+ }
113
+ }, onMouseLeave: e => {
114
+ if (!isDisabled) {
115
+ e.currentTarget.style.backgroundColor = 'transparent';
116
+ e.currentTarget.style.color = TMColors.primary;
117
+ }
118
+ }, children: SDKUI_Localizator.Save }), _jsx("button", { onClick: () => onClose(), style: {
119
+ background: 'none',
120
+ border: 'none',
121
+ color: TMColors.primary,
122
+ cursor: 'pointer',
123
+ padding: '6px 14px',
124
+ borderRadius: '6px',
125
+ transition: 'background-color 0.3s, color 0.3s',
126
+ }, onMouseEnter: e => {
127
+ e.currentTarget.style.backgroundColor = '#e6f0ff';
128
+ e.currentTarget.style.color = '#004a99';
129
+ }, onMouseLeave: e => {
130
+ e.currentTarget.style.backgroundColor = 'transparent';
131
+ e.currentTarget.style.color = TMColors.primary;
132
+ }, children: SDKUI_Localizator.Cancel })] })] }) }) }) }) });
133
+ };
134
+ export default TMSearchResultCheckoutInfoForm;
@@ -1,11 +1,11 @@
1
1
  import React from 'react';
2
- import { DcmtTypeDescriptor, FileDescriptor, FileFormats, LayoutModes, WorkingGroupDescriptor } from '@topconsultnpm/sdk-ts';
2
+ import { DcmtTypeDescriptor, FileDescriptor, FileFormats, LayoutModes, WorkingGroupDescriptor, UserDescriptor } from '@topconsultnpm/sdk-ts';
3
3
  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 getAllFieldSelectedDcmtsOrFocused: (selectedItems: Array<any>, focusedItem: any, fileFormat?: FileFormats) => any[];
7
7
  export declare const signatureInformationCallback: (isMobile: boolean, inputDcmts: DcmtInfo[] | undefined) => Promise<void>;
8
- 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>, skipConfirmation?: boolean) => 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, openSignSettingsForm: () => void, handleCheckOutOperationCallback: (checkout: boolean) => Promise<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
+ export declare const getCommandsMenuItems: (isMobile: boolean, dtd: DcmtTypeDescriptor | undefined, allUsers: Array<UserDescriptor>, 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>, skipConfirmation?: boolean) => 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, openSignSettingsForm: () => void, handleCheckOutOperationCallback: (checkout: boolean) => Promise<void>, showCheckoutInformationFormCallback: () => void, viewHistoryCallback: () => 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<{
9
9
  mid: number;
10
10
  value: string;
11
11
  }>, 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>;