@topconsultnpm/sdkui-react 6.22.0-dev2.19 → 6.22.0-dev2.20
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 +1 -1
- package/lib/components/NewComponents/FloatingMenuBar/TMFloatingMenuBar.js +1 -1
- package/lib/components/base/TMDataGrid.d.ts +2 -0
- package/lib/components/base/TMDataGrid.js +68 -4
- package/lib/components/base/TMModal.d.ts +4 -0
- package/lib/components/base/TMModal.js +42 -11
- package/lib/components/features/documents/TMDcmtForm.d.ts +7 -0
- package/lib/components/features/documents/TMDcmtForm.js +94 -40
- package/lib/components/features/documents/TMMasterDetailDcmts.js +88 -30
- package/lib/components/features/documents/TMMasterInfoFields.d.ts +19 -0
- package/lib/components/features/documents/TMMasterInfoFields.js +172 -0
- package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.d.ts +40 -0
- package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.js +256 -0
- package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.d.ts +352 -0
- package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.js +221 -0
- package/lib/components/features/documents/TMRelationViewer.d.ts +14 -1
- package/lib/components/features/documents/TMRelationViewer.js +69 -20
- package/lib/components/features/search/TMSearchResult.d.ts +8 -0
- package/lib/components/features/search/TMSearchResult.js +131 -23
- package/lib/components/layout/panelManager/TMPanelManagerContainer.d.ts +1 -0
- package/lib/components/layout/panelManager/TMPanelManagerContainer.js +24 -14
- package/lib/components/layout/panelManager/TMPanelWrapper.js +2 -2
- package/lib/components/layout/panelManager/types.d.ts +3 -0
- package/lib/helper/SDKUI_Globals.d.ts +34 -0
- package/lib/helper/SDKUI_Globals.js +37 -0
- package/lib/helper/SDKUI_Localizator.d.ts +18 -0
- package/lib/helper/SDKUI_Localizator.js +180 -0
- package/lib/helper/TMIcons.d.ts +1 -0
- package/lib/helper/TMIcons.js +3 -0
- package/lib/helper/dcmtsHelper.d.ts +20 -0
- package/lib/helper/dcmtsHelper.js +58 -1
- package/lib/helper/helpers.d.ts +9 -0
- package/lib/helper/helpers.js +8 -0
- package/lib/hooks/useArchiveListForm.d.ts +39 -0
- package/lib/hooks/useArchiveListForm.js +46 -0
- package/lib/hooks/useDocumentOperations.d.ts +1 -0
- package/lib/hooks/useDocumentOperations.js +16 -4
- package/lib/hooks/useMultiMasterDetailDcmts.d.ts +97 -0
- package/lib/hooks/useMultiMasterDetailDcmts.js +555 -0
- package/lib/hooks/useRelatedDocuments.js +2 -26
- package/package.json +1 -1
|
@@ -3,11 +3,11 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
|
|
|
3
3
|
import styled from 'styled-components';
|
|
4
4
|
import { LoadIndicator } from 'devextreme-react';
|
|
5
5
|
import { AppModules, DataColumnTypes, DataListViewModes, DcmtTypeListCacheService, LayoutCacheService, LayoutModes, MetadataDataDomains, SDK_Globals, SystemMIDsAsNumber, UserListCacheService, } from '@topconsultnpm/sdk-ts';
|
|
6
|
-
import { customizeSearchByDisplayText, deepCompare, formatDateTimeByMetadataFormat, formatNumberByMetadataFormat, generateUniqueColumnKeys, genUniqueId, getColumnFormatInfo, getDateDisplayText, getNumberDisplayText, getSearchToolbarVisibility, IconAll, IconBoard, IconDcmtTypeSys, IconDelete, IconMenuVertical, IconPlatform, IconRefresh, IconSearchCheck, IconShow, isApprovalWorkflowView, isSign4TopEnabled, searchResultDescriptorToSimpleArray, searchResultToMetadataValues, SDKUI_Globals, SDKUI_Localizator } from '../../../helper';
|
|
6
|
+
import { customizeSearchByDisplayText, deepCompare, formatDateTimeByMetadataFormat, formatNumberByMetadataFormat, generateUniqueColumnKeys, genUniqueId, getColumnFormatInfo, getDateDisplayText, getNumberDisplayText, getSearchToolbarVisibility, IconAll, IconBoard, IconDcmtTypeSys, IconDelete, IconDuplicate, IconEdit, IconMenuVertical, IconPlatform, IconRefresh, IconSearchCheck, IconShow, isApprovalWorkflowView, isSign4TopEnabled, searchResultDescriptorToSimpleArray, searchResultToMetadataValues, SDKUI_Globals, SDKUI_Localizator, IconCloseOutline } from '../../../helper';
|
|
7
7
|
import { CounterItemKey } from '../../base/TMCounterContainer';
|
|
8
8
|
import { getDcmtCicoStatus } from '../../../helper/checkinCheckoutManager';
|
|
9
9
|
import { DcmtOperationTypes, SearchResultContext, } from '../../../ts';
|
|
10
|
-
import { Gutters } from '../../../utils/theme';
|
|
10
|
+
import { Gutters, TMColors } from '../../../utils/theme';
|
|
11
11
|
import { useDataListItem } from '../../../hooks/useDataListItem';
|
|
12
12
|
import { useDataUserIdItem } from '../../../hooks/useDataUserIdItem';
|
|
13
13
|
import { getSelectedDcmtsOrFocused, useDocumentOperations } from '../../../hooks/useDocumentOperations';
|
|
@@ -55,7 +55,9 @@ const TMSearchResult = ({
|
|
|
55
55
|
// Data
|
|
56
56
|
groupId, searchResults = [], context = SearchResultContext.METADATA_SEARCH, title, selectedSearchResultTID, floatingActionConfig, workingGroupContext = undefined, inputDID,
|
|
57
57
|
// Boolean flags to enable/disable features
|
|
58
|
-
autoFocusFirstRow = true, formAutoOpen, isVisible = true, allowRelations = true, openDcmtFormAsModal = false, showSearchResultSidebar = true, showDcmtFormSidebar = true, showSelector = false, isClosable = false, allowFloatingBar = true, showToolbarHeader = true, showBackButton = true, disableAccordionIfSingleCategory = false, editPdfForm = false, openS4TViewer = false, showTodoDcmtForm = false, showToppyDraggableHelpCenter = true, toppyHelpCenterUsePortal = false, showNoDcmtFoundMessage = true, enablePinIcons = true,
|
|
58
|
+
autoFocusFirstRow = true, formAutoOpen, isVisible = true, allowRelations = true, openDcmtFormAsModal = false, showSearchResultSidebar = true, showDcmtFormSidebar = true, showSelector = false, isClosable = false, allowFloatingBar = true, showToolbarHeader = true, showBackButton = true, showToolbarCloseButton = false, disableAccordionIfSingleCategory = false, editPdfForm = false, openS4TViewer = false, showTodoDcmtForm = false, showToppyDraggableHelpCenter = true, toppyHelpCenterUsePortal = false, showNoDcmtFoundMessage = true, enablePinIcons = true, showCounterConfig = true, showActionsColumn = false, compactPager = false,
|
|
59
|
+
// Counters
|
|
60
|
+
counterConfig,
|
|
59
61
|
// Callbacks (optional)
|
|
60
62
|
openInOffice, onRefreshAfterAddDcmtToFavs, onRefreshSearchAsyncDatagrid, onSelectedTIDChanged, onSelectedTIDCleared, onWFOperationCompleted, onClose, onFileOpened, onTaskCreateRequest, openWGsCopyMoveForm, openCommentFormCallback, openAddDocumentForm, onOpenS4TViewerRequest, onOpenPdfEditorRequest, openFileUploaderPdfEditor, passToArchiveCallback, onReferenceClick,
|
|
61
63
|
// Tasks
|
|
@@ -309,7 +311,7 @@ handleNavigateToWGs, handleNavigateToDossiers, fetchRemoteCertificates, graphome
|
|
|
309
311
|
createTaskFromDocumentOrWorkItem();
|
|
310
312
|
}
|
|
311
313
|
};
|
|
312
|
-
const { operationItems, renderFloatingBar, renderDcmtOperations, features, } = useDocumentOperations({
|
|
314
|
+
const { operationItems, selectedDcmtInfos, renderFloatingBar, renderDcmtOperations, features, } = useDocumentOperations({
|
|
313
315
|
context: context,
|
|
314
316
|
documentData: {
|
|
315
317
|
dtd: fromDTD,
|
|
@@ -384,6 +386,46 @@ handleNavigateToWGs, handleNavigateToDossiers, fetchRemoteCertificates, graphome
|
|
|
384
386
|
},
|
|
385
387
|
});
|
|
386
388
|
const { isOpenDcmtForm, openFormHandler, dcmtFormLayoutMode, onDcmtFormOpenChange, showSearchTMDatagrid, showDcmtTypesSelection, showExportForm, updateBatchUpdateForm, closeDcmtFormHandler, handleSignApprove, checkoutInfo: { showCicoWaitPanel, cicoWaitPanelTitle, showCicoPrimaryProgress, cicoPrimaryProgressText, cicoPrimaryProgressValue, cicoPrimaryProgressMax, }, dcmtOperations: { abortController, showWaitPanel, showPrimary, waitPanelTitle, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, downloadDcmtsAsync, runOperationAsync, }, relatedDocumentsInfo: { isOpenDetails, isOpenMaster, checkRelatedDcmtsArchiveCapability, checkManyToManyCapability, }, toppyOperations: { showApprovePopup, showRejectPopup, showReAssignPopup, showMoreInfoPopup, updateShowApprovePopup, updateShowRejectPopup, updateShowReAssignPopup, updateShowMoreInfoPopup } } = features;
|
|
389
|
+
// ----- Azioni della colonna di riga (showActionsColumn) -----------------------------------------
|
|
390
|
+
// Le voci di operationItems agiscono sui documenti selezionati o, in mancanza, su quello a fuoco:
|
|
391
|
+
// non accettano una riga come argomento. Il click sull'icona quindi azzera la selezione e porta il
|
|
392
|
+
// fuoco sulla riga cliccata, poi attende. L'attesa non è sul fuoco ma su selectedDcmtInfos, che
|
|
393
|
+
// l'hook ricalcola in un effect (un render più tardi): lanciare l'operazione prima significherebbe
|
|
394
|
+
// eseguirla sulla riga precedente.
|
|
395
|
+
const pendingRowActionRef = useRef(undefined);
|
|
396
|
+
const requestRowAction = useCallback((operationId, rowData) => {
|
|
397
|
+
if (!showActionsColumn)
|
|
398
|
+
return;
|
|
399
|
+
if (rowData?.TID === undefined || rowData?.DID === undefined) {
|
|
400
|
+
ShowAlert({ message: SDKUI_Localizator.InvalidDcmt, mode: "warning", duration: 3000 });
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
pendingRowActionRef.current = { operationId, TID: rowData.TID, DID: rowData.DID };
|
|
404
|
+
isFirstAutoFocusRef.current = false;
|
|
405
|
+
setSelectedItems([]);
|
|
406
|
+
setFocusedItem(rowData);
|
|
407
|
+
}, [showActionsColumn]);
|
|
408
|
+
// La richiesta viene scartata se il documento sparisce dai risultati (es. refresh dopo
|
|
409
|
+
// un'eliminazione): senza questo resterebbe appesa e partirebbe al prossimo cambio di fuoco.
|
|
410
|
+
useEffect(() => { pendingRowActionRef.current = undefined; }, [selectedSearchResult, lastUpdateSearchTime]);
|
|
411
|
+
useEffect(() => {
|
|
412
|
+
if (!showActionsColumn)
|
|
413
|
+
return;
|
|
414
|
+
const pending = pendingRowActionRef.current;
|
|
415
|
+
if (!pending)
|
|
416
|
+
return;
|
|
417
|
+
// L'hook non ha ancora recepito la riga richiesta: si riproverà al prossimo aggiornamento
|
|
418
|
+
if (selectedDcmtInfos.length !== 1)
|
|
419
|
+
return;
|
|
420
|
+
if (selectedDcmtInfos[0].TID !== pending.TID || selectedDcmtInfos[0].DID !== pending.DID)
|
|
421
|
+
return;
|
|
422
|
+
pendingRowActionRef.current = undefined;
|
|
423
|
+
const operation = findOperationItemById(operationItems, pending.operationId);
|
|
424
|
+
// Ora che il fuoco è sulla riga, `disabled` riflette i permessi per quel documento
|
|
425
|
+
if (!operation || operation.disabled || operation.visible === false)
|
|
426
|
+
return;
|
|
427
|
+
operation.onClick?.();
|
|
428
|
+
}, [showActionsColumn, selectedDcmtInfos, operationItems]);
|
|
387
429
|
const deviceType = useDeviceType();
|
|
388
430
|
const isMobile = deviceType === DeviceType.MOBILE;
|
|
389
431
|
const hasSingleDcmtType = currentSearchResults.length === 1;
|
|
@@ -703,14 +745,15 @@ handleNavigateToWGs, handleNavigateToDossiers, fetchRemoteCertificates, graphome
|
|
|
703
745
|
&& !showTodoDcmtForm);
|
|
704
746
|
}, [showToppyForApprove, showToppyDraggableHelpCenter, selectedDocs, showApprovePopup, showRejectPopup, showReAssignPopup, showMoreInfoPopup, editPdfForm, openS4TViewer, showTodoDcmtForm]);
|
|
705
747
|
const searchResutlToolbar = _jsxs(_Fragment, { children: [context === SearchResultContext.FAVORITES_AND_RECENTS &&
|
|
706
|
-
_jsx("div", { style: { display: 'flex', alignItems: 'center', gap: '5px' }, children: _jsx(TMButton, { btnStyle: 'icon', icon: _jsx(IconDelete, { color: 'white' }), caption: "Rimuovi da " + (selectedSearchResult?.category === "Favorites" ? '"Preferiti"' : '"Recenti"'), disabled: getSelectedDcmtsOrFocused(selectedItems, focusedItem).length <= 0, onClick: removeDcmtFromFavsOrRecents }) }), _jsx(TMButton, { btnStyle: 'icon', icon: _jsx(IconRefresh, { color: 'white' }), caption: SDKUI_Localizator.Refresh, onClick: onRefreshSearchAsyncDatagrid }), _jsx(TMContextMenu, { items: operationItems, trigger: "left", children: _jsx(IconMenuVertical, { color: 'white', cursor: 'pointer' }) })
|
|
748
|
+
_jsx("div", { style: { display: 'flex', alignItems: 'center', gap: '5px' }, children: _jsx(TMButton, { btnStyle: 'icon', icon: _jsx(IconDelete, { color: 'white' }), caption: "Rimuovi da " + (selectedSearchResult?.category === "Favorites" ? '"Preferiti"' : '"Recenti"'), disabled: getSelectedDcmtsOrFocused(selectedItems, focusedItem).length <= 0, onClick: removeDcmtFromFavsOrRecents }) }), _jsx(TMButton, { btnStyle: 'icon', icon: _jsx(IconRefresh, { color: 'white' }), caption: SDKUI_Localizator.Refresh, onClick: onRefreshSearchAsyncDatagrid }), _jsx(TMContextMenu, { items: operationItems, trigger: "left", children: _jsx(IconMenuVertical, { color: 'white', cursor: 'pointer' }) }), showToolbarCloseButton && onClose &&
|
|
749
|
+
_jsx(TMButton, { btnStyle: 'icon', icon: _jsx(IconCloseOutline, { color: 'white' }), caption: SDKUI_Localizator.Close, onClick: onClose })] });
|
|
707
750
|
const tmSearchResult = useMemo(() => (!searchResults || searchResults.length <= 0)
|
|
708
751
|
? _jsxs("div", { style: { display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: '100%', width: '100%' }, children: [_jsx(IconBoard, { fontSize: 96 }), showNoDcmtFoundMessage && _jsx("div", { style: { fontSize: "15px", marginTop: "10px" }, children: SDKUI_Localizator.NoDcmtFound }), openAddDocumentForm && _jsx("div", { style: { marginTop: "10px" }, children: _jsx(TMButton, { fontSize: "15px", icon: _jsx("i", { className: 'dx-icon-share' }), caption: SDKUI_Localizator.Share, onClick: openAddDocumentForm }) })] })
|
|
709
752
|
:
|
|
710
753
|
_jsxs(_Fragment, { children: [_jsxs(TMLayoutItem, { height: '100%', children: [_jsxs("div", { ref: floatingBarContainerRef, style: { position: 'relative', height: '100%', width: '100%' }, children: [_jsxs(TMSplitterLayout, { direction: 'horizontal', overflow: 'visible', separatorSize: Gutters.getGutters(), separatorActiveColor: 'transparent', separatorColor: 'transparent', min: ['0', '0'], showSeparator: showSelector && !isSteppedLayout && !isSelectorCollapsed, start: splitterSizes, children: [showSelector ?
|
|
711
754
|
_jsx(TMLayoutItem, { children: _jsx(TMSearchResultSelector, { searchResults: currentSearchResults, disableAccordionIfSingleCategory: disableAccordionIfSingleCategory, selectedTID: selectedSearchResultTID, selectedSearchResult: selectedSearchResult, autoSelectFirst: !isMobile || hasSingleDcmtType, onSelectionChanged: onSearchResultSelectionChanged }) })
|
|
712
755
|
:
|
|
713
|
-
_jsx(_Fragment, {}), _jsx(TMLayoutItem, { children: _jsx(TMSearchResultGrid, { openInOffice: openInOffice, fromDTD: fromDTD, operationItems: operationItems, allUsers: allUsers, inputFocusedItem: focusedItem, inputSelectedItems: selectedItems, showExportForm: showExportForm, onFocusedItemChanged: handleFocusedItemChangedFromGrid, onDownloadDcmtsAsync: async (inputDcmts, downloadType, downloadMode, _y, confirmAttachments) => await downloadDcmtsAsync({ inputDcmts, downloadType, downloadMode, onFileDownloaded: onFileOpened, confirmAttachments }), lastUpdateSearchTime: lastUpdateSearchTime, searchResult: searchResults.length > 1 ? selectedSearchResult : searchResults[0], onSelectionChanged: (items) => { setSelectedItems(items); }, onDblClick: () => openFormHandler(LayoutModes.Update), showSearchTMDatagrid: showSearchTMDatagrid, onVisibleItemChanged: setVisibleItems, updateDataColumnsFromDataGrid: updateDataColumnsFromDataGrid, updateDataSourceFromDataGrid: updateDataSourceFromDataGrid, updateSelectedRowKeysFromDataGrid: updateSelectedRowKeysFromDataGrid, disableAutoFocus: autoFocusFirstRow === false && isFirstAutoFocusRef.current, dcmtsReturned: dcmtsReturned, dcmtsFound: dcmtsFound }) })] }), renderFloatingBar] }), _jsx(TMToppyDraggableHelpCenter, { usePortal: toppyHelpCenterUsePortal, isVisible: isToppyHelpCenterVisible, content: _jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, children: _jsx(WorkFlowOperationButtons, { dtd: fromDTD, deviceType: deviceType, onApprove: () => {
|
|
756
|
+
_jsx(_Fragment, {}), _jsx(TMLayoutItem, { children: _jsx(TMSearchResultGrid, { openInOffice: openInOffice, fromDTD: fromDTD, operationItems: operationItems, allUsers: allUsers, inputFocusedItem: focusedItem, inputSelectedItems: selectedItems, showExportForm: showExportForm, onFocusedItemChanged: handleFocusedItemChangedFromGrid, onDownloadDcmtsAsync: async (inputDcmts, downloadType, downloadMode, _y, confirmAttachments) => await downloadDcmtsAsync({ inputDcmts, downloadType, downloadMode, onFileDownloaded: onFileOpened, confirmAttachments }), lastUpdateSearchTime: lastUpdateSearchTime, searchResult: searchResults.length > 1 ? selectedSearchResult : searchResults[0], onSelectionChanged: (items) => { setSelectedItems(items); }, onDblClick: () => openFormHandler(LayoutModes.Update), showSearchTMDatagrid: showSearchTMDatagrid, onVisibleItemChanged: setVisibleItems, updateDataColumnsFromDataGrid: updateDataColumnsFromDataGrid, updateDataSourceFromDataGrid: updateDataSourceFromDataGrid, updateSelectedRowKeysFromDataGrid: updateSelectedRowKeysFromDataGrid, disableAutoFocus: autoFocusFirstRow === false && isFirstAutoFocusRef.current, dcmtsReturned: dcmtsReturned, dcmtsFound: dcmtsFound, showCounterConfig: showCounterConfig, counterConfig: counterConfig, showActionsColumn: showActionsColumn, compactPager: compactPager, onRowActionRequest: requestRowAction }) })] }), renderFloatingBar] }), _jsx(TMToppyDraggableHelpCenter, { usePortal: toppyHelpCenterUsePortal, isVisible: isToppyHelpCenterVisible, content: _jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, children: _jsx(WorkFlowOperationButtons, { dtd: fromDTD, deviceType: deviceType, onApprove: () => {
|
|
714
757
|
updateShowApprovePopup(true);
|
|
715
758
|
}, onSignApprove: () => {
|
|
716
759
|
handleSignApprove();
|
|
@@ -905,7 +948,33 @@ handleNavigateToWGs, handleNavigateToDossiers, fetchRemoteCertificates, graphome
|
|
|
905
948
|
_jsxs(TMPanelManagerProvider, { panels: initialPanels, initialVisibility: allInitialPanelVisibility, defaultDimensions: initialPanelDimensions, initialDimensions: initialPanelDimensions, initialMobilePanelId: 'tmSearchResult', children: [_jsx(PanelDisabledStateHandler, { isBoardDisabled: isBoardDisabled }), _jsx(ShowMainPanelBridge, { showMainPanelRef: showMainPanelRef }), _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", parentId: groupId, showToolbar: showSearchResultSidebar })] }) }) }) }), renderDcmtOperations] }));
|
|
906
949
|
};
|
|
907
950
|
export default TMSearchResult;
|
|
908
|
-
|
|
951
|
+
/** Cerca una voce di operazione per id, anche dentro i sottomenu */
|
|
952
|
+
const findOperationItemById = (items, id) => {
|
|
953
|
+
for (const item of items) {
|
|
954
|
+
if (item.id === id)
|
|
955
|
+
return item;
|
|
956
|
+
const found = item.submenu ? findOperationItemById(item.submenu, id) : undefined;
|
|
957
|
+
if (found)
|
|
958
|
+
return found;
|
|
959
|
+
}
|
|
960
|
+
return undefined;
|
|
961
|
+
};
|
|
962
|
+
/**
|
|
963
|
+
* Azioni della colonna di riga. Gli id sono quelli di useDocumentOperations, così il comportamento è
|
|
964
|
+
* lo stesso del menu contestuale; icone e colori sono allineati alle altre griglie mentre il tooltip
|
|
965
|
+
* resta il nome dell'operazione. "Cancella" è la cancellazione logica: ripristino ed eliminazione
|
|
966
|
+
* fisica restano nel menu contestuale, dove la scelta è esplicita.
|
|
967
|
+
*/
|
|
968
|
+
const rowActions = [
|
|
969
|
+
{ operationId: 'open-form', icon: _jsx(IconEdit, { fontSize: 18, color: TMColors.primary }) },
|
|
970
|
+
{ operationId: 'dup', icon: _jsx(IconDuplicate, { fontSize: 18, color: TMColors.tertiary }) },
|
|
971
|
+
{ operationId: 'del-log', icon: _jsx(IconDelete, { fontSize: 18, color: TMColors.error }) },
|
|
972
|
+
];
|
|
973
|
+
const rowActionsStyles = {
|
|
974
|
+
cell: { display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '14px' },
|
|
975
|
+
icon: { cursor: 'pointer', display: 'flex' },
|
|
976
|
+
};
|
|
977
|
+
const TMSearchResultGrid = ({ openInOffice, fromDTD, operationItems, allUsers, inputFocusedItem, allowMultipleSelection = true, showExportForm = false, onFocusedItemChanged, onDownloadDcmtsAsync, onVisibleItemChanged, inputSelectedItems = [], lastUpdateSearchTime, searchResult, onSelectionChanged, onDblClick, showSearchTMDatagrid, updateDataColumnsFromDataGrid, updateDataSourceFromDataGrid, updateSelectedRowKeysFromDataGrid, disableAutoFocus = false, dcmtsReturned, dcmtsFound, showCounterConfig = true, counterConfig, showActionsColumn = false, compactPager = false, onRowActionRequest, }) => {
|
|
909
978
|
const [dataSource, setDataSource] = useState();
|
|
910
979
|
const [columns, setColumns] = useState([]);
|
|
911
980
|
const [selectedRowKeys, setSelectedRowKeys] = useState([]);
|
|
@@ -1301,6 +1370,9 @@ const TMSearchResultGrid = ({ openInOffice, fromDTD, operationItems, allUsers, i
|
|
|
1301
1370
|
// Era sull'icona, non fare nulla
|
|
1302
1371
|
return;
|
|
1303
1372
|
}
|
|
1373
|
+
// Due click rapidi su un'icona della colonna azioni non devono aprire anche il form
|
|
1374
|
+
if (e.event?.target.closest('.tm-row-actions'))
|
|
1375
|
+
return;
|
|
1304
1376
|
// Verifica che il documento abbia TID e DID validi prima di procedere
|
|
1305
1377
|
if (!e.data.TID || !e.data.DID) {
|
|
1306
1378
|
ShowAlert({
|
|
@@ -1314,8 +1386,41 @@ const TMSearchResultGrid = ({ openInOffice, fromDTD, operationItems, allUsers, i
|
|
|
1314
1386
|
onFocusedItemChanged?.(e.data);
|
|
1315
1387
|
onDblClick();
|
|
1316
1388
|
}, [onDblClick]);
|
|
1389
|
+
/**
|
|
1390
|
+
* Colonna delle azioni di riga, in testa alla griglia (subito dopo la checkbox di selezione, che
|
|
1391
|
+
* DevExtreme tiene sempre per prima). Vive solo qui e non nello stato `columns`, che è quello
|
|
1392
|
+
* sincronizzato col padre per l'esportazione: una colonna senza dataField finirebbe in Excel come
|
|
1393
|
+
* colonna vuota.
|
|
1394
|
+
*
|
|
1395
|
+
* Le operazioni sono lette da una ref perché `operationItems` è ricostruito a ogni render del
|
|
1396
|
+
* padre: usarlo come dipendenza renderebbe nuova la colonna, e con essa `dataColumns`, ad ogni
|
|
1397
|
+
* giro. La cellRender le rilegge a ogni ridisegno della griglia, quindi resta comunque aggiornata.
|
|
1398
|
+
*/
|
|
1399
|
+
const operationItemsRef = useRef(operationItems);
|
|
1400
|
+
operationItemsRef.current = operationItems;
|
|
1401
|
+
const actionsColumn = useMemo(() => ({
|
|
1402
|
+
caption: '',
|
|
1403
|
+
width: 110,
|
|
1404
|
+
alignment: 'center',
|
|
1405
|
+
allowSorting: false,
|
|
1406
|
+
allowFiltering: false,
|
|
1407
|
+
allowHeaderFiltering: false,
|
|
1408
|
+
allowResizing: false,
|
|
1409
|
+
allowReordering: false,
|
|
1410
|
+
allowHiding: false,
|
|
1411
|
+
allowExporting: false,
|
|
1412
|
+
showInColumnChooser: false,
|
|
1413
|
+
cssClass: 'tm-row-actions',
|
|
1414
|
+
cellRender: (cellData) => (_jsx("div", { style: rowActionsStyles.cell, children: rowActions.map(action => {
|
|
1415
|
+
const operation = findOperationItemById(operationItemsRef.current, action.operationId);
|
|
1416
|
+
if (!operation || operation.visible === false)
|
|
1417
|
+
return null;
|
|
1418
|
+
return (_jsx("span", { style: rowActionsStyles.icon, title: operation.name, onClick: () => onRowActionRequest?.(action.operationId, cellData.data), children: action.icon }, action.operationId));
|
|
1419
|
+
}) })),
|
|
1420
|
+
}), [onRowActionRequest]);
|
|
1317
1421
|
const dataColumns = useMemo(() => {
|
|
1318
1422
|
return [
|
|
1423
|
+
...(showActionsColumn ? [actionsColumn] : []),
|
|
1319
1424
|
{
|
|
1320
1425
|
dataType: "object",
|
|
1321
1426
|
dataField: 'FILEEXT',
|
|
@@ -1329,7 +1434,7 @@ const TMSearchResultGrid = ({ openInOffice, fromDTD, operationItems, allUsers, i
|
|
|
1329
1434
|
},
|
|
1330
1435
|
...columns.filter(col => col.dataField !== 'FILEEXT')
|
|
1331
1436
|
];
|
|
1332
|
-
}, [columns, onDownloadDcmtsAsync, openInOffice]);
|
|
1437
|
+
}, [columns, onDownloadDcmtsAsync, openInOffice, showActionsColumn, actionsColumn]);
|
|
1333
1438
|
const onContentReady = useCallback((e) => {
|
|
1334
1439
|
if (e === undefined)
|
|
1335
1440
|
return;
|
|
@@ -1340,21 +1445,24 @@ const TMSearchResultGrid = ({ openInOffice, fromDTD, operationItems, allUsers, i
|
|
|
1340
1445
|
setVisibleItems(visibleData);
|
|
1341
1446
|
}, []);
|
|
1342
1447
|
useEffect(() => { onVisibleItemChanged?.(visibleItems); }, [visibleItems]);
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1448
|
+
const gridCounterConfig = useMemo(() => {
|
|
1449
|
+
if (!showCounterConfig)
|
|
1450
|
+
return { show: false };
|
|
1451
|
+
const defaultItems = dcmtsReturned !== undefined && dcmtsFound !== undefined
|
|
1452
|
+
? new Map([
|
|
1453
|
+
[CounterItemKey.allItems, {
|
|
1454
|
+
key: CounterItemKey.allItems,
|
|
1455
|
+
show: true,
|
|
1456
|
+
caption: `${dcmtsReturned} restituiti su ${dcmtsFound} trovati`,
|
|
1457
|
+
value: `${dcmtsReturned}/${dcmtsFound}`,
|
|
1458
|
+
icon: _jsx(IconAll, {}),
|
|
1459
|
+
order: -1
|
|
1460
|
+
}]
|
|
1461
|
+
])
|
|
1462
|
+
: undefined;
|
|
1463
|
+
return { ...counterConfig, show: true, items: counterConfig?.items ?? defaultItems };
|
|
1464
|
+
}, [showCounterConfig, counterConfig, dcmtsReturned, dcmtsFound]);
|
|
1465
|
+
return _jsxs("div", { style: { width: "100%", height: "100%" }, children: [!isDataGridReady && (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: '100%', width: '100%', gap: '10px' }, children: [_jsx(LoadIndicator, { height: 60, width: 60 }), _jsx("div", { children: SDKUI_Localizator.Loading })] })), isDataGridReady && _jsx(TMDataGrid, { ref: dataGridRef, id: "tm-search-result", keyExpr: "rowIndex", dataColumns: dataColumns, dataSource: dataSource, customizeColumns: customizeColumns, repaintChangesOnly: true, selectedRowKeys: selectedRowKeys, focusedRowKey: disableAutoFocus ? undefined : Number(focusedItem?.rowIndex ?? 0), showSearchPanel: showSearchTMDatagrid, showFilterPanel: true, sorting: { mode: "multiple" }, selection: { mode: allowMultipleSelection ? 'multiple' : 'single' }, pageSize: pageSize, compactPager: compactPager, onSelectionChanged: handleSelectionChange, onFocusedRowChanged: handleFocusedRowChange, onRowDblClick: onRowDblClick, onContentReady: onContentReady, showHeaderColumnChooser: true, onKeyDown: onKeyDown, customContextMenuItems: operationItems, counterConfig: gridCounterConfig })] });
|
|
1358
1466
|
};
|
|
1359
1467
|
//#region TMSearchResultSelector
|
|
1360
1468
|
const StyledItemTemplate = styled.div `
|
|
@@ -5,6 +5,7 @@ interface TMPanelManagerContainerProps {
|
|
|
5
5
|
direction: TMPanelDirection;
|
|
6
6
|
parentId?: string;
|
|
7
7
|
minPanelSizePx?: number;
|
|
8
|
+
gutterSizePx?: number;
|
|
8
9
|
}
|
|
9
10
|
declare const TMPanelManagerContainer: (props: TMPanelManagerContainerProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
10
11
|
export default TMPanelManagerContainer;
|
|
@@ -18,20 +18,20 @@ const StyledPanelContainerWrapper = styled.div `
|
|
|
18
18
|
`;
|
|
19
19
|
// Styled Component per il gutter (separatore)
|
|
20
20
|
const StyledResizerGutter = styled.div `
|
|
21
|
-
cursor: ${props => (props.$direction === 'horizontal' ? 'col-resize' : 'row-resize')};
|
|
22
|
-
${props => (props.$direction === 'horizontal' ? `width: ${
|
|
21
|
+
cursor: ${props => (!props.$canResize ? 'default' : props.$direction === 'horizontal' ? 'col-resize' : 'row-resize')};
|
|
22
|
+
${props => (props.$direction === 'horizontal' ? `width: ${props.$size}px;` : `height: ${props.$size}px;`)}
|
|
23
23
|
flex-shrink: 0;
|
|
24
24
|
background-color: "transparent";
|
|
25
25
|
z-index: 10;
|
|
26
26
|
`;
|
|
27
27
|
const TMPanelManagerContainer = (props) => {
|
|
28
|
-
const { panels, showToolbar, direction, parentId, minPanelSizePx = 150 } = props;
|
|
28
|
+
const { panels, showToolbar, direction, parentId, minPanelSizePx = 150, gutterSizePx } = props;
|
|
29
29
|
const { panelVisibility, setPanelDimensionsById, hasVisiblePanels, maximizedPanels, updateIsResizingActive } = useTMPanelManagerContext();
|
|
30
30
|
// Get the current device type (e.g., mobile, tablet, desktop) using a custom hook
|
|
31
31
|
const deviceType = useDeviceType();
|
|
32
32
|
// This avoids unnecessary re-renders by only recalculating when deviceType changes
|
|
33
33
|
let isMobile = useMemo(() => { return deviceType === DeviceType.MOBILE; }, [deviceType]);
|
|
34
|
-
const gutters = Gutters.getGutters();
|
|
34
|
+
const gutters = gutterSizePx ?? Gutters.getGutters();
|
|
35
35
|
// References to store information related to resizing
|
|
36
36
|
// startMousePos: stores the mouse position when resizing starts (x or y coordinate)
|
|
37
37
|
const startMousePos = useRef(0);
|
|
@@ -47,6 +47,19 @@ const TMPanelManagerContainer = (props) => {
|
|
|
47
47
|
const containerRef = useRef(null);
|
|
48
48
|
// Count how many child panels are currently visible (based on panelVisibility)
|
|
49
49
|
const currentlyVisibleChildrenCount = panels.filter(panel => panelVisibility[panel.id]).length;
|
|
50
|
+
/**
|
|
51
|
+
* Pannello ridimensionabile più prossimo a partire da `from` nella direzione `step`:
|
|
52
|
+
* i pannelli non visibili e quelli collassati (che vivono del solo ingombro minimo) si saltano,
|
|
53
|
+
* altrimenti il trascinamento del separatore assegnerebbe spazio a un pannello ridotto
|
|
54
|
+
*/
|
|
55
|
+
const findResizablePanelId = (from, step) => {
|
|
56
|
+
for (let i = from; i >= 0 && i < panels.length; i += step) {
|
|
57
|
+
const candidate = panels[i];
|
|
58
|
+
if (panelVisibility[candidate.id] && candidate.contentOptions?.isCollapsed !== true)
|
|
59
|
+
return candidate.id;
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
};
|
|
50
63
|
// If this component has a parent panel, and the parent panel is visible,
|
|
51
64
|
// but none of the current child panels are visible, return null to avoid rendering empty container
|
|
52
65
|
if (parentId && panelVisibility[parentId] && currentlyVisibleChildrenCount === 0) {
|
|
@@ -156,14 +169,6 @@ const TMPanelManagerContainer = (props) => {
|
|
|
156
169
|
}, children: _jsxs("div", { style: { width: "100%", height: "100%" }, children: [_jsx(StyledPanelContainerWrapper, { ref: containerRef, "$direction": direction, "$hasVisiblePanels": hasVisiblePanels(), children: panels.map((panel, index) => {
|
|
157
170
|
// Check if current panel is visible according to context state
|
|
158
171
|
const isVisible = panelVisibility[panel.id];
|
|
159
|
-
// Find the closest previous visible panel's ID to place the resizer gutter between
|
|
160
|
-
let prevPanelIdForGutter = null;
|
|
161
|
-
for (let i = index - 1; i >= 0; i--) {
|
|
162
|
-
if (panelVisibility[panels[i].id]) {
|
|
163
|
-
prevPanelIdForGutter = panels[i].id;
|
|
164
|
-
break;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
172
|
/*
|
|
168
173
|
Determine if we should show the gutter (resize handle) before this panel.
|
|
169
174
|
The gutter is shown only if:
|
|
@@ -171,6 +176,11 @@ const TMPanelManagerContainer = (props) => {
|
|
|
171
176
|
- at least one visible panel was encountered before this one
|
|
172
177
|
*/
|
|
173
178
|
const showGutter = isVisible && hasSeenVisiblePanel && maximizedPanels.length === 0;
|
|
179
|
+
// I due pannelli su cui agisce il separatore: i più prossimi fra quelli ridimensionabili.
|
|
180
|
+
// Senza una coppia valida (es. tutti i vicini collassati) il separatore resta solo un divisorio
|
|
181
|
+
const resizeFromId = showGutter ? findResizablePanelId(index - 1, -1) : null;
|
|
182
|
+
const resizeToId = showGutter ? findResizablePanelId(index, 1) : null;
|
|
183
|
+
const canResize = resizeFromId !== null && resizeToId !== null && resizeFromId !== resizeToId;
|
|
174
184
|
// Update the flag once a visible panel is found, so gutters after it are shown correctly
|
|
175
185
|
if (isVisible) {
|
|
176
186
|
hasSeenVisiblePanel = true;
|
|
@@ -178,7 +188,7 @@ const TMPanelManagerContainer = (props) => {
|
|
|
178
188
|
// If the panel has child panels, render a nested TMPanelManagerContainer or a component
|
|
179
189
|
if (panel.children && panel.children.length > 0) {
|
|
180
190
|
const jsxComponent = panel.contentOptions?.component;
|
|
181
|
-
return (_jsxs(React.Fragment, { children: [showGutter && (_jsx(StyledResizerGutter, { "$direction": direction, onMouseDown: (e) => startResizing(e,
|
|
191
|
+
return (_jsxs(React.Fragment, { children: [showGutter && (_jsx(StyledResizerGutter, { "$direction": direction, "$size": gutters, "$canResize": canResize, onMouseDown: canResize ? (e) => startResizing(e, resizeFromId, resizeToId) : undefined })), _jsx(TMPanelWrapper, { panel: panel, children: jsxComponent
|
|
182
192
|
? React.isValidElement(jsxComponent)
|
|
183
193
|
? React.cloneElement(jsxComponent, { groupId: panel.id, mainDirection: panel.childrenGroupDirection || direction })
|
|
184
194
|
: jsxComponent
|
|
@@ -186,7 +196,7 @@ const TMPanelManagerContainer = (props) => {
|
|
|
186
196
|
}
|
|
187
197
|
// If the panel has a component specified, render it with a possible gutter before it
|
|
188
198
|
if (panel.contentOptions && panel.contentOptions.component) {
|
|
189
|
-
return (_jsxs(React.Fragment, { children: [showGutter && (_jsx(StyledResizerGutter, { "$direction": direction, onMouseDown: (e) => startResizing(e,
|
|
199
|
+
return (_jsxs(React.Fragment, { children: [showGutter && (_jsx(StyledResizerGutter, { "$direction": direction, "$size": gutters, "$canResize": canResize, onMouseDown: canResize ? (e) => startResizing(e, resizeFromId, resizeToId) : undefined })), _jsx(TMPanelWrapper, { panel: panel, children: panel.contentOptions.component })] }, panel.id));
|
|
190
200
|
}
|
|
191
201
|
// If no children or components, render nothing for this panel
|
|
192
202
|
return null;
|
|
@@ -34,8 +34,8 @@ const TMPanelWrapper = (props) => {
|
|
|
34
34
|
// Applica 'flex' o 'none' solo se è già stato reso visibile almeno una volta
|
|
35
35
|
display: isCurrentlyVisible ? 'flex' : 'none',
|
|
36
36
|
flexDirection: 'column',
|
|
37
|
-
minWidth: '50px',
|
|
38
|
-
minHeight: '50px',
|
|
37
|
+
minWidth: panel.contentOptions?.minWidth ?? '50px',
|
|
38
|
+
minHeight: panel.contentOptions?.minHeight ?? '50px',
|
|
39
39
|
width: width,
|
|
40
40
|
height: height,
|
|
41
41
|
pointerEvents: 'auto',
|
|
@@ -116,10 +116,44 @@ export declare class FloatingMenuBarSettings {
|
|
|
116
116
|
};
|
|
117
117
|
positionFormat?: 'pixels' | 'percentage';
|
|
118
118
|
}
|
|
119
|
+
/** Sezioni del riepilogo dell'archiviazione multipla dei dettagli, aperte o collassate */
|
|
120
|
+
export type MultiDetailSectionsOpen = {
|
|
121
|
+
masterInfo: boolean;
|
|
122
|
+
archivedDetails: boolean;
|
|
123
|
+
archiveList: boolean;
|
|
124
|
+
};
|
|
125
|
+
/** Stato persistito di un pannello del riepilogo: visibilità e dimensioni, nel formato del panel manager */
|
|
126
|
+
export type MultiDetailPanelState = {
|
|
127
|
+
visible: boolean;
|
|
128
|
+
width: string;
|
|
129
|
+
height: string;
|
|
130
|
+
};
|
|
131
|
+
/** Stato dei pannelli del riepilogo, indicizzato per id pannello */
|
|
132
|
+
export type MultiDetailPanelStates = Record<string, MultiDetailPanelState>;
|
|
119
133
|
export declare class ArchivingSettings {
|
|
120
134
|
mruTIDs: number[];
|
|
121
135
|
defaultTree: number;
|
|
136
|
+
/** Sezioni collassate dall'utente nel riepilogo, ripristinate alla riapertura */
|
|
137
|
+
multiDetailSectionsOpen: MultiDetailSectionsOpen;
|
|
138
|
+
/**
|
|
139
|
+
* Altezze dei pannelli del riepilogo, gestite dal panel manager. Non comprende il collasso delle
|
|
140
|
+
* sezioni, che è in multiDetailSectionsOpen: resta vuoto finché l'utente non sposta un separatore.
|
|
141
|
+
*/
|
|
142
|
+
multiDetailPanelStates: MultiDetailPanelStates;
|
|
122
143
|
}
|
|
144
|
+
/** Stato di apertura salvato delle sezioni: i default coprono le impostazioni scritte prima di questo campo */
|
|
145
|
+
export declare const getMultiDetailSectionsOpen: () => MultiDetailSectionsOpen;
|
|
146
|
+
export declare const saveMultiDetailSectionsOpen: (sectionsOpen: MultiDetailSectionsOpen) => void;
|
|
147
|
+
/** Stato salvato dei pannelli: vuoto finché l'utente non ne ha ridimensionato nessuno */
|
|
148
|
+
export declare const getMultiDetailPanelStates: () => MultiDetailPanelStates;
|
|
149
|
+
/** Il panel manager applica lo stato salvato solo se esiste: altrimenti riparte dalle quote di default */
|
|
150
|
+
export declare const hasMultiDetailPanelStates: () => boolean;
|
|
151
|
+
export declare const saveMultiDetailPanelStates: (panelStates: MultiDetailPanelStates) => void;
|
|
152
|
+
/**
|
|
153
|
+
* Elimina dal local storage il layout configurato dall'utente per il riepilogo: altezze dei pannelli
|
|
154
|
+
* e sezioni collassate. Alla riapertura le sezioni sono tutte espanse con le quote di default.
|
|
155
|
+
*/
|
|
156
|
+
export declare const clearMultiDetailLayout: () => void;
|
|
123
157
|
export declare class FullTextSettings {
|
|
124
158
|
mruTerms: string[];
|
|
125
159
|
}
|
|
@@ -192,12 +192,49 @@ export const removeDistinctValuesQuickSearch = (tid, mid) => {
|
|
|
192
192
|
};
|
|
193
193
|
export class FloatingMenuBarSettings {
|
|
194
194
|
}
|
|
195
|
+
/** Alla prima apertura le sezioni sono tutte espanse */
|
|
196
|
+
const DEFAULT_MULTI_DETAIL_SECTIONS_OPEN = { masterInfo: true, archivedDetails: true, archiveList: true };
|
|
195
197
|
export class ArchivingSettings {
|
|
196
198
|
constructor() {
|
|
197
199
|
this.mruTIDs = [];
|
|
198
200
|
this.defaultTree = -1;
|
|
201
|
+
/** Sezioni collassate dall'utente nel riepilogo, ripristinate alla riapertura */
|
|
202
|
+
this.multiDetailSectionsOpen = { ...DEFAULT_MULTI_DETAIL_SECTIONS_OPEN };
|
|
203
|
+
/**
|
|
204
|
+
* Altezze dei pannelli del riepilogo, gestite dal panel manager. Non comprende il collasso delle
|
|
205
|
+
* sezioni, che è in multiDetailSectionsOpen: resta vuoto finché l'utente non sposta un separatore.
|
|
206
|
+
*/
|
|
207
|
+
this.multiDetailPanelStates = {};
|
|
199
208
|
}
|
|
200
209
|
}
|
|
210
|
+
/** Stato di apertura salvato delle sezioni: i default coprono le impostazioni scritte prima di questo campo */
|
|
211
|
+
export const getMultiDetailSectionsOpen = () => ({
|
|
212
|
+
...DEFAULT_MULTI_DETAIL_SECTIONS_OPEN,
|
|
213
|
+
...SDKUI_Globals.userSettings.archivingSettings?.multiDetailSectionsOpen,
|
|
214
|
+
});
|
|
215
|
+
export const saveMultiDetailSectionsOpen = (sectionsOpen) => {
|
|
216
|
+
// Il proxy persiste solo intercettando l'assegnazione di una proprietà: la mappa va riassegnata per intero
|
|
217
|
+
SDKUI_Globals.userSettings.archivingSettings.multiDetailSectionsOpen = { ...sectionsOpen };
|
|
218
|
+
};
|
|
219
|
+
/** Stato salvato dei pannelli: vuoto finché l'utente non ne ha ridimensionato nessuno */
|
|
220
|
+
export const getMultiDetailPanelStates = () => SDKUI_Globals.userSettings.archivingSettings?.multiDetailPanelStates ?? {};
|
|
221
|
+
/** Il panel manager applica lo stato salvato solo se esiste: altrimenti riparte dalle quote di default */
|
|
222
|
+
export const hasMultiDetailPanelStates = () => Object.keys(getMultiDetailPanelStates()).length > 0;
|
|
223
|
+
export const saveMultiDetailPanelStates = (panelStates) => {
|
|
224
|
+
if (!panelStates || Object.keys(panelStates).length === 0)
|
|
225
|
+
return;
|
|
226
|
+
// Il proxy persiste solo intercettando l'assegnazione di una proprietà: la mappa va riassegnata per intero
|
|
227
|
+
SDKUI_Globals.userSettings.archivingSettings.multiDetailPanelStates = { ...panelStates };
|
|
228
|
+
};
|
|
229
|
+
/**
|
|
230
|
+
* Elimina dal local storage il layout configurato dall'utente per il riepilogo: altezze dei pannelli
|
|
231
|
+
* e sezioni collassate. Alla riapertura le sezioni sono tutte espanse con le quote di default.
|
|
232
|
+
*/
|
|
233
|
+
export const clearMultiDetailLayout = () => {
|
|
234
|
+
// Il proxy persiste solo intercettando l'assegnazione di una proprietà: entrambe le mappe vanno riassegnate
|
|
235
|
+
SDKUI_Globals.userSettings.archivingSettings.multiDetailPanelStates = {};
|
|
236
|
+
SDKUI_Globals.userSettings.archivingSettings.multiDetailSectionsOpen = { ...DEFAULT_MULTI_DETAIL_SECTIONS_OPEN };
|
|
237
|
+
};
|
|
201
238
|
export class FullTextSettings {
|
|
202
239
|
constructor() {
|
|
203
240
|
this.mruTerms = [];
|
|
@@ -49,10 +49,15 @@ export declare class SDKUI_Localizator {
|
|
|
49
49
|
static get ArchiveConstraints_ContentCompulsory(): "Archivierung nur mit Dateien erlauben" | "Allow file only archiving" | "Permitir solo almacenamientos con archivo" | "Autorise uniquement l'archivage de fichiers" | "Permitir somente depósitos com arquivos" | "Consenti solo archiviazioni con file";
|
|
50
50
|
static get ArchiveConstraints_None(): "Alles zulassen" | "Allow everything" | "Permitir todo" | "Autorise tout" | "Permitir que todos" | "Consenti tutto";
|
|
51
51
|
static get ArchiveConstraints_OnlyMetadata(): "Nur Methadatenarchivierung erlauben" | "Allow metadata only archiving" | "Permitir solo almacenamiento de metadatos" | "Autorise uniquement l'archivage de métadonnées" | "Permitir somente os metadados de arquivamento" | "Consenti solo archiviazioni di metadati";
|
|
52
|
+
static get ArchivedDetails(): string;
|
|
52
53
|
static get ArchivedDocuments(): string;
|
|
53
54
|
static get ArchiveID(): "Armazena" | "Dokumentarisches Archiv" | "Documental archive" | "Archivo de documentos" | "Archivage des documents" | "Archivio documentale";
|
|
54
55
|
static get ArchiveDetailDocument(): "Detaildokument archivieren" | "Archive detail document" | "Archivar documento de detalle" | "Archiver le document détail" | "Arquivar documento de detalhe" | "Archivia documento dettaglio";
|
|
55
56
|
static get ArchiveMasterDocument(): "Master-Dokument archivieren" | "Archive master document" | "Archivar documento maestro" | "Archiver le document maître" | "Arquivar documento mestre" | "Archivia documento master";
|
|
57
|
+
static get ArchiveMultipleDetailDocuments(): "Mehrere Details archivieren" | "Archive multiple details" | "Archivar múltiples detalles" | "Archiver plusieurs détails" | "Arquivar múltiplos detalhes" | "Archivia dettagli multipli";
|
|
58
|
+
static get ArchiveMasterAndMultipleDetailDocuments(): "Master mit mehreren Details archivieren" | "Archive master with multiple details" | "Archivar maestro con múltiples detalles" | "Archiver le maître avec plusieurs détails" | "Arquivar mestre com múltiplos detalhes" | "Archivia master con dettagli multipli";
|
|
59
|
+
static get ArchiveMasterAndDetails_Confirm(): "Master archivieren und mit den Details fortfahren?" | "Archive the master and proceed with the details?" | "¿Archivar el maestro y continuar con los detalles?" | "Archiver le maître et poursuivre avec les détails ?" | "Arquivar o mestre e prosseguir com os detalhes?" | "Archiviare il master e proseguire con i dettagli?";
|
|
60
|
+
static get ExitWithoutArchiving_Confirm(): "Möchten Sie wirklich beenden? Die eingegebenen Dokumente werden nicht archiviert. Fortfahren?" | "Are you sure you want to exit? The entered documents will not be archived. Continue?" | "¿Está seguro de que desea salir? Los documentos introducidos no se archivarán. ¿Continuar?" | "Êtes-vous sûr de vouloir quitter ? Les documents saisis ne seront pas archivés. Continuer ?" | "Tem a certeza de que pretende sair? Os documentos introduzidos não serão arquivados. Continuar?" | "Sei sicuro di voler uscire? I documenti inseriti non verranno archiviati. Continuare?";
|
|
56
61
|
static get Archiving(): string;
|
|
57
62
|
static get ArchivingCompletionInProgress(): string;
|
|
58
63
|
static get Arguments(): "Themen" | "Arguments" | "Argumentos" | "Sujets" | "Tópicos" | "Argomenti";
|
|
@@ -168,10 +173,12 @@ export declare class SDKUI_Localizator {
|
|
|
168
173
|
static get Default(): "Standard" | "Default" | "Predeterminado" | "Defaultão";
|
|
169
174
|
static get DefaultFolder(): string;
|
|
170
175
|
static get Details(): "Einzelheiten" | "Details" | "Detalles" | "Détails" | "detalhes" | "Dettagli";
|
|
176
|
+
static get DetailsToArchive(): string;
|
|
171
177
|
static get Delete(): "Löschen" | "Delete" | "Borrar" | "Supprimer" | "Excluir" | "Elimina";
|
|
172
178
|
static get Delete_ConfirmFor1(): "Löschen Sie '{{0}}'?" | "Delete '{{0}}'?" | "¿Eliminar '{{0}}'?" | "Voulez-vous éliminer '{{0}}'?" | "Eliminar '{{0}}'?" | "Eliminare '{{0}}'?";
|
|
173
179
|
static get Delete_ConfirmForN(): "{{0}} Ausgewählte Objekte. Alle löschen?" | "{{0}} selected objects. Delete them all?" | "{{0}} objetos seleccionados. ¿Eliminarlos todos?" | "{{0}} objets sélectionnés. Éliminez-les tous?" | "{{0}} objetos selecionados. Eliminá-los todos?" | "{{0}} oggetti selezionati. Eliminarli tutti?";
|
|
174
180
|
static get DeleteComment(): "Kommentar löschen?" | "Delete the comment?" | "¿Eliminar el comentario?" | "Supprimer le commentaire ?" | "Eliminar o comentário?" | "Eliminare il commento?";
|
|
181
|
+
static get DeleteAllRowsToChangeDcmtType(): "Löschen Sie alle Zeilen, um den Dokumenttyp zu ändern" | "Delete all rows to change the document type" | "Elimine todas las filas para poder cambiar el tipo de documento" | "Supprimez toutes les lignes pour pouvoir changer le type de document" | "Elimine todas as linhas para poder alterar o tipo de documento" | "Elimina tutte le righe per poter cambiare tipo documento";
|
|
175
182
|
static get DeleteDeletedMessages(): string;
|
|
176
183
|
static get DeleteSystemMessages(): string;
|
|
177
184
|
static get Deletion(): string;
|
|
@@ -405,12 +412,15 @@ export declare class SDKUI_Localizator {
|
|
|
405
412
|
static get Grids(): string;
|
|
406
413
|
static get Hide_CompleteName(): "Vollständigen Namen ausblenden" | "Hide full name" | "Ocultar nombre completo" | "Masquer le nom complet" | "Ocultar nome completo" | "Nascondi nome completo";
|
|
407
414
|
static get HideAll(): "Alle ausblenden" | "Hide all" | "Ocultar todo" | "Masquer tout" | "Ocultar tudo" | "Nascondi tutti";
|
|
415
|
+
static get HideArchivedDetails(): string;
|
|
408
416
|
static get HideDcmtTypes(): string;
|
|
417
|
+
static get HideDetailsToArchive(): string;
|
|
409
418
|
static get HideDetailsWithZeroDocs(): string;
|
|
410
419
|
static get HideFloatingBar(): string;
|
|
411
420
|
static get HideFilters(): string;
|
|
412
421
|
static get HideLeftPanel(): "Linkes Panel ausblenden" | "Hide left panel" | "Ocultar panel izquierdo" | "Masquer le panneau de gauche" | "Ocultar painel esquerdo" | "Nascondi il pannello sinistro";
|
|
413
422
|
static get HideFormattingOptions(): "Formatierungsoptionen ausblenden" | "Hide formatting options" | "Ocultar opciones de formato" | "Masquer les options de formatage" | "Ocultar opções de formatação" | "Nascondi opzioni di formattazione";
|
|
423
|
+
static get HideMasterInfo(): string;
|
|
414
424
|
static get HideMetadata(): string;
|
|
415
425
|
static get HideSearch(): "Suche ausblenden" | "Hide search" | "Ocultar búsqueda" | "Masquer la recherche" | "Ocultar pesquisa" | "Nascondi ricerca";
|
|
416
426
|
static get High(): "Hoch" | "High" | "Alta" | "Élevée";
|
|
@@ -668,10 +678,13 @@ export declare class SDKUI_Localizator {
|
|
|
668
678
|
static get Reject(): "Ablehnen" | "Reject" | "Rechazar" | "Rejeter" | "Rejeitar" | "Rifiuta";
|
|
669
679
|
static get Relations(): "Korrelationen" | "Correlations" | "Correlaciones" | "Relations" | "Correlacionados" | "Correlazioni";
|
|
670
680
|
static get RelationsNotFound(): "Keine Korrelationen gefunden" | "No correlations found" | "No se encontraron correlaciones" | "Aucune corrélation trouvée" | "Nenhuma correlação encontrada" | "Nessuna correlazione trovata";
|
|
681
|
+
static get StopRelationsCalculation(): "Berechnung unterbrechen und die bereits berechneten Korrelationen anzeigen" | "Stop the calculation and show the already calculated correlations" | "Interrumpir el cálculo y mostrar las correlaciones ya calculadas" | "Interrompre le calcul et afficher les corrélations déjà calculées" | "Interromper o cálculo e mostrar as correlações já calculadas" | "Interrompi il calcolo e mostra le correlazioni già calcolate";
|
|
682
|
+
static get RelationsCalculationStopped(): "Berechnung der Korrelationen unterbrochen: Es werden nur die bereits berechneten Korrelationen angezeigt." | "Correlations calculation stopped: only the already calculated correlations are shown." | "Cálculo de correlaciones interrumpido: solo se muestran las correlaciones ya calculadas." | "Calcul des corrélations interrompu : seules les corrélations déjà calculées sont affichées." | "Cálculo das correlações interrompido: são mostradas apenas as correlações já calculadas." | "Calcolo delle correlazioni interrotto: vengono mostrate solo le correlazioni già calcolate.";
|
|
671
683
|
static get RelatedDcmtsNotFound(): "Für das ausgewählte Dokument wurden keine zugehörigen Dokumente gefunden." | "No related documents were found for the selected document." | "No se encontraron documentos relacionados para el documento seleccionado." | "Aucun document associé n'a été trouvé pour le document sélectionné." | "Nenhum documento relacionado foi encontrado para o documento selecionado." | "Non sono stati trovati documenti correlati per il documento selezionato.";
|
|
672
684
|
static get RelationManyToMany(): "Folge viele mit vielen" | "Relation many to many" | "Correlación muchos a muchos" | "Corrélation plusieurs à plusieurs" | "Muitos para muitos relação" | "Correlazione molti a molti";
|
|
673
685
|
static get RelationType(): "Art der Beziehung" | "Relation type" | "Tipo de relación" | "Type de relation" | "Tipo de relacionamento" | "Tipo di relazione";
|
|
674
686
|
static get RemoveContextualFilter(): "Kontextbezogenen Filter entfernen" | "Remove contextual filter" | "Eliminar filtro contextual" | "Supprimer le filtre contextuel" | "Remover filtro contextual" | "Rimuovi filtro contestuale";
|
|
687
|
+
static get RemoveDetailFromSummary_Confirm(): "Detail entfernen? Es wird nicht archiviert." | "Remove this detail? It won't be archived." | "¿Eliminar este detalle? No se archivará." | "Supprimer ce détail ? Il ne sera pas archivé." | "Remover este detalhe? Não será arquivado." | "Rimuovere questo dettaglio? Non verrà archiviato.";
|
|
675
688
|
static get RemoveFromCache(): string;
|
|
676
689
|
static get RemoveFromList(): string;
|
|
677
690
|
static get RemoveFromWorkgroup(): string;
|
|
@@ -732,6 +745,7 @@ export declare class SDKUI_Localizator {
|
|
|
732
745
|
static get Select(): "Wählen Sie Ihre" | "Select" | "Seleccionar" | "Sélectionne" | "Selecione" | "Seleziona";
|
|
733
746
|
static get SelectAnOperationBetween(): "Wählen Sie eine Operation zwischen" | "Select an operation between" | "Selecciona una operación entre" | "Sélectionnez une opération entre" | "Selecione uma operação entre" | "Seleziona un'operazione tra";
|
|
734
747
|
static get SelectDocumentToViewSearchResults(): "Wählen Sie ein Dokument aus, um die Details anzuzeigen" | "Select a document to view details" | "Selecciona un documento para ver los detalles" | "Sélectionnez un document pour afficher les détails" | "Selecione um documento para visualizar os detalhes" | "Seleziona un documento per visualizzare i dettagli";
|
|
748
|
+
static get SelectDcmtTypeForDetailArchiving(): "Dokumenttyp auswählen, für den die Details archiviert werden sollen" | "Select the document type for which to archive the details" | "Seleccionar el tipo de documento sobre el cual archivar los detalles" | "Sélectionner le type de document sur lequel archiver les détails" | "Selecionar o tipo de documento no qual arquivar os detalhes" | "Selezionare il tipo documento sul quale effettuare l'archiviazione dei dettagli";
|
|
735
749
|
static get SelectArchiveToStart(): "Klicken Sie auf Archivieren, um zu beginnen." | "Click on Archive button to start." | "Haz clic en el botón Archivar para comenzar." | "Cliquez sur le bouton Archiver pour commencer." | "Clique no botão Arquivar para iniciar." | "Clicca sul pulsante Archivia per iniziare.";
|
|
736
750
|
static get SelectAttachToStart(): "Sie können Dateien zu Ihrer E-Mail hinzufügen, klicken Sie auf Anhängen, um zu beginnen." | "You can attach files to your email, click on Attach button to start." | "Puedes adjuntar archivos a tu correo electrónico, haz clic en el botón Adjuntar para comenzar." | "Vous pouvez joindre des fichiers à votre e-mail, cliquez sur le bouton Joindre pour commencer." | "Você pode anexar arquivos ao seu e-mail, clique no botão Anexar para iniciar." | "Puoi allegare file alla tua email, clicca sul pulsante Allega per iniziare.";
|
|
737
751
|
static get SelectFromAttachments(): "Aus Anhängen auswählen" | "Select from attachments" | "Seleccionar de archivos adjuntos" | "Sélectionner parmi les pièces jointes" | "Selecionar dos anexos" | "Seleziona dagli allegati";
|
|
@@ -765,17 +779,21 @@ export declare class SDKUI_Localizator {
|
|
|
765
779
|
static get SharedDocuments(): "Gemeinsame Dokumente" | "Shared documents" | "Documentos compartidos" | "Documents partagés" | "Documentos compartilhados" | "Documenti condivisi";
|
|
766
780
|
static get Shortcuts(): "Tastenkombinationen" | "Shortcuts" | "Atajos" | "Raccourcis" | "Atalhos" | "Scorciatoie";
|
|
767
781
|
static get ShowAll(): "Alle anzeigen" | "Show all" | "Mostrar todo" | "Tout afficher" | "Mostrar tudo" | "Mostra tutti";
|
|
782
|
+
static get ShowArchivedDetails(): string;
|
|
768
783
|
static get ShowColumnSelection(): string;
|
|
769
784
|
static get ShowDcmtTypes(): string;
|
|
770
785
|
static get ShowFloatingBar(): string;
|
|
771
786
|
static get ShowLess(): "Weniger anzeigen" | "Show less" | "Mostrar menos" | "Afficher moins" | "Mostra meno";
|
|
772
787
|
static get Show_CompleteName(): "Vollständigen Namen anzeigen" | "View full name" | "Mostrar nombre completo" | "Afficher le nom complet" | "Mostrar nome completo" | "Visualizza nome completo";
|
|
773
788
|
static get ShowDetails(): "Details anzeigen" | "Show details" | "Mostrar detalles" | "Afficher les détails" | "Mostrar detalhes" | "Mostra dettagli";
|
|
789
|
+
static get ShowDetailsToArchive(): string;
|
|
774
790
|
static get ShowDetailsWithZeroDocs(): string;
|
|
775
791
|
static get ShowFilters(): string;
|
|
776
792
|
static get ShowFormattingOptions(): "Formatierungsoptionen anzeigen" | "Show formatting options" | "Mostrar opciones de formato" | "Afficher les options de formatage" | "Mostrar opções de formatação" | "Mostra opzioni di formattazione";
|
|
777
793
|
static get ShowHideMetadataSystemDesc(): "Anzeigen oder Verbergen von Methadaten des Dokumententypsystems" | "Shows/hides system metadata of selected document type" | "Ver u ocultar los metadatos de sistema del tipo de documento" | "Visualise ou cache les métadonnées de système du type de document" | "Mostra ou oculta o tipo de documento de metadados do sistema" | "Visualizza o nasconde i metadati di sistema del tipo documento";
|
|
778
794
|
static get ShowLeftPanel(): "Linkes Panel anzeigen" | "Show left panel" | "Mostrar panel izquierdo" | "Afficher le panneau de gauche" | "Mostrar painel esquerdo" | "Mostra il pannello sinistro";
|
|
795
|
+
static get ShowMasterInfo(): string;
|
|
796
|
+
static get ShowPartialResults(): string;
|
|
779
797
|
static get ShowSearch(): "Suche anzeigen" | "Show search" | "Mostrar búsqueda" | "Afficher la recherche" | "Mostrar pesquisa" | "Mostra ricerca";
|
|
780
798
|
static get ShowSharedDocuments(): "Gemeinsame Dokumente anzeigen" | "Show shared documents" | "Mostrar documentos compartidos" | "Afficher les documents partagés" | "Mostrar documentos compartilhados" | "Mostra documenti condivisi";
|
|
781
799
|
static get ShowColumnSeparatingLines(): string;
|