@topconsultnpm/sdkui-react 6.21.0-dev1.2 → 6.21.0-dev1.3

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.
@@ -23,11 +23,12 @@ interface ITMTreeViewProps<T extends ITMTreeItem> {
23
23
  onNodeUpdate?: (updatedNode: T) => void;
24
24
  onDataChanged?: (items: T[]) => void;
25
25
  shouldDelayFocusOnEvent?: (node: T, event: React.MouseEvent) => boolean;
26
+ onItemContextMenu?: (item: T, e: React.MouseEvent) => void;
26
27
  autoSelectChildren?: boolean;
27
28
  itemsPerPage?: number;
28
29
  showLoadMoreButton?: boolean;
29
30
  }
30
- declare const TMTreeView: <T extends ITMTreeItem>({ dataSource, focusedItem, selectedItems, allowMultipleSelection, onDataChanged, calculateItemsForNode, itemRender, onNodeUpdate, onFocusedItemChanged, onSelectionChanged, shouldDelayFocusOnEvent, autoSelectChildren, itemsPerPage, showLoadMoreButton }: ITMTreeViewProps<T>) => import("react/jsx-runtime").JSX.Element;
31
+ declare const TMTreeView: <T extends ITMTreeItem>({ dataSource, focusedItem, selectedItems, allowMultipleSelection, onDataChanged, calculateItemsForNode, itemRender, onNodeUpdate, onFocusedItemChanged, onSelectionChanged, shouldDelayFocusOnEvent, onItemContextMenu, autoSelectChildren, itemsPerPage, showLoadMoreButton }: ITMTreeViewProps<T>) => import("react/jsx-runtime").JSX.Element;
31
32
  export default TMTreeView;
32
33
  export declare const StyledTreeNode: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {
33
34
  $isSelected?: boolean;
@@ -3,7 +3,7 @@ import { useCallback, useEffect, useRef } from 'react';
3
3
  import styled from 'styled-components';
4
4
  import { IconArrowLeft, IconArrowRight, IconChevronDown, IconChevronRight, SDKUI_Localizator } from '../../helper';
5
5
  import TMButton from './TMButton';
6
- const TMTreeView = ({ dataSource = [], focusedItem, selectedItems = [], allowMultipleSelection, onDataChanged, calculateItemsForNode, itemRender, onNodeUpdate, onFocusedItemChanged, onSelectionChanged, shouldDelayFocusOnEvent, autoSelectChildren = true, itemsPerPage = 100, showLoadMoreButton = true }) => {
6
+ const TMTreeView = ({ dataSource = [], focusedItem, selectedItems = [], allowMultipleSelection, onDataChanged, calculateItemsForNode, itemRender, onNodeUpdate, onFocusedItemChanged, onSelectionChanged, shouldDelayFocusOnEvent, onItemContextMenu, autoSelectChildren = true, itemsPerPage = 100, showLoadMoreButton = true }) => {
7
7
  useEffect(() => {
8
8
  const handleKeyDown = (event) => {
9
9
  if (!focusedItem)
@@ -350,8 +350,13 @@ const TMTreeView = ({ dataSource = [], focusedItem, selectedItems = [], allowMul
350
350
  if (input) {
351
351
  input.indeterminate = isIndeterminate(node);
352
352
  }
353
- } })), _jsx("div", { style: { display: 'flex', alignItems: 'center', flex: 1, minWidth: 0 }, onClick: (e) => { handleNodeClick(node, e); }, children: itemRender(node) })] }), node.expanded && node.items && (_jsxs("div", { style: { paddingLeft: 20, width: '100%' }, children: [renderTree(getVisibleItems(node)), needsPagination(node) && (_jsxs(StyledStickyPaginator, { children: [_jsx(TMButton, { btnStyle: 'icon', onClick: () => handlePageChange(node.key, (node.currentPage ?? 0) - 1), showTooltip: false, caption: "\u25C4", icon: _jsx(IconArrowLeft, { color: 'white' }), disabled: (node.currentPage ?? 0) <= 0 }), _jsx("span", { style: { fontSize: '11px', whiteSpace: 'nowrap', fontWeight: 500, overflow: 'hidden', textOverflow: 'ellipsis', minWidth: 0, color: 'white' }, children: SDKUI_Localizator.PaginationInfo.replaceParams((node.currentPage ?? 0) + 1, getTotalPages(node), node.items?.length ?? 0) }), _jsx(TMButton, { btnStyle: 'icon', onClick: () => handlePageChange(node.key, (node.currentPage ?? 0) + 1), showTooltip: false, caption: "\u25BA", icon: _jsx(IconArrowRight, { color: 'white' }), disabled: (node.currentPage ?? 0) >= getTotalPages(node) - 1 })] }))] }))] }, node.key)));
354
- }, [handleNodeClick, handleNodeToggle, handleCheckboxChange, focusedItem, selectedItems, allowMultipleSelection, getVisibleItems, needsPagination, handlePageChange, getTotalPages]);
353
+ } })), _jsx("div", { style: { display: 'flex', alignItems: 'center', flex: 1, minWidth: 0 }, onClick: (e) => { handleNodeClick(node, e); }, onContextMenu: (e) => {
354
+ if (onItemContextMenu) {
355
+ e.preventDefault();
356
+ onItemContextMenu(node, e);
357
+ }
358
+ }, children: itemRender(node) })] }), node.expanded && node.items && (_jsxs("div", { style: { paddingLeft: 20, width: '100%' }, children: [renderTree(getVisibleItems(node)), needsPagination(node) && (_jsxs(StyledStickyPaginator, { children: [_jsx(TMButton, { btnStyle: 'icon', onClick: () => handlePageChange(node.key, (node.currentPage ?? 0) - 1), showTooltip: false, caption: "\u25C4", icon: _jsx(IconArrowLeft, { color: 'white' }), disabled: (node.currentPage ?? 0) <= 0 }), _jsx("span", { style: { fontSize: '11px', whiteSpace: 'nowrap', fontWeight: 500, overflow: 'hidden', textOverflow: 'ellipsis', minWidth: 0, color: 'white' }, children: SDKUI_Localizator.PaginationInfo.replaceParams((node.currentPage ?? 0) + 1, getTotalPages(node), node.items?.length ?? 0) }), _jsx(TMButton, { btnStyle: 'icon', onClick: () => handlePageChange(node.key, (node.currentPage ?? 0) + 1), showTooltip: false, caption: "\u25BA", icon: _jsx(IconArrowRight, { color: 'white' }), disabled: (node.currentPage ?? 0) >= getTotalPages(node) - 1 })] }))] }))] }, node.key)));
359
+ }, [handleNodeClick, handleNodeToggle, handleCheckboxChange, focusedItem, selectedItems, allowMultipleSelection, getVisibleItems, needsPagination, handlePageChange, getTotalPages, onItemContextMenu]);
355
360
  return (_jsx("div", { style: { height: '100%', width: '100%', overflowY: 'auto', overflowX: 'hidden', padding: '0px 5px 2px 2px' }, children: renderTree(dataSource) }));
356
361
  };
357
362
  export default TMTreeView;
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
- import { HomeBlogPost, TaskDescriptor } from '@topconsultnpm/sdk-ts';
3
- import { DcmtInfo, TaskContext } from '../../../ts';
2
+ import { HomeBlogPost, SearchResultDescriptor, TaskDescriptor } from '@topconsultnpm/sdk-ts';
3
+ import { DcmtInfo, TaskContext, MetadataValueDescriptorEx } from '../../../ts';
4
4
  import { DeviceContextProps } from '../../base/TMDeviceProvider';
5
5
  interface ITMMasterDetailDcmtsProps extends DeviceContextProps {
6
6
  allTasks?: Array<TaskDescriptor>;
@@ -21,6 +21,31 @@ interface ITMMasterDetailDcmtsProps extends DeviceContextProps {
21
21
  onBack?: () => void;
22
22
  appendMasterDcmts?: (tid: number | undefined, did: number | undefined) => void;
23
23
  onTaskCreateRequest?: (taskContext: TaskContext, onTaskCreated?: (task?: TaskDescriptor) => void) => void;
24
+ onRefreshAfterAddDcmtToFavs?: () => void;
25
+ editPdfForm?: boolean;
26
+ openS4TViewer?: boolean;
27
+ onOpenS4TViewerRequest?: (dcmtInfo: Array<DcmtInfo>, refreshDocumentPreview?: (() => Promise<void>)) => void;
28
+ onOpenPdfEditorRequest?: ((dcmtInfo: Array<DcmtInfo>, refreshDocumentPreview?: () => Promise<void>) => void);
29
+ datagridUtility?: {
30
+ onRefreshSearchAsyncDatagrid?: () => Promise<void>;
31
+ onRefreshDataRowsAsync?: (() => Promise<void>);
32
+ refreshFocusedDataRowAsync?: (tid: number | undefined, did: number | undefined, refreshUI?: boolean, metadataResult?: SearchResultDescriptor | null) => Promise<void>;
33
+ onRefreshBlogDatagrid?: () => Promise<void>;
34
+ onRefreshPreviewDatagrid?: () => Promise<void>;
35
+ };
36
+ dcmtUtility?: {
37
+ approvalVID?: number;
38
+ dcmtDataRowForCicoStatus?: Array<MetadataValueDescriptorEx> | any;
39
+ selectedDcmtSearchResultRelations?: SearchResultDescriptor;
40
+ dcmtTIDHasDetailRelations?: boolean;
41
+ dcmtTIDHasMasterRelations?: boolean;
42
+ updateCurrentDcmt?: () => Promise<void>;
43
+ onCloseDcmtForm?: () => void;
44
+ onRefreshBlogForm?: () => Promise<void>;
45
+ onRefreshPreviewForm?: () => Promise<void>;
46
+ taskFormDialogComponent?: React.ReactNode;
47
+ s4TViewerDialogComponent?: React.ReactNode;
48
+ };
24
49
  }
25
50
  declare const TMMasterDetailDcmts: React.FC<ITMMasterDetailDcmtsProps>;
26
51
  export default TMMasterDetailDcmts;
@@ -1,9 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useCallback, useEffect, useMemo, useState } from 'react';
3
- import { DcmtTypeListCacheService, SDK_Localizator } from '@topconsultnpm/sdk-ts';
2
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
+ import { DcmtTypeListCacheService, LayoutModes, SDK_Localizator } from '@topconsultnpm/sdk-ts';
4
4
  import TMRelationViewer from './TMRelationViewer';
5
5
  import TMContextMenu from '../../NewComponents/ContextMenu/TMContextMenu';
6
- import { IconMultipleSelection, IconCheckFile, IconDetailDcmts, SDKUI_Localizator, IconMenuVertical, IconDataList, IconPreview, IconSearchCheck, IconBoard, IconDcmtTypeSys, IconShow, getMoreInfoTasksForDocument } from '../../../helper';
6
+ import { IconMultipleSelection, IconCheckFile, IconDetailDcmts, SDKUI_Localizator, IconMenuVertical, IconDataList, IconPreview, IconSearchCheck, IconBoard, IconDcmtTypeSys, IconShow, getMoreInfoTasksForDocument, isApprovalWorkflowView } from '../../../helper';
7
7
  import { FormModes, SearchResultContext } from '../../../ts';
8
8
  import { TMColors } from '../../../utils/theme';
9
9
  import ShowAlert from '../../base/TMAlert';
@@ -15,7 +15,9 @@ import TMSearchResult from '../search/TMSearchResult';
15
15
  import TMDcmtForm from './TMDcmtForm';
16
16
  import { TMNothingToShow } from './TMDcmtPreview';
17
17
  import { Spinner } from '../..';
18
- const TMMasterDetailDcmts = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, handleNavigateToWGs, handleNavigateToDossiers, deviceType, inputDcmts, isForMaster, showCurrentDcmtIndicator = true, allowNavigation, canNext, canPrev, onNext, onPrev, onBack, appendMasterDcmts, onTaskCreateRequest }) => {
18
+ import { useDocumentOperations } from '../../../hooks/useDocumentOperations';
19
+ const TMMasterDetailDcmts = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, handleNavigateToWGs, handleNavigateToDossiers, deviceType, inputDcmts, isForMaster, showCurrentDcmtIndicator = true, allowNavigation, canNext, canPrev, onNext, onPrev, onBack, appendMasterDcmts, onTaskCreateRequest, onRefreshAfterAddDcmtToFavs, editPdfForm, openS4TViewer, onOpenS4TViewerRequest, onOpenPdfEditorRequest, datagridUtility, dcmtUtility }) => {
20
+ const floatingBarContainerRef = useRef(null);
19
21
  const [focusedItem, setFocusedItem] = useState();
20
22
  const [selectedItems, setSelectedItems] = useState([]);
21
23
  const [showZeroDcmts, setShowZeroDcmts] = useState(false);
@@ -23,6 +25,121 @@ const TMMasterDetailDcmts = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallba
23
25
  const [dtdMaster, setDtdMaster] = useState();
24
26
  const [noRelationsOnFirstLoad, setNoRelationsOnFirstLoad] = useState(false);
25
27
  const [isCheckingFirstLoad, setIsCheckingFirstLoad] = useState(true);
28
+ const [contextMenuVisible, setContextMenuVisible] = useState(false);
29
+ const [contextMenuPosition, setContextMenuPosition] = useState({ x: 0, y: 0 });
30
+ const [dtdFocused, setDtdFocused] = useState();
31
+ const [refreshKey, setRefreshKey] = useState(0);
32
+ const onRefreshSearch = async () => {
33
+ await dcmtUtility?.onRefreshPreviewForm?.();
34
+ // forza il refresh del form di dettaglio al salvataggio
35
+ setRefreshKey(prev => prev + 1);
36
+ };
37
+ // Load dtdFocused when focusedItem changes
38
+ useEffect(() => {
39
+ const loadDtdFocused = async () => {
40
+ if (!focusedItem?.tid) {
41
+ setDtdFocused(undefined);
42
+ return;
43
+ }
44
+ const dtd = await DcmtTypeListCacheService.GetAsync(focusedItem.tid);
45
+ setDtdFocused(dtd);
46
+ };
47
+ loadDtdFocused();
48
+ }, [focusedItem?.tid]);
49
+ const openTaskFormHandler = (onTaskCreated) => {
50
+ if (selectedItems.length > 1)
51
+ return;
52
+ const item = selectedItems.length === 1 ? selectedItems[0] : focusedItem;
53
+ if (item && item.tid && item.did) {
54
+ const createTaskFromDocumentOrWorkItem = async () => {
55
+ try {
56
+ const dtd = await DcmtTypeListCacheService.GetWithNotGrantedAsync(item.tid, item?.did);
57
+ if (dtd) {
58
+ const isWorkItem = isApprovalWorkflowView(dtd);
59
+ if (item.tid === undefined || item.did === undefined) {
60
+ console.error("TID or DID is undefined for the selected item.");
61
+ return;
62
+ }
63
+ const name = `${dtd.name ?? '-'} (DID: ${item.did})`;
64
+ onTaskCreateRequest?.(isWorkItem
65
+ ? { workItem: { tid: item.tid, did: item.did, name } }
66
+ : { document: { tid: item.tid, did: item.did, name } }, onTaskCreated);
67
+ }
68
+ }
69
+ catch (error) {
70
+ console.error("Error fetching data:", error);
71
+ }
72
+ };
73
+ createTaskFromDocumentOrWorkItem();
74
+ }
75
+ };
76
+ const { operationItems, renderFloatingBar, renderDcmtOperations, features } = useDocumentOperations({
77
+ context: SearchResultContext.MASTER_DETAIL,
78
+ documentData: {
79
+ dtd: dtdFocused,
80
+ selectedItems: selectedItems ? selectedItems.map(item => ({ TID: item.tid, DID: item.did, FILEEXT: item.fileExt })) : [],
81
+ focusedItem: focusedItem ? { TID: focusedItem.tid, DID: focusedItem.did, FILEEXT: focusedItem.fileExt } : undefined,
82
+ currentSearchResults: [],
83
+ currentMetadataValues: [],
84
+ allUsers: [],
85
+ // searchResult: selectedSearchResult,
86
+ datagridUtility,
87
+ dcmtUtility: {
88
+ approvalVID: dcmtUtility?.approvalVID,
89
+ dcmtDataRowForCicoStatus: dcmtUtility?.dcmtDataRowForCicoStatus,
90
+ selectedDcmtSearchResultRelations: dcmtUtility?.selectedDcmtSearchResultRelations,
91
+ dcmtTIDHasDetailRelations: dcmtUtility?.dcmtTIDHasDetailRelations,
92
+ dcmtTIDHasMasterRelations: dcmtUtility?.dcmtTIDHasMasterRelations,
93
+ updateCurrentDcmt: dcmtUtility?.updateCurrentDcmt,
94
+ onCloseDcmtForm: dcmtUtility?.onCloseDcmtForm,
95
+ onRefreshBlogForm: dcmtUtility?.onRefreshBlogForm,
96
+ onRefreshPreviewForm: onRefreshSearch,
97
+ taskFormDialogComponent: dcmtUtility?.taskFormDialogComponent,
98
+ s4TViewerDialogComponent: dcmtUtility?.s4TViewerDialogComponent
99
+ },
100
+ },
101
+ uiConfig: {
102
+ floatingBarContainerRef,
103
+ openS4TViewer,
104
+ showDcmtFormSidebar: true,
105
+ openDcmtFormAsModal: true,
106
+ allowFloatingBar: false,
107
+ enablePinIcons: false,
108
+ allowRelations: true,
109
+ inputDcmtFormLayoutMode: LayoutModes.Update,
110
+ },
111
+ tasks: {
112
+ allTasks: allTasks,
113
+ getAllTasks: getAllTasks,
114
+ deleteTaskByIdsCallback: deleteTaskByIdsCallback,
115
+ addTaskCallback: addTaskCallback,
116
+ editTaskCallback: editTaskCallback
117
+ },
118
+ callbacks: {
119
+ // Refresh operations (data consistency)
120
+ /* onSavedAsyncCallback, */
121
+ // Workflow operations
122
+ /* onWFOperationCompleted, */
123
+ // Navigation
124
+ /* canNavigateHandler,
125
+ onNavigateHandler, */
126
+ handleNavigateToWGs,
127
+ handleNavigateToDossiers,
128
+ /* onReferenceClick, */
129
+ // Document forms/operations
130
+ /* openAddDocumentForm,
131
+ openCommentFormCallback,
132
+ onFileOpened,
133
+ passToArchiveCallback,
134
+ openWGsCopyMoveForm, */
135
+ onOpenS4TViewerRequest,
136
+ onOpenPdfEditorRequest,
137
+ // Task related
138
+ onTaskCreateRequest,
139
+ openTaskFormHandler,
140
+ onRefreshAfterAddDcmtToFavs,
141
+ },
142
+ });
26
143
  // Load dtdMaster when inputDcmts changes
27
144
  useEffect(() => {
28
145
  const loadDtdMaster = async () => {
@@ -53,6 +170,12 @@ const TMMasterDetailDcmts = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallba
53
170
  setNoRelationsOnFirstLoad(true);
54
171
  }
55
172
  }, [isCheckingFirstLoad]);
173
+ const onItemContextMenu = useCallback((item, e) => {
174
+ if (!item.isDcmt)
175
+ return; // Show context menu only for document items
176
+ setContextMenuPosition({ x: e.clientX, y: e.clientY });
177
+ setContextMenuVisible(true);
178
+ }, []);
56
179
  // Show warning alert and navigate back when no relations found on first load
57
180
  useEffect(() => {
58
181
  if (noRelationsOnFirstLoad) {
@@ -97,10 +220,19 @@ const TMMasterDetailDcmts = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallba
97
220
  ?
98
221
  _jsx(TMNothingToShow, { text: getTitle(), secondText: SDKUI_Localizator.NoDataToDisplay, icon: isForMaster ? _jsx(IconDetailDcmts, { fontSize: 96, transform: 'scale(-1, 1)' }) : _jsx(IconDetailDcmts, { fontSize: 96 }) })
99
222
  :
100
- _jsx(TMRelationViewerWrapper, { inputDcmts: inputDcmts, isForMaster: isForMaster, showCurrentDcmtIndicator: showCurrentDcmtIndicator, showZeroDcmts: showZeroDcmts,
101
- // customItemRender={customItemRender}
102
- allowMultipleSelection: allowMultipleSelection, focusedItem: focusedItem, selectedItems: selectedItems, onFocusedItemChanged: handleFocusedItemChanged, onSelectedItemsChanged: handleSelectedItemsChanged, onNoRelationsFound: handleNoRelationsFound }) }), [inputDcmts, isForMaster, showCurrentDcmtIndicator, showZeroDcmts, allowMultipleSelection, focusedItem, selectedItems, handleFocusedItemChanged, handleSelectedItemsChanged, handleNoRelationsFound]);
103
- const tmFormOrResult = useMemo(() => _jsx(TMFormOrResultWrapper, { deviceType: deviceType, focusedItem: focusedItem, onTaskCreateRequest: onTaskCreateRequest, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }), [focusedItem, deviceType, allTasks, handleNavigateToWGs, handleNavigateToDossiers]);
223
+ _jsxs("div", { ref: floatingBarContainerRef, style: { width: "100%", height: "100%" }, onContextMenu: (e) => {
224
+ // Mostra context menu anche sullo spazio bianco (quando non si clicca su un item)
225
+ e.preventDefault();
226
+ setContextMenuPosition({ x: e.clientX, y: e.clientY });
227
+ setContextMenuVisible(true);
228
+ }, children: [_jsx(TMRelationViewerWrapper, { inputDcmts: inputDcmts, isForMaster: isForMaster, showCurrentDcmtIndicator: showCurrentDcmtIndicator, showZeroDcmts: showZeroDcmts,
229
+ // customItemRender={customItemRender}
230
+ allowMultipleSelection: allowMultipleSelection, focusedItem: focusedItem, selectedItems: selectedItems, onFocusedItemChanged: handleFocusedItemChanged, onSelectedItemsChanged: handleSelectedItemsChanged, onNoRelationsFound: handleNoRelationsFound, onItemContextMenu: onItemContextMenu }, refreshKey), _jsx(TMContextMenu, { items: operationItems, externalControl: {
231
+ visible: contextMenuVisible,
232
+ position: contextMenuPosition,
233
+ onClose: () => setContextMenuVisible(false)
234
+ } })] }) }), [inputDcmts, isForMaster, showCurrentDcmtIndicator, showZeroDcmts, allowMultipleSelection, focusedItem, selectedItems, handleFocusedItemChanged, handleSelectedItemsChanged, handleNoRelationsFound, onItemContextMenu, contextMenuVisible, contextMenuPosition, refreshKey]);
235
+ const tmFormOrResult = useMemo(() => _jsx(TMFormOrResultWrapper, { deviceType: deviceType, focusedItem: focusedItem, onTaskCreateRequest: onTaskCreateRequest, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, onRefreshAfterAddDcmtToFavs: onRefreshAfterAddDcmtToFavs, editPdfForm: editPdfForm, openS4TViewer: openS4TViewer, onOpenS4TViewerRequest: onOpenS4TViewerRequest, onOpenPdfEditorRequest: onOpenPdfEditorRequest }, refreshKey), [focusedItem, deviceType, allTasks, handleNavigateToWGs, handleNavigateToDossiers, editPdfForm, openS4TViewer, onOpenS4TViewerRequest, onOpenPdfEditorRequest, onRefreshAfterAddDcmtToFavs, refreshKey]);
104
236
  const initialPanelDimensions = {
105
237
  'tmTreeView': { width: '50%', height: '100%' },
106
238
  'tmFormOrResult': { width: '50%', height: '100%' },
@@ -177,7 +309,7 @@ const TMMasterDetailDcmts = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallba
177
309
  toolbarOptions: { icon: _jsx(IconSearchCheck, { fontSize: 24 }), visible: false, orderNumber: 2, isActive: allInitialPanelVisibility['tmFormOrResult'] }
178
310
  }
179
311
  ], [tmTreeView, tmFormOrResult, focusedItem?.isDcmt, dtdMaster]);
180
- return (_jsxs("div", { style: { width: '100%', height: '100%', position: 'relative' }, children: [isCheckingFirstLoad && (_jsx(Spinner, { description: SDKUI_Localizator.Loading, flat: true })), _jsx("div", { style: isCheckingFirstLoad ? { position: 'absolute', width: 0, height: 0, overflow: 'hidden', opacity: 0, pointerEvents: 'none' } : { width: '100%', height: '100%' }, children: _jsx(TMPanelManagerProvider, { panels: initialPanels, initialVisibility: allInitialPanelVisibility, defaultDimensions: initialPanelDimensions, initialDimensions: initialPanelDimensions, initialMobilePanelId: 'tmTreeView', children: _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", showToolbar: true }) }) })] }));
312
+ return (_jsxs("div", { style: { width: '100%', height: '100%', position: 'relative' }, children: [isCheckingFirstLoad && (_jsx(Spinner, { description: SDKUI_Localizator.Loading, flat: true })), _jsxs("div", { style: isCheckingFirstLoad ? { position: 'absolute', width: 0, height: 0, overflow: 'hidden', opacity: 0, pointerEvents: 'none' } : { width: '100%', height: '100%' }, children: [_jsx(TMPanelManagerProvider, { panels: initialPanels, initialVisibility: allInitialPanelVisibility, defaultDimensions: initialPanelDimensions, initialDimensions: initialPanelDimensions, initialMobilePanelId: 'tmTreeView', children: _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", showToolbar: true }) }), renderDcmtOperations, renderFloatingBar] })] }));
181
313
  };
182
314
  export default TMMasterDetailDcmts;
183
315
  /**
@@ -186,7 +318,7 @@ export default TMMasterDetailDcmts;
186
318
  * - Panel visibility toggling
187
319
  * - Focus delay handling
188
320
  */
189
- const TMRelationViewerWrapper = ({ inputDcmts, isForMaster, showCurrentDcmtIndicator, showZeroDcmts, customItemRender, allowMultipleSelection, focusedItem, selectedItems, onFocusedItemChanged, onSelectedItemsChanged, onNoRelationsFound }) => {
321
+ const TMRelationViewerWrapper = ({ inputDcmts, isForMaster, showCurrentDcmtIndicator, showZeroDcmts, customItemRender, allowMultipleSelection, focusedItem, selectedItems, onFocusedItemChanged, onSelectedItemsChanged, onNoRelationsFound, onItemContextMenu }) => {
190
322
  const { setPanelVisibilityById, setToolbarButtonVisibility } = useTMPanelManagerContext();
191
323
  // Handle focused item changes with panel visibility management
192
324
  const handleFocusedItemChanged = useCallback((item) => {
@@ -205,15 +337,25 @@ const TMRelationViewerWrapper = ({ inputDcmts, isForMaster, showCurrentDcmtIndic
205
337
  setToolbarButtonVisibility('tmDcmtForm', false);
206
338
  }
207
339
  }, [onFocusedItemChanged, setPanelVisibilityById, setToolbarButtonVisibility]);
208
- return (_jsx(TMRelationViewer, { inputDcmts: inputDcmts, isForMaster: isForMaster, showCurrentDcmtIndicator: showCurrentDcmtIndicator, initialShowZeroDcmts: showZeroDcmts, customItemRender: customItemRender, allowMultipleSelection: allowMultipleSelection, focusedItem: focusedItem, selectedItems: selectedItems, onFocusedItemChanged: handleFocusedItemChanged, onSelectedItemsChanged: onSelectedItemsChanged, maxDepthLevel: 1, invertMasterNavigation: false, onNoRelationsFound: onNoRelationsFound }));
340
+ const onContextMenu = useCallback((item, e) => {
341
+ // Ferma la propagazione per evitare che l'evento arrivi al div contenitore
342
+ // (che ha il suo handler per il context menu sullo spazio bianco)
343
+ e.stopPropagation();
344
+ handleFocusedItemChanged(item);
345
+ // Il setTimeout è necessario per permettere a React di completare il re-render
346
+ // dopo il cambio di focus (handleFocusedItemChanged aggiorna stato e visibilità pannelli).
347
+ // Senza il delay, il context menu potrebbe mostrare opzioni basate sul vecchio stato.
348
+ setTimeout(() => {
349
+ onItemContextMenu?.(item, e);
350
+ }, 100);
351
+ }, [onItemContextMenu, handleFocusedItemChanged]);
352
+ return (_jsx(TMRelationViewer, { inputDcmts: inputDcmts, isForMaster: isForMaster, showCurrentDcmtIndicator: showCurrentDcmtIndicator, initialShowZeroDcmts: showZeroDcmts, customItemRender: customItemRender, allowMultipleSelection: allowMultipleSelection, focusedItem: focusedItem, selectedItems: selectedItems, onFocusedItemChanged: handleFocusedItemChanged, onSelectedItemsChanged: onSelectedItemsChanged, maxDepthLevel: 1, invertMasterNavigation: false, onNoRelationsFound: onNoRelationsFound, onItemContextMenu: onContextMenu }));
209
353
  };
210
- const TMFormOrResultWrapper = ({ deviceType, focusedItem, onTaskCreateRequest, allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, handleNavigateToWGs, handleNavigateToDossiers }) => {
354
+ const TMFormOrResultWrapper = ({ deviceType, focusedItem, onTaskCreateRequest, allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, handleNavigateToWGs, handleNavigateToDossiers, onRefreshAfterAddDcmtToFavs, editPdfForm, openS4TViewer, onOpenS4TViewerRequest, onOpenPdfEditorRequest, onRefreshSearchAsyncDatagrid }) => {
211
355
  const { setPanelVisibilityById } = useTMPanelManagerContext();
212
356
  return (_jsx(_Fragment, { children: focusedItem?.isDcmt ?
213
- _jsx(TMDcmtForm, { groupId: 'tmFormOrResult', TID: focusedItem?.tid, DID: focusedItem.did, allowButtonsRefs: true, isClosable: deviceType !== DeviceType.MOBILE, allowNavigation: false, allowRelations: deviceType !== DeviceType.MOBILE, showDcmtFormSidebar: false, onClose: () => {
214
- setPanelVisibilityById('tmTreeView', true);
215
- }, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, moreInfoTasks: getMoreInfoTasksForDocument(allTasks, focusedItem?.tid, focusedItem?.did) }) :
216
- _jsx(TMSearchResult, { groupId: 'tmFormOrResult', isClosable: deviceType !== DeviceType.MOBILE, context: SearchResultContext.METADATA_SEARCH, allowFloatingBar: false, allowRelations: false, openDcmtFormAsModal: true, searchResults: focusedItem?.searchResult ?? [], showSearchResultSidebar: false, showDcmtFormSidebar: false, onTaskCreateRequest: onTaskCreateRequest, onClose: () => {
217
- setPanelVisibilityById('tmTreeView', true);
218
- }, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }) }));
357
+ _jsx(TMDcmtForm, { groupId: 'tmFormOrResult', TID: focusedItem?.tid, DID: focusedItem.did, allowButtonsRefs: true, isClosable: deviceType !== DeviceType.MOBILE, allowNavigation: false, allowRelations: deviceType !== DeviceType.MOBILE, showDcmtFormSidebar: false, onClose: () => { setPanelVisibilityById('tmTreeView', true); }, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, moreInfoTasks: getMoreInfoTasksForDocument(allTasks, focusedItem?.tid, focusedItem?.did), openS4TViewer: openS4TViewer, onOpenS4TViewerRequest: onOpenS4TViewerRequest, onOpenPdfEditorRequest: onOpenPdfEditorRequest, datagridUtility: {
358
+ onRefreshSearchAsyncDatagrid,
359
+ } }) :
360
+ _jsx(TMSearchResult, { groupId: 'tmFormOrResult', isClosable: deviceType !== DeviceType.MOBILE, context: SearchResultContext.METADATA_SEARCH, allowFloatingBar: false, allowRelations: false, openDcmtFormAsModal: true, searchResults: focusedItem?.searchResult ?? [], showSearchResultSidebar: false, showDcmtFormSidebar: false, onTaskCreateRequest: onTaskCreateRequest, onClose: () => { setPanelVisibilityById('tmTreeView', true); }, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, editPdfForm: editPdfForm, onOpenPdfEditorRequest: onOpenPdfEditorRequest, openS4TViewer: openS4TViewer, onOpenS4TViewerRequest: onOpenS4TViewerRequest, enablePinIcons: false, onRefreshAfterAddDcmtToFavs: onRefreshAfterAddDcmtToFavs }) }));
219
361
  };
@@ -22,6 +22,7 @@ export interface RelationTreeItem extends ITMTreeItem {
22
22
  values?: any;
23
23
  searchResult?: SearchResultDescriptor[];
24
24
  itemsCount?: number;
25
+ fileExt?: string;
25
26
  }
26
27
  /**
27
28
  * Props for TMRelationViewer component
@@ -98,6 +99,11 @@ export interface TMRelationViewerProps {
98
99
  * Useful to notify parent component that there are no correlated documents to display.
99
100
  */
100
101
  onNoRelationsFound?: () => void;
102
+ /**
103
+ * Callback invoked when user right-clicks on a tree item.
104
+ * Use to show a context menu.
105
+ */
106
+ onItemContextMenu?: (item: RelationTreeItem, e: React.MouseEvent) => void;
101
107
  }
102
108
  /**
103
109
  * Check if document type has detail relations
@@ -136,7 +136,7 @@ export const searchResultToDataSource = async (searchResult, hideSysMetadata) =>
136
136
  }
137
137
  return output;
138
138
  };
139
- const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndicator = true, allowShowZeroDcmts = true, initialShowZeroDcmts = false, allowedTIDs, allowMultipleSelection = false, focusedItem, selectedItems, onFocusedItemChanged, onSelectedItemsChanged, onDocumentDoubleClick, customItemRender, customDocumentStyle, customMainContainerContent, customDocumentContent, showMetadataNames = false, maxDepthLevel = 2, invertMasterNavigation = true, additionalStaticItems, showMainDocument = true, labelMainContainer, onNoRelationsFound, }) => {
139
+ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndicator = true, allowShowZeroDcmts = true, initialShowZeroDcmts = false, allowedTIDs, allowMultipleSelection = false, focusedItem, selectedItems, onFocusedItemChanged, onSelectedItemsChanged, onDocumentDoubleClick, customItemRender, customDocumentStyle, customMainContainerContent, customDocumentContent, showMetadataNames = false, maxDepthLevel = 2, invertMasterNavigation = true, additionalStaticItems, showMainDocument = true, labelMainContainer, onNoRelationsFound, onItemContextMenu, }) => {
140
140
  // State
141
141
  const [dcmtTypes, setDcmtTypes] = useState([]);
142
142
  const [treeData, setTreeData] = useState([]);
@@ -246,7 +246,8 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
246
246
  // Children will be loaded lazily by calculateItemsForNode when expanded
247
247
  expanded: false,
248
248
  hidden: false,
249
- name: row?.SYS_Abstract?.value || row?.SYS_SUBJECT?.value || `Documento ${did}`
249
+ name: row?.SYS_Abstract?.value || row?.SYS_SUBJECT?.value || `Documento ${did}`,
250
+ fileExt: row?.FILEEXT?.value
250
251
  // Note: Recursive loading on expansion is handled by calculateItemsForNode
251
252
  });
252
253
  }
@@ -375,7 +376,7 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
375
376
  isContainer: false,
376
377
  isDcmt: false,
377
378
  isInfoMessage: true,
378
- isExpandible: false
379
+ isExpandible: false,
379
380
  },
380
381
  ...filteredChildren
381
382
  ];
@@ -618,7 +619,8 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
618
619
  values: docRow,
619
620
  searchResult: result ? [result] : [],
620
621
  items: relatedDocs,
621
- itemsCount: relatedDocs.length
622
+ itemsCount: relatedDocs.length,
623
+ fileExt: docRow?.FILEEXT?.value
622
624
  };
623
625
  // Check if a type container for this TID already exists in the tree
624
626
  const existingContainer = tree.find(c => c.tid === dcmt.TID && c.isContainer);
@@ -1130,7 +1132,7 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
1130
1132
  return null;
1131
1133
  return _jsx("div", { style: { padding: '20px', textAlign: 'center', color: '#666' }, children: "Nessuna relazione disponibile." });
1132
1134
  }
1133
- return (_jsxs(_Fragment, { children: [_jsx(TMTreeView, { dataSource: mergedTreeData, itemRender: finalItemRender, calculateItemsForNode: calculateItemsForNode, onDataChanged: handleDataChanged, focusedItem: focusedItem, onFocusedItemChanged: handleFocusedItemChanged, allowMultipleSelection: allowMultipleSelection, selectedItems: selectedItems, itemsPerPage: 100, onSelectionChanged: handleSelectedItemsChanged }), showExpansionWaitPanel && (_jsx(TMWaitPanel, { title: isForMaster ? 'Caricamento documenti master' : 'Caricamento documenti dettaglio', showPrimary: true, textPrimary: expansionWaitPanelText, valuePrimary: expansionWaitPanelValue, maxValuePrimary: expansionWaitPanelMaxValue, isCancelable: true, abortController: expansionAbortController, onAbortClick: (abortController) => {
1135
+ return (_jsxs(_Fragment, { children: [_jsx(TMTreeView, { dataSource: mergedTreeData, itemRender: finalItemRender, calculateItemsForNode: calculateItemsForNode, onDataChanged: handleDataChanged, focusedItem: focusedItem, onFocusedItemChanged: handleFocusedItemChanged, allowMultipleSelection: allowMultipleSelection, selectedItems: selectedItems, itemsPerPage: 100, onSelectionChanged: handleSelectedItemsChanged, onItemContextMenu: onItemContextMenu }), showExpansionWaitPanel && (_jsx(TMWaitPanel, { title: isForMaster ? 'Caricamento documenti master' : 'Caricamento documenti dettaglio', showPrimary: true, textPrimary: expansionWaitPanelText, valuePrimary: expansionWaitPanelValue, maxValuePrimary: expansionWaitPanelMaxValue, isCancelable: true, abortController: expansionAbortController, onAbortClick: (abortController) => {
1134
1136
  setTimeout(() => {
1135
1137
  abortController?.abort();
1136
1138
  }, 100);
@@ -820,7 +820,14 @@ export const useDocumentOperations = (props) => {
820
820
  try {
821
821
  TMSpinner.show({ description: `${SDKUI_Localizator.Loading}...` });
822
822
  const msg = await SDK_Globals.tmSession?.NewSearchEngine().FreeSearchGetDcmtInfoAsync(dcmt.TID, dcmt.DID);
823
- TMMessageBoxManager.show({ buttons: [ButtonNames.OK], message: msg, title: SDKUI_Localizator.IndexingInformation });
823
+ TMMessageBoxManager.show({
824
+ buttons: [ButtonNames.OK],
825
+ showToppy: false,
826
+ resizable: true,
827
+ initialWidth: !isMobile ? '700px' : undefined,
828
+ message: msg,
829
+ title: SDKUI_Localizator.IndexingInformation
830
+ });
824
831
  }
825
832
  catch (e) {
826
833
  TMExceptionBoxManager.show({ exception: e });
@@ -1047,15 +1054,14 @@ export const useDocumentOperations = (props) => {
1047
1054
  return [
1048
1055
  {
1049
1056
  id: 'doc',
1050
- icon: _jsx(IconCheck, {}),
1057
+ icon: _jsx(IconFileDots, {}),
1051
1058
  name: !isMobile ? SDKUI_Localizator.DocumentOperations : SDKUI_Localizator.Documents,
1052
1059
  disabled: isDisabledForSingleRow() && isDisabledForMultiRow(),
1053
1060
  submenu: [
1054
- ...(inputDcmtFormLayoutMode === LayoutModes.Update ? [addToFavoriteOperation()] : []),
1055
- ...((onTaskCreateRequest && inputDcmtFormLayoutMode === LayoutModes.Update && SDK_Globals.tmSession?.SessionDescr?.appModuleID === AppModules.SURFER) ? [createContextualTaskMenuItem()] : []),
1061
+ addToFavoriteOperation(),
1062
+ openFormOperation(),
1056
1063
  downloadFileMenuItem(),
1057
1064
  downloadXMLAttachmentsMenuItem(),
1058
- ...(selectedDcmtInfos.length > 0 && isPdfEditorAvailable(dtd, selectedDcmtInfos[0]?.FILEEXT) && onOpenPdfEditorRequest ? [pdfEditorMenuItem(onOpenPdfEditorRequest)] : []),
1059
1065
  ]
1060
1066
  },
1061
1067
  signatureMenuItem(),
@@ -1064,6 +1070,29 @@ export const useDocumentOperations = (props) => {
1064
1070
  ...((inputDcmtFormLayoutMode === LayoutModes.Update) ? [fullTextSearchMenuItem()] : []),
1065
1071
  ];
1066
1072
  };
1073
+ const getMasterDetailMenuItems = () => {
1074
+ return [
1075
+ {
1076
+ id: 'doc',
1077
+ icon: _jsx(IconCheck, {}),
1078
+ name: !isMobile ? SDKUI_Localizator.DocumentOperations : SDKUI_Localizator.Documents,
1079
+ disabled: isDisabledForSingleRow() && isDisabledForMultiRow(),
1080
+ submenu: [
1081
+ ...(inputDcmtFormLayoutMode === LayoutModes.Update ? [addToFavoriteOperation()] : []),
1082
+ addReplaceFileOperation(),
1083
+ openFormOperation(),
1084
+ fileCheckMenuItem(),
1085
+ fileConversionsMenuItem(),
1086
+ ...(SDK_Globals.tmSession?.SessionDescr?.appModuleID === AppModules.SURFER ? [createContextualTaskMenuItem()] : []),
1087
+ downloadFileMenuItem(),
1088
+ downloadXMLAttachmentsMenuItem(),
1089
+ ...(selectedDcmtInfos.length > 0 && isPdfEditorAvailable(dtd, selectedDcmtInfos[0]?.FILEEXT) && onOpenPdfEditorRequest ? [pdfEditorMenuItem(onOpenPdfEditorRequest)] : [])
1090
+ ]
1091
+ },
1092
+ signatureMenuItem(),
1093
+ ...((inputDcmtFormLayoutMode === LayoutModes.Update) ? [fullTextSearchMenuItem()] : []),
1094
+ ];
1095
+ };
1067
1096
  const getOperationMenuItems = () => {
1068
1097
  const getMenuItemsByContext = () => {
1069
1098
  switch (context) {
@@ -1071,6 +1100,8 @@ export const useDocumentOperations = (props) => {
1071
1100
  return getDcmtFormMenuItems();
1072
1101
  case SearchResultContext.ARCHIVED_WORKGROUP:
1073
1102
  return getArchivedWorkgroupMenuItems();
1103
+ case SearchResultContext.MASTER_DETAIL:
1104
+ return getMasterDetailMenuItems();
1074
1105
  default:
1075
1106
  return getDefaultMenuItems();
1076
1107
  }
@@ -1084,15 +1115,18 @@ export const useDocumentOperations = (props) => {
1084
1115
  };
1085
1116
  const renderFloatingBar = (floatingBarContainerRef && floatingBarContainerRef.current && allowFloatingBar && showFloatingBar && deviceType !== DeviceType.MOBILE) ? (_jsx(TMFloatingMenuBar, { containerRef: floatingBarContainerRef, contextMenuItems: operationItems(), isConstrained: true, defaultPosition: { x: 1, y: 88 }, defaultPinnedItems: ['rel-det', 'rel-mst', 'dl'], defaultOrientation: 'horizontal', hasContextMenu: false, pinnedItemIds: pinnedItemIds, onPinChange: setPinnedItemIds })) : null;
1086
1117
  const renderDcmtOperations = (_jsxs(_Fragment, { children: [(showExportForm && searchResult && dataColumns && dataSource && selectedRowKeys) && (_jsx(TMDataGridExportForm, { dataColumns: dataColumns, dataSource: dataSource, selectedRowKeys: selectedRowKeys, onCloseExportForm: () => setShowExportForm(false), searchResult: searchResult })), _jsx(StyledMultiViewPanel, { "$isVisible": isOpenDcmtForm, children: ((isOpenDcmtForm && focusedItem?.TID !== undefined && focusedItem?.DID !== undefined) &&
1087
- _jsx(TMDcmtForm, { isModal: openDcmtFormAsModal || (dcmtFormLayoutMode === LayoutModes.Ark && focusedItem?.DID !== undefined), titleModal: dtd?.name ?? '', TID: focusedItem.TID, DID: focusedItem.DID, allowButtonsRefs: true, layoutMode: dcmtFormLayoutMode, count: visibleItems?.length, itemIndex: visibleItems ? visibleItems.findIndex(o => o.rowIndex === focusedItem?.rowIndex) + 1 : undefined, canNext: canNavigateHandler ? canNavigateHandler('next') : false, canPrev: canNavigateHandler ? canNavigateHandler('prev') : false, onNext: () => onNavigateHandler && onNavigateHandler('next'), onPrev: () => onNavigateHandler && onNavigateHandler('prev'), onClose: () => { setIsOpenDcmtForm(false); onDcmtFormOpenChange(false, LayoutModes.Update); }, onWFOperationCompleted: onWFOperationCompleted, onTaskCreateRequest: onTaskCreateRequest, onSavedAsyncCallback: onSavedAsyncCallback, openS4TViewer: openS4TViewer, onOpenS4TViewerRequest: onOpenS4TViewerRequest, onOpenPdfEditorRequest: onOpenPdfEditorRequest, onReferenceClick: onReferenceClick, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, moreInfoTasks: getMoreInfoTasksForDocument(allTasks, focusedItem?.TID, focusedItem?.DID), showDcmtFormSidebar: showDcmtFormSidebar, datagridUtility: {
1118
+ _jsx(TMDcmtForm, { isModal: openDcmtFormAsModal || (dcmtFormLayoutMode === LayoutModes.Ark && focusedItem?.DID !== undefined), titleModal: dtd?.name ?? '', TID: focusedItem.TID, DID: focusedItem.DID, allowButtonsRefs: true, layoutMode: dcmtFormLayoutMode, count: visibleItems?.length, itemIndex: visibleItems ? visibleItems.findIndex(o => o.rowIndex === focusedItem?.rowIndex) + 1 : undefined, canNext: canNavigateHandler ? canNavigateHandler('next') : false, canPrev: canNavigateHandler ? canNavigateHandler('prev') : false, onNext: () => onNavigateHandler && onNavigateHandler('next'), onPrev: () => onNavigateHandler && onNavigateHandler('prev'), onClose: () => {
1119
+ (false);
1120
+ onDcmtFormOpenChange(false, LayoutModes.Update);
1121
+ }, onWFOperationCompleted: onWFOperationCompleted, onTaskCreateRequest: onTaskCreateRequest, onSavedAsyncCallback: onSavedAsyncCallback, openS4TViewer: openS4TViewer, onOpenS4TViewerRequest: onOpenS4TViewerRequest, onOpenPdfEditorRequest: onOpenPdfEditorRequest, onReferenceClick: onReferenceClick, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, moreInfoTasks: getMoreInfoTasksForDocument(allTasks, focusedItem?.TID, focusedItem?.DID), showDcmtFormSidebar: showDcmtFormSidebar, datagridUtility: {
1088
1122
  onRefreshSearchAsyncDatagrid,
1089
1123
  onRefreshDataRowsAsync,
1090
1124
  refreshFocusedDataRowAsync,
1091
1125
  onRefreshBlogDatagrid,
1092
1126
  onRefreshPreviewDatagrid
1093
1127
  } })) }), (showHistory && dtd && selectedDcmtInfos.length > 0) && _jsx(TMViewHistoryDcmt, { fromDTD: dtd, deviceType: deviceType, inputDcmt: selectedDcmtInfos[0], onClose: hideHistoryCallback, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }), (commentFormState.show && selectedDcmtInfos.length > 0) && _jsx(TMBlogCommentForm, { context: { engine: 'SearchEngine', object: { tid: selectedDcmtInfos[0].TID, did: selectedDcmtInfos[0].DID } }, onClose: hideCommentFormCallback, refreshCallback: onRefreshBlog, participants: [], showAttachmentsSection: true, allArchivedDocumentsFileItems: convertSearchResultDescriptorToFileItems(currentSearchResults ?? []), isCommentRequired: commentFormState.isRequired, removeAndEditAttachment: commentFormState.removeAndEditAttachment, selectedAttachmentDid: [Number(selectedDcmtInfos[0].DID)] }), (showCheckoutInformationForm && dtd && selectedDcmtInfos.length > 0) &&
1094
- _jsx(TMDcmtCheckoutInfoForm, { dtdName: dtd.name ?? SDKUI_Localizator.SearchResult, selectedDcmtOrFocused: selectedDcmtInfos[0], onClose: hideCheckoutInformationFormCallback }), _jsx(StyledMultiViewPanel, { "$isVisible": isOpenDetails, children: isOpenDetails && _jsx(TMMasterDetailDcmts, { deviceType: deviceType, isForMaster: false, inputDcmts: selectedDcmtInfos, allowNavigation: selectedDcmtInfos.length === 1, canNext: canNavigateHandler ? canNavigateHandler('next') : false, canPrev: canNavigateHandler ? canNavigateHandler('prev') : false, onNext: () => onNavigateHandler && onNavigateHandler('next'), onPrev: () => onNavigateHandler && 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: selectedDcmtInfos, isForMaster: true, allowNavigation: selectedDcmtInfos.length === 1, canNext: canNavigateHandler ? canNavigateHandler('next') : false, canPrev: canNavigateHandler ? canNavigateHandler('prev') : false, onNext: () => onNavigateHandler && onNavigateHandler('next'), onPrev: () => onNavigateHandler && 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) => {
1095
- 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}`));
1128
+ _jsx(TMDcmtCheckoutInfoForm, { dtdName: dtd.name ?? SDKUI_Localizator.SearchResult, selectedDcmtOrFocused: selectedDcmtInfos[0], onClose: hideCheckoutInformationFormCallback }), _jsx(StyledMultiViewPanel, { "$isVisible": isOpenDetails, children: isOpenDetails && _jsx(TMMasterDetailDcmts, { deviceType: deviceType, isForMaster: false, inputDcmts: selectedDcmtInfos, allowNavigation: selectedDcmtInfos.length === 1, canNext: canNavigateHandler ? canNavigateHandler('next') : false, canPrev: canNavigateHandler ? canNavigateHandler('prev') : false, onNext: () => onNavigateHandler && onNavigateHandler('next'), onPrev: () => onNavigateHandler && onNavigateHandler('prev'), onBack: () => setIsOpenDetails(false), allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, editPdfForm: editPdfForm, openS4TViewer: openS4TViewer, onOpenS4TViewerRequest: onOpenS4TViewerRequest, onOpenPdfEditorRequest: onOpenPdfEditorRequest, onRefreshAfterAddDcmtToFavs: onRefreshAfterAddDcmtToFavs, onTaskCreateRequest: onTaskCreateRequest, datagridUtility: datagridUtility, dcmtUtility: dcmtUtility }) }), _jsxs(StyledMultiViewPanel, { "$isVisible": isOpenMaster, children: [isOpenMaster && _jsx(TMMasterDetailDcmts, { deviceType: deviceType, inputDcmts: selectedDcmtInfos, isForMaster: true, allowNavigation: selectedDcmtInfos.length === 1, canNext: canNavigateHandler ? canNavigateHandler('next') : false, canPrev: canNavigateHandler ? canNavigateHandler('prev') : false, onNext: () => onNavigateHandler && onNavigateHandler('next'), onPrev: () => onNavigateHandler && onNavigateHandler('prev'), onBack: () => setIsOpenMaster(false), appendMasterDcmts: handleAddItem, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, editPdfForm: editPdfForm, openS4TViewer: openS4TViewer, onOpenS4TViewerRequest: onOpenS4TViewerRequest, onOpenPdfEditorRequest: onOpenPdfEditorRequest, onRefreshAfterAddDcmtToFavs: onRefreshAfterAddDcmtToFavs, onTaskCreateRequest: onTaskCreateRequest, datagridUtility: datagridUtility, dcmtUtility: dcmtUtility }), secondaryMasterDcmts.length > 0 && secondaryMasterDcmts.map((dcmt, index) => {
1129
+ 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, editPdfForm: editPdfForm, openS4TViewer: openS4TViewer, onOpenS4TViewerRequest: onOpenS4TViewerRequest, onOpenPdfEditorRequest: onOpenPdfEditorRequest, onTaskCreateRequest: onTaskCreateRequest, datagridUtility: datagridUtility, dcmtUtility: dcmtUtility }) }, `${index}-${dcmt.DID}`));
1096
1130
  })] }), 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: () => {
1097
1131
  setIsOpenArchiveRelationForm(false);
1098
1132
  setArchiveType(undefined);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@topconsultnpm/sdkui-react",
3
- "version": "6.21.0-dev1.2",
3
+ "version": "6.21.0-dev1.3",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" \u0026\u0026 exit 1",