@topconsultnpm/sdkui-react 6.20.0-dev1.56 → 6.20.0-dev1.58

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.
@@ -4,7 +4,7 @@ import { createPortal } from 'react-dom';
4
4
  import * as S from './styles';
5
5
  import { useIsMobile, useMenuPosition, useIsIOS } from './hooks';
6
6
  import { IconArrowLeft } from '../../../helper';
7
- const TMContextMenu = ({ items, trigger = 'right', children, externalControl, keepOpenOnClick = false }) => {
7
+ const TMContextMenu = ({ items, trigger = 'right', children, target, externalControl, keepOpenOnClick = false }) => {
8
8
  const [menuState, setMenuState] = useState({
9
9
  visible: false,
10
10
  position: { x: 0, y: 0 },
@@ -46,6 +46,108 @@ const TMContextMenu = ({ items, trigger = 'right', children, externalControl, ke
46
46
  }));
47
47
  }
48
48
  }, [externalControl, items]);
49
+ // iOS long-press support: attach touch listeners to target elements
50
+ // On long-press, dispatch synthetic contextmenu event to trigger existing handlers
51
+ useEffect(() => {
52
+ if (!target || !isIOS)
53
+ return;
54
+ const elements = document.querySelectorAll(target);
55
+ if (elements.length === 0)
56
+ return;
57
+ const touchStateMap = new WeakMap();
58
+ const handleTouchStart = (e) => {
59
+ const touchEvent = e;
60
+ const element = e.currentTarget;
61
+ const touch = touchEvent.touches[0];
62
+ let state = touchStateMap.get(element);
63
+ if (!state) {
64
+ state = { timeout: null, startX: 0, startY: 0, longPressTriggered: false };
65
+ touchStateMap.set(element, state);
66
+ }
67
+ state.startX = touch.clientX;
68
+ state.startY = touch.clientY;
69
+ state.longPressTriggered = false;
70
+ if (state.timeout)
71
+ clearTimeout(state.timeout);
72
+ state.timeout = setTimeout(() => {
73
+ // Mark that long-press was triggered
74
+ if (state)
75
+ state.longPressTriggered = true;
76
+ // Haptic feedback
77
+ if ('vibrate' in navigator)
78
+ navigator.vibrate(50);
79
+ // Dispatch synthetic contextmenu event to trigger existing onContextMenu handlers
80
+ const syntheticEvent = new MouseEvent('contextmenu', {
81
+ bubbles: true,
82
+ cancelable: true,
83
+ clientX: touch.clientX,
84
+ clientY: touch.clientY,
85
+ });
86
+ element.dispatchEvent(syntheticEvent);
87
+ if (state)
88
+ state.timeout = null;
89
+ }, 500);
90
+ };
91
+ const handleTouchMove = (e) => {
92
+ const touchEvent = e;
93
+ const element = e.currentTarget;
94
+ const state = touchStateMap.get(element);
95
+ if (!state?.timeout)
96
+ return;
97
+ const touch = touchEvent.touches[0];
98
+ const dx = Math.abs(touch.clientX - state.startX);
99
+ const dy = Math.abs(touch.clientY - state.startY);
100
+ if (dx > 10 || dy > 10) {
101
+ clearTimeout(state.timeout);
102
+ state.timeout = null;
103
+ }
104
+ };
105
+ const handleTouchEnd = (e) => {
106
+ const element = e.currentTarget;
107
+ const state = touchStateMap.get(element);
108
+ if (state?.timeout) {
109
+ clearTimeout(state.timeout);
110
+ state.timeout = null;
111
+ }
112
+ };
113
+ // Prevent click event after long-press was triggered
114
+ const handleClick = (e) => {
115
+ const element = e.currentTarget;
116
+ const state = touchStateMap.get(element);
117
+ if (state?.longPressTriggered) {
118
+ e.preventDefault();
119
+ e.stopPropagation();
120
+ e.stopImmediatePropagation();
121
+ state.longPressTriggered = false; // Reset for next interaction
122
+ }
123
+ };
124
+ // Attach listeners to all matching elements
125
+ elements.forEach(element => {
126
+ const el = element;
127
+ // Prevent iOS native callout
128
+ const style = el.style;
129
+ style.webkitTouchCallout = 'none';
130
+ style.webkitUserSelect = 'none';
131
+ el.addEventListener('touchstart', handleTouchStart, { passive: true });
132
+ el.addEventListener('touchmove', handleTouchMove, { passive: true });
133
+ el.addEventListener('touchend', handleTouchEnd);
134
+ el.addEventListener('touchcancel', handleTouchEnd);
135
+ el.addEventListener('click', handleClick, { capture: true });
136
+ });
137
+ return () => {
138
+ elements.forEach(element => {
139
+ const el = element;
140
+ const style = el.style;
141
+ style.webkitTouchCallout = '';
142
+ style.webkitUserSelect = '';
143
+ el.removeEventListener('touchstart', handleTouchStart);
144
+ el.removeEventListener('touchmove', handleTouchMove);
145
+ el.removeEventListener('touchend', handleTouchEnd);
146
+ el.removeEventListener('touchcancel', handleTouchEnd);
147
+ el.removeEventListener('click', handleClick, { capture: true });
148
+ });
149
+ };
150
+ }, [target, isIOS]);
49
151
  // Update items when they change while menu is visible (for keepOpenOnClick behavior)
50
152
  useEffect(() => {
51
153
  if (!keepOpenOnClick)
@@ -284,6 +386,7 @@ const TMContextMenu = ({ items, trigger = 'right', children, externalControl, ke
284
386
  e.stopPropagation();
285
387
  // if (item.disabled) return;
286
388
  item.onRightIconClick?.();
389
+ handleClose();
287
390
  };
288
391
  return (_jsxs(S.MenuItem, { "$disabled": item.disabled, "$hasSubmenu": !!item.submenu && item.submenu.length > 0, "$beginGroup": item.beginGroup, onMouseDown: handleClick, onMouseEnter: (e) => !isMobile && handleMouseEnter(item, e, depth + 1), onMouseLeave: () => !isMobile && handleMouseLeave(depth + 1), title: item.tooltip, children: [_jsxs(S.MenuItemContent, { children: [item.icon && _jsx(S.IconWrapper, { children: item.icon }), _jsx(S.MenuItemName, { children: item.name })] }), item.rightIcon && item.onRightIconClick && (_jsx(S.RightIconButton, { onClick: handleRightIconClick, onMouseDown: (e) => e.stopPropagation(), "aria-label": `Action for ${item.name}`, children: item.rightIcon })), item.submenu && item.submenu.length > 0 && (_jsx(S.SubmenuIndicator, { "$isMobile": isMobile, children: isMobile ? '›' : '▸' }))] }, itemKey));
289
392
  });
@@ -16,6 +16,7 @@ export interface TMContextMenuProps {
16
16
  items: TMContextMenuItemProps[];
17
17
  trigger?: 'right' | 'left';
18
18
  children?: React.ReactNode;
19
+ target?: string;
19
20
  externalControl?: {
20
21
  visible: boolean;
21
22
  position: {
@@ -4,7 +4,8 @@ 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, IconPin, IconUndo, SDKUI_Globals, SDKUI_Localizator } from '../../../helper';
7
+ import { IconAdd, IconApply, IconMenuVertical, IconPin, IconSeparator, IconUndo, SDKUI_Globals, SDKUI_Localizator } from '../../../helper';
8
+ const Separator = (props) => (_jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", height: "1em", width: "1em", ...props, children: _jsx("path", { d: "M12 2v20", stroke: "currentColor", strokeWidth: "3", strokeLinecap: "round" }) }));
8
9
  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
10
  const TMFloatingMenuBar = ({ containerRef, contextMenuItems = [], isConstrained = false, defaultPosition = { x: 100, y: 100 }, maxItems = 100, }) => {
10
11
  const percentToPixels = (percent, containerSize) => {
@@ -77,7 +78,10 @@ const TMFloatingMenuBar = ({ containerRef, contextMenuItems = [], isConstrained
77
78
  const validItemIds = Array.isArray(settings.itemIds) ? settings.itemIds : [];
78
79
  if (validItemIds.length > 0) {
79
80
  // Check if any ID looks like the old format (contains language-specific text or is too long)
80
- const hasOldFormatIds = validItemIds.some(id => typeof id === 'string' && (id.length > 20 || id.includes(' ')));
81
+ // Exclude separator IDs from this check as they have longer IDs by design
82
+ const hasOldFormatIds = validItemIds.some(id => typeof id === 'string' &&
83
+ !id.startsWith('separator-') &&
84
+ (id.length > 20 || id.includes(' ')));
81
85
  if (hasOldFormatIds) {
82
86
  console.warn('FloatingMenuBar: Detected old name-based configuration, resetting to defaults');
83
87
  resetFloatingBarSettings();
@@ -193,11 +197,24 @@ const TMFloatingMenuBar = ({ containerRef, contextMenuItems = [], isConstrained
193
197
  }, [state.items]);
194
198
  // Restore items on mount from savedItemIds
195
199
  useEffect(() => {
196
- if (contextMenuItems.length > 0) {
200
+ if (contextMenuItems.length > 0 || initialConfig.savedItemIds.length > 0) {
197
201
  const flatItems = flattenMenuItems(contextMenuItems);
198
202
  // Restore items in the saved order from localStorage
199
203
  const restoredItems = initialConfig.savedItemIds
200
- .map((id) => flatItems.find(item => item.id === id))
204
+ .map((id) => {
205
+ // Check if it's a separator
206
+ if (id.startsWith('separator-')) {
207
+ return {
208
+ id,
209
+ name: 'Separator',
210
+ icon: _jsx(Separator, {}),
211
+ onClick: () => { },
212
+ isSeparator: true,
213
+ };
214
+ }
215
+ // Otherwise look for it in flat items
216
+ return flatItems.find(item => item.id === id);
217
+ })
201
218
  .filter((item) => item !== undefined);
202
219
  if (restoredItems.length > 0) {
203
220
  setState(s => ({ ...s, items: restoredItems }));
@@ -250,6 +267,39 @@ const TMFloatingMenuBar = ({ containerRef, contextMenuItems = [], isConstrained
250
267
  onClick: foundItem?.onClick
251
268
  };
252
269
  }, [contextMenuItems]);
270
+ // Remove trailing separators from items array
271
+ const removeTrailingSeparators = useCallback((items) => {
272
+ const result = [...items];
273
+ while (result.length > 0 && result.at(-1)?.isSeparator) {
274
+ result.pop();
275
+ }
276
+ return result;
277
+ }, []);
278
+ // Create a new separator item
279
+ const createSeparator = useCallback(() => {
280
+ const separatorId = `separator-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
281
+ return {
282
+ id: separatorId,
283
+ name: 'Separator',
284
+ icon: _jsx(Separator, {}),
285
+ onClick: () => { },
286
+ isSeparator: true,
287
+ };
288
+ }, []);
289
+ // Add separator to items
290
+ const addSeparator = useCallback(() => {
291
+ if (state.items.length >= maxItems) {
292
+ ShowAlert({
293
+ mode: 'warning',
294
+ title: 'Limite Massimo Raggiunto',
295
+ message: `Hai raggiunto il massimo di ${maxItems} elementi. Rimuovine uno prima di aggiungerne altri.`,
296
+ duration: 4000,
297
+ });
298
+ return;
299
+ }
300
+ const separator = createSeparator();
301
+ setState(s => ({ ...s, items: [...s.items, separator] }));
302
+ }, [state.items.length, maxItems, createSeparator]);
253
303
  const getPinContextMenuItems = useCallback(() => {
254
304
  const flatItems = flattenMenuItems(contextMenuItems);
255
305
  const currentItemIds = new Set(state.items.map(i => i.id));
@@ -273,8 +323,17 @@ const TMFloatingMenuBar = ({ containerRef, contextMenuItems = [], isConstrained
273
323
  return pinItem;
274
324
  });
275
325
  };
276
- return createPinItems(contextMenuItems);
277
- }, [contextMenuItems, flattenMenuItems, togglePin, state.items]);
326
+ const pinItems = createPinItems(contextMenuItems);
327
+ // Add separator option at the end
328
+ pinItems.push({
329
+ id: 'add-separator',
330
+ name: SDKUI_Localizator.Add + ' separatore',
331
+ icon: _jsx(IconSeparator, {}),
332
+ onClick: addSeparator,
333
+ beginGroup: true
334
+ });
335
+ return pinItems;
336
+ }, [contextMenuItems, flattenMenuItems, togglePin, state.items, addSeparator]);
278
337
  const getContextMenuItemsWithPinIcons = useCallback(() => {
279
338
  const flatItems = flattenMenuItems(contextMenuItems);
280
339
  const currentItemIds = new Set(state.items.map(i => i.id));
@@ -470,9 +529,10 @@ const TMFloatingMenuBar = ({ containerRef, contextMenuItems = [], isConstrained
470
529
  return { ...s, isConfigMode: true };
471
530
  }
472
531
  else {
473
- // Exiting edit mode (applying changes) - clear snapshot
532
+ // Exiting edit mode (applying changes) - clean up trailing separators and clear snapshot
474
533
  stateSnapshot.current = null;
475
- return { ...s, isConfigMode: false };
534
+ const cleanedItems = removeTrailingSeparators(s.items);
535
+ return { ...s, isConfigMode: false, items: cleanedItems };
476
536
  }
477
537
  });
478
538
  };
@@ -480,54 +540,52 @@ const TMFloatingMenuBar = ({ containerRef, contextMenuItems = [], isConstrained
480
540
  useEffect(() => {
481
541
  if (!state.isConfigMode || !floatingRef.current)
482
542
  return;
543
+ // Use double requestAnimationFrame to ensure the DOM has fully updated with new buttons
483
544
  requestAnimationFrame(() => {
484
- if (!floatingRef.current)
485
- return;
486
- const floating = floatingRef.current.getBoundingClientRect();
487
- let newX = state.position.x;
488
- let newY = state.position.y;
489
- let needsUpdate = false;
490
- if (isConstrained && containerRef.current) {
491
- const container = containerRef.current.getBoundingClientRect();
492
- if (state.orientation === 'horizontal') {
493
- if (state.position.x + floating.width > container.width) {
494
- newX = Math.max(0, container.width - floating.width);
495
- needsUpdate = true;
496
- }
545
+ requestAnimationFrame(() => {
546
+ if (!floatingRef.current)
547
+ return;
548
+ const floating = floatingRef.current.getBoundingClientRect();
549
+ const containerWidth = isConstrained && containerRef.current
550
+ ? containerRef.current.getBoundingClientRect().width
551
+ : window.innerWidth;
552
+ const containerHeight = isConstrained && containerRef.current
553
+ ? containerRef.current.getBoundingClientRect().height
554
+ : window.innerHeight;
555
+ // Use current pixel position
556
+ let newPixelX = pixelPosition.x;
557
+ let newPixelY = pixelPosition.y;
558
+ let needsUpdate = false;
559
+ // Check horizontal overflow
560
+ if (newPixelX + floating.width > containerWidth) {
561
+ newPixelX = Math.max(0, containerWidth - floating.width);
562
+ needsUpdate = true;
497
563
  }
498
- else {
499
- if (state.position.y + floating.height > container.height) {
500
- newY = Math.max(0, container.height - floating.height);
501
- needsUpdate = true;
502
- }
564
+ // Check vertical overflow
565
+ if (newPixelY + floating.height > containerHeight) {
566
+ newPixelY = Math.max(0, containerHeight - floating.height);
567
+ needsUpdate = true;
503
568
  }
504
- }
505
- else {
506
- if (state.orientation === 'horizontal') {
507
- if (state.position.x + floating.width > window.innerWidth) {
508
- newX = Math.max(0, window.innerWidth - floating.width - 10);
509
- needsUpdate = true;
569
+ if (needsUpdate) {
570
+ // Update pixel position immediately
571
+ setPixelPosition({ x: newPixelX, y: newPixelY });
572
+ // Convert to percentage for state
573
+ const newPercentagePosition = {
574
+ x: pixelsToPercent(newPixelX, containerWidth),
575
+ y: pixelsToPercent(newPixelY, containerHeight),
576
+ };
577
+ setState(s => ({
578
+ ...s,
579
+ position: newPercentagePosition,
580
+ }));
581
+ // Update snapshot position to the corrected position so Undo restores to visible position
582
+ if (stateSnapshot.current) {
583
+ stateSnapshot.current.position = newPercentagePosition;
510
584
  }
511
585
  }
512
- else {
513
- if (state.position.y + floating.height > window.innerHeight) {
514
- newY = Math.max(0, window.innerHeight - floating.height - 10);
515
- needsUpdate = true;
516
- }
517
- }
518
- }
519
- if (needsUpdate) {
520
- setState(s => ({
521
- ...s,
522
- position: { x: newX, y: newY },
523
- }));
524
- // Update snapshot position to the corrected position so Undo restores to visible position
525
- if (stateSnapshot.current) {
526
- stateSnapshot.current.position = { x: newX, y: newY };
527
- }
528
- }
586
+ });
529
587
  });
530
- }, [state.isConfigMode, state.orientation, isConstrained]);
588
+ }, [state.isConfigMode, state.orientation, isConstrained, state.items, pixelPosition.x, pixelPosition.y]);
531
589
  const handleUndo = () => {
532
590
  if (stateSnapshot.current) {
533
591
  setState(s => ({
@@ -670,6 +728,10 @@ const TMFloatingMenuBar = ({ containerRef, contextMenuItems = [], isConstrained
670
728
  onClick: toggleOrientation,
671
729
  },
672
730
  ], trigger: "right", children: _jsx(S.GripHandle, { "$orientation": state.orientation, onMouseDown: handleMouseDown, onTouchStart: handleTouchStart, onDoubleClick: handleGripDoubleClick, children: _jsx(IconDraggableDots, {}) }) })) : (_jsx(S.GripHandle, { "$orientation": state.orientation, onMouseDown: handleMouseDown, onTouchStart: handleTouchStart, onDoubleClick: handleGripDoubleClick, children: _jsx(IconDraggableDots, {}) })), _jsx(S.Separator, { "$orientation": state.orientation }), state.items.map((item, index) => {
731
+ // Handle separator items
732
+ if (item.isSeparator) {
733
+ 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(S.ItemSeparator, { "$orientation": state.orientation, "$isConfigMode": state.isConfigMode }), state.isConfigMode && (_jsx(S.RemoveButton, { onClick: () => removeItem(item.id), children: "\u00D7" }))] }, item.id));
734
+ }
673
735
  // Get current state (disabled and onClick) from contextMenuItems
674
736
  const currentState = getCurrentItemState(item.id);
675
737
  const isDisabled = currentState.disabled || false;
@@ -24,6 +24,10 @@ export declare const GripHandle: import("styled-components/dist/types").IStyledC
24
24
  export declare const Separator: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {
25
25
  $orientation: "horizontal" | "vertical";
26
26
  }>> & string;
27
+ export declare const ItemSeparator: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {
28
+ $orientation: "horizontal" | "vertical";
29
+ $isConfigMode: boolean;
30
+ }>> & string;
27
31
  export declare const MenuButton: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, {
28
32
  $isActive?: boolean;
29
33
  }>> & string;
@@ -102,6 +102,45 @@ export const Separator = styled.div `
102
102
  margin: ${props => props.$orientation === 'horizontal' ? '0 4px' : '4px 0'};
103
103
  flex-shrink: 0;
104
104
  `;
105
+ export const ItemSeparator = styled.div `
106
+ flex-shrink: 0;
107
+ transition: all 0.2s ease;
108
+
109
+ ${props => props.$isConfigMode ? `
110
+ /* Edit mode: look exactly like MenuButton */
111
+ display: flex;
112
+ align-items: center;
113
+ justify-content: center;
114
+ width: 34px;
115
+ height: 34px;
116
+ background: transparent;
117
+ border-radius: 8px;
118
+ cursor: grab;
119
+ position: relative;
120
+
121
+ &::before {
122
+ content: '';
123
+ background: rgba(255, 255, 255, 0.25);
124
+ width: ${props.$orientation === 'horizontal' ? '2px' : '100%'};
125
+ height: ${props.$orientation === 'horizontal' ? '20px' : '2px'};
126
+ border-radius: 1px;
127
+ }
128
+
129
+ &:hover {
130
+ background: rgba(255, 255, 255, 0.2);
131
+ }
132
+
133
+ &:active {
134
+ opacity: 0.8;
135
+ }
136
+ ` : `
137
+ /* Normal mode: simple line with tight spacing */
138
+ background: rgba(255, 255, 255, 0.25);
139
+ width: ${props.$orientation === 'horizontal' ? '1px' : '100%'};
140
+ height: ${props.$orientation === 'horizontal' ? '24px' : '1px'};
141
+ margin: ${props.$orientation === 'horizontal' ? '0 2px' : '2px 0'};
142
+ `}
143
+ `;
105
144
  export const MenuButton = styled.button `
106
145
  display: flex;
107
146
  align-items: center;
@@ -6,6 +6,7 @@ export interface TMFloatingMenuItem {
6
6
  onClick: () => void;
7
7
  disabled?: boolean;
8
8
  isPinned?: boolean;
9
+ isSeparator?: boolean;
9
10
  }
10
11
  export interface TMFloatingMenuBarProps {
11
12
  containerRef: React.RefObject<HTMLElement | null>;
@@ -320,7 +320,7 @@ const TMDataGrid = React.forwardRef((props, ref) => {
320
320
  // other properties
321
321
  disabled: disabled, autoNavigateToFocusedRow: autoNavigateToFocusedRow, focusedRowKey: focusedRowKey, columnHidingEnabled: columnHidingEnabled, columnResizingMode: columnResizingMode, columnAutoWidth: columnAutoWidth, allowColumnResizing: allowColumnResizing, allowColumnReordering: allowColumnReordering, showBorders: showBorders, showRowLines: showRowLines, showColumnLines: showColumnLines, showColumnHeaders: showColumnHeaders, rowAlternationEnabled: rowAlternationEnabled, wordWrapEnabled: wordWrapEnabled, noDataText: noDataText,
322
322
  // styles
323
- width: width, height: height, style: { userSelect: 'none' }, children: [dataColumns.map((column, index) => (_jsx(Column, { ...column }, column.caption + index.toString()))), sorting && _jsx(Sorting, { ...sorting }), selection && _jsx(Selection, { ...selection }), scrolling && _jsx(Scrolling, { ...scrolling }), summary && _jsx(Summary, { ...summary }), showHeaderFilter && _jsx(HeaderFilter, { visible: true, ...headerFilter }), rowDragging && _jsx(RowDragging, { ...rowDragging }), filterRow && _jsx(FilterRow, { ...filterRow }), showFilterPanel && _jsx(FilterPanel, { visible: true }), showHeaderColumnChooser && _jsxs(ColumnChooser, { height: "400px", enabled: !showHeaderColumnChooser, mode: "select", children: [_jsx(Position, { my: "center", at: "center", of: window }), _jsx(ColumnChooserSearch, { enabled: true }), _jsx(ColumnChooserSelection, { allowSelectAll: false, selectByClick: true, recursive: true })] }), stateStoring && _jsx(StateStoring, { ...stateStoring }), groupPanel && _jsx(GroupPanel, { ...groupPanel }), _jsx(Grouping, { contextMenuEnabled: true, ...grouping }), _jsx(LoadPanel, { enabled: showLoadPanel }), _jsx(SearchPanel, { visible: showSearchPanel, searchVisibleColumnsOnly: true, highlightSearchText: true }), editing && _jsx(Editing, { ...editing }), paging && _jsx(Paging, { ...paging }), pager && _jsx(Pager, { ...pager, visible: totalRecordCount > pageSize }), masterDetail && _jsx(MasterDetail, { ...masterDetail })] }) }), counterConfig.show && _jsx("div", { style: { width: "100%", height: "25px", display: "flex", alignItems: "center", gap: "15px", backgroundColor: "#e0e0e0" }, children: _jsx(TMCounterContainer, { items: counterValues, bgColorContainer: counterConfig.bgColorContainer, bgColorItem: counterConfig.bgColorItem, hoverColorItem: counterConfig.hoverColorItem, textColorItem: counterConfig.textColorItem }) }), customContextMenuItems && (_jsx(TMContextMenu, { items: processCustomContextMenuItems(customContextMenuItems, customContextMenuRowKey), externalControl: {
323
+ width: width, height: height, style: { userSelect: 'none' }, children: [dataColumns.map((column, index) => (_jsx(Column, { ...column }, column.caption + index.toString()))), sorting && _jsx(Sorting, { ...sorting }), selection && _jsx(Selection, { ...selection }), scrolling && _jsx(Scrolling, { ...scrolling }), summary && _jsx(Summary, { ...summary }), showHeaderFilter && _jsx(HeaderFilter, { visible: true, ...headerFilter }), rowDragging && _jsx(RowDragging, { ...rowDragging }), filterRow && _jsx(FilterRow, { ...filterRow }), showFilterPanel && _jsx(FilterPanel, { visible: true }), showHeaderColumnChooser && _jsxs(ColumnChooser, { height: "400px", enabled: !showHeaderColumnChooser, mode: "select", children: [_jsx(Position, { my: "center", at: "center", of: window }), _jsx(ColumnChooserSearch, { enabled: true }), _jsx(ColumnChooserSelection, { allowSelectAll: false, selectByClick: true, recursive: true })] }), stateStoring && _jsx(StateStoring, { ...stateStoring }), groupPanel && _jsx(GroupPanel, { ...groupPanel }), _jsx(Grouping, { contextMenuEnabled: true, ...grouping }), _jsx(LoadPanel, { enabled: showLoadPanel }), _jsx(SearchPanel, { visible: showSearchPanel, searchVisibleColumnsOnly: true, highlightSearchText: true }), editing && _jsx(Editing, { ...editing }), paging && _jsx(Paging, { ...paging }), pager && _jsx(Pager, { ...pager, visible: totalRecordCount > pageSize }), masterDetail && _jsx(MasterDetail, { ...masterDetail })] }) }), counterConfig.show && _jsx("div", { style: { width: "100%", height: "25px", display: "flex", alignItems: "center", gap: "15px", backgroundColor: "#e0e0e0" }, children: _jsx(TMCounterContainer, { items: counterValues, bgColorContainer: counterConfig.bgColorContainer, bgColorItem: counterConfig.bgColorItem, hoverColorItem: counterConfig.hoverColorItem, textColorItem: counterConfig.textColorItem }) }), customContextMenuItems && (_jsx(TMContextMenu, { target: ".dx-data-row", items: processCustomContextMenuItems(customContextMenuItems, customContextMenuRowKey), externalControl: {
324
324
  visible: customContextMenuVisible,
325
325
  position: customContextMenuPosition,
326
326
  onClose: () => setCustomContextMenuVisible(false)
@@ -145,8 +145,8 @@ export const TMFileViewer = ({ fileBlob, isResizingActive }) => {
145
145
  setFormattedXml(undefined);
146
146
  const fileName = fileBlob.name || '';
147
147
  const fileExtension = fileName.split('.').pop()?.toLowerCase() || '';
148
- const isConfigFile = ['config', 'cfg'].includes(fileExtension);
149
- if (fileBlob.type.includes("xml") && !isConfigFile) {
148
+ const isTextBasedFile = ['config', 'cfg', 'sql'].includes(fileExtension);
149
+ if (fileBlob.type.includes("xml") && !isTextBasedFile) {
150
150
  fileBlob.text().then((text) => {
151
151
  const parser = new DOMParser();
152
152
  const xmlDoc = parser.parseFromString(text, "application/xml");
@@ -165,7 +165,7 @@ export const TMFileViewer = ({ fileBlob, isResizingActive }) => {
165
165
  });
166
166
  setBlobUrl(undefined);
167
167
  }
168
- else if (isConfigFile) {
168
+ else if (isTextBasedFile) {
169
169
  fileBlob.text().then((text) => {
170
170
  const escapedText = text
171
171
  .replace(/&/g, "&amp;")
@@ -180,7 +180,7 @@ const TMSavedQuerySelector = React.memo(({ items, selectedId, allowShowSearch =
180
180
  overflow: 'auto'
181
181
  }, children: dataSource.slice(0, showAllRoot || searchText.length > 0 ? dataSource.length : initialSQDsMaxItems).filter(o => searchText.length <= 0 || (searchText.length > 0 && o.name?.toLocaleLowerCase().includes(searchText.toLocaleLowerCase())) || o.description?.toLocaleLowerCase().includes(searchText.toLocaleLowerCase())).map((sqd, index) => {
182
182
  const isCurrent = selectedItem?.id == sqd.id;
183
- return (_jsx(StyledSqdItem, { "$isMobile": isMobile, onClick: () => {
183
+ return (_jsx(StyledSqdItem, { id: `sqd-item-${sqd.id}`, "$isMobile": isMobile, onClick: () => {
184
184
  setSelectedItem(sqd);
185
185
  onItemClick?.(sqd);
186
186
  }, onContextMenu: (e) => {
@@ -222,10 +222,10 @@ const TMSavedQuerySelector = React.memo(({ items, selectedId, allowShowSearch =
222
222
  visibility: isCurrent ? 'visible' : 'hidden'
223
223
  }, children: _jsx(IconApply, { fontSize: 24, color: 'green' }) })] }) }, sqd.id));
224
224
  }) }), dataSource.length > initialSQDsMaxItems && searchText.length <= 0 &&
225
- _jsx("div", { style: { display: 'flex', justifyContent: 'flex-end', padding: '10px', position: 'relative' }, children: _jsx(TMShowAllOrMaxItemsButton, { showAll: showAllRoot, dataSourceLength: dataSource.length, onClick: () => { setShowAllRoot(!showAllRoot); } }) }), contextMenuState.sqd && (_jsx(TMContextMenu, { items: getContextMenuItems(contextMenuState.sqd, manageDefault, isMobile, deleteSQDAsync, setDefaultSQDAsync, favManageSQDAsync, setInfoSQD), externalControl: {
225
+ _jsx("div", { style: { display: 'flex', justifyContent: 'flex-end', padding: '10px', position: 'relative' }, children: _jsx(TMShowAllOrMaxItemsButton, { showAll: showAllRoot, dataSourceLength: dataSource.length, onClick: () => { setShowAllRoot(!showAllRoot); } }) }), _jsx(TMContextMenu, { target: "[id^='sqd-item-']", items: contextMenuState.sqd ? getContextMenuItems(contextMenuState.sqd, manageDefault, isMobile, deleteSQDAsync, setDefaultSQDAsync, favManageSQDAsync, setInfoSQD) : [], externalControl: {
226
226
  visible: contextMenuState.visible,
227
227
  position: contextMenuState.position,
228
228
  onClose: () => setContextMenuState(prev => ({ ...prev, visible: false, sqd: null }))
229
- } })), _jsxs(StyledOffCanvasPanel, { ref: panelRef, "$isOpen": isMobile && infoSQD !== undefined, children: [_jsxs(StyledDivHorizontal, { style: { gap: 10, padding: '10px 8px', width: '100%', alignItems: 'center' }, children: [_jsx("p", { style: { fontSize: '1.1rem', fontWeight: 'bold' }, children: `${SDK_Localizator.SavedQuery} - ${SDKUI_Localizator.About}` }), _jsx(IconCloseOutline, { style: { marginLeft: 'auto', cursor: 'pointer' }, onClick: () => setInfoSQD(undefined) })] }), getTooltipBySqd(infoSQD)] })] }));
229
+ } }), _jsxs(StyledOffCanvasPanel, { ref: panelRef, "$isOpen": isMobile && infoSQD !== undefined, children: [_jsxs(StyledDivHorizontal, { style: { gap: 10, padding: '10px 8px', width: '100%', alignItems: 'center' }, children: [_jsx("p", { style: { fontSize: '1.1rem', fontWeight: 'bold' }, children: `${SDK_Localizator.SavedQuery} - ${SDKUI_Localizator.About}` }), _jsx(IconCloseOutline, { style: { marginLeft: 'auto', cursor: 'pointer' }, onClick: () => setInfoSQD(undefined) })] }), getTooltipBySqd(infoSQD)] })] }));
230
230
  });
231
231
  export default TMSavedQuerySelector;
@@ -92,7 +92,25 @@ const TMSignatureInfoContent = (props) => {
92
92
  if (!signerInfo) {
93
93
  return null;
94
94
  }
95
- return (_jsxs("div", { style: { lineHeight: "1.5em", overflowY: "auto", maxHeight: "500px", paddingRight: "8px", boxSizing: "border-box", userSelect: 'text' }, children: [signerInfo.shA256 && (_jsxs("div", { style: {
95
+ return (_jsxs("div", { style: { lineHeight: "1.5em", overflowY: "auto", maxHeight: "500px", paddingRight: "8px", boxSizing: "border-box", userSelect: 'text' }, children: [signerInfo.signers && signerInfo.signers.length > 0 ? (_jsxs("div", { children: [_jsxs("h4", { style: { margin: '0 0 12px 0', color: '#0078d4', fontSize: '16px' }, children: ["Firme digitali (", signerInfo.signers.length, ")"] }), signerInfo.signers.map((signer, idx) => (_jsxs("div", { style: {
96
+ border: "1px solid #d0d0d0",
97
+ borderRadius: "8px",
98
+ padding: "16px",
99
+ marginBottom: "12px",
100
+ background: "linear-gradient(135deg, #ffffff 0%, #f9f9f9 100%)",
101
+ boxShadow: "0 2px 4px rgba(0,0,0,0.08)",
102
+ userSelect: 'text',
103
+ }, children: [_jsxs("h3", { style: { margin: "0 0 12px", color: "#0078d4", fontSize: '15px', fontWeight: '600' }, children: ["Firma ", signer.levelAndIndex] }), _jsxs("div", { style: {
104
+ display: 'grid',
105
+ gap: '10px',
106
+ fontSize: '13px'
107
+ }, children: [_jsxs("div", { children: [_jsx("strong", { style: { color: '#555' }, children: "Intestatario:" }), _jsx("div", { style: { marginTop: '4px', color: '#333' }, children: signer.info1 ?? '-' })] }), _jsxs("div", { children: [_jsx("strong", { style: { color: '#555' }, children: "Riferimento temporale:" }), _jsx("div", { style: { marginTop: '4px', color: '#333' }, children: signer.info2 ?? '-' })] }), _jsxs("div", { children: [_jsx("strong", { style: { color: '#555' }, children: "Dettagli:" }), _jsx("div", { style: { marginTop: '4px', color: '#333' }, children: signer.info3 ?? '-' })] })] })] }, idx)))] })) : (_jsx("div", { style: {
108
+ padding: '20px',
109
+ textAlign: 'center',
110
+ color: '#666',
111
+ background: '#f5f5f5',
112
+ borderRadius: '8px'
113
+ }, children: "Nessuna firma trovata" })), signerInfo.shA256 && (_jsxs("div", { style: {
96
114
  marginBottom: '12px',
97
115
  padding: '16px',
98
116
  background: '#f5f5f5',
@@ -117,24 +135,6 @@ const TMSignatureInfoContent = (props) => {
117
135
  gap: '4px',
118
136
  transition: 'all 0.2s ease',
119
137
  color: copiedHash ? '#155724' : '#666'
120
- }, title: "Copia", children: [_jsx(IconCopy, { width: 16, height: 16 }), copiedHash && _jsx("span", { style: { fontSize: '11px' }, children: "Copiato" })] })] }), _jsx("div", { style: { color: '#333' }, children: getHashValue() })] })] })), signerInfo.signers && signerInfo.signers.length > 0 ? (_jsxs("div", { children: [_jsxs("h4", { style: { margin: '0 0 12px 0', color: '#0078d4', fontSize: '16px' }, children: ["Firme digitali (", signerInfo.signers.length, ")"] }), signerInfo.signers.map((signer, idx) => (_jsxs("div", { style: {
121
- border: "1px solid #d0d0d0",
122
- borderRadius: "8px",
123
- padding: "16px",
124
- marginBottom: "12px",
125
- background: "linear-gradient(135deg, #ffffff 0%, #f9f9f9 100%)",
126
- boxShadow: "0 2px 4px rgba(0,0,0,0.08)",
127
- userSelect: 'text',
128
- }, children: [_jsxs("h3", { style: { margin: "0 0 12px", color: "#0078d4", fontSize: '15px', fontWeight: '600' }, children: ["Firma ", signer.levelAndIndex] }), _jsxs("div", { style: {
129
- display: 'grid',
130
- gap: '10px',
131
- fontSize: '13px'
132
- }, children: [_jsxs("div", { children: [_jsx("strong", { style: { color: '#555' }, children: "Intestatario:" }), _jsx("div", { style: { marginTop: '4px', color: '#333' }, children: signer.info1 ?? '-' })] }), _jsxs("div", { children: [_jsx("strong", { style: { color: '#555' }, children: "Riferimento temporale:" }), _jsx("div", { style: { marginTop: '4px', color: '#333' }, children: signer.info2 ?? '-' })] }), _jsxs("div", { children: [_jsx("strong", { style: { color: '#555' }, children: "Dettagli:" }), _jsx("div", { style: { marginTop: '4px', color: '#333' }, children: signer.info3 ?? '-' })] })] })] }, idx)))] })) : (_jsx("div", { style: {
133
- padding: '20px',
134
- textAlign: 'center',
135
- color: '#666',
136
- background: '#f5f5f5',
137
- borderRadius: '8px'
138
- }, children: "Nessuna firma trovata" }))] }));
138
+ }, title: "Copia", children: [_jsx(IconCopy, { width: 16, height: 16 }), copiedHash && _jsx("span", { style: { fontSize: '11px' }, children: "Copiato" })] })] }), _jsx("div", { style: { color: '#333' }, children: getHashValue() })] })] }))] }));
139
139
  };
140
140
  export default TMSignatureInfoContent;
@@ -276,4 +276,5 @@ export declare function IconCtrlWorkflow(props: React.SVGProps<SVGSVGElement>):
276
276
  export declare function IconBackhandIndexPointingRight(props: Readonly<React.SVGProps<SVGSVGElement>>): import("react/jsx-runtime").JSX.Element;
277
277
  export declare function IconMoveToFolder(props: React.SVGProps<SVGSVGElement>): import("react/jsx-runtime").JSX.Element;
278
278
  export declare function IconCustom(props: React.SVGProps<SVGSVGElement>): import("react/jsx-runtime").JSX.Element;
279
+ export declare function IconSeparator(props: React.SVGProps<SVGSVGElement>): import("react/jsx-runtime").JSX.Element;
279
280
  export { Icon123, IconABC, IconAccessPoint, IconAddressBook, IconSignCert, IconServerService, IconActivity, IconActivityLog, IconAdd, IconAddCircleOutline, IconAll, IconApply, IconApplyAndClose, IconArchive, IconArchiveDoc, IconArrowDown, IconArrowLeft, IconArrowRight, IconArrowUp, IconAtSign, IconAttachment, IconAutoConfig, IconBackward, IconBasket, IconBoard, IconBoxArchiveIn, IconBxInfo, IconBxLock, IconCalendar, IconCloseCircle, IconCloseOutline, IconCloud, IconCircleInfo, IconClear, IconColumns, IconCommand, IconCopy, IconCount, IconCrown, IconDashboard, IconDcmtType, IconDcmtTypeOnlyMetadata, IconDcmtTypeSys, IconDelete, IconDetails, IconDown, IconDownload, IconDotsVerticalCircleOutline, IconDuplicate, IconEdit, IconEqual, IconEqualNot, IconEraser, IconExpandRight, IconExport, IconFastBackward, IconFoldeAdd, IconFolderSearch, IconFolderZip, IconFastForward, IconFastSearch, IconFileDots, IconFilter, IconForceStop, IconForward, IconFreeze, IconFreeSearch, IconGreaterThan, IconGreaterThanOrEqual, IconHistory, IconImport, IconTag, IconInfo, IconInsertAbove, IconInsertBelow, IconHeart, IconHide, IconLanguage, IconLeft, IconLessThan, IconLessThanOrEqual, IconLock, IconLockClosed, IconLogin, IconLink, IconLogout, IconMail, IconMapping, IconMic, IconMenuHorizontal, IconMenuKebab, IconMenuVertical, IconMetadata, IconMetadata_Computed, IconMetadata_DataList, IconMetadata_Date, IconMetadata_DynamicDataList, IconMetadata_Numerator, IconMetadata_Numeric, IconMetadata_Special, IconMetadata_Text, IconMetadata_User, IconMonitor, IconOpenInNew, IconNotification, IconPassword, IconPencil, IconPlatform, IconPlay, IconPreview, IconPrinter, IconPrintOutline, IconProcess, IconProgressAbortRequested, IconProgressCompleted, IconProgressNotCompleted, IconProgressReady, IconProgressRunning, IconProgressStarted, IconRefresh, IconReset, IconRecentlyViewed, IconRight, IconSave, IconSearch, IconSelected, IconSettings, IconShow, IconSort, IconStop, IconStopwatch, IconSuccess, IconAlarmPlus, IconHourglass, IconNone, IconNotStarted, IconProgress, IconSuccessCirlce, IconSuitcase, IconSupport, IconUndo, IconUnFreeze, IconUp, IconUpdate, IconUpload, IconUser, IconUserProfile, IconVisible, IconWarning, IconWeb, IconWifi, IconWindowMaximize, IconWindowMinimize, IconWorkflow, IconWorkspace, IconUserGroup, IconUserGroupOutline, IconUserLevelMember, IconUserLevelAdministrator, IconUserLevelSystemAdministrator, IconUserLevelAutonomousAdministrator, IconDraggabledots, IconRelation, IconEasy, IconSum, IconDisk, IconDataList, IconPalette, IconFormatPageSplit, IconPaste, IconFileSearch, IconStar, IconStarRemove, IconSearchCheck, IconLightningFill, IconArrowUnsorted, IconArrowSortedUp, IconArrowSortedDown, IconConvertFilePdf, IconExportTo, IconSharedDcmt, IconShare, IconBatchUpdate, IconCheckFile, IconStatistics, IconSubstFile, IconAdvanced, IconSync, IconSavedQuery, IconSignature, IconSignaturePencil, IconRecursiveOps, IconCheckIn, IconTree, IconGrid, IconList, IconFolder, IconFolderOpen, IconFactory, IconTest, IconCheck, IconUncheck, IconSortAsc, IconSortDesc, IconRoundFileUpload, IconSortAscLetters, IconSortDescLetters, IconRotate, IconSortAscNumbers, IconSortDescNumbers, IconSortAscClock, IconSortDescClock, IconLayerGroup, IconBell, IconBellCheck, IconBellOutline, IconBellCheckOutline, IconEnvelopeOpenText, IconChangeUser, IconUserCheck, IconRelationManyToMany, IconRelationOneToMany, IconUserExpired, IconKey, IconZoomInLinear, IconZoomOutLinear, IconMenuCAWorkingGroups, IconCADossier, IconMenuCACaseflow, IconMenuDashboard, IconMenuCAAreas, IconMenuTask, IconMenuSearch, IconMenuFullTextSearch, IconMenuFavourite, IconSAPLogin, IconSAPLogin2, IconView, IconNewSignature };
@@ -690,4 +690,7 @@ export function IconMoveToFolder(props) {
690
690
  export function IconCustom(props) {
691
691
  return (_jsx("svg", { fontSize: props.fontSize ?? FONTSIZE, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", width: "1em", height: "1em", ...props, children: _jsx("path", { fill: "none", stroke: "currentColor", strokeLinecap: "round", strokeLinejoin: "round", strokeMiterlimit: "10", strokeWidth: "1.5", d: "M14 17h6m-3 3v-6M5.6 4h2.8A1.6 1.6 0 0 1 10 5.6v2.8A1.6 1.6 0 0 1 8.4 10H5.6A1.6 1.6 0 0 1 4 8.4V5.6A1.6 1.6 0 0 1 5.6 4m0 10h2.8a1.6 1.6 0 0 1 1.6 1.6v2.8A1.6 1.6 0 0 1 8.4 20H5.6A1.6 1.6 0 0 1 4 18.4v-2.8A1.6 1.6 0 0 1 5.6 14m10-10h2.8A1.6 1.6 0 0 1 20 5.6v2.8a1.6 1.6 0 0 1-1.6 1.6h-2.8A1.6 1.6 0 0 1 14 8.4V5.6A1.6 1.6 0 0 1 15.6 4" }) }));
692
692
  }
693
+ export function IconSeparator(props) {
694
+ return (_jsx("svg", { fontSize: props.fontSize ?? FONTSIZE, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", width: "1em", height: "1em", style: { transform: 'rotate(90deg)', ...props.style }, ...props, children: _jsxs("g", { fill: "currentColor", children: [_jsx("path", { d: "M16 5a1 1 0 1 0 0-2H8a1 1 0 1 0 0 2zm0 2a1 1 0 1 1 0 2H8a1 1 0 1 1 0-2zm1 5a1 1 0 0 1-1 1H8a1 1 0 1 1 0-2h8a1 1 0 0 1 1 1m-1 9a1 1 0 1 0 0-2H8a1 1 0 1 0 0 2z", opacity: ".5" }), _jsx("path", { fillRule: "evenodd", d: "M21 16a1 1 0 0 1-1 1H4a1 1 0 1 1 0-2h16a1 1 0 0 1 1 1", clipRule: "evenodd" })] }) }));
695
+ }
693
696
  export { Icon123, IconABC, IconAccessPoint, IconAddressBook, IconSignCert, IconServerService, IconActivity, IconActivityLog, IconAdd, IconAddCircleOutline, IconAll, IconApply, IconApplyAndClose, IconArchive, IconArchiveDoc, IconArrowDown, IconArrowLeft, IconArrowRight, IconArrowUp, IconAtSign, IconAttachment, IconAutoConfig, IconBackward, IconBasket, IconBoard, IconBoxArchiveIn, IconBxInfo, IconBxLock, IconCalendar, IconCloseCircle, IconCloseOutline, IconCloud, IconCircleInfo, IconClear, IconColumns, IconCommand, IconCopy, IconCount, IconCrown, IconDashboard, IconDcmtType, IconDcmtTypeOnlyMetadata, IconDcmtTypeSys, IconDelete, IconDetails, IconDown, IconDownload, IconDotsVerticalCircleOutline, IconDuplicate, IconEdit, IconEqual, IconEqualNot, IconEraser, IconExpandRight, IconExport, IconFastBackward, IconFoldeAdd, IconFolderSearch, IconFolderZip, IconFastForward, IconFastSearch, IconFileDots, IconFilter, IconForceStop, IconForward, IconFreeze, IconFreeSearch, IconGreaterThan, IconGreaterThanOrEqual, IconHistory, IconImport, IconTag, IconInfo, IconInsertAbove, IconInsertBelow, IconHeart, IconHide, IconLanguage, IconLeft, IconLessThan, IconLessThanOrEqual, IconLock, IconLockClosed, IconLogin, IconLink, IconLogout, IconMail, IconMapping, IconMic, IconMenuHorizontal, IconMenuKebab, IconMenuVertical, IconMetadata, IconMetadata_Computed, IconMetadata_DataList, IconMetadata_Date, IconMetadata_DynamicDataList, IconMetadata_Numerator, IconMetadata_Numeric, IconMetadata_Special, IconMetadata_Text, IconMetadata_User, IconMonitor, IconOpenInNew, IconNotification, IconPassword, IconPencil, IconPlatform, IconPlay, IconPreview, IconPrinter, IconPrintOutline, IconProcess, IconProgressAbortRequested, IconProgressCompleted, IconProgressNotCompleted, IconProgressReady, IconProgressRunning, IconProgressStarted, IconRefresh, IconReset, IconRecentlyViewed, IconRight, IconSave, IconSearch, IconSelected, IconSettings, IconShow, IconSort, IconStop, IconStopwatch, IconSuccess, IconAlarmPlus, IconHourglass, IconNone, IconNotStarted, IconProgress, IconSuccessCirlce, IconSuitcase, IconSupport, IconUndo, IconUnFreeze, IconUp, IconUpdate, IconUpload, IconUser, IconUserProfile, IconVisible, IconWarning, IconWeb, IconWifi, IconWindowMaximize, IconWindowMinimize, IconWorkflow, IconWorkspace, IconUserGroup, IconUserGroupOutline, IconUserLevelMember, IconUserLevelAdministrator, IconUserLevelSystemAdministrator, IconUserLevelAutonomousAdministrator, IconDraggabledots, IconRelation, IconEasy, IconSum, IconDisk, IconDataList, IconPalette, IconFormatPageSplit, IconPaste, IconFileSearch, IconStar, IconStarRemove, IconSearchCheck, IconLightningFill, IconArrowUnsorted, IconArrowSortedUp, IconArrowSortedDown, IconConvertFilePdf, IconExportTo, IconSharedDcmt, IconShare, IconBatchUpdate, IconCheckFile, IconStatistics, IconSubstFile, IconAdvanced, IconSync, IconSavedQuery, IconSignature, IconSignaturePencil, IconRecursiveOps, IconCheckIn, IconTree, IconGrid, IconList, IconFolder, IconFolderOpen, IconFactory, IconTest, IconCheck, IconUncheck, IconSortAsc, IconSortDesc, IconRoundFileUpload, IconSortAscLetters, IconSortDescLetters, IconRotate, IconSortAscNumbers, IconSortDescNumbers, IconSortAscClock, IconSortDescClock, IconLayerGroup, IconBell, IconBellCheck, IconBellOutline, IconBellCheckOutline, IconEnvelopeOpenText, IconChangeUser, IconUserCheck, IconRelationManyToMany, IconRelationOneToMany, IconUserExpired, IconKey, IconZoomInLinear, IconZoomOutLinear, IconMenuCAWorkingGroups, IconCADossier, IconMenuCACaseflow, IconMenuDashboard, IconMenuCAAreas, IconMenuTask, IconMenuSearch, IconMenuFullTextSearch, IconMenuFavourite, IconSAPLogin, IconSAPLogin2, IconView, IconNewSignature };
@@ -505,7 +505,8 @@ export const extensionHandler = (fileExt) => {
505
505
  case 'txt': return FileExtensionHandler.READY_TO_SHOW;
506
506
  case 'config':
507
507
  case 'cfg':
508
- case 'json': return FileExtensionHandler.READY_TO_SHOW;
508
+ case 'json':
509
+ case 'sql': return FileExtensionHandler.READY_TO_SHOW;
509
510
  default: return FileExtensionHandler.NONE;
510
511
  }
511
512
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@topconsultnpm/sdkui-react",
3
- "version": "6.20.0-dev1.56",
3
+ "version": "6.20.0-dev1.58",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1",