@topconsultnpm/sdkui-react 6.20.0-dev2.4 → 6.20.0-dev2.40

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 (49) hide show
  1. package/lib/components/base/Styled.d.ts +1 -0
  2. package/lib/components/base/Styled.js +10 -2
  3. package/lib/components/choosers/TMDataListItemEditor.d.ts +11 -0
  4. package/lib/components/choosers/TMDataListItemEditor.js +130 -0
  5. package/lib/components/choosers/TMDataListItemFields.d.ts +11 -0
  6. package/lib/components/choosers/TMDataListItemFields.js +61 -0
  7. package/lib/components/choosers/TMDataListItemPicker.d.ts +1 -0
  8. package/lib/components/choosers/TMDataListItemPicker.js +178 -18
  9. package/lib/components/choosers/TMDynDataListItemChooser.js +11 -6
  10. package/lib/components/choosers/TMImageIDChooser.d.ts +16 -0
  11. package/lib/components/choosers/TMImageIDChooser.js +53 -0
  12. package/lib/components/choosers/TMMetadataChooser.js +1 -1
  13. package/lib/components/editors/TMLocalizedTextBox.d.ts +1 -0
  14. package/lib/components/editors/TMLocalizedTextBox.js +3 -3
  15. package/lib/components/editors/TMMetadataValues.js +3 -1
  16. package/lib/components/features/archive/TMArchive.js +29 -42
  17. package/lib/components/features/documents/TMDcmtForm.js +155 -37
  18. package/lib/components/features/documents/TMDcmtPreview.js +2 -1
  19. package/lib/components/features/documents/TMMasterDetailDcmts.js +1 -1
  20. package/lib/components/features/search/TMSearchResult.d.ts +1 -0
  21. package/lib/components/features/search/TMSearchResult.js +44 -82
  22. package/lib/components/features/search/TMSearchResultsMenuItems.js +2 -2
  23. package/lib/components/features/tasks/TMTaskForm.js +2 -2
  24. package/lib/components/features/tasks/TMTasksUtils.d.ts +1 -0
  25. package/lib/components/features/tasks/TMTasksUtils.js +24 -4
  26. package/lib/components/features/workflow/TMWorkflowPopup.d.ts +2 -1
  27. package/lib/components/features/workflow/TMWorkflowPopup.js +2 -1
  28. package/lib/components/features/workflow/diagram/DiagramItemForm.js +1 -1
  29. package/lib/components/forms/Login/TMLoginForm.js +1 -1
  30. package/lib/components/index.d.ts +2 -0
  31. package/lib/components/index.js +2 -0
  32. package/lib/components/layout/panelManager/TMPanelManagerContainer.js +3 -2
  33. package/lib/components/query/TMQueryEditor.d.ts +1 -0
  34. package/lib/components/query/TMQueryEditor.js +2 -2
  35. package/lib/helper/GlobalStyles.js +3 -0
  36. package/lib/helper/SDKUI_Globals.d.ts +4 -0
  37. package/lib/helper/SDKUI_Globals.js +6 -0
  38. package/lib/helper/SDKUI_Localizator.d.ts +1 -0
  39. package/lib/helper/SDKUI_Localizator.js +10 -0
  40. package/lib/helper/TMUtils.d.ts +18 -0
  41. package/lib/helper/TMUtils.js +58 -0
  42. package/lib/helper/queryHelper.js +1 -1
  43. package/lib/hooks/useBetaFeatures.d.ts +1 -0
  44. package/lib/hooks/useBetaFeatures.js +41 -0
  45. package/lib/hooks/useDcmtOperations.js +14 -2
  46. package/lib/hooks/useRelatedDocuments.js +34 -11
  47. package/lib/index.d.ts +1 -0
  48. package/lib/index.js +1 -0
  49. package/package.json +11 -11
@@ -40,7 +40,7 @@ const Popover = styled.div `
40
40
  border-radius: 4px;
41
41
  background-color: #fff;
42
42
  box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
43
- z-index: 1502;
43
+ z-index: 2000000001;
44
44
  padding: 8px;
45
45
  `;
46
46
  const Badge = styled.span `
@@ -71,7 +71,7 @@ export const getCultureIDImg = (cultureID) => {
71
71
  default: return it;
72
72
  }
73
73
  };
74
- const TMLocalizedTextBox = ({ label, value, value_IT, value_EN, value_FR, value_PT, value_ES, value_DE, isModifiedWhen, validationItems, qd, tid, onValueChanged, }) => {
74
+ const TMLocalizedTextBox = ({ label, value, value_IT, value_EN, value_FR, value_PT, value_ES, value_DE, isModifiedWhen, validationItems, qd, tid, readOnly, onValueChanged, }) => {
75
75
  const [isPopoverVisible, setIsPopoverVisible] = useState(false);
76
76
  const containerRef = useRef(null);
77
77
  const popoverRef = useRef(null);
@@ -122,6 +122,6 @@ const TMLocalizedTextBox = ({ label, value, value_IT, value_EN, value_FR, value_
122
122
  icon: (_jsxs(IconContainer, { children: [_jsx(IconLanguage, {}), localizedCount > 0 && _jsx(Badge, { children: localizedCount })] })),
123
123
  onClick: handleTogglePopover,
124
124
  };
125
- return (_jsxs(LocalizedContainer, { ref: containerRef, children: [(qd || tid) ? (_jsx(TMMetadataTextBox, { type: "text", label: label, value: value, isModifiedWhen: isModifiedWhen, buttons: [localizationButton], validationItems: validationItems, qd: qd, tid: tid, onValueChanged: (e) => onValueChanged(CultureIDs.None, e.target.value) })) : (_jsx(TMTextBox, { type: "text", label: label, value: value, isModifiedWhen: isModifiedWhen, buttons: [localizationButton], validationItems: validationItems, onValueChanged: (e) => onValueChanged(CultureIDs.None, e.target.value) })), isPopoverVisible && (_jsx(Portal, { popoverRef: popoverRef, children: _jsx(Popover, { ref: popoverRef, "$isVisible": isPopoverVisible, "$top": popoverPosition.top, "$left": popoverPosition.left, "$width": popoverPosition.width, onMouseDown: (e) => e.stopPropagation(), children: languages.map((lang) => ((qd || tid) ? (_jsx(TMMetadataTextBox, { label: `${lang.label}`, showClearButton: true, icon: _jsx("img", { src: getCultureIDImg(lang.code), alt: "Lang", width: 18, height: 18 }), value: lang.value || '', qd: qd, tid: tid, onValueChanged: (e) => onValueChanged(lang.code, e.target.value) }, lang.code)) : (_jsx(TMTextBox, { label: `${lang.label}`, showClearButton: true, icon: _jsx("img", { src: getCultureIDImg(lang.code), alt: "Lang", width: 18, height: 18 }), value: lang.value || '', onValueChanged: (e) => onValueChanged(lang.code, e.target.value) }, lang.code)))) }) }))] }));
125
+ return (_jsxs(LocalizedContainer, { ref: containerRef, children: [(qd || tid) ? (_jsx(TMMetadataTextBox, { type: "text", label: label, value: value, isModifiedWhen: isModifiedWhen, buttons: [localizationButton], validationItems: validationItems, qd: qd, tid: tid, readOnly: readOnly, onValueChanged: (e) => onValueChanged(CultureIDs.None, e.target.value) })) : (_jsx(TMTextBox, { type: "text", label: label, value: value, isModifiedWhen: isModifiedWhen, buttons: [localizationButton], validationItems: validationItems, readOnly: readOnly, onValueChanged: (e) => onValueChanged(CultureIDs.None, e.target.value) })), isPopoverVisible && (_jsx(Portal, { popoverRef: popoverRef, children: _jsx(Popover, { ref: popoverRef, "$isVisible": isPopoverVisible, "$top": popoverPosition.top, "$left": popoverPosition.left, "$width": popoverPosition.width, onMouseDown: (e) => e.stopPropagation(), children: languages.map((lang) => ((qd || tid) ? (_jsx(TMMetadataTextBox, { label: `${lang.label}`, showClearButton: true, icon: _jsx("img", { src: getCultureIDImg(lang.code), alt: "Lang", width: 18, height: 18 }), value: lang.value || '', qd: qd, tid: tid, readOnly: readOnly, onValueChanged: (e) => onValueChanged(lang.code, e.target.value) }, lang.code)) : (_jsx(TMTextBox, { label: `${lang.label}`, showClearButton: true, icon: _jsx("img", { src: getCultureIDImg(lang.code), alt: "Lang", width: 18, height: 18 }), value: lang.value || '', readOnly: readOnly, onValueChanged: (e) => onValueChanged(lang.code, e.target.value) }, lang.code)))) }) }))] }));
126
126
  };
127
127
  export default TMLocalizedTextBox;
@@ -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,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React, { useEffect, useMemo, useState } from 'react';
3
3
  import Logo from '../../../assets/Toppy-generico.png';
4
- import { DcmtTypeListCacheService, LayoutModes, SDK_Localizator } from '@topconsultnpm/sdk-ts';
4
+ import { ArchiveConstraints, DcmtTypeListCacheService, LayoutModes, SDK_Localizator } from '@topconsultnpm/sdk-ts';
5
5
  import { IconTree, SDKUI_Globals, SDKUI_Localizator, IconRecentlyViewed, IconPreview, IconShow, IconBoard, IconDcmtTypeSys, removeMruTid, getMoreInfoTasksForDocument } from '../../../helper';
6
6
  import { useDeviceType, DeviceType } from '../../base/TMDeviceProvider';
7
7
  import TMLayoutContainer from '../../base/TMLayout';
@@ -145,49 +145,36 @@ const TMArchive = ({ onDcmtTypeSelect = undefined, inputTID, inputFile = null, c
145
145
  export default TMArchive;
146
146
  const TMTreeSelectorWrapper = ({ isMobile, isSharedArchive, onSelectedTIDChanged }) => {
147
147
  const { setPanelVisibilityById, toggleMaximize, setToolbarButtonVisibility, countVisibleLeafPanels } = useTMPanelManagerContext();
148
- return (_jsx(TMTreeSelector, { layoutMode: LayoutModes.Ark, onClosePanel: !isMobile && countVisibleLeafPanels() > 1 ? () => setPanelVisibilityById('tmTreeSelector', false) : undefined, allowMaximize: !isMobile && countVisibleLeafPanels() > 1, onMaximizePanel: !isMobile && countVisibleLeafPanels() > 1 ? () => toggleMaximize("tmTreeSelector") : undefined, onSelectedTIDChanged: (tid) => {
149
- onSelectedTIDChanged?.(tid);
150
- if (isMobile)
151
- setPanelVisibilityById('tmDcmtForm', true);
152
- else {
153
- setPanelVisibilityById('tmDcmtForm', true);
154
- if (!isSharedArchive) {
155
- setPanelVisibilityById('tmDcmtPreview', true);
156
- }
157
- }
158
- if (!isSharedArchive) {
159
- setToolbarButtonVisibility('tmDcmtPreview', true);
160
- }
161
- setToolbarButtonVisibility('tmDcmtForm', true);
162
- } }));
148
+ const updatePanelsVisibility = async (tid) => {
149
+ if (!tid)
150
+ return;
151
+ const dtd = await DcmtTypeListCacheService.GetAsync(tid);
152
+ const isOnlyMetadata = dtd?.archiveConstraint === ArchiveConstraints.OnlyMetadata;
153
+ const previewVisible = !isSharedArchive && !isOnlyMetadata;
154
+ setPanelVisibilityById('tmDcmtPreview', previewVisible);
155
+ setToolbarButtonVisibility('tmDcmtPreview', previewVisible);
156
+ setPanelVisibilityById('tmDcmtForm', true);
157
+ setToolbarButtonVisibility('tmDcmtForm', true);
158
+ };
159
+ return (_jsx(TMTreeSelector, { layoutMode: LayoutModes.Ark, onClosePanel: !isMobile && countVisibleLeafPanels() > 1 ? () => setPanelVisibilityById('tmTreeSelector', false) : undefined, allowMaximize: !isMobile && countVisibleLeafPanels() > 1, onMaximizePanel: !isMobile && countVisibleLeafPanels() > 1 ? () => toggleMaximize("tmTreeSelector") : undefined, onSelectedTIDChanged: async (tid) => { updatePanelsVisibility(tid); onSelectedTIDChanged?.(tid); } }));
163
160
  };
164
161
  const TMRecentsManagerWrapper = ({ mruTIDs, currentTID, currentMruTID, deviceType, isSharedArchive, onSelectedTID, onDeletedTID }) => {
165
162
  const { setPanelVisibilityById, setToolbarButtonVisibility } = useTMPanelManagerContext();
163
+ // This avoids unnecessary re-renders by only recalculating when deviceType changes.
164
+ let isMobile = useMemo(() => { return deviceType === DeviceType.MOBILE; }, [deviceType]);
165
+ const updatePanelsVisibility = async (tid) => {
166
+ if (!tid)
167
+ return;
168
+ const dtd = await DcmtTypeListCacheService.GetAsync(tid);
169
+ const isOnlyMetadata = dtd?.archiveConstraint === ArchiveConstraints.OnlyMetadata;
170
+ const previewVisible = !isSharedArchive && !isOnlyMetadata;
171
+ setPanelVisibilityById('tmDcmtPreview', previewVisible);
172
+ setToolbarButtonVisibility('tmDcmtPreview', previewVisible);
173
+ setPanelVisibilityById('tmDcmtForm', true);
174
+ setToolbarButtonVisibility('tmDcmtForm', true);
175
+ };
166
176
  useEffect(() => {
167
- if (currentTID) {
168
- setPanelVisibilityById('tmDcmtForm', true);
169
- if (!isSharedArchive) {
170
- setToolbarButtonVisibility('tmDcmtPreview', true);
171
- }
172
- setToolbarButtonVisibility('tmDcmtForm', true);
173
- }
174
- }, [currentTID, isSharedArchive]);
175
- return (_jsx(TMRecentsManager, { accessFilter: 'canArchive', mruTIDs: mruTIDs, currentMruTID: currentMruTID, deviceType: deviceType, onSelectedTID: (tid) => {
176
- onSelectedTID?.(tid);
177
- if (deviceType === DeviceType.MOBILE) {
178
- setPanelVisibilityById('tmDcmtForm', true);
179
- }
180
- else {
181
- setPanelVisibilityById('tmDcmtForm', true);
182
- if (!isSharedArchive) {
183
- setPanelVisibilityById('tmDcmtPreview', true);
184
- }
185
- }
186
- if (!isSharedArchive) {
187
- setToolbarButtonVisibility('tmDcmtPreview', true);
188
- }
189
- setToolbarButtonVisibility('tmDcmtForm', true);
190
- }, onDeletedTID: (tid) => {
191
- onDeletedTID?.(tid);
192
- } }));
177
+ updatePanelsVisibility(currentTID);
178
+ }, [currentTID, isSharedArchive, isMobile]);
179
+ return (_jsx(TMRecentsManager, { accessFilter: "canArchive", mruTIDs: mruTIDs, currentMruTID: currentMruTID, deviceType: deviceType, onSelectedTID: async (tid) => { await updatePanelsVisibility(tid); onSelectedTID?.(tid); }, onDeletedTID: onDeletedTID }));
193
180
  };
@@ -1,17 +1,17 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
+ import { 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, TASK_MORE_INFO_PREFIX_NAME, calcResponsiveSizes } from '../../../helper';
12
12
  import { hasDetailRelations, hasMasterRelations, isXMLFileExt } from '../../../helper/dcmtsHelper';
13
13
  import { Gutters, TMColors } from '../../../utils/theme';
14
- import { StyledFormButtonsContainer, StyledLoadingContainer, StyledModalContainer, StyledReferenceButton, StyledSpinner, StyledToolbarCardContainer } from '../../base/Styled';
14
+ import { ReferencesContainer, StyledFormButtonsContainer, StyledLoadingContainer, StyledModalContainer, StyledReferenceButton, StyledSpinner, StyledToolbarCardContainer } from '../../base/Styled';
15
15
  import ShowAlert from '../../base/TMAlert';
16
16
  import TMButton from '../../base/TMButton';
17
17
  import { TMExceptionBoxManager, TMMessageBoxManager, ButtonNames } from '../../base/TMPopUp';
@@ -46,6 +46,7 @@ import TMDcmtCheckoutInfoForm from '../search/TMDcmtCheckoutInfoForm';
46
46
  import styled from 'styled-components';
47
47
  import { ContextMenu } from '../../NewComponents/ContextMenu';
48
48
  import TMToppyDraggableHelpCenter from '../assistant/TMToppyDraggableHelpCenter';
49
+ import TMTaskForm from '../tasks/TMTaskForm';
49
50
  //#region Interfaces, Types and Enums
50
51
  /**
51
52
  * Definisce il contesto da cui è stato invocato il TMDcmtForm.
@@ -123,6 +124,10 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
123
124
  const [refreshBlogTrigger, setRefreshBlogTrigger] = useState(0);
124
125
  const [wfError, setWfError] = useState(null);
125
126
  const [metadataDcmtOrigin, setMetadataDcmtOrigin] = useState(null);
127
+ const isReadOnlyOriginCallback = useCallback((fromTID) => {
128
+ return layoutMode !== LayoutModes.Ark && layoutMode !== LayoutModes.ArkFromBasket && layoutMode !== LayoutModes.ArkFromFile && layoutMode !== LayoutModes.ArkFromMail
129
+ && fromTID?.toString() !== TID?.toString();
130
+ }, [layoutMode, TID]);
126
131
  const triggerBlogRefresh = useCallback(async () => {
127
132
  setRefreshBlogTrigger(prev => prev + 1);
128
133
  }, []);
@@ -194,7 +199,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
194
199
  let dtd = res?.dtdResult;
195
200
  let rows = dtd.rows ? dtd.rows[0] : [];
196
201
  let mids = res?.selectMIDs;
197
- let metadataList = searchResultToMetadataValues(TID, dtd, rows, mids, mdList, layoutMode, origin.fromTID?.toString() !== TID?.toString());
202
+ let metadataList = searchResultToMetadataValues(TID, dtd, rows, mids, mdList, layoutMode, isReadOnlyOriginCallback(origin.fromTID));
198
203
  if (archived) {
199
204
  // Usa setFormData con funzione callback per accedere allo stato precedente
200
205
  // invece di dipendere da formDataOrig nell'array di dipendenze
@@ -282,7 +287,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
282
287
  }
283
288
  else {
284
289
  const renderedMetadata = dtd?.metadata?.filter((metadata) => handleArchiveVisibility(metadata)) ?? [];
285
- const metadataList = searchResultToMetadataValues(dtd?.id, undefined, [], [], renderedMetadata, layoutMode, metadataDcmtOrigin?.fromTID?.toString() !== TID?.toString());
290
+ const metadataList = searchResultToMetadataValues(dtd?.id, undefined, [], [], renderedMetadata, layoutMode, isReadOnlyOriginCallback(metadataDcmtOrigin?.fromTID));
286
291
  setFormDataOrig(structuredClone(metadataList));
287
292
  setFormData(structuredClone(metadataList));
288
293
  formDataOrigRef.current = structuredClone(metadataList);
@@ -297,7 +302,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
297
302
  setIsInitialLoading(false);
298
303
  setIsNavigating(false);
299
304
  }
300
- }, [TID, DID, layoutMode, inputFile, setMetadataList, handleReset, allowButtonsRefs, metadataDcmtOrigin?.fromTID]);
305
+ }, [TID, DID, layoutMode, inputFile, setMetadataList, handleReset, allowButtonsRefs, isReadOnlyOriginCallback, metadataDcmtOrigin?.fromTID]);
301
306
  const createChange = useCallback((mid, metadataType, modifiedValue) => {
302
307
  return { mid, metadataType, modifiedValue };
303
308
  }, []);
@@ -642,8 +647,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
642
647
  if (layoutMode !== LayoutModes.Update || !moreInfoTasks) {
643
648
  return false;
644
649
  }
645
- return moreInfoTasks.some(task => isTaskMoreInfo(task.name) &&
646
- task.state !== Task_States.Completed);
650
+ return moreInfoTasks.some(task => isTaskMoreInfo(task.name) && task.state !== Task_States.Completed);
647
651
  }, [layoutMode, moreInfoTasks]);
648
652
  const showToppyForReferences = useMemo(() => {
649
653
  if (!allowButtonsRefs || layoutMode !== LayoutModes.Update || isOpenDetails || isOpenMaster)
@@ -1184,8 +1188,10 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1184
1188
  }, [focusedMetadataValue?.value, focusedMetadataValue?.mid, TID]);
1185
1189
  const handleWFOperationCompleted = useCallback(async () => {
1186
1190
  await onWFOperationCompleted?.();
1187
- onClose?.();
1188
- }, [onWFOperationCompleted, onClose]);
1191
+ if (!showMoreInfoPopup) {
1192
+ onClose?.();
1193
+ }
1194
+ }, [onWFOperationCompleted, onClose, showMoreInfoPopup]);
1189
1195
  // Determina se showAll deve essere automaticamente true
1190
1196
  // Best practice: usa useMemo per calcolare valori derivati invece di useEffect con setState
1191
1197
  const shouldShowAll = useMemo(() => {
@@ -1216,7 +1222,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1216
1222
  }, [formData, fromDTD, isMobile]);
1217
1223
  const tmDcmtForm = useMemo(() => {
1218
1224
  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) => {
1225
+ _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
1226
  setFormData((prevItems) => prevItems.map((item) => {
1221
1227
  const newItem = newItems.find((newItem) => newItem.tid === item.tid && newItem.mid === item.mid);
1222
1228
  return newItem ? { ...item, ...newItem } : item;
@@ -1262,7 +1268,8 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1262
1268
  handleConfirmAction,
1263
1269
  handleUndo,
1264
1270
  handleClearForm,
1265
- metadataDcmtOrigin
1271
+ isReadOnlyOriginCallback,
1272
+ metadataDcmtOrigin?.fromTID,
1266
1273
  ]);
1267
1274
  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
1275
  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 +1391,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1384
1391
  const { assignedToMe, assignedByMe } = getDcmtTasksCounter(TID, DID, allTasks);
1385
1392
  let titleDcmtFormPanel = fromDTD?.nameLoc ?? "";
1386
1393
  // Caso: Il documento proviene da un'origine esterna
1387
- if (metadataDcmtOrigin?.fromTID?.toString() !== TID?.toString()) {
1394
+ if (isReadOnlyOriginCallback(metadataDcmtOrigin?.fromTID)) {
1388
1395
  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
1396
  }
1390
1397
  const panels = [
@@ -1405,7 +1412,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1405
1412
  },
1406
1413
  toolbarOptions: {
1407
1414
  icon: _jsx(IconPreview, { fontSize: 24 }),
1408
- visible: true,
1415
+ visible: getDcmtFormToolbarVisibility(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER).tmDcmtForm,
1409
1416
  orderNumber: 1,
1410
1417
  isActive: allInitialPanelVisibility['tmDcmtForm']
1411
1418
  }
@@ -1416,7 +1423,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1416
1423
  contentOptions: { component: tmBlog, panelContainer: { title: SDKUI_Localizator.BlogCase, allowMaximize: !isMobile } },
1417
1424
  toolbarOptions: {
1418
1425
  icon: _jsx(IconBoard, { fontSize: 24 }),
1419
- visible: true,
1426
+ visible: getDcmtFormToolbarVisibility(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER).tmBlog,
1420
1427
  disabled: isBoardDisabled,
1421
1428
  orderNumber: 2,
1422
1429
  isActive: allInitialPanelVisibility['tmBlog']
@@ -1426,13 +1433,13 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1426
1433
  id: 'tmSysMetadata',
1427
1434
  name: SDKUI_Localizator.MetadataSystem,
1428
1435
  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'] }
1436
+ toolbarOptions: { icon: _jsx(IconDcmtTypeSys, { fontSize: 24 }), visible: getDcmtFormToolbarVisibility(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER).tmSysMetadata, disabled: isSysMetadataDisabled, orderNumber: 3, isActive: allInitialPanelVisibility['tmSysMetadata'] }
1430
1437
  },
1431
1438
  {
1432
1439
  id: 'tmDcmtPreview',
1433
1440
  name: SDKUI_Localizator.PreviewDocument,
1434
1441
  contentOptions: { component: tmDcmtPreview },
1435
- toolbarOptions: { icon: _jsx(IconShow, { fontSize: 24 }), disabled: isPreviewDisabled, visible: true, orderNumber: 4, isActive: allInitialPanelVisibility['tmDcmtPreview'] }
1442
+ toolbarOptions: { icon: _jsx(IconShow, { fontSize: 24 }), disabled: isPreviewDisabled, visible: getDcmtFormToolbarVisibility(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER).tmDcmtPreview, orderNumber: 4, isActive: allInitialPanelVisibility['tmDcmtPreview'] }
1436
1443
  },
1437
1444
  {
1438
1445
  id: 'tmWF',
@@ -1445,7 +1452,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1445
1452
  },
1446
1453
  toolbarOptions: {
1447
1454
  icon: _jsx(IconWorkflow, { fontSize: 24 }),
1448
- visible: true,
1455
+ visible: getDcmtFormToolbarVisibility(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER).tmWF,
1449
1456
  disabled: isWFDisabled,
1450
1457
  orderNumber: 5,
1451
1458
  isActive: allInitialPanelVisibility['tmWF']
@@ -1459,7 +1466,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1459
1466
  },
1460
1467
  toolbarOptions: {
1461
1468
  icon: _jsx(IconActivity, { fontSize: 24 }),
1462
- visible: layoutMode !== LayoutModes.Ark,
1469
+ visible: layoutMode !== LayoutModes.Ark && getDcmtFormToolbarVisibility(SDK_Globals.tmSession?.SessionDescr?.appModuleID ?? AppModules.SURFER).tmDcmtTasks,
1463
1470
  orderNumber: 6,
1464
1471
  isActive: allInitialPanelVisibility['tmDcmtTasks'],
1465
1472
  count: assignedToMe + assignedByMe,
@@ -1468,7 +1475,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1468
1475
  },
1469
1476
  ];
1470
1477
  return panels;
1471
- }, [fromDTD, showBackButton, tmDcmtForm, tmBlog, tmSysMetadata, tmDcmtPreview, tmWF, tmDcmtTasks, isPreviewDisabled, isSysMetadataDisabled, isBoardDisabled, isWFDisabled, inputFile, isClosable, allTasks, DID, TID, metadataDcmtOrigin?.fromTID]);
1478
+ }, [fromDTD, showBackButton, tmDcmtForm, tmBlog, tmSysMetadata, tmDcmtPreview, tmWF, tmDcmtTasks, isPreviewDisabled, isSysMetadataDisabled, isBoardDisabled, isWFDisabled, inputFile, isClosable, allTasks, DID, TID, isReadOnlyOriginCallback, metadataDcmtOrigin?.fromTID]);
1472
1479
  // Retrieves the current document form setting based on the normalized TID
1473
1480
  const getCurrentDcmtFormSetting = () => {
1474
1481
  const settings = SDKUI_Globals.userSettings.dcmtFormSettings;
@@ -1523,15 +1530,30 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1523
1530
  };
1524
1531
  const handleCompleteMoreInfo = useCallback(async () => {
1525
1532
  try {
1533
+ if (!moreInfoTasks || moreInfoTasks.length === 0) {
1534
+ ShowAlert({
1535
+ mode: 'info',
1536
+ title: SDKUI_Localizator.MoreInformation,
1537
+ message: 'Nessun attività di maggiori informazioni da completare',
1538
+ duration: 3000
1539
+ });
1540
+ return;
1541
+ }
1542
+ ;
1543
+ const firstTask = moreInfoTasks[0];
1526
1544
  TMSpinner.show();
1527
- let newTask = { ...moreInfoTasks, state: Task_States.Completed };
1545
+ const newTask = { ...firstTask, state: Task_States.Completed };
1528
1546
  await SDK_Globals.tmSession?.NewTaskEngine().UpdateAsync(newTask);
1529
1547
  onTaskCompleted?.(newTask);
1530
1548
  onClose?.();
1531
- ShowAlert({ mode: 'success', title: SDKUI_Localizator.MoreInformation, message: SDKUI_Localizator.MoreInfoCompleted, duration: 3000 });
1549
+ ShowAlert({
1550
+ mode: 'success',
1551
+ title: SDKUI_Localizator.MoreInformation,
1552
+ message: SDKUI_Localizator.MoreInfoCompleted,
1553
+ duration: 3000
1554
+ });
1532
1555
  }
1533
1556
  catch (e) {
1534
- TMSpinner.hide();
1535
1557
  TMExceptionBoxManager.show({ exception: e });
1536
1558
  }
1537
1559
  finally {
@@ -1597,19 +1619,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1597
1619
  isEditable: true,
1598
1620
  value: FormulaHelper.addFormulaTag(newFormula.expression)
1599
1621
  }));
1600
- } }), showApprovePopup && _jsx(WorkFlowApproveRejectPopUp, { deviceType: deviceType, onCompleted: handleWFOperationCompleted, TID: approvalVID, DID: DID, isReject: 0, onClose: () => setShowApprovePopup(false) }), showRejectPopup && _jsx(WorkFlowApproveRejectPopUp, { deviceType: deviceType, onCompleted: handleWFOperationCompleted, TID: approvalVID, DID: DID, isReject: 1, onClose: () => setShowRejectPopup(false) }), showReAssignPopup && _jsx(WorkFlowReAssignPopUp, { deviceType: deviceType, onCompleted: handleWFOperationCompleted, TID: approvalVID, DID: DID, onClose: () => setShowReAssignPopup(false) }), showMoreInfoPopup && _jsx(WorkFlowMoreInfoPopUp, { deviceType: deviceType, onCompleted: handleWFOperationCompleted, TID: approvalVID, DID: DID, onClose: () => setShowMoreInfoPopup(false) }), (isModal && onClose) && _jsx("div", { id: "TMDcmtFormShowConfirmForClose-" + id })] }) }), _jsx(TMToppyDraggableHelpCenter, { isVisible: isToppyVisible, content: _jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, children: [showToppyForApprove && (workItems.length === 1 ?
1601
- _jsx(WorkFlowOperationButtons, { deviceType: deviceType, onApprove: () => setShowApprovePopup(true), onSignApprove: handleSignApprove, onReject: () => setShowRejectPopup(true), onReAssign: () => setShowReAssignPopup(true), onMoreInfo: () => setShowMoreInfoPopup(true), dtd: fromDTD })
1602
- :
1603
- _jsxs("div", { style: { padding: 10, color: 'white', maxWidth: '180px', borderRadius: 10, background: '#1B1464 0% 0% no-repeat padding-box', border: '1px solid #FFFFFF' }, children: [`Questo documento è associato a ${workItems.length} workitem.`, _jsx("br", {}), `Per approvare, vai alla pagina "Approvazione workflow".`] })), showToppyForCompleteMoreInfo && (moreInfoTasks?.length === 1 ? (_jsxs(_Fragment, { children: [_jsx("div", { style: { padding: 10, color: 'white', maxWidth: '180px', borderRadius: 10, background: '#1B1464 0% 0% no-repeat padding-box', border: '1px solid #FFFFFF' }, children: `${SDKUI_Localizator.MoreInfoCompleteRequestSentBy} ${moreInfoTasks[0]?.fromName}!` }), _jsx(TMButton, { caption: SDKUI_Localizator.CommentAndComplete, color: 'success', showTooltip: false, onClick: () => setShowCommentForm(true) })] })) : (_jsx("div", { style: { padding: 10, color: 'white', maxWidth: '180px', borderRadius: 10, background: '#1B1464 0% 0% no-repeat padding-box', border: '1px solid #FFFFFF' }, children: `Ci sono ${moreInfoTasks?.length ?? 0} richieste di maggiori informazioni. ${SDKUI_Localizator.ManageFromTaskPanel}` }))), showToppyForReferences && dcmtReferences?.filter(ref => ref.objClass === ObjectClasses.Dossier || ref.objClass === ObjectClasses.WorkingGroup)
1604
- .map((ref, index, arr) => {
1605
- const mapEntry = referenceActionMap[String(ref.objClass)];
1606
- const label = mapEntry?.label ?? 'Vai a riferimento';
1607
- return (_jsxs(React.Fragment, { children: [index === 0 && (showToppyForApprove || showToppyForCompleteMoreInfo) && (_jsx("div", { style: {
1608
- height: 1,
1609
- backgroundColor: 'rgba(255,255,255,0.2)',
1610
- margin: '6px 0'
1611
- } })), _jsxs(StyledReferenceButton, { onClick: () => handleNavigateToReference(ref), onDoubleClick: (e) => { e.preventDefault(); e.stopPropagation(); }, children: [_jsx("span", { children: label }), _jsx("span", { children: `"${ref.objName}"` })] }, `ref-${index}-${ref.objID}`)] }, `ref-frag-${index}-${ref.objID}`));
1612
- })] }) })] }), (showCommentForm && TID && DID) &&
1622
+ } }), showApprovePopup && _jsx(WorkFlowApproveRejectPopUp, { deviceType: deviceType, onCompleted: handleWFOperationCompleted, TID: approvalVID, DID: DID, isReject: 0, onClose: () => setShowApprovePopup(false) }), showRejectPopup && _jsx(WorkFlowApproveRejectPopUp, { deviceType: deviceType, onCompleted: handleWFOperationCompleted, TID: approvalVID, DID: DID, isReject: 1, onClose: () => setShowRejectPopup(false) }), showReAssignPopup && _jsx(WorkFlowReAssignPopUp, { deviceType: deviceType, onCompleted: handleWFOperationCompleted, TID: approvalVID, DID: DID, onClose: () => setShowReAssignPopup(false) }), showMoreInfoPopup && _jsx(WorkFlowMoreInfoPopUp, { deviceType: deviceType, onCompleted: handleWFOperationCompleted, TID: approvalVID, DID: DID, onClose: () => setShowMoreInfoPopup(false), getAllTasks: getAllTasks }), (isModal && onClose) && _jsx("div", { id: "TMDcmtFormShowConfirmForClose-" + id })] }) }), _jsx(TMToppyDraggableHelpCenter, { isVisible: isToppyVisible, content: _jsx(TMDcmtFormActionButtons, { showToppyForApprove: showToppyForApprove, workItems: workItems, deviceType: deviceType, isMobile: isMobile, handleSignApprove: handleSignApprove, setShowApprovePopup: setShowApprovePopup, setShowRejectPopup: setShowRejectPopup, setShowReAssignPopup: setShowReAssignPopup, setShowMoreInfoPopup: setShowMoreInfoPopup, fromDTD: fromDTD, showToppyForCompleteMoreInfo: showToppyForCompleteMoreInfo, moreInfoTasks: moreInfoTasks, setShowCommentForm: setShowCommentForm, showToppyForReferences: showToppyForReferences, dcmtReferences: dcmtReferences, referenceActionMap: referenceActionMap, handleNavigateToReference: handleNavigateToReference, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }) })] }), (showCommentForm && TID && DID) &&
1613
1623
  _jsx(TMBlogCommentForm, { context: { engine: 'SearchEngine', object: { tid: TID, did: DID } }, onClose: () => setShowCommentForm(false), refreshCallback: handleCompleteMoreInfo, participants: [], showAttachmentsSection: false, allArchivedDocumentsFileItems: [] }), isOpenDetails &&
1614
1624
  _jsx(StyledModalContainer, { children: _jsx(TMMasterDetailDcmts, { deviceType: deviceType, isForMaster: false, inputDcmts: getSelectionDcmtInfo(), allowNavigation: allowNavigation, canNext: canNext, canPrev: canPrev, onNext: onNext, onPrev: onPrev, onBack: () => setIsOpenDetails(false), allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }) }), isOpenMaster &&
1615
1625
  _jsxs(StyledModalContainer, { children: [_jsx(TMMasterDetailDcmts, { deviceType: deviceType, inputDcmts: getSelectionDcmtInfo(), isForMaster: true, allowNavigation: allowNavigation, canNext: canNext, canPrev: canPrev, onNext: onNext, onPrev: onPrev, onBack: () => setIsOpenMaster(false), appendMasterDcmts: handleAddItem, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }), secondaryMasterDcmts.length > 0 && secondaryMasterDcmts.map((dcmt, index) => {
@@ -1773,3 +1783,111 @@ const Ribbon = styled.div `
1773
1783
  }
1774
1784
  `}
1775
1785
  `;
1786
+ const TaskLink = (props) => {
1787
+ const { deviceType, taskId, messagePrefix, name, taskNameTrunc, description, allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, handleNavigateToWGs, handleNavigateToDossiers } = props;
1788
+ const mouseMoved = useRef(false);
1789
+ const handleMouseDown = () => {
1790
+ mouseMoved.current = false;
1791
+ };
1792
+ const handleMouseMove = () => {
1793
+ mouseMoved.current = true;
1794
+ };
1795
+ // Stato per gestire la visualizzazione del form di modifica attività
1796
+ const [showTaskForm, setShowTaskForm] = useState(false);
1797
+ const onSavedTaskFormCallback = (task) => {
1798
+ if (task && taskId && editTaskCallback) {
1799
+ editTaskCallback(task);
1800
+ setShowTaskForm(false);
1801
+ ShowAlert({ message: SDKUI_Localizator.TaskSavedSuccessfully.replaceParams(task.name ?? '-'), mode: 'success', title: SDKUI_Localizator.Widget_Activities, duration: 3000 });
1802
+ }
1803
+ else {
1804
+ ShowAlert({ message: SDKUI_Localizator.TaskSaveError, mode: 'error', title: SDKUI_Localizator.Widget_Activities, duration: 3000 });
1805
+ }
1806
+ };
1807
+ return (_jsxs(_Fragment, { children: [_jsx("div", { style: { display: 'inline-flex', alignItems: 'center', gap: '4px' }, children: _jsxs("div", { onMouseDown: handleMouseDown, onMouseMove: handleMouseMove, style: { display: 'inline' }, children: [messagePrefix, ' ', _jsx("span", { style: {
1808
+ cursor: 'pointer',
1809
+ fontWeight: 500,
1810
+ textDecoration: 'none',
1811
+ transition: 'text-decoration 0.2s',
1812
+ }, onClick: () => setShowTaskForm(true), onMouseEnter: e => e.currentTarget.style.textDecoration = 'underline', onMouseLeave: e => e.currentTarget.style.textDecoration = 'none', children: taskNameTrunc }), ' ', _jsx(TMTooltip, { parentStyle: { display: 'inline' }, childStyle: { display: 'inline' }, content: _jsxs("div", { style: { whiteSpace: 'pre-line', textAlign: 'left' }, children: [_jsxs("div", { children: [_jsx("b", { children: SDKUI_Localizator.Name }), ": ", name] }), _jsxs("div", { children: [_jsx("b", { children: SDKUI_Localizator.Description }), ": ", description] })] }), children: _jsx("i", { className: "dx-icon dx-icon-info", style: { fontSize: '16px', lineHeight: 1, cursor: 'pointer' }, onClick: () => setShowTaskForm(true) }) })] }) }), (showTaskForm && taskId && handleNavigateToWGs && handleNavigateToDossiers && getAllTasks && deleteTaskByIdsCallback && addTaskCallback && editTaskCallback) && _jsx(TMTaskForm, { id: Number(taskId), title: name, formMode: FormModes.Update, onSaved: onSavedTaskFormCallback, editTaskCallback: editTaskCallback, onClose: () => {
1813
+ setShowTaskForm(false);
1814
+ }, onCancel: () => setShowTaskForm(false), isModal: true, showBackButton: false, hasNavigation: false, width: calcResponsiveSizes(deviceType, '670px', '670px', '95%'), height: calcResponsiveSizes(deviceType, '670px', '670px', '95%'), handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, visualizedTasks: [], currentTask: null, setCurrentTask: () => { }, selectedRowKeys: [], handleFocusedRowKeyChange: () => { }, onStatusChanged: () => { }, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback })] }));
1815
+ };
1816
+ const TMDcmtFormActionButtons = (props) => {
1817
+ const { showToppyForApprove, workItems, deviceType, isMobile, handleSignApprove, setShowApprovePopup, setShowRejectPopup, setShowReAssignPopup, setShowMoreInfoPopup, fromDTD, showToppyForCompleteMoreInfo, moreInfoTasks, setShowCommentForm, showToppyForReferences, dcmtReferences, referenceActionMap, handleNavigateToReference, allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, handleNavigateToWGs, handleNavigateToDossiers, } = props;
1818
+ const tasksNumber = useMemo(() => moreInfoTasks?.length ?? 0, [moreInfoTasks]);
1819
+ const currentTask = useMemo(() => {
1820
+ if (!moreInfoTasks || moreInfoTasks.length === 0)
1821
+ return null;
1822
+ if (moreInfoTasks.length === 1)
1823
+ return moreInfoTasks[0];
1824
+ // If there are multiple tasks, we cannot determine which one is relevant, so we return null
1825
+ return null;
1826
+ }, [moreInfoTasks]);
1827
+ const { hasMoreInfo, hasApprove, hasReferences } = useMemo(() => {
1828
+ const referencesExist = showToppyForReferences && dcmtReferences?.some(ref => ref.objClass === ObjectClasses.Dossier || ref.objClass === ObjectClasses.WorkingGroup);
1829
+ return {
1830
+ hasMoreInfo: Boolean(showToppyForCompleteMoreInfo),
1831
+ hasApprove: Boolean(showToppyForApprove),
1832
+ hasReferences: Boolean(referencesExist)
1833
+ };
1834
+ }, [
1835
+ showToppyForCompleteMoreInfo,
1836
+ showToppyForApprove,
1837
+ showToppyForReferences,
1838
+ dcmtReferences
1839
+ ]);
1840
+ const Divider = () => (_jsx("div", { style: { height: '1px', width: '100%', background: 'linear-gradient(to right, transparent, rgba(255,255,255,0.4), transparent)', margin: '3px 0', opacity: 0.8, } }));
1841
+ return _jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, children: [hasMoreInfo && (tasksNumber === 1 ? (_jsx("div", { style: { display: 'flex', gap: "10px", flexDirection: 'column', alignItems: 'center' }, children: _jsx("div", { style: {
1842
+ padding: '10px',
1843
+ color: '#FFFFFF',
1844
+ maxWidth: '240px',
1845
+ background: 'linear-gradient(135deg, #1E90FF 0%, #0077BE 60%, #00509E 100%)',
1846
+ border: '1px solid rgba(255,255,255,0.15)',
1847
+ boxShadow: '0 8px 20px rgba(0, 0, 50, 0.4)',
1848
+ backdropFilter: 'blur(6px)',
1849
+ display: 'flex',
1850
+ flexDirection: 'column',
1851
+ alignItems: 'center',
1852
+ textAlign: 'center',
1853
+ gap: '10px',
1854
+ cursor: 'default',
1855
+ }, children: (() => {
1856
+ const userID = SDK_Globals.tmSession?.SessionDescr?.userID;
1857
+ const isSender = currentTask?.fromID !== undefined && currentTask.fromID === userID;
1858
+ const isRecipient = currentTask?.toID !== undefined && currentTask.toID === userID;
1859
+ const truncate = (str, maxLength) => str && str.length > maxLength ? str.substring(0, maxLength) + '...' : str;
1860
+ const senderNameTruncated = currentTask?.fromName ? truncate(currentTask.fromName, 30) : 'N/A';
1861
+ const recipientNameTruncated = currentTask?.toName ? truncate(currentTask.toName, 30) : 'N/A';
1862
+ const taskNameTrunc = currentTask?.name ? truncate(currentTask.name.replace(TASK_MORE_INFO_PREFIX_NAME ?? '', ''), 30) : 'N/A';
1863
+ return (_jsxs(_Fragment, { children: [(isSender && !isRecipient) && (_jsx(TaskLink, { taskId: currentTask.id, messagePrefix: `Hai richiesto maggiori informazioni a "${recipientNameTruncated}" tramite l'attività`, name: currentTask.name ?? 'N/A', taskNameTrunc: taskNameTrunc ?? 'N/A', description: currentTask.description ?? 'N/A', allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, deviceType: deviceType })), (isRecipient && !isSender) && (_jsxs("div", { style: {
1864
+ display: 'flex',
1865
+ flexDirection: 'column',
1866
+ alignItems: 'center',
1867
+ gap: '10px'
1868
+ }, children: [_jsx(TaskLink, { taskId: currentTask.id, messagePrefix: `"${senderNameTruncated}" ti ha richiesto maggiori informazioni tramite l'attività`, name: currentTask.name ?? 'N/A', taskNameTrunc: taskNameTrunc ?? 'N/A', description: currentTask.description ?? 'N/A', allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, deviceType: deviceType }), _jsx(TMButton, { btnStyle: isMobile ? 'toolbar' : 'advanced', showTooltip: isMobile, icon: _jsx("span", { className: "dx-icon-chat" }), caption: SDKUI_Localizator.CommentAndComplete, width: "180px", disabled: false, onClick: () => setShowCommentForm(true), onMouseDown: e => e.stopPropagation(), advancedColor: TMColors.success, color: "success" })] }))] }));
1869
+ })() }) })) : (_jsx("div", { style: {
1870
+ padding: '10px',
1871
+ color: '#FFFFFF',
1872
+ maxWidth: '240px',
1873
+ background: 'linear-gradient(135deg, #1E90FF 0%, #0077BE 60%, #00509E 100%)',
1874
+ border: '1px solid rgba(255,255,255,0.15)',
1875
+ boxShadow: '0 8px 20px rgba(0, 0, 50, 0.4)',
1876
+ backdropFilter: 'blur(6px)',
1877
+ display: 'flex',
1878
+ flexDirection: 'column',
1879
+ alignItems: 'center',
1880
+ textAlign: 'center',
1881
+ gap: '10px',
1882
+ cursor: 'default',
1883
+ }, children: `Ci sono ${moreInfoTasks?.length ?? 0} richieste di maggiori informazioni. ${SDKUI_Localizator.ManageFromTaskPanel}` }))), hasMoreInfo && hasApprove && _jsx(Divider, {}), hasApprove && (workItems.length === 1 ?
1884
+ _jsx(WorkFlowOperationButtons, { deviceType: deviceType, onApprove: () => setShowApprovePopup(true), onSignApprove: handleSignApprove, onReject: () => setShowRejectPopup(true), onReAssign: () => setShowReAssignPopup(true), onMoreInfo: () => setShowMoreInfoPopup(true), dtd: fromDTD })
1885
+ :
1886
+ _jsxs("div", { style: { padding: 10, color: 'white', maxWidth: '180px', borderRadius: 10, background: '#1B1464 0% 0% no-repeat padding-box', border: '1px solid #FFFFFF' }, children: [`Questo documento è associato a ${workItems.length} workitem.`, _jsx("br", {}), `Per approvare, vai alla pagina "Approvazione workflow".`] })), (hasApprove && hasReferences) || (hasMoreInfo && !hasApprove && hasReferences) ? (_jsx(Divider, {})) : null, hasReferences && (_jsx(ReferencesContainer, { children: dcmtReferences
1887
+ ?.filter(ref => ref.objClass === ObjectClasses.Dossier || ref.objClass === ObjectClasses.WorkingGroup)
1888
+ .map((ref, index) => {
1889
+ const mapEntry = referenceActionMap[String(ref.objClass)];
1890
+ const label = mapEntry?.label ?? 'Vai a riferimento';
1891
+ return (_jsxs(StyledReferenceButton, { onClick: () => handleNavigateToReference(ref), onDoubleClick: (e) => { e.preventDefault(); e.stopPropagation(); }, children: [_jsx("span", { children: label }), _jsx("span", { children: `"${ref.objName}"` })] }, `ref-${index}-${ref.objID}`));
1892
+ }) }))] });
1893
+ };
@@ -87,7 +87,8 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
87
87
  }
88
88
  await sleep(300);
89
89
  const basketEngine = SDK_Globals.tmSession?.NewBasketEngine();
90
- const file = await basketEngine?.RetrieveFileAsync(dcmtData?.btid, dcmtData?.bid, dcmtData?.bfid, abortController.signal);
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);
91
92
  // Store in cache
92
93
  if (file) {
93
94
  if (dcmtsFileCachePreview.size >= CACHE_SIZE_LIMIT) {
@@ -267,7 +267,7 @@ const TMFormOrResultWrapper = ({ deviceType, focusedItem, onTaskCreateRequest, a
267
267
  _jsx(TMDcmtForm, { groupId: 'tmFormOrResult', TID: focusedItem?.tid, DID: focusedItem.did, allowButtonsRefs: true, isClosable: deviceType !== DeviceType.MOBILE, allowNavigation: false, allowRelations: deviceType !== DeviceType.MOBILE, showDcmtFormSidebar: false, onClose: () => {
268
268
  setPanelVisibilityById('tmTreeView', true);
269
269
  }, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, moreInfoTasks: getMoreInfoTasksForDocument(allTasks, focusedItem?.tid, focusedItem?.did) }) :
270
- _jsx(TMSearchResult, { groupId: 'tmFormOrResult', isClosable: deviceType !== DeviceType.MOBILE, context: SearchResultContext.METADATA_SEARCH, allowFloatingBar: false, allowRelations: false, openDcmtFormAsModal: true, searchResults: focusedItem?.searchResult ?? [], showSearchResultSidebar: false, onTaskCreateRequest: onTaskCreateRequest, onClose: () => {
270
+ _jsx(TMSearchResult, { groupId: 'tmFormOrResult', isClosable: deviceType !== DeviceType.MOBILE, context: SearchResultContext.METADATA_SEARCH, allowFloatingBar: false, allowRelations: false, openDcmtFormAsModal: true, searchResults: focusedItem?.searchResult ?? [], showSearchResultSidebar: false, showDcmtFormSidebar: false, onTaskCreateRequest: onTaskCreateRequest, onClose: () => {
271
271
  setPanelVisibilityById('tmTreeView', true);
272
272
  }, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }) }));
273
273
  };
@@ -20,6 +20,7 @@ interface ITMSearchResultProps {
20
20
  isVisible?: boolean;
21
21
  openDcmtFormAsModal?: boolean;
22
22
  showSearchResultSidebar?: boolean;
23
+ showDcmtFormSidebar?: boolean;
23
24
  showSelector?: boolean;
24
25
  showToolbarHeader?: boolean;
25
26
  showBackButton?: boolean;