@topconsultnpm/sdkui-react 6.19.0-dev1.16 → 6.19.0-dev1.18
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.
- package/lib/components/features/blog/TMBlogCommentForm.js +3 -3
- package/lib/components/features/documents/TMDcmtForm.js +1 -1
- package/lib/components/features/search/TMSearchResult.js +13 -3
- package/lib/components/features/workflow/TMWorkflowPopup.d.ts +3 -1
- package/lib/components/features/workflow/TMWorkflowPopup.js +17 -4
- package/lib/components/viewers/TMTidViewer.js +3 -1
- package/package.json +1 -1
|
@@ -44,9 +44,9 @@ const TMBlogCommentForm = (props) => {
|
|
|
44
44
|
vil.push(new ValidationItem(ResultTypes.ERROR, SDKUI_Localizator.Comment, `${SDK_Localizator.RequiredField}`));
|
|
45
45
|
}
|
|
46
46
|
else {
|
|
47
|
-
// Validate description length (max
|
|
48
|
-
if (comment.length >
|
|
49
|
-
vil.push(new ValidationItem(ResultTypes.ERROR, SDKUI_Localizator.Comment, `${SDKUI_Localizator.DescriptionTooLongMessage.replaceParams(
|
|
47
|
+
// Validate description length (max 1000)
|
|
48
|
+
if (comment.length > 1000) {
|
|
49
|
+
vil.push(new ValidationItem(ResultTypes.ERROR, SDKUI_Localizator.Comment, `${SDKUI_Localizator.DescriptionTooLongMessage.replaceParams(1000)}`));
|
|
50
50
|
}
|
|
51
51
|
// Detect dangerous HTML tags
|
|
52
52
|
const tagRegex = /<\/?(script|iframe|embed|object|link|style|img|video|audio|svg|form|input|button|textarea|select|pre|function)[^>]*>/gi;
|
|
@@ -990,7 +990,7 @@ const TMDcmtForm = ({ showHeader = true, onSaveRecents, layoutMode = LayoutModes
|
|
|
990
990
|
value: FormulaHelper.addFormulaTag(newFormula.expression)
|
|
991
991
|
}));
|
|
992
992
|
} }), 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 && (_jsx(ToppyHelpCenter, { deviceType: deviceType, usePortal: false, content: workItems.length === 1 ?
|
|
993
|
-
_jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, children: _jsx(WorkFlowOperationButtons, { deviceType: deviceType, onApprove: () => setShowApprovePopup(true), onSignApprove: handleSignApprove, onReject: () => setShowRejectPopup(true), onReAssign: () => setShowReAssignPopup(true), onMoreInfo: () => setShowMoreInfoPopup(true) }) })
|
|
993
|
+
_jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, children: _jsx(WorkFlowOperationButtons, { deviceType: deviceType, onApprove: () => setShowApprovePopup(true), onSignApprove: handleSignApprove, onReject: () => setShowRejectPopup(true), onReAssign: () => setShowReAssignPopup(true), onMoreInfo: () => setShowMoreInfoPopup(true), dtd: fromDTD }) })
|
|
994
994
|
:
|
|
995
995
|
_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 && (_jsx(ToppyHelpCenter, { deviceType: deviceType, usePortal: false, content: _jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: 10 }, 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: () => {
|
|
996
996
|
setShowCommentForm(true);
|
|
@@ -109,11 +109,11 @@ const TMSearchResult = ({ context = SearchResultContext.METADATA_SEARCH, isVisib
|
|
|
109
109
|
const { abortController, showWaitPanel, waitPanelTitle, showPrimary, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, downloadDcmtsAsync, runOperationAsync } = useDcmtOperations();
|
|
110
110
|
const deviceType = useDeviceType();
|
|
111
111
|
const isMobile = deviceType === DeviceType.MOBILE;
|
|
112
|
-
const
|
|
112
|
+
const selectedDocs = getSelectedDcmtsOrFocused(selectedItems, focusedItem);
|
|
113
113
|
// Disable the "Sign/Approve" button if:
|
|
114
114
|
// 1. No document or multiple documents are selected, OR
|
|
115
115
|
// 2. Exactly one document is selected but its FILEEXT property is null
|
|
116
|
-
const disableSignApproveDisable =
|
|
116
|
+
const disableSignApproveDisable = selectedDocs.length !== 1 || (selectedDocs.length === 1 && selectedDocs[0].FILEEXT === null);
|
|
117
117
|
const dcmtsReturned = (searchResults?.length > 1 ? selectedSearchResult?.dcmtsReturned : searchResults[0]?.dcmtsReturned ?? 0);
|
|
118
118
|
const dcmtsFound = (searchResults?.length > 1 ? selectedSearchResult?.dcmtsFound : searchResults[0]?.dcmtsFound ?? 0);
|
|
119
119
|
useEffect(() => { setID(genUniqueId()); }, []);
|
|
@@ -961,7 +961,17 @@ const TMSearchResult = ({ context = SearchResultContext.METADATA_SEARCH, isVisib
|
|
|
961
961
|
setIsModifiedBatchUpdate(false);
|
|
962
962
|
await refreshSelectionDataRowsAsync();
|
|
963
963
|
}, onStatusChanged: (isModified) => { setIsModifiedBatchUpdate(isModified); } }), (showToppyForApprove && !showApprovePopup && !showRejectPopup && !showReAssignPopup && !showMoreInfoPopup && !openS4TViewer && !showTodoDcmtForm) &&
|
|
964
|
-
_jsx(ToppyHelpCenter, { deviceType: deviceType, content: _jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, children: _jsx(WorkFlowOperationButtons, { deviceType: deviceType, onApprove: () =>
|
|
964
|
+
_jsx(ToppyHelpCenter, { deviceType: deviceType, content: _jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, children: _jsx(WorkFlowOperationButtons, { deviceType: deviceType, onApprove: () => {
|
|
965
|
+
setShowApprovePopup(true);
|
|
966
|
+
}, onSignApprove: () => {
|
|
967
|
+
handleSignApprove();
|
|
968
|
+
}, onReject: () => {
|
|
969
|
+
setShowRejectPopup(true);
|
|
970
|
+
}, onReAssign: () => {
|
|
971
|
+
setShowReAssignPopup(true);
|
|
972
|
+
}, onMoreInfo: () => {
|
|
973
|
+
setShowMoreInfoPopup(true);
|
|
974
|
+
}, approveDisable: selectedDocs.length === 0, signApproveDisable: disableSignApproveDisable, rejectDisable: selectedDocs.length === 0, reassignDisable: selectedDocs.length === 0, infoDisable: selectedDocs.length !== 1, dtd: fromDTD }) }) })] }), _jsx(ConfirmFormatDialog, {}), _jsx(ConfirmAttachmentsDialog, {}), showRelatedDcmtsChooser &&
|
|
965
975
|
_jsx(TMChooserForm, { dataSource: relatedDcmtsChooserDataSource, onChoose: async (selectedRelation) => {
|
|
966
976
|
try {
|
|
967
977
|
setShowRelatedDcmtsChooser(false);
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { DcmtTypeDescriptor } from '@topconsultnpm/sdk-ts';
|
|
1
2
|
import { DeviceType } from "../../base/TMDeviceProvider";
|
|
2
3
|
interface IWorkflowOperationButtonsProps {
|
|
4
|
+
dtd: DcmtTypeDescriptor | undefined;
|
|
3
5
|
approveDisable?: boolean;
|
|
4
6
|
signApproveDisable?: boolean;
|
|
5
7
|
rejectDisable?: boolean;
|
|
@@ -12,7 +14,7 @@ interface IWorkflowOperationButtonsProps {
|
|
|
12
14
|
onReAssign?: () => void;
|
|
13
15
|
onMoreInfo?: () => void;
|
|
14
16
|
}
|
|
15
|
-
export declare const WorkFlowOperationButtons: (
|
|
17
|
+
export declare const WorkFlowOperationButtons: (props: IWorkflowOperationButtonsProps) => import("react/jsx-runtime").JSX.Element;
|
|
16
18
|
export declare const WorkFlowApproveRejectPopUp: ({ TID, DID, deviceType, isReject, selectedItems, onClose, onCompleted }: {
|
|
17
19
|
TID?: number;
|
|
18
20
|
DID?: number;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useState } from "react";
|
|
3
3
|
import { Priorities, ResultTypes, SDK_Globals, SDK_Localizator, TaskEngine, UserListCacheService, ValidationItem, WorkflowCacheService } from '@topconsultnpm/sdk-ts';
|
|
4
4
|
import styled from "styled-components";
|
|
5
|
-
import { SDKUI_Localizator, IconApply, IconCloseOutline, IconUser, IconInfo, DateDisplayTypes, TASK_MORE_INFO_PREFIX_NAME, IconSignaturePencil } from "../../../helper";
|
|
5
|
+
import { SDKUI_Localizator, IconApply, IconCloseOutline, IconUser, IconInfo, DateDisplayTypes, TASK_MORE_INFO_PREFIX_NAME, IconSignaturePencil, isSign4TopEnabled } from "../../../helper";
|
|
6
6
|
import { TMColors } from "../../../utils/theme";
|
|
7
7
|
import TMButton from "../../base/TMButton";
|
|
8
8
|
import { DeviceType } from "../../base/TMDeviceProvider";
|
|
@@ -65,9 +65,22 @@ const StyledHorizontalContainer = styled.div `
|
|
|
65
65
|
gap: 10px;
|
|
66
66
|
/* align-items: flex-end; */
|
|
67
67
|
`;
|
|
68
|
-
export const WorkFlowOperationButtons = (
|
|
68
|
+
export const WorkFlowOperationButtons = (props) => {
|
|
69
|
+
const { dtd = undefined, deviceType = DeviceType.DESKTOP, approveDisable = false, signApproveDisable = false, rejectDisable = false, reassignDisable = false, infoDisable = false, onApprove, onSignApprove, onReject, onReAssign, onMoreInfo } = props;
|
|
69
70
|
const isMobile = deviceType === DeviceType.MOBILE;
|
|
70
|
-
|
|
71
|
+
// Stato per distinguere workflow di firma vs approvazione
|
|
72
|
+
const [isSignWorkflow, setIsSignWorkflow] = useState(false);
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
// Controlla se il documento ha dei widget definiti, se il documento ha il widget SIGN4_TOP abilitato, allora è un workflow di firma
|
|
75
|
+
if (dtd && dtd.widgets && dtd.widgets.length > 0) {
|
|
76
|
+
setIsSignWorkflow(isSign4TopEnabled(dtd.widgets));
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
// Se non ci sono widget o non è SIGN4_TOP, imposta il workflow di default (approvazione senza firma)
|
|
80
|
+
setIsSignWorkflow(false);
|
|
81
|
+
}
|
|
82
|
+
}, [dtd]);
|
|
83
|
+
return (_jsx(StyledWorkFlowOperationButtonsContainer, { "$isMobile": isMobile, children: isSignWorkflow ? (_jsxs(_Fragment, { children: [_jsx(TMButton, { btnStyle: isMobile ? 'toolbar' : 'advanced', showTooltip: isMobile, icon: _jsx(IconSignaturePencil, {}), caption: SDKUI_Localizator.SignatureAndApprove, width: "160px", disabled: signApproveDisable, onClick: () => !signApproveDisable && onSignApprove?.(), advancedColor: TMColors.success, color: "success" }), _jsx(TMButton, { btnStyle: isMobile ? 'toolbar' : 'advanced', showTooltip: isMobile, icon: _jsx(IconCloseOutline, {}), caption: SDKUI_Localizator.Reject, disabled: rejectDisable, onClick: () => !rejectDisable && onReject?.(), advancedColor: TMColors.error, color: "error" }), _jsx(TMButton, { btnStyle: isMobile ? 'toolbar' : 'advanced', showTooltip: isMobile, icon: _jsx(IconInfo, { fontSize: 16 }), caption: SDKUI_Localizator.MoreInformation, width: "180px", disabled: infoDisable, onClick: () => !infoDisable && onMoreInfo?.(), advancedColor: TMColors.info, color: "info" })] })) : (_jsxs(_Fragment, { children: [_jsx(TMButton, { btnStyle: isMobile ? 'toolbar' : 'advanced', showTooltip: isMobile, icon: _jsx(IconApply, {}), caption: SDKUI_Localizator.Approve, disabled: approveDisable, onClick: () => !approveDisable && onApprove?.(), advancedColor: TMColors.success, color: "success" }), _jsx(TMButton, { btnStyle: isMobile ? 'toolbar' : 'advanced', showTooltip: isMobile, icon: _jsx(IconCloseOutline, {}), caption: SDKUI_Localizator.Reject, disabled: rejectDisable, onClick: () => !rejectDisable && onReject?.(), advancedColor: TMColors.error, color: "error" }), _jsx(TMButton, { btnStyle: isMobile ? 'toolbar' : 'advanced', showTooltip: isMobile, icon: _jsx(IconUser, { fontSize: 16 }), caption: SDKUI_Localizator.Reassign, disabled: reassignDisable, onClick: () => !reassignDisable && onReAssign?.(), advancedColor: TMColors.tertiary, color: "tertiary" }), _jsx(TMButton, { btnStyle: isMobile ? 'toolbar' : 'advanced', showTooltip: isMobile, icon: _jsx(IconInfo, { fontSize: 16 }), caption: SDKUI_Localizator.MoreInformation, width: "180px", disabled: infoDisable, onClick: () => !infoDisable && onMoreInfo?.(), advancedColor: TMColors.info, color: "info" })] })) }));
|
|
71
84
|
};
|
|
72
85
|
export const WorkFlowApproveRejectPopUp = ({ TID = 0, DID = 0, deviceType = DeviceType.DESKTOP, isReject, selectedItems = [], onClose, onCompleted }) => {
|
|
73
86
|
const [commentValue, setCommentValue] = useState('');
|
|
@@ -307,6 +307,8 @@ export const cellRenderTID = (data, noneSelectionText) => {
|
|
|
307
307
|
};
|
|
308
308
|
export const renderDTDTooltipContent = (dtd) => {
|
|
309
309
|
const mapAccessLevelToLocalizedString = (level) => {
|
|
310
|
+
if (level === undefined || level === null)
|
|
311
|
+
return SDKUI_Localizator.No;
|
|
310
312
|
switch (level) {
|
|
311
313
|
case AccessLevelsEx.Yes || AccessLevels.Yes:
|
|
312
314
|
return SDKUI_Localizator.Yes;
|
|
@@ -319,7 +321,7 @@ export const renderDTDTooltipContent = (dtd) => {
|
|
|
319
321
|
case AccessLevelsEx.None || AccessLevels.None:
|
|
320
322
|
return SDK_Localizator.None;
|
|
321
323
|
default:
|
|
322
|
-
return
|
|
324
|
+
return level.toString();
|
|
323
325
|
}
|
|
324
326
|
};
|
|
325
327
|
return (!dtd ? null
|