@topconsultnpm/sdkui-react-beta 6.12.102 → 6.12.104

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.
@@ -18,9 +18,9 @@ const TMDataGrid = React.forwardRef((props, ref) => {
18
18
  // custom options
19
19
  dataColumns = [], pageSize = TMDataGridPageSize.Large, showHeaderFilter = true, showFilterPanel = false, showLoadPanel = true, showSearchPanel = true, searchPanelToolbarPosition = 'before', counterConfig = { show: false, items: new Map() },
20
20
  // events and callbacks
21
- onSelectionChanged, onFocusedRowChanged, onRowDblClick, onRowClick, onCellClick, onOptionChanged, onContentReady, onContextMenuPreparing, onInitialized, onEditorPreparing, onCellPrepared, onRowPrepared, onRowUpdating, onRowExpanded, onRowCollapsed, onRowUpdated, onSaved, onEditCanceled, onEditingStart, onEditingChange, customizeColumns, scrolling = { mode: 'standard', useNative: SDKUI_Globals.dataGridUseNativeScrollbar }, paging = { enabled: true, pageSize: pageSize }, pager = { visible: true, showInfo: true, showNavigationButtons: true }, selection = { mode: 'multiple', showCheckBoxesMode: "always", selectAllMode: "allPages" }, sorting, summary, stateStoring, columnChooser, grouping, groupPanel, filterRow, headerFilter, editing, rowDragging, masterDetail,
21
+ onSelectionChanged, onFocusedRowChanged, onRowDblClick, onRowClick, onCellClick, onOptionChanged, onContentReady, onContextMenuPreparing, onInitialized, onEditorPreparing, onCellPrepared, onRowPrepared, onRowUpdating, onRowExpanded, onRowCollapsed, onRowUpdated, onSaved, onEditCanceled, onEditingStart, onEditingChange, customizeColumns, scrolling = { mode: 'standard', useNative: Number(SDKUI_Globals.userSettings?.themeSettings.gridSettings.useNativeScrollbar) === 1 }, paging = { enabled: true, pageSize: pageSize }, pager = { visible: true, showInfo: true, showNavigationButtons: true }, selection = { mode: 'multiple', showCheckBoxesMode: "always", selectAllMode: "allPages" }, sorting, summary, stateStoring, columnChooser, grouping, groupPanel, filterRow, headerFilter, editing, rowDragging, masterDetail,
22
22
  // other properties
23
- disabled = false, autoNavigateToFocusedRow = true, columnResizingMode = 'widget', columnHidingEnabled = true, columnAutoWidth = true, allowColumnResizing = true, allowColumnReordering = true, showBorders = true, showRowLines = true, showColumnLines = false, showColumnHeaders = true, rowAlternationEnabled = false, wordWrapEnabled = false, noDataText,
23
+ disabled = false, autoNavigateToFocusedRow = true, columnResizingMode = 'widget', columnHidingEnabled = true, columnAutoWidth = true, allowColumnResizing = true, allowColumnReordering = true, showBorders = true, showRowLines = Number(SDKUI_Globals.userSettings?.themeSettings.gridSettings.showRowLines) === 1, showColumnLines = Number(SDKUI_Globals.userSettings?.themeSettings.gridSettings.showColumnLines) === 1, showColumnHeaders = true, rowAlternationEnabled = false, wordWrapEnabled = false, noDataText,
24
24
  // styles
25
25
  id, width = '100%', height = '100%', } = props;
26
26
  const [counterValues, setCounterValues] = useState(new Map());
@@ -4,7 +4,7 @@ import Toolbar, { Item as ToolbarItem } from 'devextreme-react/cjs/toolbar';
4
4
  import TreeView from 'devextreme-react/cjs/tree-view';
5
5
  import ScrollView from 'devextreme-react/cjs/scroll-view';
6
6
  import { ContextMenu, Pagination } from 'devextreme-react';
7
- import { IconFolder, SDKUI_Localizator, IconHide, IconShow, IconDashboard, IconList, getFileIcon, formatBytes, SDKUI_Globals, Globalization } from '../../helper';
7
+ import { IconFolder, SDKUI_Localizator, IconHide, IconShow, IconDashboard, IconList, getFileIcon, formatBytes, Globalization } from '../../helper';
8
8
  import { TMSearchBar } from '../sidebar/TMHeader';
9
9
  import TMButton from './TMButton';
10
10
  import TMDataGrid from './TMDataGrid';
@@ -53,12 +53,6 @@ const TMFileManager = (props) => {
53
53
  event.preventDefault();
54
54
  setTreeViewAnchor(event.currentTarget);
55
55
  };
56
- const onViewContextMenu = (event) => {
57
- if (event === undefined)
58
- return;
59
- event.preventDefault();
60
- setViewAnchor(event.currentTarget);
61
- };
62
56
  // Handle closing the context menu
63
57
  const closeTreeViewContextMenu = useCallback(() => {
64
58
  setTreeViewAnchor(null);
@@ -211,7 +205,7 @@ const TMFileManager = (props) => {
211
205
  display: "flex",
212
206
  flexGrow: 1,
213
207
  height: "calc(100% - 40px)"
214
- }, children: _jsxs(TMSplitterLayout, { direction: 'horizontal', showSeparator: true, separatorColor: 'transparent', separatorActiveColor: 'transparent', min: ['0', '0'], start: [isLeftPanelCollapsed ? '0%' : "50%", isLeftPanelCollapsed ? '100%' : "50%"], children: [_jsxs("div", { style: { height: "100%", width: "100%" }, onContextMenu: onTreeViewContextMenu, children: [_jsx(TreeView, { style: { marginTop: "10px" }, dataSource: treeViewData, displayExpr: "text", itemRender: renderTreeViewItem, onItemClick: handleTreeViewItemClick, onItemContextMenu: handleTreeViewContextMenu }), treeViewAnchor && _jsx(ContextMenu, { id: 'treeViewContextMenuDesktop', dataSource: folderContextMenuItems, target: treeViewAnchor, onHiding: closeTreeViewContextMenu })] }), _jsxs("div", { style: { backgroundColor: "#fff", width: "100%", height: "100%" }, children: [_jsxs(Toolbar, { style: { backgroundColor: '#f4f4f4', height: "40px", paddingLeft: "5px", paddingRight: '5px' }, children: [_jsx(ToolbarItem, { location: "before", children: _jsx(TMButton, { caption: viewMode === 'details' ? SDKUI_Localizator.PreviewView : SDKUI_Localizator.DetailsView, btnStyle: 'toolbar', color: 'primaryOutline', icon: viewMode === 'details' ? _jsx(IconDashboard, {}) : _jsx(IconList, {}), onClick: toggleViewMode }) }), _jsx(ToolbarItem, { location: "before", children: _jsx(TMSearchBar, { marginLeft: '0px', maxWidth: '160px', searchValue: searchText, onSearchValueChanged: (e) => handleSearchChange(e) }) })] }), _jsxs("div", { onDrop: handleDrop, onDragOver: handleDragOver, onDragLeave: handleDragLeave, onContextMenu: onViewContextMenu, style: { width: "100%", height: "calc(100% - 40px)", border: isDragging ? '2px solid red' : '2px solid transparent' }, children: [viewMode === 'thumbnails' && _jsxs(_Fragment, { children: [_jsx(ThumbnailsView, { userID: userID, items: filteredFileItems, focusedFile: focusedFile, selectedFiles: selectedFiles, searchText: searchText, handleSelectedFiles: handleSelectedFiles, handleFocusedFile: handleFocusedFile, onDoubleClickHandler: onDoubleClickHandler }), _jsx(ContextMenu, { id: 'fileContextMenuDesktop', dataSource: fileContextMenuItems, target: viewAnchor ?? undefined, visible: viewAnchor !== null, onHiding: closeViewContextMenu })] }), viewMode === 'details' && _jsx(DetailsView, { userID: userID, items: filteredFileItems, selectedFiles: selectedFiles, searchText: searchText, focusedFile: focusedFile, handleSelectedFiles: handleSelectedFiles, handleFocusedFile: handleFocusedFile, onDoubleClickHandler: onDoubleClickHandler, fileContextMenuItems: fileContextMenuItems })] })] })] }, "TMWGs-panels-treeView") })] }), isMobile && _jsx("div", { style: { height: "100%", width: "100%" }, children: _jsxs(TMToolbarCard, { onBack: openDraftList ? onBackCallback : undefined, title: SDKUI_Localizator.Drafts, totalItems: dcmtsFound ?? 0, children: [_jsxs("div", { style: { display: openDraftList ? 'none' : 'block', transition: 'opacity 0.3s ease-in-out' }, children: [_jsx(TreeView, { style: { marginTop: "10px", }, dataSource: treeViewData, displayExpr: "text", itemRender: renderTreeViewItem, onItemClick: handleTreeViewItemClick }), treeViewAnchor && _jsx(ContextMenu, { id: 'treeViewContextMenuMobile', dataSource: folderContextMenuItems, target: treeViewAnchor, onHiding: closeTreeViewContextMenu })] }), _jsxs("div", { style: { backgroundColor: "#fff", width: "100%", height: "100%", display: openDraftList ? 'block' : 'none', transition: 'opacity 0.3s ease-in-out' }, children: [_jsxs(Toolbar, { style: { backgroundColor: '#f4f4f4', height: "40px", paddingLeft: "5px", paddingRight: '5px' }, children: [_jsx(ToolbarItem, { location: "before", children: _jsx(TMButton, { caption: viewMode === 'details' ? SDKUI_Localizator.PreviewView : SDKUI_Localizator.DetailsView, btnStyle: 'toolbar', color: 'primaryOutline', icon: viewMode === 'details' ? _jsx(IconDashboard, {}) : _jsx(IconList, {}), onClick: toggleViewMode }) }), _jsx(ToolbarItem, { location: "before", children: _jsx(TMSearchBar, { marginLeft: '0px', maxWidth: '160px', searchValue: searchText, onSearchValueChanged: (e) => handleSearchChange(e) }) })] }), _jsxs("div", { onDrop: handleDrop, onDragOver: handleDragOver, onDragLeave: handleDragLeave, onContextMenu: onViewContextMenu, style: { width: "100%", height: "calc(100% - 40px)", border: isDragging ? '2px solid red' : '2px solid transparent' }, children: [viewMode === 'thumbnails' && _jsx(ThumbnailsView, { userID: userID, items: filteredFileItems, focusedFile: focusedFile, selectedFiles: selectedFiles, searchText: searchText, handleSelectedFiles: handleSelectedFiles, handleFocusedFile: handleFocusedFile, onDoubleClickHandler: onDoubleClickHandler }), viewMode === 'details' && _jsx(DetailsView, { items: filteredFileItems, selectedFiles: selectedFiles, searchText: searchText, focusedFile: focusedFile, handleSelectedFiles: handleSelectedFiles, handleFocusedFile: handleFocusedFile, onDoubleClickHandler: onDoubleClickHandler }), _jsx(ContextMenu, { id: 'fileViewContextMenuMobile', dataSource: fileContextMenuItems, target: viewAnchor ?? undefined, visible: viewAnchor !== null, onHiding: closeViewContextMenu })] })] })] }) })] });
208
+ }, children: _jsxs(TMSplitterLayout, { direction: 'horizontal', showSeparator: true, separatorColor: 'transparent', separatorActiveColor: 'transparent', min: ['0', '0'], start: [isLeftPanelCollapsed ? '0%' : "50%", isLeftPanelCollapsed ? '100%' : "50%"], children: [_jsxs("div", { style: { height: "100%", width: "100%" }, onContextMenu: onTreeViewContextMenu, children: [_jsx(TreeView, { style: { marginTop: "10px" }, dataSource: treeViewData, displayExpr: "text", itemRender: renderTreeViewItem, onItemClick: handleTreeViewItemClick, onItemContextMenu: handleTreeViewContextMenu }), treeViewAnchor && _jsx(ContextMenu, { id: 'treeViewContextMenuDesktop', dataSource: folderContextMenuItems, target: treeViewAnchor, onHiding: closeTreeViewContextMenu })] }), _jsxs("div", { style: { backgroundColor: "#fff", width: "100%", height: "100%" }, children: [_jsxs(Toolbar, { style: { backgroundColor: '#f4f4f4', height: "40px", paddingLeft: "5px", paddingRight: '5px' }, children: [_jsx(ToolbarItem, { location: "before", children: _jsx(TMButton, { caption: viewMode === 'details' ? SDKUI_Localizator.PreviewView : SDKUI_Localizator.DetailsView, btnStyle: 'toolbar', color: 'primaryOutline', icon: viewMode === 'details' ? _jsx(IconDashboard, {}) : _jsx(IconList, {}), onClick: toggleViewMode }) }), _jsx(ToolbarItem, { location: "before", children: _jsx(TMSearchBar, { marginLeft: '0px', maxWidth: '160px', searchValue: searchText, onSearchValueChanged: (e) => handleSearchChange(e) }) })] }), _jsxs("div", { onDrop: handleDrop, onDragOver: handleDragOver, onDragLeave: handleDragLeave, style: { width: "100%", height: "calc(100% - 40px)", border: isDragging ? '2px solid red' : '2px solid transparent' }, children: [viewMode === 'thumbnails' && _jsxs(_Fragment, { children: [_jsx(ThumbnailsView, { userID: userID, items: filteredFileItems, focusedFile: focusedFile, selectedFiles: selectedFiles, searchText: searchText, handleSelectedFiles: handleSelectedFiles, handleFocusedFile: handleFocusedFile, onDoubleClickHandler: onDoubleClickHandler, setViewAnchor: setViewAnchor }), viewAnchor && _jsx(ContextMenu, { id: 'fileContextMenuDesktop', dataSource: fileContextMenuItems, target: viewAnchor, onHiding: closeViewContextMenu })] }), viewMode === 'details' && _jsx(DetailsView, { userID: userID, items: filteredFileItems, selectedFiles: selectedFiles, searchText: searchText, focusedFile: focusedFile, handleSelectedFiles: handleSelectedFiles, handleFocusedFile: handleFocusedFile, onDoubleClickHandler: onDoubleClickHandler, fileContextMenuItems: fileContextMenuItems })] })] })] }, "TMWGs-panels-treeView") })] }), isMobile && _jsx("div", { style: { height: "100%", width: "100%" }, children: _jsxs(TMToolbarCard, { onBack: openDraftList ? onBackCallback : undefined, title: SDKUI_Localizator.Drafts, totalItems: dcmtsFound ?? 0, children: [_jsxs("div", { style: { display: openDraftList ? 'none' : 'block', transition: 'opacity 0.3s ease-in-out' }, children: [_jsx(TreeView, { style: { marginTop: "10px", }, dataSource: treeViewData, displayExpr: "text", itemRender: renderTreeViewItem, onItemClick: handleTreeViewItemClick }), treeViewAnchor && _jsx(ContextMenu, { id: 'treeViewContextMenuMobile', dataSource: folderContextMenuItems, target: treeViewAnchor, onHiding: closeTreeViewContextMenu })] }), _jsxs("div", { style: { backgroundColor: "#fff", width: "100%", height: "100%", display: openDraftList ? 'block' : 'none', transition: 'opacity 0.3s ease-in-out' }, children: [_jsxs(Toolbar, { style: { backgroundColor: '#f4f4f4', height: "40px", paddingLeft: "5px", paddingRight: '5px' }, children: [_jsx(ToolbarItem, { location: "before", children: _jsx(TMButton, { caption: viewMode === 'details' ? SDKUI_Localizator.PreviewView : SDKUI_Localizator.DetailsView, btnStyle: 'toolbar', color: 'primaryOutline', icon: viewMode === 'details' ? _jsx(IconDashboard, {}) : _jsx(IconList, {}), onClick: toggleViewMode }) }), _jsx(ToolbarItem, { location: "before", children: _jsx(TMSearchBar, { marginLeft: '0px', maxWidth: '160px', searchValue: searchText, onSearchValueChanged: (e) => handleSearchChange(e) }) })] }), _jsxs("div", { onDrop: handleDrop, onDragOver: handleDragOver, onDragLeave: handleDragLeave, style: { width: "100%", height: "calc(100% - 40px)", border: isDragging ? '2px solid red' : '2px solid transparent' }, children: [viewMode === 'thumbnails' && _jsxs(_Fragment, { children: [_jsx(ThumbnailsView, { userID: userID, items: filteredFileItems, focusedFile: focusedFile, selectedFiles: selectedFiles, searchText: searchText, handleSelectedFiles: handleSelectedFiles, handleFocusedFile: handleFocusedFile, onDoubleClickHandler: onDoubleClickHandler, setViewAnchor: setViewAnchor }), viewAnchor && _jsx(ContextMenu, { id: 'fileViewContextMenuMobile', dataSource: fileContextMenuItems, target: viewAnchor, onHiding: closeViewContextMenu })] }), viewMode === 'details' && _jsx(DetailsView, { items: filteredFileItems, selectedFiles: selectedFiles, searchText: searchText, focusedFile: focusedFile, handleSelectedFiles: handleSelectedFiles, handleFocusedFile: handleFocusedFile, onDoubleClickHandler: onDoubleClickHandler })] })] })] }) })] });
215
209
  };
216
210
  export default TMFileManager;
217
211
  const highlightText = (text, searchText, isSelected) => {
@@ -282,10 +276,10 @@ const DetailsView = (props) => {
282
276
  e.items = fileContextMenuItems ? [...fileContextMenuItems] : [];
283
277
  }
284
278
  };
285
- return (items && items.length > 0) ? (_jsx(TMDataGrid, { dataSource: items ?? [], dataColumns: dataColumns, focusedRowKey: focusedFile?.id, selectedRowKeys: selectedFiles?.map(file => file.id), onFocusedRowChanged: onFocusedRowChanged, onSelectionChanged: onSelectionChanged, onRowDblClick: onRowDblClick, onContextMenuPreparing: onContextMenuPreparing, showSearchPanel: false, showRowLines: SDKUI_Globals.dataGridShowRowLines, showColumnLines: SDKUI_Globals.dataGridShowColumnLines })) : _jsx("div", { style: { width: "100%", height: "100%", display: 'flex', justifyContent: 'center', alignItems: 'center', marginTop: '10px' }, children: SDKUI_Localizator.FolderIsEmpty });
279
+ return (items && items.length > 0) ? (_jsx(TMDataGrid, { dataSource: items ?? [], dataColumns: dataColumns, focusedRowKey: focusedFile?.id, selectedRowKeys: selectedFiles?.map(file => file.id), onFocusedRowChanged: onFocusedRowChanged, onSelectionChanged: onSelectionChanged, onRowDblClick: onRowDblClick, onContextMenuPreparing: onContextMenuPreparing, showSearchPanel: false })) : _jsx("div", { style: { width: "100%", height: "100%", display: 'flex', justifyContent: 'center', alignItems: 'center', marginTop: '10px' }, children: SDKUI_Localizator.FolderIsEmpty });
286
280
  };
287
281
  const ThumbnailsView = (props) => {
288
- const { items, focusedFile, selectedFiles, searchText = '', userID, handleSelectedFiles, handleFocusedFile, onDoubleClickHandler } = props;
282
+ const { items, focusedFile, selectedFiles, searchText = '', userID, handleSelectedFiles, handleFocusedFile, onDoubleClickHandler, setViewAnchor } = props;
289
283
  const PAGE_SIZES = [TMFileManagerPageSize.Small, TMFileManagerPageSize.Medium, TMFileManagerPageSize.Large];
290
284
  const initPageSize = TMFileManagerPageSize.Small;
291
285
  const showPagination = (items?.length ?? 0) > initPageSize;
@@ -313,5 +307,5 @@ const ThumbnailsView = (props) => {
313
307
  if (onDoubleClickHandler)
314
308
  onDoubleClickHandler(item);
315
309
  };
316
- return items && items.length > 0 ? (_jsxs("div", { style: { width: "100%", height: "100%" }, children: [_jsx(ScrollView, { width: "100%", height: showPagination ? "calc(100% - 50px)" : "100%", useNative: true, direction: 'vertical', children: _jsx(TMFileManagerThumbnailItems, { items: items, paginatedItems: paginatedItems, focusedFile: focusedFile, selectedFiles: selectedFiles, showId: false, userID: userID, searchText: searchText, handleFocusedFile: handleFocusedFile, handleSelectedFiles: handleSelectedFiles, onClick: handleItemClick, onDoubleClick: handleItemDoubleClick }) }), showPagination && _jsx(Pagination, { height: "50px", showInfo: true, showNavigationButtons: true, allowedPageSizes: PAGE_SIZES, displayMode: 'compact', itemCount: items.length, pageIndex: pageIndex, pageSize: pageSize, onPageIndexChange: setPageIndex, onPageSizeChange: setPageSize })] })) : _jsx("div", { style: { width: "100%", height: "100%", display: 'flex', justifyContent: 'center', alignItems: 'center', marginTop: '10px' }, children: SDKUI_Localizator.FolderIsEmpty });
310
+ return items && items.length > 0 ? (_jsxs("div", { style: { width: "100%", height: "100%" }, children: [_jsx(ScrollView, { width: "100%", height: showPagination ? "calc(100% - 50px)" : "100%", useNative: true, direction: 'vertical', children: _jsx(TMFileManagerThumbnailItems, { items: items, paginatedItems: paginatedItems, focusedFile: focusedFile, selectedFiles: selectedFiles, showId: false, userID: userID, searchText: searchText, handleFocusedFile: handleFocusedFile, handleSelectedFiles: handleSelectedFiles, onClick: handleItemClick, onDoubleClick: handleItemDoubleClick, setViewAnchor: setViewAnchor }) }), showPagination && _jsx(Pagination, { height: "50px", showInfo: true, showNavigationButtons: true, allowedPageSizes: PAGE_SIZES, displayMode: 'compact', itemCount: items.length, pageIndex: pageIndex, pageSize: pageSize, onPageIndexChange: setPageIndex, onPageSizeChange: setPageSize })] })) : _jsx("div", { style: { width: "100%", height: "100%", display: 'flex', justifyContent: 'center', alignItems: 'center', marginTop: '10px' }, children: SDKUI_Localizator.FolderIsEmpty });
317
311
  };
@@ -1,3 +1,4 @@
1
+ import React from 'react';
1
2
  import { FileItem } from './TMFileManager';
2
3
  export interface TMFileManagerThumbnailItemsProps {
3
4
  items: Array<FileItem>;
@@ -6,6 +7,7 @@ export interface TMFileManagerThumbnailItemsProps {
6
7
  selectedFiles: Array<FileItem> | undefined;
7
8
  showId: boolean;
8
9
  searchText: string;
10
+ setViewAnchor: React.Dispatch<React.SetStateAction<HTMLElement | null>>;
9
11
  onClick: (file: FileItem) => void;
10
12
  onDoubleClick?: (file: FileItem) => void;
11
13
  handleSelectedFiles?: (fileItems: Array<FileItem>) => void;
@@ -39,7 +39,7 @@ const highlightText = (text, searchText, isSelected) => {
39
39
  return text.split(regex).map((part, index) => regex.test(part) ? (_jsx("span", { style: { backgroundColor: isSelected ? '#6c9023' : 'yellow' }, children: part }, index)) : (part));
40
40
  };
41
41
  const TMFileManagerThumbnailItems = (props) => {
42
- const { items, paginatedItems, focusedFile, selectedFiles, searchText, showId, userID, onClick, onDoubleClick, handleSelectedFiles, handleFocusedFile } = props;
42
+ const { items, paginatedItems, focusedFile, selectedFiles, searchText, showId, userID, onClick, onDoubleClick, handleSelectedFiles, handleFocusedFile, setViewAnchor } = props;
43
43
  // Ref to the container
44
44
  const containerRef = useRef(null);
45
45
  const clickTimeoutRef = useRef(null);
@@ -97,6 +97,7 @@ const TMFileManagerThumbnailItems = (props) => {
97
97
  }, [onClick]);
98
98
  const onContextMenu = useCallback((e, item) => {
99
99
  e.preventDefault();
100
+ setViewAnchor(e.currentTarget);
100
101
  if (handleFocusedFile)
101
102
  handleFocusedFile(item);
102
103
  }, []);
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useCallback, useEffect, useMemo, useState } from 'react';
3
3
  import Logo from '../../../assets/Toppy-generico.png';
4
- import { LayoutModes, LocalStorageService, SDK_Globals } from '@topconsultnpm/sdk-ts-beta';
5
- import { IconTree, IconProgressReady } from '../../../helper';
4
+ import { LayoutModes } from '@topconsultnpm/sdk-ts-beta';
5
+ import { IconTree, IconProgressReady, SDKUI_Globals } from '../../../helper';
6
6
  import { useDeviceType, DeviceType } from '../../base/TMDeviceProvider';
7
7
  import TMLayoutContainer, { TMSplitterLayout, TMLayoutItem } from '../../base/TMLayout';
8
8
  import TMToolbarCard from '../../base/TMToolbarCard';
@@ -11,7 +11,7 @@ import TMDcmtForm from '../documents/TMDcmtForm';
11
11
  import { StyledToppyTextContainer, StyledToppyText } from '../search/TMSearchQueryPanel';
12
12
  import TMTreeSelector from '../search/TMTreeSelector';
13
13
  const TMArchive = ({ inputTID }) => {
14
- const TIDs = LocalStorageService.getItem(`ARCHIVEPAGE_MRU_TIDS_${SDK_Globals.tmSession?.SessionDescr?.archiveID}_${SDK_Globals.tmSession?.SessionDescr?.userID}`) ?? [];
14
+ const TIDs = SDKUI_Globals.userSettings.archivingSettings.mruTIDs;
15
15
  const [currentTID, setCurrentTID] = useState(0);
16
16
  const [mruTIDs, setMruTIDs] = useState(TIDs);
17
17
  const [showRecentsPanel, setShowRecentsPanel] = useState(true);
@@ -47,7 +47,7 @@ const TMArchive = ({ inputTID }) => {
47
47
  let index = newMruTIDS.findIndex(o => o == tid);
48
48
  if (index >= 0)
49
49
  newMruTIDS.splice(index, 1);
50
- LocalStorageService.setItem(`ARCHIVEPAGE_MRU_TIDS_${SDK_Globals.tmSession?.SessionDescr?.archiveID}_${SDK_Globals.tmSession?.SessionDescr?.userID}`, newMruTIDS.filter(tid => tid != undefined && tid != null));
50
+ SDKUI_Globals.userSettings.archivingSettings.mruTIDs = newMruTIDS.filter(tid => tid != undefined && tid != null);
51
51
  setMruTIDs(newMruTIDS);
52
52
  } }) }) }) : _jsx(_Fragment, {}), _jsx(TMLayoutItem, { children: currentTID ?
53
53
  _jsx(TMDcmtForm, { TID: currentTID, DID: undefined, layoutMode: LayoutModes.Ark, customRightSidebarItems: customSidebarItems, showPreview: deviceType !== DeviceType.MOBILE, onClose: deviceType === DeviceType.MOBILE ? () => setCurrentTID(undefined) : undefined, onSaveRecents: (TIDs) => setMruTIDs(TIDs) })
@@ -2,14 +2,14 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
2
2
  import { useEffect, useMemo, useState } from 'react';
3
3
  import styled from 'styled-components';
4
4
  import TMDcmtPreview from './TMDcmtPreview';
5
- import { AccessLevels, ArchiveConstraints, ArchiveEngineByID, DcmtTypeListCacheService, LayoutModes, LocalStorageService, MetadataDataTypes, ResultTypes, SDK_Globals, SystemMIDsAsNumber, TemplateTIDs, UpdateEngineByID, ValidationItem } from '@topconsultnpm/sdk-ts-beta';
5
+ import { AccessLevels, ArchiveConstraints, ArchiveEngineByID, DcmtTypeListCacheService, LayoutModes, MetadataDataTypes, ResultTypes, SDK_Globals, SystemMIDsAsNumber, TemplateTIDs, UpdateEngineByID, ValidationItem } from '@topconsultnpm/sdk-ts-beta';
6
6
  import { ContextMenu } from 'devextreme-react';
7
7
  import { WorkFlowApproveRejectPopUp, WorkFlowOperationButtons, WorkFlowReAssignPopUp } from '../workflow/TMWorkflowPopup';
8
8
  import { DownloadTypes, FormModes } from '../../../ts';
9
9
  import { DeviceType, useDeviceType } from '../../base/TMDeviceProvider';
10
10
  import { useDcmtOperations } from '../../../hooks/useDcmtOperations';
11
11
  import { handleArchiveVisibility, searchResultToMetadataValues } from '../../../helper/queryHelper';
12
- import { genUniqueId, IconCloseCircle, IconShow, SDKUI_Localizator, IconBoard, IconDcmtTypeSys, IconDataList, IconDetailDcmts, svgToString, IconDownload, IconHide, calcIsModified, IconMenuVertical, Globalization, getListMaxItems, getSystemMetadata, IconBoxArchiveIn, IconClear, IconUndo } from '../../../helper';
12
+ import { genUniqueId, IconCloseCircle, IconShow, SDKUI_Localizator, IconBoard, IconDcmtTypeSys, IconDataList, IconDetailDcmts, svgToString, IconDownload, IconHide, calcIsModified, IconMenuVertical, Globalization, getListMaxItems, getSystemMetadata, IconBoxArchiveIn, IconClear, IconUndo, SDKUI_Globals } from '../../../helper';
13
13
  import { hasDetailRelations, hasMasterRelations, isXMLFileExt } from '../../../helper/dcmtsHelper';
14
14
  import { TMColors } from '../../../utils/theme';
15
15
  import { StyledFormButtonsContainer, StyledModalContainer, StyledToolbarCardContainer } from '../../base/Styled';
@@ -33,7 +33,7 @@ import TMModal from '../../base/TMModal';
33
33
  let abortControllerLocal = new AbortController();
34
34
  //#endregion
35
35
  const TMDcmtForm = ({ showHeader = true, onSaveRecents, layoutMode = LayoutModes.Update, onClose, onSavedAsyncCallback, TID, DID, formMode = FormModes.Update, canNext, canPrev, count, itemIndex, onNext, onPrev, customRightSidebarItems = [], allowNavigation = true, allowRelations = true, isClosable = false, showDcmtForm = true, showDcmtFormSidebar = true, showPreview = false, showBoard = false, showSysMetadata = false, onClosePreview, titleModal, isModal = false, widthModal = "100%", heightModal = "100%" }) => {
36
- const mruTIDs = LocalStorageService.getItem(`ARCHIVEPAGE_MRU_TIDS_${SDK_Globals.tmSession?.SessionDescr?.archiveID}_${SDK_Globals.tmSession?.SessionDescr?.userID}`);
36
+ const mruTIDs = SDKUI_Globals.userSettings.archivingSettings.mruTIDs;
37
37
  const [id, setID] = useState('');
38
38
  const [showWaitPanelLocal, setShowWaitPanelLocal] = useState(false);
39
39
  const [waitPanelTitleLocal, setWaitPanelTitleLocal] = useState('');
@@ -390,7 +390,7 @@ const TMDcmtForm = ({ showHeader = true, onSaveRecents, layoutMode = LayoutModes
390
390
  if (newMruTIDS.length >= 10)
391
391
  newMruTIDS.splice(0, 1);
392
392
  newMruTIDS.push(TID);
393
- LocalStorageService.setItem(`ARCHIVEPAGE_MRU_TIDS_${SDK_Globals.tmSession?.SessionDescr?.archiveID}_${SDK_Globals.tmSession?.SessionDescr?.userID}`, newMruTIDS.filter((tid) => tid != undefined && tid != null));
393
+ SDKUI_Globals.userSettings.archivingSettings.mruTIDs = newMruTIDS.filter(tid => tid != undefined && tid != null);
394
394
  onSaveRecents?.(newMruTIDS);
395
395
  ShowAlert({ mode: 'success', title: 'Archiviazione', message: 'Il documento è stato archiviato con successo', duration: 3000 });
396
396
  }
@@ -47,8 +47,8 @@ const TMDcmtPreview = ({ dcmtData, onClose, canNext, canPrev, onNext, onPrev })
47
47
  rfo.retrieveReason = DcmtOpers.None;
48
48
  rfo.generalRetrieveFormat = GeneralRetrieveFormats.OriginalUnsigned;
49
49
  rfo.cvtFormat = extensionHandler(dcmtData?.fileExt) === FileExtensionHandler.CONVERTIBLE ? FileFormats.PDF : FileFormats.None;
50
- rfo.invoiceRetrieveFormat = SDKUI_Globals.invoiceRetrieveFormat;
51
- rfo.orderRetrieveFormat = SDKUI_Globals.orderRetrieveFormat;
50
+ rfo.invoiceRetrieveFormat = SDKUI_Globals.userSettings?.searchSettings.invoiceRetrieveFormat;
51
+ rfo.orderRetrieveFormat = SDKUI_Globals.userSettings?.searchSettings.orderRetrieveFormat;
52
52
  try {
53
53
  await sleep(300); //wait for DX-DataGrid selectionChanged
54
54
  let dcmtFile = await getDcmtFileAsync({ TID: dcmtData?.tid, DID: dcmtData?.did, FILEEXT: dcmtData?.fileExt }, rfo, 'Anteprima', false);
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useCallback, useEffect, useState } from 'react';
3
- import { SavedQueryCacheService, SDK_Globals, DcmtTypeListCacheService, SDK_Localizator, LocalStorageService } from '@topconsultnpm/sdk-ts-beta';
3
+ import { SavedQueryCacheService, DcmtTypeListCacheService, SDK_Localizator } from '@topconsultnpm/sdk-ts-beta';
4
4
  import TMSavedQuerySelector from './TMSavedQuerySelector';
5
5
  import TMTreeSelector from './TMTreeSelector';
6
6
  import { TabPanel, Item } from 'devextreme-react/tab-panel';
@@ -36,7 +36,7 @@ const TMSearch = ({ inputTID, inputSqdID, onRefreshAfterAddDcmtToFavs, onTaskCre
36
36
  const [lastQdSearched, setLastQdSearched] = useState();
37
37
  const deviceType = useDeviceType();
38
38
  useEffect(() => {
39
- setMruTIDs(LocalStorageService.getItem(`SEARCHPAGE_MRU_TIDS_${SDK_Globals.tmSession?.SessionDescr?.archiveID}_${SDK_Globals.tmSession?.SessionDescr?.userID}`) ?? []);
39
+ setMruTIDs(SDKUI_Globals.userSettings.searchSettings.mruTIDs);
40
40
  loadDataSQDsAsync(false);
41
41
  }, []);
42
42
  useEffect(() => {
@@ -145,7 +145,7 @@ const TMSearch = ({ inputTID, inputSqdID, onRefreshAfterAddDcmtToFavs, onTaskCre
145
145
  default: break;
146
146
  }
147
147
  };
148
- return (_jsxs(TMLayoutContainer, { direction: 'vertical', children: [_jsx("div", { style: { position: (currentSearchView === TMSearchViews.None) ? 'relative' : 'absolute', left: (currentSearchView === TMSearchViews.None) ? '0px' : '-9999px', top: (currentSearchView === TMSearchViews.None) ? '0px' : '-9999px', visibility: (currentSearchView === TMSearchViews.None) ? 'visible' : 'hidden', display: "flex", flexDirection: "column", height: "100%", width: '100%' }, children: _jsxs(TMSplitterLayout, { direction: 'horizontal', showSeparator: deviceType !== DeviceType.MOBILE && showTreesPanel, separatorSize: 8, separatorColor: 'transparent', separatorActiveColor: 'transparent', min: ['0', '0'], start: (deviceType === DeviceType.MOBILE) ? ['100%', '0%'] : showTreesPanel ? [SDKUI_Globals.userAppSettings?.searchSettings?.filterPageSettings?.treePanel?.size ?? '50px', '80%'] : ['0%', '100%'], children: [deviceType !== DeviceType.MOBILE && _jsx(TMTreeSelector, { onClose: () => setShowTreesPanel(false), onSelectedTIDChanged: (tid) => {
148
+ return (_jsxs(TMLayoutContainer, { direction: 'vertical', children: [_jsx("div", { style: { position: (currentSearchView === TMSearchViews.None) ? 'relative' : 'absolute', left: (currentSearchView === TMSearchViews.None) ? '0px' : '-9999px', top: (currentSearchView === TMSearchViews.None) ? '0px' : '-9999px', visibility: (currentSearchView === TMSearchViews.None) ? 'visible' : 'hidden', display: "flex", flexDirection: "column", height: "100%", width: '100%' }, children: _jsxs(TMSplitterLayout, { direction: 'horizontal', showSeparator: deviceType !== DeviceType.MOBILE && showTreesPanel, separatorSize: 8, separatorColor: 'transparent', separatorActiveColor: 'transparent', min: ['0', '0'], start: (deviceType === DeviceType.MOBILE) ? ['100%', '0%'] : showTreesPanel ? ['20%', '80%'] : ['0%', '100%'], children: [deviceType !== DeviceType.MOBILE && _jsx(TMTreeSelector, { onClose: () => setShowTreesPanel(false), onSelectedTIDChanged: (tid) => {
149
149
  setCurrentTID(tid);
150
150
  if (tid && mruTIDs.includes(tid))
151
151
  setCurrentMruTID(tid);
@@ -156,7 +156,7 @@ const TMSearch = ({ inputTID, inputSqdID, onRefreshAfterAddDcmtToFavs, onTaskCre
156
156
  let index = newMruTIDS.findIndex(o => o == tid);
157
157
  if (index >= 0)
158
158
  newMruTIDS.splice(index, 1);
159
- LocalStorageService.setItem(`SEARCHPAGE_MRU_TIDS_${SDK_Globals.tmSession?.SessionDescr?.archiveID}_${SDK_Globals.tmSession?.SessionDescr?.userID}`, newMruTIDS.filter(tid => tid != undefined && tid != null));
159
+ SDKUI_Globals.userSettings.searchSettings.mruTIDs = newMruTIDS.filter(tid => tid != undefined && tid != null);
160
160
  setMruTIDs(newMruTIDS);
161
161
  } }) }), _jsx(TMSearchQueryPanel, { fromDTD: fromDTD, SQD: currentSQD, isOpenDistinctValuesPanel: showDistinctValuesPanel, rightSidebarItems: rightSidebarItems, onFocusedMetadataChanged: setFocusedTidMid, onRightSidebarItemClick: rightSidebarItemClickHandler, onCloseDistinctValuesPanel: () => setShowDistinctValuesPanel(false), onSearchCompleted: (searchResult, qd) => {
162
162
  setSearchResult(searchResult);
@@ -175,7 +175,7 @@ const TMSearch = ({ inputTID, inputSqdID, onRefreshAfterAddDcmtToFavs, onTaskCre
175
175
  newMruTIDS.push(fromTID);
176
176
  setMruTIDs(newMruTIDS);
177
177
  setCurrentMruTID(fromTID);
178
- LocalStorageService.setItem(`SEARCHPAGE_MRU_TIDS_${SDK_Globals.tmSession?.SessionDescr?.archiveID}_${SDK_Globals.tmSession?.SessionDescr?.userID}`, newMruTIDS.filter(tid => tid != undefined && tid != null));
178
+ SDKUI_Globals.userSettings.searchSettings.mruTIDs = newMruTIDS.filter(tid => tid != undefined && tid != null);
179
179
  }, onSqdSaved: async (newSqd) => {
180
180
  await loadDataSQDsAsync(true, newSqd.masterTID);
181
181
  await setSQDAsync(newSqd);
@@ -4,7 +4,7 @@ import { SDK_Globals, DataColumnTypes, MetadataDataDomains, DataListViewModes, M
4
4
  import styled from 'styled-components';
5
5
  import { getCommandsMenuItems, getSelectedDcmtsOrFocused } from './TMSearchResultsMenuItems';
6
6
  import { ContextMenu } from 'devextreme-react';
7
- import { genUniqueId, IconShow, IconBoard, IconDcmtTypeSys, IconDetailDcmts, SDKUI_Localizator, IconTag, IconDetails, IconCommand, IconDelete, IconRefresh, IconMenuVertical, IconDownload, IconSignature, deepCompare, getDataColumnName, searchResultDescriptorToSimpleArray, SDKUI_Globals, IconArchive, IconActivityLog, IconStar, IconFreeSearch, IconChevronDown, searchResultToMetadataValues } from '../../../helper';
7
+ import { genUniqueId, IconShow, IconBoard, IconDcmtTypeSys, IconDetailDcmts, SDKUI_Localizator, IconTag, IconDetails, IconCommand, IconDelete, IconRefresh, IconMenuVertical, IconDownload, IconSignature, deepCompare, getDataColumnName, searchResultDescriptorToSimpleArray, IconArchive, IconActivityLog, IconStar, IconFreeSearch, IconChevronDown, searchResultToMetadataValues } from '../../../helper';
8
8
  import { useDcmtOperations } from '../../../hooks/useDcmtOperations';
9
9
  import { useInputAttachmentsDialog, useInputCvtFormatDialog } from '../../../hooks/useInputDialog';
10
10
  import { DcmtOperationTypes, FormModes, SearchResultContext } from '../../../ts';
@@ -633,7 +633,7 @@ const TMSearchResultGrid = ({ inputFocusedItem, allowMultipleSelection = true, o
633
633
  setShowFilterPanel(!!e.value);
634
634
  }
635
635
  }, []);
636
- return _jsx(TMDataGrid, { id: "tm-search-result", keyExpr: "rowIndex", dataColumns: dataColumns, dataSource: dataSource, repaintChangesOnly: true, selectedRowKeys: selectedRowKeys, focusedRowKey: focusedItem?.rowIndex, showRowLines: SDKUI_Globals.dataGridShowRowLines, showColumnLines: SDKUI_Globals.dataGridShowColumnLines, showSearchPanel: false, showFilterPanel: showFilterPanel, sorting: { mode: "multiple" }, selection: { mode: allowMultipleSelection ? 'multiple' : 'single' }, pageSize: TMDataGridPageSize.Small, onSelectionChanged: handleSelectionChange, onFocusedRowChanged: handleFocusedRowChange, onRowDblClick: onRowDblClick, onContentReady: onContentReady, onOptionChanged: onOptionChanged, onContextMenuPreparing: onContextMenuPreparing, counterConfig: { show: true } });
636
+ return _jsx(TMDataGrid, { id: "tm-search-result", keyExpr: "rowIndex", dataColumns: dataColumns, dataSource: dataSource, repaintChangesOnly: true, selectedRowKeys: selectedRowKeys, focusedRowKey: focusedItem?.rowIndex, showSearchPanel: false, showFilterPanel: showFilterPanel, sorting: { mode: "multiple" }, selection: { mode: allowMultipleSelection ? 'multiple' : 'single' }, pageSize: TMDataGridPageSize.Small, onSelectionChanged: handleSelectionChange, onFocusedRowChanged: handleFocusedRowChange, onRowDblClick: onRowDblClick, onContentReady: onContentReady, onOptionChanged: onOptionChanged, onContextMenuPreparing: onContextMenuPreparing, counterConfig: { show: true } });
637
637
  };
638
638
  //#region TMSearchResultSelector
639
639
  const StyledGroupTemplate = styled.div `
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useCallback, useEffect, useState } from 'react';
3
- import { LayoutModes, LocalStorageService, SDK_Globals, SDK_Localizator, TreeCacheService, TreeItemTypes } from '@topconsultnpm/sdk-ts-beta';
3
+ import { LayoutModes, SDK_Localizator, TreeCacheService, TreeItemTypes } from '@topconsultnpm/sdk-ts-beta';
4
4
  import { TreeList, Column, Scrolling, Selection } from 'devextreme-react/tree-list';
5
5
  import { DropDownBox } from 'devextreme-react';
6
6
  import { IconStarRemove, IconStar, SDKUI_Localizator, SDKUI_Globals } from '../../../helper';
@@ -20,7 +20,7 @@ const TMTreeSelector = ({ layoutMode = LayoutModes.Update, onSelectedTIDChanged,
20
20
  const [focusedRowKey, setFocusedRowKey] = useState(undefined);
21
21
  const [isGridBoxOpened, setIsGridBoxOpened] = useState(false);
22
22
  const [defaultTreeId, setDefaultTreeId] = useState(-1);
23
- const DEFAULT_TREE_KEY_NAME = `DEFAULT_TREE_${SDK_Globals.tmSession?.SessionDescr?.archiveID}_${SDK_Globals.tmSession?.SessionDescr?.userID}`;
23
+ // const DEFAULT_TREE_KEY_NAME = `DEFAULT_TREE_${SDK_Globals.tmSession?.SessionDescr?.archiveID}_${SDK_Globals.tmSession?.SessionDescr?.userID}`;
24
24
  useEffect(() => {
25
25
  if (treeItems.length > 0 && treeItems[0].id) {
26
26
  setSelectedRowKeys([treeItems[0].id]);
@@ -30,7 +30,7 @@ const TMTreeSelector = ({ layoutMode = LayoutModes.Update, onSelectedTIDChanged,
30
30
  const setResultCache = (result) => {
31
31
  if (result && result.length > 0) {
32
32
  setTrees(result);
33
- let defaultTree = Number(LocalStorageService.getItem(DEFAULT_TREE_KEY_NAME) ?? -1);
33
+ let defaultTree = SDKUI_Globals.userSettings.searchSettings.defaultTree;
34
34
  if (defaultTree > 0) {
35
35
  setDefaultTreeId(defaultTree);
36
36
  setSelectedTreeId(defaultTree);
@@ -93,11 +93,11 @@ const TMTreeSelector = ({ layoutMode = LayoutModes.Update, onSelectedTIDChanged,
93
93
  }, []);
94
94
  return (_jsx(TMToolbarCard, { title: SDK_Localizator.Trees, totalItems: trees.length, onClose: onClose, toolbar: _jsx(TMButton, { btnStyle: 'icon', caption: defaultTreeId == selectedTreeId ? SDKUI_Localizator.TreeRemoveDefault : SDKUI_Localizator.SetAsDefault, icon: defaultTreeId == selectedTreeId ? _jsx(IconStarRemove, { color: 'rgb(243, 114, 92)' }) : _jsx(IconStar, { color: 'rgb(248, 215, 117)' }), onClick: () => {
95
95
  if (defaultTreeId == selectedTreeId) {
96
- LocalStorageService.deleteItem(DEFAULT_TREE_KEY_NAME);
96
+ SDKUI_Globals.userSettings.searchSettings.defaultTree = -1;
97
97
  setDefaultTreeId(-1);
98
98
  }
99
99
  else {
100
- LocalStorageService.setItem(DEFAULT_TREE_KEY_NAME, selectedTreeId.toString());
100
+ SDKUI_Globals.userSettings.searchSettings.defaultTree = selectedTreeId;
101
101
  setDefaultTreeId(selectedTreeId);
102
102
  }
103
103
  } }), children: trees.length > 0
@@ -110,13 +110,11 @@ const TMTreeSelector = ({ layoutMode = LayoutModes.Update, onSelectedTIDChanged,
110
110
  }, value: selectedTreeId, opened: isGridBoxOpened, valueExpr: "id", displayExpr: "nameLoc", deferRendering: false, dataSource: trees, onValueChanged: syncDataGridSelection, onOptionChanged: onGridBoxOpened, children: _jsx(TMDataGrid, { height: "100%", width: "100%", dataSource: trees, dataColumns: [
111
111
  { dataField: 'nameLoc', caption: SDKUI_Localizator.Name, width: 'auto' },
112
112
  { dataField: 'description', caption: SDKUI_Localizator.Description, width: 'auto' },
113
- ], selection: { mode: 'single', showCheckBoxesMode: "none" },
114
- // scrolling={{ mode: 'virtual', useNative: SDKUI_Globals.dataGridUseNativeScrollbar }}
115
- showRowLines: SDKUI_Globals.dataGridShowRowLines, showColumnLines: SDKUI_Globals.dataGridShowColumnLines, showHeaderFilter: false, selectedRowKeys: selectedRowKeys, onSelectionChanged: onSelectionChanged, focusedRowKey: focusedRowKey, onFocusedRowChanged: onFocusedRowChanged }) }) }), _jsx(TMLayoutItem, { height: 'calc(100% - 50px)', children: _jsxs(TreeList, { height: "100%", elementAttr: { class: 'tm-dx-treelist' }, dataSource: treeItems, showRowLines: SDKUI_Globals.dataGridShowRowLines, showColumnLines: SDKUI_Globals.dataGridShowColumnLines, showBorders: false, columnAutoWidth: true, keyExpr: "id", parentIdExpr: "parentID", dataStructure: "plain", showColumnHeaders: false, onContentReady: (e) => e.component.clearSelection(), onSelectionChanged: (e) => {
113
+ ], selection: { mode: 'single', showCheckBoxesMode: "none" }, showHeaderFilter: false, selectedRowKeys: selectedRowKeys, onSelectionChanged: onSelectionChanged, focusedRowKey: focusedRowKey, onFocusedRowChanged: onFocusedRowChanged }) }) }), _jsx(TMLayoutItem, { height: 'calc(100% - 50px)', children: _jsxs(TreeList, { height: "100%", elementAttr: { class: 'tm-dx-treelist' }, dataSource: treeItems, showRowLines: Number(SDKUI_Globals.userSettings?.themeSettings.gridSettings.showRowLines) === 1, showColumnLines: Number(SDKUI_Globals.userSettings?.themeSettings.gridSettings.showColumnLines) === 1, showBorders: false, columnAutoWidth: true, keyExpr: "id", parentIdExpr: "parentID", dataStructure: "plain", showColumnHeaders: false, onContentReady: (e) => e.component.clearSelection(), onSelectionChanged: (e) => {
116
114
  if (e.selectedRowsData[0] && e.selectedRowsData[0].type == TreeItemTypes.DcmtType) {
117
115
  onSelectedTIDChanged?.(e.selectedRowsData[0].tid, selectedTreeId);
118
116
  }
119
- }, children: [_jsx(Column, { dataField: "nameLoc", caption: SDKUI_Localizator.Name, cellRender: renderCell }), _jsx(Scrolling, { mode: "virtual", useNative: SDKUI_Globals.dataGridUseNativeScrollbar }), _jsx(Selection, { mode: "single" })] }) })] })
117
+ }, children: [_jsx(Column, { dataField: "nameLoc", caption: SDKUI_Localizator.Name, cellRender: renderCell }), _jsx(Scrolling, { mode: "virtual", useNative: Number(SDKUI_Globals.userSettings?.themeSettings.gridSettings.useNativeScrollbar) === 1 }), _jsx(Selection, { mode: "single" })] }) })] })
120
118
  : _jsx("div", { style: { display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: '100%', width: '100%', fontSize: '1.5rem' }, children: SDKUI_Localizator.TreesNoAvailable }) }));
121
119
  };
122
120
  export default TMTreeSelector;
@@ -32,7 +32,7 @@ const Select = styled.select `
32
32
  flex: 1;
33
33
  border: none;
34
34
  outline: none;
35
- font-size: ${SDKUI_Globals.userAppSettings?.appearanceSettings?.fontSize ?? '12px'};
35
+ font-size: ${SDKUI_Globals.userSettings?.themeSettings.fontSize ?? '12px'};
36
36
  padding: 6px 0;
37
37
  background: transparent;
38
38
  color: ${props => props.$color ?? '#313131'};
@@ -499,7 +499,7 @@ const TMLoginForm = (props) => {
499
499
  if (!ra) {
500
500
  ra = [];
501
501
  }
502
- ;
502
+ ; //NOSONAR
503
503
  let maxId = ra.length > 0
504
504
  ? ra.reduce((max, obj) => (obj.id > max.id ? obj : max), ra[0]).id //NOSONAR
505
505
  : 0;
@@ -584,6 +584,16 @@ const CeredentialContainer = forwardRef(({ isMobile = false, authMode = Authenti
584
584
  return usernameRef.current;
585
585
  });
586
586
  const usernameRef = useRef(null);
587
+ useEffect(() => {
588
+ setTimeout(() => {
589
+ const autoUser = usernameRef.current?.value ?? '';
590
+ const autoPass = passwordRef.current?.value ?? '';
591
+ if (autoUser !== username)
592
+ onUsernameChanged(autoUser);
593
+ if (autoPass !== password)
594
+ onPasswordChanged(autoPass);
595
+ }, 100);
596
+ }, []);
587
597
  useEffect(() => {
588
598
  if (!secondaryRef)
589
599
  return;
@@ -33,7 +33,7 @@ const Input = styled.input `
33
33
  flex: 1;
34
34
  border: none;
35
35
  outline: none;
36
- font-size: ${SDKUI_Globals.userAppSettings?.appearanceSettings?.fontSize ?? '12px'};
36
+ font-size: ${SDKUI_Globals.userSettings?.themeSettings.fontSize ?? '12px'};
37
37
  padding: 6px 30px 6px 10px;
38
38
  background: transparent;
39
39
  color: ${props => props.$color ?? '#313131'};
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useCallback, useEffect, useMemo, useState } from 'react';
3
3
  import { SDK_Globals } from '@topconsultnpm/sdk-ts-beta';
4
- import { IconApply, IconHide, IconRefresh, IconShow, SDKUI_Globals, SDKUI_Localizator } from '../../helper';
4
+ import { IconApply, IconHide, IconRefresh, IconShow, SDKUI_Localizator } from '../../helper';
5
5
  import TMButton from '../base/TMButton';
6
6
  import TMToggleButton from '../base/TMToggleButton';
7
7
  import TMModal from '../base/TMModal';
@@ -88,7 +88,7 @@ const TMChooserForm = ({ children, title, allowMultipleSelection = false, startW
88
88
  }, [manageUseLocalizedName, summaryItems]);
89
89
  return (_jsx(TMModal, { title: renderTitle(), width: width ?? '550px', height: height ?? '600px', toolbar: _jsx(ToolbarButtons, {}), onClose: onClose, children: (children ??
90
90
  filteredItems.length > 0)
91
- ? _jsx(TMDataGrid, { dataSource: filteredItems, keyExpr: keyName, dataColumns: dataColumns, focusedRowKey: focusedRowKey, selectedRowKeys: selectedRowKeys, showRowLines: SDKUI_Globals.dataGridShowRowLines, showColumnLines: SDKUI_Globals.dataGridShowColumnLines, headerFilter: { visible: true }, selection: { mode: allowMultipleSelection ? 'multiple' : 'single', showCheckBoxesMode: 'always', selectAllMode: 'allPages' }, grouping: allowGrouping ? { autoExpandAll: false, expandMode: 'rowClick' } : undefined, summary: customSummary, onFocusedRowChanged: handleFocusedRowChange, onSelectionChanged: handleSelectionChanged, onRowDblClick: handleRowDoubleClick })
91
+ ? _jsx(TMDataGrid, { dataSource: filteredItems, keyExpr: keyName, dataColumns: dataColumns, focusedRowKey: focusedRowKey, selectedRowKeys: selectedRowKeys, headerFilter: { visible: true }, selection: { mode: allowMultipleSelection ? 'multiple' : 'single', showCheckBoxesMode: 'always', selectAllMode: 'allPages' }, grouping: allowGrouping ? { autoExpandAll: false, expandMode: 'rowClick' } : undefined, summary: customSummary, onFocusedRowChanged: handleFocusedRowChange, onSelectionChanged: handleSelectionChanged, onRowDblClick: handleRowDoubleClick })
92
92
  : _jsx(TMLayoutContainer, { gap: 30, alignItems: 'center', justifyContent: 'center', children: _jsx(TMLayoutItem, { children: _jsx("p", { style: { height: "100%", color: TMColors.primaryColor, fontSize: "1.5rem", display: 'flex', alignItems: 'center', justifyContent: 'center' }, children: SDKUI_Localizator.NoDataToDisplay }) }) }) }));
93
93
  };
94
94
  export default TMChooserForm;
@@ -19,7 +19,7 @@ const cellRender = (cellData) => {
19
19
  }
20
20
  };
21
21
  const TMResultDialog = ({ title, result, id1Caption, id2Caption }) => {
22
- return (_jsx(TMModal, { height: '65%', width: '75%', title: `${SDKUI_Localizator.OperationResult} - ${title}`, children: _jsxs(TMLayoutContainer, { children: [_jsxs("div", { style: { display: 'flex', flexDirection: 'row', gap: '5px', padding: '5px', justifyContent: 'center', alignItems: 'center' }, children: [_jsx("p", { children: `${SDKUI_Localizator.ProcessedItems}: ${result.length}` }), _jsx(IconSuccessCirlce, { fontSize: 22, color: TMColors.success }), _jsx("p", { children: result.filter(o => o.resultType == ResultTypes.SUCCESS).length ?? 0 }), _jsx(IconWarning, { fontSize: 22, color: TMColors.warning }), _jsx("p", { children: result.filter(o => o.resultType == ResultTypes.WARNING).length ?? 0 }), _jsx(IconCloseCircle, { fontSize: 22, color: TMColors.error }), _jsx("p", { children: result.filter(o => o.resultType == ResultTypes.ERROR).length ?? 0 })] }), _jsxs(DataGrid, { dataSource: result.filter(o => o.resultType != ResultTypes.SUCCESS), showColumnLines: SDKUI_Globals.dataGridShowColumnLines, showRowLines: SDKUI_Globals.dataGridShowRowLines, keyExpr: "rowIndex", width: "100%", height: "100%", columnResizingMode: "widget", allowColumnResizing: true, focusedRowEnabled: true, hoverStateEnabled: true, rowAlternationEnabled: true, children: [_jsx(Column, { dataField: 'resultType', caption: '', width: "5%", allowResizing: true, allowSorting: true, cellRender: cellRender }), _jsx(Column, { dataField: 'id1', caption: id1Caption, width: "10%" }), id2Caption && _jsx(Column, { dataField: 'id2', caption: id2Caption, width: "10%" }), _jsx(Column, { dataField: 'description', allowResizing: true, caption: SDKUI_Localizator.Description, allowSorting: true, width: id2Caption ? "75%" : "85%" }), _jsx(HeaderFilter, { visible: true }), _jsx(Paging, { enabled: true, pageSize: 30 }), _jsx(Pager, { visible: true, showInfo: true, showNavigationButtons: true }), _jsx(Scrolling, { mode: 'standard', useNative: SDKUI_Globals.dataGridUseNativeScrollbar })] })] }) }));
22
+ return (_jsx(TMModal, { height: '65%', width: '75%', title: `${SDKUI_Localizator.OperationResult} - ${title}`, children: _jsxs(TMLayoutContainer, { children: [_jsxs("div", { style: { display: 'flex', flexDirection: 'row', gap: '5px', padding: '5px', justifyContent: 'center', alignItems: 'center' }, children: [_jsx("p", { children: `${SDKUI_Localizator.ProcessedItems}: ${result.length}` }), _jsx(IconSuccessCirlce, { fontSize: 22, color: TMColors.success }), _jsx("p", { children: result.filter(o => o.resultType == ResultTypes.SUCCESS).length ?? 0 }), _jsx(IconWarning, { fontSize: 22, color: TMColors.warning }), _jsx("p", { children: result.filter(o => o.resultType == ResultTypes.WARNING).length ?? 0 }), _jsx(IconCloseCircle, { fontSize: 22, color: TMColors.error }), _jsx("p", { children: result.filter(o => o.resultType == ResultTypes.ERROR).length ?? 0 })] }), _jsxs(DataGrid, { dataSource: result.filter(o => o.resultType != ResultTypes.SUCCESS), showColumnLines: Number(SDKUI_Globals.userSettings?.themeSettings.gridSettings.showRowLines) === 1, showRowLines: Number(SDKUI_Globals.userSettings?.themeSettings.gridSettings.showColumnLines) === 1, keyExpr: "rowIndex", width: "100%", height: "100%", columnResizingMode: "widget", allowColumnResizing: true, focusedRowEnabled: true, hoverStateEnabled: true, rowAlternationEnabled: true, children: [_jsx(Column, { dataField: 'resultType', caption: '', width: "5%", allowResizing: true, allowSorting: true, cellRender: cellRender }), _jsx(Column, { dataField: 'id1', caption: id1Caption, width: "10%" }), id2Caption && _jsx(Column, { dataField: 'id2', caption: id2Caption, width: "10%" }), _jsx(Column, { dataField: 'description', allowResizing: true, caption: SDKUI_Localizator.Description, allowSorting: true, width: id2Caption ? "75%" : "85%" }), _jsx(HeaderFilter, { visible: true }), _jsx(Paging, { enabled: true, pageSize: 30 }), _jsx(Pager, { visible: true, showInfo: true, showNavigationButtons: true }), _jsx(Scrolling, { mode: 'standard', useNative: Number(SDKUI_Globals.userSettings?.themeSettings.gridSettings.useNativeScrollbar) === 1 })] })] }) }));
23
23
  };
24
24
  export default TMResultDialog;
25
25
  export class TMResultManager {
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
3
  import { DcmtTypeListCacheService, ResultTypes, SDK_Globals, WorkingGroupEngine } from "@topconsultnpm/sdk-ts-beta";
4
4
  import { ContextMenu, ScrollView } from 'devextreme-react';
5
- import { SDKUI_Localizator, IconAttachment, getExceptionMessage, Globalization, IconBoard, SDKUI_Globals } from '../../helper';
5
+ import { SDKUI_Localizator, IconAttachment, getExceptionMessage, Globalization, IconBoard } from '../../helper';
6
6
  import TMDataGrid from '../base/TMDataGrid';
7
7
  import { useDeviceType, DeviceType } from '../base/TMDeviceProvider';
8
8
  import { TMMessageBoxManager, ButtonNames } from '../base/TMPopUp';
@@ -514,7 +514,7 @@ const TMBlogs = (props) => {
514
514
  { dataField: "attachments", caption: SDKUI_Localizator.RefersTo, dataType: 'string', visible: true, cellRender: cellAttachmentsRender },
515
515
  ];
516
516
  }, [localShowId, showIconHeader, searchText]);
517
- return _jsx(TMLayoutWaitingContainer, { direction: 'vertical', showWaitPanel: showWaitPanel, showWaitPanelPrimary: showPrimary, showWaitPanelSecondary: showSecondary, waitPanelTitle: waitPanelTitle, waitPanelTextPrimary: waitPanelTextPrimary, waitPanelValuePrimary: waitPanelValuePrimary, waitPanelMaxValuePrimary: waitPanelMaxValuePrimary, waitPanelTextSecondary: waitPanelTextSecondary, waitPanelValueSecondary: waitPanelValueSecondary, waitPanelMaxValueSecondary: waitPanelMaxValueSecondary, isCancelable: true, abortController: abortController, children: _jsx(TMDataGrid, { ref: gridRef, showSearchPanel: false, dataSource: blogPosts ?? [], dataColumns: dataColumns, selection: { mode: 'none' }, focusedRowKey: focusedBlog?.id, onFocusedRowChanged: onFocusedRowChanged, showRowLines: SDKUI_Globals.dataGridShowRowLines, showColumnLines: SDKUI_Globals.dataGridShowColumnLines, onContextMenuPreparing: onContextMenuPreparing }) });
517
+ return _jsx(TMLayoutWaitingContainer, { direction: 'vertical', showWaitPanel: showWaitPanel, showWaitPanelPrimary: showPrimary, showWaitPanelSecondary: showSecondary, waitPanelTitle: waitPanelTitle, waitPanelTextPrimary: waitPanelTextPrimary, waitPanelValuePrimary: waitPanelValuePrimary, waitPanelMaxValuePrimary: waitPanelMaxValuePrimary, waitPanelTextSecondary: waitPanelTextSecondary, waitPanelValueSecondary: waitPanelValueSecondary, waitPanelMaxValueSecondary: waitPanelMaxValueSecondary, isCancelable: true, abortController: abortController, children: _jsx(TMDataGrid, { ref: gridRef, showSearchPanel: false, dataSource: blogPosts ?? [], dataColumns: dataColumns, selection: { mode: 'none' }, focusedRowKey: focusedBlog?.id, onFocusedRowChanged: onFocusedRowChanged, onContextMenuPreparing: onContextMenuPreparing }) });
518
518
  };
519
519
  const toggleViewMode = () => {
520
520
  setRenderMode((prevViewMode) => (prevViewMode === 'details' ? 'thumbnails' : 'details'));
@@ -203,7 +203,7 @@ const TMPage = ({ id, objClass = ObjectClasses.None, lastRefreshTime, objType, l
203
203
  return;
204
204
  setSelectedItems([row.data]);
205
205
  setShowList(false);
206
- }, showColumnLines: SDKUI_Globals.dataGridShowColumnLines, showRowLines: SDKUI_Globals.dataGridShowRowLines, onSelectionChanged: (e) => { setSelectedItems(e.selectedRowsData); onSelectionChanged?.(e.selectedRowsData); }, children: [_jsx(GroupPanel, { visible: !!(deviceType !== DeviceType.MOBILE && showAllColumns) }), _jsx(SearchPanel, { visible: false }), _jsx(Grouping, { autoExpandAll: false }), _jsx(HeaderFilter, { visible: true }), _jsx(Selection, { mode: "multiple", showCheckBoxesMode: "onClick", selectAllMode: 'allPages' }), _jsx(Scrolling, { mode: "standard", useNative: SDKUI_Globals.dataGridUseNativeScrollbar }), _jsx(Paging, { pageSize: 25 }), _jsx(Pager, { visible: true, showInfo: true, showNavigationButtons: true }), _jsx(LoadPanel, { enabled: true }), _jsx(Column, { width: 20, cellRender: cellRenderObjectIcon }), _jsx(Column, { width: 'auto', visible: showId, dataField: "id", caption: "ID" }), _jsx(Column, { width: 250, dataField: "name", caption: SDKUI_Localizator.Name, sortOrder: "asc" }), _jsx(Column, { width: 250, visible: showAllColumns, dataField: "description", caption: SDKUI_Localizator.Description }), customColumns?.map((item, index) => { return React.cloneElement(item, { key: index, visible: showAllColumns }); }), _jsx(Column, { width: 'auto', visible: showAllColumns, dataField: "ownerID", caption: SDKUI_Localizator.OwnerID }), _jsx(Column, { width: 'auto', visible: showAllColumns, dataField: "ownerName", caption: SDKUI_Localizator.OwnerName }), _jsx(Column, { width: 'auto', dataType: "date", format: Globalization.getDateDisplayFormat(), visible: showAllColumns, dataField: "creationTime", caption: SDKUI_Localizator.CreationTime }), _jsx(Column, { width: 'auto', dataType: "date", format: Globalization.getDateDisplayFormat(), visible: showAllColumns, dataField: "lastUpdateTime", caption: SDKUI_Localizator.LastUpdateTime })] })] }), detailInsteadOfContent ??
206
+ }, showColumnLines: Number(SDKUI_Globals.userSettings?.themeSettings.gridSettings.showColumnLines) === 1, showRowLines: Number(SDKUI_Globals.userSettings?.themeSettings.gridSettings.showRowLines) === 1, onSelectionChanged: (e) => { setSelectedItems(e.selectedRowsData); onSelectionChanged?.(e.selectedRowsData); }, children: [_jsx(GroupPanel, { visible: !!(deviceType !== DeviceType.MOBILE && showAllColumns) }), _jsx(SearchPanel, { visible: false }), _jsx(Grouping, { autoExpandAll: false }), _jsx(HeaderFilter, { visible: true }), _jsx(Selection, { mode: "multiple", showCheckBoxesMode: "onClick", selectAllMode: 'allPages' }), _jsx(Scrolling, { mode: "standard", useNative: Number(SDKUI_Globals.userSettings?.themeSettings.gridSettings.useNativeScrollbar) === 1 }), _jsx(Paging, { pageSize: 25 }), _jsx(Pager, { visible: true, showInfo: true, showNavigationButtons: true }), _jsx(LoadPanel, { enabled: true }), _jsx(Column, { width: 20, cellRender: cellRenderObjectIcon }), _jsx(Column, { width: 'auto', visible: showId, dataField: "id", caption: "ID" }), _jsx(Column, { width: 250, dataField: "name", caption: SDKUI_Localizator.Name, sortOrder: "asc" }), _jsx(Column, { width: 250, visible: showAllColumns, dataField: "description", caption: SDKUI_Localizator.Description }), customColumns?.map((item, index) => { return React.cloneElement(item, { key: index, visible: showAllColumns }); }), _jsx(Column, { width: 'auto', visible: showAllColumns, dataField: "ownerID", caption: SDKUI_Localizator.OwnerID }), _jsx(Column, { width: 'auto', visible: showAllColumns, dataField: "ownerName", caption: SDKUI_Localizator.OwnerName }), _jsx(Column, { width: 'auto', dataType: "date", format: Globalization.getDateDisplayFormat(), visible: showAllColumns, dataField: "creationTime", caption: SDKUI_Localizator.CreationTime }), _jsx(Column, { width: 'auto', dataType: "date", format: Globalization.getDateDisplayFormat(), visible: showAllColumns, dataField: "lastUpdateTime", caption: SDKUI_Localizator.LastUpdateTime })] })] }), detailInsteadOfContent ??
207
207
  _jsx(TMLayoutItem, { children: selectedItems.length == 1 || formMode == FormModes.Create || formMode == FormModes.Duplicate ?
208
208
  _jsx(TMToolbarCard, { onBack: deviceType === DeviceType.MOBILE ? () => setShowList(true) : undefined, title: calcSaveFormTitle(objName, formMode, selectedItems.length == 0 ? -1 : selectedItems[0].id, detailTitlePathKeys), children: getDetailFormWithProps() })
209
209
  :
@@ -6,39 +6,41 @@ import TMDropDown from '../editors/TMDropDown';
6
6
  import TMCheckBox from '../editors/TMCheckBox';
7
7
  import TMButton from '../base/TMButton';
8
8
  import { SDKUI_Globals, SDKUI_Localizator } from '../../helper';
9
+ const fontSizes = [
10
+ { value: "10px", display: "10px" },
11
+ { value: "11px", display: "11px" },
12
+ { value: "12px", display: "12px" },
13
+ { value: "13px", display: "13px" },
14
+ { value: "14px", display: "14px" },
15
+ { value: "15px", display: "15px" },
16
+ { value: "16px", display: "16px" },
17
+ { value: "17px", display: "17px" },
18
+ { value: "18px", display: "18px" },
19
+ { value: "19px", display: "19px" },
20
+ { value: "20px", display: "20px" }
21
+ ];
9
22
  const SettingsAppearance = () => {
10
- const [currentFontSize, setCurrentFontSize] = useState(localStorage.getItem("fontSize") ?? FontSize.defaultFontSizeInPixel);
11
- const [dataGridShowRowLines, setDataGridShowRowLines] = useState(Number(localStorage.getItem("dataGridShowRowLines") ?? 0));
12
- const [dataGridShowColumnLines, setDataGridShowColumnLines] = useState(Number(localStorage.getItem("dataGridShowColumnLines") ?? 0));
13
- const [dataGridUseNativeScrollbar, setDataGridUseNativeScrollbar] = useState(Number(localStorage.getItem("dataGridUseNativeScrollbar") ?? 1));
14
- const fontSizes = [
15
- { value: "10px", display: "10px" },
16
- { value: "11px", display: "11px" },
17
- { value: "12px", display: "12px" },
18
- { value: "13px", display: "13px" },
19
- { value: "14px", display: "14px" },
20
- { value: "15px", display: "15px" },
21
- { value: "16px", display: "16px" },
22
- { value: "17px", display: "17px" },
23
- { value: "18px", display: "18px" },
24
- { value: "19px", display: "19px" },
25
- { value: "20px", display: "20px" }
26
- ];
27
- return (_jsxs(TMLayoutContainer, { children: [_jsx("p", { style: { fontSize: '1.h1rem', fontWeight: 'bold' }, children: 'Font' }), _jsx(TMDropDown, { label: SDKUI_Localizator.Size, dataSource: fontSizes, width: '150px', value: currentFontSize, onValueChanged: (e) => {
23
+ const [, forceUpdate] = useState(0); // Dummy state to force re-renders
24
+ const triggerUIUpdate = () => forceUpdate((prev) => prev + 1); // Increment dummy state to re-render
25
+ return (_jsxs(TMLayoutContainer, { children: [_jsx("p", { style: { fontSize: '1.h1rem', fontWeight: 'bold' }, children: 'Font' }), _jsx(TMDropDown, { label: SDKUI_Localizator.Size, dataSource: fontSizes, width: '150px', value: SDKUI_Globals.userSettings.themeSettings.fontSize, onValueChanged: (e) => {
28
26
  let newpx = e.target.value;
29
- document.documentElement.style.setProperty('--base-font-size', newpx);
30
- localStorage.setItem('fontSize', newpx);
31
- setCurrentFontSize(newpx);
32
- } }), _jsx("p", { style: { fontSize: '1rem', fontWeight: 'bold', marginTop: '10px', marginBottom: '5px' }, children: 'Griglie' }), _jsx(TMCheckBox, { value: dataGridShowRowLines, onValueChanged: (newValue) => { SDKUI_Globals.dataGridShowRowLines = (newValue == 1); setDataGridShowRowLines(newValue); localStorage.setItem("dataGridShowRowLines", newValue); }, label: 'Mostra le linee che separano le righe' }), _jsx(TMCheckBox, { value: dataGridShowColumnLines, onValueChanged: (newValue) => { SDKUI_Globals.dataGridShowColumnLines = (newValue == 1); setDataGridShowColumnLines(newValue); localStorage.setItem("dataGridShowColumnLines", newValue); }, label: 'Mostra le linee che separano le colonne' }), _jsx(TMCheckBox, { value: dataGridUseNativeScrollbar, onValueChanged: (newValue) => { SDKUI_Globals.dataGridUseNativeScrollbar = (newValue == 1); setDataGridUseNativeScrollbar(newValue); localStorage.setItem("dataGridUseNativeScrollbar", newValue); }, label: 'Usa la scrollbar nativa' }), _jsx(TMButton, { elementStyle: { marginTop: '10px' }, caption: SDKUI_Localizator.Restore, showTooltip: false, onClick: () => {
33
- localStorage.removeItem("fontSize");
34
- localStorage.removeItem("dataGridShowRowLines");
35
- localStorage.removeItem("dataGridShowColumnLines");
36
- localStorage.removeItem("dataGridUseNativeScrollbar");
37
- document.documentElement.style.setProperty('--base-font-size', FontSize.defaultFontSizeInPixel);
38
- setCurrentFontSize(FontSize.defaultFontSizeInPixel);
39
- setDataGridShowColumnLines(0);
40
- setDataGridShowRowLines(0);
41
- setDataGridUseNativeScrollbar(1);
27
+ SDKUI_Globals.userSettings.themeSettings.fontSize = newpx;
28
+ triggerUIUpdate();
29
+ } }), _jsx("p", { style: { fontSize: '1rem', fontWeight: 'bold', marginTop: '10px', marginBottom: '5px' }, children: 'Griglie' }), _jsx(TMCheckBox, { label: 'Mostra le linee che separano le righe', value: SDKUI_Globals.userSettings.themeSettings.gridSettings.showRowLines, onValueChanged: (newValue) => {
30
+ SDKUI_Globals.userSettings.themeSettings.gridSettings.showRowLines = newValue;
31
+ triggerUIUpdate();
32
+ } }), _jsx(TMCheckBox, { label: 'Mostra le linee che separano le colonne', value: SDKUI_Globals.userSettings.themeSettings.gridSettings.showColumnLines, onValueChanged: (newValue) => {
33
+ SDKUI_Globals.userSettings.themeSettings.gridSettings.showColumnLines = newValue;
34
+ triggerUIUpdate();
35
+ } }), _jsx(TMCheckBox, { label: 'Usa la scrollbar nativa', value: SDKUI_Globals.userSettings.themeSettings.gridSettings.useNativeScrollbar, onValueChanged: (newValue) => {
36
+ SDKUI_Globals.userSettings.themeSettings.gridSettings.useNativeScrollbar = newValue;
37
+ triggerUIUpdate();
38
+ } }), _jsx(TMButton, { elementStyle: { marginTop: '10px' }, caption: SDKUI_Localizator.Restore, showTooltip: false, onClick: () => {
39
+ SDKUI_Globals.userSettings.themeSettings.fontSize = FontSize.defaultFontSizeInPixel;
40
+ SDKUI_Globals.userSettings.themeSettings.gridSettings.showRowLines = 0;
41
+ SDKUI_Globals.userSettings.themeSettings.gridSettings.showColumnLines = 0;
42
+ SDKUI_Globals.userSettings.themeSettings.gridSettings.useNativeScrollbar = 1;
43
+ triggerUIUpdate();
42
44
  } })] }));
43
45
  };
44
46
  export default SettingsAppearance;
@@ -1,15 +1,41 @@
1
- import { InvoiceRetrieveFormats, OrderRetrieveFormats, UserAppSettings } from "@topconsultnpm/sdk-ts-beta";
1
+ import { InvoiceRetrieveFormats, OrderRetrieveFormats } from "@topconsultnpm/sdk-ts-beta";
2
+ export declare class UserSettings {
3
+ userID: number | undefined;
4
+ archiveID: string | undefined;
5
+ landingPage: string;
6
+ themeSettings: ThemeSettings;
7
+ searchSettings: SearchSettings2;
8
+ archivingSettings: ArchivingSettings;
9
+ fullTextSettings: FullTextSettings;
10
+ /** Load settings from local storage or other sources */
11
+ static LoadSettings(userID: number | undefined, archiveID: string | undefined): UserSettings;
12
+ /** Save settings to local storage or other sources */
13
+ static SaveSettings(settings: UserSettings): void;
14
+ }
15
+ export declare class DataGridSettings {
16
+ showColumnLines: number;
17
+ showRowLines: number;
18
+ rowAlternationEnabled: number;
19
+ useNativeScrollbar: number;
20
+ }
21
+ export declare class ThemeSettings {
22
+ fontSize: string;
23
+ gridSettings: DataGridSettings;
24
+ gutters: string;
25
+ }
26
+ export declare class SearchSettings2 {
27
+ invoiceRetrieveFormat: InvoiceRetrieveFormats;
28
+ orderRetrieveFormat: OrderRetrieveFormats;
29
+ mruTIDs: number[];
30
+ defaultTree: number;
31
+ previewThreshold: number;
32
+ }
33
+ export declare class ArchivingSettings {
34
+ mruTIDs: number[];
35
+ }
36
+ export declare class FullTextSettings {
37
+ mruTerms: string[];
38
+ }
2
39
  export declare class SDKUI_Globals {
3
- static userAppSettings: UserAppSettings | undefined;
4
- private static _dataGridShowRowLines;
5
- private static _dataGridShowColumnLines;
6
- private static _dataGridUseNativeScrollbar;
7
- static get dataGridShowRowLines(): boolean | undefined;
8
- static set dataGridShowRowLines(theDataGridShowRowLines: boolean | undefined);
9
- static get dataGridShowColumnLines(): boolean | undefined;
10
- static set dataGridShowColumnLines(theDataGridShowColumnLines: boolean | undefined);
11
- static get dataGridUseNativeScrollbar(): boolean | undefined;
12
- static set dataGridUseNativeScrollbar(theDataGridUseNativeScrollbar: boolean | undefined);
13
- static invoiceRetrieveFormat: InvoiceRetrieveFormats | undefined;
14
- static orderRetrieveFormat: OrderRetrieveFormats | undefined;
40
+ static userSettings: UserSettings;
15
41
  }
@@ -1,8 +1,106 @@
1
+ import { InvoiceRetrieveFormats, LocalStorageService, OrderRetrieveFormats } from "@topconsultnpm/sdk-ts-beta";
2
+ import { FontSize } from "../utils/theme";
3
+ export class UserSettings {
4
+ constructor() {
5
+ this.userID = undefined;
6
+ this.archiveID = undefined;
7
+ this.landingPage = '';
8
+ this.themeSettings = new ThemeSettings();
9
+ this.searchSettings = new SearchSettings2();
10
+ this.archivingSettings = new ArchivingSettings();
11
+ this.fullTextSettings = new FullTextSettings();
12
+ }
13
+ /** Load settings from local storage or other sources */
14
+ static LoadSettings(userID, archiveID) {
15
+ if (!userID || !archiveID) {
16
+ throw new Error('User ID and Archive ID are required to load settings.');
17
+ }
18
+ // Load settings from local storage
19
+ const loadedSettings = LocalStorageService.getItem(`userSettings_${archiveID}_${userID}`);
20
+ // Merge loaded settings with default settings
21
+ const defaultSettings = new UserSettings();
22
+ const settings = Object.assign(defaultSettings, loadedSettings);
23
+ // Ensure userID and archiveID are set
24
+ settings.userID = userID;
25
+ settings.archiveID = archiveID;
26
+ document.documentElement.style.setProperty('--base-font-size', settings.themeSettings.fontSize);
27
+ // Wrap the settings object in a Proxy to intercept property updates
28
+ return createProxy(settings, UserSettings.SaveSettings);
29
+ }
30
+ /** Save settings to local storage or other sources */
31
+ static SaveSettings(settings) {
32
+ if (!settings.userID || !settings.archiveID) {
33
+ throw new Error('User ID and Archive ID are required to save settings.');
34
+ }
35
+ const defaultSettings = new UserSettings();
36
+ const filteredSettings = Object.fromEntries(Object.entries(settings).filter(([key, value]) => {
37
+ const defaultValue = defaultSettings[key];
38
+ return JSON.stringify(value) !== JSON.stringify(defaultValue);
39
+ }));
40
+ LocalStorageService.setItem(`userSettings_${settings.archiveID}_${settings.userID}`, JSON.stringify(filteredSettings));
41
+ }
42
+ }
43
+ export class DataGridSettings {
44
+ constructor() {
45
+ this.showColumnLines = 0;
46
+ this.showRowLines = 0;
47
+ this.rowAlternationEnabled = 0;
48
+ this.useNativeScrollbar = 1;
49
+ }
50
+ }
51
+ export class ThemeSettings {
52
+ constructor() {
53
+ // theme: string | undefined; ...dark or light
54
+ this.fontSize = FontSize.defaultFontSizeInPixel;
55
+ this.gridSettings = new DataGridSettings();
56
+ this.gutters = '20px';
57
+ }
58
+ }
59
+ export class SearchSettings2 {
60
+ constructor() {
61
+ this.invoiceRetrieveFormat = InvoiceRetrieveFormats.ASW_PDF;
62
+ this.orderRetrieveFormat = OrderRetrieveFormats.ER_PDF;
63
+ this.mruTIDs = [];
64
+ this.defaultTree = -1;
65
+ this.previewThreshold = 500000;
66
+ // filterPageSettings?: FilterPageSettings;
67
+ // resultPageSettings?: ResultPageSettings;
68
+ // dcmtPageSettings?: DcmtPageSettings;
69
+ }
70
+ }
71
+ export class ArchivingSettings {
72
+ constructor() {
73
+ this.mruTIDs = [];
74
+ }
75
+ }
76
+ export class FullTextSettings {
77
+ constructor() {
78
+ this.mruTerms = [];
79
+ }
80
+ }
1
81
  export class SDKUI_Globals {
2
- static get dataGridShowRowLines() { return this._dataGridShowRowLines; }
3
- static set dataGridShowRowLines(theDataGridShowRowLines) { this._dataGridShowRowLines = theDataGridShowRowLines; }
4
- static get dataGridShowColumnLines() { return this._dataGridShowColumnLines; }
5
- static set dataGridShowColumnLines(theDataGridShowColumnLines) { this._dataGridShowColumnLines = theDataGridShowColumnLines; }
6
- static get dataGridUseNativeScrollbar() { return this._dataGridUseNativeScrollbar; }
7
- static set dataGridUseNativeScrollbar(theDataGridUseNativeScrollbar) { this._dataGridUseNativeScrollbar = theDataGridUseNativeScrollbar; }
82
+ }
83
+ SDKUI_Globals.userSettings = new UserSettings();
84
+ function createProxy(obj, saveCallback, rootObj) {
85
+ const root = rootObj || obj; // Use the provided root object or default to the current object
86
+ return new Proxy(obj, {
87
+ set(target, prop, value) {
88
+ target[prop] = value;
89
+ // Automatically save the root object
90
+ saveCallback(root);
91
+ // Handle specific property (fontSize) updates
92
+ if (prop === 'fontSize' && root instanceof UserSettings) {
93
+ document.documentElement.style.setProperty('--base-font-size', value);
94
+ }
95
+ return true;
96
+ },
97
+ get(target, prop) {
98
+ const value = target[prop];
99
+ // Recursively wrap nested objects
100
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
101
+ return createProxy(value, saveCallback, root);
102
+ }
103
+ return value;
104
+ }
105
+ });
8
106
  }
@@ -35,8 +35,8 @@ export function useDcmtOperations() {
35
35
  abortController = new AbortController();
36
36
  const rfo = new RetrieveFileOptions();
37
37
  rfo.retrieveReason = DcmtOpers.ShowFile;
38
- rfo.invoiceRetrieveFormat = SDKUI_Globals.invoiceRetrieveFormat;
39
- rfo.orderRetrieveFormat = SDKUI_Globals.orderRetrieveFormat;
38
+ rfo.invoiceRetrieveFormat = SDKUI_Globals.userSettings?.searchSettings?.invoiceRetrieveFormat;
39
+ rfo.orderRetrieveFormat = SDKUI_Globals.userSettings?.searchSettings?.orderRetrieveFormat;
40
40
  let result = [];
41
41
  setWaitPanelMaxValuePrimary(inputDcmts.length);
42
42
  let firstBlock = true;
@@ -4,7 +4,7 @@ export declare class PlatformObjectService {
4
4
  static readonly retrieveAllAsync: (objClass: ObjectClasses, jobType?: JobTypes) => Promise<DcmtTypeDescriptor[] | import("@topconsultnpm/sdk-ts-beta").UserDescriptor[] | import("@topconsultnpm/sdk-ts-beta").FEDistillerJobDescriptor[] | import("@topconsultnpm/sdk-ts-beta").AreaDescriptor[] | import("@topconsultnpm/sdk-ts-beta").DataListDescriptor[] | import("@topconsultnpm/sdk-ts-beta").DiskDescriptor[] | import("@topconsultnpm/sdk-ts-beta").GroupDescriptor[] | import("@topconsultnpm/sdk-ts-beta").LDAPDescriptor[] | import("@topconsultnpm/sdk-ts-beta").NumeratorDescriptor[] | import("@topconsultnpm/sdk-ts-beta").SignCertDescriptor[] | import("@topconsultnpm/sdk-ts-beta").SignServerDescriptor[] | import("@topconsultnpm/sdk-ts-beta").TreeDescriptor[] | import("@topconsultnpm/sdk-ts-beta").TSADescriptor[] | ProcessDescriptor[] | import("@topconsultnpm/sdk-ts-beta").TaskDescriptor[] | undefined>;
5
5
  private static readonly loadCacheForJobAsync;
6
6
  private static readonly retrieveAdminJobAsync;
7
- static readonly retrieveAdminAsync: (objClass: ObjectClasses, jobType: JobTypes, id: number) => Promise<DcmtTypeDescriptor | import("@topconsultnpm/sdk-ts-beta").SavedQueryDescriptor | -1 | import("@topconsultnpm/sdk-ts-beta").DataListDescriptor | import("@topconsultnpm/sdk-ts-beta").UserDescriptor | import("@topconsultnpm/sdk-ts-beta").BarcodeArchiverJobDescriptor | import("@topconsultnpm/sdk-ts-beta").BatchUpdaterJobDescriptor | import("@topconsultnpm/sdk-ts-beta").CassettoDoganaleJobDescriptor | import("@topconsultnpm/sdk-ts-beta").CassettoDoganalePlusJobDescriptor | import("@topconsultnpm/sdk-ts-beta").CassettoFiscaleQueryJobDescriptor | import("@topconsultnpm/sdk-ts-beta").CassettoFiscaleSenderJobDescriptor | import("@topconsultnpm/sdk-ts-beta").CheckSequenceJobDescriptor | import("@topconsultnpm/sdk-ts-beta").COSCheckerJobDescriptor | import("@topconsultnpm/sdk-ts-beta").DcmtConverterJobDescriptor | import("@topconsultnpm/sdk-ts-beta").DcmtDeleterJobDescriptor | import("@topconsultnpm/sdk-ts-beta").DcmtNoteJobDescriptor | import("@topconsultnpm/sdk-ts-beta").DcmtPrinterJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FEAttacherJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FECreatorTxtJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FEDetacherJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FEDistillerJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FESenderWsJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FESplitterJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FEValidatorJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FileArchiverJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FileCheckerJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FileExecJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FileExportJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FileMoverJobDescriptor | import("@topconsultnpm/sdk-ts-beta").LexJobDescriptor | import("@topconsultnpm/sdk-ts-beta").LinkerJobDescriptor | import("@topconsultnpm/sdk-ts-beta").MailArchiverJobDescriptor | import("@topconsultnpm/sdk-ts-beta").MailQueryJobDescriptor | import("@topconsultnpm/sdk-ts-beta").MailSenderJobDescriptor | import("@topconsultnpm/sdk-ts-beta").MigrationJobDescriptor | import("@topconsultnpm/sdk-ts-beta").PdDCreatorJobDescriptor | import("@topconsultnpm/sdk-ts-beta").PDFArchiverJobDescriptor | import("@topconsultnpm/sdk-ts-beta").PdVArchiverJobDescriptor | import("@topconsultnpm/sdk-ts-beta").PdVQueryJobDescriptor | import("@topconsultnpm/sdk-ts-beta").PdVSenderJobDescriptor | import("@topconsultnpm/sdk-ts-beta").PeppolQueryJobDescriptor | import("@topconsultnpm/sdk-ts-beta").PeppolSenderJobDescriptor | import("@topconsultnpm/sdk-ts-beta").PostelQueryJobDescriptor | import("@topconsultnpm/sdk-ts-beta").PostelSenderJobDescriptor | import("@topconsultnpm/sdk-ts-beta").ReplicatorJobDescriptor | import("@topconsultnpm/sdk-ts-beta").SAPAlignerJobDescriptor | import("@topconsultnpm/sdk-ts-beta").SAPBarcodeJobDescriptor | import("@topconsultnpm/sdk-ts-beta").SAPDataReaderJobDescriptor | import("@topconsultnpm/sdk-ts-beta").SAPDataWriterJobDescriptor | import("@topconsultnpm/sdk-ts-beta").SignerJobDescriptor | import("@topconsultnpm/sdk-ts-beta").SpoolArchiverJobDescriptor | import("@topconsultnpm/sdk-ts-beta").UpdaterJobDescriptor | import("@topconsultnpm/sdk-ts-beta").AreaDescriptor | import("@topconsultnpm/sdk-ts-beta").BasketTypeDescriptor | import("@topconsultnpm/sdk-ts-beta").DiskDescriptor | import("@topconsultnpm/sdk-ts-beta").GroupDescriptor | import("@topconsultnpm/sdk-ts-beta").LDAPDescriptor | import("@topconsultnpm/sdk-ts-beta").NumeratorDescriptor | import("@topconsultnpm/sdk-ts-beta").SignCertDescriptor | import("@topconsultnpm/sdk-ts-beta").SignServerDescriptor | import("@topconsultnpm/sdk-ts-beta").TreeDescriptor | import("@topconsultnpm/sdk-ts-beta").TSADescriptor | ProcessDescriptor | import("@topconsultnpm/sdk-ts-beta").TaskDescriptor | import("@topconsultnpm/sdk-ts-beta").WorkingGroupDescriptor | undefined>;
7
+ static readonly retrieveAdminAsync: (objClass: ObjectClasses, jobType: JobTypes, id: number) => Promise<-1 | DcmtTypeDescriptor | import("@topconsultnpm/sdk-ts-beta").SavedQueryDescriptor | import("@topconsultnpm/sdk-ts-beta").DataListDescriptor | import("@topconsultnpm/sdk-ts-beta").UserDescriptor | import("@topconsultnpm/sdk-ts-beta").BarcodeArchiverJobDescriptor | import("@topconsultnpm/sdk-ts-beta").BatchUpdaterJobDescriptor | import("@topconsultnpm/sdk-ts-beta").CassettoDoganaleJobDescriptor | import("@topconsultnpm/sdk-ts-beta").CassettoDoganalePlusJobDescriptor | import("@topconsultnpm/sdk-ts-beta").CassettoFiscaleQueryJobDescriptor | import("@topconsultnpm/sdk-ts-beta").CassettoFiscaleSenderJobDescriptor | import("@topconsultnpm/sdk-ts-beta").CheckSequenceJobDescriptor | import("@topconsultnpm/sdk-ts-beta").COSCheckerJobDescriptor | import("@topconsultnpm/sdk-ts-beta").DcmtConverterJobDescriptor | import("@topconsultnpm/sdk-ts-beta").DcmtDeleterJobDescriptor | import("@topconsultnpm/sdk-ts-beta").DcmtNoteJobDescriptor | import("@topconsultnpm/sdk-ts-beta").DcmtPrinterJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FEAttacherJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FECreatorTxtJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FEDetacherJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FEDistillerJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FESenderWsJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FESplitterJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FEValidatorJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FileArchiverJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FileCheckerJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FileExecJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FileExportJobDescriptor | import("@topconsultnpm/sdk-ts-beta").FileMoverJobDescriptor | import("@topconsultnpm/sdk-ts-beta").LexJobDescriptor | import("@topconsultnpm/sdk-ts-beta").LinkerJobDescriptor | import("@topconsultnpm/sdk-ts-beta").MailArchiverJobDescriptor | import("@topconsultnpm/sdk-ts-beta").MailQueryJobDescriptor | import("@topconsultnpm/sdk-ts-beta").MailSenderJobDescriptor | import("@topconsultnpm/sdk-ts-beta").MigrationJobDescriptor | import("@topconsultnpm/sdk-ts-beta").PdDCreatorJobDescriptor | import("@topconsultnpm/sdk-ts-beta").PDFArchiverJobDescriptor | import("@topconsultnpm/sdk-ts-beta").PdVArchiverJobDescriptor | import("@topconsultnpm/sdk-ts-beta").PdVQueryJobDescriptor | import("@topconsultnpm/sdk-ts-beta").PdVSenderJobDescriptor | import("@topconsultnpm/sdk-ts-beta").PeppolQueryJobDescriptor | import("@topconsultnpm/sdk-ts-beta").PeppolSenderJobDescriptor | import("@topconsultnpm/sdk-ts-beta").PostelQueryJobDescriptor | import("@topconsultnpm/sdk-ts-beta").PostelSenderJobDescriptor | import("@topconsultnpm/sdk-ts-beta").ReplicatorJobDescriptor | import("@topconsultnpm/sdk-ts-beta").SAPAlignerJobDescriptor | import("@topconsultnpm/sdk-ts-beta").SAPBarcodeJobDescriptor | import("@topconsultnpm/sdk-ts-beta").SAPDataReaderJobDescriptor | import("@topconsultnpm/sdk-ts-beta").SAPDataWriterJobDescriptor | import("@topconsultnpm/sdk-ts-beta").SignerJobDescriptor | import("@topconsultnpm/sdk-ts-beta").SpoolArchiverJobDescriptor | import("@topconsultnpm/sdk-ts-beta").UpdaterJobDescriptor | import("@topconsultnpm/sdk-ts-beta").AreaDescriptor | import("@topconsultnpm/sdk-ts-beta").BasketTypeDescriptor | import("@topconsultnpm/sdk-ts-beta").DiskDescriptor | import("@topconsultnpm/sdk-ts-beta").GroupDescriptor | import("@topconsultnpm/sdk-ts-beta").LDAPDescriptor | import("@topconsultnpm/sdk-ts-beta").NumeratorDescriptor | import("@topconsultnpm/sdk-ts-beta").SignCertDescriptor | import("@topconsultnpm/sdk-ts-beta").SignServerDescriptor | import("@topconsultnpm/sdk-ts-beta").TreeDescriptor | import("@topconsultnpm/sdk-ts-beta").TSADescriptor | ProcessDescriptor | import("@topconsultnpm/sdk-ts-beta").TaskDescriptor | import("@topconsultnpm/sdk-ts-beta").WorkingGroupDescriptor | undefined>;
8
8
  private static readonly updateJobAsync;
9
9
  static readonly updateAsync: (objClass: ObjectClasses, jobType: JobTypes, d: any) => Promise<number | undefined>;
10
10
  private static readonly createJobAsync;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@topconsultnpm/sdkui-react-beta",
3
- "version": "6.12.102",
3
+ "version": "6.12.104",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1",