@topconsultnpm/sdkui-react 6.19.0-dev2.9 → 6.19.0-test2

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 (97) hide show
  1. package/lib/components/base/TMAccordionNew.d.ts +28 -0
  2. package/lib/components/base/TMAccordionNew.js +326 -0
  3. package/lib/components/base/TMButton.d.ts +1 -0
  4. package/lib/components/base/TMButton.js +6 -6
  5. package/lib/components/base/TMCustomButton.d.ts +1 -1
  6. package/lib/components/base/TMCustomButton.js +83 -28
  7. package/lib/components/base/TMDataGridExportForm.js +9 -3
  8. package/lib/components/base/TMFileManager.js +11 -2
  9. package/lib/components/base/TMFileManagerDataGridView.d.ts +2 -0
  10. package/lib/components/base/TMFileManagerDataGridView.js +12 -3
  11. package/lib/components/base/TMFileManagerThumbnailItems.d.ts +2 -0
  12. package/lib/components/base/TMFileManagerThumbnailItems.js +12 -2
  13. package/lib/components/base/TMFileManagerThumbnailsView.d.ts +2 -0
  14. package/lib/components/base/TMFileManagerThumbnailsView.js +2 -2
  15. package/lib/components/base/TMModal.d.ts +2 -0
  16. package/lib/components/base/TMModal.js +48 -3
  17. package/lib/components/base/TMPopUp.js +74 -5
  18. package/lib/components/base/TMWaitPanel.js +8 -2
  19. package/lib/components/choosers/TMDataListItemChooser.js +1 -1
  20. package/lib/components/choosers/TMDcmtTypeChooser.js +2 -2
  21. package/lib/components/choosers/TMMetadataChooser.d.ts +4 -1
  22. package/lib/components/choosers/TMMetadataChooser.js +31 -8
  23. package/lib/components/choosers/TMUserChooser.d.ts +4 -0
  24. package/lib/components/choosers/TMUserChooser.js +21 -5
  25. package/lib/components/editors/TMMetadataValues.js +45 -4
  26. package/lib/components/editors/TMTextArea.d.ts +1 -0
  27. package/lib/components/editors/TMTextArea.js +44 -10
  28. package/lib/components/editors/TMTextBox.js +34 -4
  29. package/lib/components/editors/TMTextExpression.js +36 -28
  30. package/lib/components/features/assistant/ToppyDraggableHelpCenter.d.ts +30 -0
  31. package/lib/components/features/assistant/ToppyDraggableHelpCenter.js +471 -0
  32. package/lib/components/features/assistant/ToppySpeechBubble.d.ts +9 -0
  33. package/lib/components/features/assistant/ToppySpeechBubble.js +117 -0
  34. package/lib/components/features/blog/TMBlogCommentForm.d.ts +2 -0
  35. package/lib/components/features/blog/TMBlogCommentForm.js +18 -6
  36. package/lib/components/features/documents/TMDcmtBlog.js +1 -1
  37. package/lib/components/features/documents/TMDcmtForm.js +290 -31
  38. package/lib/components/features/documents/TMDcmtIcon.js +9 -4
  39. package/lib/components/features/documents/TMDcmtPreview.js +45 -8
  40. package/lib/components/features/documents/TMRelationViewer.js +55 -22
  41. package/lib/components/features/search/TMSearch.js +2 -2
  42. package/lib/components/features/search/TMSearchQueryEditor.js +1 -1
  43. package/lib/components/features/search/TMSearchQueryPanel.js +10 -28
  44. package/lib/components/features/search/TMSearchResult.js +102 -33
  45. package/lib/components/features/search/TMSearchResultsMenuItems.d.ts +2 -1
  46. package/lib/components/features/search/TMSearchResultsMenuItems.js +67 -28
  47. package/lib/components/features/search/TMSignSettingsForm.d.ts +9 -0
  48. package/lib/components/features/search/TMSignSettingsForm.js +621 -0
  49. package/lib/components/features/tasks/TMTaskForm.js +10 -4
  50. package/lib/components/features/tasks/TMTasksAgenda.js +1 -1
  51. package/lib/components/features/tasks/TMTasksCalendar.js +1 -1
  52. package/lib/components/features/tasks/TMTasksUtils.d.ts +1 -0
  53. package/lib/components/features/tasks/TMTasksUtils.js +17 -2
  54. package/lib/components/features/tasks/TMTasksUtilsView.js +26 -4
  55. package/lib/components/features/tasks/TMTasksView.js +11 -5
  56. package/lib/components/features/workflow/TMWorkflowPopup.js +3 -3
  57. package/lib/components/features/workflow/diagram/WFDiagram.js +19 -1
  58. package/lib/components/forms/TMSaveForm.js +3 -11
  59. package/lib/components/grids/TMBlogAttachments.d.ts +0 -14
  60. package/lib/components/grids/TMBlogAttachments.js +10 -5
  61. package/lib/components/grids/TMBlogsPost.d.ts +8 -3
  62. package/lib/components/grids/TMBlogsPost.js +100 -39
  63. package/lib/components/grids/TMBlogsPostUtils.d.ts +1 -0
  64. package/lib/components/grids/TMBlogsPostUtils.js +27 -6
  65. package/lib/components/index.d.ts +2 -1
  66. package/lib/components/index.js +2 -1
  67. package/lib/components/layout/panelManager/TMPanelManagerContainer.d.ts +1 -0
  68. package/lib/components/layout/panelManager/TMPanelManagerContainer.js +2 -2
  69. package/lib/components/layout/panelManager/TMPanelManagerContext.js +0 -1
  70. package/lib/components/layout/panelManager/TMPanelManagerToolbar.js +2 -1
  71. package/lib/components/layout/panelManager/types.d.ts +1 -0
  72. package/lib/components/settings/SettingsAppearance.js +5 -5
  73. package/lib/helper/GlobalStyles.d.ts +2 -0
  74. package/lib/helper/GlobalStyles.js +10 -0
  75. package/lib/helper/Globalization.d.ts +1 -0
  76. package/lib/helper/Globalization.js +30 -0
  77. package/lib/helper/SDKUI_Localizator.d.ts +41 -1
  78. package/lib/helper/SDKUI_Localizator.js +410 -10
  79. package/lib/helper/TMIcons.d.ts +4 -1
  80. package/lib/helper/TMIcons.js +13 -1
  81. package/lib/helper/TMToppyMessage.d.ts +1 -0
  82. package/lib/helper/TMToppyMessage.js +4 -3
  83. package/lib/helper/TMUtils.d.ts +42 -4
  84. package/lib/helper/TMUtils.js +190 -23
  85. package/lib/helper/dcmtsHelper.d.ts +2 -1
  86. package/lib/helper/dcmtsHelper.js +56 -17
  87. package/lib/helper/helpers.d.ts +1 -1
  88. package/lib/helper/helpers.js +12 -17
  89. package/lib/helper/index.d.ts +1 -0
  90. package/lib/helper/index.js +1 -0
  91. package/lib/hooks/useDcmtOperations.d.ts +1 -1
  92. package/lib/hooks/useDcmtOperations.js +10 -6
  93. package/lib/hooks/useRelatedDocuments.js +35 -26
  94. package/lib/ts/types.d.ts +2 -0
  95. package/package.json +8 -8
  96. package/lib/components/features/assistant/ToppyHelpCenter.d.ts +0 -12
  97. package/lib/components/features/assistant/ToppyHelpCenter.js +0 -173
@@ -29,7 +29,7 @@ const getNonDirectoryFiles = (items, exclude) => {
29
29
  };
30
30
  const TMBlogCommentForm = (props) => {
31
31
  const maxLength = 1000;
32
- const { participants, selectedAttachments, selectedAttachmentDid, allFileItems, allArchivedDocumentsFileItems = [], onClose, context, showAttachmentsSection = true, onFilterCreated, refreshCallback } = props;
32
+ const { participants, selectedAttachments, selectedAttachmentDid, allFileItems, allArchivedDocumentsFileItems = [], onClose, context, showAttachmentsSection = true, removeAndEditAttachment = true, onFilterCreated, refreshCallback, isCommentRequired = false } = props;
33
33
  // Initialize state with combined array
34
34
  const [dataSource, setDataSource] = useState(() => [...getNonDirectoryFiles(allFileItems?.items || [], []), ...allArchivedDocumentsFileItems]);
35
35
  const [isEditorEnabled, setIsEditorEnabled] = useState(true);
@@ -216,8 +216,20 @@ const TMBlogCommentForm = (props) => {
216
216
  // Update the state with selected draft items
217
217
  setCurrentDraftAttachments(selectedDraftItems);
218
218
  };
219
- return _jsx(TMSaveForm, { id: 1, title: SDKUI_Localizator.AddNewComment, showTitleFormMode: false, showErrorCount: false, customSaveButton: _jsx("i", { className: 'dx-icon-send' }), customTooltipSaveButton: SDKUI_Localizator.Send, showUndoButton: false, hasNavigation: false, skipIsModifiedCheck: true, isModal: true, width: calcResponsiveSizes(deviceType, '800px', '800px', '95%'), height: '550px', formMode: FormModes.Create, validationItems: validationItems, exception: exception, isModified: calcIsModified(formData, formDataOrig), onSaveAsync: onSaveAsync, onClose: onCloseCallback, customToolbarElements: _jsx("div", { style: { display: 'flex', gap: '2px' }, children: _jsx(TMButton, { btnStyle: "toolbar", icon: isEditorEnabled ? _jsx("i", { className: 'dx-icon-font' }) : _jsx("i", { className: 'dx-icon-background' }), caption: isEditorEnabled ? SDKUI_Localizator.HideFormattingOptions : SDKUI_Localizator.ShowFormattingOptions, onClick: toggleEditorMode }) }), children: _jsxs("div", { style: { width: "100%", height: "100%" }, children: [_jsxs("div", { style: { width: "100%", height: "100%" }, children: [_jsx("div", { style: { width: "100%", height: showAttachmentsSection ? "calc(100% - 60px)" : "100%" }, children: _jsx(TMHtmlEditor, { width: '100%', height: '100%', isEditorEnabled: isEditorEnabled, validationItems: validationItems, onValueChanged: onValueChanged, mentionsConfig: mentionsConfig, autoFocus: true, maxLength: maxLength }) }), showAttachmentsSection && _jsxs("div", { style: { display: 'flex', alignItems: 'center', height: '60px', marginTop: '10px' }, children: [_jsx("div", { style: {
220
- width: 'calc(100% - 60px)',
219
+ return _jsx(TMSaveForm, { id: 1, title: SDKUI_Localizator.AddNewComment, showTitleFormMode: false, showErrorCount: false, customSaveButton: _jsx("i", { className: 'dx-icon-send' }), customTooltipSaveButton: SDKUI_Localizator.Send, showUndoButton: false, hasNavigation: false, skipIsModifiedCheck: true, isModal: true, width: calcResponsiveSizes(deviceType, '800px', '800px', '95%'), height: '550px', formMode: FormModes.Create, validationItems: validationItems, exception: exception, isModified: calcIsModified(formData, formDataOrig), onSaveAsync: onSaveAsync, onClose: onCloseCallback, showCloseButton: isCommentRequired ? false : true, customToolbarElements: _jsx("div", { style: { display: 'flex', gap: '2px' }, children: _jsx(TMButton, { btnStyle: "toolbar", icon: isEditorEnabled ? _jsx("i", { className: 'dx-icon-font' }) : _jsx("i", { className: 'dx-icon-background' }), caption: isEditorEnabled ? SDKUI_Localizator.HideFormattingOptions : SDKUI_Localizator.ShowFormattingOptions, onClick: toggleEditorMode }) }), children: _jsxs("div", { style: { width: "100%", height: "100%" }, children: [_jsxs("div", { style: { width: "100%", height: "100%" }, children: [_jsxs("div", { style: { width: "100%", height: showAttachmentsSection ? `calc(100% - 60px)` : '100%' }, children: [isCommentRequired && _jsx("div", { style: {
220
+ padding: '10px',
221
+ width: '100%',
222
+ height: '30px',
223
+ backgroundColor: '#e8f5e9',
224
+ border: '1px solid #81c784',
225
+ borderRadius: '4px',
226
+ fontSize: '13px',
227
+ marginBottom: '10px',
228
+ color: '#2e7d32',
229
+ display: 'flex',
230
+ alignItems: 'center',
231
+ }, children: SDKUI_Localizator.InsertCommentToCompleteOperation }), _jsx("div", { style: { width: "100%", height: isCommentRequired ? `calc(100% - 40px)` : '100%' }, children: _jsx(TMHtmlEditor, { width: '100%', height: '100%', isEditorEnabled: isEditorEnabled, validationItems: validationItems, onValueChanged: onValueChanged, mentionsConfig: mentionsConfig, autoFocus: true, maxLength: maxLength }) })] }), showAttachmentsSection && _jsxs("div", { style: { display: 'flex', alignItems: 'center', height: '60px', marginTop: '10px' }, children: [_jsx("div", { style: {
232
+ width: `calc(100% - ${removeAndEditAttachment ? 60 : 0}px)`,
221
233
  overflowX: 'auto',
222
234
  whiteSpace: 'nowrap',
223
235
  height: '50px',
@@ -231,7 +243,7 @@ const TMBlogCommentForm = (props) => {
231
243
  const tooltipContent = (_jsxs("div", { style: { textAlign: 'left' }, children: [_jsxs("div", { children: [_jsxs("span", { style: { fontWeight: 'bold' }, children: [SDKUI_Localizator.Name, ":"] }), " ", draft.name ?? '-'] }), _jsxs("div", { children: [_jsxs("span", { style: { fontWeight: 'bold' }, children: [SDKUI_Localizator.Author, ":"] }), " ", draft.updaterName ?? '-'] }), _jsx("hr", {}), _jsxs("div", { children: [_jsxs("span", { style: { fontWeight: 'bold' }, children: [SDKUI_Localizator.Version, ":"] }), " ", draft.version] }), _jsxs("div", { children: [_jsxs("span", { style: { fontWeight: 'bold' }, children: [SDKUI_Localizator.Size, ":"] }), " ", formatBytes(draft.size ?? 0)] }), _jsx("hr", {}), _jsxs("div", { children: [_jsxs("span", { style: { fontWeight: 'bold' }, children: [SDKUI_Localizator.CreationTime, ":"] }), " ", Globalization.getDateTimeDisplayValue(draft.creationTime)] }), _jsxs("div", { children: [_jsxs("span", { style: { fontWeight: 'bold' }, children: [SDKUI_Localizator.LastUpdateTime, ":"] }), " ", Globalization.getDateTimeDisplayValue(draft.lastUpdateTime)] })] }));
232
244
  return _jsxs("div", { style: {
233
245
  display: 'inline-flex',
234
- alignItems: 'center', // <-- this centers content vertically
246
+ alignItems: 'center',
235
247
  padding: '4px 8px',
236
248
  margin: '4px',
237
249
  border: '1px solid #ddd',
@@ -258,7 +270,7 @@ const TMBlogCommentForm = (props) => {
258
270
  fontWeight: 'bold',
259
271
  marginRight: '8px',
260
272
  boxShadow: '1px 1px 2px #00000020',
261
- }, children: _jsx(TMTooltip, { content: SDKUI_Localizator.Version, children: draft.version }) })), _jsx(TMTooltip, { content: SDKUI_Localizator.RemoveAttachment, children: _jsx("span", { onClick: () => removeAttachment(draft), style: {
273
+ }, children: _jsx(TMTooltip, { content: SDKUI_Localizator.Version, children: draft.version }) })), removeAndEditAttachment && _jsx(TMTooltip, { content: SDKUI_Localizator.RemoveAttachment, children: _jsx("span", { onClick: () => removeAttachment(draft), style: {
262
274
  display: 'inline-flex',
263
275
  width: '20px',
264
276
  height: '20px',
@@ -270,7 +282,7 @@ const TMBlogCommentForm = (props) => {
270
282
  cursor: 'pointer',
271
283
  boxShadow: '1px 1px 2px #00000020',
272
284
  }, children: _jsx("span", { style: { fontSize: '15px' }, children: "\u00D7" }) }) })] }, draft.did);
273
- })) : (_jsx("div", { style: { color: '#999', width: '100%', textAlign: 'center' }, children: SDKUI_Localizator.NoAttachments })) }), _jsx(TMTooltip, { content: SDKUI_Localizator.Attachments + ": " + currentDraftAttachments.length, children: _jsxs("div", { style: { position: 'relative', display: 'inline-block' }, children: [_jsx("i", { className: "dx-icon-attach", style: {
285
+ })) : (_jsx("div", { style: { color: '#999', width: '100%', textAlign: 'center' }, children: SDKUI_Localizator.NoAttachments })) }), removeAndEditAttachment && _jsx(TMTooltip, { content: SDKUI_Localizator.Attachments + ": " + currentDraftAttachments.length, children: _jsxs("div", { style: { position: 'relative', display: 'inline-block' }, children: [_jsx("i", { className: "dx-icon-attach", style: {
274
286
  width: '50px',
275
287
  height: '50px',
276
288
  marginLeft: '10px',
@@ -57,7 +57,7 @@ const TMDcmtBlog = ({ blogsDatasource, setBlogsDatasource, hasLoadedDataOnce, se
57
57
  isRefreshEnabled: true,
58
58
  isRestoreEnabled: true,
59
59
  isCreateContextualTask: false
60
- }, externalBlogPost: externalBlogPost, resetExternalBlogPost: resetExternalBlogPost, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }) }) }) }), (showCommentForm && tid && did) && _jsx(TMBlogCommentForm, { context: { engine: 'SearchEngine', object: { tid, did } }, onClose: () => setShowCommentForm(false), refreshCallback: refreshCallback, participants: [], showAttachmentsSection: false, allArchivedDocumentsFileItems: [], onFilterCreated: handleFilterCreated })] }));
60
+ }, externalBlogPost: externalBlogPost, resetExternalBlogPost: resetExternalBlogPost, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, afterTaskSaved: refreshCallback }) }) }) }), (showCommentForm && tid && did) && _jsx(TMBlogCommentForm, { context: { engine: 'SearchEngine', object: { tid, did } }, onClose: () => setShowCommentForm(false), refreshCallback: refreshCallback, participants: [], showAttachmentsSection: false, allArchivedDocumentsFileItems: [], onFilterCreated: handleFilterCreated })] }));
61
61
  };
62
62
  export default TMDcmtBlog;
63
63
  const StyledContainer = styled.div ` user-select: none; overflow: hidden; background-color: #ffffff; width: calc(100%); height: calc(100%); display: flex; gap: 10px; `;
@@ -4,11 +4,12 @@ import TMDcmtPreview from './TMDcmtPreview';
4
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
5
  import { ContextMenu } from 'devextreme-react';
6
6
  import { WorkFlowApproveRejectPopUp, WorkFlowMoreInfoPopUp, WorkFlowOperationButtons, WorkFlowReAssignPopUp } from '../workflow/TMWorkflowPopup';
7
- import { DownloadTypes, FormModes } from '../../../ts';
7
+ import { DownloadTypes, FormModes, DcmtOperationTypes } from '../../../ts';
8
8
  import { DeviceType, useDeviceType } from '../../base/TMDeviceProvider';
9
9
  import { useDcmtOperations } from '../../../hooks/useDcmtOperations';
10
+ import { useRelatedDocuments } from '../../../hooks/useRelatedDocuments';
10
11
  import { getWorkItemSetIDAsync, handleArchiveVisibility, searchResultToMetadataValues } from '../../../helper/queryHelper';
11
- 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 } from '../../../helper';
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';
12
13
  import { hasDetailRelations, hasMasterRelations, isXMLFileExt } from '../../../helper/dcmtsHelper';
13
14
  import { Gutters, TMColors } from '../../../utils/theme';
14
15
  import { StyledFormButtonsContainer, StyledLoadingContainer, StyledModalContainer, StyledReferenceButton, StyledSpinner, StyledToolbarCardContainer } from '../../base/Styled';
@@ -27,11 +28,12 @@ import TMMasterDetailDcmts from './TMMasterDetailDcmts';
27
28
  import TMDcmtBlog from './TMDcmtBlog';
28
29
  import { useInputAttachmentsDialog } from '../../../hooks/useInputDialog';
29
30
  import TMModal from '../../base/TMModal';
31
+ import TMChooserForm from '../../forms/TMChooserForm';
32
+ import TMSearchResult from '../search/TMSearchResult';
30
33
  import { useTMPanelManagerContext } from '../../layout/panelManager/TMPanelManagerContext';
31
34
  import TMPanelManagerContainer from '../../layout/panelManager/TMPanelManagerContainer';
32
35
  import { TMPanelManagerWithPersistenceProvider } from '../../layout/panelManager/TMPanelManagerWithPersistenceProvider';
33
36
  import { useWorkflowApprove } from '../../../hooks/useWorkflowApprove';
34
- import ToppyHelpCenter from '../assistant/ToppyHelpCenter';
35
37
  import TMBlogCommentForm from '../blog/TMBlogCommentForm';
36
38
  import WFDiagram from '../workflow/diagram/WFDiagram';
37
39
  import TMTooltip from '../../base/TMTooltip';
@@ -39,9 +41,10 @@ import TMDcmtTasks from './TMDcmtTasks';
39
41
  import TMToppyMessage from '../../../helper/TMToppyMessage';
40
42
  import { getTaskAssignedToMe } from '../tasks/TMTasksUtils';
41
43
  import TMCustomButton from '../../base/TMCustomButton';
44
+ import ToppyDraggableHelpCenter from '../assistant/ToppyDraggableHelpCenter';
42
45
  let abortControllerLocal = new AbortController();
43
46
  //#endregion
44
- 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, inputFile = null, taskFormDialogComponent, taskMoreInfo, connectorFileSave = undefined, inputMids = [], onOpenS4TViewerRequest, s4TViewerDialogComponent, enableDragDropOverlay = false, passToSearch, isSharedDcmt = false, sharedSourceTID, sharedSourceDID, allowButtonsRefs = false, onReferenceClick, }) => {
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 = [], onOpenS4TViewerRequest, s4TViewerDialogComponent, enableDragDropOverlay = false, passToSearch, isSharedDcmt = false, sharedSourceTID, sharedSourceDID, allowButtonsRefs = false, onReferenceClick, }) => {
45
48
  const [id, setID] = useState('');
46
49
  const [showWaitPanelLocal, setShowWaitPanelLocal] = useState(false);
47
50
  const [waitPanelTitleLocal, setWaitPanelTitleLocal] = useState('');
@@ -102,10 +105,44 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
102
105
  setDcmtReferences(undefined);
103
106
  }, [allowButtonsRefs]);
104
107
  const { openConfirmAttachmentsDialog, ConfirmAttachmentsDialog } = useInputAttachmentsDialog();
105
- const { abortController, showWaitPanel, waitPanelTitle, showPrimary, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, downloadDcmtsAsync } = useDcmtOperations();
106
- // Custom hook to manage workflow approval data
108
+ const { abortController, showWaitPanel, waitPanelTitle, showPrimary, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, downloadDcmtsAsync, runOperationAsync } = useDcmtOperations();
107
109
  const { workflowApproveData } = useWorkflowApprove();
110
+ const currentSearchResults = useMemo(() => {
111
+ if (!formData || formData.length === 0 || !TID || !DID)
112
+ return [];
113
+ const selectMIDs = [];
114
+ const rowValues = [];
115
+ formData.forEach(md => {
116
+ if (md.mid !== undefined) {
117
+ selectMIDs.push(md.mid);
118
+ rowValues.push(md.value);
119
+ }
120
+ });
121
+ const searchResult = {
122
+ fromTID: TID,
123
+ selectMIDs: selectMIDs,
124
+ dtdResult: {
125
+ rows: [rowValues],
126
+ columns: selectMIDs.map(mid => ({ name: `MID_${mid}` }))
127
+ },
128
+ dcmtsFound: 1,
129
+ dcmtsReturned: 1
130
+ };
131
+ return [searchResult];
132
+ }, [formData, TID, DID]);
133
+ const relatedDocuments = useRelatedDocuments({
134
+ selectedSearchResult: TID ? { fromTID: Number(TID) } : undefined,
135
+ focusedItem: currentDcmt ? { TID: currentDcmt.tid, DID: currentDcmt.did, rowIndex: 0 } : undefined,
136
+ currentSearchResults: currentSearchResults
137
+ });
138
+ const { relatedDcmts, showRelatedDcmtsChooser, archiveType, isOpenArchiveRelationForm, archiveRelatedDcmtFormTID, archiveRelatedDcmtFormMids, relatedDcmtsChooserDataSource, showManyToManyChooser, manyToManyChooserDataSource, manyToManyRelations, isPairingManyToMany, showPairDcmtsModal, pairedSearchResults, pairFloatingActionConfig, hasManyToManyRelation, canArchiveMasterRelation, canArchiveDetailRelation, pairManyToMany, archiveMasterDocuments, archiveDetailDocuments, checkRelatedDcmtsArchiveCapability, checkManyToManyCapability, setShowRelatedDcmtsChooser, setShowManyToManyChooser, setShowPairDcmtsModal, setIsOpenArchiveRelationForm, setArchiveType, setArchiveRelatedDcmtFormTID, setArchiveRelatedDcmtFormMids, archiveRelatedDcmtHandler, executeManyToManyPairing } = relatedDocuments;
108
139
  const fetchErrorShownRef = useRef(false);
140
+ useEffect(() => {
141
+ if (!TID)
142
+ return;
143
+ checkRelatedDcmtsArchiveCapability();
144
+ checkManyToManyCapability();
145
+ }, [TID, checkRelatedDcmtsArchiveCapability, checkManyToManyCapability]);
109
146
  const deviceType = useDeviceType();
110
147
  const getDcmts = useCallback(() => {
111
148
  return [{ TID: currentDcmt?.tid, DID: currentDcmt?.did, FILEEXT: currentDcmt?.fileExt }];
@@ -200,7 +237,8 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
200
237
  // Imposta il layout e customButtonsLayout immediatamente
201
238
  setLayout(resLayout);
202
239
  if (layoutMode === LayoutModes.Update && customButtonsLayoutResult) {
203
- setCustomButtonsLayout(customButtonsLayoutResult);
240
+ //disabilitato per ora
241
+ //setCustomButtonsLayout(customButtonsLayoutResult);
204
242
  }
205
243
  // Carica DTD e metadata
206
244
  let dtd = await DcmtTypeListCacheService.GetWithNotGrantedAsync(TID, DID, getMetadataResult);
@@ -331,8 +369,8 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
331
369
  return;
332
370
  if (!formDataOrig || formDataOrig.length === 0)
333
371
  return;
334
- // Check if formData has actual user metadata (mid > 99), not just system metadata
335
- if (!formData.some(md => md.mid && md.mid > 99))
372
+ const hasUserMetadata = formData.some(md => md.mid && md.mid > 99);
373
+ if (!hasUserMetadata)
336
374
  return;
337
375
  if (appliedInputMidsRef.current && deepCompare(appliedInputMidsRef.current, inputMids))
338
376
  return;
@@ -460,35 +498,215 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
460
498
  const isMasterDisabled = useMemo(() => layoutMode !== LayoutModes.Update || !DID, [layoutMode, DID]);
461
499
  const isWFDisabled = useMemo(() => layoutMode !== LayoutModes.Update || fetchError || workItems.length <= 0, [layoutMode, fetchError, workItems.length]);
462
500
  const showToppyForApprove = useMemo(() => layoutMode === LayoutModes.Update && !fetchError && workItems.length > 0 && !isOpenDetails && !isOpenMaster, [layoutMode, fetchError, workItems.length, isOpenDetails, isOpenMaster]);
463
- const showToppyForCompleteMoreInfo = useMemo(() => layoutMode === LayoutModes.Update && isTaskMoreInfo(taskMoreInfo?.name) && taskMoreInfo?.state !== Task_States.Completed, [layoutMode, taskMoreInfo?.name, taskMoreInfo?.state]);
464
- const showToppyForReferences = useMemo(() => allowButtonsRefs && layoutMode === LayoutModes.Update && dcmtReferences && dcmtReferences.length > 0 && !isOpenDetails && !isOpenMaster, [allowButtonsRefs, layoutMode, dcmtReferences, isOpenDetails, isOpenMaster]);
501
+ const showToppyForCompleteMoreInfo = useMemo(() => layoutMode === LayoutModes.Update && !!isTaskMoreInfo(taskMoreInfo?.name) && taskMoreInfo?.state !== Task_States.Completed, [layoutMode, taskMoreInfo?.name, taskMoreInfo?.state]);
502
+ const showToppyForReferences = useMemo(() => allowButtonsRefs && layoutMode === LayoutModes.Update && !!(dcmtReferences && dcmtReferences.length > 0) && !isOpenDetails && !isOpenMaster, [allowButtonsRefs, layoutMode, dcmtReferences, isOpenDetails, isOpenMaster]);
465
503
  const isMobile = useMemo(() => deviceType === DeviceType.MOBILE, [deviceType]);
466
504
  const isApprView = useMemo(() => fromDTD?.templateTID === TemplateTIDs.WF_WIApprView, [fromDTD?.templateTID]);
467
505
  const workitemSetID = useMemo(() => workItems.find(o => o.did === Number(DID))?.setID || formData.find(o => o.md?.name === WorkItemMetadataNames.WI_SetID)?.value, [workItems, DID, formData]);
468
506
  const approvalVID = useMemo(() => workItems.length > 0 ? Number(workItems[0].tid) : -1, [workItems]);
507
+ //here
469
508
  const commandsMenuItems = useMemo(() => {
470
- const items = [
471
- { icon: svgToString(_jsx(IconDownload, {})), operationType: 'singleRow', disabled: fromDTD?.perm?.canRetrieveFile !== AccessLevels.Yes, text: "Download file", onClick: async () => await downloadDcmtsAsync(getDcmts(), DownloadTypes.Dcmt, "download") },
472
- { icon: svgToString(_jsx(IconDownload, {})), operationType: 'singleRow', disabled: !isXMLFileExt(currentDcmt?.fileExt), text: "Download allegati XML", onClick: async () => await downloadDcmtsAsync(getDcmts(), DownloadTypes.Attachment, "download", undefined, openConfirmAttachmentsDialog) },
473
- ...(allowRelations && currentTIDHasMasterRelations ? [{ icon: svgToString(_jsx(IconDetailDcmts, { transform: 'scale(-1, 1)' })), operationType: 'singleRow', disabled: isMasterDisabled, text: SDKUI_Localizator.DcmtsMaster, onClick: () => { if (!isMasterDisabled)
474
- setIsOpenMaster(!isOpenMaster); } }] : []),
475
- ...(allowRelations && currentTIDHasDetailRelations ? [{ icon: svgToString(_jsx(IconDetailDcmts, {})), operationType: 'singleRow', disabled: isDetailsDisabled, text: SDKUI_Localizator.DcmtsDetail, onClick: () => { if (!isDetailsDisabled)
476
- setIsOpenDetails(!isOpenDetails); } }] : []),
477
- ];
509
+ const items = [];
510
+ const operationsItems = [];
511
+ operationsItems.push({
512
+ icon: svgToString(_jsx(IconDownload, {})),
513
+ operationType: 'singleRow',
514
+ disabled: fromDTD?.perm?.canRetrieveFile !== AccessLevels.Yes,
515
+ text: SDKUI_Localizator.DownloadFile,
516
+ onClick: async () => await downloadDcmtsAsync(getDcmts(), DownloadTypes.Dcmt, "download", undefined, undefined, true)
517
+ }, {
518
+ icon: svgToString(_jsx(IconDownload, {})),
519
+ operationType: 'singleRow',
520
+ disabled: !isXMLFileExt(currentDcmt?.fileExt),
521
+ text: SDKUI_Localizator.DownloadXMLAttachments,
522
+ onClick: async () => await downloadDcmtsAsync(getDcmts(), DownloadTypes.Attachment, "download", undefined, openConfirmAttachmentsDialog, true)
523
+ });
524
+ if (layoutMode === LayoutModes.Update && DID) {
525
+ operationsItems.push({
526
+ icon: svgToString(_jsx(IconStar, {})),
527
+ text: SDKUI_Localizator.AddTo + ' ' + SDKUI_Localizator.Favorites,
528
+ operationType: 'singleRow',
529
+ disabled: false,
530
+ onClick: async () => {
531
+ await runOperationAsync(getDcmts(), DcmtOperationTypes.AddToFavs);
532
+ },
533
+ });
534
+ }
535
+ if (onTaskCreateRequest && layoutMode === LayoutModes.Update && DID) {
536
+ operationsItems.push({
537
+ icon: svgToString(_jsx(IconActivity, {})),
538
+ text: SDKUI_Localizator.CreateContextualTask,
539
+ operationType: 'singleRow',
540
+ disabled: false,
541
+ onClick: () => {
542
+ const dcmt = getDcmts()[0];
543
+ const taskContext = {
544
+ document: {
545
+ tid: dcmt.TID,
546
+ did: dcmt.DID,
547
+ name: fromDTD?.description || ''
548
+ }
549
+ };
550
+ onTaskCreateRequest(taskContext);
551
+ }
552
+ });
553
+ }
554
+ if (operationsItems.length > 0) {
555
+ items.push({
556
+ icon: svgToString(_jsx(IconCheck, {})),
557
+ text: SDKUI_Localizator.DocumentOperations,
558
+ items: operationsItems
559
+ });
560
+ }
561
+ if (allowRelations && layoutMode === LayoutModes.Update && DID) {
562
+ const relationsItems = [
563
+ {
564
+ icon: svgToString(_jsx(IconPair, {})),
565
+ text: SDKUI_Localizator.MatchManyDocumentsManyToMany,
566
+ operationType: 'singleRow',
567
+ disabled: !hasManyToManyRelation,
568
+ onClick: async () => await pairManyToMany?.(true)
569
+ },
570
+ {
571
+ icon: svgToString(_jsx(IconUnpair, {})),
572
+ text: SDKUI_Localizator.UnmatchManyDocumentsManyToMany,
573
+ operationType: 'singleRow',
574
+ disabled: !hasManyToManyRelation,
575
+ onClick: async () => await pairManyToMany?.(false)
576
+ },
577
+ {
578
+ icon: svgToString(_jsx(IconArchiveMaster, {})),
579
+ text: SDKUI_Localizator.ArchiveMasterDocument,
580
+ operationType: 'singleRow',
581
+ beginGroup: true,
582
+ disabled: canArchiveMasterRelation !== true,
583
+ onClick: async () => { if (TID)
584
+ await archiveMasterDocuments?.(TID); }
585
+ },
586
+ {
587
+ icon: svgToString(_jsx(IconArchiveDetail, {})),
588
+ text: SDKUI_Localizator.ArchiveDetailDocument,
589
+ operationType: 'singleRow',
590
+ disabled: canArchiveDetailRelation !== true,
591
+ onClick: async () => { if (TID)
592
+ await archiveDetailDocuments?.(TID); }
593
+ },
594
+ {
595
+ icon: svgToString(_jsx(IconDetailDcmts, { transform: 'scale(-1, 1)' })),
596
+ text: SDKUI_Localizator.DcmtsMaster,
597
+ operationType: 'singleRow',
598
+ visible: true,
599
+ beginGroup: true,
600
+ disabled: !currentTIDHasMasterRelations || isMasterDisabled,
601
+ onClick: () => { if (!isMasterDisabled)
602
+ setIsOpenMaster(!isOpenMaster); }
603
+ },
604
+ {
605
+ icon: svgToString(_jsx(IconDetailDcmts, {})),
606
+ text: SDKUI_Localizator.DcmtsDetail,
607
+ operationType: 'singleRow',
608
+ disabled: !currentTIDHasDetailRelations || isDetailsDisabled,
609
+ visible: true,
610
+ onClick: () => { if (!isDetailsDisabled)
611
+ setIsOpenDetails(!isOpenDetails); }
612
+ }
613
+ ];
614
+ items.push({
615
+ icon: svgToString(_jsx(IconRelation, {})),
616
+ text: SDKUI_Localizator.Relations,
617
+ items: relationsItems
618
+ });
619
+ }
620
+ if (layoutMode === LayoutModes.Update && DID) {
621
+ const fullTextItems = [
622
+ {
623
+ icon: svgToString(_jsx(IconInfo, {})),
624
+ text: SDKUI_Localizator.IndexingInformation,
625
+ operationType: 'singleRow',
626
+ disabled: false,
627
+ onClick: async () => {
628
+ try {
629
+ TMSpinner.show({ description: `${SDKUI_Localizator.Loading}...` });
630
+ const dcmts = getDcmts();
631
+ const msg = await SDK_Globals.tmSession?.NewSearchEngine().FreeSearchGetDcmtInfoAsync(dcmts[0].TID, dcmts[0].DID);
632
+ TMMessageBoxManager.show({ buttons: [ButtonNames.OK], message: msg, title: SDKUI_Localizator.IndexingInformation });
633
+ }
634
+ catch (e) {
635
+ TMExceptionBoxManager.show({ exception: e });
636
+ }
637
+ finally {
638
+ TMSpinner.hide();
639
+ }
640
+ }
641
+ },
642
+ {
643
+ icon: svgToString(_jsx(IconArchiveDoc, {})),
644
+ text: SDKUI_Localizator.IndexOrReindex,
645
+ operationType: 'singleRow',
646
+ disabled: false,
647
+ onClick: async () => {
648
+ await runOperationAsync(getDcmts(), DcmtOperationTypes.FreeSearchReindex);
649
+ }
650
+ },
651
+ {
652
+ icon: svgToString(_jsx(IconDelete, {})),
653
+ text: SDKUI_Localizator.IndexingDelete,
654
+ operationType: 'singleRow',
655
+ disabled: false,
656
+ onClick: async () => {
657
+ await runOperationAsync(getDcmts(), DcmtOperationTypes.FreeSearchPurge);
658
+ }
659
+ }
660
+ ];
661
+ items.push({
662
+ icon: svgToString(_jsx(IconSearch, {})),
663
+ text: SDKUI_Localizator.FullTextSearch,
664
+ items: fullTextItems
665
+ });
666
+ }
478
667
  // Aggiungi submenu "Bottoni personalizzati" se esistono customButtons
479
668
  if (customButtonsLayout?.customButtons && Array.isArray(customButtonsLayout.customButtons) && customButtonsLayout.customButtons.length > 0) {
480
- const customButtonsItems = customButtonsLayout.customButtons.map((customButton) => ({
669
+ const customButtonsItems = customButtonsLayout.customButtons
670
+ .filter((customButton) => customButton.isForUpdate && customButton.isForUpdate > 0)
671
+ .map((customButton) => ({
672
+ icon: svgToString(TMImageLibrary({ imageID: customButton.glyphID, showPath: true })),
481
673
  text: customButton.title || 'Bottone personalizzato',
482
674
  onClick: () => setCustomButton(customButton)
483
675
  }));
676
+ //disabilitato per ora
677
+ /*
484
678
  items.push({
485
- icon: svgToString(_jsx(IconCheck, {})),
486
- text: 'Bottoni personalizzati',
679
+ icon: svgToString(<IconCheck />),
680
+ text: SDKUI_Localizator.CustomButtons,
487
681
  items: customButtonsItems
488
- });
682
+ } as TMDataGridContextMenuItem);*/
489
683
  }
490
684
  return items;
491
- }, [fromDTD?.perm?.canRetrieveFile, currentDcmt?.fileExt, allowRelations, currentTIDHasMasterRelations, isMasterDisabled, currentTIDHasDetailRelations, isDetailsDisabled, customButtonsLayout, getDcmts, downloadDcmtsAsync, openConfirmAttachmentsDialog]);
685
+ }, [
686
+ fromDTD?.perm?.canRetrieveFile,
687
+ fromDTD?.description,
688
+ currentDcmt?.fileExt,
689
+ allowRelations,
690
+ currentTIDHasMasterRelations,
691
+ isMasterDisabled,
692
+ currentTIDHasDetailRelations,
693
+ isDetailsDisabled,
694
+ customButtonsLayout,
695
+ layoutMode,
696
+ TID,
697
+ DID,
698
+ onTaskCreateRequest,
699
+ hasManyToManyRelation,
700
+ canArchiveMasterRelation,
701
+ canArchiveDetailRelation,
702
+ pairManyToMany,
703
+ archiveMasterDocuments,
704
+ archiveDetailDocuments,
705
+ getDcmts,
706
+ downloadDcmtsAsync,
707
+ runOperationAsync,
708
+ openConfirmAttachmentsDialog
709
+ ]);
492
710
  const isModified = useMemo(() => calcIsModified(formData, formDataOrig), [formData, formDataOrig]);
493
711
  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 &&
494
712
  _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]);
@@ -1138,12 +1356,12 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1138
1356
  isEditable: true,
1139
1357
  value: FormulaHelper.addFormulaTag(newFormula.expression)
1140
1358
  }));
1141
- } }), 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 })] }), (showToppyForApprove || showToppyForCompleteMoreInfo || showToppyForReferences) && (_jsx(ToppyHelpCenter, { deviceType: deviceType, usePortal: false, content: _jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, children: [showToppyForApprove && (workItems.length === 1 ?
1359
+ } }), 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, content: _jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, children: [showToppyForApprove && (workItems.length === 1 ?
1142
1360
  _jsx(WorkFlowOperationButtons, { deviceType: deviceType, onApprove: () => setShowApprovePopup(true), onSignApprove: handleSignApprove, onReject: () => setShowRejectPopup(true), onReAssign: () => setShowReAssignPopup(true), onMoreInfo: () => setShowMoreInfoPopup(true), dtd: fromDTD })
1143
1361
  :
1144
1362
  _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: () => {
1145
1363
  setShowCommentForm(true);
1146
- } })] })), showToppyForReferences && dcmtReferences && dcmtReferences
1364
+ } })] })), (showToppyForReferences && (dcmtReferences && dcmtReferences.length > 0)) && dcmtReferences
1147
1365
  .filter(ref => ref.objClass === ObjectClasses.Dossier || ref.objClass === ObjectClasses.WorkingGroup) // keep only known objClass types
1148
1366
  .map((ref, index, arr) => {
1149
1367
  const mapEntry = referenceActionMap[String(ref.objClass)];
@@ -1152,17 +1370,58 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1152
1370
  height: 1,
1153
1371
  backgroundColor: 'rgba(255,255,255,0.2)',
1154
1372
  margin: '6px 0'
1155
- } })), _jsxs(StyledReferenceButton, { onClick: () => handleNavigateToReference(ref), children: [_jsx("span", { children: label }), _jsx("span", { children: `"${ref.objName}"` })] }, `ref-${index}-${ref.objID}`)] }, `ref-frag-${index}-${ref.objID}`));
1156
- })] }) }))] }), (showCommentForm && TID && DID) &&
1373
+ } })), _jsxs(StyledReferenceButton, { onClick: () => handleNavigateToReference(ref), onDoubleClick: (e) => { e.preventDefault(); e.stopPropagation(); }, children: [_jsx("span", { children: label }), _jsx("span", { children: `"${ref.objName}"` })] }, `ref-${index}-${ref.objID}`)] }, `ref-frag-${index}-${ref.objID}`));
1374
+ })] }) })] }), (showCommentForm && TID && DID) &&
1157
1375
  _jsx(TMBlogCommentForm, { context: { engine: 'SearchEngine', object: { tid: TID, did: DID } }, onClose: () => setShowCommentForm(false), refreshCallback: handleCompleteMoreInfo, participants: [], showAttachmentsSection: false, allArchivedDocumentsFileItems: [] }), isOpenDetails &&
1158
1376
  _jsx(StyledModalContainer, { children: _jsx(TMMasterDetailDcmts, { deviceType: deviceType, isForMaster: false, inputDcmts: getSelectionDcmtInfo(), allowNavigation: allowNavigation, canNext: canNext, canPrev: canPrev, onNext: onNext, onPrev: onPrev, onBack: () => setIsOpenDetails(false), allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }) }), isOpenMaster &&
1159
1377
  _jsxs(StyledModalContainer, { children: [_jsx(TMMasterDetailDcmts, { deviceType: deviceType, inputDcmts: getSelectionDcmtInfo(), isForMaster: true, allowNavigation: allowNavigation, canNext: canNext, canPrev: canPrev, onNext: onNext, onPrev: onPrev, onBack: () => setIsOpenMaster(false), appendMasterDcmts: handleAddItem, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }), secondaryMasterDcmts.length > 0 && secondaryMasterDcmts.map((dcmt, index) => {
1160
1378
  return (_jsx(StyledModalContainer, { children: _jsx(TMMasterDetailDcmts, { deviceType: deviceType, inputDcmts: [dcmt], isForMaster: true, allowNavigation: false, onBack: () => handleRemoveItem(dcmt.TID, dcmt.DID), appendMasterDcmts: handleAddItem, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }) }, `${index}-${dcmt.DID}`));
1161
1379
  })] }), taskFormDialogComponent, s4TViewerDialogComponent] }));
1162
1380
  };
1163
- return (_jsx(_Fragment, { children: (isModal && onClose)
1164
- ? _jsx(TMModal, { title: titleModal, onClose: handleClose, width: widthModal ?? '100%', height: heightModal ?? '100%', hidePopup: false, askClosingConfirm: true, children: _jsx("div", { style: { width: "100%", height: "100%", display: 'block', padding: "4px", position: 'relative' }, children: renderDcmtForm() }) })
1165
- : renderDcmtForm() }));
1381
+ return (_jsxs(_Fragment, { children: [(isModal && onClose)
1382
+ ? _jsx(TMModal, { title: titleModal, onClose: handleClose, width: widthModal ?? '100%', height: heightModal ?? '100%', hidePopup: false, askClosingConfirm: true, children: _jsx("div", { style: { width: "100%", height: "100%", display: 'block', padding: "4px", position: 'relative' }, children: renderDcmtForm() }) })
1383
+ : renderDcmtForm(), showRelatedDcmtsChooser && (_jsx(TMChooserForm, { dataSource: relatedDcmtsChooserDataSource, onChoose: async (selectedRelation) => {
1384
+ try {
1385
+ setShowRelatedDcmtsChooser(false);
1386
+ TMSpinner.show({ description: SDKUI_Localizator.Loading });
1387
+ const relation = relatedDcmts?.find(r => r.id === selectedRelation[0]);
1388
+ if (!relation || !archiveType)
1389
+ return;
1390
+ await archiveRelatedDcmtHandler(relation, archiveType);
1391
+ }
1392
+ catch (error) {
1393
+ TMExceptionBoxManager.show({ exception: error });
1394
+ }
1395
+ finally {
1396
+ TMSpinner.hide();
1397
+ }
1398
+ }, onClose: () => setShowRelatedDcmtsChooser(false), manageUseLocalizedName: false })), showManyToManyChooser && (_jsx(TMChooserForm, { dataSource: manyToManyChooserDataSource, onChoose: async (selectedRelation) => {
1399
+ try {
1400
+ setShowManyToManyChooser(false);
1401
+ TMSpinner.show({ description: SDKUI_Localizator.Loading });
1402
+ const relation = manyToManyRelations?.find(r => r.id === selectedRelation[0]);
1403
+ if (!relation)
1404
+ return;
1405
+ await executeManyToManyPairing(relation, isPairingManyToMany);
1406
+ }
1407
+ catch (error) {
1408
+ TMExceptionBoxManager.show({ exception: error });
1409
+ }
1410
+ finally {
1411
+ TMSpinner.hide();
1412
+ }
1413
+ }, 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: () => {
1414
+ setIsOpenArchiveRelationForm(false);
1415
+ setArchiveType(undefined);
1416
+ setArchiveRelatedDcmtFormTID(undefined);
1417
+ setArchiveRelatedDcmtFormMids([]);
1418
+ }, onSavedAsyncCallback: async (tid, did) => {
1419
+ setIsOpenArchiveRelationForm(false);
1420
+ setArchiveType(undefined);
1421
+ setArchiveRelatedDcmtFormTID(undefined);
1422
+ setArchiveRelatedDcmtFormMids([]);
1423
+ await fetchData();
1424
+ }, 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 }) }))] }));
1166
1425
  };
1167
1426
  export default TMDcmtForm;
1168
1427
  /**
@@ -27,19 +27,24 @@ const TMDcmtIcon = ({ fileExtension, fileCount, isLexProt, isSigned, isMail, isS
27
27
  e.stopPropagation();
28
28
  e.preventDefault();
29
29
  if (tid && did) {
30
- let dcmt = [{ TID: tid, DID: did, FILEEXT: fileExtension }];
30
+ const fileName = fileExtension ? `${did}.${fileExtension}` : undefined;
31
+ let dcmt = [{ TID: tid, DID: did, FILEEXT: fileExtension, fileName: fileName }];
32
+ // Per file con problemi di estensione nelle blob URL (.p7m, .msg), forza la modalità download
33
+ const fileExtLower = fileExtension?.toLowerCase();
34
+ const needsForceDownload = fileExtLower?.includes('p7m') || fileExtLower === 'msg';
35
+ const effectiveDownloadMode = (downloadMode === 'openInNewWindow' && needsForceDownload) ? 'download' : downloadMode;
31
36
  // Usa la funzione passata tramite prop se disponibile, altrimenti usa l'hook interno
32
37
  if (openInOffice) {
33
38
  await openInOffice(dcmt);
34
39
  }
35
40
  else if (onDownloadDcmtsAsync) {
36
- await onDownloadDcmtsAsync?.(dcmt, DownloadTypes.Dcmt, downloadMode);
41
+ await onDownloadDcmtsAsync?.(dcmt, DownloadTypes.Dcmt, effectiveDownloadMode);
37
42
  }
38
43
  else {
39
- await downloadDcmtsAsync(dcmt, DownloadTypes.Dcmt, downloadMode);
44
+ await downloadDcmtsAsync(dcmt, DownloadTypes.Dcmt, effectiveDownloadMode);
40
45
  }
41
46
  }
42
- }, [tid, did, downloadMode, openInOffice, onDownloadDcmtsAsync, downloadDcmtsAsync]);
47
+ }, [tid, did, fileExtension, downloadMode, openInOffice, onDownloadDcmtsAsync, downloadDcmtsAsync]);
43
48
  const isDownloadable = downloadMode !== "none" &&
44
49
  tid !== undefined &&
45
50
  did !== undefined &&