@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.
- package/lib/components/NewComponents/ContextMenu/TMContextMenu.js +104 -1
- package/lib/components/NewComponents/ContextMenu/types.d.ts +1 -0
- package/lib/components/NewComponents/FloatingMenuBar/TMFloatingMenuBar.js +112 -50
- package/lib/components/NewComponents/FloatingMenuBar/styles.d.ts +4 -0
- package/lib/components/NewComponents/FloatingMenuBar/styles.js +39 -0
- package/lib/components/NewComponents/FloatingMenuBar/types.d.ts +1 -0
- package/lib/components/base/TMDataGrid.js +1 -1
- package/lib/components/features/documents/TMDcmtPreview.js +3 -3
- package/lib/components/features/search/TMSavedQuerySelector.js +3 -3
- package/lib/components/features/search/TMSignatureInfoContent.js +20 -20
- package/lib/helper/TMIcons.d.ts +1 -0
- package/lib/helper/TMIcons.js +3 -0
- package/lib/helper/helpers.js +2 -1
- package/package.json +1 -1
|
@@ -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
|
});
|
|
@@ -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
|
-
|
|
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) =>
|
|
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
|
-
|
|
277
|
-
|
|
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
|
-
|
|
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
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
const
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
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
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
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
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
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
|
-
|
|
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;
|
|
@@ -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
|
|
149
|
-
if (fileBlob.type.includes("xml") && !
|
|
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 (
|
|
168
|
+
else if (isTextBasedFile) {
|
|
169
169
|
fileBlob.text().then((text) => {
|
|
170
170
|
const escapedText = text
|
|
171
171
|
.replace(/&/g, "&")
|
|
@@ -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); } }) }),
|
|
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
|
-
} })
|
|
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.
|
|
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() })] })] }))
|
|
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;
|
package/lib/helper/TMIcons.d.ts
CHANGED
|
@@ -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 };
|
package/lib/helper/TMIcons.js
CHANGED
|
@@ -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 };
|
package/lib/helper/helpers.js
CHANGED
|
@@ -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':
|
|
508
|
+
case 'json':
|
|
509
|
+
case 'sql': return FileExtensionHandler.READY_TO_SHOW;
|
|
509
510
|
default: return FileExtensionHandler.NONE;
|
|
510
511
|
}
|
|
511
512
|
};
|