@topconsultnpm/sdkui-react 6.20.0-dev1.39 → 6.20.0-dev1.40

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.
@@ -3,7 +3,7 @@ import { useState, useRef, useEffect } from 'react';
3
3
  import * as S from './styles';
4
4
  import { useIsMobile, useMenuPosition } from './hooks';
5
5
  import { IconArrowLeft } from '../../../helper';
6
- const TMContextMenu = ({ items, trigger = 'right', children, externalControl }) => {
6
+ const TMContextMenu = ({ items, trigger = 'right', children, externalControl, keepOpenOnClick = false }) => {
7
7
  const [menuState, setMenuState] = useState({
8
8
  visible: false,
9
9
  position: { x: 0, y: 0 },
@@ -42,6 +42,47 @@ const TMContextMenu = ({ items, trigger = 'right', children, externalControl })
42
42
  }));
43
43
  }
44
44
  }, [externalControl, items]);
45
+ // Update items when they change while menu is visible (for keepOpenOnClick behavior)
46
+ useEffect(() => {
47
+ if (!keepOpenOnClick)
48
+ return;
49
+ if (!externalControl && menuState.visible) {
50
+ setMenuState(prev => ({
51
+ ...prev,
52
+ submenuStack: [items],
53
+ }));
54
+ // Update hoveredSubmenus with fresh items while keeping them open
55
+ setHoveredSubmenus(prev => {
56
+ if (prev.length === 0)
57
+ return prev;
58
+ // Rebuild hoveredSubmenus with updated items from the new items structure
59
+ return prev.map(submenu => {
60
+ // Find the matching submenu in the new items structure
61
+ const findSubmenuInItems = (searchItems) => {
62
+ for (const item of searchItems) {
63
+ if (item.submenu && item.submenu.length > 0) {
64
+ // Check if this submenu matches (compare first item name as identifier)
65
+ if (submenu.items.length > 0 && item.submenu.length > 0 &&
66
+ item.submenu[0].name === submenu.items[0].name) {
67
+ return item.submenu;
68
+ }
69
+ // Recursively search in nested submenus
70
+ const found = findSubmenuInItems(item.submenu);
71
+ if (found)
72
+ return found;
73
+ }
74
+ }
75
+ return null;
76
+ };
77
+ const updatedItems = findSubmenuInItems(items);
78
+ return {
79
+ ...submenu,
80
+ items: updatedItems || submenu.items, // Use updated items if found, otherwise keep old
81
+ };
82
+ });
83
+ });
84
+ }
85
+ }, [items, menuState.visible, externalControl, keepOpenOnClick]);
45
86
  useEffect(() => {
46
87
  if (!menuState.visible)
47
88
  return;
@@ -109,8 +150,10 @@ const TMContextMenu = ({ items, trigger = 'right', children, externalControl })
109
150
  // Desktop: Submenus are handled by hover, don't close menu
110
151
  }
111
152
  else {
112
- // No submenu: close menu after executing action
113
- handleClose();
153
+ // No submenu: close menu after executing action (unless keepOpenOnClick is true)
154
+ if (!keepOpenOnClick) {
155
+ handleClose();
156
+ }
114
157
  }
115
158
  };
116
159
  const handleBack = () => {
@@ -70,7 +70,7 @@ export const MenuItem = styled.div `
70
70
  align-items: center;
71
71
  justify-content: space-between;
72
72
  padding: 4px 12px;
73
- cursor: ${props => props.$disabled ? 'not-allowed' : 'pointer'};
73
+ cursor: ${props => props.$disabled ? 'default' : 'pointer'};
74
74
  transition: all 0.15s ease;
75
75
  position: relative;
76
76
  user-select: none;
@@ -24,6 +24,7 @@ export interface TMContextMenuProps {
24
24
  };
25
25
  onClose: () => void;
26
26
  };
27
+ keepOpenOnClick?: boolean;
27
28
  }
28
29
  export interface Position {
29
30
  x: number;
@@ -4,9 +4,9 @@ import { ContextMenu } from '../ContextMenu';
4
4
  import ShowAlert from '../../base/TMAlert';
5
5
  import TMTooltip from '../../base/TMTooltip';
6
6
  import * as S from './styles';
7
- import { IconAdd, IconApply, IconMenuVertical, IconPencil, IconPin, IconUndo, SDKUI_Globals, SDKUI_Localizator } from '../../../helper';
7
+ import { IconAdd, IconApply, IconMenuVertical, IconPin, IconUndo, SDKUI_Globals, SDKUI_Localizator } from '../../../helper';
8
8
  const IconDraggableDots = (props) => (_jsx("svg", { fontSize: 18, viewBox: "0 0 24 24", fill: "currentColor", height: "1em", width: "1em", ...props, children: _jsx("path", { d: "M9 3a2 2 0 11-4 0 2 2 0 014 0zm0 9a2 2 0 11-4 0 2 2 0 014 0zm0 9a2 2 0 11-4 0 2 2 0 014 0zm10-18a2 2 0 11-4 0 2 2 0 014 0zm0 9a2 2 0 11-4 0 2 2 0 014 0zm0 9a2 2 0 11-4 0 2 2 0 014 0z" }) }));
9
- const TMFloatingMenuBar = ({ containerRef, contextMenuItems = [], isConstrained = false, defaultPosition = { x: 100, y: 100 }, maxItems = 8, }) => {
9
+ const TMFloatingMenuBar = ({ containerRef, contextMenuItems = [], isConstrained = false, defaultPosition = { x: 100, y: 100 }, maxItems = 100, }) => {
10
10
  const getDefaultConfig = () => ({
11
11
  orientation: 'horizontal',
12
12
  savedItemIds: [],
@@ -57,10 +57,6 @@ const TMFloatingMenuBar = ({ containerRef, contextMenuItems = [], isConstrained
57
57
  : 'horizontal';
58
58
  // Validate itemIds
59
59
  const validItemIds = Array.isArray(settings.itemIds) ? settings.itemIds : [];
60
- // IMPORTANT: Detect old name-based configurations and reset them
61
- // Old configs would have saved items, but those items don't have proper IDs from menu items
62
- // New IDs are short like 'fav', 'dl', 'open-form', etc.
63
- // If we detect old-style data (no items have valid IDs), reset to empty
64
60
  if (validItemIds.length > 0) {
65
61
  // Check if any ID looks like the old format (contains language-specific text or is too long)
66
62
  const hasOldFormatIds = validItemIds.some(id => typeof id === 'string' && (id.length > 20 || id.includes(' ')));
@@ -103,23 +99,17 @@ const TMFloatingMenuBar = ({ containerRef, contextMenuItems = [], isConstrained
103
99
  const dragOffset = useRef({ x: 0, y: 0 });
104
100
  const [dragOverIndex, setDragOverIndex] = useState(null);
105
101
  const stateSnapshot = useRef(null);
106
- // Use refs to track item IDs without causing re-renders
107
102
  const floatingBarItemIds = useRef(new Set());
108
103
  const floatingBarItemNames = useRef(new Set());
109
- // Update refs when items change, but don't trigger re-renders
110
104
  useEffect(() => {
111
105
  floatingBarItemIds.current = new Set(state.items.map(i => i.id));
112
106
  floatingBarItemNames.current = new Set(state.items.map(i => i.name));
113
107
  }, [state.items]);
114
- // Convert menu items to flat list with pinned status
115
108
  const flattenMenuItems = useCallback((items, parentPath = '') => {
116
109
  const result = [];
117
110
  items.forEach((item, index) => {
118
- // Use the actual item.id if available, otherwise fall back to generating from name
119
111
  const itemId = item.id || `${parentPath}${item.name}-${index}`;
120
- // Only add items that have onClick (final actions, not submenu parents)
121
112
  if (item.onClick && !item.submenu) {
122
- // Check if item is currently in the floating bar by ID only
123
113
  const isPinned = state.items.some(i => i.id === itemId);
124
114
  result.push({
125
115
  id: itemId,
@@ -197,7 +187,6 @@ const TMFloatingMenuBar = ({ containerRef, contextMenuItems = [], isConstrained
197
187
  onClick: foundItem?.onClick
198
188
  };
199
189
  }, [contextMenuItems]);
200
- // Create context menu items for pinning (used by + button in edit mode)
201
190
  const getPinContextMenuItems = useCallback(() => {
202
191
  const flatItems = flattenMenuItems(contextMenuItems);
203
192
  const currentItemIds = new Set(state.items.map(i => i.id));
@@ -208,13 +197,11 @@ const TMFloatingMenuBar = ({ containerRef, contextMenuItems = [], isConstrained
208
197
  const isAlreadyPinned = currentItemIds.has(itemId);
209
198
  const pinItem = {
210
199
  ...item,
211
- // Override onClick to pin instead of executing the action
212
200
  onClick: item.onClick && !item.submenu ? () => {
213
201
  if (flatItem && !isAlreadyPinned) {
214
202
  togglePin(flatItem);
215
203
  }
216
204
  } : undefined,
217
- // Remove original disabled state - only disable already pinned items
218
205
  disabled: isAlreadyPinned,
219
206
  };
220
207
  if (item.submenu) {
@@ -348,12 +335,25 @@ const TMFloatingMenuBar = ({ containerRef, contextMenuItems = [], isConstrained
348
335
  };
349
336
  const toggleOrientation = () => {
350
337
  const newOrientation = state.orientation === 'horizontal' ? 'vertical' : 'horizontal';
351
- // First, change the orientation
338
+ if (state.orientation === 'horizontal' && newOrientation === 'vertical') {
339
+ if (floatingRef.current) {
340
+ const floating = floatingRef.current.getBoundingClientRect();
341
+ const screenHeight = window.innerHeight;
342
+ if (floating.width > screenHeight - 70) {
343
+ ShowAlert({
344
+ mode: 'warning',
345
+ title: 'Troppi elementi',
346
+ message: 'Ci sono troppi elementi nella barra mobile per la modalità verticale.',
347
+ duration: 4000,
348
+ });
349
+ return;
350
+ }
351
+ }
352
+ }
352
353
  setState(s => ({
353
354
  ...s,
354
355
  orientation: newOrientation,
355
356
  }));
356
- // Then, after DOM updates, adjust position to stay in bounds
357
357
  requestAnimationFrame(() => {
358
358
  requestAnimationFrame(() => {
359
359
  if (containerRef.current && floatingRef.current) {
@@ -441,24 +441,31 @@ const TMFloatingMenuBar = ({ containerRef, contextMenuItems = [], isConstrained
441
441
  setState(s => ({ ...s, draggedItemIndex: null }));
442
442
  setDragOverIndex(null);
443
443
  };
444
- return (_jsxs(_Fragment, { children: [_jsx(S.Overlay, { "$visible": state.isConfigMode }), _jsxs(S.FloatingContainer, { ref: floatingRef, "$x": state.position.x, "$y": state.position.y, "$orientation": state.orientation, "$isDragging": state.isDragging, "$isConfigMode": state.isConfigMode, "$isConstrained": isConstrained, children: [_jsx(S.GripHandle, { "$orientation": state.orientation, onMouseDown: handleMouseDown, onDoubleClick: handleGripDoubleClick, children: _jsx(IconDraggableDots, {}) }), _jsx(S.Separator, { "$orientation": state.orientation }), state.items.map((item, index) => {
444
+ return (_jsxs(_Fragment, { children: [_jsx(S.Overlay, { "$visible": state.isConfigMode }), _jsxs(S.FloatingContainer, { ref: floatingRef, "$x": state.position.x, "$y": state.position.y, "$orientation": state.orientation, "$isDragging": state.isDragging, "$isConfigMode": state.isConfigMode, "$isConstrained": isConstrained, onContextMenu: (e) => e.preventDefault(), children: [!state.isConfigMode ? (_jsx(ContextMenu, { items: [
445
+ {
446
+ name: SDKUI_Localizator.Configure,
447
+ onClick: () => {
448
+ if (!state.isConfigMode) {
449
+ toggleConfigMode();
450
+ }
451
+ },
452
+ },
453
+ {
454
+ name: state.orientation === 'horizontal' ? 'Floating bar verticale' : 'Floating bar orizzontale',
455
+ onClick: toggleOrientation,
456
+ },
457
+ ], trigger: "right", children: _jsx(S.GripHandle, { "$orientation": state.orientation, onMouseDown: handleMouseDown, onDoubleClick: handleGripDoubleClick, children: _jsx(IconDraggableDots, {}) }) })) : (_jsx(S.GripHandle, { "$orientation": state.orientation, onMouseDown: handleMouseDown, onDoubleClick: handleGripDoubleClick, children: _jsx(IconDraggableDots, {}) })), _jsx(S.Separator, { "$orientation": state.orientation }), state.items.map((item, index) => {
445
458
  // Get current state (disabled and onClick) from contextMenuItems
446
459
  const currentState = getCurrentItemState(item.id);
447
460
  const isDisabled = currentState.disabled || false;
448
461
  const currentOnClick = currentState.onClick || item.onClick; // Fallback to stored onClick if not found
449
- return (_jsxs(S.DraggableItem, { "$isDragging": state.draggedItemIndex === index, "$isDragOver": dragOverIndex === index && state.draggedItemIndex !== index, draggable: state.isConfigMode, onDragStart: (e) => handleDragStart(e, index), onDragEnter: (e) => handleDragEnter(e, index), onDragOver: handleDragOver, onDragLeave: (e) => handleDragLeave(e, index), onDrop: (e) => handleDrop(e, index), onDragEnd: handleDragEnd, children: [state.isConfigMode ? (_jsx(S.MenuButton, { onClick: () => {
450
- if (state.isConfigMode || isDisabled)
451
- return;
452
- if (currentOnClick) {
453
- currentOnClick();
454
- }
455
- }, disabled: isDisabled && !state.isConfigMode, children: item.icon })) : (_jsx(TMTooltip, { content: item.name, position: "top", children: _jsx(S.MenuButton, { onClick: () => {
462
+ return (_jsxs(S.DraggableItem, { "$isDragging": state.draggedItemIndex === index, "$isDragOver": dragOverIndex === index && state.draggedItemIndex !== index, draggable: state.isConfigMode, onDragStart: (e) => handleDragStart(e, index), onDragEnter: (e) => handleDragEnter(e, index), onDragOver: handleDragOver, onDragLeave: (e) => handleDragLeave(e, index), onDrop: (e) => handleDrop(e, index), onDragEnd: handleDragEnd, children: [_jsx(TMTooltip, { content: item.name, position: "bottom", children: _jsx(S.MenuButton, { onClick: () => {
456
463
  if (state.isConfigMode || isDisabled)
457
464
  return;
458
465
  if (currentOnClick) {
459
466
  currentOnClick();
460
467
  }
461
- }, disabled: isDisabled, children: item.icon }) })), state.isConfigMode && (_jsx(S.RemoveButton, { onClick: () => removeItem(item.id), children: "\u00D7" }))] }, item.id));
462
- }), !state.isConfigMode && contextMenuItems.length > 0 && (_jsx(ContextMenu, { items: contextMenuItems, trigger: "left", children: _jsx(S.ContextMenuButton, { children: _jsx(IconMenuVertical, {}) }) })), state.isConfigMode && state.items.length < maxItems && contextMenuItems.length > 0 && (_jsx(ContextMenu, { items: getPinContextMenuItems(), trigger: "left", children: _jsx(TMTooltip, { content: SDKUI_Localizator.Add, children: _jsx(S.AddButton, { children: _jsx(IconAdd, {}) }) }) })), _jsx(S.Separator, { "$orientation": state.orientation }), _jsxs(S.ButtonGroup, { "$orientation": state.orientation, children: [state.isConfigMode && (_jsx(TMTooltip, { content: SDKUI_Localizator.Undo, position: state.orientation === 'horizontal' ? 'right' : 'top', children: _jsx(S.UndoButton, { onClick: handleUndo, disabled: !hasChanges(), children: _jsx(IconUndo, { fontSize: 18 }) }) })), state.isConfigMode ? (_jsx(TMTooltip, { content: state.items.length === 0 ? 'Devi aggiungere almeno un item' : SDKUI_Localizator.ApplyAndClose, position: state.orientation === 'horizontal' ? 'right' : 'top', children: _jsx(S.ApplyButton, { onClick: toggleConfigMode, disabled: state.items.length === 0, children: _jsx(IconApply, { fontSize: 20 }) }) })) : (_jsx(TMTooltip, { content: SDKUI_Localizator.Configure, position: state.orientation === 'horizontal' ? 'right' : 'top', children: _jsx(S.ConfigButton, { onClick: toggleConfigMode, children: _jsx(IconPencil, {}) }) }))] })] })] }));
468
+ }, disabled: state.isConfigMode ? isDisabled && !state.isConfigMode : isDisabled, children: item.icon }) }), state.isConfigMode && (_jsx(S.RemoveButton, { onClick: () => removeItem(item.id), children: "\u00D7" }))] }, item.id));
469
+ }), !state.isConfigMode && contextMenuItems.length > 0 && (_jsx(ContextMenu, { items: contextMenuItems, trigger: "left", children: _jsx(S.ContextMenuButton, { children: _jsx(IconMenuVertical, {}) }) })), state.isConfigMode && state.items.length < maxItems && contextMenuItems.length > 0 && (_jsx(ContextMenu, { items: getPinContextMenuItems(), trigger: "left", keepOpenOnClick: true, children: _jsx(TMTooltip, { content: SDKUI_Localizator.Add, children: _jsx(S.AddButton, { children: _jsx(IconAdd, {}) }) }) })), state.isConfigMode && (_jsxs(_Fragment, { children: [_jsx(S.Separator, { "$orientation": state.orientation }), _jsxs(S.ButtonGroup, { "$orientation": state.orientation, children: [_jsx(TMTooltip, { content: SDKUI_Localizator.Undo, position: state.orientation === 'horizontal' ? 'right' : 'top', children: _jsx(S.UndoButton, { onClick: handleUndo, disabled: !hasChanges(), children: _jsx(IconUndo, { fontSize: 18 }) }) }), _jsx(TMTooltip, { content: state.items.length === 0 ? 'Devi aggiungere almeno un item' : SDKUI_Localizator.ApplyAndClose, position: state.orientation === 'horizontal' ? 'right' : 'top', children: _jsx(S.ApplyButton, { onClick: toggleConfigMode, disabled: state.items.length === 0, children: _jsx(IconApply, { fontSize: 20 }) }) })] })] }))] })] }));
463
470
  };
464
471
  export default TMFloatingMenuBar;
@@ -127,7 +127,7 @@ export const MenuButton = styled.button `
127
127
 
128
128
  &:disabled {
129
129
  opacity: 0.5;
130
- cursor: not-allowed;
130
+ cursor: default;
131
131
  color: rgba(255, 255, 255, 0.6);
132
132
  }
133
133
 
@@ -196,7 +196,7 @@ export const ApplyButton = styled.button `
196
196
 
197
197
  &:disabled {
198
198
  opacity: 0.3;
199
- cursor: not-allowed;
199
+ cursor: default;
200
200
  }
201
201
 
202
202
  svg {
@@ -293,7 +293,7 @@ export const UndoButton = styled.button `
293
293
 
294
294
  &:disabled {
295
295
  opacity: 0.3;
296
- cursor: not-allowed;
296
+ cursor: default;
297
297
  }
298
298
 
299
299
  svg {
@@ -340,7 +340,7 @@ export const ContextMenuWrapper = styled.div `
340
340
  `;
341
341
  export const ButtonGroup = styled.div `
342
342
  display: flex;
343
- flex-direction: row;
343
+ flex-direction: ${props => props.$orientation === 'vertical' ? 'column' : 'row'};
344
344
  align-items: center;
345
345
  gap: 0;
346
346
  `;
@@ -600,7 +600,7 @@ const TMSearchResult = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, a
600
600
  _jsx(TMLayoutItem, { children: _jsx(TMSearchResultSelector, { searchResults: currentSearchResults, disableAccordionIfSingleCategory: disableAccordionIfSingleCategory, selectedTID: selectedSearchResultTID, selectedSearchResult: selectedSearchResult, autoSelectFirst: !isMobile || currentSearchResults.length === 1, onSelectionChanged: onSearchResultSelectionChanged }) })
601
601
  :
602
602
  _jsx(_Fragment, {}), _jsx(TMLayoutItem, { children: _jsxs("div", { ref: floatingBarContainerRef, style: { position: 'relative', height: '100%', width: '100%' }, 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), floatingMenuItems: floatingMenuItems, 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 &&
603
- _jsx(TMFloatingMenuBar, { containerRef: floatingBarContainerRef, contextMenuItems: floatingMenuItems, isConstrained: true, defaultPosition: { x: 10, y: window.innerHeight - 215 }, maxItems: 8 })] }) })] }), 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: () => {
603
+ _jsx(TMFloatingMenuBar, { containerRef: floatingBarContainerRef, contextMenuItems: floatingMenuItems, isConstrained: true, defaultPosition: { x: 10, y: window.innerHeight - 215 } })] }) })] }), 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: () => {
604
604
  setIsOpenBatchUpdate(false);
605
605
  }, onSavedCallbackAsync: async () => {
606
606
  setIsOpenBatchUpdate(false);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@topconsultnpm/sdkui-react",
3
- "version": "6.20.0-dev1.39",
3
+ "version": "6.20.0-dev1.40",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1",