@topconsultnpm/sdkui-react 6.20.0-dev2.6 → 6.20.0-dev2.61
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/NewComponents/ContextMenu/styles.d.ts +3 -1
- package/lib/components/NewComponents/ContextMenu/styles.js +7 -5
- package/lib/components/base/Styled.d.ts +4 -1
- package/lib/components/base/Styled.js +11 -3
- package/lib/components/base/TMTreeView.d.ts +3 -1
- package/lib/components/base/TMTreeView.js +64 -21
- package/lib/components/choosers/TMDataListItemEditor.d.ts +11 -0
- package/lib/components/choosers/TMDataListItemEditor.js +130 -0
- package/lib/components/choosers/TMDataListItemFields.d.ts +11 -0
- package/lib/components/choosers/TMDataListItemFields.js +61 -0
- package/lib/components/choosers/TMDataListItemPicker.d.ts +1 -0
- package/lib/components/choosers/TMDataListItemPicker.js +178 -18
- package/lib/components/choosers/TMDynDataListItemChooser.js +11 -6
- package/lib/components/choosers/TMImageIDChooser.d.ts +16 -0
- package/lib/components/choosers/TMImageIDChooser.js +53 -0
- package/lib/components/choosers/TMMetadataChooser.js +1 -1
- package/lib/components/editors/TMDateBox.js +1 -1
- package/lib/components/editors/TMHtmlEditor.js +1 -1
- package/lib/components/editors/TMLocalizedTextBox.d.ts +1 -0
- package/lib/components/editors/TMLocalizedTextBox.js +3 -3
- package/lib/components/editors/TMMetadataValues.js +3 -1
- package/lib/components/editors/TMTextBox.js +9 -10
- package/lib/components/features/archive/TMArchive.js +29 -42
- package/lib/components/features/blog/TMBlogCommentForm.d.ts +3 -0
- package/lib/components/features/blog/TMBlogCommentForm.js +42 -36
- package/lib/components/features/documents/TMDcmtForm.js +193 -45
- package/lib/components/features/documents/TMDcmtPreview.js +2 -1
- package/lib/components/features/documents/TMDcmtTasks.d.ts +3 -1
- package/lib/components/features/documents/TMDcmtTasks.js +2 -2
- package/lib/components/features/documents/TMFileUploader.js +5 -2
- package/lib/components/features/documents/TMMasterDetailDcmts.js +68 -84
- package/lib/components/features/documents/TMRelationViewer.d.ts +7 -1
- package/lib/components/features/documents/TMRelationViewer.js +395 -78
- package/lib/components/features/search/TMSearchResult.d.ts +1 -0
- package/lib/components/features/search/TMSearchResult.js +46 -77
- package/lib/components/features/search/TMSearchResultsMenuItems.js +2 -2
- package/lib/components/features/tasks/TMTaskForm.d.ts +1 -0
- package/lib/components/features/tasks/TMTaskForm.js +61 -193
- package/lib/components/features/tasks/TMTaskFormUtils.d.ts +80 -0
- package/lib/components/features/tasks/TMTaskFormUtils.js +559 -0
- package/lib/components/features/tasks/TMTasksUtils.d.ts +3 -1
- package/lib/components/features/tasks/TMTasksUtils.js +46 -16
- package/lib/components/features/tasks/TMTasksUtilsView.d.ts +0 -7
- package/lib/components/features/tasks/TMTasksUtilsView.js +7 -14
- package/lib/components/features/tasks/TMTasksView.js +5 -3
- package/lib/components/features/workflow/TMWorkflowPopup.d.ts +20 -3
- package/lib/components/features/workflow/TMWorkflowPopup.js +14 -92
- package/lib/components/features/workflow/diagram/ConnectionComponent.d.ts +1 -0
- package/lib/components/features/workflow/diagram/ConnectionComponent.js +6 -2
- package/lib/components/features/workflow/diagram/DiagramItemForm.js +1 -1
- package/lib/components/features/workflow/diagram/WFDiagram.js +75 -5
- package/lib/components/forms/Login/TMLoginForm.js +1 -1
- package/lib/components/forms/TMSaveForm.js +61 -13
- package/lib/components/grids/TMBlogsPost.js +8 -8
- package/lib/components/grids/TMBlogsPostUtils.js +2 -2
- package/lib/components/index.d.ts +2 -0
- package/lib/components/index.js +2 -0
- package/lib/components/layout/panelManager/TMPanelManagerContainer.js +3 -2
- package/lib/components/pages/TMPage.js +4 -0
- package/lib/components/query/TMQueryEditor.d.ts +1 -0
- package/lib/components/query/TMQueryEditor.js +2 -2
- package/lib/helper/Enum_Localizator.js +5 -0
- package/lib/helper/GlobalStyles.js +3 -0
- package/lib/helper/SDKUI_Globals.d.ts +8 -0
- package/lib/helper/SDKUI_Globals.js +12 -0
- package/lib/helper/SDKUI_Localizator.d.ts +17 -3
- package/lib/helper/SDKUI_Localizator.js +162 -22
- package/lib/helper/TMIcons.d.ts +2 -1
- package/lib/helper/TMIcons.js +4 -1
- package/lib/helper/TMUtils.d.ts +23 -0
- package/lib/helper/TMUtils.js +66 -3
- package/lib/helper/helpers.d.ts +6 -2
- package/lib/helper/helpers.js +24 -8
- package/lib/helper/index.d.ts +1 -0
- package/lib/helper/index.js +1 -0
- package/lib/helper/queryHelper.js +1 -1
- package/lib/hooks/useBetaFeatures.d.ts +1 -0
- package/lib/hooks/useBetaFeatures.js +41 -0
- package/lib/hooks/useDcmtOperations.js +14 -2
- package/lib/hooks/useRelatedDocuments.js +34 -11
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/package.json +11 -11
|
@@ -1,70 +1,24 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useEffect,
|
|
3
|
-
import { ObjectClasses, TaskDescriptor,
|
|
4
|
-
import {
|
|
2
|
+
import { useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { ObjectClasses, TaskDescriptor, PdGs, UserListCacheService, SDK_Localizator } from '@topconsultnpm/sdk-ts';
|
|
4
|
+
import { gotoPDGExtendedLabel, taskValidatorAsync } from './TMTasksUtils';
|
|
5
5
|
import ScrollView from 'devextreme-react/scroll-view';
|
|
6
6
|
import TMLayoutContainer from '../../base/TMLayout';
|
|
7
7
|
import { FormModes } from '../../../ts';
|
|
8
8
|
import { useWorkflowApprove } from '../../../hooks/useWorkflowApprove';
|
|
9
9
|
import { SaveFormOptions, useSaveForm } from '../../../hooks/useForm';
|
|
10
|
-
import { SDKUI_Localizator, calcIsModified,
|
|
10
|
+
import { SDKUI_Localizator, calcIsModified, getMoreInfoTasksForDocument } from '../../../helper';
|
|
11
11
|
import { TMExceptionBoxManager } from '../../base/TMPopUp';
|
|
12
12
|
import TMSpinner from '../../base/TMSpinner';
|
|
13
|
-
import TMTooltip from '../../base/TMTooltip';
|
|
14
|
-
import TMUserChooser from '../../choosers/TMUserChooser';
|
|
15
|
-
import TMDateBox from '../../editors/TMDateBox';
|
|
16
|
-
import TMDropDown from '../../editors/TMDropDown';
|
|
17
|
-
import TMTextArea from '../../editors/TMTextArea';
|
|
18
|
-
import TMTextBox from '../../editors/TMTextBox';
|
|
19
13
|
import TMSaveForm from '../../forms/TMSaveForm';
|
|
20
14
|
import TMDcmtForm from '../documents/TMDcmtForm';
|
|
21
|
-
import
|
|
22
|
-
import { TMColors } from '../../../utils/theme';
|
|
23
|
-
import { renderContextBlock } from './TMTasksUtilsView';
|
|
24
|
-
import { DeviceType, useDeviceType } from '../../base/TMDeviceProvider';
|
|
25
|
-
const ResponseCommentWrapper = styled.div `
|
|
26
|
-
position: relative;
|
|
27
|
-
width: 100%;
|
|
28
|
-
`;
|
|
29
|
-
const ResponseCommentLabel = styled.label `
|
|
30
|
-
position: absolute;
|
|
31
|
-
top: -8px;
|
|
32
|
-
left: 12px;
|
|
33
|
-
background-color: white;
|
|
34
|
-
padding: 0 4px;
|
|
35
|
-
font-size: 0.9rem;
|
|
36
|
-
color: rgb(80,80,80);
|
|
37
|
-
display: inline-flex;
|
|
38
|
-
align-items: center;
|
|
39
|
-
gap: 4px;
|
|
40
|
-
`;
|
|
41
|
-
const ResponseCommentTextArea = styled.textarea.attrs({
|
|
42
|
-
maxLength: 500,
|
|
43
|
-
}) `
|
|
44
|
-
width: 100%;
|
|
45
|
-
height: 100px;
|
|
46
|
-
border: 1px solid ${props => props.$isValid ? (props.$isModifiedWhen ? "#E29000" : '#b4b4b4') : TMColors.error};
|
|
47
|
-
border-radius: 10px;
|
|
48
|
-
padding: 10px;
|
|
49
|
-
resize: none;
|
|
50
|
-
cursor: ${props => props.disabled ? 'not-allowed' : 'text'};
|
|
51
|
-
&:focus {
|
|
52
|
-
outline: none;
|
|
53
|
-
border-bottom: 4px solid ${props => props.$isValid ? TMColors.primaryColor : TMColors.error};
|
|
54
|
-
}
|
|
55
|
-
`;
|
|
56
|
-
const ResponseCommentCharacterCounter = styled.div `
|
|
57
|
-
text-align: right;
|
|
58
|
-
font-size: 0.8rem;
|
|
59
|
-
color: #6c757d;
|
|
60
|
-
margin-top: 4px;
|
|
61
|
-
`;
|
|
15
|
+
import { getCurrentUserTaskRole, RenderDescriptionField, RenderEndDateField, RenderNameField, RenderPriorityField, RenderRemindDateField, RenderStartDateField, RenderTaskFormStateField, TaskAssigneeField, TaskFormAssignmentNoticeBadge, TaskFormContextualAttachments, TMChangeStateForm } from './TMTaskFormUtils';
|
|
62
16
|
const TMTaskForm = (props) => {
|
|
63
17
|
// Custom hook to manage workflow approval data
|
|
64
18
|
const { refreshWorkflowApprove } = useWorkflowApprove();
|
|
65
|
-
const validator = async (taskDescriptor) => { return await taskValidatorAsync(taskDescriptor); };
|
|
19
|
+
const validator = async (taskDescriptor) => { return await taskValidatorAsync(taskDescriptor, requestMoreInfo); };
|
|
66
20
|
// Destructure the props object to extract individual properties
|
|
67
|
-
const { id, title, isModal, formMode, visualizedTasks, editTaskCallback, currentTask, setCurrentTask, isContextualCreate = false, selectedRowKeys, handleFocusedRowKeyChange, onStatusChanged, onSaved, onClose, onCancel, taskContext, startDate, endDate, showBackButton = true, hasNavigation = true, width = "100%", height = "100%", usersList, onOpenS4TViewerRequest, s4TViewerDialogComponent, allTasks, getAllTasks, deleteTaskByIdsCallback, addTaskCallback, handleNavigateToWGs, handleNavigateToDossiers } = props;
|
|
21
|
+
const { id, title, isModal, formMode, requestMoreInfo = false, visualizedTasks, editTaskCallback, currentTask, setCurrentTask, isContextualCreate = false, selectedRowKeys, handleFocusedRowKeyChange, onStatusChanged, onSaved, onClose, onCancel, taskContext, startDate, endDate, showBackButton = true, hasNavigation = true, width = "100%", height = "100%", usersList, onOpenS4TViewerRequest, s4TViewerDialogComponent, allTasks, getAllTasks, deleteTaskByIdsCallback, addTaskCallback, handleNavigateToWGs, handleNavigateToDossiers } = props;
|
|
68
22
|
const sfo = new SaveFormOptions();
|
|
69
23
|
sfo.objClass = ObjectClasses.Task;
|
|
70
24
|
const customizeFormData = (task) => {
|
|
@@ -102,17 +56,20 @@ const TMTaskForm = (props) => {
|
|
|
102
56
|
task.iD2 = taskContext.workItem.did;
|
|
103
57
|
task.toID = 0;
|
|
104
58
|
}
|
|
59
|
+
if (requestMoreInfo) {
|
|
60
|
+
task.toID = undefined;
|
|
61
|
+
task.toName = undefined;
|
|
62
|
+
task.startTime = new Date();
|
|
63
|
+
const end = new Date();
|
|
64
|
+
end.setHours(23, 59, 59, 0);
|
|
65
|
+
task.endTime = end;
|
|
66
|
+
}
|
|
105
67
|
return task;
|
|
106
68
|
};
|
|
107
69
|
const { formData, setFormData, formDataOrig, validationItems, exception, saveDataAsync } = useSaveForm(formMode, id, sfo, validator, onSaved, onStatusChanged, customizeFormData);
|
|
108
70
|
const containerRef = useRef(null);
|
|
109
|
-
// Get the current device type (e.g., mobile, tablet, desktop) using a custom hook.
|
|
110
|
-
const deviceType = useDeviceType();
|
|
111
|
-
// This avoids unnecessary re-renders by only recalculating when deviceType changes.
|
|
112
|
-
let isMobileDevice = useMemo(() => { return deviceType === DeviceType.MOBILE; }, [deviceType]);
|
|
113
|
-
const [isMobile, setIsMobile] = useState(false);
|
|
114
71
|
const [showDcmtForm, setShowDcmtForm] = useState(false);
|
|
115
|
-
const
|
|
72
|
+
const [showChangeStateForm, setShowChangeStateForm] = useState(false);
|
|
116
73
|
const [users, setUsers] = useState([]); // State to store the users
|
|
117
74
|
// Initial state for the fields' editability (readonly)
|
|
118
75
|
const [fieldsReadOnly, setFieldsReadOnly] = useState({
|
|
@@ -144,31 +101,28 @@ const TMTaskForm = (props) => {
|
|
|
144
101
|
};
|
|
145
102
|
fetchUsers();
|
|
146
103
|
}, []);
|
|
104
|
+
// Imposta i campi readonly in base al ruolo utente e al contesto
|
|
147
105
|
useEffect(() => {
|
|
148
|
-
if (
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
const isTaskAssignedByDifferentUser = areDifferentIDs(formDataOrig.fromID, SDK_Globals.tmSession?.SessionDescr?.userID);
|
|
106
|
+
if (!formDataOrig)
|
|
107
|
+
return;
|
|
108
|
+
// UPDATE: se l'utente è receiver (destinatario del task), i campi principali sono readonly
|
|
109
|
+
if (formMode === FormModes.Update) {
|
|
110
|
+
const taskRole = getCurrentUserTaskRole(formDataOrig);
|
|
154
111
|
setFieldsReadOnly({
|
|
155
|
-
name:
|
|
156
|
-
description:
|
|
157
|
-
fromID:
|
|
158
|
-
assignedTO:
|
|
112
|
+
name: taskRole === 'receiver',
|
|
113
|
+
description: taskRole === 'receiver',
|
|
114
|
+
fromID: taskRole === 'receiver',
|
|
115
|
+
assignedTO: taskRole === 'receiver',
|
|
159
116
|
status: false,
|
|
160
|
-
priority:
|
|
161
|
-
startDate:
|
|
162
|
-
endDate:
|
|
117
|
+
priority: taskRole === 'receiver',
|
|
118
|
+
startDate: taskRole === 'receiver',
|
|
119
|
+
endDate: taskRole === 'receiver',
|
|
163
120
|
remTime: false,
|
|
164
121
|
response: false
|
|
165
122
|
});
|
|
166
|
-
const newTaskDescriptor = new TaskDescriptor();
|
|
167
|
-
Object.assign(newTaskDescriptor, formDataOrig);
|
|
168
|
-
newTaskDescriptor.isNew = 0;
|
|
169
|
-
editTaskCallback(newTaskDescriptor);
|
|
170
123
|
}
|
|
171
|
-
|
|
124
|
+
// CREATE/DUPLICATE da DossierAction: il nome è precompilato e bloccato
|
|
125
|
+
if ((formMode === FormModes.Create || formMode === FormModes.Duplicate) && taskContext?.dossier && taskContext?.dossier?.origin === 'DossierAction' && currentTask) {
|
|
172
126
|
setFieldsReadOnly({
|
|
173
127
|
name: true,
|
|
174
128
|
description: false,
|
|
@@ -183,44 +137,23 @@ const TMTaskForm = (props) => {
|
|
|
183
137
|
});
|
|
184
138
|
}
|
|
185
139
|
}, [formDataOrig, formMode]);
|
|
140
|
+
// Notifica il task come "non nuovo" quando si è in modalità Update
|
|
186
141
|
useEffect(() => {
|
|
187
|
-
if (!
|
|
188
|
-
// Function to handle resize events and update the mobile state based on container width.
|
|
189
|
-
const updateDimensions = (entries) => {
|
|
190
|
-
for (let entry of entries) {
|
|
191
|
-
const { width } = entry.contentRect;
|
|
192
|
-
setIsMobile(width <= mobileBreakpoint);
|
|
193
|
-
}
|
|
194
|
-
};
|
|
195
|
-
// Create a ResizeObserver to observe container size changes
|
|
196
|
-
const resizeObserver = new ResizeObserver(updateDimensions);
|
|
197
|
-
if (containerRef.current) {
|
|
198
|
-
resizeObserver.observe(containerRef.current);
|
|
199
|
-
}
|
|
200
|
-
// Cleanup: Stop observing when the component unmounts or the dependency changes.
|
|
201
|
-
return () => {
|
|
202
|
-
if (containerRef.current) {
|
|
203
|
-
resizeObserver.unobserve(containerRef.current);
|
|
204
|
-
}
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
return undefined;
|
|
208
|
-
}, [containerRef, isModal]); // Dependency array ensures this effect runs when containerRef changes.
|
|
209
|
-
// Function to handle changes in the status value of a TM Drop Down
|
|
210
|
-
const onStatusValueChange = (e) => {
|
|
211
|
-
if (!e?.target?.value)
|
|
142
|
+
if (!formDataOrig)
|
|
212
143
|
return;
|
|
213
|
-
|
|
214
|
-
|
|
144
|
+
if (formMode !== FormModes.Update)
|
|
145
|
+
return;
|
|
146
|
+
const newTaskDescriptor = new TaskDescriptor();
|
|
147
|
+
Object.assign(newTaskDescriptor, formDataOrig);
|
|
148
|
+
newTaskDescriptor.isNew = 0;
|
|
149
|
+
editTaskCallback(newTaskDescriptor);
|
|
150
|
+
}, [formDataOrig, formMode]);
|
|
215
151
|
// Function to handle changes in the priority value of a TM Drop Down
|
|
216
152
|
const onPriorityValueChange = (e) => {
|
|
217
153
|
if (!e?.target?.value)
|
|
218
154
|
return;
|
|
219
155
|
setFormData({ ...formData ?? {}, priority: e?.target?.value });
|
|
220
156
|
};
|
|
221
|
-
const onAnswerChange = (e) => {
|
|
222
|
-
setFormData({ ...formData ?? {}, response: e.target.value ?? '' });
|
|
223
|
-
};
|
|
224
157
|
// Function to handle the undo action
|
|
225
158
|
const onUndoCallback = () => {
|
|
226
159
|
setFormData(formDataOrig);
|
|
@@ -330,6 +263,9 @@ const TMTaskForm = (props) => {
|
|
|
330
263
|
await editTaskCallback(task);
|
|
331
264
|
onClose?.();
|
|
332
265
|
};
|
|
266
|
+
const handleShowChangeStateForm = (value) => {
|
|
267
|
+
setShowChangeStateForm(value);
|
|
268
|
+
};
|
|
333
269
|
const handleNavigateToReference = (ref) => {
|
|
334
270
|
switch (ref.objClass) {
|
|
335
271
|
case ObjectClasses.Dossier:
|
|
@@ -349,94 +285,26 @@ const TMTaskForm = (props) => {
|
|
|
349
285
|
console.warn(`Unhandled object type: ${ref.objClass}`);
|
|
350
286
|
}
|
|
351
287
|
};
|
|
352
|
-
return (_jsx("div", { style: { width: "100%", height: "100%", overflow: "auto" }, ref: containerRef, children:
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
condition: formMode === FormModes.Create && isContextualCreate && !!taskContext?.workingGroup?.id,
|
|
358
|
-
pdg: PdGs.WG,
|
|
359
|
-
label: getOriginLabel(PdGs.WG, taskContext?.workingGroup?.name),
|
|
360
|
-
isMobile: isMobile
|
|
361
|
-
}), renderContextBlock({
|
|
362
|
-
condition: formMode === FormModes.Create && isContextualCreate && !!taskContext?.dossier?.id,
|
|
363
|
-
pdg: PdGs.CF,
|
|
364
|
-
label: getOriginLabel(PdGs.CF, taskContext?.dossier?.name),
|
|
365
|
-
isMobile: isMobile
|
|
366
|
-
}), renderContextBlock({
|
|
367
|
-
condition: formMode === FormModes.Create && isContextualCreate && !!taskContext?.document?.tid && !!taskContext?.document?.did,
|
|
368
|
-
pdg: PdGs.DT,
|
|
369
|
-
label: getOriginLabel(PdGs.DT, taskContext?.document?.name),
|
|
370
|
-
isMobile: isMobile
|
|
371
|
-
}), renderContextBlock({
|
|
372
|
-
condition: formMode === FormModes.Create && isContextualCreate && !!taskContext?.workItem?.tid && !!taskContext?.workItem?.did,
|
|
373
|
-
pdg: PdGs.DT,
|
|
374
|
-
label: getOriginLabel(PdGs.DT, taskContext?.workItem?.name),
|
|
375
|
-
isMobile: isMobile
|
|
376
|
-
}), formMode === FormModes.Update && formData?.pdG && formData?.iD1Name && (_jsx(TMConditionalWrapper, { condition: !isMobile, wrapper: children => (_jsx("div", { style: {
|
|
377
|
-
display: 'flex',
|
|
378
|
-
flexDirection: 'row',
|
|
379
|
-
width: '100%',
|
|
380
|
-
gap: 16,
|
|
381
|
-
padding: '8px 0'
|
|
382
|
-
}, children: children })), children: _jsx("div", { style: {
|
|
383
|
-
width: "100%",
|
|
384
|
-
display: 'flex',
|
|
385
|
-
alignItems: 'center',
|
|
386
|
-
justifyContent: 'center',
|
|
387
|
-
marginTop: 12
|
|
388
|
-
}, children: _jsxs("div", { onClick: () => formData.pdG !== PdGs.None ? gotoPDGExtendedLabelClickCallback() : null, style: {
|
|
389
|
-
backgroundColor: "#C2388B",
|
|
390
|
-
color: "#fff",
|
|
391
|
-
padding: "10px 16px",
|
|
392
|
-
borderRadius: "20px",
|
|
393
|
-
display: "flex",
|
|
394
|
-
alignItems: "center",
|
|
395
|
-
justifyContent: "space-between",
|
|
396
|
-
cursor: "pointer",
|
|
397
|
-
fontWeight: 500,
|
|
398
|
-
transition: "background-color 0.3s",
|
|
399
|
-
minWidth: "180px",
|
|
400
|
-
maxWidth: "100%",
|
|
401
|
-
flexWrap: "wrap",
|
|
402
|
-
gap: "8px",
|
|
403
|
-
}, onMouseEnter: e => {
|
|
404
|
-
if (formData.pdG !== PdGs.None)
|
|
405
|
-
e.currentTarget.style.backgroundColor = "#A12D78";
|
|
406
|
-
}, onMouseLeave: e => {
|
|
407
|
-
if (formData.pdG !== PdGs.None)
|
|
408
|
-
e.currentTarget.style.backgroundColor = "#C2388B";
|
|
409
|
-
}, children: [_jsxs("span", { style: {
|
|
410
|
-
flex: 1,
|
|
411
|
-
textAlign: "center",
|
|
412
|
-
gap: "6px",
|
|
413
|
-
display: "flex",
|
|
414
|
-
justifyContent: "center",
|
|
415
|
-
alignItems: "center",
|
|
416
|
-
}, children: [formData.pdG === PdGs.WG && _jsx("span", { children: SDKUI_Localizator.GoToWorkgroup }), formData.pdG === PdGs.CF && _jsx("span", { children: SDKUI_Localizator.GoToDossier }), formData.pdG === PdGs.DT && _jsx("span", { children: SDKUI_Localizator.GoToDocument }), (() => {
|
|
417
|
-
const originLabel = getOriginLabel(formData.pdG, formData.iD1Name);
|
|
418
|
-
if (!originLabel)
|
|
419
|
-
return null;
|
|
420
|
-
const maxLength = isMobileDevice ? 10 : 25;
|
|
421
|
-
const displayText = originLabel.length > maxLength
|
|
422
|
-
? originLabel.slice(0, maxLength) + "..."
|
|
423
|
-
: originLabel;
|
|
424
|
-
return _jsxs("span", { children: ["\u201C", displayText, "\u201D"] });
|
|
425
|
-
})()] }), _jsx(TMTooltip, { content: _jsxs("div", { style: { textAlign: "left" }, children: [formData.pdG && (_jsxs(_Fragment, { children: [_jsxs("div", { style: {
|
|
426
|
-
display: "flex",
|
|
427
|
-
alignItems: "center",
|
|
428
|
-
gap: "6px",
|
|
429
|
-
fontWeight: 600,
|
|
430
|
-
}, children: [_jsx("span", { style: { display: "flex", alignItems: "center" }, children: getPdgsIconMap().get(formData.pdG) }), _jsx("span", { children: formData.pdG === PdGs.WG ? SDKUI_Localizator.WorkGroup : formData.pdG === PdGs.CF ? SDKUI_Localizator.Dossier : formData.pdG === PdGs.DT ? SDKUI_Localizator.Document : "" })] }), _jsx("hr", { style: { margin: "4px 0 8px 0" } })] })), formData.iD1 != null && formData.iD1 !== 0 && (_jsxs("div", { children: [_jsx("b", { children: "ID1" }), ": ", formData.iD1.toString()] })), formData.iD1Name && (_jsxs("div", { children: [_jsx("b", { children: "ID1NAME" }), ": ", formData.iD1Name.toString()] })), formData.iD2 != null && formData.iD2 !== 0 && (_jsxs("div", { children: [_jsx("b", { children: "ID2" }), ": ", formData.iD2.toString()] }))] }), children: _jsx("i", { className: "dx-icon-info", style: { fontSize: "1.3rem", flexShrink: 0 } }) })] }) }) })), _jsx(TMConditionalWrapper, { condition: !isMobile, wrapper: children => _jsx("div", { style: { display: 'flex', flexDirection: 'row', width: '100%', gap: 10 }, children: children }), children: _jsx("div", { style: { width: isMobile ? '100%' : '50%' }, children: _jsx(TMTextBox, { label: SDKUI_Localizator.Name, value: formData?.name ?? '', readOnly: fieldsReadOnly.name, autoFocus: true, maxLength: 100, isModifiedWhen: formData?.name !== formDataOrig?.name, onValueChanged: (e) => { setFormData({ ...formData ?? {}, name: e.target.value }); }, validationItems: validationItems?.filter(o => o.PropertyName === SDKUI_Localizator.Name) }) }) }), _jsx("div", { style: { width: '100%' }, children: _jsx(TMTextArea, { label: SDKUI_Localizator.Description, value: formData?.description ?? '', maxLength: 200, readOnly: fieldsReadOnly.description, isModifiedWhen: formData?.description !== formDataOrig?.description, onValueChanged: (e) => { setFormData({ ...formData ?? {}, description: e.target.value }); }, validationItems: validationItems?.filter(o => o.PropertyName === SDKUI_Localizator.Description), resize: false }) }), _jsx(TMConditionalWrapper, { condition: !isMobile, wrapper: children => _jsx("div", { style: { display: 'flex', flexDirection: 'row', width: '100%', gap: 10 }, children: children }), children: (formMode === FormModes.Create || !areDifferentIDs(formDataOrig?.fromID, SDK_Globals.tmSession?.SessionDescr?.userID)) ?
|
|
431
|
-
_jsx("div", { id: "assignedToAnotherUserField", style: { width: isMobile ? '100%' : '50%' }, children: _jsx(TMUserChooser, { dataSource: usersList ?? undefined, allowShowAllUsers: !!taskContext?.dossier, allowMultipleSelection: false, label: SDKUI_Localizator.AssignedTo_Female, readOnly: fieldsReadOnly.assignedTO, values: formData?.toID ? [formData?.toID] : [], isModifiedWhen: formData?.toID !== formDataOrig?.toID, validationItems: validationItems?.filter(o => o.PropertyName === SDKUI_Localizator.AssignedTo_Female), onValueChanged: (newValue) => {
|
|
288
|
+
return (_jsx("div", { style: { width: "100%", height: "100%", overflow: "auto" }, ref: containerRef, children: _jsxs(TMSaveForm, { width: width, height: height, id: id, title: title, isModal: isModal, formMode: formMode, onSaveAsync: saveDataAsync, onClose: onCloseCallback, showUndoButton: formMode === FormModes.Update, onUndo: onUndoCallback, exception: exception, isModified: calcIsModified(formData, formDataOrig), validationItems: validationItems, showBackButton: showBackButton, hasNavigation: (hasNavigation && formMode !== FormModes.Create), canNext: canNext(), onNext: onNextCallback, canPrev: canPrev(), onPrev: onPrevCallback, showToolbar: !(showDcmtForm && formData?.iD1 && formData?.iD2), children: [_jsxs(_Fragment, { children: [_jsx(ScrollView, { direction: "vertical", useNative: true, height: formData && (formMode === FormModes.Create || formMode === FormModes.None) ? "calc(100% - 70px)" : "calc(100% - 35px)", children: _jsx("div", { style: { marginRight: "5px" }, children: _jsxs(TMLayoutContainer, { direction: 'vertical', gap: 2, children: [(formMode === FormModes.Create || formMode === FormModes.Duplicate || formMode === FormModes.None) && _jsxs("div", { style: { width: '100%', height: '100%' }, children: [_jsx(RenderNameField, { fieldsReadOnly: fieldsReadOnly, setFormData: setFormData, formData: formData, formDataOrig: formDataOrig, validationItems: validationItems, requestMoreInfo: requestMoreInfo }), _jsx(RenderDescriptionField, { fieldsReadOnly: fieldsReadOnly, setFormData: setFormData, formData: formData, formDataOrig: formDataOrig, validationItems: validationItems }), _jsx(TaskAssigneeField, { label: requestMoreInfo ? SDKUI_Localizator.RequestTo : undefined, formMode: formMode, formData: formData, formDataOrig: formDataOrig, taskContext: taskContext, validationItems: validationItems, fieldsReadOnly: fieldsReadOnly, usersList: usersList, onValueChanged: (newValue) => {
|
|
289
|
+
if (newValue === undefined)
|
|
290
|
+
return;
|
|
291
|
+
setFormData({ ...formData ?? {}, toID: newValue[0] });
|
|
292
|
+
} }), _jsx(RenderStartDateField, { fieldsReadOnly: fieldsReadOnly, formData: formData, formDataOrig: formDataOrig, validationItems: validationItems, setFormData: setFormData, onContentReady: handleStartTimeContentReady }), _jsx(RenderEndDateField, { fieldsReadOnly: fieldsReadOnly, formData: formData, formDataOrig: formDataOrig, validationItems: validationItems, setFormData: setFormData, onContentReady: handleEndTimeContentReady }), _jsx(RenderRemindDateField, { fieldsReadOnly: fieldsReadOnly, formData: formData, formDataOrig: formDataOrig, validationItems: validationItems, setFormData: setFormData }), _jsx(RenderPriorityField, { formData: formData, formDataOrig: formDataOrig, fieldsReadOnly: fieldsReadOnly, onPriorityValueChange: onPriorityValueChange }), _jsx(TaskFormContextualAttachments, { taskContext: taskContext, currentTask: formData })] }), (formMode === FormModes.Update) && _jsxs("div", { style: { width: '100%', height: '100%' }, children: [_jsx(RenderNameField, { fieldsReadOnly: fieldsReadOnly, setFormData: setFormData, formData: formData, formDataOrig: formDataOrig, validationItems: validationItems }), _jsx(RenderDescriptionField, { fieldsReadOnly: fieldsReadOnly, setFormData: setFormData, formData: formData, formDataOrig: formDataOrig, validationItems: validationItems }), _jsx(TaskAssigneeField, { formMode: formMode, formData: formData, formDataOrig: formDataOrig, taskContext: taskContext, validationItems: validationItems, fieldsReadOnly: fieldsReadOnly, usersList: usersList, onValueChanged: (newValue) => {
|
|
432
293
|
if (newValue === undefined)
|
|
433
294
|
return;
|
|
434
295
|
setFormData({ ...formData ?? {}, toID: newValue[0] });
|
|
435
|
-
} }) })
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
296
|
+
} }), _jsx(RenderStartDateField, { fieldsReadOnly: fieldsReadOnly, formData: formData, formDataOrig: formDataOrig, validationItems: validationItems, setFormData: setFormData, onContentReady: handleStartTimeContentReady }), _jsx(RenderEndDateField, { fieldsReadOnly: fieldsReadOnly, formData: formData, formDataOrig: formDataOrig, validationItems: validationItems, setFormData: setFormData, onContentReady: handleEndTimeContentReady }), _jsx(RenderPriorityField, { formData: formData, formDataOrig: formDataOrig, fieldsReadOnly: fieldsReadOnly, onPriorityValueChange: onPriorityValueChange }), _jsx(RenderRemindDateField, { fieldsReadOnly: fieldsReadOnly, formData: formData, formDataOrig: formDataOrig, validationItems: validationItems, setFormData: setFormData }), _jsx(RenderTaskFormStateField, { formData: formData, formDataOrig: formDataOrig, formMode: formMode, gotoPDGExtendedLabelClickCallback: gotoPDGExtendedLabelClickCallback, handleShowChangeStateForm: handleShowChangeStateForm, onSavedCallback: onSaved })] })] }) }) }), formData && (_jsx("div", { style: {
|
|
297
|
+
position: 'absolute',
|
|
298
|
+
bottom: 0,
|
|
299
|
+
left: 0,
|
|
300
|
+
right: 0,
|
|
301
|
+
padding: '8px 12px',
|
|
302
|
+
backgroundColor: '#fff',
|
|
303
|
+
borderTop: '1px solid #e6e6e6',
|
|
304
|
+
display: 'flex',
|
|
305
|
+
justifyContent: 'flex-end',
|
|
306
|
+
alignItems: 'center'
|
|
307
|
+
}, children: _jsx(TaskFormAssignmentNoticeBadge, { task: formData, users: users, requestMoreInfo: requestMoreInfo }) })), (showDcmtForm && formData?.iD1 && formData?.iD2) &&
|
|
308
|
+
_jsx(TMDcmtForm, { titleModal: formData.iD1Name ?? '-', isModal: true, TID: formData.iD1, DID: formData.iD2, allowButtonsRefs: true, moreInfoTasks: getMoreInfoTasksForDocument(allTasks, formData?.iD1, formData?.iD2), onWFOperationCompleted: refreshWorkflowApprove, onTaskCompleted: onTaskCompleted, onClose: () => { setShowDcmtForm(false); }, onOpenS4TViewerRequest: onOpenS4TViewerRequest, s4TViewerDialogComponent: s4TViewerDialogComponent, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, onReferenceClick: handleNavigateToReference })] }), formData && showChangeStateForm && _jsx(TMChangeStateForm, { formData: formData, formDataOrig: formDataOrig, handleShowChangeStateForm: handleShowChangeStateForm, setFormData: setFormData })] }) }));
|
|
441
309
|
};
|
|
442
310
|
export default TMTaskForm;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { PdGs, Task_States, TaskDescriptor, UserDescriptor, ValidationItem } from "@topconsultnpm/sdk-ts";
|
|
3
|
+
import { FormModes, TaskContext } from "../../../ts";
|
|
4
|
+
import { IFieldsEditability } from "./TMTasksUtils";
|
|
5
|
+
export declare const getCurrentUserTaskRole: (task?: TaskDescriptor) => TaskRole;
|
|
6
|
+
interface TaskFormAssignmentNoticeSectionProps {
|
|
7
|
+
task: TaskDescriptor;
|
|
8
|
+
users: Array<UserDescriptor>;
|
|
9
|
+
requestMoreInfo?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare const TaskFormAssignmentNoticeBadge: (props: TaskFormAssignmentNoticeSectionProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
12
|
+
interface RenderContextBlockParams {
|
|
13
|
+
condition: boolean;
|
|
14
|
+
pdg: PdGs;
|
|
15
|
+
label: string | undefined;
|
|
16
|
+
}
|
|
17
|
+
export declare const RenderAttachmentBlock: ({ condition, pdg, label }: RenderContextBlockParams) => JSX.Element | null;
|
|
18
|
+
interface TaskFormContextualAttachmentsProps {
|
|
19
|
+
currentTask: TaskDescriptor | undefined;
|
|
20
|
+
taskContext: TaskContext | undefined;
|
|
21
|
+
}
|
|
22
|
+
export declare const TaskFormContextualAttachments: (props: TaskFormContextualAttachmentsProps) => import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
interface TaskFormAssignedToProps {
|
|
24
|
+
formMode: FormModes;
|
|
25
|
+
formData: TaskDescriptor | undefined;
|
|
26
|
+
formDataOrig: TaskDescriptor | undefined;
|
|
27
|
+
taskContext: TaskContext | undefined;
|
|
28
|
+
validationItems: Array<ValidationItem>;
|
|
29
|
+
fieldsReadOnly: IFieldsEditability;
|
|
30
|
+
usersList?: Array<UserDescriptor>;
|
|
31
|
+
label?: string;
|
|
32
|
+
onValueChanged: (newValue: Array<number> | undefined) => void;
|
|
33
|
+
}
|
|
34
|
+
export declare const TaskAssigneeField: (props: TaskFormAssignedToProps) => import("react/jsx-runtime").JSX.Element;
|
|
35
|
+
interface RenderFieldBaseProps {
|
|
36
|
+
fieldsReadOnly: IFieldsEditability;
|
|
37
|
+
formDataOrig?: TaskDescriptor;
|
|
38
|
+
formData?: TaskDescriptor;
|
|
39
|
+
}
|
|
40
|
+
interface RenderFieldProps extends RenderFieldBaseProps {
|
|
41
|
+
requestMoreInfo?: boolean;
|
|
42
|
+
label?: string;
|
|
43
|
+
validationItems?: Array<ValidationItem>;
|
|
44
|
+
setFormData: React.Dispatch<React.SetStateAction<TaskDescriptor | undefined>>;
|
|
45
|
+
}
|
|
46
|
+
interface RenderPriorityFieldProps extends RenderFieldBaseProps {
|
|
47
|
+
onPriorityValueChange: (e: React.ChangeEvent<HTMLSelectElement>) => void;
|
|
48
|
+
}
|
|
49
|
+
interface RenderDateFieldProps extends RenderFieldProps {
|
|
50
|
+
label?: string;
|
|
51
|
+
onContentReady?: () => void;
|
|
52
|
+
}
|
|
53
|
+
export declare const RenderNameField: ({ requestMoreInfo, validationItems, setFormData, formData, formDataOrig, fieldsReadOnly }: RenderFieldProps) => import("react/jsx-runtime").JSX.Element;
|
|
54
|
+
export declare const RenderDescriptionField: ({ validationItems, setFormData, formData, formDataOrig, fieldsReadOnly }: RenderFieldProps) => import("react/jsx-runtime").JSX.Element;
|
|
55
|
+
export declare const RenderPriorityField: ({ formData, formDataOrig, fieldsReadOnly, onPriorityValueChange }: RenderPriorityFieldProps) => import("react/jsx-runtime").JSX.Element;
|
|
56
|
+
export declare const RenderStartDateField: ({ label, validationItems, setFormData, formData, formDataOrig, fieldsReadOnly, onContentReady }: RenderDateFieldProps) => import("react/jsx-runtime").JSX.Element;
|
|
57
|
+
export declare const RenderEndDateField: ({ label, validationItems, setFormData, formData, formDataOrig, fieldsReadOnly, onContentReady }: RenderDateFieldProps) => import("react/jsx-runtime").JSX.Element;
|
|
58
|
+
export declare const RenderRemindDateField: ({ validationItems, setFormData, formData, formDataOrig, fieldsReadOnly }: RenderFieldProps) => import("react/jsx-runtime").JSX.Element;
|
|
59
|
+
interface RenderTaskFormStateFieldProps {
|
|
60
|
+
formDataOrig: TaskDescriptor | undefined;
|
|
61
|
+
formData: TaskDescriptor | undefined;
|
|
62
|
+
formMode: FormModes;
|
|
63
|
+
gotoPDGExtendedLabelClickCallback: () => void;
|
|
64
|
+
handleShowChangeStateForm: (value: boolean) => void;
|
|
65
|
+
onSavedCallback?: (task: TaskDescriptor) => void;
|
|
66
|
+
}
|
|
67
|
+
export declare const RenderTaskFormStateField: (props: RenderTaskFormStateFieldProps) => JSX.Element | null;
|
|
68
|
+
interface TMChangeStateFormProps {
|
|
69
|
+
formData: TaskDescriptor;
|
|
70
|
+
formDataOrig?: TaskDescriptor;
|
|
71
|
+
handleShowChangeStateForm: (value: boolean) => void;
|
|
72
|
+
setFormData: React.Dispatch<React.SetStateAction<TaskDescriptor | undefined>>;
|
|
73
|
+
}
|
|
74
|
+
export declare const TMChangeStateForm: (props: TMChangeStateFormProps) => import("react/jsx-runtime").JSX.Element;
|
|
75
|
+
type TaskRole = "personal" | "sender" | "receiver";
|
|
76
|
+
type StatusTransitionMap = {
|
|
77
|
+
[key in Task_States]?: Task_States[];
|
|
78
|
+
};
|
|
79
|
+
export declare const STATUS_TRANSITIONS: Record<TaskRole, StatusTransitionMap>;
|
|
80
|
+
export {};
|