@topconsultnpm/sdkui-react 6.20.0-dev1.13 → 6.20.0-dev1.130

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 (202) hide show
  1. package/lib/assets/Toppy-help-center.png +0 -0
  2. package/lib/assets/headergradient.svg +87 -0
  3. package/lib/components/NewComponents/ContextMenu/TMContextMenu.js +322 -30
  4. package/lib/components/NewComponents/ContextMenu/hooks.d.ts +8 -1
  5. package/lib/components/NewComponents/ContextMenu/hooks.js +80 -8
  6. package/lib/components/NewComponents/ContextMenu/index.d.ts +3 -0
  7. package/lib/components/NewComponents/ContextMenu/index.js +2 -0
  8. package/lib/components/NewComponents/ContextMenu/styles.d.ts +9 -1
  9. package/lib/components/NewComponents/ContextMenu/styles.js +146 -47
  10. package/lib/components/NewComponents/ContextMenu/types.d.ts +22 -3
  11. package/lib/components/NewComponents/ContextMenu/useLongPress.d.ts +21 -0
  12. package/lib/components/NewComponents/ContextMenu/useLongPress.js +112 -0
  13. package/lib/components/NewComponents/FloatingMenuBar/TMFloatingMenuBar.js +620 -125
  14. package/lib/components/NewComponents/FloatingMenuBar/styles.d.ts +25 -5
  15. package/lib/components/NewComponents/FloatingMenuBar/styles.js +215 -59
  16. package/lib/components/NewComponents/FloatingMenuBar/types.d.ts +12 -3
  17. package/lib/components/base/TMAccordionNew.js +35 -14
  18. package/lib/components/base/TMButton.js +6 -0
  19. package/lib/components/base/TMClosableList.js +4 -0
  20. package/lib/components/base/TMCustomButton.js +61 -17
  21. package/lib/components/base/TMDataGrid.d.ts +7 -4
  22. package/lib/components/base/TMDataGrid.js +153 -11
  23. package/lib/components/base/TMDropDownMenu.js +21 -18
  24. package/lib/components/base/TMFileManager.d.ts +4 -3
  25. package/lib/components/base/TMFileManager.js +32 -24
  26. package/lib/components/base/TMFileManagerDataGridView.d.ts +3 -2
  27. package/lib/components/base/TMFileManagerDataGridView.js +1 -11
  28. package/lib/components/base/TMFileManagerThumbnailItems.d.ts +7 -1
  29. package/lib/components/base/TMFileManagerThumbnailItems.js +5 -2
  30. package/lib/components/base/TMFileManagerThumbnailsView.d.ts +17 -4
  31. package/lib/components/base/TMFileManagerThumbnailsView.js +18 -6
  32. package/lib/components/base/TMFileManagerUtils.d.ts +0 -12
  33. package/lib/components/base/TMListView.js +33 -15
  34. package/lib/components/base/TMPanel.d.ts +1 -1
  35. package/lib/components/base/TMPanel.js +4 -2
  36. package/lib/components/base/TMPopUp.js +6 -0
  37. package/lib/components/base/TMToolbarCard.js +2 -0
  38. package/lib/components/base/TMTreeView.d.ts +2 -1
  39. package/lib/components/base/TMTreeView.js +33 -26
  40. package/lib/components/choosers/TMDataListItemChooser.d.ts +2 -0
  41. package/lib/components/choosers/TMDataListItemChooser.js +8 -2
  42. package/lib/components/choosers/TMDcmtTypeChooser.d.ts +1 -0
  43. package/lib/components/choosers/TMDcmtTypeChooser.js +11 -3
  44. package/lib/components/choosers/TMDistinctValues.js +2 -2
  45. package/lib/components/choosers/TMDynDataListItemChooser.d.ts +2 -0
  46. package/lib/components/choosers/TMDynDataListItemChooser.js +8 -2
  47. package/lib/components/choosers/TMInvoiceRetrieveFormats.js +1 -1
  48. package/lib/components/choosers/TMMetadataChooser.d.ts +2 -0
  49. package/lib/components/choosers/TMMetadataChooser.js +19 -4
  50. package/lib/components/choosers/TMOrderRetrieveFormats.js +1 -1
  51. package/lib/components/choosers/TMUserChooser.d.ts +2 -5
  52. package/lib/components/choosers/TMUserChooser.js +33 -47
  53. package/lib/components/editors/TMCheckBox.js +2 -0
  54. package/lib/components/editors/TMDateBox.js +18 -9
  55. package/lib/components/editors/TMEditorStyled.js +7 -0
  56. package/lib/components/editors/TMLocalizedTextBox.d.ts +3 -1
  57. package/lib/components/editors/TMLocalizedTextBox.js +16 -14
  58. package/lib/components/editors/TMMetadataEditor.d.ts +1 -0
  59. package/lib/components/editors/TMMetadataEditor.js +4 -4
  60. package/lib/components/editors/TMMetadataTextBox.d.ts +9 -0
  61. package/lib/components/editors/TMMetadataTextBox.js +92 -0
  62. package/lib/components/editors/TMMetadataValues.d.ts +2 -0
  63. package/lib/components/editors/TMMetadataValues.js +26 -8
  64. package/lib/components/editors/TMRadioButton.js +2 -0
  65. package/lib/components/editors/TMTextArea.js +18 -30
  66. package/lib/components/editors/TMTextBox.d.ts +1 -1
  67. package/lib/components/editors/TMTextBox.js +29 -4
  68. package/lib/components/editors/TMTextExpression.js +6 -91
  69. package/lib/components/features/archive/TMArchive.js +2 -2
  70. package/lib/components/features/assistant/TMToppyDraggableHelpCenter.d.ts +15 -0
  71. package/lib/components/features/assistant/TMToppyDraggableHelpCenter.js +462 -0
  72. package/lib/components/features/assistant/TMToppySpeechBubble.d.ts +11 -0
  73. package/lib/components/features/assistant/TMToppySpeechBubble.js +126 -0
  74. package/lib/components/features/documents/TMDcmtBlog.js +1 -1
  75. package/lib/components/features/documents/TMDcmtForm.d.ts +14 -2
  76. package/lib/components/features/documents/TMDcmtForm.js +576 -292
  77. package/lib/components/features/documents/TMDcmtPreview.js +42 -155
  78. package/lib/components/features/documents/TMDcmtTasks.js +9 -9
  79. package/lib/components/features/documents/TMMasterDetailDcmts.js +38 -53
  80. package/lib/components/features/documents/TMRelationViewer.d.ts +1 -1
  81. package/lib/components/features/documents/TMRelationViewer.js +2 -2
  82. package/lib/components/features/search/TMDcmtCheckoutInfoForm.d.ts +8 -0
  83. package/lib/components/features/search/{TMSearchResultCheckoutInfoForm.js → TMDcmtCheckoutInfoForm.js} +2 -2
  84. package/lib/components/features/search/TMSavedQuerySelector.js +72 -67
  85. package/lib/components/features/search/TMSearch.d.ts +3 -0
  86. package/lib/components/features/search/TMSearch.js +50 -11
  87. package/lib/components/features/search/TMSearchQueryEditor.d.ts +1 -0
  88. package/lib/components/features/search/TMSearchQueryEditor.js +10 -10
  89. package/lib/components/features/search/TMSearchQueryPanel.d.ts +1 -0
  90. package/lib/components/features/search/TMSearchQueryPanel.js +40 -25
  91. package/lib/components/features/search/TMSearchResult.d.ts +3 -0
  92. package/lib/components/features/search/TMSearchResult.js +370 -252
  93. package/lib/components/features/search/TMSearchResultsMenuItems.d.ts +3 -3
  94. package/lib/components/features/search/TMSearchResultsMenuItems.js +227 -171
  95. package/lib/components/features/search/TMSignSettingsForm.js +1 -1
  96. package/lib/components/features/search/TMSignatureInfoContent.d.ts +6 -0
  97. package/lib/components/features/search/TMSignatureInfoContent.js +140 -0
  98. package/lib/components/features/search/TMViewHistoryDcmt.js +47 -52
  99. package/lib/components/features/tasks/TMTaskForm.js +75 -25
  100. package/lib/components/features/tasks/TMTasksAgenda.d.ts +3 -1
  101. package/lib/components/features/tasks/TMTasksAgenda.js +48 -9
  102. package/lib/components/features/tasks/TMTasksCalendar.d.ts +2 -0
  103. package/lib/components/features/tasks/TMTasksCalendar.js +19 -7
  104. package/lib/components/features/tasks/TMTasksUtils.d.ts +2 -2
  105. package/lib/components/features/tasks/TMTasksUtils.js +57 -37
  106. package/lib/components/features/tasks/TMTasksView.js +28 -19
  107. package/lib/components/features/workflow/TMWorkflowPopup.d.ts +33 -2
  108. package/lib/components/features/workflow/TMWorkflowPopup.js +140 -34
  109. package/lib/components/features/workflow/diagram/DiagramItemComponent.d.ts +2 -0
  110. package/lib/components/features/workflow/diagram/DiagramItemComponent.js +14 -7
  111. package/lib/components/features/workflow/diagram/DiagramItemForm.js +1 -1
  112. package/lib/components/features/workflow/diagram/RecipientList.js +3 -2
  113. package/lib/components/features/workflow/diagram/WFDiagram.d.ts +4 -0
  114. package/lib/components/features/workflow/diagram/WFDiagram.js +164 -13
  115. package/lib/components/forms/Login/LoginValidatorService.d.ts +2 -0
  116. package/lib/components/forms/Login/LoginValidatorService.js +7 -2
  117. package/lib/components/forms/Login/TMLoginForm.js +35 -7
  118. package/lib/components/forms/TMChooserForm.js +1 -1
  119. package/lib/components/grids/TMBlogsPost.js +56 -31
  120. package/lib/components/grids/TMRecentsManager.js +20 -10
  121. package/lib/components/grids/TMValidationItemsList.js +6 -0
  122. package/lib/components/index.d.ts +6 -3
  123. package/lib/components/index.js +6 -3
  124. package/lib/components/layout/panelManager/TMPanelManagerContext.js +13 -5
  125. package/lib/components/query/TMQueryEditor.d.ts +6 -1
  126. package/lib/components/query/TMQueryEditor.js +105 -101
  127. package/lib/components/settings/SettingsAppearance.d.ts +2 -1
  128. package/lib/components/settings/SettingsAppearance.js +99 -30
  129. package/lib/components/sidebar/TMHeader.js +11 -7
  130. package/lib/components/sidebar/TMSidebar.d.ts +0 -1
  131. package/lib/components/sidebar/TMSidebar.js +16 -44
  132. package/lib/components/sidebar/TMSidebarItem.js +36 -17
  133. package/lib/components/viewers/TMDataListItemViewer.d.ts +2 -1
  134. package/lib/components/viewers/TMDataListItemViewer.js +35 -71
  135. package/lib/components/viewers/TMDataUserIdItemViewer.d.ts +8 -0
  136. package/lib/components/viewers/TMDataUserIdItemViewer.js +39 -0
  137. package/lib/css/tm-sdkui.css +1 -1
  138. package/lib/helper/SDKUI_Globals.d.ts +22 -0
  139. package/lib/helper/SDKUI_Globals.js +10 -1
  140. package/lib/helper/SDKUI_Localizator.d.ts +21 -3
  141. package/lib/helper/SDKUI_Localizator.js +196 -10
  142. package/lib/helper/TMCommandsContextMenu.d.ts +4 -2
  143. package/lib/helper/TMCommandsContextMenu.js +15 -4
  144. package/lib/helper/TMIcons.d.ts +4 -0
  145. package/lib/helper/TMIcons.js +13 -3
  146. package/lib/helper/TMPdfViewer.d.ts +8 -0
  147. package/lib/helper/TMPdfViewer.js +373 -0
  148. package/lib/helper/TMToppyMessage.js +4 -0
  149. package/lib/helper/checkinCheckoutManager.d.ts +31 -1
  150. package/lib/helper/checkinCheckoutManager.js +112 -30
  151. package/lib/helper/devextremeCustomMessages.d.ts +30 -0
  152. package/lib/helper/devextremeCustomMessages.js +30 -0
  153. package/lib/helper/helpers.d.ts +30 -2
  154. package/lib/helper/helpers.js +132 -4
  155. package/lib/helper/index.d.ts +2 -0
  156. package/lib/helper/index.js +2 -0
  157. package/lib/helper/queryHelper.d.ts +2 -2
  158. package/lib/helper/queryHelper.js +80 -24
  159. package/lib/helper/workItemsHelper.d.ts +6 -0
  160. package/lib/helper/workItemsHelper.js +230 -0
  161. package/lib/hooks/useCheckInOutOperations.d.ts +28 -0
  162. package/lib/hooks/useCheckInOutOperations.js +223 -0
  163. package/lib/hooks/useDataListItem.d.ts +12 -0
  164. package/lib/hooks/useDataListItem.js +132 -0
  165. package/lib/hooks/useDataUserIdItem.d.ts +10 -0
  166. package/lib/hooks/useDataUserIdItem.js +96 -0
  167. package/lib/hooks/useFloatingBarPinnedItems.d.ts +11 -0
  168. package/lib/hooks/useFloatingBarPinnedItems.js +54 -0
  169. package/lib/hooks/useMetadataExpression.d.ts +19 -0
  170. package/lib/hooks/useMetadataExpression.js +99 -0
  171. package/lib/hooks/useSettingsFeedback.d.ts +11 -0
  172. package/lib/hooks/useSettingsFeedback.js +38 -0
  173. package/lib/hooks/useWorkflowApprove.d.ts +4 -0
  174. package/lib/hooks/useWorkflowApprove.js +14 -1
  175. package/lib/index.d.ts +1 -0
  176. package/lib/index.js +3 -2
  177. package/lib/services/platform_services.d.ts +3 -3
  178. package/lib/ts/types.d.ts +61 -1
  179. package/lib/utils/theme.d.ts +1 -1
  180. package/lib/utils/theme.js +1 -1
  181. package/package.json +6 -5
  182. package/lib/components/NewComponents/Notification/Notification.d.ts +0 -4
  183. package/lib/components/NewComponents/Notification/Notification.js +0 -60
  184. package/lib/components/NewComponents/Notification/NotificationContainer.d.ts +0 -8
  185. package/lib/components/NewComponents/Notification/NotificationContainer.js +0 -33
  186. package/lib/components/NewComponents/Notification/index.d.ts +0 -2
  187. package/lib/components/NewComponents/Notification/index.js +0 -2
  188. package/lib/components/NewComponents/Notification/styles.d.ts +0 -21
  189. package/lib/components/NewComponents/Notification/styles.js +0 -180
  190. package/lib/components/NewComponents/Notification/types.d.ts +0 -18
  191. package/lib/components/NewComponents/Notification/types.js +0 -1
  192. package/lib/components/base/TMContextMenu.d.ts +0 -25
  193. package/lib/components/base/TMContextMenu.js +0 -109
  194. package/lib/components/base/TMContextMenuOLD.d.ts +0 -26
  195. package/lib/components/base/TMContextMenuOLD.js +0 -56
  196. package/lib/components/base/TMFloatingToolbar.d.ts +0 -9
  197. package/lib/components/base/TMFloatingToolbar.js +0 -101
  198. package/lib/components/features/assistant/ToppyDraggableHelpCenter.d.ts +0 -30
  199. package/lib/components/features/assistant/ToppyDraggableHelpCenter.js +0 -482
  200. package/lib/components/features/assistant/ToppySpeechBubble.d.ts +0 -9
  201. package/lib/components/features/assistant/ToppySpeechBubble.js +0 -117
  202. 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, IconLock } 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';
@@ -39,12 +38,34 @@ import WFDiagram from '../workflow/diagram/WFDiagram';
39
38
  import TMTooltip from '../../base/TMTooltip';
40
39
  import TMDcmtTasks from './TMDcmtTasks';
41
40
  import TMToppyMessage from '../../../helper/TMToppyMessage';
42
- import { getTaskAssignedToMe } from '../tasks/TMTasksUtils';
41
+ import { getTaskAssignedByMe, 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();
65
+ ;
46
66
  //#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, }) => {
67
+ 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, moreInfoTasks, connectorFileSave = undefined, inputMids = [], openS4TViewer = false, onOpenS4TViewerRequest, s4TViewerDialogComponent, enableDragDropOverlay = false, passToSearch, isSharedDcmt = false, sharedSourceTID, sharedSourceDID, allowButtonsRefs = false, onReferenceClick, }) => {
68
+ const { showHistory, showHistoryCallback, hideHistoryCallback, showCheckoutInformationForm, commentFormState, hideCommentFormCallback, showCheckoutInformationFormCallback, hideCheckoutInformationFormCallback, copyCheckoutPathToClipboardCallback, handleCheckOutCallback, handleCheckInCallback, refreshPreviewTrigger, showCicoWaitPanel, cicoWaitPanelTitle, showCicoPrimaryProgress, cicoPrimaryProgressText, cicoPrimaryProgressValue, cicoPrimaryProgressMax, } = useCheckInOutOperations();
48
69
  const [id, setID] = useState('');
49
70
  const [showWaitPanelLocal, setShowWaitPanelLocal] = useState(false);
50
71
  const [waitPanelTitleLocal, setWaitPanelTitleLocal] = useState('');
@@ -68,6 +89,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
68
89
  const [layout, setLayout] = useState();
69
90
  const [customButtonsLayout, setCustomButtonsLayout] = useState();
70
91
  const [customButton, setCustomButton] = useState();
92
+ const [allUsers, setAllUsers] = useState([]);
71
93
  const appliedInputMidsRef = useRef(null);
72
94
  // Refs per evitare stale closure nei callback
73
95
  // I useCallback catturano i valori delle dipendenze al momento della creazione.
@@ -91,6 +113,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
91
113
  const [fetchError, setFetchError] = useState(false);
92
114
  const [isWFDataLoading, setIsWFDataLoading] = useState(false);
93
115
  const [workItems, setWorkItems] = useState([]);
116
+ const [workItemsForDiagram, setWorkItemsForDiagram] = useState([]);
94
117
  const [workflows, setWorkflows] = useState([]);
95
118
  const [showCommentForm, setShowCommentForm] = useState(false);
96
119
  const [isInitialLoading, setIsInitialLoading] = useState(true);
@@ -98,16 +121,25 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
98
121
  const [dcmtReferences, setDcmtReferences] = useState(undefined);
99
122
  // Stato per triggerare il refresh del blog dall'esterno
100
123
  const [refreshBlogTrigger, setRefreshBlogTrigger] = useState(0);
124
+ const [wfError, setWfError] = useState(null);
125
+ const [metadataDcmtOrigin, setMetadataDcmtOrigin] = useState(null);
101
126
  const triggerBlogRefresh = useCallback(async () => {
102
127
  setRefreshBlogTrigger(prev => prev + 1);
103
128
  }, []);
129
+ useEffect(() => {
130
+ const fetchAllUsers = async () => {
131
+ const users = await UserListCacheService.GetAllAsync();
132
+ setAllUsers(users ?? []);
133
+ };
134
+ fetchAllUsers();
135
+ }, []);
104
136
  useEffect(() => {
105
137
  if (!allowButtonsRefs)
106
138
  setDcmtReferences(undefined);
107
139
  }, [allowButtonsRefs]);
108
140
  const { openConfirmAttachmentsDialog, ConfirmAttachmentsDialog } = useInputAttachmentsDialog();
109
141
  const { abortController, showWaitPanel, waitPanelTitle, showPrimary, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, downloadDcmtsAsync, runOperationAsync } = useDcmtOperations();
110
- const { workflowApproveData } = useWorkflowApprove();
142
+ const { workflowApproveData, getWorkItemsByDID } = useWorkflowApprove();
111
143
  const currentSearchResults = useMemo(() => {
112
144
  if (!formData || formData.length === 0 || !TID || !DID)
113
145
  return [];
@@ -124,7 +156,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
124
156
  selectMIDs: selectMIDs,
125
157
  dtdResult: {
126
158
  rows: [rowValues],
127
- columns: selectMIDs.map(mid => ({ name: `MID_${mid}` }))
159
+ columns: selectMIDs.map(mid => ({ name: `MID_${mid}`, }))
128
160
  },
129
161
  dcmtsFound: 1,
130
162
  dcmtsReturned: 1
@@ -158,10 +190,11 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
158
190
  return;
159
191
  TMSpinner.show({ description: 'Loading Metadata...' });
160
192
  let res = getMetadataResult ?? await SDK_Globals.tmSession?.NewSearchEngine().GetMetadataAsync(TID, did, true);
193
+ const origin = { fromName: res?.fromName, fromTID: res?.fromTID };
161
194
  let dtd = res?.dtdResult;
162
195
  let rows = dtd.rows ? dtd.rows[0] : [];
163
196
  let mids = res?.selectMIDs;
164
- let metadataList = searchResultToMetadataValues(TID, dtd, rows, mids, mdList, layoutMode);
197
+ let metadataList = searchResultToMetadataValues(TID, dtd, rows, mids, mdList, layoutMode, origin.fromTID?.toString() !== TID?.toString());
165
198
  if (archived) {
166
199
  // Usa setFormData con funzione callback per accedere allo stato precedente
167
200
  // invece di dipendere da formDataOrig nell'array di dipendenze
@@ -187,6 +220,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
187
220
  });
188
221
  return;
189
222
  }
223
+ setMetadataDcmtOrigin(origin);
190
224
  setFormDataOrig(structuredClone(metadataList));
191
225
  setFormData(structuredClone(metadataList));
192
226
  // Sincronizza il ref con i dati caricati per evitare stale closure in handleSave
@@ -242,14 +276,13 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
242
276
  }
243
277
  // Carica DTD e metadata
244
278
  let dtd = await DcmtTypeListCacheService.GetWithNotGrantedAsync(TID, DID, getMetadataResult);
245
- console.log('GetWithNotGrantedAsync DTD:', dtd);
246
279
  setFromDTD(dtd);
247
280
  if (layoutMode === LayoutModes.Update || (layoutMode === LayoutModes.Ark && DID)) {
248
281
  await setMetadataList(dtd?.metadata ?? [], getMetadataResult);
249
282
  }
250
283
  else {
251
284
  const renderedMetadata = dtd?.metadata?.filter((metadata) => handleArchiveVisibility(metadata)) ?? [];
252
- const metadataList = searchResultToMetadataValues(dtd?.id, undefined, [], [], renderedMetadata, layoutMode);
285
+ const metadataList = searchResultToMetadataValues(dtd?.id, undefined, [], [], renderedMetadata, layoutMode, metadataDcmtOrigin?.fromTID?.toString() !== TID?.toString());
253
286
  setFormDataOrig(structuredClone(metadataList));
254
287
  setFormData(structuredClone(metadataList));
255
288
  formDataOrigRef.current = structuredClone(metadataList);
@@ -264,7 +297,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
264
297
  setIsInitialLoading(false);
265
298
  setIsNavigating(false);
266
299
  }
267
- }, [TID, DID, layoutMode, inputFile, setMetadataList, handleReset, allowButtonsRefs]);
300
+ }, [TID, DID, layoutMode, inputFile, setMetadataList, handleReset, allowButtonsRefs, metadataDcmtOrigin?.fromTID]);
268
301
  const createChange = useCallback((mid, metadataType, modifiedValue) => {
269
302
  return { mid, metadataType, modifiedValue };
270
303
  }, []);
@@ -411,74 +444,173 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
411
444
  const workItemSetIDValue = useMemo(() => formData.find(o => o.md?.name === WorkItemMetadataNames.WI_SetID)?.value, [formData]);
412
445
  // Valore derivato: true se formData ha elementi validi
413
446
  const hasFormData = useMemo(() => formData.length > 0 && formData.some(md => md.mid && md.mid > 99), [formData]);
447
+ const handleCheckOutOperationCallback = async (checkout) => {
448
+ if (!currentDcmt)
449
+ return;
450
+ await handleCheckOutCallback({ TID: currentDcmt.tid, DID: currentDcmt.did, FILEEXT: currentDcmt.fileExt }, checkout, fromDTD?.name ?? SDKUI_Localizator.SearchResult, downloadDcmtsAsync, updateCurrentDcmt);
451
+ };
452
+ const handleCheckInOperationCallback = async () => {
453
+ if (!currentDcmt)
454
+ return;
455
+ await handleCheckInCallback({ TID: currentDcmt.tid, DID: currentDcmt.did, FILEEXT: currentDcmt.fileExt, fileName: fromDTD?.name ?? SDKUI_Localizator.SearchResult }, updateCurrentDcmt, undefined);
456
+ };
457
+ const copyCheckoutPathToClipboardOperationCallback = () => {
458
+ if (!currentDcmt)
459
+ return;
460
+ copyCheckoutPathToClipboardCallback({ TID: currentDcmt.tid, DID: currentDcmt.did, FILEEXT: currentDcmt.fileExt }, fromDTD?.name ?? SDKUI_Localizator.SearchResult);
461
+ };
462
+ // useEffect per il caricamento dei dati del workflow
414
463
  useEffect(() => {
464
+ // Funzione helper per caricare le informazioni del workflow
465
+ const loadWorkflowInfo = async (tid) => {
466
+ await WorkflowCacheService.GetWFInfoAsync(tid)
467
+ .then((result) => {
468
+ if (result) {
469
+ setWorkflows([result]);
470
+ setWfError(null);
471
+ }
472
+ else {
473
+ setWorkflows([]);
474
+ setWfError("Workflow info not found");
475
+ }
476
+ })
477
+ .catch(error => {
478
+ setWorkflows([]);
479
+ console.log("Error fetching workflow info:", error);
480
+ setWfError(getExceptionMessage(error));
481
+ });
482
+ };
415
483
  const loadAllWfData = async () => {
416
- if (layoutMode !== LayoutModes.Update || !DID || fromDTD?.templateTID !== TemplateTIDs.WF_WIApprView) {
484
+ // FASE 1: Validazione prerequisiti
485
+ if (layoutMode !== LayoutModes.Update || !DID) {
417
486
  setWorkItems([]);
418
487
  setWorkflows([]);
419
488
  return;
420
489
  }
421
490
  setIsWFDataLoading(true);
422
491
  try {
423
- // 1. item da processare in modo sincrono
424
- const itemsToProcess = [];
425
- for (const workflow of workflowApproveData) {
426
- for (const dataRow of workflow.dtdResult?.rows ?? []) {
427
- const did = Number(dataRow?.[1]);
428
- if (did === Number(DID)) {
429
- const tid = Number(dataRow?.[0]);
430
- itemsToProcess.push({ tid, did });
431
- }
432
- }
433
- }
492
+ // FASE 2: Raccolta work items: array di tutti i possibili work items che matchano il DID corrente
493
+ const itemsToProcess = getWorkItemsByDID(Number(DID));
494
+ // Se non ci sono work items per questo DID, resetta e esci
434
495
  if (itemsToProcess.length === 0) {
435
496
  setWorkItems([]);
436
497
  setWorkflows([]);
437
498
  setIsWFDataLoading(false);
438
499
  return;
439
500
  }
440
- // promises per i setID in modo condizionale
441
- let setIDPromises;
442
- if (workItemSetIDValue !== undefined) {
443
- // Se abbiamo il setID dal form, non facciamo chiamate di rete.
444
- setIDPromises = itemsToProcess.map(() => Promise.resolve(workItemSetIDValue));
501
+ // FASE 3: Ricerca work item specifico
502
+ // Cerca prima un match esatto con TID e DID correnti
503
+ const foundItem = itemsToProcess.find(item => item.tid === Number(TID) && item.did === Number(DID));
504
+ if (foundItem) {
505
+ // SCENARIO A: Match esatto trovato (TID e DID corrispondono)
506
+ // Il documento corrente è esattamente il work item nel workflow
507
+ let setID = undefined;
508
+ // Prova a usare il setID già presente nei metadati (più veloce)
509
+ if (workItemSetIDValue !== undefined) {
510
+ setID = workItemSetIDValue;
511
+ }
512
+ else {
513
+ // Altrimenti caricalo dal server
514
+ setID = await getWorkItemSetIDAsync(foundItem.tid, foundItem.did);
515
+ }
516
+ // Imposta un singolo work item con il setID caricato
517
+ setWorkItems([{
518
+ wid: `${foundItem.tid}_${foundItem.did}`,
519
+ tid: foundItem.tid,
520
+ did: foundItem.did,
521
+ setID: setID,
522
+ details: []
523
+ }]);
524
+ // Carica le informazioni complete del workflow
525
+ await loadWorkflowInfo(foundItem.tid);
445
526
  }
446
527
  else {
447
- // Altrimenti, procediamo con le chiamate di rete come prima.
448
- setIDPromises = itemsToProcess.map(item => getWorkItemSetIDAsync(item.tid, item.did));
528
+ // SCENARIO B: Nessun match esatto, cerca solo per DID
529
+ const itemsByDID = itemsToProcess.filter(item => item.did === Number(DID));
530
+ if (itemsByDID.length === 1) {
531
+ // SCENARIO B.1: Un solo item trovato per DID
532
+ // Situazione sicura: sappiamo esattamente quale work item usare
533
+ const singleItem = itemsByDID[0];
534
+ let setID;
535
+ // Carica il setID (da cache o da server)
536
+ if (workItemSetIDValue !== undefined) {
537
+ setID = workItemSetIDValue;
538
+ }
539
+ else {
540
+ setID = await getWorkItemSetIDAsync(singleItem.tid, singleItem.did);
541
+ }
542
+ setWorkItems([{
543
+ wid: `${singleItem.tid}_${singleItem.did}`,
544
+ tid: singleItem.tid,
545
+ did: singleItem.did,
546
+ setID: setID,
547
+ details: []
548
+ }]);
549
+ // Carica le informazioni del workflow
550
+ await loadWorkflowInfo(singleItem.tid);
551
+ }
552
+ else if (itemsByDID.length > 1) {
553
+ // SCENARIO B.2: Più item trovati per lo stesso DID
554
+ // Ambiguità: lo stesso documento appare in più workflow diversi
555
+ const finalWorkItems = itemsByDID.map((item, index) => ({
556
+ wid: `${item.tid}_${item.did}_${index}`,
557
+ tid: item.tid,
558
+ did: item.did,
559
+ setID: undefined,
560
+ details: []
561
+ }));
562
+ setWorkItems(finalWorkItems);
563
+ setWorkflows([]); // Non carichiamo il workflow in caso di ambiguità
564
+ }
449
565
  }
450
- // Crea un array di Promise per tutte le chiamate a GetWFInfoAsync
451
- const workflowInfoPromises = itemsToProcess.map(item => WorkflowCacheService.GetWFInfoAsync(item.tid));
452
- // Esegui tutte le chiamate in parallelo e attendi i risultati
453
- const setIDResults = await Promise.all(setIDPromises);
454
- const workflowInfoResults = await Promise.all(workflowInfoPromises);
455
- // Combina i risultati
456
- const finalWorkItems = itemsToProcess.map((item, index) => ({
457
- ...item,
458
- setID: setIDResults[index],
459
- }));
460
- const validWorkflows = workflowInfoResults.filter(Boolean);
461
- // Aggiorna lo stato una sola volta con i dati finali
462
- setWorkItems(finalWorkItems);
463
- setWorkflows(validWorkflows);
464
566
  }
465
567
  catch (error) {
568
+ // FASE 4: Gestione errori
466
569
  TMExceptionBoxManager.show({ exception: error });
467
570
  setWorkItems([]);
468
571
  setWorkflows([]);
469
572
  }
470
573
  finally {
574
+ // Garantisce sempre il reset del flag di loading
471
575
  setIsWFDataLoading(false);
472
576
  }
473
577
  };
474
- // Usa hasFormData invece di formDataRef.current
475
578
  if (!hasFormData || !fromDTD?.id) {
476
- // console.log("formData is empty or fromDTD not loaded, skipping loadAllWfData");
477
579
  return;
478
580
  }
479
581
  if (workItemSetIDValue !== undefined || workflowApproveData.length > 0)
480
582
  loadAllWfData();
481
- }, [hasFormData, workItemSetIDValue, workflowApproveData, DID, layoutMode, fromDTD?.templateTID, fromDTD?.id]);
583
+ }, [hasFormData, workItemSetIDValue, workflowApproveData, getWorkItemsByDID, TID, DID, layoutMode, fromDTD?.templateTID, fromDTD?.id]);
584
+ // useEffect per costruire workItemsForDiagram quando l'utente è autorizzato a vedere il diagramma
585
+ useEffect(() => {
586
+ const buildWorkItemsForDiagram = async () => {
587
+ // Verifica se l'utente è autorizzato (ha accesso al diagramma)
588
+ const isAuthorized = !!workflows?.[0]?.diagram;
589
+ if (!isAuthorized || workItems.length === 0) {
590
+ setWorkItemsForDiagram([]);
591
+ return;
592
+ }
593
+ try {
594
+ // Costruisci WFInstanceDescriptor dai dati disponibili
595
+ const wfInstance = {
596
+ wfid: workflows[0].id,
597
+ tid: workflows[0].mtid,
598
+ did: DID ? Number(DID) : 0,
599
+ instanceId: undefined,
600
+ rowIndex: 0,
601
+ values: []
602
+ };
603
+ // Chiama buildWorkItemsFromWFCtrl per ottenere i workItems completi
604
+ const detailedWorkItems = await buildWorkItemsFromWFCtrl(wfInstance);
605
+ setWorkItemsForDiagram(detailedWorkItems);
606
+ }
607
+ catch (error) {
608
+ console.error('Errore durante la costruzione dei work items per il diagramma:', error);
609
+ setWorkItemsForDiagram([]);
610
+ }
611
+ };
612
+ buildWorkItemsForDiagram();
613
+ }, [workflows, workItems]);
482
614
  const getSelectionDcmtInfo = useCallback(() => {
483
615
  let dcmts = [];
484
616
  dcmts.push({ TID: TID ?? 0, DID: DID ?? 0 });
@@ -504,12 +636,30 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
504
636
  const isSysMetadataDisabled = useMemo(() => layoutMode !== LayoutModes.Update, [layoutMode]);
505
637
  const isDetailsDisabled = useMemo(() => layoutMode !== LayoutModes.Update || !DID, [layoutMode, DID]);
506
638
  const isMasterDisabled = useMemo(() => layoutMode !== LayoutModes.Update || !DID, [layoutMode, DID]);
507
- const isWFDisabled = useMemo(() => layoutMode !== LayoutModes.Update || fetchError || workItems.length <= 0, [layoutMode, fetchError, workItems.length]);
639
+ const isWFDisabled = useMemo(() => layoutMode !== LayoutModes.Update || fetchError || (workItems.length <= 0 && workItemsForDiagram.length <= 0), [layoutMode, fetchError, workItems.length, workItemsForDiagram.length]);
508
640
  const showToppyForApprove = useMemo(() => layoutMode === LayoutModes.Update && !fetchError && workItems.length > 0 && !isOpenDetails && !isOpenMaster, [layoutMode, fetchError, workItems.length, isOpenDetails, isOpenMaster]);
509
- const showToppyForCompleteMoreInfo = useMemo(() => layoutMode === LayoutModes.Update && !!isTaskMoreInfo(taskMoreInfo?.name) && taskMoreInfo?.state !== Task_States.Completed, [layoutMode, taskMoreInfo?.name, taskMoreInfo?.state]);
510
- const showToppyForReferences = useMemo(() => allowButtonsRefs && layoutMode === LayoutModes.Update && !!(dcmtReferences && dcmtReferences.length > 0) && !isOpenDetails && !isOpenMaster, [allowButtonsRefs, layoutMode, dcmtReferences, isOpenDetails, isOpenMaster]);
641
+ const showToppyForCompleteMoreInfo = useMemo(() => {
642
+ if (layoutMode !== LayoutModes.Update || !moreInfoTasks) {
643
+ return false;
644
+ }
645
+ return moreInfoTasks.some(task => isTaskMoreInfo(task.name) &&
646
+ task.state !== Task_States.Completed);
647
+ }, [layoutMode, moreInfoTasks]);
648
+ const showToppyForReferences = useMemo(() => {
649
+ if (!allowButtonsRefs || layoutMode !== LayoutModes.Update || isOpenDetails || isOpenMaster)
650
+ return false;
651
+ if (!dcmtReferences || dcmtReferences.length === 0)
652
+ return false;
653
+ // Verifica che ci siano riferimenti renderizzabili (solo Dossier o WorkingGroup)
654
+ return dcmtReferences.some(ref => ref.objClass === ObjectClasses.Dossier || ref.objClass === ObjectClasses.WorkingGroup);
655
+ }, [allowButtonsRefs, layoutMode, dcmtReferences, isOpenDetails, isOpenMaster]);
656
+ const isToppyVisible = useMemo(() => Boolean((showToppyForApprove || showToppyForCompleteMoreInfo || showToppyForReferences) && !openS4TViewer), [showToppyForApprove, showToppyForCompleteMoreInfo, showToppyForReferences, openS4TViewer]);
511
657
  const isMobile = useMemo(() => deviceType === DeviceType.MOBILE, [deviceType]);
512
- const isApprView = useMemo(() => fromDTD?.templateTID === TemplateTIDs.WF_WIApprView, [fromDTD?.templateTID]);
658
+ const isApprView = useMemo(() => {
659
+ if (!fromDTD)
660
+ return false;
661
+ return isApprovalWorkflowView(fromDTD);
662
+ }, [fromDTD?.id]);
513
663
  const workitemSetID = useMemo(() => workItems.find(o => o.did === Number(DID))?.setID || formData.find(o => o.md?.name === WorkItemMetadataNames.WI_SetID)?.value, [workItems, DID, formData]);
514
664
  const approvalVID = useMemo(() => workItems.length > 0 ? Number(workItems[0].tid) : -1, [workItems]);
515
665
  //here
@@ -517,23 +667,20 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
517
667
  const items = [];
518
668
  const operationsItems = [];
519
669
  operationsItems.push({
520
- icon: svgToString(_jsx(IconDownload, {})),
521
- operationType: 'singleRow',
670
+ icon: _jsx(IconDownload, {}),
522
671
  disabled: fromDTD?.perm?.canRetrieveFile !== AccessLevels.Yes,
523
- text: SDKUI_Localizator.DownloadFile,
672
+ name: SDKUI_Localizator.DownloadFile,
524
673
  onClick: async () => await downloadDcmtsAsync(getDcmts(), DownloadTypes.Dcmt, "download", undefined, undefined, true)
525
674
  }, {
526
- icon: svgToString(_jsx(IconDownload, {})),
527
- operationType: 'singleRow',
675
+ icon: _jsx(IconDownload, {}),
528
676
  disabled: !isXMLFileExt(currentDcmt?.fileExt),
529
- text: SDKUI_Localizator.DownloadXMLAttachments,
677
+ name: SDKUI_Localizator.DownloadXMLAttachments,
530
678
  onClick: async () => await downloadDcmtsAsync(getDcmts(), DownloadTypes.Attachment, "download", undefined, openConfirmAttachmentsDialog, true)
531
679
  });
532
680
  if (layoutMode === LayoutModes.Update && DID) {
533
681
  operationsItems.push({
534
- icon: svgToString(_jsx(IconStar, {})),
535
- text: SDKUI_Localizator.AddTo + ' ' + SDKUI_Localizator.Favorites,
536
- operationType: 'singleRow',
682
+ icon: _jsx(IconStar, {}),
683
+ name: SDKUI_Localizator.AddTo + ' ' + SDKUI_Localizator.Favorites,
537
684
  disabled: false,
538
685
  onClick: async () => {
539
686
  await runOperationAsync(getDcmts(), DcmtOperationTypes.AddToFavs);
@@ -542,17 +689,17 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
542
689
  }
543
690
  if (onTaskCreateRequest && layoutMode === LayoutModes.Update && DID) {
544
691
  operationsItems.push({
545
- icon: svgToString(_jsx(IconActivity, {})),
546
- text: SDKUI_Localizator.CreateContextualTask,
547
- operationType: 'singleRow',
692
+ icon: _jsx(IconActivity, {}),
693
+ name: SDKUI_Localizator.CreateContextualTask,
548
694
  disabled: false,
549
695
  onClick: () => {
550
696
  const dcmt = getDcmts()[0];
697
+ const name = `${fromDTD?.name ?? '-'} (DID: ${dcmt.DID})`;
551
698
  const taskContext = {
552
699
  document: {
553
700
  tid: dcmt.TID,
554
701
  did: dcmt.DID,
555
- name: fromDTD?.description || ''
702
+ name: name
556
703
  }
557
704
  };
558
705
  onTaskCreateRequest(taskContext);
@@ -561,76 +708,106 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
561
708
  }
562
709
  if (operationsItems.length > 0) {
563
710
  items.push({
564
- icon: svgToString(_jsx(IconCheck, {})),
565
- text: SDKUI_Localizator.DocumentOperations,
566
- items: operationsItems
711
+ icon: _jsx(IconCheck, {}),
712
+ name: SDKUI_Localizator.DocumentOperations,
713
+ submenu: operationsItems
714
+ });
715
+ }
716
+ if (fromDTD?.id !== SystemTIDs.Drafts) {
717
+ // Check in/Check out menu
718
+ const { cicoEnabled, checkoutStatus } = getDcmtCicoStatus(formData, allUsers, fromDTD);
719
+ items.push({
720
+ icon: _jsx(IconFileDots, {}),
721
+ name: "Check in/Check out",
722
+ disabled: false,
723
+ submenu: [
724
+ {
725
+ name: 'Check out',
726
+ disabled: !cicoEnabled || checkoutStatus.isCheckedOut,
727
+ onClick: () => handleCheckOutOperationCallback(true),
728
+ },
729
+ {
730
+ name: 'Check in',
731
+ onClick: () => handleCheckInOperationCallback(),
732
+ disabled: !cicoEnabled || !checkoutStatus.isCheckedOut || checkoutStatus.mode === 'lockMode'
733
+ },
734
+ {
735
+ name: SDKUI_Localizator.CancelCheckOut,
736
+ disabled: !cicoEnabled || !checkoutStatus.isCheckedOut || checkoutStatus.mode === 'lockMode',
737
+ onClick: () => handleCheckOutOperationCallback(false),
738
+ },
739
+ {
740
+ name: SDKUI_Localizator.CheckoutInfo,
741
+ onClick: showCheckoutInformationFormCallback,
742
+ disabled: !checkoutStatus.isCheckedOut
743
+ },
744
+ {
745
+ name: SDKUI_Localizator.CopyCheckoutPath,
746
+ onClick: copyCheckoutPathToClipboardOperationCallback,
747
+ disabled: !checkoutStatus.isCheckedOut
748
+ },
749
+ {
750
+ name: SDKUI_Localizator.History,
751
+ disabled: !cicoEnabled,
752
+ onClick: showHistoryCallback,
753
+ },
754
+ ]
567
755
  });
568
756
  }
569
757
  if (allowRelations && layoutMode === LayoutModes.Update && DID) {
570
758
  const relationsItems = [
571
759
  {
572
- icon: svgToString(_jsx(IconPair, {})),
573
- text: SDKUI_Localizator.MatchManyDocumentsManyToMany,
574
- operationType: 'singleRow',
760
+ icon: _jsx(IconPair, {}),
761
+ name: SDKUI_Localizator.MatchManyDocumentsManyToMany,
575
762
  disabled: !hasManyToManyRelation,
576
763
  onClick: async () => await pairManyToMany?.(true)
577
764
  },
578
765
  {
579
- icon: svgToString(_jsx(IconUnpair, {})),
580
- text: SDKUI_Localizator.UnmatchManyDocumentsManyToMany,
581
- operationType: 'singleRow',
766
+ icon: _jsx(IconUnpair, {}),
767
+ name: SDKUI_Localizator.UnmatchManyDocumentsManyToMany,
582
768
  disabled: !hasManyToManyRelation,
583
769
  onClick: async () => await pairManyToMany?.(false)
584
770
  },
585
771
  {
586
- icon: svgToString(_jsx(IconArchiveMaster, {})),
587
- text: SDKUI_Localizator.ArchiveMasterDocument,
588
- operationType: 'singleRow',
589
- beginGroup: true,
772
+ icon: _jsx(IconArchiveMaster, {}),
773
+ name: SDKUI_Localizator.ArchiveMasterDocument,
590
774
  disabled: canArchiveMasterRelation !== true,
591
775
  onClick: async () => { if (TID)
592
776
  await archiveMasterDocuments?.(TID); }
593
777
  },
594
778
  {
595
- icon: svgToString(_jsx(IconArchiveDetail, {})),
596
- text: SDKUI_Localizator.ArchiveDetailDocument,
597
- operationType: 'singleRow',
779
+ icon: _jsx(IconArchiveDetail, {}),
780
+ name: SDKUI_Localizator.ArchiveDetailDocument,
598
781
  disabled: canArchiveDetailRelation !== true,
599
782
  onClick: async () => { if (TID)
600
783
  await archiveDetailDocuments?.(TID); }
601
784
  },
602
785
  {
603
- icon: svgToString(_jsx(IconDetailDcmts, { transform: 'scale(-1, 1)' })),
604
- text: SDKUI_Localizator.DcmtsMaster,
605
- operationType: 'singleRow',
606
- visible: true,
607
- beginGroup: true,
786
+ icon: _jsx(IconDetailDcmts, { transform: 'scale(-1, 1)' }),
787
+ name: SDKUI_Localizator.DcmtsMaster,
608
788
  disabled: !currentTIDHasMasterRelations || isMasterDisabled,
609
789
  onClick: () => { if (!isMasterDisabled)
610
790
  setIsOpenMaster(!isOpenMaster); }
611
791
  },
612
792
  {
613
- icon: svgToString(_jsx(IconDetailDcmts, {})),
614
- text: SDKUI_Localizator.DcmtsDetail,
615
- operationType: 'singleRow',
793
+ icon: _jsx(IconDetailDcmts, {}),
794
+ name: SDKUI_Localizator.DcmtsDetail,
616
795
  disabled: !currentTIDHasDetailRelations || isDetailsDisabled,
617
- visible: true,
618
796
  onClick: () => { if (!isDetailsDisabled)
619
797
  setIsOpenDetails(!isOpenDetails); }
620
798
  }
621
799
  ];
622
800
  items.push({
623
- icon: svgToString(_jsx(IconRelation, {})),
624
- text: SDKUI_Localizator.Relations,
625
- items: relationsItems
801
+ icon: _jsx(IconRelation, {}),
802
+ name: SDKUI_Localizator.Relations,
803
+ submenu: relationsItems
626
804
  });
627
805
  }
628
806
  if (layoutMode === LayoutModes.Update && DID) {
629
807
  const fullTextItems = [
630
808
  {
631
- icon: svgToString(_jsx(IconInfo, {})),
632
- text: SDKUI_Localizator.IndexingInformation,
633
- operationType: 'singleRow',
809
+ icon: _jsx(IconInfo, {}),
810
+ name: SDKUI_Localizator.IndexingInformation,
634
811
  disabled: false,
635
812
  onClick: async () => {
636
813
  try {
@@ -648,18 +825,16 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
648
825
  }
649
826
  },
650
827
  {
651
- icon: svgToString(_jsx(IconArchiveDoc, {})),
652
- text: SDKUI_Localizator.IndexOrReindex,
653
- operationType: 'singleRow',
828
+ icon: _jsx(IconArchiveDoc, {}),
829
+ name: SDKUI_Localizator.IndexOrReindex,
654
830
  disabled: false,
655
831
  onClick: async () => {
656
832
  await runOperationAsync(getDcmts(), DcmtOperationTypes.FreeSearchReindex);
657
833
  }
658
834
  },
659
835
  {
660
- icon: svgToString(_jsx(IconDelete, {})),
661
- text: SDKUI_Localizator.IndexingDelete,
662
- operationType: 'singleRow',
836
+ icon: _jsx(IconDelete, {}),
837
+ name: SDKUI_Localizator.IndexingDelete,
663
838
  disabled: false,
664
839
  onClick: async () => {
665
840
  await runOperationAsync(getDcmts(), DcmtOperationTypes.FreeSearchPurge);
@@ -667,9 +842,9 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
667
842
  }
668
843
  ];
669
844
  items.push({
670
- icon: svgToString(_jsx(IconSearch, {})),
671
- text: SDKUI_Localizator.FullTextSearch,
672
- items: fullTextItems
845
+ icon: _jsx(IconSearch, {}),
846
+ name: SDKUI_Localizator.FullTextSearch,
847
+ submenu: fullTextItems
673
848
  });
674
849
  }
675
850
  // Aggiungi submenu "Bottoni personalizzati" se esistono customButtons
@@ -677,18 +852,19 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
677
852
  const customButtonsItems = customButtonsLayout.customButtons
678
853
  .filter((customButton) => customButton.isForUpdate && customButton.isForUpdate > 0)
679
854
  .map((customButton) => ({
680
- icon: svgToString(TMImageLibrary({ imageID: customButton.glyphID, showPath: true })),
681
- text: customButton.title || 'Bottone personalizzato',
855
+ icon: TMImageLibrary({ imageID: customButton.glyphID }),
856
+ name: customButton.title || 'Bottone personalizzato',
682
857
  onClick: () => setCustomButton(customButton)
683
858
  }));
684
- items.push({
685
- icon: svgToString(_jsx(IconCheck, {})),
686
- text: SDKUI_Localizator.CustomButtons,
687
- items: customButtonsItems
859
+ customButtonsItems && customButtonsItems.length > 0 && items.push({
860
+ icon: _jsx(IconCustom, {}),
861
+ name: SDKUI_Localizator.CustomButtons,
862
+ submenu: customButtonsItems
688
863
  });
689
864
  }
690
865
  return items;
691
866
  }, [
867
+ fromDTD?.id,
692
868
  fromDTD?.perm?.canRetrieveFile,
693
869
  fromDTD?.description,
694
870
  currentDcmt?.fileExt,
@@ -714,8 +890,9 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
714
890
  openConfirmAttachmentsDialog
715
891
  ]);
716
892
  const isModified = useMemo(() => calcIsModified(formData, formDataOrig), [formData, formDataOrig]);
717
- 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 &&
718
- _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]);
893
+ 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 &&
894
+ _jsx(ContextMenu, { items: commandsMenuItems, trigger: "left", children: _jsx(IconMenuVertical, { color: 'white', cursor: 'pointer' }) }), layoutMode === LayoutModes.Ark &&
895
+ _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]);
719
896
  const handleUndo = useCallback(() => {
720
897
  setFormData(structuredClone(formDataOrig));
721
898
  }, [formDataOrig]);
@@ -731,6 +908,60 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
731
908
  },
732
909
  });
733
910
  }, [isModal, id, layoutMode]);
911
+ // Funzione helper per ottenere e aggiornare i metadati con gestione errori centralizzata
912
+ const refreshMetadataAsync = useCallback(async () => {
913
+ let metadataResult = undefined;
914
+ let hasGetMetadataError = false;
915
+ try {
916
+ metadataResult = await SDK_Globals.tmSession?.NewSearchEngine().GetMetadataAsync(TID, DID, true);
917
+ }
918
+ catch (metadataError) {
919
+ hasGetMetadataError = true;
920
+ // Estrai ErrorCode dal campo detail se disponibile
921
+ let errorCode = undefined;
922
+ if (metadataError?.isApiException && metadataError?.response?.detail) {
923
+ try {
924
+ const detailObj = JSON.parse(metadataError.response.detail);
925
+ errorCode = detailObj?.ErrorCode;
926
+ }
927
+ catch (parseError) {
928
+ console.log("Impossibile parsare il detail dell'eccezione:", parseError);
929
+ }
930
+ }
931
+ // Se ErrorCode è -5, mostra messaggio personalizzato, altrimenti mostra l'eccezione originale
932
+ if (errorCode === -5) {
933
+ TMMessageBoxManager.show({
934
+ message: SDKUI_Localizator.DcmtOutOfView,
935
+ buttons: [ButtonNames.OK],
936
+ });
937
+ }
938
+ else {
939
+ TMExceptionBoxManager.show({ exception: metadataError });
940
+ }
941
+ // Usa null per indicare al callback che c'è stato un errore e non deve ritentare
942
+ metadataResult = null;
943
+ }
944
+ // Aggiorna i metadati locali solo se non ci sono stati errori
945
+ if (!hasGetMetadataError && metadataResult && metadataResult !== null) {
946
+ await setMetadataList(fromDTDRef.current?.metadata ?? [], metadataResult);
947
+ }
948
+ return { success: !hasGetMetadataError, result: metadataResult };
949
+ }, [TID, DID, setMetadataList]);
950
+ const updateCurrentDcmt = useCallback(async () => {
951
+ try {
952
+ TMSpinner.show({ description: 'Aggiornamento in corso...' });
953
+ const { success, result: metadataResult } = await refreshMetadataAsync();
954
+ if (!success)
955
+ onClose?.();
956
+ await onSavedAsyncCallback?.(TID, DID, metadataResult === null ? null : metadataResult);
957
+ }
958
+ catch (e) {
959
+ TMExceptionBoxManager.show({ exception: e });
960
+ }
961
+ finally {
962
+ TMSpinner.hide();
963
+ }
964
+ }, [refreshMetadataAsync, onClose]);
734
965
  const handleSave = useCallback(async () => {
735
966
  const ue = new UpdateEngineByID(SDK_Globals.tmSession);
736
967
  ue.DID = DID;
@@ -767,55 +998,20 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
767
998
  const savedFormData = structuredClone(formDataRef.current);
768
999
  setFormDataOrig(savedFormData);
769
1000
  formDataOrigRef.current = savedFormData;
770
- // Tenta di ottenere i metadati aggiornati
771
- let metadataResult = undefined;
772
- let hasGetMetadataError = false;
773
- try {
774
- metadataResult = await SDK_Globals.tmSession?.NewSearchEngine().GetMetadataAsync(TID, DID, true);
775
- }
776
- catch (metadataError) {
777
- hasGetMetadataError = true;
778
- // Estrai ErrorCode dal campo detail se disponibile
779
- let errorCode = undefined;
780
- if (metadataError?.isApiException && metadataError?.response?.detail) {
781
- try {
782
- const detailObj = JSON.parse(metadataError.response.detail);
783
- errorCode = detailObj?.ErrorCode;
784
- }
785
- catch (parseError) {
786
- console.log("Impossibile parsare il detail dell'eccezione:", parseError);
787
- }
788
- }
789
- // Se ErrorCode è -5, mostra messaggio personalizzato, altrimenti mostra l'eccezione originale
790
- if (errorCode === -5) {
791
- TMMessageBoxManager.show({
792
- message: SDKUI_Localizator.DcmtOutOfView,
793
- buttons: [ButtonNames.OK],
794
- });
795
- }
796
- else {
797
- TMExceptionBoxManager.show({ exception: metadataError });
798
- }
799
- // Usa null per indicare al callback che c'è stato un errore e non deve ritentare
800
- metadataResult = null;
801
- }
1001
+ // Usa la funzione helper per ottenere i metadati aggiornati
1002
+ const { success, result: metadataResult } = await refreshMetadataAsync();
802
1003
  // Esegui sempre il callback:
803
1004
  // - Se metadataResult è un oggetto: refresh normale
804
1005
  // - Se metadataResult è null: GetMetadataAsync fallito, rimuove il documento dalla griglia senza ritentare
805
1006
  // - Se metadataResult è undefined: nessun parametro passato, il callback può decidere cosa fare
806
1007
  await onSavedAsyncCallback?.(TID, DID, metadataResult === null ? null : metadataResult);
807
1008
  // Mostra messaggio di successo solo se non ci sono stati errori critici
808
- if (!hasGetMetadataError) {
809
- if (metadataResult && metadataResult !== null) {
810
- // Usa fromDTDRef.current invece di fromDTD per evitare stale closure.
811
- // fromDTD potrebbe essere undefined/vuoto nel callback se lo stato è cambiato,
812
- // mentre fromDTDRef.current contiene sempre il valore corrente sincronizzato tramite useEffect.
813
- await setMetadataList(fromDTDRef.current?.metadata ?? [], metadataResult);
814
- }
1009
+ if (success) {
815
1010
  ShowAlert({ mode: 'success', title: 'Form di documento', message: 'Le modifiche sono state salvate con successo', duration: 3000 });
816
1011
  }
817
- else
1012
+ else {
818
1013
  onClose?.();
1014
+ }
819
1015
  }
820
1016
  catch (e) {
821
1017
  TMExceptionBoxManager.show({ exception: e });
@@ -823,7 +1019,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
823
1019
  finally {
824
1020
  TMSpinner.hide();
825
1021
  }
826
- }, [DID, TID, getSpecificChangedKeysWithValues, onSavedAsyncCallback, onClose, setMetadataList]);
1022
+ }, [DID, TID, getSpecificChangedKeysWithValues, refreshMetadataAsync, onSavedAsyncCallback, onClose]);
827
1023
  const handleArchiveCompleted = useCallback(async () => {
828
1024
  let firstBlock = true;
829
1025
  let maxFileSize = 0;
@@ -1012,28 +1208,34 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1012
1208
  await triggerBlogRefresh();
1013
1209
  }
1014
1210
  }, [TID, DID, triggerBlogRefresh]);
1211
+ const checkoutBadge = useMemo(() => {
1212
+ const { cicoEnabled, checkoutStatus } = getDcmtCicoStatus(formData, allUsers, fromDTD);
1213
+ if (!cicoEnabled || !checkoutStatus.isCheckedOut)
1214
+ return null;
1215
+ return (_jsx(Ribbon, { "$isMobile": isMobile, children: _jsx(TMTooltip, { content: checkoutStatus.editLockTooltipText, position: "right", children: _jsx("span", { children: checkoutStatus.mode === 'editMode' ? SDKUI_Localizator.CheckOut : 'Locked' }) }) }));
1216
+ }, [formData, fromDTD, isMobile]);
1015
1217
  const tmDcmtForm = useMemo(() => {
1016
- return _jsx(_Fragment, { children: metadataValuesSource.length > 0 &&
1017
- _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) => {
1018
- setFormData((prevItems) => prevItems.map((item) => {
1019
- const newItem = newItems.find((newItem) => newItem.tid === item.tid && newItem.mid === item.mid);
1020
- return newItem ? { ...item, ...newItem } : item;
1021
- }));
1022
- }, onAdvancedMenuClick: (e) => {
1023
- switch (e.button) {
1024
- case AdvancedMenuButtons.DistinctValues:
1025
- setIsOpenDistinctValues(!isOpenDistinctValues);
1026
- break;
1027
- case AdvancedMenuButtons.FormulaEditor:
1028
- setIsOpenFormulaEditor(!isOpenFormulaEditor);
1029
- break;
1030
- }
1031
- } }), _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 })] }) :
1032
- _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 &&
1033
- !isApprView &&
1034
- TID !== SystemTIDs.Drafts &&
1035
- !shouldShowAll &&
1036
- _jsx(TMShowAllOrMaxItemsButton, { showAll: showAll, dataSourceLength: totalItems, onClick: () => { setShowAll(!showAll); } })] }), _jsx(ConfirmAttachmentsDialog, {})] }) });
1218
+ 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) => {
1220
+ setFormData((prevItems) => prevItems.map((item) => {
1221
+ const newItem = newItems.find((newItem) => newItem.tid === item.tid && newItem.mid === item.mid);
1222
+ return newItem ? { ...item, ...newItem } : item;
1223
+ }));
1224
+ }, onAdvancedMenuClick: (e) => {
1225
+ switch (e.button) {
1226
+ case AdvancedMenuButtons.DistinctValues:
1227
+ setIsOpenDistinctValues(!isOpenDistinctValues);
1228
+ break;
1229
+ case AdvancedMenuButtons.FormulaEditor:
1230
+ setIsOpenFormulaEditor(!isOpenFormulaEditor);
1231
+ break;
1232
+ }
1233
+ } }), _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 })] }) :
1234
+ _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 &&
1235
+ !isApprView &&
1236
+ TID !== SystemTIDs.Drafts &&
1237
+ !shouldShowAll &&
1238
+ _jsx(TMShowAllOrMaxItemsButton, { showAll: showAll, dataSourceLength: totalItems, onClick: () => { setShowAll(!showAll); } })] }), _jsx(ConfirmAttachmentsDialog, {})] })] });
1037
1239
  }, [
1038
1240
  TID,
1039
1241
  DID,
@@ -1059,13 +1261,14 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1059
1261
  showAll,
1060
1262
  handleConfirmAction,
1061
1263
  handleUndo,
1062
- handleClearForm
1264
+ handleClearForm,
1265
+ metadataDcmtOrigin
1063
1266
  ]);
1064
- 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]);
1065
- 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]);
1267
+ 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
+ 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, isReadOnlyOrigin: metadataDcmtOrigin?.fromTID?.toString() !== TID?.toString() }), [TID, layoutMode, formData, deviceType, inputMids, metadataDcmtOrigin]);
1066
1269
  const tmDcmtPreview = useMemo(() => _jsx(TMDcmtPreviewWrapper, { currentDcmt: currentDcmt, dcmtFile: dcmtFile ?? inputFile, deviceType: deviceType, fromDTD: fromDTD, layoutMode: layoutMode, onFileUpload: (file) => {
1067
1270
  setDcmtFile(file);
1068
- }, enableDragDropOverlay: enableDragDropOverlay }), [currentDcmt, dcmtFile, deviceType, fromDTD, layoutMode, inputFile, enableDragDropOverlay, setDcmtFile]);
1271
+ }, enableDragDropOverlay: enableDragDropOverlay }, refreshPreviewTrigger), [currentDcmt, dcmtFile, deviceType, fromDTD, layoutMode, inputFile, enableDragDropOverlay, setDcmtFile]);
1069
1272
  const tmWF = useMemo(() => {
1070
1273
  if (isWFDataLoading) {
1071
1274
  return (_jsx("div", { style: {
@@ -1080,7 +1283,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1080
1283
  const isAuthorized = !!workflows?.[0]?.diagram;
1081
1284
  return (_jsxs("div", { style: { position: 'relative', width: '100%', height: '100%', display: 'flex', flexDirection: 'column', gap: 3 }, children: [workItems.length > 0
1082
1285
  ? (isAuthorized
1083
- ? _jsx(WFDiagram, { xmlDiagramString: workflows?.[0]?.diagram || '', allowEdit: false, currentSetID: workitemSetID })
1286
+ ? _jsx(WFDiagram, { xmlDiagramString: workflows?.[0]?.diagram || '', allowEdit: false, currentSetID: workitemSetID, defaultAutoZoom: true, workitems: workItemsForDiagram })
1084
1287
  : _jsx("div", { style: {
1085
1288
  position: 'absolute',
1086
1289
  top: '50%',
@@ -1089,7 +1292,27 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1089
1292
  fontSize: '1.1rem',
1090
1293
  color: TMColors.primaryColor,
1091
1294
  textAlign: 'center',
1092
- }, children: SDKUI_Localizator.WorkflowDiagramNotAuthorized }))
1295
+ display: 'flex',
1296
+ flexDirection: 'column',
1297
+ alignItems: 'center',
1298
+ gap: '12px',
1299
+ }, 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: () => {
1300
+ TMMessageBoxManager.show({
1301
+ title: 'Dettagli Errore Workflow',
1302
+ initialWidth: !isMobile ? '700px' : undefined,
1303
+ message: (_jsx("pre", { style: {
1304
+ whiteSpace: 'pre-wrap',
1305
+ background: '#f5f5f5',
1306
+ padding: '12px',
1307
+ borderRadius: '6px',
1308
+ userSelect: 'text',
1309
+ cursor: 'text',
1310
+ }, children: wfError })),
1311
+ resizable: true,
1312
+ showToppy: false,
1313
+ buttons: [ButtonNames.OK],
1314
+ });
1315
+ } }) }))] }) }))
1093
1316
  : _jsx("div", { style: {
1094
1317
  position: 'absolute',
1095
1318
  top: '50%',
@@ -1104,7 +1327,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1104
1327
  backgroundColor: 'khaki',
1105
1328
  borderRadius: 8
1106
1329
  }, children: SDKUI_Localizator.WorkItemTechnicalNote_SetID })] }));
1107
- }, [workflows, formData, workitemSetID, workItems, isWFDataLoading]);
1330
+ }, [workflows, formData, workitemSetID, workItems, workItemsForDiagram, isWFDataLoading, wfError, isMobile]);
1108
1331
  const tmDcmtTasks = useMemo(() => {
1109
1332
  const isReady = TID && DID && getAllTasks && deleteTaskByIdsCallback && addTaskCallback && editTaskCallback;
1110
1333
  if (!isReady) {
@@ -1135,89 +1358,117 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1135
1358
  'tmWF': false,
1136
1359
  'tmDcmtTasks': false,
1137
1360
  };
1138
- const initialPanels = useMemo(() => [
1139
- {
1140
- id: 'tmDcmtForm',
1141
- name: SDK_Localizator.Metadatas,
1142
- contentOptions: {
1143
- component: tmDcmtForm,
1144
- isClosable: isClosable,
1145
- panelContainer: {
1146
- showHeader: showHeader,
1147
- title: fromDTD?.nameLoc,
1148
- allowMaximize: !isMobile,
1149
- onBack: showBackButton ? (isClosable && deviceType !== DeviceType.MOBILE) ? undefined : handleClose : undefined,
1150
- onClose: isClosable ? () => { } : undefined,
1151
- toolbar: allowNavigation ? formToolbar : _jsx(_Fragment, {})
1361
+ const getDcmtTasksCounter = (TID, DID, allTasks) => {
1362
+ if (!TID || !DID || !allTasks || allTasks.length === 0) {
1363
+ return {
1364
+ assignedToMe: 0,
1365
+ assignedByMe: 0
1366
+ };
1367
+ }
1368
+ try {
1369
+ const assignedToMe = getTaskAssignedToMe(allTasks).filter(task => task.iD1?.toString() === TID.toString() && task.iD2?.toString() === DID.toString() && task.state !== Task_States.Completed).length ?? 0;
1370
+ const assignedByMe = getTaskAssignedByMe(allTasks).filter(task => task.iD1?.toString() === TID.toString() && task.iD2?.toString() === DID.toString() && task.state !== Task_States.Completed).length ?? 0;
1371
+ return {
1372
+ assignedToMe,
1373
+ assignedByMe
1374
+ };
1375
+ }
1376
+ catch (error) {
1377
+ return {
1378
+ assignedToMe: 0,
1379
+ assignedByMe: 0
1380
+ };
1381
+ }
1382
+ };
1383
+ const initialPanels = useMemo(() => {
1384
+ const { assignedToMe, assignedByMe } = getDcmtTasksCounter(TID, DID, allTasks);
1385
+ let titleDcmtFormPanel = fromDTD?.nameLoc ?? "";
1386
+ // Caso: Il documento proviene da un'origine esterna
1387
+ if (metadataDcmtOrigin?.fromTID?.toString() !== TID?.toString()) {
1388
+ 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
+ }
1390
+ const panels = [
1391
+ {
1392
+ id: 'tmDcmtForm',
1393
+ name: SDK_Localizator.Metadatas,
1394
+ contentOptions: {
1395
+ component: tmDcmtForm,
1396
+ isClosable: isClosable,
1397
+ panelContainer: {
1398
+ showHeader: showHeader,
1399
+ title: titleDcmtFormPanel,
1400
+ allowMaximize: !isMobile,
1401
+ onBack: showBackButton ? (isClosable && deviceType !== DeviceType.MOBILE) ? undefined : handleClose : undefined,
1402
+ onClose: isClosable ? () => { } : undefined,
1403
+ toolbar: allowNavigation ? formToolbar : _jsx(_Fragment, {})
1404
+ },
1152
1405
  },
1406
+ toolbarOptions: {
1407
+ icon: _jsx(IconPreview, { fontSize: 24 }),
1408
+ visible: true,
1409
+ orderNumber: 1,
1410
+ isActive: allInitialPanelVisibility['tmDcmtForm']
1411
+ }
1153
1412
  },
1154
- toolbarOptions: {
1155
- icon: _jsx(IconPreview, { fontSize: 24 }),
1156
- visible: true,
1157
- orderNumber: 1,
1158
- isActive: allInitialPanelVisibility['tmDcmtForm']
1159
- }
1160
- },
1161
- {
1162
- id: 'tmBlog',
1163
- name: SDKUI_Localizator.BlogCase,
1164
- contentOptions: { component: tmBlog, panelContainer: { title: SDKUI_Localizator.BlogCase, allowMaximize: !isMobile } },
1165
- toolbarOptions: {
1166
- icon: _jsx(IconBoard, { fontSize: 24 }),
1167
- visible: true,
1168
- disabled: isBoardDisabled,
1169
- orderNumber: 2,
1170
- isActive: allInitialPanelVisibility['tmBlog']
1171
- }
1172
- },
1173
- {
1174
- id: 'tmSysMetadata',
1175
- name: SDKUI_Localizator.MetadataSystem,
1176
- contentOptions: { component: tmSysMetadata, panelContainer: { title: SDKUI_Localizator.MetadataSystem, allowMaximize: !isMobile } },
1177
- toolbarOptions: { icon: _jsx(IconDcmtTypeSys, { fontSize: 24 }), visible: true, disabled: isSysMetadataDisabled, orderNumber: 3, isActive: allInitialPanelVisibility['tmSysMetadata'] }
1178
- },
1179
- {
1180
- id: 'tmDcmtPreview',
1181
- name: SDKUI_Localizator.PreviewDocument,
1182
- contentOptions: { component: tmDcmtPreview },
1183
- toolbarOptions: { icon: _jsx(IconShow, { fontSize: 24 }), disabled: isPreviewDisabled, visible: true, orderNumber: 4, isActive: allInitialPanelVisibility['tmDcmtPreview'] }
1184
- },
1185
- {
1186
- id: 'tmWF',
1187
- name: "Workflow",
1188
- contentOptions: {
1189
- component: tmWF,
1190
- panelContainer: {
1191
- title: "Workflow", allowMaximize: !isMobile
1413
+ {
1414
+ id: 'tmBlog',
1415
+ name: SDKUI_Localizator.BlogCase,
1416
+ contentOptions: { component: tmBlog, panelContainer: { title: SDKUI_Localizator.BlogCase, allowMaximize: !isMobile } },
1417
+ toolbarOptions: {
1418
+ icon: _jsx(IconBoard, { fontSize: 24 }),
1419
+ visible: true,
1420
+ disabled: isBoardDisabled,
1421
+ orderNumber: 2,
1422
+ isActive: allInitialPanelVisibility['tmBlog']
1192
1423
  }
1193
1424
  },
1194
- toolbarOptions: {
1195
- icon: _jsx(IconWorkflow, { fontSize: 24 }),
1196
- visible: true,
1197
- disabled: isWFDisabled,
1198
- orderNumber: 5,
1199
- isActive: allInitialPanelVisibility['tmWF']
1200
- }
1201
- },
1202
- {
1203
- id: 'tmDcmtTasks',
1204
- name: SDKUI_Localizator.Widget_Activities,
1205
- contentOptions: {
1206
- component: tmDcmtTasks,
1425
+ {
1426
+ id: 'tmSysMetadata',
1427
+ name: SDKUI_Localizator.MetadataSystem,
1428
+ 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'] }
1207
1430
  },
1208
- toolbarOptions: {
1209
- icon: _jsx(IconActivity, { fontSize: 24 }),
1210
- visible: layoutMode !== LayoutModes.Ark,
1211
- orderNumber: 6,
1212
- isActive: allInitialPanelVisibility['tmDcmtTasks'],
1213
- count: (TID && DID && allTasks && allTasks.length > 0) ?
1214
- getTaskAssignedToMe(allTasks).filter(task => task.iD1?.toString() === TID.toString()
1215
- && task.iD2?.toString() === DID.toString()
1216
- && task.state !== Task_States.Completed).length ?? 0
1217
- : 0
1218
- }
1219
- },
1220
- ], [fromDTD, showBackButton, tmDcmtForm, tmBlog, tmSysMetadata, tmDcmtPreview, tmWF, tmDcmtTasks, isPreviewDisabled, isSysMetadataDisabled, isBoardDisabled, isWFDisabled, inputFile, isClosable, allTasks, DID, TID]);
1431
+ {
1432
+ id: 'tmDcmtPreview',
1433
+ name: SDKUI_Localizator.PreviewDocument,
1434
+ contentOptions: { component: tmDcmtPreview },
1435
+ toolbarOptions: { icon: _jsx(IconShow, { fontSize: 24 }), disabled: isPreviewDisabled, visible: true, orderNumber: 4, isActive: allInitialPanelVisibility['tmDcmtPreview'] }
1436
+ },
1437
+ {
1438
+ id: 'tmWF',
1439
+ name: "Workflow",
1440
+ contentOptions: {
1441
+ component: tmWF,
1442
+ panelContainer: {
1443
+ title: "Workflow", allowMaximize: !isMobile
1444
+ }
1445
+ },
1446
+ toolbarOptions: {
1447
+ icon: _jsx(IconWorkflow, { fontSize: 24 }),
1448
+ visible: true,
1449
+ disabled: isWFDisabled,
1450
+ orderNumber: 5,
1451
+ isActive: allInitialPanelVisibility['tmWF']
1452
+ }
1453
+ },
1454
+ {
1455
+ id: 'tmDcmtTasks',
1456
+ name: SDKUI_Localizator.Widget_Activities,
1457
+ contentOptions: {
1458
+ component: tmDcmtTasks,
1459
+ },
1460
+ toolbarOptions: {
1461
+ icon: _jsx(IconActivity, { fontSize: 24 }),
1462
+ visible: layoutMode !== LayoutModes.Ark,
1463
+ orderNumber: 6,
1464
+ isActive: allInitialPanelVisibility['tmDcmtTasks'],
1465
+ count: assignedToMe + assignedByMe,
1466
+ tooltip: _jsx("div", { children: assignedToMe + assignedByMe === 0 ? (SDKUI_Localizator.Widget_Activities) : (_jsxs("div", { children: [_jsx("div", { style: { textAlign: 'center', fontWeight: 'bold' }, children: SDKUI_Localizator.Widget_Activities }), _jsxs("div", { style: { textAlign: 'left' }, children: [_jsxs("div", { children: [SDKUI_Localizator.AssignedToMe, ": ", assignedToMe] }), _jsxs("div", { children: [SDKUI_Localizator.AssignedByMe, ": ", assignedByMe] })] })] })) })
1467
+ }
1468
+ },
1469
+ ];
1470
+ return panels;
1471
+ }, [fromDTD, showBackButton, tmDcmtForm, tmBlog, tmSysMetadata, tmDcmtPreview, tmWF, tmDcmtTasks, isPreviewDisabled, isSysMetadataDisabled, isBoardDisabled, isWFDisabled, inputFile, isClosable, allTasks, DID, TID, metadataDcmtOrigin?.fromTID]);
1221
1472
  // Retrieves the current document form setting based on the normalized TID
1222
1473
  const getCurrentDcmtFormSetting = () => {
1223
1474
  const settings = SDKUI_Globals.userSettings.dcmtFormSettings;
@@ -1229,7 +1480,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1229
1480
  // Checks if there's a saved panel layout for the current context (ToDo or general)
1230
1481
  const hasSavedLayout = () => {
1231
1482
  const { setting } = getCurrentDcmtFormSetting();
1232
- if (invokedByTodo) {
1483
+ if (invocationContext === InvocationContext.Todo) {
1233
1484
  // If invoked by ToDo, check for existence of layoutToDo and that it has keys
1234
1485
  return setting.layoutToDo !== undefined && Object.keys(setting.layoutToDo).length > 0;
1235
1486
  }
@@ -1248,8 +1499,8 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1248
1499
  // Prepare the new setting object with updated layout depending on context
1249
1500
  const newSetting = {
1250
1501
  TID: normalizedTID,
1251
- layout: invokedByTodo ? (existingSetting.layout ?? {}) : state,
1252
- layoutToDo: invokedByTodo ? state : (existingSetting.layoutToDo ?? {}),
1502
+ layout: invocationContext === InvocationContext.Todo ? (existingSetting.layout ?? {}) : state,
1503
+ layoutToDo: invocationContext === InvocationContext.Todo ? state : (existingSetting.layoutToDo ?? {}),
1253
1504
  };
1254
1505
  // Replace existing setting if found, otherwise push a new one
1255
1506
  if (idx >= 0) {
@@ -1268,12 +1519,12 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1268
1519
  return undefined;
1269
1520
  const settings = getCurrentDcmtFormSetting()?.setting;
1270
1521
  // Return the appropriate layout based on context
1271
- return invokedByTodo ? settings?.layoutToDo : settings?.layout;
1522
+ return invocationContext === InvocationContext.Todo ? settings?.layoutToDo : settings?.layout;
1272
1523
  };
1273
1524
  const handleCompleteMoreInfo = useCallback(async () => {
1274
1525
  try {
1275
1526
  TMSpinner.show();
1276
- let newTask = { ...taskMoreInfo, state: Task_States.Completed };
1527
+ let newTask = { ...moreInfoTasks, state: Task_States.Completed };
1277
1528
  await SDK_Globals.tmSession?.NewTaskEngine().UpdateAsync(newTask);
1278
1529
  onTaskCompleted?.(newTask);
1279
1530
  onClose?.();
@@ -1286,7 +1537,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1286
1537
  finally {
1287
1538
  TMSpinner.hide();
1288
1539
  }
1289
- }, [taskMoreInfo, onTaskCompleted, onClose]);
1540
+ }, [moreInfoTasks, onTaskCompleted, onClose]);
1290
1541
  const handleSignApprove = useCallback(() => {
1291
1542
  if (onOpenS4TViewerRequest && TID && DID) {
1292
1543
  onOpenS4TViewerRequest([{ TID, DID }]);
@@ -1312,8 +1563,8 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1312
1563
  }, [onReferenceClick]);
1313
1564
  // Mapping for objClass specific label/action. Easy to extend for future objClass types.
1314
1565
  const referenceActionMap = useMemo(() => ({
1315
- [ObjectClasses.Dossier]: { label: 'Vai a pratica' },
1316
- [ObjectClasses.WorkingGroup]: { label: 'Vai a gruppo di lavoro' },
1566
+ [ObjectClasses.Dossier]: { label: SDKUI_Localizator.GoToDossier },
1567
+ [ObjectClasses.WorkingGroup]: { label: SDKUI_Localizator.GoToWorkgroup },
1317
1568
  // add other ObjectClasses here as needed
1318
1569
  }), []);
1319
1570
  const renderDcmtForm = () => {
@@ -1330,29 +1581,26 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1330
1581
  height: '100%',
1331
1582
  position: 'relative',
1332
1583
  overflow: 'hidden'
1333
- }, 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)
1334
- ? _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", parentId: groupId, showToolbar: showDcmtFormSidebar })
1335
- : _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 &&
1336
- _jsx(TMDistinctValues, { tid: TID, mid: focusedMetadataValue?.mid, isModal: true, showHeader: false, layoutMode: layoutMode, onSelectionChanged: (e) => {
1337
- if (!e)
1338
- return;
1339
- setFormData((prevItems) => prevItems.map((item) => item.tid == e.tid && item.mid === e.mid ? { ...item, value: e.newValue } : item));
1340
- } }), isOpenFormulaEditor &&
1341
- _jsx(TMFormulaEditor, { isModal: true, formMode: FormModes.Update, inputData: getFormula(), showBack: false, onClose: () => setIsOpenFormulaEditor(false), onApplied: (newFormula) => {
1342
- setFormData((prevItems) => prevItems.map((item) => item.tid == newFormula.tid && item.mid === newFormula.mid ? { ...item, value: FormulaHelper.addFormulaTag(newFormula.expression), isSelected: true, isEditable: true } : item));
1343
- setFocusedMetadataValue(prevState => ({
1344
- ...prevState,
1345
- isSelected: true,
1346
- isEditable: true,
1347
- value: FormulaHelper.addFormulaTag(newFormula.expression)
1348
- }));
1349
- } }), 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 ?
1584
+ }, 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)
1585
+ ? _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", parentId: groupId, showToolbar: showDcmtFormSidebar })
1586
+ : _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 &&
1587
+ _jsx(TMDistinctValues, { tid: TID, mid: focusedMetadataValue?.mid, isModal: true, showHeader: false, layoutMode: layoutMode, onClosePanelCallback: () => setIsOpenDistinctValues(false), onSelectionChanged: (e) => {
1588
+ if (!e)
1589
+ return;
1590
+ setFormData((prevItems) => prevItems.map((item) => item.tid == e.tid && item.mid === e.mid ? { ...item, value: e.newValue } : item));
1591
+ } }), isOpenFormulaEditor &&
1592
+ _jsx(TMFormulaEditor, { isModal: true, formMode: FormModes.Update, inputData: getFormula(), showBack: false, onClose: () => setIsOpenFormulaEditor(false), onApplied: (newFormula) => {
1593
+ setFormData((prevItems) => prevItems.map((item) => item.tid == newFormula.tid && item.mid === newFormula.mid ? { ...item, value: FormulaHelper.addFormulaTag(newFormula.expression), isSelected: true, isEditable: true } : item));
1594
+ setFocusedMetadataValue(prevState => ({
1595
+ ...prevState,
1596
+ isSelected: true,
1597
+ isEditable: true,
1598
+ value: FormulaHelper.addFormulaTag(newFormula.expression)
1599
+ }));
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 ?
1350
1601
  _jsx(WorkFlowOperationButtons, { deviceType: deviceType, onApprove: () => setShowApprovePopup(true), onSignApprove: handleSignApprove, onReject: () => setShowRejectPopup(true), onReAssign: () => setShowReAssignPopup(true), onMoreInfo: () => setShowMoreInfoPopup(true), dtd: fromDTD })
1351
1602
  :
1352
- _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: () => {
1353
- setShowCommentForm(true);
1354
- } })] })), (showToppyForReferences && (dcmtReferences && dcmtReferences.length > 0)) && dcmtReferences
1355
- .filter(ref => ref.objClass === ObjectClasses.Dossier || ref.objClass === ObjectClasses.WorkingGroup) // keep only known objClass types
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)
1356
1604
  .map((ref, index, arr) => {
1357
1605
  const mapEntry = referenceActionMap[String(ref.objClass)];
1358
1606
  const label = mapEntry?.label ?? 'Vai a riferimento';
@@ -1400,7 +1648,8 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1400
1648
  finally {
1401
1649
  TMSpinner.hide();
1402
1650
  }
1403
- }, 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: () => {
1651
+ }, 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) &&
1652
+ _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: () => {
1404
1653
  setIsOpenArchiveRelationForm(false);
1405
1654
  setArchiveType(undefined);
1406
1655
  setArchiveRelatedDcmtFormTID(undefined);
@@ -1411,7 +1660,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1411
1660
  setArchiveRelatedDcmtFormTID(undefined);
1412
1661
  setArchiveRelatedDcmtFormMids([]);
1413
1662
  await fetchData();
1414
- }, 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 }) }))] }));
1663
+ }, 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, toppyHelpCenterUsePortal: true }) }))] }));
1415
1664
  };
1416
1665
  export default TMDcmtForm;
1417
1666
  /**
@@ -1434,8 +1683,11 @@ const applyMetadataFilter = (data, showAll, listMaxItems, TID) => {
1434
1683
  o.mid === SystemMIDsAsNumber.FileSize ||
1435
1684
  o.mid === SystemMIDsAsNumber.LastUpdateTime ||
1436
1685
  o.mid === SystemMIDsAsNumber.CreationTime;
1686
+ const chronologySystemFilter = (o) => baseFilter(o) ||
1687
+ o.mid === SystemMIDsAsNumber.FileExt ||
1688
+ o.mid === SystemMIDsAsNumber.FileSize;
1437
1689
  // Select the appropriate filter based on document type
1438
- const currentFilter = TID === SystemTIDs.Drafts ? draftFilter : baseFilter;
1690
+ const currentFilter = TID === SystemTIDs.Drafts ? draftFilter : TID === SystemTIDs.Chronology ? chronologySystemFilter : baseFilter;
1439
1691
  // Apply filter once
1440
1692
  const filteredData = data.filter(currentFilter);
1441
1693
  // Return all filtered data or slice to max items
@@ -1489,3 +1741,35 @@ const TMDcmtPreviewWrapper = ({ currentDcmt, layoutMode, fromDTD, dcmtFile, devi
1489
1741
  _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 }) :
1490
1742
  _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 }));
1491
1743
  };
1744
+ const Ribbon = styled.div `
1745
+ font-size: 0.85rem;
1746
+ font-weight: 600;
1747
+ color: #fff;
1748
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
1749
+ --f: .4em; /* control the folded part */
1750
+ position: absolute;
1751
+ top: 2px;
1752
+ left: 2px;
1753
+ z-index: 1200;
1754
+ line-height: 1.6;
1755
+ padding-inline: 0.8lh;
1756
+ padding-bottom: var(--f);
1757
+ border-image: conic-gradient(#0008 0 0) 51%/var(--f);
1758
+ 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));
1759
+ transform: translate(calc((cos(45deg) - 1)*100%), -100%) rotate(-45deg);
1760
+ transform-origin: 100% 100%;
1761
+ background-color: rgba(217, 148, 13, 0.92);
1762
+ display: inline-block;
1763
+ padding-top: 0.1em;
1764
+ white-space: nowrap;
1765
+ transition: ${props => props.$isMobile ? 'none' : 'all 0.3s ease'};
1766
+ cursor: 'default';
1767
+
1768
+ ${props => !props.$isMobile && `
1769
+ &:hover {
1770
+ background-color: #d9940d;
1771
+ font-size: 1.1rem;
1772
+ transform: translate(calc((cos(45deg) - 1)*100%), -100%) rotate(-45deg) scale(1.05);
1773
+ }
1774
+ `}
1775
+ `;