@topconsultnpm/sdkui-react 6.20.0-dev2.9 → 6.20.0-dev3.1

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 (84) 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/base/Styled.d.ts +4 -1
  4. package/lib/components/base/Styled.js +11 -3
  5. package/lib/components/base/TMTreeView.d.ts +3 -1
  6. package/lib/components/base/TMTreeView.js +64 -21
  7. package/lib/components/choosers/TMDataListItemEditor.d.ts +11 -0
  8. package/lib/components/choosers/TMDataListItemEditor.js +130 -0
  9. package/lib/components/choosers/TMDataListItemFields.d.ts +11 -0
  10. package/lib/components/choosers/TMDataListItemFields.js +61 -0
  11. package/lib/components/choosers/TMDataListItemPicker.d.ts +1 -0
  12. package/lib/components/choosers/TMDataListItemPicker.js +178 -18
  13. package/lib/components/choosers/TMImageIDChooser.d.ts +16 -0
  14. package/lib/components/choosers/TMImageIDChooser.js +53 -0
  15. package/lib/components/choosers/TMMetadataChooser.js +1 -1
  16. package/lib/components/editors/TMDateBox.js +1 -1
  17. package/lib/components/editors/TMHtmlEditor.js +1 -1
  18. package/lib/components/editors/TMLocalizedTextBox.d.ts +1 -0
  19. package/lib/components/editors/TMLocalizedTextBox.js +3 -3
  20. package/lib/components/editors/TMTextBox.js +9 -10
  21. package/lib/components/features/archive/TMArchive.d.ts +2 -1
  22. package/lib/components/features/archive/TMArchive.js +31 -44
  23. package/lib/components/features/blog/TMBlogCommentForm.d.ts +3 -0
  24. package/lib/components/features/blog/TMBlogCommentForm.js +42 -36
  25. package/lib/components/features/documents/TMDcmtForm.d.ts +3 -1
  26. package/lib/components/features/documents/TMDcmtForm.js +197 -53
  27. package/lib/components/features/documents/TMDcmtTasks.d.ts +3 -1
  28. package/lib/components/features/documents/TMDcmtTasks.js +2 -2
  29. package/lib/components/features/documents/TMFileUploader.d.ts +4 -0
  30. package/lib/components/features/documents/TMFileUploader.js +23 -6
  31. package/lib/components/features/documents/TMMasterDetailDcmts.js +68 -84
  32. package/lib/components/features/documents/TMRelationViewer.d.ts +7 -1
  33. package/lib/components/features/documents/TMRelationViewer.js +395 -78
  34. package/lib/components/features/search/TMSearchResult.d.ts +2 -0
  35. package/lib/components/features/search/TMSearchResult.js +82 -79
  36. package/lib/components/features/search/TMSearchResultsMenuItems.js +2 -2
  37. package/lib/components/features/tasks/TMTaskForm.d.ts +1 -0
  38. package/lib/components/features/tasks/TMTaskForm.js +61 -193
  39. package/lib/components/features/tasks/TMTaskFormUtils.d.ts +80 -0
  40. package/lib/components/features/tasks/TMTaskFormUtils.js +559 -0
  41. package/lib/components/features/tasks/TMTasksUtils.d.ts +3 -1
  42. package/lib/components/features/tasks/TMTasksUtils.js +46 -16
  43. package/lib/components/features/tasks/TMTasksUtilsView.d.ts +0 -7
  44. package/lib/components/features/tasks/TMTasksUtilsView.js +7 -14
  45. package/lib/components/features/tasks/TMTasksView.js +5 -3
  46. package/lib/components/features/workflow/TMWorkflowPopup.d.ts +20 -3
  47. package/lib/components/features/workflow/TMWorkflowPopup.js +14 -92
  48. package/lib/components/features/workflow/diagram/ConnectionComponent.d.ts +1 -0
  49. package/lib/components/features/workflow/diagram/ConnectionComponent.js +6 -2
  50. package/lib/components/features/workflow/diagram/DiagramItemForm.js +1 -1
  51. package/lib/components/features/workflow/diagram/WFDiagram.js +75 -5
  52. package/lib/components/forms/Login/TMLoginForm.js +1 -1
  53. package/lib/components/forms/TMSaveForm.js +61 -13
  54. package/lib/components/grids/TMBlogsPost.js +8 -8
  55. package/lib/components/grids/TMBlogsPostUtils.js +2 -2
  56. package/lib/components/index.d.ts +2 -0
  57. package/lib/components/index.js +2 -0
  58. package/lib/components/pages/TMPage.js +4 -0
  59. package/lib/components/query/TMQueryEditor.d.ts +1 -0
  60. package/lib/components/query/TMQueryEditor.js +2 -2
  61. package/lib/helper/Enum_Localizator.js +5 -0
  62. package/lib/helper/GlobalStyles.js +3 -0
  63. package/lib/helper/SDKUI_Globals.d.ts +8 -0
  64. package/lib/helper/SDKUI_Globals.js +12 -0
  65. package/lib/helper/SDKUI_Localizator.d.ts +19 -3
  66. package/lib/helper/SDKUI_Localizator.js +182 -22
  67. package/lib/helper/TMIcons.d.ts +2 -1
  68. package/lib/helper/TMIcons.js +4 -1
  69. package/lib/helper/TMUtils.d.ts +5 -0
  70. package/lib/helper/TMUtils.js +10 -5
  71. package/lib/helper/helpers.d.ts +6 -2
  72. package/lib/helper/helpers.js +24 -8
  73. package/lib/helper/index.d.ts +1 -0
  74. package/lib/helper/index.js +1 -0
  75. package/lib/helper/queryHelper.js +1 -1
  76. package/lib/hooks/useBetaFeatures.d.ts +1 -0
  77. package/lib/hooks/useBetaFeatures.js +41 -0
  78. package/lib/hooks/useDcmtOperations.js +14 -2
  79. package/lib/hooks/useRelatedDocuments.js +34 -11
  80. package/lib/index.d.ts +1 -0
  81. package/lib/index.js +1 -0
  82. package/lib/services/platform_services.d.ts +1 -1
  83. package/lib/services/platform_services.js +4 -0
  84. package/package.json +2 -2
@@ -1,70 +1,24 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useEffect, useMemo, useRef, useState } from 'react';
3
- import { ObjectClasses, TaskDescriptor, Priorities, PdGs, SDK_Globals, UserListCacheService, SDK_Localizator, Task_States } from '@topconsultnpm/sdk-ts';
4
- import { areDifferentIDs, formatDate, getOriginLabel, getPriorityLocalizatorValue, getPriorityLocalizatorValues, getStatusLocalizatorValues, gotoPDGExtendedLabel, taskValidatorAsync } from './TMTasksUtils';
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, TMConditionalWrapper, getPdgsIconMap, DateDisplayTypes } from '../../../helper';
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 styled from 'styled-components';
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 mobileBreakpoint = 768;
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 (isModal)
149
- setIsMobile(true);
150
- }, [isModal]);
151
- useEffect(() => {
152
- if (formDataOrig && formMode === FormModes.Update) {
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: isTaskAssignedByDifferentUser,
156
- description: isTaskAssignedByDifferentUser,
157
- fromID: isTaskAssignedByDifferentUser,
158
- assignedTO: isTaskAssignedByDifferentUser,
112
+ name: taskRole === 'receiver',
113
+ description: taskRole === 'receiver',
114
+ fromID: taskRole === 'receiver',
115
+ assignedTO: taskRole === 'receiver',
159
116
  status: false,
160
- priority: isTaskAssignedByDifferentUser,
161
- startDate: isTaskAssignedByDifferentUser,
162
- endDate: isTaskAssignedByDifferentUser,
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
- else if (formDataOrig && formMode === FormModes.Create && taskContext?.dossier && taskContext?.dossier?.origin === 'DossierAction' && currentTask) {
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 (!isModal) {
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
- setFormData({ ...formData ?? {}, state: e?.target?.value });
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: _jsx(TMSaveForm, { width: width, height: height, id: id, title: title, isModal: isModal, formMode: formMode, onSaveAsync: saveDataAsync, onClose: onCloseCallback, 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: "calc(100% - 35px)", children: _jsx("div", { style: { marginRight: "5px" }, children: _jsxs(TMLayoutContainer, { direction: 'vertical', gap: 2, children: [(formMode === FormModes.Update && areDifferentIDs(formDataOrig?.fromID, SDK_Globals.tmSession?.SessionDescr?.userID)) && _jsx(TMConditionalWrapper, { condition: !isMobile, wrapper: children => _jsx("div", { style: { display: 'flex', flexDirection: 'row', width: '100%', gap: 10 }, children: children }), children: _jsxs("div", { style: { width: '100%', display: 'flex', alignItems: 'center', color: "#E29000" }, children: [_jsx("i", { className: "dx-icon-info", style: { fontSize: 20 } }), "\u00A0", _jsx("span", { children: SDKUI_Localizator.TaskAssignedMessage.replaceParams(formDataOrig?.fromName ?? '') })] }) }), taskContext?.workItem === undefined && (!areDifferentIDs(formData?.fromID, SDK_Globals.tmSession?.SessionDescr?.userID)
353
- && !areDifferentIDs(formData?.toID, SDK_Globals.tmSession?.SessionDescr?.userID))
354
- && _jsx(TMConditionalWrapper, { condition: !isMobile, wrapper: children => _jsx("div", { style: { display: 'flex', flexDirection: 'row', width: '100%', gap: 10 }, children: children }), children: _jsxs("div", { style: { width: '100%', display: 'flex', alignItems: 'center', color: "#2559A5" }, children: [_jsx("i", { className: "dx-icon-info", style: { fontSize: 20 } }), "\u00A0", _jsx("span", { children: SDKUI_Localizator.PersonalTaskAssignmentMessage })] }) }), (!areDifferentIDs(formData?.fromID, SDK_Globals.tmSession?.SessionDescr?.userID)
355
- && areDifferentIDs(formData?.toID, SDK_Globals.tmSession?.SessionDescr?.userID))
356
- && _jsx(TMConditionalWrapper, { condition: !isMobile, wrapper: children => _jsx("div", { style: { display: 'flex', flexDirection: 'row', width: '100%', gap: 10 }, children: children }), children: _jsxs("div", { style: { width: '100%', display: 'flex', alignItems: 'center', color: "#2559A5" }, children: [_jsx("i", { className: "dx-icon-info", style: { fontSize: 20 } }), "\u00A0", _jsx("span", { children: SDKUI_Localizator.TaskAssignedToUserMessage.replaceParams(users.find(user => user.id === formData?.toID)?.name ?? '-') })] }) }), renderContextBlock({
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
- : formMode === FormModes.Update && _jsxs(_Fragment, { children: [areDifferentIDs(formDataOrig?.fromID, SDK_Globals.tmSession?.SessionDescr?.userID) && _jsx("div", { style: { width: isMobile ? '100%' : '50%' }, children: _jsx(TMTextBox, { label: SDKUI_Localizator.AssignedBy, value: formData?.fromName ?? '', readOnly: true }) }), areDifferentIDs(formDataOrig?.toID, SDK_Globals.tmSession?.SessionDescr?.userID) && _jsx("div", { style: { width: isMobile ? '100%' : '50%' }, children: _jsx(TMTextBox, { label: SDKUI_Localizator.AssignedTo_Female, value: formData?.toName ?? '', readOnly: true }) })] }) }), _jsx(TMConditionalWrapper, { condition: !isMobile, wrapper: children => _jsx("div", { style: { display: 'flex', flexDirection: 'row', width: '100%', gap: 10 }, children: children }), children: _jsxs(_Fragment, { children: [_jsx("div", { style: { width: isMobile ? '100%' : '50%' }, children: _jsx(TMDropDown, { label: SDKUI_Localizator.Status, value: formData?.state, dataSource: getStatusLocalizatorValues(), isModifiedWhen: formData?.state !== formDataOrig?.state, onValueChanged: onStatusValueChange, readOnly: fieldsReadOnly.status }) }), _jsx("div", { style: { width: isMobile ? '100%' : '50%' }, children: !fieldsReadOnly.priority ? _jsx(TMDropDown, { label: SDKUI_Localizator.Priority, value: formData?.priority, dataSource: getPriorityLocalizatorValues(), isModifiedWhen: formData?.priority !== formDataOrig?.priority, onValueChanged: onPriorityValueChange })
437
- : _jsx(TMTextBox, { label: SDKUI_Localizator.Priority, value: getPriorityLocalizatorValue(formData?.priority ?? Priorities.Low), readOnly: true }) })] }) }), _jsx(TMConditionalWrapper, { condition: !isMobile, wrapper: children => _jsx("div", { style: { display: 'flex', flexDirection: 'row', width: '100%', gap: 10 }, children: children }), children: _jsxs(_Fragment, { children: [_jsx("div", { style: { width: isMobile ? '100%' : '50%', marginTop: 10 }, children: !fieldsReadOnly.startDate ? _jsx(TMDateBox, { id: "start-date", resetTimeToZeroOnKeyPress: false, label: SDKUI_Localizator.StartDate, dateDisplayType: DateDisplayTypes.DateTime, value: formData?.startTime, isModifiedWhen: formData?.startTime !== formDataOrig?.startTime, validationItems: validationItems?.filter(o => o.PropertyName === SDKUI_Localizator.ErrorStartEndDate), onContentReady: handleStartTimeContentReady, onValueChange: (value) => { setFormData({ ...formData ?? {}, startTime: value }); }, showClearButton: true }) : _jsx(TMTextBox, { label: SDKUI_Localizator.StartDate, value: formData?.startTime ? formatDate(formData?.startTime) : '', readOnly: true }) }), _jsx("div", { style: { width: isMobile ? '100%' : '50%', marginTop: 10 }, children: !fieldsReadOnly.startDate ? _jsx(TMDateBox, { id: "end-date", resetTimeToZeroOnKeyPress: false, label: SDKUI_Localizator.Expiration, dateDisplayType: DateDisplayTypes.DateTime, value: formData?.endTime, isModifiedWhen: formData?.endTime !== formDataOrig?.endTime, validationItems: validationItems?.filter(o => o.PropertyName === SDKUI_Localizator.ErrorStartEndDate || o.PropertyName === SDKUI_Localizator.ErrorEndRemDate), onContentReady: handleEndTimeContentReady, onValueChange: (value) => { setFormData({ ...formData ?? {}, endTime: value }); }, showClearButton: true, readOnly: fieldsReadOnly.endDate }) : _jsx(TMTextBox, { label: SDKUI_Localizator.Expiration, value: formData?.endTime ? formatDate(formData?.endTime) : '', readOnly: true }) })] }) }), _jsx(TMConditionalWrapper, { condition: !isMobile, wrapper: children => _jsx("div", { style: { display: 'flex', flexDirection: 'row', width: '100%', gap: 3 }, children: children }), children: _jsx("div", { style: { width: isMobile ? '100%' : '50%', marginTop: 10 }, children: _jsx(TMDateBox, { id: "alert-time", resetTimeToZeroOnKeyPress: false, label: SDKUI_Localizator.Reminder, dateDisplayType: DateDisplayTypes.DateTime, value: formData?.remTime ?? undefined, isModifiedWhen: formData?.remTime !== formDataOrig?.remTime, validationItems: validationItems?.filter(o => o.PropertyName === SDKUI_Localizator.ErrorEndRemDate), onValueChange: (value) => { setFormData({ ...formData ?? {}, remTime: value }); }, showClearButton: true, readOnly: fieldsReadOnly.remTime }) }) }), (formData?.state && [Task_States.Completed, Task_States.Waiting, Task_States.Deferred].includes(formData?.state) ||
438
- (formData?.response ?? "") !== "") && _jsx(TMConditionalWrapper, { condition: !isMobile, wrapper: children => _jsx("div", { style: { display: 'flex', flexDirection: 'row', width: '100%', gap: 3 }, children: children }), children: _jsx("div", { style: { width: isMobile ? '100%' : '50%', marginTop: 10 }, children: _jsxs(ResponseCommentWrapper, { children: [_jsx(ResponseCommentTextArea, { id: "responseId", name: "response", "$isValid": true, value: formData?.response ?? '', onChange: onAnswerChange, "$isModifiedWhen": formData?.response !== formDataOrig?.response, disabled: (formData?.response ?? "") !== "" &&
439
- (formData?.state && ![Task_States.Completed, Task_States.Waiting, Task_States.Deferred].includes(formData?.state)) }), _jsxs(ResponseCommentLabel, { htmlFor: "responseId", children: [SDKUI_Localizator.Answer, _jsxs(TMTooltip, { content: SDKUI_Localizator.AnswerTooltip, children: [" ", _jsx("i", { className: 'dx-icon-info' }), " "] })] }), _jsx(ResponseCommentCharacterCounter, { children: `${500 - (formData?.response ?? '').length} ${SDKUI_Localizator.CharactersRemaining}` })] }) }) })] }) }) }), (showDcmtForm && formData?.iD1 && formData?.iD2) &&
440
- _jsx(TMDcmtForm, { titleModal: formData.iD1Name ?? '-', isModal: true, TID: formData.iD1, DID: formData.iD2, allowButtonsRefs: true, moreInfoTasks: [formData], 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 })] }) }) }));
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 {};