@topconsultnpm/sdkui-react 6.20.0-dev2.1 → 6.20.0-dev2.10

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.
@@ -9,6 +9,7 @@ import TMChooserForm from '../forms/TMChooserForm';
9
9
  import { TMColors } from '../../utils/theme';
10
10
  import TMTooltip from '../base/TMTooltip';
11
11
  import { FormulaHelper } from '../editors/TMFormulaEditor';
12
+ import { TMExceptionBoxManager } from '../base/TMPopUp';
12
13
  const TMDynDataListItemChooser = ({ tid, md, width = '100%', titleForm, openChooserBySingleClick, readOnly, layoutMode = LayoutModes.None, queryParamsDynDataList, buttons = [], backgroundColor, showBorder = true, elementStyle, allowMultipleSelection, values, isModifiedWhen, label, placeHolder, validationItems = [], icon, labelColor, showClearButton, onValueChanged, onCascadeRefreshDynDataLists, onCascadeUpdateMIDs, updateIsModalOpen }) => {
13
14
  const [showChooser, setShowChooser] = useState(false);
14
15
  const [dynDl, setDynDl] = useState();
@@ -30,7 +31,9 @@ const TMDynDataListItemChooser = ({ tid, md, width = '100%', titleForm, openChoo
30
31
  setDynDl(d);
31
32
  if (!IsParametricQuery(d?.qd) && !dataSource) {
32
33
  setDataSource(undefined);
33
- loadData().then((result) => { setDataSource(result); });
34
+ loadData()
35
+ .then((result) => { setDataSource(result); })
36
+ .catch((err) => { TMExceptionBoxManager.show({ exception: err }); });
34
37
  }
35
38
  }, [md]);
36
39
  useEffect(() => {
@@ -42,12 +45,13 @@ const TMDynDataListItemChooser = ({ tid, md, width = '100%', titleForm, openChoo
42
45
  setDataSource(undefined);
43
46
  return;
44
47
  }
45
- loadData().then((result) => {
46
- setDataSource(result);
47
- });
48
+ loadData()
49
+ .then((result) => { setDataSource(result); })
50
+ .catch((err) => { TMExceptionBoxManager.show({ exception: err }); });
48
51
  }, [queryParamsDynDataList, dynDl]);
49
52
  const loadData = async () => {
50
- return await SDK_Globals.tmSession?.NewSearchEngine().GetDynDataListValuesAsync(tid, md?.id, layoutMode, queryParamsDynDataList ?? []);
53
+ return await SDK_Globals.tmSession?.NewSearchEngine().GetDynDataListValuesAsync(tid, md?.id, layoutMode, queryParamsDynDataList ?? [])
54
+ .catch((err) => { throw err; });
51
55
  };
52
56
  const getDescription = () => {
53
57
  if (!Array.isArray(values))
@@ -152,7 +156,8 @@ export const TMDynDataListItemChooserForm = (props) => {
152
156
  if (refreshCache)
153
157
  DataListCacheService.RemoveAll();
154
158
  TMSpinner.show({ description: `${SDKUI_Localizator.Loading} - ${SDK_Localizator.DataList} ...` });
155
- let result = await SDK_Globals.tmSession?.NewSearchEngine().GetDynDataListValuesAsync(props.TID, props.MID, props.layoutMode, []);
159
+ let result = await SDK_Globals.tmSession?.NewSearchEngine().GetDynDataListValuesAsync(props.TID, props.MID, props.layoutMode, [])
160
+ .catch((err) => { TMSpinner.hide(); TMExceptionBoxManager.show({ exception: err }); });
156
161
  TMSpinner.hide();
157
162
  return result ? searchResultDescriptorToSimpleArray(result) ?? [] : [];
158
163
  };
@@ -14,6 +14,7 @@ import { ChronologyMIDs, DraftsMIDs, DSAttachsMIDs } from "../../ts";
14
14
  import { TMNothingToShow } from "../features/documents/TMDcmtPreview";
15
15
  import TMAccordion from "../base/TMAccordion";
16
16
  import TabPanel, { Item } from 'devextreme-react/tab-panel';
17
+ import { TMExceptionBoxManager } from "../base/TMPopUp";
17
18
  export var ShowCheckBoxesMode;
18
19
  (function (ShowCheckBoxesMode) {
19
20
  ShowCheckBoxesMode[ShowCheckBoxesMode["Never"] = 0] = "Never";
@@ -165,7 +166,8 @@ const TMMetadataValues = ({ showCheckBoxes = ShowCheckBoxesMode.Never, checkPerm
165
166
  if (!d)
166
167
  return;
167
168
  let toBeRefreshed = [];
168
- let dynDlDataSource = await SDK_Globals.tmSession?.NewSearchEngine().GetDynDataListValuesAsync(tid, mid, layoutMode, qParams);
169
+ let dynDlDataSource = await SDK_Globals.tmSession?.NewSearchEngine().GetDynDataListValuesAsync(tid, mid, layoutMode, qParams)
170
+ .catch((err) => { TMExceptionBoxManager.show({ exception: err }); });
169
171
  if (!d.onValueChanged_DynDataListsToBeRefreshed)
170
172
  return;
171
173
  let row = dynDlDataSource?.dtdResult?.rows?.filter(o => o[d.selectItemForValue ?? 0] == value);
@@ -1,14 +1,14 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
3
  import TMDcmtPreview from './TMDcmtPreview';
4
- import { AccessLevels, ArchiveConstraints, ArchiveEngineByID, DcmtTypeListCacheService, LayoutCacheService, LayoutModes, MetadataDataTypes, ObjectClasses, ResultTypes, SDK_Globals, SDK_Localizator, SystemMIDsAsNumber, SystemTIDs, Task_States, TID_DID, UpdateEngineByID, UserListCacheService, ValidationItem, WorkflowCacheService, WorkItemMetadataNames } from '@topconsultnpm/sdk-ts';
4
+ import { AccessLevels, AppModules, ArchiveConstraints, ArchiveEngineByID, DcmtTypeListCacheService, LayoutCacheService, LayoutModes, MetadataDataTypes, ObjectClasses, ResultTypes, SDK_Globals, SDK_Localizator, SystemMIDsAsNumber, SystemTIDs, Task_States, TID_DID, UpdateEngineByID, UserListCacheService, ValidationItem, WorkflowCacheService, WorkItemMetadataNames } from '@topconsultnpm/sdk-ts';
5
5
  import { WorkFlowApproveRejectPopUp, WorkFlowMoreInfoPopUp, WorkFlowOperationButtons, WorkFlowReAssignPopUp } from '../workflow/TMWorkflowPopup';
6
6
  import { DownloadTypes, FormModes, DcmtOperationTypes } from '../../../ts';
7
7
  import { DeviceType, useDeviceType } from '../../base/TMDeviceProvider';
8
8
  import { useDcmtOperations } from '../../../hooks/useDcmtOperations';
9
9
  import { useRelatedDocuments } from '../../../hooks/useRelatedDocuments';
10
10
  import { getWorkItemSetIDAsync, handleArchiveVisibility, searchResultToMetadataValues } from '../../../helper/queryHelper';
11
- import { genUniqueId, IconShow, SDKUI_Localizator, updateMruTids, IconBoard, IconDcmtTypeSys, IconDetailDcmts, IconDownload, calcIsModified, IconMenuVertical, Globalization, getListMaxItems, getSystemMetadata, IconBoxArchiveIn, IconClear, IconUndo, SDKUI_Globals, IconPreview, isTaskMoreInfo, IconWorkflow, IconSearch, deepCompare, IconCheck, IconActivity, TMImageLibrary, IconStar, IconRelation, IconInfo, IconArchiveDoc, IconDelete, IconPair, IconUnpair, IconArchiveMaster, IconArchiveDetail, getExceptionMessage, isApprovalWorkflowView, getDcmtCicoStatus, IconFileDots, IconCustom, buildWorkItemsFromWFCtrl, IconLock } from '../../../helper';
11
+ import { genUniqueId, IconShow, SDKUI_Localizator, updateMruTids, IconBoard, IconDcmtTypeSys, IconDetailDcmts, IconDownload, calcIsModified, IconMenuVertical, Globalization, getListMaxItems, getSystemMetadata, IconBoxArchiveIn, IconClear, IconUndo, SDKUI_Globals, IconPreview, isTaskMoreInfo, IconWorkflow, IconSearch, deepCompare, IconCheck, IconActivity, TMImageLibrary, IconStar, IconRelation, IconInfo, IconArchiveDoc, IconDelete, IconPair, IconUnpair, IconArchiveMaster, IconArchiveDetail, getExceptionMessage, isApprovalWorkflowView, getDcmtCicoStatus, IconFileDots, IconCustom, buildWorkItemsFromWFCtrl, IconLock, getDcmtFormToolbarVisibility } from '../../../helper';
12
12
  import { hasDetailRelations, hasMasterRelations, isXMLFileExt } from '../../../helper/dcmtsHelper';
13
13
  import { Gutters, TMColors } from '../../../utils/theme';
14
14
  import { StyledFormButtonsContainer, StyledLoadingContainer, StyledModalContainer, StyledReferenceButton, StyledSpinner, StyledToolbarCardContainer } from '../../base/Styled';
@@ -123,6 +123,10 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
123
123
  const [refreshBlogTrigger, setRefreshBlogTrigger] = useState(0);
124
124
  const [wfError, setWfError] = useState(null);
125
125
  const [metadataDcmtOrigin, setMetadataDcmtOrigin] = useState(null);
126
+ const isReadOnlyOriginCallback = useCallback((fromTID) => {
127
+ return layoutMode !== LayoutModes.Ark && layoutMode !== LayoutModes.ArkFromBasket && layoutMode !== LayoutModes.ArkFromFile && layoutMode !== LayoutModes.ArkFromMail
128
+ && fromTID?.toString() !== TID?.toString();
129
+ }, [layoutMode, TID]);
126
130
  const triggerBlogRefresh = useCallback(async () => {
127
131
  setRefreshBlogTrigger(prev => prev + 1);
128
132
  }, []);
@@ -194,7 +198,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
194
198
  let dtd = res?.dtdResult;
195
199
  let rows = dtd.rows ? dtd.rows[0] : [];
196
200
  let mids = res?.selectMIDs;
197
- let metadataList = searchResultToMetadataValues(TID, dtd, rows, mids, mdList, layoutMode, origin.fromTID?.toString() !== TID?.toString());
201
+ let metadataList = searchResultToMetadataValues(TID, dtd, rows, mids, mdList, layoutMode, isReadOnlyOriginCallback(origin.fromTID));
198
202
  if (archived) {
199
203
  // Usa setFormData con funzione callback per accedere allo stato precedente
200
204
  // invece di dipendere da formDataOrig nell'array di dipendenze
@@ -282,7 +286,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
282
286
  }
283
287
  else {
284
288
  const renderedMetadata = dtd?.metadata?.filter((metadata) => handleArchiveVisibility(metadata)) ?? [];
285
- const metadataList = searchResultToMetadataValues(dtd?.id, undefined, [], [], renderedMetadata, layoutMode, metadataDcmtOrigin?.fromTID?.toString() !== TID?.toString());
289
+ const metadataList = searchResultToMetadataValues(dtd?.id, undefined, [], [], renderedMetadata, layoutMode, isReadOnlyOriginCallback(metadataDcmtOrigin?.fromTID));
286
290
  setFormDataOrig(structuredClone(metadataList));
287
291
  setFormData(structuredClone(metadataList));
288
292
  formDataOrigRef.current = structuredClone(metadataList);
@@ -297,7 +301,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
297
301
  setIsInitialLoading(false);
298
302
  setIsNavigating(false);
299
303
  }
300
- }, [TID, DID, layoutMode, inputFile, setMetadataList, handleReset, allowButtonsRefs, metadataDcmtOrigin?.fromTID]);
304
+ }, [TID, DID, layoutMode, inputFile, setMetadataList, handleReset, allowButtonsRefs, isReadOnlyOriginCallback, metadataDcmtOrigin?.fromTID]);
301
305
  const createChange = useCallback((mid, metadataType, modifiedValue) => {
302
306
  return { mid, metadataType, modifiedValue };
303
307
  }, []);
@@ -1216,7 +1220,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1216
1220
  }, [formData, fromDTD, isMobile]);
1217
1221
  const tmDcmtForm = useMemo(() => {
1218
1222
  return _jsxs(_Fragment, { children: [checkoutBadge && _jsx("div", { style: { padding: '10px', display: 'flex', justifyContent: 'center' }, children: checkoutBadge }), metadataValuesSource.length > 0 &&
1219
- _jsxs(StyledToolbarCardContainer, { children: [_jsx(TMMetadataValues, { TID: TID, metadataValues: metadataValuesSource, metadataValuesOrig: metadataValuesSourceOrig, isExpertMode: isExpertMode, isOpenDistinctValues: isOpenDistinctValues, openChooserBySingleClick: !isOpenDistinctValues, selectedMID: focusedMetadataValue?.mid, isReadOnly: formMode === FormModes.ReadOnly, layoutMode: layoutMode, deviceType: deviceType, validationItems: validationItems, inputMids: inputMids, layout: layout, isReadOnlyOrigin: metadataDcmtOrigin?.fromTID?.toString() !== TID?.toString(), onFocusedItemChanged: (item) => { (item?.mid !== focusedMetadataValue?.mid) && setFocusedMetadataValue(item); }, onValueChanged: (newItems) => {
1223
+ _jsxs(StyledToolbarCardContainer, { children: [_jsx(TMMetadataValues, { TID: TID, metadataValues: metadataValuesSource, metadataValuesOrig: metadataValuesSourceOrig, isExpertMode: isExpertMode, isOpenDistinctValues: isOpenDistinctValues, openChooserBySingleClick: !isOpenDistinctValues, selectedMID: focusedMetadataValue?.mid, isReadOnly: formMode === FormModes.ReadOnly, layoutMode: layoutMode, deviceType: deviceType, validationItems: validationItems, inputMids: inputMids, layout: layout, isReadOnlyOrigin: isReadOnlyOriginCallback(metadataDcmtOrigin?.fromTID), onFocusedItemChanged: (item) => { (item?.mid !== focusedMetadataValue?.mid) && setFocusedMetadataValue(item); }, onValueChanged: (newItems) => {
1220
1224
  setFormData((prevItems) => prevItems.map((item) => {
1221
1225
  const newItem = newItems.find((newItem) => newItem.tid === item.tid && newItem.mid === item.mid);
1222
1226
  return newItem ? { ...item, ...newItem } : item;
@@ -1262,7 +1266,8 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1262
1266
  handleConfirmAction,
1263
1267
  handleUndo,
1264
1268
  handleClearForm,
1265
- metadataDcmtOrigin
1269
+ isReadOnlyOriginCallback,
1270
+ metadataDcmtOrigin?.fromTID,
1266
1271
  ]);
1267
1272
  const tmBlog = useMemo(() => _jsx(TMDcmtBlog, { tid: TID, did: DID, allTasks: allTasks, fetchBlogDataTrigger: refreshBlogTrigger, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }), [TID, DID, allTasks, refreshBlogTrigger, handleNavigateToWGs, handleNavigateToDossiers]);
1268
1273
  const tmSysMetadata = useMemo(() => _jsx(TMMetadataValues, { layoutMode: layoutMode, openChooserBySingleClick: !isOpenDistinctValues, TID: TID, isReadOnly: true, deviceType: deviceType, metadataValues: formData.filter(o => (o.mid != undefined && o.mid <= 100)), metadataValuesOrig: formData.filter(o => (o.mid != undefined && o.mid <= 100)), validationItems: [], inputMids: inputMids }), [TID, layoutMode, formData, deviceType, inputMids]);
@@ -1384,7 +1389,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1384
1389
  const { assignedToMe, assignedByMe } = getDcmtTasksCounter(TID, DID, allTasks);
1385
1390
  let titleDcmtFormPanel = fromDTD?.nameLoc ?? "";
1386
1391
  // Caso: Il documento proviene da un'origine esterna
1387
- if (metadataDcmtOrigin?.fromTID?.toString() !== TID?.toString()) {
1392
+ if (isReadOnlyOriginCallback(metadataDcmtOrigin?.fromTID)) {
1388
1393
  titleDcmtFormPanel = (_jsxs("div", { style: { display: 'inline-flex', alignItems: 'center', gap: '4px' }, children: [_jsx(TMTooltip, { content: _jsxs("div", { style: { textAlign: 'left' }, children: [_jsx("p", { children: "Questo documento proviene da un'altra origine e non pu\u00F2 essere modificato." }), _jsx("hr", {}), _jsxs("p", { children: [_jsx("strong", { children: "TID corrente:" }), " ", TID?.toString()] }), _jsxs("p", { children: [_jsx("strong", { children: "Nome corrente:" }), " ", fromDTD?.nameLoc] }), _jsx("hr", {}), _jsxs("p", { children: [_jsx("strong", { children: "TID origine:" }), " ", metadataDcmtOrigin?.fromTID?.toString()] }), _jsxs("p", { children: [_jsx("strong", { children: "Nome origine:" }), " ", metadataDcmtOrigin?.fromName] })] }), children: _jsx(IconLock, { fontSize: 16, style: { alignSelf: 'center' } }) }), metadataDcmtOrigin?.fromName] }));
1389
1394
  }
1390
1395
  const panels = [
@@ -1405,7 +1410,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1405
1410
  },
1406
1411
  toolbarOptions: {
1407
1412
  icon: _jsx(IconPreview, { fontSize: 24 }),
1408
- visible: true,
1413
+ visible: getDcmtFormToolbarVisibility(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER).tmDcmtForm,
1409
1414
  orderNumber: 1,
1410
1415
  isActive: allInitialPanelVisibility['tmDcmtForm']
1411
1416
  }
@@ -1416,7 +1421,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1416
1421
  contentOptions: { component: tmBlog, panelContainer: { title: SDKUI_Localizator.BlogCase, allowMaximize: !isMobile } },
1417
1422
  toolbarOptions: {
1418
1423
  icon: _jsx(IconBoard, { fontSize: 24 }),
1419
- visible: true,
1424
+ visible: getDcmtFormToolbarVisibility(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER).tmBlog,
1420
1425
  disabled: isBoardDisabled,
1421
1426
  orderNumber: 2,
1422
1427
  isActive: allInitialPanelVisibility['tmBlog']
@@ -1426,13 +1431,13 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1426
1431
  id: 'tmSysMetadata',
1427
1432
  name: SDKUI_Localizator.MetadataSystem,
1428
1433
  contentOptions: { component: tmSysMetadata, panelContainer: { title: SDKUI_Localizator.MetadataSystem, allowMaximize: !isMobile } },
1429
- toolbarOptions: { icon: _jsx(IconDcmtTypeSys, { fontSize: 24 }), visible: true, disabled: isSysMetadataDisabled, orderNumber: 3, isActive: allInitialPanelVisibility['tmSysMetadata'] }
1434
+ toolbarOptions: { icon: _jsx(IconDcmtTypeSys, { fontSize: 24 }), visible: getDcmtFormToolbarVisibility(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER).tmSysMetadata, disabled: isSysMetadataDisabled, orderNumber: 3, isActive: allInitialPanelVisibility['tmSysMetadata'] }
1430
1435
  },
1431
1436
  {
1432
1437
  id: 'tmDcmtPreview',
1433
1438
  name: SDKUI_Localizator.PreviewDocument,
1434
1439
  contentOptions: { component: tmDcmtPreview },
1435
- toolbarOptions: { icon: _jsx(IconShow, { fontSize: 24 }), disabled: isPreviewDisabled, visible: true, orderNumber: 4, isActive: allInitialPanelVisibility['tmDcmtPreview'] }
1440
+ toolbarOptions: { icon: _jsx(IconShow, { fontSize: 24 }), disabled: isPreviewDisabled, visible: getDcmtFormToolbarVisibility(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER).tmDcmtPreview, orderNumber: 4, isActive: allInitialPanelVisibility['tmDcmtPreview'] }
1436
1441
  },
1437
1442
  {
1438
1443
  id: 'tmWF',
@@ -1445,7 +1450,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1445
1450
  },
1446
1451
  toolbarOptions: {
1447
1452
  icon: _jsx(IconWorkflow, { fontSize: 24 }),
1448
- visible: true,
1453
+ visible: getDcmtFormToolbarVisibility(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER).tmWF,
1449
1454
  disabled: isWFDisabled,
1450
1455
  orderNumber: 5,
1451
1456
  isActive: allInitialPanelVisibility['tmWF']
@@ -1459,7 +1464,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1459
1464
  },
1460
1465
  toolbarOptions: {
1461
1466
  icon: _jsx(IconActivity, { fontSize: 24 }),
1462
- visible: layoutMode !== LayoutModes.Ark,
1467
+ visible: layoutMode !== LayoutModes.Ark && getDcmtFormToolbarVisibility(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER).tmDcmtTasks,
1463
1468
  orderNumber: 6,
1464
1469
  isActive: allInitialPanelVisibility['tmDcmtTasks'],
1465
1470
  count: assignedToMe + assignedByMe,
@@ -1468,7 +1473,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1468
1473
  },
1469
1474
  ];
1470
1475
  return panels;
1471
- }, [fromDTD, showBackButton, tmDcmtForm, tmBlog, tmSysMetadata, tmDcmtPreview, tmWF, tmDcmtTasks, isPreviewDisabled, isSysMetadataDisabled, isBoardDisabled, isWFDisabled, inputFile, isClosable, allTasks, DID, TID, metadataDcmtOrigin?.fromTID]);
1476
+ }, [fromDTD, showBackButton, tmDcmtForm, tmBlog, tmSysMetadata, tmDcmtPreview, tmWF, tmDcmtTasks, isPreviewDisabled, isSysMetadataDisabled, isBoardDisabled, isWFDisabled, inputFile, isClosable, allTasks, DID, TID, isReadOnlyOriginCallback, metadataDcmtOrigin?.fromTID]);
1472
1477
  // Retrieves the current document form setting based on the normalized TID
1473
1478
  const getCurrentDcmtFormSetting = () => {
1474
1479
  const settings = SDKUI_Globals.userSettings.dcmtFormSettings;
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useMemo, useRef, useState } from 'react';
3
3
  import styled from 'styled-components';
4
- import { RetrieveFileOptions, DcmtOpers, GeneralRetrieveFormats, FileFormats } from '@topconsultnpm/sdk-ts';
5
- import { extensionHandler, sleep, getExceptionMessage, formatBytes, IconMenuVertical, IconCloseCircle, IconClear, IconCloseOutline, IconPreview, SDKUI_Globals, IconZoomOutLinear, IconZoomInLinear, IconPrintOutline, SDKUI_Localizator, IconRefresh, IconCache } from '../../../helper';
4
+ import { RetrieveFileOptions, DcmtOpers, GeneralRetrieveFormats, FileFormats, SDK_Globals } from '@topconsultnpm/sdk-ts';
5
+ import { extensionHandler, sleep, getExceptionMessage, formatBytes, IconMenuVertical, IconCloseCircle, IconClear, IconCloseOutline, IconPreview, SDKUI_Globals, IconZoomOutLinear, IconZoomInLinear, IconPrintOutline, SDKUI_Localizator, IconRefresh, IconCache, dcmtsFileCachePreview, CACHE_SIZE_LIMIT } from '../../../helper';
6
6
  import { useDcmtOperations } from '../../../hooks/useDcmtOperations';
7
7
  import { FileExtensionHandler, FormModes } from '../../../ts';
8
8
  import { TMColors } from '../../../utils/theme';
@@ -29,7 +29,15 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
29
29
  const [error, setError] = useState('');
30
30
  const [isAbortError, setIsAbortError] = useState(false);
31
31
  const { abortController, showWaitPanel, waitPanelTitle, showPrimary, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, getDcmtFileAsync, clearDcmtsFileCache, removeDcmtsFileCache, isDcmtFileInCache } = useDcmtOperations();
32
- const cacheKey = dcmtData ? `${dcmtData.tid}-${dcmtData.did}` : '00';
32
+ const isBasketMode = !!(dcmtData?.btid !== undefined && dcmtData?.bid !== undefined && dcmtData?.bfid !== undefined);
33
+ const getCacheKey = () => {
34
+ if (!dcmtData)
35
+ return '00';
36
+ if (isBasketMode)
37
+ return `basket-${dcmtData.btid}-${dcmtData.bid}-${dcmtData.bfid}`;
38
+ return `${dcmtData.tid}-${dcmtData.did}`;
39
+ };
40
+ const cacheKey = getCacheKey();
33
41
  const [hasLoadedDataOnce, setHasLoadedDataOnce] = useState(false);
34
42
  const [lastLoadedDid, setLastLoadedDid] = useState(undefined);
35
43
  useEffect(() => {
@@ -41,10 +49,10 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
41
49
  setShowPreview(false);
42
50
  return;
43
51
  }
44
- const currentCacheKey = `${dcmtData.tid}-${dcmtData.did}`;
52
+ const currentCacheKey = isBasketMode ? `basket-${dcmtData.btid}-${dcmtData.bid}-${dcmtData.bfid}` : `${dcmtData.tid}-${dcmtData.did}`;
45
53
  const shouldFetch = isVisible && (!hasLoadedDataOnce || currentCacheKey !== lastLoadedDid);
46
54
  if (isDcmtFileInCache(currentCacheKey)) {
47
- loadDocumentWithCache();
55
+ isBasketMode ? loadBasketFile() : loadDocumentWithCache();
48
56
  setShowPreview(true);
49
57
  return;
50
58
  }
@@ -52,7 +60,11 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
52
60
  setDcmtBlob(undefined);
53
61
  setError('');
54
62
  setIsAbortError(false);
55
- if ((extensionHandler(dcmtData.fileExt) !== FileExtensionHandler.NONE) && ((dcmtData.fileSize ?? 0) <= (SDKUI_Globals.userSettings.searchSettings.previewThreshold * 1024))) {
63
+ if (isBasketMode) {
64
+ loadBasketFile();
65
+ setShowPreview(true);
66
+ }
67
+ else if ((extensionHandler(dcmtData.fileExt) !== FileExtensionHandler.NONE) && ((dcmtData.fileSize ?? 0) <= (SDKUI_Globals.userSettings.searchSettings.previewThreshold * 1024))) {
56
68
  loadDocumentWithCache();
57
69
  setShowPreview(true);
58
70
  }
@@ -63,6 +75,47 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
63
75
  setLastLoadedDid(currentCacheKey);
64
76
  }
65
77
  }, [dcmtData?.did, isVisible, hasLoadedDataOnce, lastLoadedDid]);
78
+ const loadBasketFile = async () => {
79
+ try {
80
+ // Check cache first
81
+ if (dcmtsFileCachePreview.has(cacheKey)) {
82
+ setDcmtBlob(dcmtsFileCachePreview.get(cacheKey));
83
+ setIsFromCache(true);
84
+ setError('');
85
+ setIsAbortError(false);
86
+ return;
87
+ }
88
+ await sleep(300);
89
+ const basketEngine = SDK_Globals.tmSession?.NewBasketEngine();
90
+ const cvtFormat = extensionHandler(dcmtData?.fileExt) === FileExtensionHandler.CONVERTIBLE ? FileFormats.PDF : FileFormats.None;
91
+ const file = await basketEngine?.RetrieveFileAsync(dcmtData?.btid, dcmtData?.bid, dcmtData?.bfid, cvtFormat, abortController.signal);
92
+ // Store in cache
93
+ if (file) {
94
+ if (dcmtsFileCachePreview.size >= CACHE_SIZE_LIMIT) {
95
+ const oldestKey = dcmtsFileCachePreview.keys().next().value;
96
+ dcmtsFileCachePreview.delete(oldestKey);
97
+ }
98
+ dcmtsFileCachePreview.set(cacheKey, file);
99
+ }
100
+ setDcmtBlob(file);
101
+ setIsFromCache(false);
102
+ setError('');
103
+ setIsAbortError(false);
104
+ }
105
+ catch (ex) {
106
+ const err = ex;
107
+ if (err.name === 'CanceledError') {
108
+ setError('Operazione annullata.');
109
+ setIsAbortError(true);
110
+ ShowAlert({ message: err.message, mode: 'warning', duration: 3000, title: 'Abort' });
111
+ }
112
+ else {
113
+ setError(getExceptionMessage(ex));
114
+ setIsAbortError(false);
115
+ TMExceptionBoxManager.show({ exception: ex });
116
+ }
117
+ }
118
+ };
66
119
  const loadDocumentWithCache = async () => {
67
120
  const rfo = new RetrieveFileOptions();
68
121
  rfo.retrieveReason = DcmtOpers.None;
@@ -94,7 +147,7 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
94
147
  };
95
148
  const titleHandler = () => {
96
149
  let title = 'Anteprima ';
97
- if (!dcmtData?.did)
150
+ if (!dcmtData?.did && !isBasketMode)
98
151
  return title;
99
152
  let extensionInfo;
100
153
  if (dcmtData.fileExt !== null) {
@@ -120,7 +173,7 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
120
173
  setIsAbortError(false);
121
174
  setDcmtBlob(undefined);
122
175
  try {
123
- await loadDocumentWithCache();
176
+ isBasketMode ? await loadBasketFile() : await loadDocumentWithCache();
124
177
  }
125
178
  catch (error) {
126
179
  console.error('Error reopening document:', error);
@@ -132,7 +185,7 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
132
185
  ], [cacheKey, removeDcmtsFileCache, clearDcmtsFileCache, setIsFromCache]);
133
186
  return (_jsx(TMLayoutWaitingContainer, { direction: 'vertical', showWaitPanel: showWaitPanel, showWaitPanelPrimary: showPrimary, showWaitPanelSecondary: showSecondary, waitPanelTitle: waitPanelTitle, waitPanelTextPrimary: waitPanelTextPrimary, waitPanelValuePrimary: waitPanelValuePrimary, waitPanelMaxValuePrimary: waitPanelMaxValuePrimary, waitPanelTextSecondary: waitPanelTextSecondary, waitPanelValueSecondary: waitPanelValueSecondary, waitPanelMaxValueSecondary: waitPanelMaxValueSecondary, isCancelable: true, abortController: abortController, children: _jsx(TMPanel, { padding: '0', title: titleHandler(), onClose: onClosePanel, allowMaximize: allowMaximize, onMaximize: onMaximizePanel, onHeaderDoubleClick: onMaximizePanel, toolbar: _jsxs("div", { style: { width: 'max-content', display: 'flex', alignItems: 'center', gap: '10px' }, children: [onPrev && _jsx(TMSaveFormButtonPrevious, { btnStyle: 'icon', isModified: false, formMode: FormModes.ReadOnly, canPrev: canPrev, onPrev: onPrev }), onNext && _jsx(TMSaveFormButtonNext, { btnStyle: 'icon', isModified: false, formMode: FormModes.ReadOnly, canNext: canNext, onNext: onNext }), _jsx(StyledHeaderIcon, { "$color": TMColors.primaryColor, children: _jsx(ContextMenu, { items: cacheMenuItems, trigger: "left", children: _jsx(IconMenuVertical, {}) }) }), _jsx(StyledHeaderIcon, { onClick: reOpenDcmt, "$color": TMColors.primaryColor, children: _jsx(TMTooltip, { content: SDKUI_Localizator.ReopenDocument, children: _jsx(IconRefresh, {}) }) })] }), children: error
134
187
  ? _jsx(ErrorContent, { error: error, isAbortError: isAbortError, onRetry: reOpenDcmt })
135
- : renderedPreview(dcmtData?.tid, dcmtData?.did, dcmtData?.fileExt, dcmtData?.fileSize, dcmtData?.fileCount, extensionHandler(dcmtData?.fileExt), showPreview, isResizingActive, () => { loadDocumentWithCache(); setShowPreview(true); }, dcmtBlob) }) }));
188
+ : renderedPreview(dcmtData?.tid, dcmtData?.did, dcmtData?.fileExt, dcmtData?.fileSize, dcmtData?.fileCount, extensionHandler(dcmtData?.fileExt), showPreview, isResizingActive, () => { isBasketMode ? loadBasketFile() : loadDocumentWithCache(); setShowPreview(true); }, dcmtBlob, isBasketMode) }) }));
136
189
  };
137
190
  export default TMDcmtPreview;
138
191
  export const TMFileViewer = ({ fileBlob, isResizingActive }) => {
@@ -382,13 +435,13 @@ const ImageViewer = ({ fileBlob, alt = 'Image', className }) => {
382
435
  export const TMNothingToShow = ({ text = '', secondText, fileExt, icon = _jsx(IconPreview, { fontSize: 96 }) }) => {
383
436
  return (_jsx(StyledAnimatedComponentOpacity, { style: { width: '100%', height: '100%' }, children: _jsxs(StyledPanelStatusContainer, { children: [icon, _jsxs(StyledPreviewNotAvailable, { children: [text && _jsx("div", { children: text }), _jsxs("div", { children: [" ", secondText ?? SDKUI_Localizator.PreviewNotAvailable, fileExt && _jsx("b", { children: ` (*.${fileExt})` })] })] })] }) }));
384
437
  };
385
- const renderedPreview = (tid, did, fileExt, fileSize, fileCount, extHandler, showPreview, isResizingActive, onDownloadShowPreviewClick, dcmtBlob) => {
386
- if (!did)
438
+ const renderedPreview = (tid, did, fileExt, fileSize, fileCount, extHandler, showPreview, isResizingActive, onDownloadShowPreviewClick, dcmtBlob, isBasketMode) => {
439
+ if (!isBasketMode && !did)
387
440
  return _jsx(TMNothingToShow, { text: `${SDKUI_Localizator.NoDcmtSelected}.` });
388
- if (fileCount == 0) {
441
+ if (!isBasketMode && fileCount == 0) {
389
442
  return _jsx(TMNothingToShow, { text: SDKUI_Localizator.MetadataOnlyDocument });
390
443
  }
391
- if (fileExt && extHandler === FileExtensionHandler.NONE) {
444
+ if (!isBasketMode && fileExt && extHandler === FileExtensionHandler.NONE) {
392
445
  return _jsx(TMNothingToShow, { fileExt: fileExt });
393
446
  }
394
447
  if (showPreview) {
@@ -1,9 +1,9 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
- import { SDK_Globals, DataColumnTypes, MetadataDataDomains, DataListViewModes, MetadataFormats, LayoutModes, DcmtTypeListCacheService, SystemMIDsAsNumber, RetrieveFileOptions, DcmtOpers, GeneralRetrieveFormats, AccessLevelsEx, LayoutCacheService, UserListCacheService } from '@topconsultnpm/sdk-ts';
3
+ import { SDK_Globals, DataColumnTypes, MetadataDataDomains, DataListViewModes, MetadataFormats, LayoutModes, DcmtTypeListCacheService, SystemMIDsAsNumber, RetrieveFileOptions, DcmtOpers, GeneralRetrieveFormats, AccessLevelsEx, LayoutCacheService, UserListCacheService, AppModules } from '@topconsultnpm/sdk-ts';
4
4
  import styled from 'styled-components';
5
5
  import { getAllFieldSelectedDcmtsOrFocused, getCommandsMenuItems, getSelectedDcmtsOrFocused } from './TMSearchResultsMenuItems';
6
- import { genUniqueId, IconShow, IconBoard, IconDcmtTypeSys, SDKUI_Localizator, IconDelete, IconRefresh, IconMenuVertical, deepCompare, generateUniqueColumnKeys, searchResultDescriptorToSimpleArray, searchResultToMetadataValues, IconSearchCheck, TMImageLibrary, convertSearchResultDescriptorToFileItems, IconCustom, isApprovalWorkflowView, SDKUI_Globals, getMoreInfoTasksForDocument, IconInfo, IconCache } from '../../../helper';
6
+ import { genUniqueId, IconShow, IconBoard, IconDcmtTypeSys, SDKUI_Localizator, IconDelete, IconRefresh, IconMenuVertical, deepCompare, generateUniqueColumnKeys, searchResultDescriptorToSimpleArray, searchResultToMetadataValues, IconSearchCheck, TMImageLibrary, convertSearchResultDescriptorToFileItems, IconCustom, isApprovalWorkflowView, SDKUI_Globals, getMoreInfoTasksForDocument, IconInfo, IconCache, IconPlatform, getSearchToolbarVisibility } from '../../../helper';
7
7
  import { useDcmtOperations } from '../../../hooks/useDcmtOperations';
8
8
  import { useInputAttachmentsDialog, useInputCvtFormatDialog } from '../../../hooks/useInputDialog';
9
9
  import { useRelatedDocuments } from '../../../hooks/useRelatedDocuments';
@@ -101,6 +101,7 @@ const TMSearchResult = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, a
101
101
  const [indexingInfoCache, setIndexingInfoCache] = useState(new Map());
102
102
  const [showIndexingInfo, setShowIndexingInfo] = useState(false);
103
103
  const [loadingIndexingInfo, setLoadingIndexingInfo] = useState(false);
104
+ const [openedDrawerItems, setOpenedDrawerItems] = useState(new Set());
104
105
  const floatingBarContainerRef = useRef(null);
105
106
  const [confirmFormat, ConfirmFormatDialog] = useInputCvtFormatDialog();
106
107
  const { openConfirmAttachmentsDialog, ConfirmAttachmentsDialog } = useInputAttachmentsDialog();
@@ -736,23 +737,49 @@ const TMSearchResult = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, a
736
737
  const tmBlog = useMemo(() => _jsx(TMDcmtBlog, { tid: focusedItem?.TID, did: focusedItem?.DID, fetchBlogDataTrigger: refreshBlogTrigger, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }), [focusedItem, allTasks, refreshBlogTrigger, handleNavigateToWGs, handleNavigateToDossiers]);
737
738
  const tmSysMetadata = useMemo(() => _jsx(TMMetadataValues, { layoutMode: LayoutModes.Update, openChooserBySingleClick: true, TID: focusedItem?.TID, isReadOnly: true, deviceType: deviceType, metadataValues: currentMetadataValues.filter(o => (o.mid != undefined && o.mid <= 100)), metadataValuesOrig: currentMetadataValues.filter(o => (o.mid != undefined && o.mid <= 100)), validationItems: [] }), [focusedItem, currentMetadataValues, deviceType]);
738
739
  const tmDcmtPreview = useMemo(() => _jsx(TMDcmtPreviewWrapper, { currentDcmt: currentDcmt }, refreshPreviewTrigger), [currentDcmt, refreshPreviewTrigger]);
740
+ useEffect(() => {
741
+ if (!focusedItem)
742
+ return;
743
+ const cacheKey = `${focusedItem.TID}-${focusedItem.DID}`;
744
+ setShowIndexingInfo(openedDrawerItems.has(cacheKey));
745
+ }, [focusedItem, openedDrawerItems]);
739
746
  const handleToggleIndexingInfo = async () => {
740
747
  if (!focusedItem)
741
748
  return;
749
+ const cacheKey = `${focusedItem.TID}-${focusedItem.DID}`;
742
750
  if (showIndexingInfo) {
751
+ setOpenedDrawerItems(prev => {
752
+ const newSet = new Set(prev);
753
+ newSet.delete(cacheKey);
754
+ return newSet;
755
+ });
743
756
  setShowIndexingInfo(false);
744
757
  return;
745
758
  }
746
- const cacheKey = `${focusedItem.TID}-${focusedItem.DID}`;
747
- if (indexingInfoCache.has(cacheKey)) {
748
- setShowIndexingInfo(true);
749
- return;
759
+ setOpenedDrawerItems(prev => new Set(prev).add(cacheKey));
760
+ setShowIndexingInfo(true);
761
+ if (!indexingInfoCache.has(cacheKey)) {
762
+ try {
763
+ setLoadingIndexingInfo(true);
764
+ const msg = await SDK_Globals.tmSession?.NewSearchEngine().FreeSearchGetDcmtInfoAsync(focusedItem.TID, focusedItem.DID);
765
+ setIndexingInfoCache(prev => new Map(prev).set(cacheKey, msg ?? ''));
766
+ }
767
+ catch (e) {
768
+ TMExceptionBoxManager.show({ exception: e });
769
+ }
770
+ finally {
771
+ setLoadingIndexingInfo(false);
772
+ }
750
773
  }
774
+ };
775
+ const handleRefreshIndexingInfo = async () => {
776
+ if (!focusedItem)
777
+ return;
778
+ const cacheKey = `${focusedItem.TID}-${focusedItem.DID}`;
751
779
  try {
752
780
  setLoadingIndexingInfo(true);
753
781
  const msg = await SDK_Globals.tmSession?.NewSearchEngine().FreeSearchGetDcmtInfoAsync(focusedItem.TID, focusedItem.DID);
754
782
  setIndexingInfoCache(prev => new Map(prev).set(cacheKey, msg ?? ''));
755
- setShowIndexingInfo(true);
756
783
  }
757
784
  catch (e) {
758
785
  TMExceptionBoxManager.show({ exception: e });
@@ -765,8 +792,7 @@ const TMSearchResult = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, a
765
792
  if (!focusedItem) {
766
793
  return (_jsxs(StyledPlaceholder, { children: [" ", _jsx("p", { children: "Seleziona un documento per visualizzare i dettagli della ricerca full-text" }), " "] }));
767
794
  }
768
- // const ftExplanationsColumnIndex = selectedSearchResult?.dtdResult?.columns?.findIndex( col => col.caption === 'FTExplanations' );
769
- const ftExplanationsColumnIndex = selectedSearchResult?.selectMIDs?.findIndex(mid => mid === 0); //nosonar
795
+ const ftExplanationsColumnIndex = selectedSearchResult?.dtdResult?.columns?.findIndex(col => col.caption === 'FTExplanations');
770
796
  if (ftExplanationsColumnIndex === undefined || ftExplanationsColumnIndex < 0) {
771
797
  return (_jsxs(StyledPlaceholder, { children: [" ", _jsx("p", { children: "Nessuna info full-text disponibile" }), " "] }));
772
798
  }
@@ -780,21 +806,21 @@ const TMSearchResult = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, a
780
806
  }
781
807
  const cacheKey = `${focusedItem.TID}-${focusedItem.DID}`;
782
808
  const cachedInfo = indexingInfoCache.get(cacheKey);
783
- return (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', height: '100%', overflow: 'hidden' }, children: [_jsx("div", { style: { padding: '10px', overflow: 'auto', flex: 1 }, children: _jsx("div", { dangerouslySetInnerHTML: { __html: ftExplanation } }) }), _jsxs(StyledIndexingInfoSection, { children: [_jsxs(StyledIndexingToggle, { onClick: handleToggleIndexingInfo, disabled: loadingIndexingInfo, children: [_jsxs(StyledLeftContent, { children: [_jsx(IconInfo, {}), _jsx("span", { children: showIndexingInfo ? 'Nascondi info' : SDKUI_Localizator.IndexingInformation })] }), _jsxs(StyledRightContent, { children: [cachedInfo && (_jsx(TMTooltip, { content: "Da cache", children: _jsx(StyledCachedIcon, { children: _jsx(IconCache, {}) }) })), _jsx(StyledChevron, { "$isOpen": showIndexingInfo, children: "\u25BC" })] })] }), loadingIndexingInfo && (_jsxs("div", { style: { marginTop: '10px', color: '#666' }, children: [SDKUI_Localizator.Loading, "..."] })), showIndexingInfo && cachedInfo && !loadingIndexingInfo && (_jsx(StyledIndexingInfoBox, { children: _jsx("div", { dangerouslySetInnerHTML: { __html: cachedInfo } }) }))] })] }));
809
+ return (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', height: '100%', overflow: 'hidden', width: '100%' }, children: [_jsx("div", { style: { padding: '10px', overflow: 'auto', flex: 1 }, children: _jsx("div", { dangerouslySetInnerHTML: { __html: ftExplanation } }) }), _jsxs(StyledIndexingInfoSection, { children: [_jsxs(StyledIndexingToggle, { onClick: handleToggleIndexingInfo, disabled: loadingIndexingInfo, children: [_jsxs(StyledLeftContent, { children: [_jsx(IconInfo, {}), _jsx("span", { children: showIndexingInfo ? 'Nascondi' : SDKUI_Localizator.IndexingInformation })] }), _jsxs(StyledRightContent, { children: [cachedInfo && (_jsxs(_Fragment, { children: [_jsx(TMTooltip, { content: "Aggiorna", children: _jsx(StyledRefreshIcon, { onClick: (e) => { e.stopPropagation(); handleRefreshIndexingInfo(); }, children: _jsx(IconRefresh, {}) }) }), _jsx(TMTooltip, { content: "Da cache", children: _jsx(StyledCachedIcon, { children: _jsx(IconCache, {}) }) })] })), _jsx(StyledChevron, { "$isOpen": showIndexingInfo, children: "\u25BC" })] })] }), loadingIndexingInfo && !cachedInfo && (_jsxs("div", { style: { marginTop: '10px', color: '#666' }, children: [SDKUI_Localizator.Loading, "..."] })), showIndexingInfo && cachedInfo && (_jsxs(StyledIndexingInfoBox, { children: [_jsx("div", { dangerouslySetInnerHTML: { __html: cachedInfo } }), loadingIndexingInfo && (_jsxs("div", { style: { position: 'absolute', top: '50%', left: '50%', transform: 'translate(-50%, -50%)', background: 'rgba(255, 255, 255, 0.9)', padding: '10px', borderRadius: '4px', boxShadow: '0 2px 8px rgba(0,0,0,0.15)' }, children: [SDKUI_Localizator.Loading, "..."] }))] }))] })] }));
784
810
  }, [selectedSearchResult, focusedItem, indexingInfoCache, showIndexingInfo, loadingIndexingInfo]);
785
811
  const allInitialPanelVisibility = {
786
812
  'tmSearchResult': true,
787
813
  'tmBlog': false,
788
814
  'tmSysMetadata': false,
789
815
  'tmDcmtPreview': false,
790
- // 'tmFullTextSearch': false,
816
+ 'tmFullTextSearch': false,
791
817
  };
792
818
  const initialPanelDimensions = {
793
819
  'tmSearchResult': { width: '25%', height: '100%' },
794
820
  'tmBlog': { width: '25%', height: '100%' },
795
821
  'tmSysMetadata': { width: '25%', height: '100%' },
796
822
  'tmDcmtPreview': { width: '25%', height: '100%' },
797
- // 'tmFullTextSearch': { width: '25%', height: '100%' },
823
+ 'tmFullTextSearch': { width: '25%', height: '100%' },
798
824
  };
799
825
  const initialPanels = useMemo(() => [
800
826
  {
@@ -813,34 +839,34 @@ const TMSearchResult = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, a
813
839
  toolbar: searchResutlToolbar
814
840
  },
815
841
  },
816
- toolbarOptions: { icon: _jsx(IconSearchCheck, { fontSize: 24 }), visible: true, orderNumber: 1, isActive: allInitialPanelVisibility['tmSearchResult'] }
842
+ toolbarOptions: { icon: _jsx(IconSearchCheck, { fontSize: 24 }), visible: getSearchToolbarVisibility(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER).tmSearchResult, orderNumber: 1, isActive: allInitialPanelVisibility['tmSearchResult'] }
817
843
  },
818
844
  {
819
845
  id: 'tmBlog',
820
846
  name: SDKUI_Localizator.BlogCase,
821
847
  contentOptions: { component: tmBlog, panelContainer: { title: SDKUI_Localizator.BlogCase, allowMaximize: !isMobile } },
822
- toolbarOptions: { icon: _jsx(IconBoard, { fontSize: 24 }), visible: true, orderNumber: 2, isActive: allInitialPanelVisibility['tmBlog'] }
848
+ toolbarOptions: { icon: _jsx(IconBoard, { fontSize: 24 }), visible: getSearchToolbarVisibility(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER).tmBlog, orderNumber: 2, isActive: allInitialPanelVisibility['tmBlog'] }
823
849
  },
824
850
  {
825
851
  id: 'tmSysMetadata',
826
852
  name: SDKUI_Localizator.MetadataSystem,
827
853
  contentOptions: { component: tmSysMetadata, panelContainer: { title: SDKUI_Localizator.MetadataSystem, allowMaximize: !isMobile } },
828
- toolbarOptions: { icon: _jsx(IconDcmtTypeSys, { fontSize: 24 }), visible: true, orderNumber: 3, isActive: allInitialPanelVisibility['tmSysMetadata'] }
854
+ toolbarOptions: { icon: _jsx(IconDcmtTypeSys, { fontSize: 24 }), visible: getSearchToolbarVisibility(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER).tmSysMetadata, orderNumber: 3, isActive: allInitialPanelVisibility['tmSysMetadata'] }
829
855
  },
830
856
  {
831
857
  id: 'tmDcmtPreview',
832
858
  name: SDKUI_Localizator.PreviewDocument,
833
859
  contentOptions: { component: tmDcmtPreview },
834
- toolbarOptions: { icon: _jsx(IconShow, { fontSize: 24 }), visible: true, orderNumber: 4, isActive: allInitialPanelVisibility['tmDcmtPreview'] }
860
+ toolbarOptions: { icon: _jsx(IconShow, { fontSize: 24 }), visible: getSearchToolbarVisibility(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER).tmDcmtPreview, orderNumber: 4, isActive: allInitialPanelVisibility['tmDcmtPreview'] }
835
861
  },
836
- // ...(context === SearchResultContext.FREE_SEARCH ? [
837
- // {
838
- // id: 'tmFullTextSearch',
839
- // name: 'Ricerca FullText',
840
- // contentOptions: { component: tmFullTextSearch, panelContainer: { title: 'Ricerca FullText', allowMaximize: !isMobile } },
841
- // toolbarOptions: { icon: <IconMenuFullTextSearch fontSize={24} />, visible: true, orderNumber: 5, isActive: allInitialPanelVisibility['tmFullTextSearch'] }
842
- // }
843
- // ] : [])
862
+ ...(context === SearchResultContext.FREE_SEARCH ? [
863
+ {
864
+ id: 'tmFullTextSearch',
865
+ name: SDKUI_Localizator.ResultDetails,
866
+ contentOptions: { component: tmFullTextSearch, panelContainer: { title: SDKUI_Localizator.ResultDetails, allowMaximize: !isMobile } },
867
+ toolbarOptions: { icon: _jsx(IconPlatform, { fontSize: 20 }), visible: getSearchToolbarVisibility(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER).tmFullTextSearch, orderNumber: 5, isActive: allInitialPanelVisibility['tmFullTextSearch'] }
868
+ }
869
+ ] : [])
844
870
  ], [tmSearchResult, tmBlog, tmSysMetadata, tmDcmtPreview, tmFullTextSearch, showToolbarHeader, context, isMobile]);
845
871
  return (_jsxs(StyledMultiViewPanel, { "$isVisible": isVisible, children: [_jsx(StyledMultiViewPanel, { "$isVisible": !isOpenDcmtForm && !isOpenDetails && !isOpenMaster, style: {
846
872
  display: 'flex',
@@ -1386,11 +1412,6 @@ const StyledIndexingToggle = styled.button `
1386
1412
  transform: translateY(1px);
1387
1413
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
1388
1414
  }
1389
-
1390
- svg {
1391
- color: #2196F3;
1392
- font-size: 18px;
1393
- }
1394
1415
  `;
1395
1416
  const StyledLeftContent = styled.div `
1396
1417
  display: flex;
@@ -1406,12 +1427,15 @@ const StyledCachedIcon = styled.div `
1406
1427
  display: flex;
1407
1428
  align-items: center;
1408
1429
  justify-content: center;
1409
- color: #4CAF50;
1410
1430
  font-size: 16px;
1411
-
1412
- svg {
1413
- color: #4CAF50;
1414
- }
1431
+ `;
1432
+ const StyledRefreshIcon = styled.div `
1433
+ display: flex;
1434
+ align-items: center;
1435
+ justify-content: center;
1436
+ font-size: 16px;
1437
+ cursor: pointer;
1438
+ transition: transform 0.2s ease;
1415
1439
  `;
1416
1440
  const StyledChevron = styled.span `
1417
1441
  transition: transform 0.2s ease;
@@ -1420,6 +1444,7 @@ const StyledChevron = styled.span `
1420
1444
  font-size: 12px;
1421
1445
  `;
1422
1446
  const StyledIndexingInfoBox = styled.div `
1447
+ position: relative;
1423
1448
  background: white;
1424
1449
  border: 1px solid #e0e0e0;
1425
1450
  border-radius: 6px;
@@ -4,9 +4,10 @@ import styled from 'styled-components';
4
4
  import { useTMPanelManagerContext } from './TMPanelManagerContext';
5
5
  import TMPanelWrapper from './TMPanelWrapper';
6
6
  import TMPanelManagerToolbar from './TMPanelManagerToolbar';
7
- import { IconInfo, SDKUI_Localizator } from '../../../helper';
7
+ import { getPanelManagerToolbarColor, IconInfo, SDKUI_Localizator } from '../../../helper';
8
8
  import { DeviceType, useDeviceType } from '../../base/TMDeviceProvider';
9
9
  import { Gutters } from '../../../utils/theme';
10
+ import { AppModules, SDK_Globals } from '@topconsultnpm/sdk-ts';
10
11
  // Styled Component per il contenitore principale di PanelContainer
11
12
  const StyledPanelContainerWrapper = styled.div `
12
13
  display: ${props => (props.$hasVisiblePanels ? 'flex' : 'none')};
@@ -206,7 +207,7 @@ const TMPanelManagerContainer = (props) => {
206
207
  alignItems: 'center',
207
208
  width: isMobile ? '100%' : '50px',
208
209
  height: isMobile ? '50px' : 'max-content',
209
- background: 'transparent linear-gradient(90deg, #CCE0F4 0%, #7EC1E7 14%, #39A6DB 28%, #1E9CD7 35%, #0075BE 78%, #005B97 99%) 0% 0% no-repeat padding-box',
210
+ background: getPanelManagerToolbarColor(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER),
210
211
  borderRadius: isMobile ? '10px' : '10px 0px 0px 10px',
211
212
  padding: '10px',
212
213
  gap: '10px'
@@ -67,4 +67,22 @@ export declare const parseSignatureConfiguration: (did: number, informationSign:
67
67
  };
68
68
  export declare const convertSearchResultDescriptorToFileItems: (documents: Array<SearchResultDescriptor>) => Array<FileItem>;
69
69
  export declare const getAppModuleGradient: (appModuleID: AppModules) => string;
70
+ export declare const getPanelManagerToolbarColor: (appModuleID: AppModules) => string;
71
+ type SearchToolbarVisibility = {
72
+ tmSearchResult: boolean;
73
+ tmBlog: boolean;
74
+ tmSysMetadata: boolean;
75
+ tmDcmtPreview: boolean;
76
+ tmFullTextSearch: boolean;
77
+ };
78
+ export declare const getSearchToolbarVisibility: (appModuleID: AppModules) => SearchToolbarVisibility;
79
+ type DcmtFormToolbarVisibility = {
80
+ tmDcmtForm: boolean;
81
+ tmBlog: boolean;
82
+ tmSysMetadata: boolean;
83
+ tmDcmtPreview: boolean;
84
+ tmWF: boolean;
85
+ tmDcmtTasks: boolean;
86
+ };
87
+ export declare const getDcmtFormToolbarVisibility: (appModuleID: AppModules) => DcmtFormToolbarVisibility;
70
88
  export {};
@@ -445,3 +445,61 @@ export const getAppModuleGradient = (appModuleID) => {
445
445
  return 'linear-gradient(270deg, #46B5A2 16%, #3BAABC 34%, #3BAABC 34%, #3681AD 54%, #3368A5 72%, #2F549D 88%, #304F99 100%)';
446
446
  }
447
447
  };
448
+ export const getPanelManagerToolbarColor = (appModuleID) => {
449
+ switch (appModuleID) {
450
+ case AppModules.SURFER:
451
+ return 'transparent linear-gradient(90deg, #CCE0F4 0%, #7EC1E7 14%, #39A6DB 28%, #1E9CD7 35%, #0075BE 78%, #005B97 99%) 0% 0% no-repeat padding-box';
452
+ case AppModules.DESIGNER:
453
+ return '#482234';
454
+ case AppModules.ORCHESTRATOR:
455
+ return '#1d6f42';
456
+ default:
457
+ return 'transparent linear-gradient(90deg, #CCE0F4 0%, #7EC1E7 14%, #39A6DB 28%, #1E9CD7 35%, #0075BE 78%, #005B97 99%) 0% 0% no-repeat padding-box';
458
+ }
459
+ };
460
+ export const getSearchToolbarVisibility = (appModuleID) => {
461
+ switch (appModuleID) {
462
+ case AppModules.SURFER:
463
+ return {
464
+ tmSearchResult: true,
465
+ tmBlog: true,
466
+ tmSysMetadata: true,
467
+ tmDcmtPreview: true,
468
+ tmFullTextSearch: true,
469
+ };
470
+ case AppModules.DESIGNER:
471
+ case AppModules.ORCHESTRATOR:
472
+ default:
473
+ return {
474
+ tmSearchResult: true,
475
+ tmBlog: false,
476
+ tmSysMetadata: true,
477
+ tmDcmtPreview: true,
478
+ tmFullTextSearch: false,
479
+ };
480
+ }
481
+ };
482
+ export const getDcmtFormToolbarVisibility = (appModuleID) => {
483
+ switch (appModuleID) {
484
+ case AppModules.SURFER:
485
+ return {
486
+ tmDcmtForm: true,
487
+ tmBlog: true,
488
+ tmSysMetadata: true,
489
+ tmDcmtPreview: true,
490
+ tmWF: true,
491
+ tmDcmtTasks: true,
492
+ };
493
+ case AppModules.DESIGNER:
494
+ case AppModules.ORCHESTRATOR:
495
+ default:
496
+ return {
497
+ tmDcmtForm: true,
498
+ tmBlog: false,
499
+ tmSysMetadata: true,
500
+ tmDcmtPreview: true,
501
+ tmWF: false,
502
+ tmDcmtTasks: false,
503
+ };
504
+ }
505
+ };
package/lib/ts/types.d.ts CHANGED
@@ -297,6 +297,9 @@ export interface ITMDcmt {
297
297
  fileExt?: string;
298
298
  fileSize?: number;
299
299
  fileCount?: number;
300
+ btid?: number;
301
+ bid?: number;
302
+ bfid?: number;
300
303
  }
301
304
  export declare enum moduleTypes {
302
305
  SDK = "SDK",
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@topconsultnpm/sdkui-react",
3
- "version": "6.20.0-dev2.1",
3
+ "version": "6.20.0-dev2.10",
4
4
  "description": "",
5
5
  "scripts": {
6
- "test": "echo \"Error: no test specified\" \u0026\u0026 exit 1",
6
+ "test": "echo \"Error: no test specified\" && exit 1",
7
7
  "clean": "powershell Remove-Item lib/ -recurse",
8
8
  "copy-files": "copyfiles -u 1 src/assets/*.* src/assets/ImageLibrary/*.* src/assets/thumbnails/*.* src/assets/IconsS4t/*.* src/assets/Metadata/*.* src/css/tm-sdkui.css lib/",
9
- "tm-build": "npm run clean \u0026\u0026 tsc \u0026\u0026 npm run copy-files",
9
+ "tm-build": "npm run clean && tsc && npm run copy-files",
10
10
  "tm-watch": "tsc -w",
11
11
  "tm-publish": "npm publish --tag latest",
12
12
  "tm-publish_wl": "npm publish",
@@ -40,18 +40,18 @@
40
40
  "lib"
41
41
  ],
42
42
  "dependencies": {
43
- "react-router-dom": "^6.15.0",
44
- "react-pdf": "^10.3.0",
45
- "htmlparser2": "^10.0.0",
43
+ "@topconsultnpm/sdk-ts": "6.20.0-dev2.2",
46
44
  "buffer": "^6.0.3",
47
- "@topconsultnpm/sdk-ts": "6.20.0-test1",
48
- "exceljs": "^4.4.0",
49
45
  "devextreme": "25.2.4",
50
- "styled-components": "^6.1.1",
46
+ "devextreme-react": "25.2.4",
47
+ "exceljs": "^4.4.0",
48
+ "htmlparser2": "^10.0.0",
51
49
  "pdfjs-dist": "5.4.296",
52
- "devextreme-react": "25.2.4"
50
+ "react-pdf": "^10.3.0",
51
+ "react-router-dom": "^6.15.0",
52
+ "styled-components": "^6.1.1"
53
53
  },
54
54
  "overrides": {
55
55
  "esbuild": "^0.25.0"
56
56
  }
57
- }
57
+ }