@topconsultnpm/sdkui-react 6.20.0-test1 → 6.21.0-dev1.2

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 (125) hide show
  1. package/lib/components/NewComponents/ContextMenu/styles.d.ts +3 -1
  2. package/lib/components/NewComponents/ContextMenu/styles.js +7 -5
  3. package/lib/components/NewComponents/FloatingMenuBar/TMFloatingMenuBar.js +7 -1
  4. package/lib/components/base/Styled.d.ts +4 -1
  5. package/lib/components/base/Styled.js +11 -3
  6. package/lib/components/base/TMPanel.js +6 -4
  7. package/lib/components/base/TMPopUp.js +4 -0
  8. package/lib/components/base/TMTreeView.d.ts +3 -1
  9. package/lib/components/base/TMTreeView.js +68 -21
  10. package/lib/components/base/TMWaitPanel.js +6 -5
  11. package/lib/components/choosers/TMDataListItemChooser.js +1 -1
  12. package/lib/components/choosers/TMDataListItemEditor.d.ts +11 -0
  13. package/lib/components/choosers/TMDataListItemEditor.js +130 -0
  14. package/lib/components/choosers/TMDataListItemFields.d.ts +11 -0
  15. package/lib/components/choosers/TMDataListItemFields.js +61 -0
  16. package/lib/components/choosers/TMDataListItemPicker.d.ts +2 -0
  17. package/lib/components/choosers/TMDataListItemPicker.js +182 -18
  18. package/lib/components/choosers/TMDynDataListItemChooser.js +11 -6
  19. package/lib/components/choosers/TMImageIDChooser.d.ts +16 -0
  20. package/lib/components/choosers/TMImageIDChooser.js +53 -0
  21. package/lib/components/choosers/TMMetadataChooser.js +1 -1
  22. package/lib/components/choosers/TMUserChooser.js +1 -1
  23. package/lib/components/editors/TMDateBox.js +1 -1
  24. package/lib/components/editors/TMHtmlEditor.js +1 -1
  25. package/lib/components/editors/TMLocalizedTextBox.d.ts +1 -0
  26. package/lib/components/editors/TMLocalizedTextBox.js +3 -3
  27. package/lib/components/editors/TMMetadataValues.js +203 -41
  28. package/lib/components/editors/TMTextArea.d.ts +1 -0
  29. package/lib/components/editors/TMTextArea.js +6 -6
  30. package/lib/components/editors/TMTextBox.js +9 -10
  31. package/lib/components/features/archive/TMArchive.d.ts +3 -1
  32. package/lib/components/features/archive/TMArchive.js +31 -44
  33. package/lib/components/features/blog/TMBlogCommentForm.d.ts +3 -0
  34. package/lib/components/features/blog/TMBlogCommentForm.js +42 -36
  35. package/lib/components/features/documents/TMDcmtBlog.d.ts +1 -0
  36. package/lib/components/features/documents/TMDcmtBlog.js +2 -1
  37. package/lib/components/features/documents/TMDcmtForm.d.ts +44 -34
  38. package/lib/components/features/documents/TMDcmtForm.js +365 -563
  39. package/lib/components/features/documents/TMDcmtFormActionButtons.d.ts +34 -0
  40. package/lib/components/features/documents/TMDcmtFormActionButtons.js +124 -0
  41. package/lib/components/features/documents/TMDcmtPreview.js +66 -13
  42. package/lib/components/features/documents/TMDcmtTasks.d.ts +3 -1
  43. package/lib/components/features/documents/TMDcmtTasks.js +2 -2
  44. package/lib/components/features/documents/TMFileUploader.d.ts +5 -0
  45. package/lib/components/features/documents/TMFileUploader.js +28 -6
  46. package/lib/components/features/documents/TMMasterDetailDcmts.js +31 -85
  47. package/lib/components/features/documents/TMRelationViewer.d.ts +7 -1
  48. package/lib/components/features/documents/TMRelationViewer.js +497 -111
  49. package/lib/components/features/search/TMSearch.d.ts +2 -2
  50. package/lib/components/features/search/TMSearch.js +3 -3
  51. package/lib/components/features/search/TMSearchQueryPanel.js +6 -6
  52. package/lib/components/features/search/TMSearchResult.d.ts +28 -25
  53. package/lib/components/features/search/TMSearchResult.js +445 -562
  54. package/lib/components/features/search/TMSignatureInfoContent.js +10 -6
  55. package/lib/components/features/search/TMTreeSelector.js +1 -1
  56. package/lib/components/features/tasks/TMTaskForm.d.ts +3 -1
  57. package/lib/components/features/tasks/TMTaskForm.js +61 -193
  58. package/lib/components/features/tasks/TMTaskFormUtils.d.ts +80 -0
  59. package/lib/components/features/tasks/TMTaskFormUtils.js +559 -0
  60. package/lib/components/features/tasks/TMTasksUtils.d.ts +3 -1
  61. package/lib/components/features/tasks/TMTasksUtils.js +46 -16
  62. package/lib/components/features/tasks/TMTasksUtilsView.d.ts +0 -7
  63. package/lib/components/features/tasks/TMTasksUtilsView.js +7 -14
  64. package/lib/components/features/tasks/TMTasksView.js +5 -3
  65. package/lib/components/features/workflow/TMWorkflowPopup.d.ts +20 -3
  66. package/lib/components/features/workflow/TMWorkflowPopup.js +21 -109
  67. package/lib/components/features/workflow/diagram/ConnectionComponent.d.ts +1 -0
  68. package/lib/components/features/workflow/diagram/ConnectionComponent.js +6 -2
  69. package/lib/components/features/workflow/diagram/DiagramItemForm.d.ts +2 -0
  70. package/lib/components/features/workflow/diagram/DiagramItemForm.js +32 -25
  71. package/lib/components/features/workflow/diagram/RecipientList.d.ts +3 -1
  72. package/lib/components/features/workflow/diagram/RecipientList.js +13 -9
  73. package/lib/components/features/workflow/diagram/WFDiagram.js +102 -5
  74. package/lib/components/features/workflow/diagram/workflowHelpers.js +31 -19
  75. package/lib/components/forms/Login/TMLoginForm.js +1 -1
  76. package/lib/components/forms/TMSaveForm.js +61 -13
  77. package/lib/components/grids/TMBlogsPost.js +8 -8
  78. package/lib/components/grids/TMBlogsPostUtils.js +2 -2
  79. package/lib/components/grids/TMRecentsManager.js +1 -1
  80. package/lib/components/index.d.ts +2 -0
  81. package/lib/components/index.js +2 -0
  82. package/lib/components/layout/panelManager/TMPanelManagerContainer.js +3 -2
  83. package/lib/components/pages/TMPage.js +4 -0
  84. package/lib/components/query/TMQueryEditor.d.ts +1 -0
  85. package/lib/components/query/TMQueryEditor.js +3 -3
  86. package/lib/components/viewers/TMMidViewer.js +2 -1
  87. package/lib/components/viewers/TMTidViewer.js +7 -3
  88. package/lib/helper/Enum_Localizator.js +5 -0
  89. package/lib/helper/GlobalStyles.js +3 -0
  90. package/lib/helper/SDKUI_Globals.d.ts +12 -0
  91. package/lib/helper/SDKUI_Globals.js +21 -1
  92. package/lib/helper/SDKUI_Localizator.d.ts +31 -7
  93. package/lib/helper/SDKUI_Localizator.js +286 -46
  94. package/lib/helper/TMIcons.d.ts +2 -1
  95. package/lib/helper/TMIcons.js +4 -1
  96. package/lib/helper/TMUtils.d.ts +33 -41
  97. package/lib/helper/TMUtils.js +157 -170
  98. package/lib/helper/checkinCheckoutManager.js +6 -2
  99. package/lib/helper/helpers.d.ts +6 -2
  100. package/lib/helper/helpers.js +24 -8
  101. package/lib/helper/index.d.ts +1 -0
  102. package/lib/helper/index.js +1 -0
  103. package/lib/helper/queryHelper.js +1 -1
  104. package/lib/hooks/useBetaFeatures.d.ts +1 -0
  105. package/lib/hooks/useBetaFeatures.js +41 -0
  106. package/lib/hooks/useCheckInOutOperations.d.ts +7 -6
  107. package/lib/hooks/useCheckInOutOperations.js +9 -16
  108. package/lib/hooks/useDataUserIdItem.js +2 -2
  109. package/lib/hooks/useDcmtOperations.d.ts +3 -2
  110. package/lib/hooks/useDcmtOperations.js +16 -4
  111. package/lib/hooks/useDocumentOperations.d.ts +139 -0
  112. package/lib/hooks/useDocumentOperations.js +1275 -0
  113. package/lib/hooks/useRelatedDocuments.d.ts +1 -1
  114. package/lib/hooks/useRelatedDocuments.js +64 -42
  115. package/lib/index.d.ts +1 -0
  116. package/lib/index.js +1 -0
  117. package/lib/services/platform_services.d.ts +1 -1
  118. package/lib/services/platform_services.js +4 -0
  119. package/lib/ts/types.d.ts +5 -1
  120. package/lib/ts/types.js +1 -0
  121. package/package.json +55 -55
  122. package/lib/components/features/search/TMSearchResultsMenuItems.d.ts +0 -11
  123. package/lib/components/features/search/TMSearchResultsMenuItems.js +0 -770
  124. package/lib/components/features/search/TMSignSettingsForm.d.ts +0 -9
  125. package/lib/components/features/search/TMSignSettingsForm.js +0 -621
@@ -0,0 +1,34 @@
1
+ import React from "react";
2
+ import { DcmtTypeDescriptor, TaskDescriptor, ObjectRef } from "@topconsultnpm/sdk-ts";
3
+ import { IWorkItemData } from "../../../ts";
4
+ import { DeviceType } from "../../base/TMDeviceProvider";
5
+ interface TMDcmtFormActionButtonsProps {
6
+ showToppyForApprove: boolean;
7
+ workItems: Array<IWorkItemData>;
8
+ deviceType: DeviceType | undefined;
9
+ isMobile: boolean;
10
+ handleSignApprove: () => void;
11
+ updateShowApprovePopup: (value: boolean) => void;
12
+ updateShowRejectPopup: (value: boolean) => void;
13
+ updateShowReAssignPopup: (value: boolean) => void;
14
+ updateShowMoreInfoPopup: (value: boolean) => void;
15
+ fromDTD: DcmtTypeDescriptor | undefined;
16
+ showToppyForCompleteMoreInfo: boolean;
17
+ moreInfoTasks?: Array<TaskDescriptor>;
18
+ setShowCommentForm: React.Dispatch<React.SetStateAction<boolean>>;
19
+ showToppyForReferences: boolean;
20
+ dcmtReferences: ObjectRef[] | undefined;
21
+ referenceActionMap: {
22
+ Dossier: {
23
+ label: string;
24
+ };
25
+ WorkingGroup: {
26
+ label: string;
27
+ };
28
+ };
29
+ handleNavigateToReference: (ref: ObjectRef) => void;
30
+ setShowMoreInfoTaskPopup: React.Dispatch<React.SetStateAction<boolean>>;
31
+ setShowMoreInfoTaskTask: React.Dispatch<React.SetStateAction<TaskDescriptor | undefined>>;
32
+ }
33
+ declare const TMDcmtFormActionButtons: (props: TMDcmtFormActionButtonsProps) => import("react/jsx-runtime").JSX.Element;
34
+ export default TMDcmtFormActionButtons;
@@ -0,0 +1,124 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useMemo, useRef } from "react";
3
+ import { ObjectClasses, SDK_Globals } from "@topconsultnpm/sdk-ts";
4
+ import { TASK_MORE_INFO_PREFIX_NAME, SDKUI_Localizator, PDGS_COLORS } from "../../../helper";
5
+ import { TMColors } from "../../../utils/theme";
6
+ import { ReferencesContainer, StyledReferenceButton } from "../../base/Styled";
7
+ import TMButton from "../../base/TMButton";
8
+ import TMTooltip from "../../base/TMTooltip";
9
+ import { WorkFlowOperationButtons } from "../workflow/TMWorkflowPopup";
10
+ const TMDcmtFormActionButtons = (props) => {
11
+ const { showToppyForApprove, workItems, deviceType, isMobile, handleSignApprove, updateShowApprovePopup, updateShowRejectPopup, updateShowReAssignPopup, updateShowMoreInfoPopup, fromDTD, showToppyForCompleteMoreInfo, moreInfoTasks, setShowCommentForm, showToppyForReferences, dcmtReferences, referenceActionMap, handleNavigateToReference, setShowMoreInfoTaskPopup, setShowMoreInfoTaskTask } = props;
12
+ const tasksNumber = useMemo(() => moreInfoTasks?.length ?? 0, [moreInfoTasks]);
13
+ const currentTask = useMemo(() => {
14
+ if (!moreInfoTasks || moreInfoTasks.length === 0)
15
+ return null;
16
+ if (moreInfoTasks.length === 1)
17
+ return moreInfoTasks[0];
18
+ // If there are multiple tasks, we cannot determine which one is relevant, so we return null
19
+ return null;
20
+ }, [moreInfoTasks]);
21
+ const { hasMoreInfo, hasApprove, hasReferences } = useMemo(() => {
22
+ const referencesExist = showToppyForReferences && dcmtReferences?.some(ref => ref.objClass === ObjectClasses.Dossier || ref.objClass === ObjectClasses.WorkingGroup);
23
+ return {
24
+ hasMoreInfo: Boolean(showToppyForCompleteMoreInfo),
25
+ hasApprove: Boolean(showToppyForApprove),
26
+ hasReferences: Boolean(referencesExist)
27
+ };
28
+ }, [
29
+ showToppyForCompleteMoreInfo,
30
+ showToppyForApprove,
31
+ showToppyForReferences,
32
+ dcmtReferences
33
+ ]);
34
+ const Divider = () => (_jsx("div", { style: { height: '1px', width: '100%', background: 'linear-gradient(to right, transparent, rgba(255,255,255,0.4), transparent)', margin: '3px 0', opacity: 0.8, } }));
35
+ return _jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, children: [hasMoreInfo && (tasksNumber === 1 ? (_jsx("div", { style: { display: 'flex', gap: "10px", flexDirection: 'column', alignItems: 'center' }, children: _jsx("div", { style: {
36
+ padding: '10px',
37
+ color: '#FFFFFF',
38
+ maxWidth: '240px',
39
+ background: 'linear-gradient(135deg, #1E90FF 0%, #0077BE 60%, #00509E 100%)',
40
+ border: '1px solid rgba(255,255,255,0.15)',
41
+ boxShadow: '0 8px 20px rgba(0, 0, 50, 0.4)',
42
+ backdropFilter: 'blur(6px)',
43
+ display: 'flex',
44
+ flexDirection: 'column',
45
+ alignItems: 'center',
46
+ textAlign: 'center',
47
+ gap: '10px',
48
+ cursor: 'default',
49
+ }, children: (() => {
50
+ const userID = SDK_Globals.tmSession?.SessionDescr?.userID;
51
+ const isSender = currentTask?.fromID !== undefined && currentTask.fromID === userID;
52
+ const isRecipient = currentTask?.toID !== undefined && currentTask.toID === userID;
53
+ const truncate = (str, maxLength) => str && str.length > maxLength ? str.substring(0, maxLength) + '...' : str;
54
+ const senderNameTruncated = currentTask?.fromName ? truncate(currentTask.fromName, 30) : 'N/A';
55
+ const recipientNameTruncated = currentTask?.toName ? truncate(currentTask.toName, 30) : 'N/A';
56
+ const taskNameTrunc = currentTask?.name ? truncate(currentTask.name.replace(TASK_MORE_INFO_PREFIX_NAME ?? '', ''), 30) : 'N/A';
57
+ return (_jsxs(_Fragment, { children: [(isSender && !isRecipient) && (_jsx(TaskLink, { messagePrefix: `Hai richiesto maggiori informazioni a "${recipientNameTruncated}" tramite l'attività`, name: currentTask.name ?? 'N/A', taskNameTrunc: taskNameTrunc ?? 'N/A', description: currentTask.description ?? 'N/A', currentTask: currentTask, setShowMoreInfoTaskPopup: setShowMoreInfoTaskPopup, setShowMoreInfoTaskTask: setShowMoreInfoTaskTask })), (isRecipient && !isSender) && (_jsxs("div", { style: {
58
+ display: 'flex',
59
+ flexDirection: 'column',
60
+ alignItems: 'center',
61
+ gap: '10px'
62
+ }, children: [_jsx(TaskLink, { messagePrefix: `"${senderNameTruncated}" ti ha richiesto maggiori informazioni tramite l'attività`, name: currentTask.name ?? 'N/A', taskNameTrunc: taskNameTrunc ?? 'N/A', description: currentTask.description ?? 'N/A', currentTask: currentTask, setShowMoreInfoTaskPopup: setShowMoreInfoTaskPopup, setShowMoreInfoTaskTask: setShowMoreInfoTaskTask }), _jsx(TMButton, { btnStyle: isMobile ? 'toolbar' : 'advanced', showTooltip: isMobile, icon: _jsx("span", { className: "dx-icon-chat" }), caption: SDKUI_Localizator.CommentAndComplete, width: "180px", disabled: false, onClick: () => setShowCommentForm(true), onMouseDown: e => e.stopPropagation(), advancedColor: TMColors.success, color: "success" })] }))] }));
63
+ })() }) })) : (_jsx("div", { style: {
64
+ padding: '10px',
65
+ color: '#FFFFFF',
66
+ maxWidth: '240px',
67
+ background: 'linear-gradient(135deg, #1E90FF 0%, #0077BE 60%, #00509E 100%)',
68
+ border: '1px solid rgba(255,255,255,0.15)',
69
+ boxShadow: '0 8px 20px rgba(0, 0, 50, 0.4)',
70
+ backdropFilter: 'blur(6px)',
71
+ display: 'flex',
72
+ flexDirection: 'column',
73
+ alignItems: 'center',
74
+ textAlign: 'center',
75
+ gap: '10px',
76
+ cursor: 'default',
77
+ }, children: `Ci sono ${moreInfoTasks?.length ?? 0} richieste di maggiori informazioni. ${SDKUI_Localizator.ManageFromTaskPanel}` }))), hasMoreInfo && hasApprove && _jsx(Divider, {}), hasApprove && (workItems.length === 1 ?
78
+ _jsx(WorkFlowOperationButtons, { dtd: fromDTD, deviceType: deviceType, onApprove: () => updateShowApprovePopup(true), onSignApprove: handleSignApprove, onReject: () => updateShowRejectPopup(true), onReAssign: () => updateShowReAssignPopup(true), onMoreInfo: () => updateShowMoreInfoPopup(true) })
79
+ :
80
+ _jsxs("div", { style: { padding: 10, color: 'white', maxWidth: '180px', borderRadius: 10, background: '#1B1464 0% 0% no-repeat padding-box', border: '1px solid #FFFFFF' }, children: [`Questo documento è associato a ${workItems.length} workitem.`, _jsx("br", {}), `Per approvare, vai alla pagina "Approvazione workflow".`] })), (hasApprove && hasReferences) || (hasMoreInfo && !hasApprove && hasReferences) ? (_jsx(Divider, {})) : null, hasReferences && (_jsx(ReferencesContainer, { children: dcmtReferences?.filter(ref => ref.objClass === ObjectClasses.Dossier || ref.objClass === ObjectClasses.WorkingGroup)
81
+ .map((ref, index) => {
82
+ const mapEntry = referenceActionMap[String(ref.objClass)];
83
+ const label = mapEntry?.label ?? 'Vai a riferimento';
84
+ let backgroundColor;
85
+ switch (ref.objClass) {
86
+ case ObjectClasses.WorkingGroup:
87
+ backgroundColor = PDGS_COLORS.WORKING_GROUP;
88
+ break;
89
+ case ObjectClasses.Dossier:
90
+ backgroundColor = PDGS_COLORS.DOSSIER;
91
+ break;
92
+ case ObjectClasses.Document:
93
+ backgroundColor = PDGS_COLORS.DOCUMENT;
94
+ break;
95
+ default:
96
+ backgroundColor = "#C2388B";
97
+ break;
98
+ }
99
+ return (_jsxs(StyledReferenceButton, { onClick: () => handleNavigateToReference(ref), onDoubleClick: (e) => { e.preventDefault(); e.stopPropagation(); }, "$bgColor": backgroundColor, children: [_jsx("span", { children: label }), _jsx("span", { children: `"${ref.objName}"` })] }, `ref-${index}-${ref.objID}`));
100
+ }) }))] });
101
+ };
102
+ export default TMDcmtFormActionButtons;
103
+ const TaskLink = (props) => {
104
+ const { messagePrefix, name, taskNameTrunc, description, currentTask, setShowMoreInfoTaskPopup, setShowMoreInfoTaskTask } = props;
105
+ const mouseMoved = useRef(false);
106
+ const handleMouseDown = () => {
107
+ mouseMoved.current = false;
108
+ };
109
+ const handleMouseMove = () => {
110
+ mouseMoved.current = true;
111
+ };
112
+ return (_jsx(_Fragment, { children: _jsx("div", { style: { display: 'inline-flex', alignItems: 'center', gap: '4px' }, children: _jsxs("div", { onMouseDown: handleMouseDown, onMouseMove: handleMouseMove, style: { display: 'inline' }, children: [messagePrefix, ' "', _jsx("span", { style: {
113
+ cursor: 'pointer',
114
+ fontWeight: 500,
115
+ textDecoration: 'none',
116
+ transition: 'text-decoration 0.2s',
117
+ }, onClick: () => {
118
+ setShowMoreInfoTaskPopup(true);
119
+ setShowMoreInfoTaskTask(currentTask);
120
+ }, onMouseEnter: e => e.currentTarget.style.textDecoration = 'underline', onMouseLeave: e => e.currentTarget.style.textDecoration = 'none', children: taskNameTrunc }), '" ', _jsx(TMTooltip, { parentStyle: { display: 'inline' }, childStyle: { display: 'inline' }, content: _jsxs("div", { style: { whiteSpace: 'pre-line', textAlign: 'left' }, children: [_jsxs("div", { children: [_jsx("b", { children: SDKUI_Localizator.Name }), ": ", name] }), _jsxs("div", { children: [_jsx("b", { children: SDKUI_Localizator.Description }), ": ", description] })] }), children: _jsx("i", { className: "dx-icon dx-icon-info", onClick: () => {
121
+ setShowMoreInfoTaskPopup(true);
122
+ setShowMoreInfoTaskTask(currentTask);
123
+ }, style: { fontSize: '16px', lineHeight: 1, cursor: 'pointer' } }) })] }) }) }));
124
+ };
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useMemo, useRef, useState } from 'react';
3
3
  import styled from 'styled-components';
4
- import { RetrieveFileOptions, DcmtOpers, GeneralRetrieveFormats, FileFormats } from '@topconsultnpm/sdk-ts';
5
- import { extensionHandler, sleep, getExceptionMessage, formatBytes, IconMenuVertical, IconCloseCircle, IconClear, IconCloseOutline, IconPreview, SDKUI_Globals, IconZoomOutLinear, IconZoomInLinear, IconPrintOutline, SDKUI_Localizator, IconRefresh, IconCache } from '../../../helper';
4
+ import { RetrieveFileOptions, DcmtOpers, GeneralRetrieveFormats, FileFormats, SDK_Globals } from '@topconsultnpm/sdk-ts';
5
+ import { extensionHandler, sleep, getExceptionMessage, formatBytes, IconMenuVertical, IconCloseCircle, IconClear, IconCloseOutline, IconPreview, SDKUI_Globals, IconZoomOutLinear, IconZoomInLinear, IconPrintOutline, SDKUI_Localizator, IconRefresh, IconCache, dcmtsFileCachePreview, CACHE_SIZE_LIMIT } from '../../../helper';
6
6
  import { useDcmtOperations } from '../../../hooks/useDcmtOperations';
7
7
  import { FileExtensionHandler, FormModes } from '../../../ts';
8
8
  import { TMColors } from '../../../utils/theme';
@@ -29,7 +29,15 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
29
29
  const [error, setError] = useState('');
30
30
  const [isAbortError, setIsAbortError] = useState(false);
31
31
  const { abortController, showWaitPanel, waitPanelTitle, showPrimary, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, getDcmtFileAsync, clearDcmtsFileCache, removeDcmtsFileCache, isDcmtFileInCache } = useDcmtOperations();
32
- const cacheKey = dcmtData ? `${dcmtData.tid}-${dcmtData.did}` : '00';
32
+ const isBasketMode = !!(dcmtData?.btid !== undefined && dcmtData?.bid !== undefined && dcmtData?.bfid !== undefined);
33
+ const getCacheKey = () => {
34
+ if (!dcmtData)
35
+ return '00';
36
+ if (isBasketMode)
37
+ return `basket-${dcmtData.btid}-${dcmtData.bid}-${dcmtData.bfid}`;
38
+ return `${dcmtData.tid}-${dcmtData.did}`;
39
+ };
40
+ const cacheKey = getCacheKey();
33
41
  const [hasLoadedDataOnce, setHasLoadedDataOnce] = useState(false);
34
42
  const [lastLoadedDid, setLastLoadedDid] = useState(undefined);
35
43
  useEffect(() => {
@@ -41,10 +49,10 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
41
49
  setShowPreview(false);
42
50
  return;
43
51
  }
44
- const currentCacheKey = `${dcmtData.tid}-${dcmtData.did}`;
52
+ const currentCacheKey = isBasketMode ? `basket-${dcmtData.btid}-${dcmtData.bid}-${dcmtData.bfid}` : `${dcmtData.tid}-${dcmtData.did}`;
45
53
  const shouldFetch = isVisible && (!hasLoadedDataOnce || currentCacheKey !== lastLoadedDid);
46
54
  if (isDcmtFileInCache(currentCacheKey)) {
47
- loadDocumentWithCache();
55
+ isBasketMode ? loadBasketFile() : loadDocumentWithCache();
48
56
  setShowPreview(true);
49
57
  return;
50
58
  }
@@ -52,7 +60,11 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
52
60
  setDcmtBlob(undefined);
53
61
  setError('');
54
62
  setIsAbortError(false);
55
- if ((extensionHandler(dcmtData.fileExt) !== FileExtensionHandler.NONE) && ((dcmtData.fileSize ?? 0) <= (SDKUI_Globals.userSettings.searchSettings.previewThreshold * 1024))) {
63
+ if (isBasketMode) {
64
+ loadBasketFile();
65
+ setShowPreview(true);
66
+ }
67
+ else if ((extensionHandler(dcmtData.fileExt) !== FileExtensionHandler.NONE) && ((dcmtData.fileSize ?? 0) <= (SDKUI_Globals.userSettings.searchSettings.previewThreshold * 1024))) {
56
68
  loadDocumentWithCache();
57
69
  setShowPreview(true);
58
70
  }
@@ -63,6 +75,47 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
63
75
  setLastLoadedDid(currentCacheKey);
64
76
  }
65
77
  }, [dcmtData?.did, isVisible, hasLoadedDataOnce, lastLoadedDid]);
78
+ const loadBasketFile = async () => {
79
+ try {
80
+ // Check cache first
81
+ if (dcmtsFileCachePreview.has(cacheKey)) {
82
+ setDcmtBlob(dcmtsFileCachePreview.get(cacheKey));
83
+ setIsFromCache(true);
84
+ setError('');
85
+ setIsAbortError(false);
86
+ return;
87
+ }
88
+ await sleep(300);
89
+ const basketEngine = SDK_Globals.tmSession?.NewBasketEngine();
90
+ const cvtFormat = extensionHandler(dcmtData?.fileExt) === FileExtensionHandler.CONVERTIBLE ? FileFormats.PDF : FileFormats.None;
91
+ const file = await basketEngine?.RetrieveFileAsync(dcmtData?.btid, dcmtData?.bid, dcmtData?.bfid, cvtFormat, abortController.signal);
92
+ // Store in cache
93
+ if (file) {
94
+ if (dcmtsFileCachePreview.size >= CACHE_SIZE_LIMIT) {
95
+ const oldestKey = dcmtsFileCachePreview.keys().next().value;
96
+ dcmtsFileCachePreview.delete(oldestKey);
97
+ }
98
+ dcmtsFileCachePreview.set(cacheKey, file);
99
+ }
100
+ setDcmtBlob(file);
101
+ setIsFromCache(false);
102
+ setError('');
103
+ setIsAbortError(false);
104
+ }
105
+ catch (ex) {
106
+ const err = ex;
107
+ if (err.name === 'CanceledError') {
108
+ setError('Operazione annullata.');
109
+ setIsAbortError(true);
110
+ ShowAlert({ message: err.message, mode: 'warning', duration: 3000, title: 'Abort' });
111
+ }
112
+ else {
113
+ setError(getExceptionMessage(ex));
114
+ setIsAbortError(false);
115
+ TMExceptionBoxManager.show({ exception: ex });
116
+ }
117
+ }
118
+ };
66
119
  const loadDocumentWithCache = async () => {
67
120
  const rfo = new RetrieveFileOptions();
68
121
  rfo.retrieveReason = DcmtOpers.None;
@@ -94,7 +147,7 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
94
147
  };
95
148
  const titleHandler = () => {
96
149
  let title = 'Anteprima ';
97
- if (!dcmtData?.did)
150
+ if (!dcmtData?.did && !isBasketMode)
98
151
  return title;
99
152
  let extensionInfo;
100
153
  if (dcmtData.fileExt !== null) {
@@ -120,7 +173,7 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
120
173
  setIsAbortError(false);
121
174
  setDcmtBlob(undefined);
122
175
  try {
123
- await loadDocumentWithCache();
176
+ isBasketMode ? await loadBasketFile() : await loadDocumentWithCache();
124
177
  }
125
178
  catch (error) {
126
179
  console.error('Error reopening document:', error);
@@ -132,7 +185,7 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
132
185
  ], [cacheKey, removeDcmtsFileCache, clearDcmtsFileCache, setIsFromCache]);
133
186
  return (_jsx(TMLayoutWaitingContainer, { direction: 'vertical', showWaitPanel: showWaitPanel, showWaitPanelPrimary: showPrimary, showWaitPanelSecondary: showSecondary, waitPanelTitle: waitPanelTitle, waitPanelTextPrimary: waitPanelTextPrimary, waitPanelValuePrimary: waitPanelValuePrimary, waitPanelMaxValuePrimary: waitPanelMaxValuePrimary, waitPanelTextSecondary: waitPanelTextSecondary, waitPanelValueSecondary: waitPanelValueSecondary, waitPanelMaxValueSecondary: waitPanelMaxValueSecondary, isCancelable: true, abortController: abortController, children: _jsx(TMPanel, { padding: '0', title: titleHandler(), onClose: onClosePanel, allowMaximize: allowMaximize, onMaximize: onMaximizePanel, onHeaderDoubleClick: onMaximizePanel, toolbar: _jsxs("div", { style: { width: 'max-content', display: 'flex', alignItems: 'center', gap: '10px' }, children: [onPrev && _jsx(TMSaveFormButtonPrevious, { btnStyle: 'icon', isModified: false, formMode: FormModes.ReadOnly, canPrev: canPrev, onPrev: onPrev }), onNext && _jsx(TMSaveFormButtonNext, { btnStyle: 'icon', isModified: false, formMode: FormModes.ReadOnly, canNext: canNext, onNext: onNext }), _jsx(StyledHeaderIcon, { "$color": TMColors.primaryColor, children: _jsx(ContextMenu, { items: cacheMenuItems, trigger: "left", children: _jsx(IconMenuVertical, {}) }) }), _jsx(StyledHeaderIcon, { onClick: reOpenDcmt, "$color": TMColors.primaryColor, children: _jsx(TMTooltip, { content: SDKUI_Localizator.ReopenDocument, children: _jsx(IconRefresh, {}) }) })] }), children: error
134
187
  ? _jsx(ErrorContent, { error: error, isAbortError: isAbortError, onRetry: reOpenDcmt })
135
- : renderedPreview(dcmtData?.tid, dcmtData?.did, dcmtData?.fileExt, dcmtData?.fileSize, dcmtData?.fileCount, extensionHandler(dcmtData?.fileExt), showPreview, isResizingActive, () => { loadDocumentWithCache(); setShowPreview(true); }, dcmtBlob) }) }));
188
+ : renderedPreview(dcmtData?.tid, dcmtData?.did, dcmtData?.fileExt, dcmtData?.fileSize, dcmtData?.fileCount, extensionHandler(dcmtData?.fileExt), showPreview, isResizingActive, () => { isBasketMode ? loadBasketFile() : loadDocumentWithCache(); setShowPreview(true); }, dcmtBlob, isBasketMode) }) }));
136
189
  };
137
190
  export default TMDcmtPreview;
138
191
  export const TMFileViewer = ({ fileBlob, isResizingActive }) => {
@@ -382,13 +435,13 @@ const ImageViewer = ({ fileBlob, alt = 'Image', className }) => {
382
435
  export const TMNothingToShow = ({ text = '', secondText, fileExt, icon = _jsx(IconPreview, { fontSize: 96 }) }) => {
383
436
  return (_jsx(StyledAnimatedComponentOpacity, { style: { width: '100%', height: '100%' }, children: _jsxs(StyledPanelStatusContainer, { children: [icon, _jsxs(StyledPreviewNotAvailable, { children: [text && _jsx("div", { children: text }), _jsxs("div", { children: [" ", secondText ?? SDKUI_Localizator.PreviewNotAvailable, fileExt && _jsx("b", { children: ` (*.${fileExt})` })] })] })] }) }));
384
437
  };
385
- const renderedPreview = (tid, did, fileExt, fileSize, fileCount, extHandler, showPreview, isResizingActive, onDownloadShowPreviewClick, dcmtBlob) => {
386
- if (!did)
438
+ const renderedPreview = (tid, did, fileExt, fileSize, fileCount, extHandler, showPreview, isResizingActive, onDownloadShowPreviewClick, dcmtBlob, isBasketMode) => {
439
+ if (!isBasketMode && !did)
387
440
  return _jsx(TMNothingToShow, { text: `${SDKUI_Localizator.NoDcmtSelected}.` });
388
- if (fileCount == 0) {
441
+ if (!isBasketMode && fileCount == 0) {
389
442
  return _jsx(TMNothingToShow, { text: SDKUI_Localizator.MetadataOnlyDocument });
390
443
  }
391
- if (fileExt && extHandler === FileExtensionHandler.NONE) {
444
+ if (!isBasketMode && fileExt && extHandler === FileExtensionHandler.NONE) {
392
445
  return _jsx(TMNothingToShow, { fileExt: fileExt });
393
446
  }
394
447
  if (showPreview) {
@@ -1,5 +1,5 @@
1
1
  import { FormModes, TaskContext } from "../../../ts";
2
- import { TaskDescriptor } from "@topconsultnpm/sdk-ts";
2
+ import { HomeBlogPost, TaskDescriptor } from "@topconsultnpm/sdk-ts";
3
3
  interface TMDcmtTasksProps {
4
4
  taskContext: TaskContext;
5
5
  allTasks: Array<TaskDescriptor>;
@@ -8,6 +8,8 @@ interface TMDcmtTasksProps {
8
8
  addTaskCallback: (task: TaskDescriptor) => Promise<void>;
9
9
  editTaskCallback: (task: TaskDescriptor) => Promise<void>;
10
10
  afterTaskSaved: (task: TaskDescriptor | undefined, formMode: FormModes | undefined, forceRefresh?: boolean) => Promise<void>;
11
+ handleNavigateToWGs?: (value: HomeBlogPost | number) => Promise<void>;
12
+ handleNavigateToDossiers?: (value: HomeBlogPost | number) => Promise<void>;
11
13
  }
12
14
  declare const TMDcmtTasks: (props: TMDcmtTasksProps) => import("react/jsx-runtime").JSX.Element;
13
15
  export default TMDcmtTasks;
@@ -6,7 +6,7 @@ import { useTMPanelManagerContext } from "../../layout/panelManager/TMPanelManag
6
6
  import TMPanel from "../../base/TMPanel";
7
7
  import TMTasksPanelContent from "../tasks/TMTasksPanelContent";
8
8
  const TMDcmtTasks = (props) => {
9
- const { taskContext, allTasks, getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, afterTaskSaved } = props;
9
+ const { taskContext, allTasks, getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, afterTaskSaved, handleNavigateToWGs, handleNavigateToDossiers } = props;
10
10
  // Get the current device type (e.g., mobile, tablet, desktop) using a custom hook.
11
11
  const deviceType = useDeviceType();
12
12
  // This avoids unnecessary re-renders by only recalculating when deviceType changes.
@@ -19,6 +19,6 @@ const TMDcmtTasks = (props) => {
19
19
  text: SDKUI_Localizator.Refresh,
20
20
  },
21
21
  ], children: _jsx(IconMenuVertical, { id: "TMTaksPanel-Commands-Header", color: 'white', cursor: 'pointer' }) }), []);
22
- return _jsx("div", { style: { width: "100%", height: "100%", position: 'relative' }, children: _jsx(TMPanel, { title: SDKUI_Localizator.Widget_Activities, allowMaximize: !isMobile && countVisibleLeafPanels() > 1, onClose: countVisibleLeafPanels() > 1 ? () => togglePanelVisibility("tmDcmtTasks") : undefined, onMaximize: countVisibleLeafPanels() > 1 ? () => toggleMaximize("tmDcmtTasks") : undefined, toolbar: toolbar, children: _jsx(TMTasksPanelContent, { id: "dcmtTasks", taskContext: taskContext, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: () => { return Promise.resolve(); }, handleNavigateToDossiers: () => { return Promise.resolve(); }, afterTaskSaved: afterTaskSaved }) }) });
22
+ return _jsx("div", { style: { width: "100%", height: "100%", position: 'relative' }, children: _jsx(TMPanel, { title: SDKUI_Localizator.Widget_Activities, allowMaximize: !isMobile && countVisibleLeafPanels() > 1, onClose: countVisibleLeafPanels() > 1 ? () => togglePanelVisibility("tmDcmtTasks") : undefined, onMaximize: countVisibleLeafPanels() > 1 ? () => toggleMaximize("tmDcmtTasks") : undefined, toolbar: toolbar, children: _jsx(TMTasksPanelContent, { id: "dcmtTasks", taskContext: taskContext, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs ? handleNavigateToWGs : () => { return Promise.resolve(); }, handleNavigateToDossiers: handleNavigateToDossiers ? handleNavigateToDossiers : () => { return Promise.resolve(); }, afterTaskSaved: afterTaskSaved }) }) });
23
23
  };
24
24
  export default TMDcmtTasks;
@@ -1,14 +1,19 @@
1
1
  import React from 'react';
2
2
  import { DeviceType } from '../../base/TMDeviceProvider';
3
+ import { DcmtTypeDescriptor } from '@topconsultnpm/sdk-ts';
3
4
  interface ITMFileUploader {
5
+ fromDTD?: DcmtTypeDescriptor;
4
6
  onFileUpload?: (file: File | null) => void;
7
+ openPdfEditor?: (fromDTD?: DcmtTypeDescriptor, file?: File | null, handleFile?: (file: File) => void) => void;
5
8
  onClose?: () => void;
9
+ onScanRequest?: (onFileScanned: (file: File) => void) => void;
6
10
  isRequired?: boolean;
7
11
  defaultBlob?: File | null;
8
12
  deviceType?: DeviceType;
9
13
  isResizingActive?: boolean;
10
14
  showTMPanel?: boolean;
11
15
  enableDragDropOverlay?: boolean;
16
+ showScannerIcon?: boolean;
12
17
  }
13
18
  declare const TMFileUploader: React.FC<ITMFileUploader>;
14
19
  export default TMFileUploader;
@@ -1,17 +1,30 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useCallback, useEffect, useRef, useState } from 'react';
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
3
  import styled from 'styled-components';
4
- import { IconFolderOpen, SDKUI_Localizator, formatBytes, IconClear, extensionHandler, IconCloseOutline } from '../../../helper';
4
+ import { IconFolderOpen, IconScanner, SDKUI_Localizator, formatBytes, IconClear, extensionHandler, IconCloseOutline, IconMenuVertical, TMCommandsContextMenu, IconEdit, isPdfEditorAvailable, SDKUI_Globals } from '../../../helper';
5
+ import { useBetaFeatures } from '../../../hooks/useBetaFeatures';
5
6
  import usePreventFileDrop from '../../../hooks/usePreventFileDrop';
6
7
  import { FileExtensionHandler } from '../../../ts';
7
8
  import { TMColors } from '../../../utils/theme';
8
9
  import TMButton from '../../base/TMButton';
10
+ import ShowAlert from '../../base/TMAlert';
9
11
  import { DeviceType } from '../../base/TMDeviceProvider';
10
12
  import TMTooltip from '../../base/TMTooltip';
11
13
  import { TMFileViewer, StyledHeaderIcon } from './TMDcmtPreview';
12
14
  import TMPanel from '../../base/TMPanel';
13
15
  import TMDragDropOverlay from './TMDragDropOverlay';
14
- const TMFileUploader = ({ deviceType = DeviceType.DESKTOP, onClose, onFileUpload, isRequired = false, defaultBlob = null, isResizingActive, showTMPanel = true, enableDragDropOverlay = false }) => {
16
+ // Helper per verificare se la licenza scanner è disponibile
17
+ const isScannerLicenseConfigured = () => {
18
+ try {
19
+ const scannerLicense = SDKUI_Globals.userSettings.advancedSettings.scannerLicense;
20
+ return scannerLicense && scannerLicense.trim() !== '';
21
+ }
22
+ catch {
23
+ return false;
24
+ }
25
+ };
26
+ const TMFileUploader = ({ fromDTD, deviceType = DeviceType.DESKTOP, onClose, onFileUpload, openPdfEditor, onScanRequest, isRequired = false, defaultBlob = null, isResizingActive, showTMPanel = true, enableDragDropOverlay = false, showScannerIcon = true }) => {
27
+ const isBetaFeaturesEnabled = useBetaFeatures();
15
28
  const [dragOver, setDragOver] = useState(false);
16
29
  const [uploadedFile, setUploadedFile] = useState(defaultBlob);
17
30
  const [fileName, setFileName] = useState('');
@@ -83,11 +96,20 @@ const TMFileUploader = ({ deviceType = DeviceType.DESKTOP, onClose, onFileUpload
83
96
  document.getElementById('fileInput')?.click();
84
97
  }, []);
85
98
  let content = !uploadedFile ?
86
- _jsxs("div", { style: { display: 'flex', gap: 10, width: '100%', height: '100%' }, children: [_jsx(HiddenInput, { id: "fileInput", type: "file", onChange: handleInputChange }), _jsxs(UploadContainer, { ref: uploaderRef, tabIndex: 0, onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, style: { backgroundColor: dragOver ? '#76b1e6' : 'white' }, onDoubleClick: browseHandler, "$isRequired": isRequired, children: [_jsx("div", { style: { display: 'flex', gap: '10px', flexDirection: 'column', position: 'absolute', right: 5, top: 5 }, children: _jsx(TMButton, { btnStyle: 'icon', caption: 'Sfoglia', color: isRequired && !uploadedFile ? 'error' : 'primary', onClick: browseHandler, icon: _jsx(IconFolderOpen, { fontSize: 22 }) }) }), _jsx("p", { style: { fontSize: '1.2rem', fontWeight: 'bold' }, children: deviceType === DeviceType.MOBILE ? 'Clicca per sfogliare il tuo file' : 'Trascina il tuo file o fai doppio click per sfogliarlo' }), isRequired && _jsxs("p", { style: { fontWeight: 'bold' }, children: [" ", SDKUI_Localizator.RequiredField, " "] })] })] }) :
99
+ _jsxs("div", { style: { display: 'flex', gap: 10, width: '100%', height: '100%' }, children: [_jsx(HiddenInput, { id: "fileInput", type: "file", onChange: handleInputChange }), _jsxs(UploadContainer, { ref: uploaderRef, tabIndex: 0, onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, style: { backgroundColor: dragOver ? '#76b1e6' : 'white' }, onDoubleClick: browseHandler, "$isRequired": isRequired, children: [_jsxs("div", { style: { display: 'flex', gap: '10px', flexDirection: 'column', position: 'absolute', right: 5, top: 5 }, children: [_jsx(TMButton, { btnStyle: 'icon', caption: 'Sfoglia', color: isRequired && !uploadedFile ? 'error' : 'primary', onClick: browseHandler, icon: _jsx(IconFolderOpen, { fontSize: 22 }) }), isBetaFeaturesEnabled && showScannerIcon && isScannerLicenseConfigured() && onScanRequest && _jsx(TMButton, { btnStyle: 'icon', caption: 'Scanner', color: 'primary', onClick: () => { onScanRequest((file) => { onFileUpload?.(file); }); }, icon: _jsx(IconScanner, { fontSize: 22 }) }), isBetaFeaturesEnabled && showScannerIcon && isScannerLicenseConfigured() && !onScanRequest && _jsx(TMButton, { btnStyle: 'icon', caption: 'Scanner', color: 'primary', onClick: () => { ShowAlert({ message: 'Funzionalità scanner non disponibile in questo contesto.', mode: 'info', duration: 3000, title: 'Scanner' }); }, icon: _jsx(IconScanner, { fontSize: 22 }) })] }), _jsx("p", { style: { fontSize: '1.2rem', fontWeight: 'bold' }, children: deviceType === DeviceType.MOBILE ? 'Clicca per sfogliare il tuo file' : 'Trascina il tuo file o fai doppio click per sfogliarlo' }), isRequired && _jsxs("p", { style: { fontWeight: 'bold' }, children: [" ", SDKUI_Localizator.RequiredField, " "] })] })] }) :
87
100
  _jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: 10, width: '100%', height: '100%' }, children: [_jsxs("div", { style: { backgroundColor: 'white', padding: '5px 10px', borderRadius: 8, display: 'flex', alignItems: 'center', justifyContent: 'space-between', color: TMColors.primaryColor }, children: [_jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 5 }, children: [_jsx("p", { children: "File name:" }), _jsxs("div", { style: { fontWeight: 'bold' }, children: [fileName, " ", _jsxs("span", { children: [" ", ` (${formatBytes(fileSize)})`, " "] })] })] }), uploadedFile && _jsx(TMButton, { btnStyle: 'icon', color: 'error', caption: 'Pulisci', onClick: () => clearFile(true), icon: _jsx(IconClear, { fontSize: 22 }) })] }), extensionHandler(fileExt) === FileExtensionHandler.READY_TO_SHOW ? _jsx(TMFileViewer, { fileBlob: uploadedFile, isResizingActive: isResizingActive }) :
88
101
  _jsx("div", { style: { backgroundColor: '#f6dbdb', padding: '5px 10px', borderRadius: 8, display: 'flex', alignItems: 'center', justifyContent: 'space-between', color: TMColors.error }, children: _jsxs("div", { children: [" ", 'Anteprima non disponibile.', fileExt && _jsx("b", { children: ` (*.${fileExt})` })] }) })] });
89
102
  const innerContent = (_jsxs("div", { style: { width: '100%', height: '100%', padding: '2px', display: 'flex', flexDirection: 'column', gap: 10 }, children: [enableDragDropOverlay && _jsx(TMDragDropOverlay, { handleFile: handleFile, refocusAfterFileInput: refocusAfterFileInput }), content] }));
90
- return showTMPanel ? (_jsx(TMPanel, { ref: fileUploaderPanelRef, panelID: 'file-uploader-panel', title: SDKUI_Localizator.FileUpload, onBack: deviceType === DeviceType.MOBILE ? () => onClose?.() : undefined, toolbar: deviceType !== DeviceType.MOBILE ? (_jsx(StyledHeaderIcon, { onClick: onClose, "$color": 'white', children: _jsx(TMTooltip, { content: SDKUI_Localizator.Close, children: _jsx(IconCloseOutline, {}) }) })) : undefined, children: innerContent })) : (innerContent);
103
+ const toolbar = useMemo(() => {
104
+ return (_jsxs(_Fragment, { children: [(isPdfEditorAvailable(fromDTD, fileExt) && openPdfEditor) && (_jsx(TMCommandsContextMenu, { target: "#TMPanel-FileUploader-Commands-Header", menuItems: [
105
+ {
106
+ icon: _jsx(IconEdit, {}),
107
+ text: 'PDF Editor',
108
+ onClick: () => openPdfEditor(fromDTD, uploadedFile, handleFile)
109
+ }
110
+ ], showEvent: "click", children: _jsx(IconMenuVertical, { id: "TMPanel-FileUploader-Commands-Header", color: "white", cursor: "pointer" }) })), deviceType !== DeviceType.MOBILE && (_jsx(StyledHeaderIcon, { onClick: onClose, "$color": "white", children: _jsx(TMTooltip, { content: SDKUI_Localizator.Close, children: _jsx(IconCloseOutline, {}) }) }))] }));
111
+ }, [deviceType, fromDTD, onClose]);
112
+ return showTMPanel ? (_jsx(TMPanel, { ref: fileUploaderPanelRef, panelID: 'file-uploader-panel', title: SDKUI_Localizator.FileUpload, onBack: deviceType === DeviceType.MOBILE ? () => onClose?.() : undefined, toolbar: toolbar, children: innerContent })) : (innerContent);
91
113
  };
92
114
  const UploadContainer = styled.div `
93
115
  position: relative;