@topconsultnpm/sdkui-react 6.20.0-dev1.9 → 6.20.0-dev1.90

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 (143) hide show
  1. package/lib/assets/Toppy-help-center.png +0 -0
  2. package/lib/components/NewComponents/ContextMenu/TMContextMenu.d.ts +4 -0
  3. package/lib/components/NewComponents/ContextMenu/TMContextMenu.js +441 -0
  4. package/lib/components/NewComponents/ContextMenu/hooks.d.ts +18 -0
  5. package/lib/components/NewComponents/ContextMenu/hooks.js +120 -0
  6. package/lib/components/NewComponents/ContextMenu/index.d.ts +5 -0
  7. package/lib/components/NewComponents/ContextMenu/index.js +3 -0
  8. package/lib/components/NewComponents/ContextMenu/styles.d.ts +35 -0
  9. package/lib/components/NewComponents/ContextMenu/styles.js +428 -0
  10. package/lib/components/NewComponents/ContextMenu/types.d.ts +39 -0
  11. package/lib/components/NewComponents/ContextMenu/types.js +1 -0
  12. package/lib/components/NewComponents/ContextMenu/useLongPress.d.ts +21 -0
  13. package/lib/components/NewComponents/ContextMenu/useLongPress.js +112 -0
  14. package/lib/components/NewComponents/FloatingMenuBar/TMFloatingMenuBar.d.ts +4 -0
  15. package/lib/components/NewComponents/FloatingMenuBar/TMFloatingMenuBar.js +821 -0
  16. package/lib/components/NewComponents/FloatingMenuBar/index.d.ts +2 -0
  17. package/lib/components/NewComponents/FloatingMenuBar/index.js +2 -0
  18. package/lib/components/NewComponents/FloatingMenuBar/styles.d.ts +54 -0
  19. package/lib/components/NewComponents/FloatingMenuBar/styles.js +419 -0
  20. package/lib/components/NewComponents/FloatingMenuBar/types.d.ts +36 -0
  21. package/lib/components/NewComponents/FloatingMenuBar/types.js +1 -0
  22. package/lib/components/base/TMAccordionNew.js +35 -14
  23. package/lib/components/base/TMCustomButton.js +61 -17
  24. package/lib/components/base/TMDataGrid.d.ts +7 -4
  25. package/lib/components/base/TMDataGrid.js +144 -11
  26. package/lib/components/base/TMDropDownMenu.js +19 -18
  27. package/lib/components/base/TMFileManager.d.ts +4 -3
  28. package/lib/components/base/TMFileManager.js +32 -24
  29. package/lib/components/base/TMFileManagerDataGridView.d.ts +3 -2
  30. package/lib/components/base/TMFileManagerDataGridView.js +1 -11
  31. package/lib/components/base/TMFileManagerThumbnailItems.d.ts +7 -1
  32. package/lib/components/base/TMFileManagerThumbnailItems.js +5 -2
  33. package/lib/components/base/TMFileManagerThumbnailsView.d.ts +17 -4
  34. package/lib/components/base/TMFileManagerThumbnailsView.js +18 -6
  35. package/lib/components/base/TMFileManagerUtils.d.ts +0 -12
  36. package/lib/components/base/TMPanel.js +1 -1
  37. package/lib/components/choosers/TMInvoiceRetrieveFormats.js +1 -1
  38. package/lib/components/choosers/TMMetadataChooser.js +8 -1
  39. package/lib/components/choosers/TMOrderRetrieveFormats.js +1 -1
  40. package/lib/components/choosers/TMUserChooser.d.ts +0 -5
  41. package/lib/components/choosers/TMUserChooser.js +25 -45
  42. package/lib/components/editors/TMMetadataValues.js +23 -5
  43. package/lib/components/editors/TMTextBox.js +6 -3
  44. package/lib/components/features/assistant/TMToppyDraggableHelpCenter.d.ts +15 -0
  45. package/lib/components/features/assistant/TMToppyDraggableHelpCenter.js +460 -0
  46. package/lib/components/features/assistant/TMToppySpeechBubble.d.ts +11 -0
  47. package/lib/components/features/assistant/TMToppySpeechBubble.js +126 -0
  48. package/lib/components/features/documents/TMDcmtForm.d.ts +13 -1
  49. package/lib/components/features/documents/TMDcmtForm.js +442 -198
  50. package/lib/components/features/documents/TMDcmtPreview.js +41 -105
  51. package/lib/components/features/documents/TMDcmtTasks.js +9 -9
  52. package/lib/components/features/documents/TMMasterDetailDcmts.js +37 -52
  53. package/lib/components/features/documents/TMRelationViewer.d.ts +1 -1
  54. package/lib/components/features/documents/TMRelationViewer.js +2 -2
  55. package/lib/components/features/search/TMDcmtCheckoutInfoForm.d.ts +8 -0
  56. package/lib/components/features/search/{TMSearchResultCheckoutInfoForm.js → TMDcmtCheckoutInfoForm.js} +2 -2
  57. package/lib/components/features/search/TMSavedQuerySelector.js +72 -67
  58. package/lib/components/features/search/TMSearch.js +44 -9
  59. package/lib/components/features/search/TMSearchQueryPanel.d.ts +1 -0
  60. package/lib/components/features/search/TMSearchQueryPanel.js +19 -18
  61. package/lib/components/features/search/TMSearchResult.js +187 -247
  62. package/lib/components/features/search/TMSearchResultsMenuItems.d.ts +3 -3
  63. package/lib/components/features/search/TMSearchResultsMenuItems.js +205 -169
  64. package/lib/components/features/search/TMSignSettingsForm.js +1 -1
  65. package/lib/components/features/search/TMSignatureInfoContent.d.ts +6 -0
  66. package/lib/components/features/search/TMSignatureInfoContent.js +140 -0
  67. package/lib/components/features/search/TMViewHistoryDcmt.js +1 -1
  68. package/lib/components/features/tasks/TMTaskForm.js +20 -1
  69. package/lib/components/features/tasks/TMTasksAgenda.d.ts +3 -1
  70. package/lib/components/features/tasks/TMTasksAgenda.js +48 -9
  71. package/lib/components/features/tasks/TMTasksCalendar.d.ts +2 -0
  72. package/lib/components/features/tasks/TMTasksCalendar.js +19 -7
  73. package/lib/components/features/tasks/TMTasksUtils.d.ts +2 -2
  74. package/lib/components/features/tasks/TMTasksUtils.js +43 -36
  75. package/lib/components/features/tasks/TMTasksView.js +28 -19
  76. package/lib/components/features/workflow/TMWorkflowPopup.d.ts +33 -2
  77. package/lib/components/features/workflow/TMWorkflowPopup.js +139 -34
  78. package/lib/components/features/workflow/diagram/DiagramItemComponent.d.ts +1 -0
  79. package/lib/components/features/workflow/diagram/DiagramItemComponent.js +2 -3
  80. package/lib/components/features/workflow/diagram/RecipientList.js +3 -2
  81. package/lib/components/features/workflow/diagram/WFDiagram.d.ts +3 -0
  82. package/lib/components/features/workflow/diagram/WFDiagram.js +157 -12
  83. package/lib/components/forms/Login/LoginValidatorService.d.ts +2 -0
  84. package/lib/components/forms/Login/LoginValidatorService.js +7 -2
  85. package/lib/components/forms/Login/TMLoginForm.js +34 -6
  86. package/lib/components/forms/TMChooserForm.js +1 -1
  87. package/lib/components/grids/TMBlogsPost.js +55 -30
  88. package/lib/components/grids/TMRecentsManager.js +20 -10
  89. package/lib/components/index.d.ts +5 -1
  90. package/lib/components/index.js +5 -1
  91. package/lib/components/query/TMQueryEditor.d.ts +2 -1
  92. package/lib/components/query/TMQueryEditor.js +92 -92
  93. package/lib/components/settings/SettingsAppearance.d.ts +2 -1
  94. package/lib/components/settings/SettingsAppearance.js +99 -30
  95. package/lib/components/viewers/TMDataListItemViewer.d.ts +2 -1
  96. package/lib/components/viewers/TMDataListItemViewer.js +35 -71
  97. package/lib/components/viewers/TMDataUserIdItemViewer.d.ts +8 -0
  98. package/lib/components/viewers/TMDataUserIdItemViewer.js +39 -0
  99. package/lib/css/tm-sdkui.css +1 -1
  100. package/lib/helper/SDKUI_Globals.d.ts +19 -0
  101. package/lib/helper/SDKUI_Globals.js +6 -0
  102. package/lib/helper/SDKUI_Localizator.d.ts +16 -1
  103. package/lib/helper/SDKUI_Localizator.js +157 -1
  104. package/lib/helper/TMCommandsContextMenu.d.ts +4 -2
  105. package/lib/helper/TMCommandsContextMenu.js +15 -4
  106. package/lib/helper/TMIcons.d.ts +3 -0
  107. package/lib/helper/TMIcons.js +10 -3
  108. package/lib/helper/TMPdfViewer.d.ts +8 -0
  109. package/lib/helper/TMPdfViewer.js +373 -0
  110. package/lib/helper/checkinCheckoutManager.d.ts +31 -1
  111. package/lib/helper/checkinCheckoutManager.js +112 -30
  112. package/lib/helper/devextremeCustomMessages.d.ts +30 -0
  113. package/lib/helper/devextremeCustomMessages.js +30 -0
  114. package/lib/helper/helpers.d.ts +2 -1
  115. package/lib/helper/helpers.js +14 -3
  116. package/lib/helper/index.d.ts +2 -0
  117. package/lib/helper/index.js +2 -0
  118. package/lib/helper/queryHelper.d.ts +1 -1
  119. package/lib/helper/queryHelper.js +33 -3
  120. package/lib/helper/workItemsHelper.d.ts +6 -0
  121. package/lib/helper/workItemsHelper.js +230 -0
  122. package/lib/hooks/useCheckInOutOperations.d.ts +28 -0
  123. package/lib/hooks/useCheckInOutOperations.js +223 -0
  124. package/lib/hooks/useDataListItem.d.ts +12 -0
  125. package/lib/hooks/useDataListItem.js +131 -0
  126. package/lib/hooks/useDataUserIdItem.d.ts +10 -0
  127. package/lib/hooks/useDataUserIdItem.js +96 -0
  128. package/lib/hooks/useSettingsFeedback.d.ts +11 -0
  129. package/lib/hooks/useSettingsFeedback.js +38 -0
  130. package/lib/hooks/useWorkflowApprove.d.ts +4 -0
  131. package/lib/hooks/useWorkflowApprove.js +14 -1
  132. package/lib/index.d.ts +1 -0
  133. package/lib/index.js +3 -2
  134. package/lib/services/platform_services.d.ts +1 -1
  135. package/lib/ts/types.d.ts +61 -1
  136. package/lib/utils/theme.d.ts +1 -1
  137. package/lib/utils/theme.js +1 -1
  138. package/package.json +7 -4
  139. package/lib/components/features/assistant/ToppyDraggableHelpCenter.d.ts +0 -30
  140. package/lib/components/features/assistant/ToppyDraggableHelpCenter.js +0 -482
  141. package/lib/components/features/assistant/ToppySpeechBubble.d.ts +0 -9
  142. package/lib/components/features/assistant/ToppySpeechBubble.js +0 -117
  143. package/lib/components/features/search/TMSearchResultCheckoutInfoForm.d.ts +0 -8
@@ -1,15 +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, TemplateTIDs, TID_DID, UpdateEngineByID, ValidationItem, WorkflowCacheService, WorkItemMetadataNames } from '@topconsultnpm/sdk-ts';
5
- import { ContextMenu } from 'devextreme-react';
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';
6
5
  import { WorkFlowApproveRejectPopUp, WorkFlowMoreInfoPopUp, WorkFlowOperationButtons, WorkFlowReAssignPopUp } from '../workflow/TMWorkflowPopup';
7
6
  import { DownloadTypes, FormModes, DcmtOperationTypes } from '../../../ts';
8
7
  import { DeviceType, useDeviceType } from '../../base/TMDeviceProvider';
9
8
  import { useDcmtOperations } from '../../../hooks/useDcmtOperations';
10
9
  import { useRelatedDocuments } from '../../../hooks/useRelatedDocuments';
11
10
  import { getWorkItemSetIDAsync, handleArchiveVisibility, searchResultToMetadataValues } from '../../../helper/queryHelper';
12
- import { genUniqueId, IconShow, SDKUI_Localizator, updateMruTids, IconBoard, IconDcmtTypeSys, IconDetailDcmts, svgToString, 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 } 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 } from '../../../helper';
13
12
  import { hasDetailRelations, hasMasterRelations, isXMLFileExt } from '../../../helper/dcmtsHelper';
14
13
  import { Gutters, TMColors } from '../../../utils/theme';
15
14
  import { StyledFormButtonsContainer, StyledLoadingContainer, StyledModalContainer, StyledReferenceButton, StyledSpinner, StyledToolbarCardContainer } from '../../base/Styled';
@@ -41,10 +40,31 @@ import TMDcmtTasks from './TMDcmtTasks';
41
40
  import TMToppyMessage from '../../../helper/TMToppyMessage';
42
41
  import { getTaskAssignedToMe } from '../tasks/TMTasksUtils';
43
42
  import TMCustomButton from '../../base/TMCustomButton';
44
- import ToppyDraggableHelpCenter from '../assistant/ToppyDraggableHelpCenter';
43
+ import { useCheckInOutOperations } from '../../../hooks/useCheckInOutOperations';
44
+ import TMViewHistoryDcmt from '../search/TMViewHistoryDcmt';
45
+ import TMDcmtCheckoutInfoForm from '../search/TMDcmtCheckoutInfoForm';
46
+ import styled from 'styled-components';
47
+ import { ContextMenu } from '../../NewComponents/ContextMenu';
48
+ import TMToppyDraggableHelpCenter from '../assistant/TMToppyDraggableHelpCenter';
49
+ //#region Interfaces, Types and Enums
50
+ /**
51
+ * Definisce il contesto da cui è stato invocato il TMDcmtForm.
52
+ * Permette di gestire logiche diverse in base alla provenienza.
53
+ */
54
+ export var InvocationContext;
55
+ (function (InvocationContext) {
56
+ /** Invocazione standard */
57
+ InvocationContext["Default"] = "default";
58
+ /** Invocato dalla pagina Todo/Task */
59
+ InvocationContext["Todo"] = "todo";
60
+ /** Invocato dalla pagina WorkflowCtrl */
61
+ InvocationContext["WorkflowCtrl"] = "workflowCtrl";
62
+ // Aggiungi qui altri contesti futuri secondo necessità
63
+ })(InvocationContext || (InvocationContext = {}));
45
64
  let abortControllerLocal = new AbortController();
46
65
  //#endregion
47
- const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, handleNavigateToWGs, handleNavigateToDossiers, showHeader = true, onSaveRecents, layoutMode = LayoutModes.Update, showBackButton = true, onClose, onSavedAsyncCallback, TID, DID, formMode = FormModes.Update, canNext, canPrev, count, itemIndex, onNext, onPrev, allowNavigation = true, allowRelations = true, isClosable = false, isExpertMode = SDKUI_Globals.userSettings.advancedSettings.expertMode === 1, showDcmtFormSidebar = true, invokedByTodo = false, titleModal, isModal = false, widthModal = "100%", heightModal = "100%", groupId, onWFOperationCompleted, onTaskCompleted, onTaskCreateRequest, inputFile = null, taskFormDialogComponent, taskMoreInfo, connectorFileSave = undefined, inputMids = [], openS4TViewer = false, onOpenS4TViewerRequest, s4TViewerDialogComponent, enableDragDropOverlay = false, passToSearch, isSharedDcmt = false, sharedSourceTID, sharedSourceDID, allowButtonsRefs = false, onReferenceClick, }) => {
66
+ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, handleNavigateToWGs, handleNavigateToDossiers, showHeader = true, onSaveRecents, layoutMode = LayoutModes.Update, showBackButton = true, onClose, onSavedAsyncCallback, TID, DID, formMode = FormModes.Update, canNext, canPrev, count, itemIndex, onNext, onPrev, allowNavigation = true, allowRelations = true, isClosable = false, isExpertMode = SDKUI_Globals.userSettings.advancedSettings.expertMode === 1, showDcmtFormSidebar = true, invocationContext = InvocationContext.Default, titleModal, isModal = false, widthModal = "100%", heightModal = "100%", groupId, onWFOperationCompleted, onTaskCompleted, onTaskCreateRequest, inputFile = null, taskFormDialogComponent, taskMoreInfo, connectorFileSave = undefined, inputMids = [], openS4TViewer = false, onOpenS4TViewerRequest, s4TViewerDialogComponent, enableDragDropOverlay = false, passToSearch, isSharedDcmt = false, sharedSourceTID, sharedSourceDID, allowButtonsRefs = false, onReferenceClick, }) => {
67
+ const { showHistory, showHistoryCallback, hideHistoryCallback, showCheckoutInformationForm, commentFormState, hideCommentFormCallback, showCheckoutInformationFormCallback, hideCheckoutInformationFormCallback, copyCheckoutPathToClipboardCallback, handleCheckOutCallback, handleCheckInCallback, refreshPreviewTrigger, showCicoWaitPanel, cicoWaitPanelTitle, showCicoPrimaryProgress, cicoPrimaryProgressText, cicoPrimaryProgressValue, cicoPrimaryProgressMax, } = useCheckInOutOperations();
48
68
  const [id, setID] = useState('');
49
69
  const [showWaitPanelLocal, setShowWaitPanelLocal] = useState(false);
50
70
  const [waitPanelTitleLocal, setWaitPanelTitleLocal] = useState('');
@@ -68,6 +88,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
68
88
  const [layout, setLayout] = useState();
69
89
  const [customButtonsLayout, setCustomButtonsLayout] = useState();
70
90
  const [customButton, setCustomButton] = useState();
91
+ const [allUsers, setAllUsers] = useState([]);
71
92
  const appliedInputMidsRef = useRef(null);
72
93
  // Refs per evitare stale closure nei callback
73
94
  // I useCallback catturano i valori delle dipendenze al momento della creazione.
@@ -91,6 +112,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
91
112
  const [fetchError, setFetchError] = useState(false);
92
113
  const [isWFDataLoading, setIsWFDataLoading] = useState(false);
93
114
  const [workItems, setWorkItems] = useState([]);
115
+ const [workItemsForDiagram, setWorkItemsForDiagram] = useState([]);
94
116
  const [workflows, setWorkflows] = useState([]);
95
117
  const [showCommentForm, setShowCommentForm] = useState(false);
96
118
  const [isInitialLoading, setIsInitialLoading] = useState(true);
@@ -98,16 +120,24 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
98
120
  const [dcmtReferences, setDcmtReferences] = useState(undefined);
99
121
  // Stato per triggerare il refresh del blog dall'esterno
100
122
  const [refreshBlogTrigger, setRefreshBlogTrigger] = useState(0);
123
+ const [wfError, setWfError] = useState(null);
101
124
  const triggerBlogRefresh = useCallback(async () => {
102
125
  setRefreshBlogTrigger(prev => prev + 1);
103
126
  }, []);
127
+ useEffect(() => {
128
+ const fetchAllUsers = async () => {
129
+ const users = await UserListCacheService.GetAllAsync();
130
+ setAllUsers(users ?? []);
131
+ };
132
+ fetchAllUsers();
133
+ }, []);
104
134
  useEffect(() => {
105
135
  if (!allowButtonsRefs)
106
136
  setDcmtReferences(undefined);
107
137
  }, [allowButtonsRefs]);
108
138
  const { openConfirmAttachmentsDialog, ConfirmAttachmentsDialog } = useInputAttachmentsDialog();
109
139
  const { abortController, showWaitPanel, waitPanelTitle, showPrimary, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, downloadDcmtsAsync, runOperationAsync } = useDcmtOperations();
110
- const { workflowApproveData } = useWorkflowApprove();
140
+ const { workflowApproveData, getWorkItemsByDID } = useWorkflowApprove();
111
141
  const currentSearchResults = useMemo(() => {
112
142
  if (!formData || formData.length === 0 || !TID || !DID)
113
143
  return [];
@@ -124,7 +154,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
124
154
  selectMIDs: selectMIDs,
125
155
  dtdResult: {
126
156
  rows: [rowValues],
127
- columns: selectMIDs.map(mid => ({ name: `MID_${mid}` }))
157
+ columns: selectMIDs.map(mid => ({ name: `MID_${mid}`, }))
128
158
  },
129
159
  dcmtsFound: 1,
130
160
  dcmtsReturned: 1
@@ -410,74 +440,175 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
410
440
  const workItemSetIDValue = useMemo(() => formData.find(o => o.md?.name === WorkItemMetadataNames.WI_SetID)?.value, [formData]);
411
441
  // Valore derivato: true se formData ha elementi validi
412
442
  const hasFormData = useMemo(() => formData.length > 0 && formData.some(md => md.mid && md.mid > 99), [formData]);
443
+ const handleCheckOutOperationCallback = async (checkout) => {
444
+ if (!currentDcmt)
445
+ return;
446
+ await handleCheckOutCallback({ TID: currentDcmt.tid, DID: currentDcmt.did, FILEEXT: currentDcmt.fileExt }, checkout, fromDTD?.name ?? SDKUI_Localizator.SearchResult, downloadDcmtsAsync, updateCurrentDcmt);
447
+ };
448
+ const handleCheckInOperationCallback = async () => {
449
+ if (!currentDcmt)
450
+ return;
451
+ await handleCheckInCallback({ TID: currentDcmt.tid, DID: currentDcmt.did, FILEEXT: currentDcmt.fileExt, fileName: fromDTD?.name ?? SDKUI_Localizator.SearchResult }, updateCurrentDcmt, undefined);
452
+ };
453
+ const copyCheckoutPathToClipboardOperationCallback = () => {
454
+ if (!currentDcmt)
455
+ return;
456
+ copyCheckoutPathToClipboardCallback({ TID: currentDcmt.tid, DID: currentDcmt.did, FILEEXT: currentDcmt.fileExt }, fromDTD?.name ?? SDKUI_Localizator.SearchResult);
457
+ };
458
+ // useEffect per il caricamento dei dati del workflow
413
459
  useEffect(() => {
460
+ // Funzione helper per caricare le informazioni del workflow
461
+ const loadWorkflowInfo = async (tid) => {
462
+ await WorkflowCacheService.GetWFInfoAsync(tid)
463
+ .then((result) => {
464
+ if (result) {
465
+ setWorkflows([result]);
466
+ setWfError(null);
467
+ }
468
+ else {
469
+ setWorkflows([]);
470
+ setWfError("Workflow info not found");
471
+ }
472
+ })
473
+ .catch(error => {
474
+ setWorkflows([]);
475
+ console.log("Error fetching workflow info:", error);
476
+ setWfError(getExceptionMessage(error));
477
+ });
478
+ };
414
479
  const loadAllWfData = async () => {
415
- if (layoutMode !== LayoutModes.Update || !DID || fromDTD?.templateTID !== TemplateTIDs.WF_WIApprView) {
480
+ // FASE 1: Validazione prerequisiti
481
+ if (layoutMode !== LayoutModes.Update || !DID) {
416
482
  setWorkItems([]);
417
483
  setWorkflows([]);
418
484
  return;
419
485
  }
420
486
  setIsWFDataLoading(true);
421
487
  try {
422
- // 1. item da processare in modo sincrono
423
- const itemsToProcess = [];
424
- for (const workflow of workflowApproveData) {
425
- for (const dataRow of workflow.dtdResult?.rows ?? []) {
426
- const did = Number(dataRow?.[1]);
427
- if (did === Number(DID)) {
428
- const tid = Number(dataRow?.[0]);
429
- itemsToProcess.push({ tid, did });
430
- }
431
- }
432
- }
488
+ // FASE 2: Raccolta work items: array di tutti i possibili work items che matchano il DID corrente
489
+ const itemsToProcess = getWorkItemsByDID(Number(DID));
490
+ // Se non ci sono work items per questo DID, resetta e esci
433
491
  if (itemsToProcess.length === 0) {
434
492
  setWorkItems([]);
435
493
  setWorkflows([]);
436
494
  setIsWFDataLoading(false);
437
495
  return;
438
496
  }
439
- // promises per i setID in modo condizionale
440
- let setIDPromises;
441
- if (workItemSetIDValue !== undefined) {
442
- // Se abbiamo il setID dal form, non facciamo chiamate di rete.
443
- setIDPromises = itemsToProcess.map(() => Promise.resolve(workItemSetIDValue));
497
+ // FASE 3: Ricerca work item specifico
498
+ // Cerca prima un match esatto con TID e DID correnti
499
+ const foundItem = itemsToProcess.find(item => item.tid === Number(TID) && item.did === Number(DID));
500
+ if (foundItem) {
501
+ // SCENARIO A: Match esatto trovato (TID e DID corrispondono)
502
+ // Il documento corrente è esattamente il work item nel workflow
503
+ let setID = undefined;
504
+ // Prova a usare il setID già presente nei metadati (più veloce)
505
+ if (workItemSetIDValue !== undefined) {
506
+ setID = workItemSetIDValue;
507
+ }
508
+ else {
509
+ // Altrimenti caricalo dal server
510
+ setID = await getWorkItemSetIDAsync(foundItem.tid, foundItem.did);
511
+ }
512
+ // Imposta un singolo work item con il setID caricato
513
+ setWorkItems([{
514
+ wid: `${foundItem.tid}_${foundItem.did}`,
515
+ tid: foundItem.tid,
516
+ did: foundItem.did,
517
+ setID: setID,
518
+ details: []
519
+ }]);
520
+ // Carica le informazioni complete del workflow
521
+ await loadWorkflowInfo(foundItem.tid);
444
522
  }
445
523
  else {
446
- // Altrimenti, procediamo con le chiamate di rete come prima.
447
- setIDPromises = itemsToProcess.map(item => getWorkItemSetIDAsync(item.tid, item.did));
524
+ // SCENARIO B: Nessun match esatto, cerca solo per DID
525
+ const itemsByDID = itemsToProcess.filter(item => item.did === Number(DID));
526
+ if (itemsByDID.length === 1) {
527
+ // SCENARIO B.1: Un solo item trovato per DID
528
+ // Situazione sicura: sappiamo esattamente quale work item usare
529
+ const singleItem = itemsByDID[0];
530
+ let setID;
531
+ // Carica il setID (da cache o da server)
532
+ if (workItemSetIDValue !== undefined) {
533
+ setID = workItemSetIDValue;
534
+ }
535
+ else {
536
+ setID = await getWorkItemSetIDAsync(singleItem.tid, singleItem.did);
537
+ }
538
+ setWorkItems([{
539
+ wid: `${singleItem.tid}_${singleItem.did}`,
540
+ tid: singleItem.tid,
541
+ did: singleItem.did,
542
+ setID: setID,
543
+ details: []
544
+ }]);
545
+ // Carica le informazioni del workflow
546
+ await loadWorkflowInfo(singleItem.tid);
547
+ }
548
+ else if (itemsByDID.length > 1) {
549
+ // SCENARIO B.2: Più item trovati per lo stesso DID
550
+ // Ambiguità: lo stesso documento appare in più workflow diversi
551
+ const finalWorkItems = itemsByDID.map((item, index) => ({
552
+ wid: `${item.tid}_${item.did}_${index}`,
553
+ tid: item.tid,
554
+ did: item.did,
555
+ setID: undefined,
556
+ details: []
557
+ }));
558
+ setWorkItems(finalWorkItems);
559
+ setWorkflows([]); // Non carichiamo il workflow in caso di ambiguità
560
+ }
448
561
  }
449
- // Crea un array di Promise per tutte le chiamate a GetWFInfoAsync
450
- const workflowInfoPromises = itemsToProcess.map(item => WorkflowCacheService.GetWFInfoAsync(item.tid));
451
- // Esegui tutte le chiamate in parallelo e attendi i risultati
452
- const setIDResults = await Promise.all(setIDPromises);
453
- const workflowInfoResults = await Promise.all(workflowInfoPromises);
454
- // Combina i risultati
455
- const finalWorkItems = itemsToProcess.map((item, index) => ({
456
- ...item,
457
- setID: setIDResults[index],
458
- }));
459
- const validWorkflows = workflowInfoResults.filter(Boolean);
460
- // Aggiorna lo stato una sola volta con i dati finali
461
- setWorkItems(finalWorkItems);
462
- setWorkflows(validWorkflows);
463
562
  }
464
563
  catch (error) {
564
+ // FASE 4: Gestione errori
465
565
  TMExceptionBoxManager.show({ exception: error });
466
566
  setWorkItems([]);
467
567
  setWorkflows([]);
468
568
  }
469
569
  finally {
570
+ // Garantisce sempre il reset del flag di loading
470
571
  setIsWFDataLoading(false);
471
572
  }
472
573
  };
473
- // Usa hasFormData invece di formDataRef.current
474
574
  if (!hasFormData || !fromDTD?.id) {
475
- // console.log("formData is empty or fromDTD not loaded, skipping loadAllWfData");
476
575
  return;
477
576
  }
478
577
  if (workItemSetIDValue !== undefined || workflowApproveData.length > 0)
479
578
  loadAllWfData();
480
- }, [hasFormData, workItemSetIDValue, workflowApproveData, DID, layoutMode, fromDTD?.templateTID, fromDTD?.id]);
579
+ }, [hasFormData, workItemSetIDValue, workflowApproveData, getWorkItemsByDID, TID, DID, layoutMode, fromDTD?.templateTID, fromDTD?.id]);
580
+ // useEffect per costruire workItemsForDiagram quando l'utente è autorizzato a vedere il diagramma
581
+ useEffect(() => {
582
+ const buildWorkItemsForDiagram = async () => {
583
+ // Verifica se l'utente è autorizzato (ha accesso al diagramma)
584
+ const isAuthorized = !!workflows?.[0]?.diagram;
585
+ if (!isAuthorized || workItems.length === 0) {
586
+ setWorkItemsForDiagram([]);
587
+ return;
588
+ }
589
+ try {
590
+ // Estrai i dati necessari dal primo workItem
591
+ const firstWorkItem = workItems[0];
592
+ // Costruisci WFInstanceDescriptor dai dati disponibili
593
+ const wfInstance = {
594
+ wfid: workflows[0].id,
595
+ tid: TID,
596
+ did: DID,
597
+ instanceId: "", // Puoi adattare questo se hai un instanceId specifico,
598
+ rowIndex: 0,
599
+ values: []
600
+ };
601
+ // Chiama buildWorkItemsFromWFCtrl per ottenere i workItems completi
602
+ const detailedWorkItems = await buildWorkItemsFromWFCtrl(wfInstance);
603
+ setWorkItemsForDiagram(detailedWorkItems);
604
+ }
605
+ catch (error) {
606
+ console.error('Errore durante la costruzione dei work items per il diagramma:', error);
607
+ setWorkItemsForDiagram([]);
608
+ }
609
+ };
610
+ buildWorkItemsForDiagram();
611
+ }, [workflows, workItems]);
481
612
  const getSelectionDcmtInfo = useCallback(() => {
482
613
  let dcmts = [];
483
614
  dcmts.push({ TID: TID ?? 0, DID: DID ?? 0 });
@@ -503,12 +634,17 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
503
634
  const isSysMetadataDisabled = useMemo(() => layoutMode !== LayoutModes.Update, [layoutMode]);
504
635
  const isDetailsDisabled = useMemo(() => layoutMode !== LayoutModes.Update || !DID, [layoutMode, DID]);
505
636
  const isMasterDisabled = useMemo(() => layoutMode !== LayoutModes.Update || !DID, [layoutMode, DID]);
506
- const isWFDisabled = useMemo(() => layoutMode !== LayoutModes.Update || fetchError || workItems.length <= 0, [layoutMode, fetchError, workItems.length]);
637
+ const isWFDisabled = useMemo(() => layoutMode !== LayoutModes.Update || fetchError || (workItems.length <= 0 && workItemsForDiagram.length <= 0), [layoutMode, fetchError, workItems.length, workItemsForDiagram.length]);
507
638
  const showToppyForApprove = useMemo(() => layoutMode === LayoutModes.Update && !fetchError && workItems.length > 0 && !isOpenDetails && !isOpenMaster, [layoutMode, fetchError, workItems.length, isOpenDetails, isOpenMaster]);
508
639
  const showToppyForCompleteMoreInfo = useMemo(() => layoutMode === LayoutModes.Update && !!isTaskMoreInfo(taskMoreInfo?.name) && taskMoreInfo?.state !== Task_States.Completed, [layoutMode, taskMoreInfo?.name, taskMoreInfo?.state]);
509
640
  const showToppyForReferences = useMemo(() => allowButtonsRefs && layoutMode === LayoutModes.Update && !!(dcmtReferences && dcmtReferences.length > 0) && !isOpenDetails && !isOpenMaster, [allowButtonsRefs, layoutMode, dcmtReferences, isOpenDetails, isOpenMaster]);
641
+ const isToppyVisible = useMemo(() => Boolean((showToppyForApprove || showToppyForCompleteMoreInfo || showToppyForReferences) && !openS4TViewer), [showToppyForApprove, showToppyForCompleteMoreInfo, showToppyForReferences, openS4TViewer]);
510
642
  const isMobile = useMemo(() => deviceType === DeviceType.MOBILE, [deviceType]);
511
- const isApprView = useMemo(() => fromDTD?.templateTID === TemplateTIDs.WF_WIApprView, [fromDTD?.templateTID]);
643
+ const isApprView = useMemo(() => {
644
+ if (!fromDTD)
645
+ return false;
646
+ return isApprovalWorkflowView(fromDTD);
647
+ }, [fromDTD?.id]);
512
648
  const workitemSetID = useMemo(() => workItems.find(o => o.did === Number(DID))?.setID || formData.find(o => o.md?.name === WorkItemMetadataNames.WI_SetID)?.value, [workItems, DID, formData]);
513
649
  const approvalVID = useMemo(() => workItems.length > 0 ? Number(workItems[0].tid) : -1, [workItems]);
514
650
  //here
@@ -516,23 +652,20 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
516
652
  const items = [];
517
653
  const operationsItems = [];
518
654
  operationsItems.push({
519
- icon: svgToString(_jsx(IconDownload, {})),
520
- operationType: 'singleRow',
655
+ icon: _jsx(IconDownload, {}),
521
656
  disabled: fromDTD?.perm?.canRetrieveFile !== AccessLevels.Yes,
522
- text: SDKUI_Localizator.DownloadFile,
657
+ name: SDKUI_Localizator.DownloadFile,
523
658
  onClick: async () => await downloadDcmtsAsync(getDcmts(), DownloadTypes.Dcmt, "download", undefined, undefined, true)
524
659
  }, {
525
- icon: svgToString(_jsx(IconDownload, {})),
526
- operationType: 'singleRow',
660
+ icon: _jsx(IconDownload, {}),
527
661
  disabled: !isXMLFileExt(currentDcmt?.fileExt),
528
- text: SDKUI_Localizator.DownloadXMLAttachments,
662
+ name: SDKUI_Localizator.DownloadXMLAttachments,
529
663
  onClick: async () => await downloadDcmtsAsync(getDcmts(), DownloadTypes.Attachment, "download", undefined, openConfirmAttachmentsDialog, true)
530
664
  });
531
665
  if (layoutMode === LayoutModes.Update && DID) {
532
666
  operationsItems.push({
533
- icon: svgToString(_jsx(IconStar, {})),
534
- text: SDKUI_Localizator.AddTo + ' ' + SDKUI_Localizator.Favorites,
535
- operationType: 'singleRow',
667
+ icon: _jsx(IconStar, {}),
668
+ name: SDKUI_Localizator.AddTo + ' ' + SDKUI_Localizator.Favorites,
536
669
  disabled: false,
537
670
  onClick: async () => {
538
671
  await runOperationAsync(getDcmts(), DcmtOperationTypes.AddToFavs);
@@ -541,17 +674,17 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
541
674
  }
542
675
  if (onTaskCreateRequest && layoutMode === LayoutModes.Update && DID) {
543
676
  operationsItems.push({
544
- icon: svgToString(_jsx(IconActivity, {})),
545
- text: SDKUI_Localizator.CreateContextualTask,
546
- operationType: 'singleRow',
677
+ icon: _jsx(IconActivity, {}),
678
+ name: SDKUI_Localizator.CreateContextualTask,
547
679
  disabled: false,
548
680
  onClick: () => {
549
681
  const dcmt = getDcmts()[0];
682
+ const name = `${fromDTD?.name ?? '-'} (DID: ${dcmt.DID})`;
550
683
  const taskContext = {
551
684
  document: {
552
685
  tid: dcmt.TID,
553
686
  did: dcmt.DID,
554
- name: fromDTD?.description || ''
687
+ name: name
555
688
  }
556
689
  };
557
690
  onTaskCreateRequest(taskContext);
@@ -560,76 +693,106 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
560
693
  }
561
694
  if (operationsItems.length > 0) {
562
695
  items.push({
563
- icon: svgToString(_jsx(IconCheck, {})),
564
- text: SDKUI_Localizator.DocumentOperations,
565
- items: operationsItems
696
+ icon: _jsx(IconCheck, {}),
697
+ name: SDKUI_Localizator.DocumentOperations,
698
+ submenu: operationsItems
699
+ });
700
+ }
701
+ if (fromDTD?.id !== SystemTIDs.Drafts) {
702
+ // Check in/Check out menu
703
+ const { cicoEnabled, checkoutStatus } = getDcmtCicoStatus(formData, allUsers, fromDTD);
704
+ items.push({
705
+ icon: _jsx(IconFileDots, {}),
706
+ name: "Check in/Check out",
707
+ disabled: false,
708
+ submenu: [
709
+ {
710
+ name: 'Check out',
711
+ disabled: !cicoEnabled || checkoutStatus.isCheckedOut,
712
+ onClick: () => handleCheckOutOperationCallback(true),
713
+ },
714
+ {
715
+ name: 'Check in',
716
+ onClick: () => handleCheckInOperationCallback(),
717
+ disabled: !cicoEnabled || !checkoutStatus.isCheckedOut || checkoutStatus.mode === 'lockMode'
718
+ },
719
+ {
720
+ name: SDKUI_Localizator.CancelCheckOut,
721
+ disabled: !cicoEnabled || !checkoutStatus.isCheckedOut || checkoutStatus.mode === 'lockMode',
722
+ onClick: () => handleCheckOutOperationCallback(false),
723
+ },
724
+ {
725
+ name: SDKUI_Localizator.CheckoutInfo,
726
+ onClick: showCheckoutInformationFormCallback,
727
+ disabled: !checkoutStatus.isCheckedOut
728
+ },
729
+ {
730
+ name: SDKUI_Localizator.CopyCheckoutPath,
731
+ onClick: copyCheckoutPathToClipboardOperationCallback,
732
+ disabled: !checkoutStatus.isCheckedOut
733
+ },
734
+ {
735
+ name: SDKUI_Localizator.History,
736
+ disabled: !cicoEnabled,
737
+ onClick: showHistoryCallback,
738
+ },
739
+ ]
566
740
  });
567
741
  }
568
742
  if (allowRelations && layoutMode === LayoutModes.Update && DID) {
569
743
  const relationsItems = [
570
744
  {
571
- icon: svgToString(_jsx(IconPair, {})),
572
- text: SDKUI_Localizator.MatchManyDocumentsManyToMany,
573
- operationType: 'singleRow',
745
+ icon: _jsx(IconPair, {}),
746
+ name: SDKUI_Localizator.MatchManyDocumentsManyToMany,
574
747
  disabled: !hasManyToManyRelation,
575
748
  onClick: async () => await pairManyToMany?.(true)
576
749
  },
577
750
  {
578
- icon: svgToString(_jsx(IconUnpair, {})),
579
- text: SDKUI_Localizator.UnmatchManyDocumentsManyToMany,
580
- operationType: 'singleRow',
751
+ icon: _jsx(IconUnpair, {}),
752
+ name: SDKUI_Localizator.UnmatchManyDocumentsManyToMany,
581
753
  disabled: !hasManyToManyRelation,
582
754
  onClick: async () => await pairManyToMany?.(false)
583
755
  },
584
756
  {
585
- icon: svgToString(_jsx(IconArchiveMaster, {})),
586
- text: SDKUI_Localizator.ArchiveMasterDocument,
587
- operationType: 'singleRow',
588
- beginGroup: true,
757
+ icon: _jsx(IconArchiveMaster, {}),
758
+ name: SDKUI_Localizator.ArchiveMasterDocument,
589
759
  disabled: canArchiveMasterRelation !== true,
590
760
  onClick: async () => { if (TID)
591
761
  await archiveMasterDocuments?.(TID); }
592
762
  },
593
763
  {
594
- icon: svgToString(_jsx(IconArchiveDetail, {})),
595
- text: SDKUI_Localizator.ArchiveDetailDocument,
596
- operationType: 'singleRow',
764
+ icon: _jsx(IconArchiveDetail, {}),
765
+ name: SDKUI_Localizator.ArchiveDetailDocument,
597
766
  disabled: canArchiveDetailRelation !== true,
598
767
  onClick: async () => { if (TID)
599
768
  await archiveDetailDocuments?.(TID); }
600
769
  },
601
770
  {
602
- icon: svgToString(_jsx(IconDetailDcmts, { transform: 'scale(-1, 1)' })),
603
- text: SDKUI_Localizator.DcmtsMaster,
604
- operationType: 'singleRow',
605
- visible: true,
606
- beginGroup: true,
771
+ icon: _jsx(IconDetailDcmts, { transform: 'scale(-1, 1)' }),
772
+ name: SDKUI_Localizator.DcmtsMaster,
607
773
  disabled: !currentTIDHasMasterRelations || isMasterDisabled,
608
774
  onClick: () => { if (!isMasterDisabled)
609
775
  setIsOpenMaster(!isOpenMaster); }
610
776
  },
611
777
  {
612
- icon: svgToString(_jsx(IconDetailDcmts, {})),
613
- text: SDKUI_Localizator.DcmtsDetail,
614
- operationType: 'singleRow',
778
+ icon: _jsx(IconDetailDcmts, {}),
779
+ name: SDKUI_Localizator.DcmtsDetail,
615
780
  disabled: !currentTIDHasDetailRelations || isDetailsDisabled,
616
- visible: true,
617
781
  onClick: () => { if (!isDetailsDisabled)
618
782
  setIsOpenDetails(!isOpenDetails); }
619
783
  }
620
784
  ];
621
785
  items.push({
622
- icon: svgToString(_jsx(IconRelation, {})),
623
- text: SDKUI_Localizator.Relations,
624
- items: relationsItems
786
+ icon: _jsx(IconRelation, {}),
787
+ name: SDKUI_Localizator.Relations,
788
+ submenu: relationsItems
625
789
  });
626
790
  }
627
791
  if (layoutMode === LayoutModes.Update && DID) {
628
792
  const fullTextItems = [
629
793
  {
630
- icon: svgToString(_jsx(IconInfo, {})),
631
- text: SDKUI_Localizator.IndexingInformation,
632
- operationType: 'singleRow',
794
+ icon: _jsx(IconInfo, {}),
795
+ name: SDKUI_Localizator.IndexingInformation,
633
796
  disabled: false,
634
797
  onClick: async () => {
635
798
  try {
@@ -647,18 +810,16 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
647
810
  }
648
811
  },
649
812
  {
650
- icon: svgToString(_jsx(IconArchiveDoc, {})),
651
- text: SDKUI_Localizator.IndexOrReindex,
652
- operationType: 'singleRow',
813
+ icon: _jsx(IconArchiveDoc, {}),
814
+ name: SDKUI_Localizator.IndexOrReindex,
653
815
  disabled: false,
654
816
  onClick: async () => {
655
817
  await runOperationAsync(getDcmts(), DcmtOperationTypes.FreeSearchReindex);
656
818
  }
657
819
  },
658
820
  {
659
- icon: svgToString(_jsx(IconDelete, {})),
660
- text: SDKUI_Localizator.IndexingDelete,
661
- operationType: 'singleRow',
821
+ icon: _jsx(IconDelete, {}),
822
+ name: SDKUI_Localizator.IndexingDelete,
662
823
  disabled: false,
663
824
  onClick: async () => {
664
825
  await runOperationAsync(getDcmts(), DcmtOperationTypes.FreeSearchPurge);
@@ -666,9 +827,9 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
666
827
  }
667
828
  ];
668
829
  items.push({
669
- icon: svgToString(_jsx(IconSearch, {})),
670
- text: SDKUI_Localizator.FullTextSearch,
671
- items: fullTextItems
830
+ icon: _jsx(IconSearch, {}),
831
+ name: SDKUI_Localizator.FullTextSearch,
832
+ submenu: fullTextItems
672
833
  });
673
834
  }
674
835
  // Aggiungi submenu "Bottoni personalizzati" se esistono customButtons
@@ -676,18 +837,19 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
676
837
  const customButtonsItems = customButtonsLayout.customButtons
677
838
  .filter((customButton) => customButton.isForUpdate && customButton.isForUpdate > 0)
678
839
  .map((customButton) => ({
679
- icon: svgToString(TMImageLibrary({ imageID: customButton.glyphID, showPath: true })),
680
- text: customButton.title || 'Bottone personalizzato',
840
+ icon: TMImageLibrary({ imageID: customButton.glyphID }),
841
+ name: customButton.title || 'Bottone personalizzato',
681
842
  onClick: () => setCustomButton(customButton)
682
843
  }));
683
- items.push({
684
- icon: svgToString(_jsx(IconCheck, {})),
685
- text: SDKUI_Localizator.CustomButtons,
686
- items: customButtonsItems
844
+ customButtonsItems && customButtonsItems.length > 0 && items.push({
845
+ icon: _jsx(IconCustom, {}),
846
+ name: SDKUI_Localizator.CustomButtons,
847
+ submenu: customButtonsItems
687
848
  });
688
849
  }
689
850
  return items;
690
851
  }, [
852
+ fromDTD?.id,
691
853
  fromDTD?.perm?.canRetrieveFile,
692
854
  fromDTD?.description,
693
855
  currentDcmt?.fileExt,
@@ -713,8 +875,9 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
713
875
  openConfirmAttachmentsDialog
714
876
  ]);
715
877
  const isModified = useMemo(() => calcIsModified(formData, formDataOrig), [formData, formDataOrig]);
716
- const formToolbar = useMemo(() => _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '10px' }, children: [allowNavigation && canPrev != undefined && _jsx("p", { style: { textAlign: 'center', padding: '1px 4px', display: 'flex' }, children: `${itemIndex}/${count}` }), allowNavigation && canPrev != undefined && _jsx(TMSaveFormButtonPrevious, { btnStyle: 'icon', iconColor: 'white', isModified: isModified, formMode: formMode, canPrev: canPrev, onPrev: onPrev }), allowNavigation && canNext != undefined && _jsx(TMSaveFormButtonNext, { btnStyle: 'icon', iconColor: 'white', isModified: isModified, formMode: formMode, canNext: canNext, onNext: onNext }), layoutMode === LayoutModes.Update && _jsx(IconMenuVertical, { id: `commands-detail-${id}`, color: 'white', cursor: 'pointer' }), layoutMode === LayoutModes.Update && _jsx(ContextMenu, { showEvent: 'click', dataSource: commandsMenuItems, target: `#commands-detail-${id}` }), layoutMode === LayoutModes.Ark &&
717
- _jsx(TMTooltip, { content: SDKUI_Localizator.PassToSearch, position: 'bottom', children: _jsx(IconSearch, { style: { cursor: 'pointer' }, onClick: handlePassToSearch }) })] }), [allowNavigation, canPrev, canNext, itemIndex, count, isModified, formMode, onPrev, onNext, layoutMode, id, commandsMenuItems, handlePassToSearch]);
878
+ const formToolbar = useMemo(() => _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '10px' }, children: [allowNavigation && canPrev != undefined && _jsx("p", { style: { textAlign: 'center', padding: '1px 4px', display: 'flex' }, children: `${itemIndex}/${count}` }), allowNavigation && canPrev != undefined && _jsx(TMSaveFormButtonPrevious, { btnStyle: 'icon', iconColor: 'white', isModified: isModified, formMode: formMode, canPrev: canPrev, onPrev: onPrev }), allowNavigation && canNext != undefined && _jsx(TMSaveFormButtonNext, { btnStyle: 'icon', iconColor: 'white', isModified: isModified, formMode: formMode, canNext: canNext, onNext: onNext }), layoutMode === LayoutModes.Update &&
879
+ _jsx(ContextMenu, { items: commandsMenuItems, trigger: "left", children: _jsx(IconMenuVertical, { color: 'white', cursor: 'pointer' }) }), layoutMode === LayoutModes.Ark &&
880
+ _jsx(TMTooltip, { content: SDKUI_Localizator.PassToSearch, position: 'bottom', children: _jsx(IconSearch, { style: { cursor: 'pointer' }, onClick: handlePassToSearch }) })] }), [allowNavigation, canPrev, canNext, itemIndex, count, isModified, formMode, onPrev, onNext, layoutMode, commandsMenuItems, handlePassToSearch]);
718
881
  const handleUndo = useCallback(() => {
719
882
  setFormData(structuredClone(formDataOrig));
720
883
  }, [formDataOrig]);
@@ -730,6 +893,60 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
730
893
  },
731
894
  });
732
895
  }, [isModal, id, layoutMode]);
896
+ // Funzione helper per ottenere e aggiornare i metadati con gestione errori centralizzata
897
+ const refreshMetadataAsync = useCallback(async () => {
898
+ let metadataResult = undefined;
899
+ let hasGetMetadataError = false;
900
+ try {
901
+ metadataResult = await SDK_Globals.tmSession?.NewSearchEngine().GetMetadataAsync(TID, DID, true);
902
+ }
903
+ catch (metadataError) {
904
+ hasGetMetadataError = true;
905
+ // Estrai ErrorCode dal campo detail se disponibile
906
+ let errorCode = undefined;
907
+ if (metadataError?.isApiException && metadataError?.response?.detail) {
908
+ try {
909
+ const detailObj = JSON.parse(metadataError.response.detail);
910
+ errorCode = detailObj?.ErrorCode;
911
+ }
912
+ catch (parseError) {
913
+ console.log("Impossibile parsare il detail dell'eccezione:", parseError);
914
+ }
915
+ }
916
+ // Se ErrorCode è -5, mostra messaggio personalizzato, altrimenti mostra l'eccezione originale
917
+ if (errorCode === -5) {
918
+ TMMessageBoxManager.show({
919
+ message: SDKUI_Localizator.DcmtOutOfView,
920
+ buttons: [ButtonNames.OK],
921
+ });
922
+ }
923
+ else {
924
+ TMExceptionBoxManager.show({ exception: metadataError });
925
+ }
926
+ // Usa null per indicare al callback che c'è stato un errore e non deve ritentare
927
+ metadataResult = null;
928
+ }
929
+ // Aggiorna i metadati locali solo se non ci sono stati errori
930
+ if (!hasGetMetadataError && metadataResult && metadataResult !== null) {
931
+ await setMetadataList(fromDTDRef.current?.metadata ?? [], metadataResult);
932
+ }
933
+ return { success: !hasGetMetadataError, result: metadataResult };
934
+ }, [TID, DID, setMetadataList]);
935
+ const updateCurrentDcmt = useCallback(async () => {
936
+ try {
937
+ TMSpinner.show({ description: 'Aggiornamento in corso...' });
938
+ const { success, result: metadataResult } = await refreshMetadataAsync();
939
+ if (!success)
940
+ onClose?.();
941
+ await onSavedAsyncCallback?.(TID, DID, metadataResult === null ? null : metadataResult);
942
+ }
943
+ catch (e) {
944
+ TMExceptionBoxManager.show({ exception: e });
945
+ }
946
+ finally {
947
+ TMSpinner.hide();
948
+ }
949
+ }, [refreshMetadataAsync, onClose]);
733
950
  const handleSave = useCallback(async () => {
734
951
  const ue = new UpdateEngineByID(SDK_Globals.tmSession);
735
952
  ue.DID = DID;
@@ -766,55 +983,20 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
766
983
  const savedFormData = structuredClone(formDataRef.current);
767
984
  setFormDataOrig(savedFormData);
768
985
  formDataOrigRef.current = savedFormData;
769
- // Tenta di ottenere i metadati aggiornati
770
- let metadataResult = undefined;
771
- let hasGetMetadataError = false;
772
- try {
773
- metadataResult = await SDK_Globals.tmSession?.NewSearchEngine().GetMetadataAsync(TID, DID, true);
774
- }
775
- catch (metadataError) {
776
- hasGetMetadataError = true;
777
- // Estrai ErrorCode dal campo detail se disponibile
778
- let errorCode = undefined;
779
- if (metadataError?.isApiException && metadataError?.response?.detail) {
780
- try {
781
- const detailObj = JSON.parse(metadataError.response.detail);
782
- errorCode = detailObj?.ErrorCode;
783
- }
784
- catch (parseError) {
785
- console.log("Impossibile parsare il detail dell'eccezione:", parseError);
786
- }
787
- }
788
- // Se ErrorCode è -5, mostra messaggio personalizzato, altrimenti mostra l'eccezione originale
789
- if (errorCode === -5) {
790
- TMMessageBoxManager.show({
791
- message: SDKUI_Localizator.DcmtOutOfView,
792
- buttons: [ButtonNames.OK],
793
- });
794
- }
795
- else {
796
- TMExceptionBoxManager.show({ exception: metadataError });
797
- }
798
- // Usa null per indicare al callback che c'è stato un errore e non deve ritentare
799
- metadataResult = null;
800
- }
986
+ // Usa la funzione helper per ottenere i metadati aggiornati
987
+ const { success, result: metadataResult } = await refreshMetadataAsync();
801
988
  // Esegui sempre il callback:
802
989
  // - Se metadataResult è un oggetto: refresh normale
803
990
  // - Se metadataResult è null: GetMetadataAsync fallito, rimuove il documento dalla griglia senza ritentare
804
991
  // - Se metadataResult è undefined: nessun parametro passato, il callback può decidere cosa fare
805
992
  await onSavedAsyncCallback?.(TID, DID, metadataResult === null ? null : metadataResult);
806
993
  // Mostra messaggio di successo solo se non ci sono stati errori critici
807
- if (!hasGetMetadataError) {
808
- if (metadataResult && metadataResult !== null) {
809
- // Usa fromDTDRef.current invece di fromDTD per evitare stale closure.
810
- // fromDTD potrebbe essere undefined/vuoto nel callback se lo stato è cambiato,
811
- // mentre fromDTDRef.current contiene sempre il valore corrente sincronizzato tramite useEffect.
812
- await setMetadataList(fromDTDRef.current?.metadata ?? [], metadataResult);
813
- }
994
+ if (success) {
814
995
  ShowAlert({ mode: 'success', title: 'Form di documento', message: 'Le modifiche sono state salvate con successo', duration: 3000 });
815
996
  }
816
- else
997
+ else {
817
998
  onClose?.();
999
+ }
818
1000
  }
819
1001
  catch (e) {
820
1002
  TMExceptionBoxManager.show({ exception: e });
@@ -822,7 +1004,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
822
1004
  finally {
823
1005
  TMSpinner.hide();
824
1006
  }
825
- }, [DID, TID, getSpecificChangedKeysWithValues, onSavedAsyncCallback, onClose, setMetadataList]);
1007
+ }, [DID, TID, getSpecificChangedKeysWithValues, refreshMetadataAsync, onSavedAsyncCallback, onClose]);
826
1008
  const handleArchiveCompleted = useCallback(async () => {
827
1009
  let firstBlock = true;
828
1010
  let maxFileSize = 0;
@@ -1011,28 +1193,34 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1011
1193
  await triggerBlogRefresh();
1012
1194
  }
1013
1195
  }, [TID, DID, triggerBlogRefresh]);
1196
+ const checkoutBadge = useMemo(() => {
1197
+ const { cicoEnabled, checkoutStatus } = getDcmtCicoStatus(formData, allUsers, fromDTD);
1198
+ if (!cicoEnabled || !checkoutStatus.isCheckedOut)
1199
+ return null;
1200
+ return (_jsx(Ribbon, { "$isMobile": isMobile, children: _jsx(TMTooltip, { content: checkoutStatus.editLockTooltipText, position: "right", children: _jsx("span", { children: checkoutStatus.mode === 'editMode' ? SDKUI_Localizator.CheckOut : 'Locked' }) }) }));
1201
+ }, [formData, fromDTD, isMobile]);
1014
1202
  const tmDcmtForm = useMemo(() => {
1015
- return _jsx(_Fragment, { children: metadataValuesSource.length > 0 &&
1016
- _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, onFocusedItemChanged: (item) => { (item?.mid !== focusedMetadataValue?.mid) && setFocusedMetadataValue(item); }, onValueChanged: (newItems) => {
1017
- setFormData((prevItems) => prevItems.map((item) => {
1018
- const newItem = newItems.find((newItem) => newItem.tid === item.tid && newItem.mid === item.mid);
1019
- return newItem ? { ...item, ...newItem } : item;
1020
- }));
1021
- }, onAdvancedMenuClick: (e) => {
1022
- switch (e.button) {
1023
- case AdvancedMenuButtons.DistinctValues:
1024
- setIsOpenDistinctValues(!isOpenDistinctValues);
1025
- break;
1026
- case AdvancedMenuButtons.FormulaEditor:
1027
- setIsOpenFormulaEditor(!isOpenFormulaEditor);
1028
- break;
1029
- }
1030
- } }), _jsxs(StyledFormButtonsContainer, { children: [_jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: 10 }, children: _jsx("div", { style: { display: 'flex', justifyContent: 'center', alignItems: 'center', gap: '8px' }, children: layoutMode === LayoutModes.Update ? _jsxs(_Fragment, { children: [_jsx(TMSaveFormButtonSave, { showTooltip: false, btnStyle: 'advanced', advancedColor: '#f09c0a', isModified: isModified, formMode: formMode, errorsCount: validationItems.filter(o => o.ResultType == ResultTypes.ERROR).length, onSaveAsync: handleConfirmAction }), _jsx(TMSaveFormButtonUndo, { btnStyle: 'toolbar', showTooltip: true, color: 'primary', isModified: isModified, formMode: formMode, onUndo: handleUndo })] }) :
1031
- _jsxs(_Fragment, { children: [_jsx(TMButton, { disabled: archiveBtnDisabled, btnStyle: 'advanced', icon: _jsx(IconBoxArchiveIn, {}), width: 'auto', showTooltip: false, caption: SDKUI_Localizator.Archive, advancedColor: TMColors.success, onClick: handleConfirmAction }), _jsx(TMButton, { disabled: !clearFormBtnDisabled, btnStyle: 'advanced', icon: _jsx(IconClear, {}), width: 'auto', showTooltip: false, caption: SDKUI_Localizator.Clear, advancedColor: TMColors.tertiary, onClick: handleClearForm }), DID && _jsx(TMButton, { disabled: undoBtnDisabled, btnStyle: 'advanced', icon: _jsx(IconUndo, {}), width: '150px', showTooltip: false, caption: SDKUI_Localizator.Undo, advancedColor: TMColors.tertiary, onClick: handleUndo })] }) }) }), customButton && _jsx(TMCustomButton, { button: customButton, formData: formData, selectedItems: [], onClose: () => setCustomButton(undefined) }), totalItems > listMaxItems &&
1032
- !isApprView &&
1033
- TID !== SystemTIDs.Drafts &&
1034
- !shouldShowAll &&
1035
- _jsx(TMShowAllOrMaxItemsButton, { showAll: showAll, dataSourceLength: totalItems, onClick: () => { setShowAll(!showAll); } })] }), _jsx(ConfirmAttachmentsDialog, {})] }) });
1203
+ return _jsxs(_Fragment, { children: [checkoutBadge && _jsx("div", { style: { padding: '10px', display: 'flex', justifyContent: 'center' }, children: checkoutBadge }), metadataValuesSource.length > 0 &&
1204
+ _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, onFocusedItemChanged: (item) => { (item?.mid !== focusedMetadataValue?.mid) && setFocusedMetadataValue(item); }, onValueChanged: (newItems) => {
1205
+ setFormData((prevItems) => prevItems.map((item) => {
1206
+ const newItem = newItems.find((newItem) => newItem.tid === item.tid && newItem.mid === item.mid);
1207
+ return newItem ? { ...item, ...newItem } : item;
1208
+ }));
1209
+ }, onAdvancedMenuClick: (e) => {
1210
+ switch (e.button) {
1211
+ case AdvancedMenuButtons.DistinctValues:
1212
+ setIsOpenDistinctValues(!isOpenDistinctValues);
1213
+ break;
1214
+ case AdvancedMenuButtons.FormulaEditor:
1215
+ setIsOpenFormulaEditor(!isOpenFormulaEditor);
1216
+ break;
1217
+ }
1218
+ } }), _jsxs(StyledFormButtonsContainer, { children: [_jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: 10 }, children: _jsx("div", { style: { display: 'flex', justifyContent: 'center', alignItems: 'center', gap: '8px' }, children: layoutMode === LayoutModes.Update ? _jsxs(_Fragment, { children: [_jsx(TMSaveFormButtonSave, { showTooltip: false, btnStyle: 'advanced', advancedColor: '#f09c0a', isModified: isModified, formMode: formMode, errorsCount: validationItems.filter(o => o.ResultType == ResultTypes.ERROR).length, onSaveAsync: handleConfirmAction }), _jsx(TMSaveFormButtonUndo, { btnStyle: 'toolbar', showTooltip: true, color: 'primary', isModified: isModified, formMode: formMode, onUndo: handleUndo })] }) :
1219
+ _jsxs(_Fragment, { children: [_jsx(TMButton, { disabled: archiveBtnDisabled, btnStyle: 'advanced', icon: _jsx(IconBoxArchiveIn, {}), width: 'auto', showTooltip: false, caption: SDKUI_Localizator.Archive, advancedColor: TMColors.success, onClick: handleConfirmAction }), _jsx(TMButton, { disabled: !clearFormBtnDisabled, btnStyle: 'advanced', icon: _jsx(IconClear, {}), width: 'auto', showTooltip: false, caption: SDKUI_Localizator.Clear, advancedColor: TMColors.tertiary, onClick: handleClearForm }), DID && _jsx(TMButton, { disabled: undoBtnDisabled, btnStyle: 'advanced', icon: _jsx(IconUndo, {}), width: '150px', showTooltip: false, caption: SDKUI_Localizator.Undo, advancedColor: TMColors.tertiary, onClick: handleUndo })] }) }) }), customButton && _jsx(TMCustomButton, { button: customButton, formData: formData, selectedItems: [], onClose: () => setCustomButton(undefined) }), totalItems > listMaxItems &&
1220
+ !isApprView &&
1221
+ TID !== SystemTIDs.Drafts &&
1222
+ !shouldShowAll &&
1223
+ _jsx(TMShowAllOrMaxItemsButton, { showAll: showAll, dataSourceLength: totalItems, onClick: () => { setShowAll(!showAll); } })] }), _jsx(ConfirmAttachmentsDialog, {})] })] });
1036
1224
  }, [
1037
1225
  TID,
1038
1226
  DID,
@@ -1060,11 +1248,11 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1060
1248
  handleUndo,
1061
1249
  handleClearForm
1062
1250
  ]);
1063
- 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]);
1251
+ 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]);
1064
1252
  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]);
1065
1253
  const tmDcmtPreview = useMemo(() => _jsx(TMDcmtPreviewWrapper, { currentDcmt: currentDcmt, dcmtFile: dcmtFile ?? inputFile, deviceType: deviceType, fromDTD: fromDTD, layoutMode: layoutMode, onFileUpload: (file) => {
1066
1254
  setDcmtFile(file);
1067
- }, enableDragDropOverlay: enableDragDropOverlay }), [currentDcmt, dcmtFile, deviceType, fromDTD, layoutMode, inputFile, enableDragDropOverlay, setDcmtFile]);
1255
+ }, enableDragDropOverlay: enableDragDropOverlay }, refreshPreviewTrigger), [currentDcmt, dcmtFile, deviceType, fromDTD, layoutMode, inputFile, enableDragDropOverlay, setDcmtFile]);
1068
1256
  const tmWF = useMemo(() => {
1069
1257
  if (isWFDataLoading) {
1070
1258
  return (_jsx("div", { style: {
@@ -1079,7 +1267,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1079
1267
  const isAuthorized = !!workflows?.[0]?.diagram;
1080
1268
  return (_jsxs("div", { style: { position: 'relative', width: '100%', height: '100%', display: 'flex', flexDirection: 'column', gap: 3 }, children: [workItems.length > 0
1081
1269
  ? (isAuthorized
1082
- ? _jsx(WFDiagram, { xmlDiagramString: workflows?.[0]?.diagram || '', allowEdit: false, currentSetID: workitemSetID })
1270
+ ? _jsx(WFDiagram, { xmlDiagramString: workflows?.[0]?.diagram || '', allowEdit: false, currentSetID: workitemSetID, defaultAutoZoom: true, workitems: workItemsForDiagram })
1083
1271
  : _jsx("div", { style: {
1084
1272
  position: 'absolute',
1085
1273
  top: '50%',
@@ -1088,7 +1276,27 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1088
1276
  fontSize: '1.1rem',
1089
1277
  color: TMColors.primaryColor,
1090
1278
  textAlign: 'center',
1091
- }, children: SDKUI_Localizator.WorkflowDiagramNotAuthorized }))
1279
+ display: 'flex',
1280
+ flexDirection: 'column',
1281
+ alignItems: 'center',
1282
+ gap: '12px',
1283
+ }, children: _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '8px' }, children: [_jsx("span", { children: SDKUI_Localizator.WorkflowDiagramNotAuthorized }), wfError && (_jsx(TMTooltip, { content: 'Visualizza errore', children: _jsx("i", { className: "dx-icon-info", style: { fontSize: 20, cursor: 'pointer', color: '#dc3545' }, onClick: () => {
1284
+ TMMessageBoxManager.show({
1285
+ title: 'Dettagli Errore Workflow',
1286
+ initialWidth: !isMobile ? '700px' : undefined,
1287
+ message: (_jsx("pre", { style: {
1288
+ whiteSpace: 'pre-wrap',
1289
+ background: '#f5f5f5',
1290
+ padding: '12px',
1291
+ borderRadius: '6px',
1292
+ userSelect: 'text',
1293
+ cursor: 'text',
1294
+ }, children: wfError })),
1295
+ resizable: true,
1296
+ showToppy: false,
1297
+ buttons: [ButtonNames.OK],
1298
+ });
1299
+ } }) }))] }) }))
1092
1300
  : _jsx("div", { style: {
1093
1301
  position: 'absolute',
1094
1302
  top: '50%',
@@ -1103,7 +1311,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1103
1311
  backgroundColor: 'khaki',
1104
1312
  borderRadius: 8
1105
1313
  }, children: SDKUI_Localizator.WorkItemTechnicalNote_SetID })] }));
1106
- }, [workflows, formData, workitemSetID, workItems, isWFDataLoading]);
1314
+ }, [workflows, formData, workitemSetID, workItems, workItemsForDiagram, isWFDataLoading, wfError, isMobile]);
1107
1315
  const tmDcmtTasks = useMemo(() => {
1108
1316
  const isReady = TID && DID && getAllTasks && deleteTaskByIdsCallback && addTaskCallback && editTaskCallback;
1109
1317
  if (!isReady) {
@@ -1228,7 +1436,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1228
1436
  // Checks if there's a saved panel layout for the current context (ToDo or general)
1229
1437
  const hasSavedLayout = () => {
1230
1438
  const { setting } = getCurrentDcmtFormSetting();
1231
- if (invokedByTodo) {
1439
+ if (invocationContext === InvocationContext.Todo) {
1232
1440
  // If invoked by ToDo, check for existence of layoutToDo and that it has keys
1233
1441
  return setting.layoutToDo !== undefined && Object.keys(setting.layoutToDo).length > 0;
1234
1442
  }
@@ -1247,8 +1455,8 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1247
1455
  // Prepare the new setting object with updated layout depending on context
1248
1456
  const newSetting = {
1249
1457
  TID: normalizedTID,
1250
- layout: invokedByTodo ? (existingSetting.layout ?? {}) : state,
1251
- layoutToDo: invokedByTodo ? state : (existingSetting.layoutToDo ?? {}),
1458
+ layout: invocationContext === InvocationContext.Todo ? (existingSetting.layout ?? {}) : state,
1459
+ layoutToDo: invocationContext === InvocationContext.Todo ? state : (existingSetting.layoutToDo ?? {}),
1252
1460
  };
1253
1461
  // Replace existing setting if found, otherwise push a new one
1254
1462
  if (idx >= 0) {
@@ -1267,7 +1475,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1267
1475
  return undefined;
1268
1476
  const settings = getCurrentDcmtFormSetting()?.setting;
1269
1477
  // Return the appropriate layout based on context
1270
- return invokedByTodo ? settings?.layoutToDo : settings?.layout;
1478
+ return invocationContext === InvocationContext.Todo ? settings?.layoutToDo : settings?.layout;
1271
1479
  };
1272
1480
  const handleCompleteMoreInfo = useCallback(async () => {
1273
1481
  try {
@@ -1329,26 +1537,26 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1329
1537
  height: '100%',
1330
1538
  position: 'relative',
1331
1539
  overflow: 'hidden'
1332
- }, children: [_jsxs("div", { style: { width: '100%', height: '100%', display: isOpenDetails || isOpenMaster ? 'none' : 'flex' }, children: [isNavigating && _jsx(Spinner, { description: SDKUI_Localizator.Loading, flat: false }), (fromDTD) && _jsxs(TMLayoutWaitingContainer, { direction: 'vertical', showWaitPanel: useWaitPanelLocalState ? showWaitPanelLocal : showWaitPanel, showWaitPanelPrimary: useWaitPanelLocalState ? showPrimaryLocal : showPrimary, showWaitPanelSecondary: useWaitPanelLocalState ? showSecondaryLocal : showSecondary, waitPanelTitle: useWaitPanelLocalState ? waitPanelTitleLocal : waitPanelTitle, waitPanelTextPrimary: useWaitPanelLocalState ? waitPanelTextPrimaryLocal : waitPanelTextPrimary, waitPanelValuePrimary: useWaitPanelLocalState ? waitPanelValuePrimaryLocal : waitPanelValuePrimary, waitPanelMaxValuePrimary: useWaitPanelLocalState ? waitPanelMaxValuePrimaryLocal : waitPanelMaxValuePrimary, waitPanelTextSecondary: useWaitPanelLocalState ? waitPanelTextSecondaryLocal : waitPanelTextSecondary, waitPanelValueSecondary: useWaitPanelLocalState ? waitPanelValueSecondaryLocal : waitPanelValueSecondary, waitPanelMaxValueSecondary: useWaitPanelLocalState ? waitPanelMaxValueSecondaryLocal : waitPanelMaxValueSecondary, isCancelable: useWaitPanelLocalState ? dcmtFile ? dcmtFile.size >= 1000000 : false : true, abortController: useWaitPanelLocalState ? abortControllerLocal : abortController, children: [(groupId && groupId.length > 0)
1333
- ? _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", parentId: groupId, showToolbar: showDcmtFormSidebar })
1334
- : _jsxs(TMPanelManagerWithPersistenceProvider, { panels: initialPanels, initialVisibility: allInitialPanelVisibility, defaultDimensions: defaultPanelDimensions, initialDimensions: defaultPanelDimensions, initialMobilePanelId: 'tmDcmtForm', isPersistenceEnabled: !isMobile ? hasSavedLayout() : false, persistPanelStates: !isMobile ? (state) => persistPanelStates(state) : undefined, persistedPanelStates: getPersistedPanelStates(), children: [_jsx(WfButtonStateHandler, { isWFDisabled: isWFDisabled }), _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", parentId: groupId, showToolbar: showDcmtFormSidebar })] }), isOpenDistinctValues &&
1335
- _jsx(TMDistinctValues, { tid: TID, mid: focusedMetadataValue?.mid, isModal: true, showHeader: false, layoutMode: layoutMode, onSelectionChanged: (e) => {
1336
- if (!e)
1337
- return;
1338
- setFormData((prevItems) => prevItems.map((item) => item.tid == e.tid && item.mid === e.mid ? { ...item, value: e.newValue } : item));
1339
- } }), isOpenFormulaEditor &&
1340
- _jsx(TMFormulaEditor, { isModal: true, formMode: FormModes.Update, inputData: getFormula(), showBack: false, onClose: () => setIsOpenFormulaEditor(false), onApplied: (newFormula) => {
1341
- setFormData((prevItems) => prevItems.map((item) => item.tid == newFormula.tid && item.mid === newFormula.mid ? { ...item, value: FormulaHelper.addFormulaTag(newFormula.expression), isSelected: true, isEditable: true } : item));
1342
- setFocusedMetadataValue(prevState => ({
1343
- ...prevState,
1344
- isSelected: true,
1345
- isEditable: true,
1346
- value: FormulaHelper.addFormulaTag(newFormula.expression)
1347
- }));
1348
- } }), 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(ToppyDraggableHelpCenter, { initialIsCollapsed: false, deviceType: deviceType, isVisible: (showToppyForApprove || showToppyForCompleteMoreInfo || showToppyForReferences) && !openS4TViewer, content: _jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, children: [showToppyForApprove && (workItems.length === 1 ?
1540
+ }, children: [_jsxs("div", { style: { width: '100%', height: '100%', display: isOpenDetails || isOpenMaster ? 'none' : 'flex' }, children: [isNavigating && _jsx(Spinner, { description: SDKUI_Localizator.Loading, flat: false }), (fromDTD) && _jsx(TMLayoutWaitingContainer, { direction: 'vertical', showWaitPanel: useWaitPanelLocalState ? showWaitPanelLocal : showWaitPanel, showWaitPanelPrimary: useWaitPanelLocalState ? showPrimaryLocal : showPrimary, showWaitPanelSecondary: useWaitPanelLocalState ? showSecondaryLocal : showSecondary, waitPanelTitle: useWaitPanelLocalState ? waitPanelTitleLocal : waitPanelTitle, waitPanelTextPrimary: useWaitPanelLocalState ? waitPanelTextPrimaryLocal : waitPanelTextPrimary, waitPanelValuePrimary: useWaitPanelLocalState ? waitPanelValuePrimaryLocal : waitPanelValuePrimary, waitPanelMaxValuePrimary: useWaitPanelLocalState ? waitPanelMaxValuePrimaryLocal : waitPanelMaxValuePrimary, waitPanelTextSecondary: useWaitPanelLocalState ? waitPanelTextSecondaryLocal : waitPanelTextSecondary, waitPanelValueSecondary: useWaitPanelLocalState ? waitPanelValueSecondaryLocal : waitPanelValueSecondary, waitPanelMaxValueSecondary: useWaitPanelLocalState ? waitPanelMaxValueSecondaryLocal : waitPanelMaxValueSecondary, isCancelable: useWaitPanelLocalState ? dcmtFile ? dcmtFile.size >= 1000000 : false : true, abortController: useWaitPanelLocalState ? abortControllerLocal : abortController, children: _jsxs(TMLayoutWaitingContainer, { direction: 'vertical', showWaitPanel: showCicoWaitPanel, showWaitPanelPrimary: showCicoPrimaryProgress, waitPanelTitle: cicoWaitPanelTitle, waitPanelTextPrimary: cicoPrimaryProgressText, waitPanelValuePrimary: cicoPrimaryProgressValue, waitPanelMaxValuePrimary: cicoPrimaryProgressMax, isCancelable: true, abortController: abortControllerLocal, children: [(groupId && groupId.length > 0)
1541
+ ? _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", parentId: groupId, showToolbar: showDcmtFormSidebar })
1542
+ : _jsxs(TMPanelManagerWithPersistenceProvider, { panels: initialPanels, initialVisibility: allInitialPanelVisibility, defaultDimensions: defaultPanelDimensions, initialDimensions: defaultPanelDimensions, initialMobilePanelId: 'tmDcmtForm', isPersistenceEnabled: !isMobile ? hasSavedLayout() : false, persistPanelStates: !isMobile ? (state) => persistPanelStates(state) : undefined, persistedPanelStates: getPersistedPanelStates(), children: [_jsx(WfButtonStateHandler, { isWFDisabled: isWFDisabled }), _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", parentId: groupId, showToolbar: showDcmtFormSidebar })] }), isOpenDistinctValues &&
1543
+ _jsx(TMDistinctValues, { tid: TID, mid: focusedMetadataValue?.mid, isModal: true, showHeader: false, layoutMode: layoutMode, onSelectionChanged: (e) => {
1544
+ if (!e)
1545
+ return;
1546
+ setFormData((prevItems) => prevItems.map((item) => item.tid == e.tid && item.mid === e.mid ? { ...item, value: e.newValue } : item));
1547
+ } }), isOpenFormulaEditor &&
1548
+ _jsx(TMFormulaEditor, { isModal: true, formMode: FormModes.Update, inputData: getFormula(), showBack: false, onClose: () => setIsOpenFormulaEditor(false), onApplied: (newFormula) => {
1549
+ setFormData((prevItems) => prevItems.map((item) => item.tid == newFormula.tid && item.mid === newFormula.mid ? { ...item, value: FormulaHelper.addFormulaTag(newFormula.expression), isSelected: true, isEditable: true } : item));
1550
+ setFocusedMetadataValue(prevState => ({
1551
+ ...prevState,
1552
+ isSelected: true,
1553
+ isEditable: true,
1554
+ value: FormulaHelper.addFormulaTag(newFormula.expression)
1555
+ }));
1556
+ } }), 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 ?
1349
1557
  _jsx(WorkFlowOperationButtons, { deviceType: deviceType, onApprove: () => setShowApprovePopup(true), onSignApprove: handleSignApprove, onReject: () => setShowRejectPopup(true), onReAssign: () => setShowReAssignPopup(true), onMoreInfo: () => setShowMoreInfoPopup(true), dtd: fromDTD })
1350
1558
  :
1351
- _jsxs("div", { style: { padding: 10, color: 'white', maxWidth: '180px', borderRadius: 10, background: '#1B1464 0% 0% no-repeat padding-box', border: '1px solid #FFFFFF' }, children: [`Devi approvare ${workItems.length} workitem(s) per questo documento.`, `Vai alla sezione di approvazione.`] })), showToppyForCompleteMoreInfo && (_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} ${taskMoreInfo?.fromName}!` }), _jsx(TMButton, { caption: SDKUI_Localizator.CommentAndComplete, color: 'success', showTooltip: false, onClick: () => {
1559
+ _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 && (_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} ${taskMoreInfo?.fromName}!` }), _jsx(TMButton, { caption: SDKUI_Localizator.CommentAndComplete, color: 'success', showTooltip: false, onClick: () => {
1352
1560
  setShowCommentForm(true);
1353
1561
  } })] })), (showToppyForReferences && (dcmtReferences && dcmtReferences.length > 0)) && dcmtReferences
1354
1562
  .filter(ref => ref.objClass === ObjectClasses.Dossier || ref.objClass === ObjectClasses.WorkingGroup) // keep only known objClass types
@@ -1399,7 +1607,8 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1399
1607
  finally {
1400
1608
  TMSpinner.hide();
1401
1609
  }
1402
- }, onClose: () => setShowManyToManyChooser(false), manageUseLocalizedName: false })), isOpenArchiveRelationForm && (_jsx(TMDcmtForm, { isModal: true, titleModal: SDKUI_Localizator.Archive + ' - ' + (archiveType === 'detail' ? SDKUI_Localizator.DcmtsDetail : SDKUI_Localizator.DcmtsMaster), TID: archiveRelatedDcmtFormTID, layoutMode: LayoutModes.Ark, inputMids: archiveRelatedDcmtFormMids, showBackButton: false, allowButtonsRefs: false, onClose: () => {
1610
+ }, onClose: () => setShowManyToManyChooser(false), manageUseLocalizedName: false })), (showHistory && fromDTD && currentDcmt) && _jsx(TMViewHistoryDcmt, { fromDTD: fromDTD, deviceType: deviceType, inputDcmt: { TID: currentDcmt.tid, DID: currentDcmt.did }, onClose: hideHistoryCallback, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }), (showCheckoutInformationForm && fromDTD && currentDcmt) &&
1611
+ _jsx(TMDcmtCheckoutInfoForm, { dtdName: fromDTD.name ?? SDKUI_Localizator.SearchResult, selectedDcmtOrFocused: { TID: currentDcmt.tid, DID: currentDcmt.did, FILEEXT: currentDcmt.fileExt }, onClose: hideCheckoutInformationFormCallback }), (commentFormState.show && currentDcmt) && _jsx(TMBlogCommentForm, { context: { engine: 'SearchEngine', object: { tid: currentDcmt.tid, did: currentDcmt.did } }, onClose: hideCommentFormCallback, refreshCallback: triggerBlogRefresh, participants: [], showAttachmentsSection: false, allArchivedDocumentsFileItems: [], isCommentRequired: commentFormState.isRequired, removeAndEditAttachment: commentFormState.removeAndEditAttachment }), isOpenArchiveRelationForm && (_jsx(TMDcmtForm, { isModal: true, titleModal: SDKUI_Localizator.Archive + ' - ' + (archiveType === 'detail' ? SDKUI_Localizator.DcmtsDetail : SDKUI_Localizator.DcmtsMaster), TID: archiveRelatedDcmtFormTID, layoutMode: LayoutModes.Ark, inputMids: archiveRelatedDcmtFormMids, showBackButton: false, allowButtonsRefs: false, onClose: () => {
1403
1612
  setIsOpenArchiveRelationForm(false);
1404
1613
  setArchiveType(undefined);
1405
1614
  setArchiveRelatedDcmtFormTID(undefined);
@@ -1410,7 +1619,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1410
1619
  setArchiveRelatedDcmtFormTID(undefined);
1411
1620
  setArchiveRelatedDcmtFormMids([]);
1412
1621
  await fetchData();
1413
- }, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers })), showPairDcmtsModal && (_jsx(TMModal, { title: (isPairingManyToMany ? "Abbina" : "Disabbina") + " documenti", onClose: () => setShowPairDcmtsModal(false), width: isMobile ? '90%' : '50%', height: isMobile ? '90%' : '70%', children: _jsx(TMSearchResult, { searchResults: pairedSearchResults, onRefreshSearchAsync: async () => await fetchData(), onTaskCreateRequest: onTaskCreateRequest, allowFloatingBar: false, floatingActionConfig: pairFloatingActionConfig, showBackButton: false, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }) }))] }));
1622
+ }, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, onReferenceClick: handleNavigateToReference })), showPairDcmtsModal && (_jsx(TMModal, { title: (isPairingManyToMany ? "Abbina" : "Disabbina") + " documenti", onClose: () => setShowPairDcmtsModal(false), width: isMobile ? '90%' : '50%', height: isMobile ? '90%' : '70%', children: _jsx(TMSearchResult, { searchResults: pairedSearchResults, onRefreshSearchAsync: async () => await fetchData(), onTaskCreateRequest: onTaskCreateRequest, allowFloatingBar: false, floatingActionConfig: pairFloatingActionConfig, showBackButton: false, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }) }))] }));
1414
1623
  };
1415
1624
  export default TMDcmtForm;
1416
1625
  /**
@@ -1433,8 +1642,11 @@ const applyMetadataFilter = (data, showAll, listMaxItems, TID) => {
1433
1642
  o.mid === SystemMIDsAsNumber.FileSize ||
1434
1643
  o.mid === SystemMIDsAsNumber.LastUpdateTime ||
1435
1644
  o.mid === SystemMIDsAsNumber.CreationTime;
1645
+ const chronologySystemFilter = (o) => baseFilter(o) ||
1646
+ o.mid === SystemMIDsAsNumber.FileExt ||
1647
+ o.mid === SystemMIDsAsNumber.FileSize;
1436
1648
  // Select the appropriate filter based on document type
1437
- const currentFilter = TID === SystemTIDs.Drafts ? draftFilter : baseFilter;
1649
+ const currentFilter = TID === SystemTIDs.Drafts ? draftFilter : TID === SystemTIDs.Chronology ? chronologySystemFilter : baseFilter;
1438
1650
  // Apply filter once
1439
1651
  const filteredData = data.filter(currentFilter);
1440
1652
  // Return all filtered data or slice to max items
@@ -1488,3 +1700,35 @@ const TMDcmtPreviewWrapper = ({ currentDcmt, layoutMode, fromDTD, dcmtFile, devi
1488
1700
  _jsx(TMDcmtPreview, { isVisible: isVisible, onClosePanel: (!isMobile && countVisibleLeafPanels() > 1) ? () => setPanelVisibilityById('tmDcmtPreview', false) : undefined, allowMaximize: !isMobile && countVisibleLeafPanels() > 1, onMaximizePanel: (!isMobile && countVisibleLeafPanels() > 1) ? () => toggleMaximize("tmDcmtPreview") : undefined, dcmtData: currentDcmt, isResizingActive: isResizingActive }) :
1489
1701
  _jsx(TMFileUploader, { onFileUpload: onFileUpload, onClose: (!isMobile && countVisibleLeafPanels() > 1) ? () => setPanelVisibilityById('tmDcmtPreview', false) : undefined, isRequired: fromDTD?.archiveConstraint === ArchiveConstraints.ContentCompulsory && dcmtFile === null, defaultBlob: dcmtFile, deviceType: deviceType, isResizingActive: isResizingActive, enableDragDropOverlay: panelVisibility['tmDcmtPreview'] && enableDragDropOverlay }));
1490
1702
  };
1703
+ const Ribbon = styled.div `
1704
+ font-size: 0.85rem;
1705
+ font-weight: 600;
1706
+ color: #fff;
1707
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
1708
+ --f: .4em; /* control the folded part */
1709
+ position: absolute;
1710
+ top: 2px;
1711
+ left: 2px;
1712
+ z-index: 1200;
1713
+ line-height: 1.6;
1714
+ padding-inline: 0.8lh;
1715
+ padding-bottom: var(--f);
1716
+ border-image: conic-gradient(#0008 0 0) 51%/var(--f);
1717
+ clip-path: polygon(100% calc(100% - var(--f)),100% 100%,calc(100% - var(--f)) calc(100% - var(--f)),var(--f) calc(100% - var(--f)), 0 100%,0 calc(100% - var(--f)),999px calc(100% - var(--f) - 999px),calc(100% - 999px) calc(100% - var(--f) - 999px));
1718
+ transform: translate(calc((cos(45deg) - 1)*100%), -100%) rotate(-45deg);
1719
+ transform-origin: 100% 100%;
1720
+ background-color: rgba(217, 148, 13, 0.92);
1721
+ display: inline-block;
1722
+ padding-top: 0.1em;
1723
+ white-space: nowrap;
1724
+ transition: ${props => props.$isMobile ? 'none' : 'all 0.3s ease'};
1725
+ cursor: 'default';
1726
+
1727
+ ${props => !props.$isMobile && `
1728
+ &:hover {
1729
+ background-color: #d9940d;
1730
+ font-size: 1.1rem;
1731
+ transform: translate(calc((cos(45deg) - 1)*100%), -100%) rotate(-45deg) scale(1.05);
1732
+ }
1733
+ `}
1734
+ `;