@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.
Files changed (41) hide show
  1. package/lib/components/NewComponents/ContextMenu/TMContextMenu.js +1 -1
  2. package/lib/components/NewComponents/FloatingMenuBar/TMFloatingMenuBar.js +1 -1
  3. package/lib/components/base/TMDataGrid.d.ts +2 -0
  4. package/lib/components/base/TMDataGrid.js +68 -4
  5. package/lib/components/base/TMModal.d.ts +4 -0
  6. package/lib/components/base/TMModal.js +42 -11
  7. package/lib/components/features/documents/TMDcmtForm.d.ts +7 -0
  8. package/lib/components/features/documents/TMDcmtForm.js +94 -40
  9. package/lib/components/features/documents/TMMasterDetailDcmts.js +88 -30
  10. package/lib/components/features/documents/TMMasterInfoFields.d.ts +19 -0
  11. package/lib/components/features/documents/TMMasterInfoFields.js +172 -0
  12. package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.d.ts +40 -0
  13. package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.js +256 -0
  14. package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.d.ts +352 -0
  15. package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.js +221 -0
  16. package/lib/components/features/documents/TMRelationViewer.d.ts +14 -1
  17. package/lib/components/features/documents/TMRelationViewer.js +69 -20
  18. package/lib/components/features/search/TMSearchResult.d.ts +8 -0
  19. package/lib/components/features/search/TMSearchResult.js +131 -23
  20. package/lib/components/layout/panelManager/TMPanelManagerContainer.d.ts +1 -0
  21. package/lib/components/layout/panelManager/TMPanelManagerContainer.js +24 -14
  22. package/lib/components/layout/panelManager/TMPanelWrapper.js +2 -2
  23. package/lib/components/layout/panelManager/types.d.ts +3 -0
  24. package/lib/helper/SDKUI_Globals.d.ts +34 -0
  25. package/lib/helper/SDKUI_Globals.js +37 -0
  26. package/lib/helper/SDKUI_Localizator.d.ts +18 -0
  27. package/lib/helper/SDKUI_Localizator.js +180 -0
  28. package/lib/helper/TMIcons.d.ts +1 -0
  29. package/lib/helper/TMIcons.js +3 -0
  30. package/lib/helper/dcmtsHelper.d.ts +20 -0
  31. package/lib/helper/dcmtsHelper.js +58 -1
  32. package/lib/helper/helpers.d.ts +9 -0
  33. package/lib/helper/helpers.js +8 -0
  34. package/lib/hooks/useArchiveListForm.d.ts +39 -0
  35. package/lib/hooks/useArchiveListForm.js +46 -0
  36. package/lib/hooks/useDocumentOperations.d.ts +1 -0
  37. package/lib/hooks/useDocumentOperations.js +16 -4
  38. package/lib/hooks/useMultiMasterDetailDcmts.d.ts +97 -0
  39. package/lib/hooks/useMultiMasterDetailDcmts.js +555 -0
  40. package/lib/hooks/useRelatedDocuments.js +2 -26
  41. 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
- 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 }) => {
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
- 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, onSelectionChanged: handleSelectionChange, onFocusedRowChanged: handleFocusedRowChange, onRowDblClick: onRowDblClick, onContentReady: onContentReady, showHeaderColumnChooser: true, onKeyDown: onKeyDown, customContextMenuItems: operationItems, counterConfig: {
1344
- show: true,
1345
- items: dcmtsReturned !== undefined && dcmtsFound !== undefined
1346
- ? new Map([
1347
- [CounterItemKey.allItems, {
1348
- key: CounterItemKey.allItems,
1349
- show: true,
1350
- caption: `${dcmtsReturned} restituiti su ${dcmtsFound} trovati`,
1351
- value: `${dcmtsReturned}/${dcmtsFound}`,
1352
- icon: _jsx(IconAll, {}),
1353
- order: -1
1354
- }]
1355
- ])
1356
- : undefined
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: ${Gutters.getGutters()}px;` : `height: ${Gutters.getGutters()}px;`)}
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, prevPanelIdForGutter, panel.id) })), _jsx(TMPanelWrapper, { panel: panel, children: jsxComponent
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, prevPanelIdForGutter, panel.id) })), _jsx(TMPanelWrapper, { panel: panel, children: panel.contentOptions.component })] }, panel.id));
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',
@@ -12,6 +12,9 @@ export interface TMPanelDefinition {
12
12
  isClosable?: boolean;
13
13
  isMaximizable?: boolean;
14
14
  panelContainer?: ITMPanelProps;
15
+ minWidth?: string;
16
+ minHeight?: string;
17
+ isCollapsed?: boolean;
15
18
  };
16
19
  toolbarOptions?: {
17
20
  icon: string | JSX.Element;
@@ -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;