@topconsultnpm/sdkui-react 6.20.0-dev1.12 → 6.20.0-dev1.121

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 +159 -37
  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 +610 -127
  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 +3 -1
  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 +1 -0
  63. package/lib/components/editors/TMMetadataValues.js +25 -7
  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 +459 -208
  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 +210 -250
  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 +2 -2
  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 +139 -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 +3 -1
  126. package/lib/components/query/TMQueryEditor.js +102 -100
  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 +20 -1
  141. package/lib/helper/SDKUI_Localizator.js +197 -1
  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 +131 -3
  155. package/lib/helper/index.d.ts +2 -0
  156. package/lib/helper/index.js +2 -0
  157. package/lib/helper/queryHelper.d.ts +1 -1
  158. package/lib/helper/queryHelper.js +33 -3
  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 +7 -4
  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 } from '../../../helper';
13
12
  import { hasDetailRelations, hasMasterRelations, isXMLFileExt } from '../../../helper/dcmtsHelper';
14
13
  import { Gutters, TMColors } from '../../../utils/theme';
15
14
  import { StyledFormButtonsContainer, StyledLoadingContainer, StyledModalContainer, StyledReferenceButton, StyledSpinner, StyledToolbarCardContainer } from '../../base/Styled';
@@ -41,10 +40,31 @@ import TMDcmtTasks from './TMDcmtTasks';
41
40
  import TMToppyMessage from '../../../helper/TMToppyMessage';
42
41
  import { getTaskAssignedToMe } from '../tasks/TMTasksUtils';
43
42
  import TMCustomButton from '../../base/TMCustomButton';
44
- import ToppyDraggableHelpCenter from '../assistant/ToppyDraggableHelpCenter';
43
+ import { useCheckInOutOperations } from '../../../hooks/useCheckInOutOperations';
44
+ import TMViewHistoryDcmt from '../search/TMViewHistoryDcmt';
45
+ import TMDcmtCheckoutInfoForm from '../search/TMDcmtCheckoutInfoForm';
46
+ import styled from 'styled-components';
47
+ import { ContextMenu } from '../../NewComponents/ContextMenu';
48
+ import TMToppyDraggableHelpCenter from '../assistant/TMToppyDraggableHelpCenter';
49
+ //#region Interfaces, Types and Enums
50
+ /**
51
+ * Definisce il contesto da cui è stato invocato il TMDcmtForm.
52
+ * Permette di gestire logiche diverse in base alla provenienza.
53
+ */
54
+ export var InvocationContext;
55
+ (function (InvocationContext) {
56
+ /** Invocazione standard */
57
+ InvocationContext["Default"] = "default";
58
+ /** Invocato dalla pagina Todo/Task */
59
+ InvocationContext["Todo"] = "todo";
60
+ /** Invocato dalla pagina WorkflowCtrl */
61
+ InvocationContext["WorkflowCtrl"] = "workflowCtrl";
62
+ // Aggiungi qui altri contesti futuri secondo necessità
63
+ })(InvocationContext || (InvocationContext = {}));
45
64
  let abortControllerLocal = new AbortController();
46
65
  //#endregion
47
- const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, handleNavigateToWGs, handleNavigateToDossiers, showHeader = true, onSaveRecents, layoutMode = LayoutModes.Update, showBackButton = true, onClose, onSavedAsyncCallback, TID, DID, formMode = FormModes.Update, canNext, canPrev, count, itemIndex, onNext, onPrev, allowNavigation = true, allowRelations = true, isClosable = false, isExpertMode = SDKUI_Globals.userSettings.advancedSettings.expertMode === 1, showDcmtFormSidebar = true, invokedByTodo = false, titleModal, isModal = false, widthModal = "100%", heightModal = "100%", groupId, onWFOperationCompleted, onTaskCompleted, onTaskCreateRequest, inputFile = null, taskFormDialogComponent, taskMoreInfo, connectorFileSave = undefined, inputMids = [], openS4TViewer = false, onOpenS4TViewerRequest, s4TViewerDialogComponent, enableDragDropOverlay = false, passToSearch, isSharedDcmt = false, sharedSourceTID, sharedSourceDID, allowButtonsRefs = false, onReferenceClick, }) => {
66
+ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, handleNavigateToWGs, handleNavigateToDossiers, showHeader = true, onSaveRecents, layoutMode = LayoutModes.Update, showBackButton = true, onClose, onSavedAsyncCallback, TID, DID, formMode = FormModes.Update, canNext, canPrev, count, itemIndex, onNext, onPrev, allowNavigation = true, allowRelations = true, isClosable = false, isExpertMode = SDKUI_Globals.userSettings.advancedSettings.expertMode === 1, showDcmtFormSidebar = true, invocationContext = InvocationContext.Default, titleModal, isModal = false, widthModal = "100%", heightModal = "100%", groupId, onWFOperationCompleted, onTaskCompleted, onTaskCreateRequest, inputFile = null, taskFormDialogComponent, moreInfoTasks, connectorFileSave = undefined, inputMids = [], openS4TViewer = false, onOpenS4TViewerRequest, s4TViewerDialogComponent, enableDragDropOverlay = false, passToSearch, isSharedDcmt = false, sharedSourceTID, sharedSourceDID, allowButtonsRefs = false, onReferenceClick, }) => {
67
+ const { showHistory, showHistoryCallback, hideHistoryCallback, showCheckoutInformationForm, commentFormState, hideCommentFormCallback, showCheckoutInformationFormCallback, hideCheckoutInformationFormCallback, copyCheckoutPathToClipboardCallback, handleCheckOutCallback, handleCheckInCallback, refreshPreviewTrigger, showCicoWaitPanel, cicoWaitPanelTitle, showCicoPrimaryProgress, cicoPrimaryProgressText, cicoPrimaryProgressValue, cicoPrimaryProgressMax, } = useCheckInOutOperations();
48
68
  const [id, setID] = useState('');
49
69
  const [showWaitPanelLocal, setShowWaitPanelLocal] = useState(false);
50
70
  const [waitPanelTitleLocal, setWaitPanelTitleLocal] = useState('');
@@ -68,6 +88,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
68
88
  const [layout, setLayout] = useState();
69
89
  const [customButtonsLayout, setCustomButtonsLayout] = useState();
70
90
  const [customButton, setCustomButton] = useState();
91
+ const [allUsers, setAllUsers] = useState([]);
71
92
  const appliedInputMidsRef = useRef(null);
72
93
  // Refs per evitare stale closure nei callback
73
94
  // I useCallback catturano i valori delle dipendenze al momento della creazione.
@@ -91,6 +112,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
91
112
  const [fetchError, setFetchError] = useState(false);
92
113
  const [isWFDataLoading, setIsWFDataLoading] = useState(false);
93
114
  const [workItems, setWorkItems] = useState([]);
115
+ const [workItemsForDiagram, setWorkItemsForDiagram] = useState([]);
94
116
  const [workflows, setWorkflows] = useState([]);
95
117
  const [showCommentForm, setShowCommentForm] = useState(false);
96
118
  const [isInitialLoading, setIsInitialLoading] = useState(true);
@@ -98,16 +120,24 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
98
120
  const [dcmtReferences, setDcmtReferences] = useState(undefined);
99
121
  // Stato per triggerare il refresh del blog dall'esterno
100
122
  const [refreshBlogTrigger, setRefreshBlogTrigger] = useState(0);
123
+ const [wfError, setWfError] = useState(null);
101
124
  const triggerBlogRefresh = useCallback(async () => {
102
125
  setRefreshBlogTrigger(prev => prev + 1);
103
126
  }, []);
127
+ useEffect(() => {
128
+ const fetchAllUsers = async () => {
129
+ const users = await UserListCacheService.GetAllAsync();
130
+ setAllUsers(users ?? []);
131
+ };
132
+ fetchAllUsers();
133
+ }, []);
104
134
  useEffect(() => {
105
135
  if (!allowButtonsRefs)
106
136
  setDcmtReferences(undefined);
107
137
  }, [allowButtonsRefs]);
108
138
  const { openConfirmAttachmentsDialog, ConfirmAttachmentsDialog } = useInputAttachmentsDialog();
109
139
  const { abortController, showWaitPanel, waitPanelTitle, showPrimary, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, downloadDcmtsAsync, runOperationAsync } = useDcmtOperations();
110
- const { workflowApproveData } = useWorkflowApprove();
140
+ const { workflowApproveData, getWorkItemsByDID } = useWorkflowApprove();
111
141
  const currentSearchResults = useMemo(() => {
112
142
  if (!formData || formData.length === 0 || !TID || !DID)
113
143
  return [];
@@ -124,7 +154,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
124
154
  selectMIDs: selectMIDs,
125
155
  dtdResult: {
126
156
  rows: [rowValues],
127
- columns: selectMIDs.map(mid => ({ name: `MID_${mid}` }))
157
+ columns: selectMIDs.map(mid => ({ name: `MID_${mid}`, }))
128
158
  },
129
159
  dcmtsFound: 1,
130
160
  dcmtsReturned: 1
@@ -242,7 +272,6 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
242
272
  }
243
273
  // Carica DTD e metadata
244
274
  let dtd = await DcmtTypeListCacheService.GetWithNotGrantedAsync(TID, DID, getMetadataResult);
245
- console.log('GetWithNotGrantedAsync DTD:', dtd);
246
275
  setFromDTD(dtd);
247
276
  if (layoutMode === LayoutModes.Update || (layoutMode === LayoutModes.Ark && DID)) {
248
277
  await setMetadataList(dtd?.metadata ?? [], getMetadataResult);
@@ -411,74 +440,173 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
411
440
  const workItemSetIDValue = useMemo(() => formData.find(o => o.md?.name === WorkItemMetadataNames.WI_SetID)?.value, [formData]);
412
441
  // Valore derivato: true se formData ha elementi validi
413
442
  const hasFormData = useMemo(() => formData.length > 0 && formData.some(md => md.mid && md.mid > 99), [formData]);
443
+ const handleCheckOutOperationCallback = async (checkout) => {
444
+ if (!currentDcmt)
445
+ return;
446
+ await handleCheckOutCallback({ TID: currentDcmt.tid, DID: currentDcmt.did, FILEEXT: currentDcmt.fileExt }, checkout, fromDTD?.name ?? SDKUI_Localizator.SearchResult, downloadDcmtsAsync, updateCurrentDcmt);
447
+ };
448
+ const handleCheckInOperationCallback = async () => {
449
+ if (!currentDcmt)
450
+ return;
451
+ await handleCheckInCallback({ TID: currentDcmt.tid, DID: currentDcmt.did, FILEEXT: currentDcmt.fileExt, fileName: fromDTD?.name ?? SDKUI_Localizator.SearchResult }, updateCurrentDcmt, undefined);
452
+ };
453
+ const copyCheckoutPathToClipboardOperationCallback = () => {
454
+ if (!currentDcmt)
455
+ return;
456
+ copyCheckoutPathToClipboardCallback({ TID: currentDcmt.tid, DID: currentDcmt.did, FILEEXT: currentDcmt.fileExt }, fromDTD?.name ?? SDKUI_Localizator.SearchResult);
457
+ };
458
+ // useEffect per il caricamento dei dati del workflow
414
459
  useEffect(() => {
460
+ // Funzione helper per caricare le informazioni del workflow
461
+ const loadWorkflowInfo = async (tid) => {
462
+ await WorkflowCacheService.GetWFInfoAsync(tid)
463
+ .then((result) => {
464
+ if (result) {
465
+ setWorkflows([result]);
466
+ setWfError(null);
467
+ }
468
+ else {
469
+ setWorkflows([]);
470
+ setWfError("Workflow info not found");
471
+ }
472
+ })
473
+ .catch(error => {
474
+ setWorkflows([]);
475
+ console.log("Error fetching workflow info:", error);
476
+ setWfError(getExceptionMessage(error));
477
+ });
478
+ };
415
479
  const loadAllWfData = async () => {
416
- if (layoutMode !== LayoutModes.Update || !DID || fromDTD?.templateTID !== TemplateTIDs.WF_WIApprView) {
480
+ // FASE 1: Validazione prerequisiti
481
+ if (layoutMode !== LayoutModes.Update || !DID) {
417
482
  setWorkItems([]);
418
483
  setWorkflows([]);
419
484
  return;
420
485
  }
421
486
  setIsWFDataLoading(true);
422
487
  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
- }
488
+ // FASE 2: Raccolta work items: array di tutti i possibili work items che matchano il DID corrente
489
+ const itemsToProcess = getWorkItemsByDID(Number(DID));
490
+ // Se non ci sono work items per questo DID, resetta e esci
434
491
  if (itemsToProcess.length === 0) {
435
492
  setWorkItems([]);
436
493
  setWorkflows([]);
437
494
  setIsWFDataLoading(false);
438
495
  return;
439
496
  }
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));
497
+ // FASE 3: Ricerca work item specifico
498
+ // Cerca prima un match esatto con TID e DID correnti
499
+ const foundItem = itemsToProcess.find(item => item.tid === Number(TID) && item.did === Number(DID));
500
+ if (foundItem) {
501
+ // SCENARIO A: Match esatto trovato (TID e DID corrispondono)
502
+ // Il documento corrente è esattamente il work item nel workflow
503
+ let setID = undefined;
504
+ // Prova a usare il setID già presente nei metadati (più veloce)
505
+ if (workItemSetIDValue !== undefined) {
506
+ setID = workItemSetIDValue;
507
+ }
508
+ else {
509
+ // Altrimenti caricalo dal server
510
+ setID = await getWorkItemSetIDAsync(foundItem.tid, foundItem.did);
511
+ }
512
+ // Imposta un singolo work item con il setID caricato
513
+ setWorkItems([{
514
+ wid: `${foundItem.tid}_${foundItem.did}`,
515
+ tid: foundItem.tid,
516
+ did: foundItem.did,
517
+ setID: setID,
518
+ details: []
519
+ }]);
520
+ // Carica le informazioni complete del workflow
521
+ await loadWorkflowInfo(foundItem.tid);
445
522
  }
446
523
  else {
447
- // Altrimenti, procediamo con le chiamate di rete come prima.
448
- setIDPromises = itemsToProcess.map(item => getWorkItemSetIDAsync(item.tid, item.did));
524
+ // SCENARIO B: Nessun match esatto, cerca solo per DID
525
+ const itemsByDID = itemsToProcess.filter(item => item.did === Number(DID));
526
+ if (itemsByDID.length === 1) {
527
+ // SCENARIO B.1: Un solo item trovato per DID
528
+ // Situazione sicura: sappiamo esattamente quale work item usare
529
+ const singleItem = itemsByDID[0];
530
+ let setID;
531
+ // Carica il setID (da cache o da server)
532
+ if (workItemSetIDValue !== undefined) {
533
+ setID = workItemSetIDValue;
534
+ }
535
+ else {
536
+ setID = await getWorkItemSetIDAsync(singleItem.tid, singleItem.did);
537
+ }
538
+ setWorkItems([{
539
+ wid: `${singleItem.tid}_${singleItem.did}`,
540
+ tid: singleItem.tid,
541
+ did: singleItem.did,
542
+ setID: setID,
543
+ details: []
544
+ }]);
545
+ // Carica le informazioni del workflow
546
+ await loadWorkflowInfo(singleItem.tid);
547
+ }
548
+ else if (itemsByDID.length > 1) {
549
+ // SCENARIO B.2: Più item trovati per lo stesso DID
550
+ // Ambiguità: lo stesso documento appare in più workflow diversi
551
+ const finalWorkItems = itemsByDID.map((item, index) => ({
552
+ wid: `${item.tid}_${item.did}_${index}`,
553
+ tid: item.tid,
554
+ did: item.did,
555
+ setID: undefined,
556
+ details: []
557
+ }));
558
+ setWorkItems(finalWorkItems);
559
+ setWorkflows([]); // Non carichiamo il workflow in caso di ambiguità
560
+ }
449
561
  }
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
562
  }
465
563
  catch (error) {
564
+ // FASE 4: Gestione errori
466
565
  TMExceptionBoxManager.show({ exception: error });
467
566
  setWorkItems([]);
468
567
  setWorkflows([]);
469
568
  }
470
569
  finally {
570
+ // Garantisce sempre il reset del flag di loading
471
571
  setIsWFDataLoading(false);
472
572
  }
473
573
  };
474
- // Usa hasFormData invece di formDataRef.current
475
574
  if (!hasFormData || !fromDTD?.id) {
476
- // console.log("formData is empty or fromDTD not loaded, skipping loadAllWfData");
477
575
  return;
478
576
  }
479
577
  if (workItemSetIDValue !== undefined || workflowApproveData.length > 0)
480
578
  loadAllWfData();
481
- }, [hasFormData, workItemSetIDValue, workflowApproveData, DID, layoutMode, fromDTD?.templateTID, fromDTD?.id]);
579
+ }, [hasFormData, workItemSetIDValue, workflowApproveData, getWorkItemsByDID, TID, DID, layoutMode, fromDTD?.templateTID, fromDTD?.id]);
580
+ // useEffect per costruire workItemsForDiagram quando l'utente è autorizzato a vedere il diagramma
581
+ useEffect(() => {
582
+ const buildWorkItemsForDiagram = async () => {
583
+ // Verifica se l'utente è autorizzato (ha accesso al diagramma)
584
+ const isAuthorized = !!workflows?.[0]?.diagram;
585
+ if (!isAuthorized || workItems.length === 0) {
586
+ setWorkItemsForDiagram([]);
587
+ return;
588
+ }
589
+ try {
590
+ // Costruisci WFInstanceDescriptor dai dati disponibili
591
+ const wfInstance = {
592
+ wfid: workflows[0].id,
593
+ tid: workflows[0].mtid,
594
+ did: DID ? Number(DID) : 0,
595
+ instanceId: undefined,
596
+ rowIndex: 0,
597
+ values: []
598
+ };
599
+ // Chiama buildWorkItemsFromWFCtrl per ottenere i workItems completi
600
+ const detailedWorkItems = await buildWorkItemsFromWFCtrl(wfInstance);
601
+ setWorkItemsForDiagram(detailedWorkItems);
602
+ }
603
+ catch (error) {
604
+ console.error('Errore durante la costruzione dei work items per il diagramma:', error);
605
+ setWorkItemsForDiagram([]);
606
+ }
607
+ };
608
+ buildWorkItemsForDiagram();
609
+ }, [workflows, workItems]);
482
610
  const getSelectionDcmtInfo = useCallback(() => {
483
611
  let dcmts = [];
484
612
  dcmts.push({ TID: TID ?? 0, DID: DID ?? 0 });
@@ -504,12 +632,30 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
504
632
  const isSysMetadataDisabled = useMemo(() => layoutMode !== LayoutModes.Update, [layoutMode]);
505
633
  const isDetailsDisabled = useMemo(() => layoutMode !== LayoutModes.Update || !DID, [layoutMode, DID]);
506
634
  const isMasterDisabled = useMemo(() => layoutMode !== LayoutModes.Update || !DID, [layoutMode, DID]);
507
- const isWFDisabled = useMemo(() => layoutMode !== LayoutModes.Update || fetchError || workItems.length <= 0, [layoutMode, fetchError, workItems.length]);
635
+ const isWFDisabled = useMemo(() => layoutMode !== LayoutModes.Update || fetchError || (workItems.length <= 0 && workItemsForDiagram.length <= 0), [layoutMode, fetchError, workItems.length, workItemsForDiagram.length]);
508
636
  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]);
637
+ const showToppyForCompleteMoreInfo = useMemo(() => {
638
+ if (layoutMode !== LayoutModes.Update || !moreInfoTasks) {
639
+ return false;
640
+ }
641
+ return moreInfoTasks.some(task => isTaskMoreInfo(task.name) &&
642
+ task.state !== Task_States.Completed);
643
+ }, [layoutMode, moreInfoTasks]);
644
+ const showToppyForReferences = useMemo(() => {
645
+ if (!allowButtonsRefs || layoutMode !== LayoutModes.Update || isOpenDetails || isOpenMaster)
646
+ return false;
647
+ if (!dcmtReferences || dcmtReferences.length === 0)
648
+ return false;
649
+ // Verifica che ci siano riferimenti renderizzabili (solo Dossier o WorkingGroup)
650
+ return dcmtReferences.some(ref => ref.objClass === ObjectClasses.Dossier || ref.objClass === ObjectClasses.WorkingGroup);
651
+ }, [allowButtonsRefs, layoutMode, dcmtReferences, isOpenDetails, isOpenMaster]);
652
+ const isToppyVisible = useMemo(() => Boolean((showToppyForApprove || showToppyForCompleteMoreInfo || showToppyForReferences) && !openS4TViewer), [showToppyForApprove, showToppyForCompleteMoreInfo, showToppyForReferences, openS4TViewer]);
511
653
  const isMobile = useMemo(() => deviceType === DeviceType.MOBILE, [deviceType]);
512
- const isApprView = useMemo(() => fromDTD?.templateTID === TemplateTIDs.WF_WIApprView, [fromDTD?.templateTID]);
654
+ const isApprView = useMemo(() => {
655
+ if (!fromDTD)
656
+ return false;
657
+ return isApprovalWorkflowView(fromDTD);
658
+ }, [fromDTD?.id]);
513
659
  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
660
  const approvalVID = useMemo(() => workItems.length > 0 ? Number(workItems[0].tid) : -1, [workItems]);
515
661
  //here
@@ -517,23 +663,20 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
517
663
  const items = [];
518
664
  const operationsItems = [];
519
665
  operationsItems.push({
520
- icon: svgToString(_jsx(IconDownload, {})),
521
- operationType: 'singleRow',
666
+ icon: _jsx(IconDownload, {}),
522
667
  disabled: fromDTD?.perm?.canRetrieveFile !== AccessLevels.Yes,
523
- text: SDKUI_Localizator.DownloadFile,
668
+ name: SDKUI_Localizator.DownloadFile,
524
669
  onClick: async () => await downloadDcmtsAsync(getDcmts(), DownloadTypes.Dcmt, "download", undefined, undefined, true)
525
670
  }, {
526
- icon: svgToString(_jsx(IconDownload, {})),
527
- operationType: 'singleRow',
671
+ icon: _jsx(IconDownload, {}),
528
672
  disabled: !isXMLFileExt(currentDcmt?.fileExt),
529
- text: SDKUI_Localizator.DownloadXMLAttachments,
673
+ name: SDKUI_Localizator.DownloadXMLAttachments,
530
674
  onClick: async () => await downloadDcmtsAsync(getDcmts(), DownloadTypes.Attachment, "download", undefined, openConfirmAttachmentsDialog, true)
531
675
  });
532
676
  if (layoutMode === LayoutModes.Update && DID) {
533
677
  operationsItems.push({
534
- icon: svgToString(_jsx(IconStar, {})),
535
- text: SDKUI_Localizator.AddTo + ' ' + SDKUI_Localizator.Favorites,
536
- operationType: 'singleRow',
678
+ icon: _jsx(IconStar, {}),
679
+ name: SDKUI_Localizator.AddTo + ' ' + SDKUI_Localizator.Favorites,
537
680
  disabled: false,
538
681
  onClick: async () => {
539
682
  await runOperationAsync(getDcmts(), DcmtOperationTypes.AddToFavs);
@@ -542,17 +685,17 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
542
685
  }
543
686
  if (onTaskCreateRequest && layoutMode === LayoutModes.Update && DID) {
544
687
  operationsItems.push({
545
- icon: svgToString(_jsx(IconActivity, {})),
546
- text: SDKUI_Localizator.CreateContextualTask,
547
- operationType: 'singleRow',
688
+ icon: _jsx(IconActivity, {}),
689
+ name: SDKUI_Localizator.CreateContextualTask,
548
690
  disabled: false,
549
691
  onClick: () => {
550
692
  const dcmt = getDcmts()[0];
693
+ const name = `${fromDTD?.name ?? '-'} (DID: ${dcmt.DID})`;
551
694
  const taskContext = {
552
695
  document: {
553
696
  tid: dcmt.TID,
554
697
  did: dcmt.DID,
555
- name: fromDTD?.description || ''
698
+ name: name
556
699
  }
557
700
  };
558
701
  onTaskCreateRequest(taskContext);
@@ -561,76 +704,106 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
561
704
  }
562
705
  if (operationsItems.length > 0) {
563
706
  items.push({
564
- icon: svgToString(_jsx(IconCheck, {})),
565
- text: SDKUI_Localizator.DocumentOperations,
566
- items: operationsItems
707
+ icon: _jsx(IconCheck, {}),
708
+ name: SDKUI_Localizator.DocumentOperations,
709
+ submenu: operationsItems
710
+ });
711
+ }
712
+ if (fromDTD?.id !== SystemTIDs.Drafts) {
713
+ // Check in/Check out menu
714
+ const { cicoEnabled, checkoutStatus } = getDcmtCicoStatus(formData, allUsers, fromDTD);
715
+ items.push({
716
+ icon: _jsx(IconFileDots, {}),
717
+ name: "Check in/Check out",
718
+ disabled: false,
719
+ submenu: [
720
+ {
721
+ name: 'Check out',
722
+ disabled: !cicoEnabled || checkoutStatus.isCheckedOut,
723
+ onClick: () => handleCheckOutOperationCallback(true),
724
+ },
725
+ {
726
+ name: 'Check in',
727
+ onClick: () => handleCheckInOperationCallback(),
728
+ disabled: !cicoEnabled || !checkoutStatus.isCheckedOut || checkoutStatus.mode === 'lockMode'
729
+ },
730
+ {
731
+ name: SDKUI_Localizator.CancelCheckOut,
732
+ disabled: !cicoEnabled || !checkoutStatus.isCheckedOut || checkoutStatus.mode === 'lockMode',
733
+ onClick: () => handleCheckOutOperationCallback(false),
734
+ },
735
+ {
736
+ name: SDKUI_Localizator.CheckoutInfo,
737
+ onClick: showCheckoutInformationFormCallback,
738
+ disabled: !checkoutStatus.isCheckedOut
739
+ },
740
+ {
741
+ name: SDKUI_Localizator.CopyCheckoutPath,
742
+ onClick: copyCheckoutPathToClipboardOperationCallback,
743
+ disabled: !checkoutStatus.isCheckedOut
744
+ },
745
+ {
746
+ name: SDKUI_Localizator.History,
747
+ disabled: !cicoEnabled,
748
+ onClick: showHistoryCallback,
749
+ },
750
+ ]
567
751
  });
568
752
  }
569
753
  if (allowRelations && layoutMode === LayoutModes.Update && DID) {
570
754
  const relationsItems = [
571
755
  {
572
- icon: svgToString(_jsx(IconPair, {})),
573
- text: SDKUI_Localizator.MatchManyDocumentsManyToMany,
574
- operationType: 'singleRow',
756
+ icon: _jsx(IconPair, {}),
757
+ name: SDKUI_Localizator.MatchManyDocumentsManyToMany,
575
758
  disabled: !hasManyToManyRelation,
576
759
  onClick: async () => await pairManyToMany?.(true)
577
760
  },
578
761
  {
579
- icon: svgToString(_jsx(IconUnpair, {})),
580
- text: SDKUI_Localizator.UnmatchManyDocumentsManyToMany,
581
- operationType: 'singleRow',
762
+ icon: _jsx(IconUnpair, {}),
763
+ name: SDKUI_Localizator.UnmatchManyDocumentsManyToMany,
582
764
  disabled: !hasManyToManyRelation,
583
765
  onClick: async () => await pairManyToMany?.(false)
584
766
  },
585
767
  {
586
- icon: svgToString(_jsx(IconArchiveMaster, {})),
587
- text: SDKUI_Localizator.ArchiveMasterDocument,
588
- operationType: 'singleRow',
589
- beginGroup: true,
768
+ icon: _jsx(IconArchiveMaster, {}),
769
+ name: SDKUI_Localizator.ArchiveMasterDocument,
590
770
  disabled: canArchiveMasterRelation !== true,
591
771
  onClick: async () => { if (TID)
592
772
  await archiveMasterDocuments?.(TID); }
593
773
  },
594
774
  {
595
- icon: svgToString(_jsx(IconArchiveDetail, {})),
596
- text: SDKUI_Localizator.ArchiveDetailDocument,
597
- operationType: 'singleRow',
775
+ icon: _jsx(IconArchiveDetail, {}),
776
+ name: SDKUI_Localizator.ArchiveDetailDocument,
598
777
  disabled: canArchiveDetailRelation !== true,
599
778
  onClick: async () => { if (TID)
600
779
  await archiveDetailDocuments?.(TID); }
601
780
  },
602
781
  {
603
- icon: svgToString(_jsx(IconDetailDcmts, { transform: 'scale(-1, 1)' })),
604
- text: SDKUI_Localizator.DcmtsMaster,
605
- operationType: 'singleRow',
606
- visible: true,
607
- beginGroup: true,
782
+ icon: _jsx(IconDetailDcmts, { transform: 'scale(-1, 1)' }),
783
+ name: SDKUI_Localizator.DcmtsMaster,
608
784
  disabled: !currentTIDHasMasterRelations || isMasterDisabled,
609
785
  onClick: () => { if (!isMasterDisabled)
610
786
  setIsOpenMaster(!isOpenMaster); }
611
787
  },
612
788
  {
613
- icon: svgToString(_jsx(IconDetailDcmts, {})),
614
- text: SDKUI_Localizator.DcmtsDetail,
615
- operationType: 'singleRow',
789
+ icon: _jsx(IconDetailDcmts, {}),
790
+ name: SDKUI_Localizator.DcmtsDetail,
616
791
  disabled: !currentTIDHasDetailRelations || isDetailsDisabled,
617
- visible: true,
618
792
  onClick: () => { if (!isDetailsDisabled)
619
793
  setIsOpenDetails(!isOpenDetails); }
620
794
  }
621
795
  ];
622
796
  items.push({
623
- icon: svgToString(_jsx(IconRelation, {})),
624
- text: SDKUI_Localizator.Relations,
625
- items: relationsItems
797
+ icon: _jsx(IconRelation, {}),
798
+ name: SDKUI_Localizator.Relations,
799
+ submenu: relationsItems
626
800
  });
627
801
  }
628
802
  if (layoutMode === LayoutModes.Update && DID) {
629
803
  const fullTextItems = [
630
804
  {
631
- icon: svgToString(_jsx(IconInfo, {})),
632
- text: SDKUI_Localizator.IndexingInformation,
633
- operationType: 'singleRow',
805
+ icon: _jsx(IconInfo, {}),
806
+ name: SDKUI_Localizator.IndexingInformation,
634
807
  disabled: false,
635
808
  onClick: async () => {
636
809
  try {
@@ -648,18 +821,16 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
648
821
  }
649
822
  },
650
823
  {
651
- icon: svgToString(_jsx(IconArchiveDoc, {})),
652
- text: SDKUI_Localizator.IndexOrReindex,
653
- operationType: 'singleRow',
824
+ icon: _jsx(IconArchiveDoc, {}),
825
+ name: SDKUI_Localizator.IndexOrReindex,
654
826
  disabled: false,
655
827
  onClick: async () => {
656
828
  await runOperationAsync(getDcmts(), DcmtOperationTypes.FreeSearchReindex);
657
829
  }
658
830
  },
659
831
  {
660
- icon: svgToString(_jsx(IconDelete, {})),
661
- text: SDKUI_Localizator.IndexingDelete,
662
- operationType: 'singleRow',
832
+ icon: _jsx(IconDelete, {}),
833
+ name: SDKUI_Localizator.IndexingDelete,
663
834
  disabled: false,
664
835
  onClick: async () => {
665
836
  await runOperationAsync(getDcmts(), DcmtOperationTypes.FreeSearchPurge);
@@ -667,9 +838,9 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
667
838
  }
668
839
  ];
669
840
  items.push({
670
- icon: svgToString(_jsx(IconSearch, {})),
671
- text: SDKUI_Localizator.FullTextSearch,
672
- items: fullTextItems
841
+ icon: _jsx(IconSearch, {}),
842
+ name: SDKUI_Localizator.FullTextSearch,
843
+ submenu: fullTextItems
673
844
  });
674
845
  }
675
846
  // Aggiungi submenu "Bottoni personalizzati" se esistono customButtons
@@ -677,18 +848,19 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
677
848
  const customButtonsItems = customButtonsLayout.customButtons
678
849
  .filter((customButton) => customButton.isForUpdate && customButton.isForUpdate > 0)
679
850
  .map((customButton) => ({
680
- icon: svgToString(TMImageLibrary({ imageID: customButton.glyphID, showPath: true })),
681
- text: customButton.title || 'Bottone personalizzato',
851
+ icon: TMImageLibrary({ imageID: customButton.glyphID }),
852
+ name: customButton.title || 'Bottone personalizzato',
682
853
  onClick: () => setCustomButton(customButton)
683
854
  }));
684
- items.push({
685
- icon: svgToString(_jsx(IconCheck, {})),
686
- text: SDKUI_Localizator.CustomButtons,
687
- items: customButtonsItems
855
+ customButtonsItems && customButtonsItems.length > 0 && items.push({
856
+ icon: _jsx(IconCustom, {}),
857
+ name: SDKUI_Localizator.CustomButtons,
858
+ submenu: customButtonsItems
688
859
  });
689
860
  }
690
861
  return items;
691
862
  }, [
863
+ fromDTD?.id,
692
864
  fromDTD?.perm?.canRetrieveFile,
693
865
  fromDTD?.description,
694
866
  currentDcmt?.fileExt,
@@ -714,8 +886,9 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
714
886
  openConfirmAttachmentsDialog
715
887
  ]);
716
888
  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]);
889
+ 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 &&
890
+ _jsx(ContextMenu, { items: commandsMenuItems, trigger: "left", children: _jsx(IconMenuVertical, { color: 'white', cursor: 'pointer' }) }), layoutMode === LayoutModes.Ark &&
891
+ _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
892
  const handleUndo = useCallback(() => {
720
893
  setFormData(structuredClone(formDataOrig));
721
894
  }, [formDataOrig]);
@@ -731,6 +904,60 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
731
904
  },
732
905
  });
733
906
  }, [isModal, id, layoutMode]);
907
+ // Funzione helper per ottenere e aggiornare i metadati con gestione errori centralizzata
908
+ const refreshMetadataAsync = useCallback(async () => {
909
+ let metadataResult = undefined;
910
+ let hasGetMetadataError = false;
911
+ try {
912
+ metadataResult = await SDK_Globals.tmSession?.NewSearchEngine().GetMetadataAsync(TID, DID, true);
913
+ }
914
+ catch (metadataError) {
915
+ hasGetMetadataError = true;
916
+ // Estrai ErrorCode dal campo detail se disponibile
917
+ let errorCode = undefined;
918
+ if (metadataError?.isApiException && metadataError?.response?.detail) {
919
+ try {
920
+ const detailObj = JSON.parse(metadataError.response.detail);
921
+ errorCode = detailObj?.ErrorCode;
922
+ }
923
+ catch (parseError) {
924
+ console.log("Impossibile parsare il detail dell'eccezione:", parseError);
925
+ }
926
+ }
927
+ // Se ErrorCode è -5, mostra messaggio personalizzato, altrimenti mostra l'eccezione originale
928
+ if (errorCode === -5) {
929
+ TMMessageBoxManager.show({
930
+ message: SDKUI_Localizator.DcmtOutOfView,
931
+ buttons: [ButtonNames.OK],
932
+ });
933
+ }
934
+ else {
935
+ TMExceptionBoxManager.show({ exception: metadataError });
936
+ }
937
+ // Usa null per indicare al callback che c'è stato un errore e non deve ritentare
938
+ metadataResult = null;
939
+ }
940
+ // Aggiorna i metadati locali solo se non ci sono stati errori
941
+ if (!hasGetMetadataError && metadataResult && metadataResult !== null) {
942
+ await setMetadataList(fromDTDRef.current?.metadata ?? [], metadataResult);
943
+ }
944
+ return { success: !hasGetMetadataError, result: metadataResult };
945
+ }, [TID, DID, setMetadataList]);
946
+ const updateCurrentDcmt = useCallback(async () => {
947
+ try {
948
+ TMSpinner.show({ description: 'Aggiornamento in corso...' });
949
+ const { success, result: metadataResult } = await refreshMetadataAsync();
950
+ if (!success)
951
+ onClose?.();
952
+ await onSavedAsyncCallback?.(TID, DID, metadataResult === null ? null : metadataResult);
953
+ }
954
+ catch (e) {
955
+ TMExceptionBoxManager.show({ exception: e });
956
+ }
957
+ finally {
958
+ TMSpinner.hide();
959
+ }
960
+ }, [refreshMetadataAsync, onClose]);
734
961
  const handleSave = useCallback(async () => {
735
962
  const ue = new UpdateEngineByID(SDK_Globals.tmSession);
736
963
  ue.DID = DID;
@@ -767,55 +994,20 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
767
994
  const savedFormData = structuredClone(formDataRef.current);
768
995
  setFormDataOrig(savedFormData);
769
996
  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
- }
997
+ // Usa la funzione helper per ottenere i metadati aggiornati
998
+ const { success, result: metadataResult } = await refreshMetadataAsync();
802
999
  // Esegui sempre il callback:
803
1000
  // - Se metadataResult è un oggetto: refresh normale
804
1001
  // - Se metadataResult è null: GetMetadataAsync fallito, rimuove il documento dalla griglia senza ritentare
805
1002
  // - Se metadataResult è undefined: nessun parametro passato, il callback può decidere cosa fare
806
1003
  await onSavedAsyncCallback?.(TID, DID, metadataResult === null ? null : metadataResult);
807
1004
  // 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
- }
1005
+ if (success) {
815
1006
  ShowAlert({ mode: 'success', title: 'Form di documento', message: 'Le modifiche sono state salvate con successo', duration: 3000 });
816
1007
  }
817
- else
1008
+ else {
818
1009
  onClose?.();
1010
+ }
819
1011
  }
820
1012
  catch (e) {
821
1013
  TMExceptionBoxManager.show({ exception: e });
@@ -823,7 +1015,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
823
1015
  finally {
824
1016
  TMSpinner.hide();
825
1017
  }
826
- }, [DID, TID, getSpecificChangedKeysWithValues, onSavedAsyncCallback, onClose, setMetadataList]);
1018
+ }, [DID, TID, getSpecificChangedKeysWithValues, refreshMetadataAsync, onSavedAsyncCallback, onClose]);
827
1019
  const handleArchiveCompleted = useCallback(async () => {
828
1020
  let firstBlock = true;
829
1021
  let maxFileSize = 0;
@@ -1012,28 +1204,34 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1012
1204
  await triggerBlogRefresh();
1013
1205
  }
1014
1206
  }, [TID, DID, triggerBlogRefresh]);
1207
+ const checkoutBadge = useMemo(() => {
1208
+ const { cicoEnabled, checkoutStatus } = getDcmtCicoStatus(formData, allUsers, fromDTD);
1209
+ if (!cicoEnabled || !checkoutStatus.isCheckedOut)
1210
+ return null;
1211
+ return (_jsx(Ribbon, { "$isMobile": isMobile, children: _jsx(TMTooltip, { content: checkoutStatus.editLockTooltipText, position: "right", children: _jsx("span", { children: checkoutStatus.mode === 'editMode' ? SDKUI_Localizator.CheckOut : 'Locked' }) }) }));
1212
+ }, [formData, fromDTD, isMobile]);
1015
1213
  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, {})] }) });
1214
+ return _jsxs(_Fragment, { children: [checkoutBadge && _jsx("div", { style: { padding: '10px', display: 'flex', justifyContent: 'center' }, children: checkoutBadge }), metadataValuesSource.length > 0 &&
1215
+ _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) => {
1216
+ setFormData((prevItems) => prevItems.map((item) => {
1217
+ const newItem = newItems.find((newItem) => newItem.tid === item.tid && newItem.mid === item.mid);
1218
+ return newItem ? { ...item, ...newItem } : item;
1219
+ }));
1220
+ }, onAdvancedMenuClick: (e) => {
1221
+ switch (e.button) {
1222
+ case AdvancedMenuButtons.DistinctValues:
1223
+ setIsOpenDistinctValues(!isOpenDistinctValues);
1224
+ break;
1225
+ case AdvancedMenuButtons.FormulaEditor:
1226
+ setIsOpenFormulaEditor(!isOpenFormulaEditor);
1227
+ break;
1228
+ }
1229
+ } }), _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 })] }) :
1230
+ _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 &&
1231
+ !isApprView &&
1232
+ TID !== SystemTIDs.Drafts &&
1233
+ !shouldShowAll &&
1234
+ _jsx(TMShowAllOrMaxItemsButton, { showAll: showAll, dataSourceLength: totalItems, onClick: () => { setShowAll(!showAll); } })] }), _jsx(ConfirmAttachmentsDialog, {})] })] });
1037
1235
  }, [
1038
1236
  TID,
1039
1237
  DID,
@@ -1061,11 +1259,11 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1061
1259
  handleUndo,
1062
1260
  handleClearForm
1063
1261
  ]);
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]);
1262
+ 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]);
1065
1263
  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]);
1066
1264
  const tmDcmtPreview = useMemo(() => _jsx(TMDcmtPreviewWrapper, { currentDcmt: currentDcmt, dcmtFile: dcmtFile ?? inputFile, deviceType: deviceType, fromDTD: fromDTD, layoutMode: layoutMode, onFileUpload: (file) => {
1067
1265
  setDcmtFile(file);
1068
- }, enableDragDropOverlay: enableDragDropOverlay }), [currentDcmt, dcmtFile, deviceType, fromDTD, layoutMode, inputFile, enableDragDropOverlay, setDcmtFile]);
1266
+ }, enableDragDropOverlay: enableDragDropOverlay }, refreshPreviewTrigger), [currentDcmt, dcmtFile, deviceType, fromDTD, layoutMode, inputFile, enableDragDropOverlay, setDcmtFile]);
1069
1267
  const tmWF = useMemo(() => {
1070
1268
  if (isWFDataLoading) {
1071
1269
  return (_jsx("div", { style: {
@@ -1080,7 +1278,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1080
1278
  const isAuthorized = !!workflows?.[0]?.diagram;
1081
1279
  return (_jsxs("div", { style: { position: 'relative', width: '100%', height: '100%', display: 'flex', flexDirection: 'column', gap: 3 }, children: [workItems.length > 0
1082
1280
  ? (isAuthorized
1083
- ? _jsx(WFDiagram, { xmlDiagramString: workflows?.[0]?.diagram || '', allowEdit: false, currentSetID: workitemSetID })
1281
+ ? _jsx(WFDiagram, { xmlDiagramString: workflows?.[0]?.diagram || '', allowEdit: false, currentSetID: workitemSetID, defaultAutoZoom: true, workitems: workItemsForDiagram })
1084
1282
  : _jsx("div", { style: {
1085
1283
  position: 'absolute',
1086
1284
  top: '50%',
@@ -1089,7 +1287,27 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1089
1287
  fontSize: '1.1rem',
1090
1288
  color: TMColors.primaryColor,
1091
1289
  textAlign: 'center',
1092
- }, children: SDKUI_Localizator.WorkflowDiagramNotAuthorized }))
1290
+ display: 'flex',
1291
+ flexDirection: 'column',
1292
+ alignItems: 'center',
1293
+ gap: '12px',
1294
+ }, 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: () => {
1295
+ TMMessageBoxManager.show({
1296
+ title: 'Dettagli Errore Workflow',
1297
+ initialWidth: !isMobile ? '700px' : undefined,
1298
+ message: (_jsx("pre", { style: {
1299
+ whiteSpace: 'pre-wrap',
1300
+ background: '#f5f5f5',
1301
+ padding: '12px',
1302
+ borderRadius: '6px',
1303
+ userSelect: 'text',
1304
+ cursor: 'text',
1305
+ }, children: wfError })),
1306
+ resizable: true,
1307
+ showToppy: false,
1308
+ buttons: [ButtonNames.OK],
1309
+ });
1310
+ } }) }))] }) }))
1093
1311
  : _jsx("div", { style: {
1094
1312
  position: 'absolute',
1095
1313
  top: '50%',
@@ -1104,7 +1322,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1104
1322
  backgroundColor: 'khaki',
1105
1323
  borderRadius: 8
1106
1324
  }, children: SDKUI_Localizator.WorkItemTechnicalNote_SetID })] }));
1107
- }, [workflows, formData, workitemSetID, workItems, isWFDataLoading]);
1325
+ }, [workflows, formData, workitemSetID, workItems, workItemsForDiagram, isWFDataLoading, wfError, isMobile]);
1108
1326
  const tmDcmtTasks = useMemo(() => {
1109
1327
  const isReady = TID && DID && getAllTasks && deleteTaskByIdsCallback && addTaskCallback && editTaskCallback;
1110
1328
  if (!isReady) {
@@ -1229,7 +1447,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1229
1447
  // Checks if there's a saved panel layout for the current context (ToDo or general)
1230
1448
  const hasSavedLayout = () => {
1231
1449
  const { setting } = getCurrentDcmtFormSetting();
1232
- if (invokedByTodo) {
1450
+ if (invocationContext === InvocationContext.Todo) {
1233
1451
  // If invoked by ToDo, check for existence of layoutToDo and that it has keys
1234
1452
  return setting.layoutToDo !== undefined && Object.keys(setting.layoutToDo).length > 0;
1235
1453
  }
@@ -1248,8 +1466,8 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1248
1466
  // Prepare the new setting object with updated layout depending on context
1249
1467
  const newSetting = {
1250
1468
  TID: normalizedTID,
1251
- layout: invokedByTodo ? (existingSetting.layout ?? {}) : state,
1252
- layoutToDo: invokedByTodo ? state : (existingSetting.layoutToDo ?? {}),
1469
+ layout: invocationContext === InvocationContext.Todo ? (existingSetting.layout ?? {}) : state,
1470
+ layoutToDo: invocationContext === InvocationContext.Todo ? state : (existingSetting.layoutToDo ?? {}),
1253
1471
  };
1254
1472
  // Replace existing setting if found, otherwise push a new one
1255
1473
  if (idx >= 0) {
@@ -1268,12 +1486,12 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1268
1486
  return undefined;
1269
1487
  const settings = getCurrentDcmtFormSetting()?.setting;
1270
1488
  // Return the appropriate layout based on context
1271
- return invokedByTodo ? settings?.layoutToDo : settings?.layout;
1489
+ return invocationContext === InvocationContext.Todo ? settings?.layoutToDo : settings?.layout;
1272
1490
  };
1273
1491
  const handleCompleteMoreInfo = useCallback(async () => {
1274
1492
  try {
1275
1493
  TMSpinner.show();
1276
- let newTask = { ...taskMoreInfo, state: Task_States.Completed };
1494
+ let newTask = { ...moreInfoTasks, state: Task_States.Completed };
1277
1495
  await SDK_Globals.tmSession?.NewTaskEngine().UpdateAsync(newTask);
1278
1496
  onTaskCompleted?.(newTask);
1279
1497
  onClose?.();
@@ -1286,7 +1504,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1286
1504
  finally {
1287
1505
  TMSpinner.hide();
1288
1506
  }
1289
- }, [taskMoreInfo, onTaskCompleted, onClose]);
1507
+ }, [moreInfoTasks, onTaskCompleted, onClose]);
1290
1508
  const handleSignApprove = useCallback(() => {
1291
1509
  if (onOpenS4TViewerRequest && TID && DID) {
1292
1510
  onOpenS4TViewerRequest([{ TID, DID }]);
@@ -1312,8 +1530,8 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1312
1530
  }, [onReferenceClick]);
1313
1531
  // Mapping for objClass specific label/action. Easy to extend for future objClass types.
1314
1532
  const referenceActionMap = useMemo(() => ({
1315
- [ObjectClasses.Dossier]: { label: 'Vai a pratica' },
1316
- [ObjectClasses.WorkingGroup]: { label: 'Vai a gruppo di lavoro' },
1533
+ [ObjectClasses.Dossier]: { label: SDKUI_Localizator.GoToDossier },
1534
+ [ObjectClasses.WorkingGroup]: { label: SDKUI_Localizator.GoToWorkgroup },
1317
1535
  // add other ObjectClasses here as needed
1318
1536
  }), []);
1319
1537
  const renderDcmtForm = () => {
@@ -1330,29 +1548,26 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1330
1548
  height: '100%',
1331
1549
  position: 'relative',
1332
1550
  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 ?
1551
+ }, 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)
1552
+ ? _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", parentId: groupId, showToolbar: showDcmtFormSidebar })
1553
+ : _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 &&
1554
+ _jsx(TMDistinctValues, { tid: TID, mid: focusedMetadataValue?.mid, isModal: true, showHeader: false, layoutMode: layoutMode, onClosePanelCallback: () => setIsOpenDistinctValues(false), onSelectionChanged: (e) => {
1555
+ if (!e)
1556
+ return;
1557
+ setFormData((prevItems) => prevItems.map((item) => item.tid == e.tid && item.mid === e.mid ? { ...item, value: e.newValue } : item));
1558
+ } }), isOpenFormulaEditor &&
1559
+ _jsx(TMFormulaEditor, { isModal: true, formMode: FormModes.Update, inputData: getFormula(), showBack: false, onClose: () => setIsOpenFormulaEditor(false), onApplied: (newFormula) => {
1560
+ setFormData((prevItems) => prevItems.map((item) => item.tid == newFormula.tid && item.mid === newFormula.mid ? { ...item, value: FormulaHelper.addFormulaTag(newFormula.expression), isSelected: true, isEditable: true } : item));
1561
+ setFocusedMetadataValue(prevState => ({
1562
+ ...prevState,
1563
+ isSelected: true,
1564
+ isEditable: true,
1565
+ value: FormulaHelper.addFormulaTag(newFormula.expression)
1566
+ }));
1567
+ } }), 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
1568
  _jsx(WorkFlowOperationButtons, { deviceType: deviceType, onApprove: () => setShowApprovePopup(true), onSignApprove: handleSignApprove, onReject: () => setShowRejectPopup(true), onReAssign: () => setShowReAssignPopup(true), onMoreInfo: () => setShowMoreInfoPopup(true), dtd: fromDTD })
1351
1569
  :
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
1570
+ _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
1571
  .map((ref, index, arr) => {
1357
1572
  const mapEntry = referenceActionMap[String(ref.objClass)];
1358
1573
  const label = mapEntry?.label ?? 'Vai a riferimento';
@@ -1400,7 +1615,8 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1400
1615
  finally {
1401
1616
  TMSpinner.hide();
1402
1617
  }
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: () => {
1618
+ }, 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) &&
1619
+ _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
1620
  setIsOpenArchiveRelationForm(false);
1405
1621
  setArchiveType(undefined);
1406
1622
  setArchiveRelatedDcmtFormTID(undefined);
@@ -1411,7 +1627,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1411
1627
  setArchiveRelatedDcmtFormTID(undefined);
1412
1628
  setArchiveRelatedDcmtFormMids([]);
1413
1629
  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 }) }))] }));
1630
+ }, 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
1631
  };
1416
1632
  export default TMDcmtForm;
1417
1633
  /**
@@ -1434,8 +1650,11 @@ const applyMetadataFilter = (data, showAll, listMaxItems, TID) => {
1434
1650
  o.mid === SystemMIDsAsNumber.FileSize ||
1435
1651
  o.mid === SystemMIDsAsNumber.LastUpdateTime ||
1436
1652
  o.mid === SystemMIDsAsNumber.CreationTime;
1653
+ const chronologySystemFilter = (o) => baseFilter(o) ||
1654
+ o.mid === SystemMIDsAsNumber.FileExt ||
1655
+ o.mid === SystemMIDsAsNumber.FileSize;
1437
1656
  // Select the appropriate filter based on document type
1438
- const currentFilter = TID === SystemTIDs.Drafts ? draftFilter : baseFilter;
1657
+ const currentFilter = TID === SystemTIDs.Drafts ? draftFilter : TID === SystemTIDs.Chronology ? chronologySystemFilter : baseFilter;
1439
1658
  // Apply filter once
1440
1659
  const filteredData = data.filter(currentFilter);
1441
1660
  // Return all filtered data or slice to max items
@@ -1489,3 +1708,35 @@ const TMDcmtPreviewWrapper = ({ currentDcmt, layoutMode, fromDTD, dcmtFile, devi
1489
1708
  _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
1709
  _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
1710
  };
1711
+ const Ribbon = styled.div `
1712
+ font-size: 0.85rem;
1713
+ font-weight: 600;
1714
+ color: #fff;
1715
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
1716
+ --f: .4em; /* control the folded part */
1717
+ position: absolute;
1718
+ top: 2px;
1719
+ left: 2px;
1720
+ z-index: 1200;
1721
+ line-height: 1.6;
1722
+ padding-inline: 0.8lh;
1723
+ padding-bottom: var(--f);
1724
+ border-image: conic-gradient(#0008 0 0) 51%/var(--f);
1725
+ 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));
1726
+ transform: translate(calc((cos(45deg) - 1)*100%), -100%) rotate(-45deg);
1727
+ transform-origin: 100% 100%;
1728
+ background-color: rgba(217, 148, 13, 0.92);
1729
+ display: inline-block;
1730
+ padding-top: 0.1em;
1731
+ white-space: nowrap;
1732
+ transition: ${props => props.$isMobile ? 'none' : 'all 0.3s ease'};
1733
+ cursor: 'default';
1734
+
1735
+ ${props => !props.$isMobile && `
1736
+ &:hover {
1737
+ background-color: #d9940d;
1738
+ font-size: 1.1rem;
1739
+ transform: translate(calc((cos(45deg) - 1)*100%), -100%) rotate(-45deg) scale(1.05);
1740
+ }
1741
+ `}
1742
+ `;