@topconsultnpm/sdkui-react 6.20.0-dev2.5 → 6.20.0-dev2.50

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 (67) hide show
  1. package/lib/components/base/Styled.d.ts +1 -0
  2. package/lib/components/base/Styled.js +10 -2
  3. package/lib/components/base/TMTreeView.d.ts +3 -1
  4. package/lib/components/base/TMTreeView.js +63 -20
  5. package/lib/components/choosers/TMDataListItemEditor.d.ts +11 -0
  6. package/lib/components/choosers/TMDataListItemEditor.js +130 -0
  7. package/lib/components/choosers/TMDataListItemFields.d.ts +11 -0
  8. package/lib/components/choosers/TMDataListItemFields.js +61 -0
  9. package/lib/components/choosers/TMDataListItemPicker.d.ts +1 -0
  10. package/lib/components/choosers/TMDataListItemPicker.js +178 -18
  11. package/lib/components/choosers/TMDynDataListItemChooser.js +11 -6
  12. package/lib/components/choosers/TMImageIDChooser.d.ts +16 -0
  13. package/lib/components/choosers/TMImageIDChooser.js +53 -0
  14. package/lib/components/choosers/TMMetadataChooser.js +1 -1
  15. package/lib/components/editors/TMLocalizedTextBox.d.ts +1 -0
  16. package/lib/components/editors/TMLocalizedTextBox.js +3 -3
  17. package/lib/components/editors/TMMetadataValues.js +3 -1
  18. package/lib/components/editors/TMTextBox.js +8 -9
  19. package/lib/components/features/archive/TMArchive.js +29 -42
  20. package/lib/components/features/documents/TMDcmtForm.js +165 -42
  21. package/lib/components/features/documents/TMDcmtPreview.js +2 -1
  22. package/lib/components/features/documents/TMMasterDetailDcmts.js +67 -6
  23. package/lib/components/features/documents/TMRelationViewer.d.ts +7 -1
  24. package/lib/components/features/documents/TMRelationViewer.js +389 -76
  25. package/lib/components/features/search/TMSearchResult.d.ts +1 -0
  26. package/lib/components/features/search/TMSearchResult.js +44 -82
  27. package/lib/components/features/search/TMSearchResultsMenuItems.js +2 -2
  28. package/lib/components/features/tasks/TMTaskForm.js +35 -187
  29. package/lib/components/features/tasks/TMTaskFormUtils.d.ts +74 -0
  30. package/lib/components/features/tasks/TMTaskFormUtils.js +538 -0
  31. package/lib/components/features/tasks/TMTasksUtils.d.ts +2 -0
  32. package/lib/components/features/tasks/TMTasksUtils.js +38 -7
  33. package/lib/components/features/tasks/TMTasksUtilsView.d.ts +0 -7
  34. package/lib/components/features/tasks/TMTasksUtilsView.js +7 -14
  35. package/lib/components/features/tasks/TMTasksView.js +2 -2
  36. package/lib/components/features/workflow/TMWorkflowPopup.d.ts +2 -1
  37. package/lib/components/features/workflow/TMWorkflowPopup.js +2 -1
  38. package/lib/components/features/workflow/diagram/DiagramItemForm.js +1 -1
  39. package/lib/components/forms/Login/TMLoginForm.js +1 -1
  40. package/lib/components/forms/TMSaveForm.js +61 -13
  41. package/lib/components/grids/TMBlogsPost.js +2 -2
  42. package/lib/components/index.d.ts +2 -0
  43. package/lib/components/index.js +2 -0
  44. package/lib/components/layout/panelManager/TMPanelManagerContainer.js +3 -2
  45. package/lib/components/pages/TMPage.js +4 -0
  46. package/lib/components/query/TMQueryEditor.d.ts +1 -0
  47. package/lib/components/query/TMQueryEditor.js +2 -2
  48. package/lib/helper/Enum_Localizator.js +5 -0
  49. package/lib/helper/GlobalStyles.js +3 -0
  50. package/lib/helper/SDKUI_Globals.d.ts +4 -0
  51. package/lib/helper/SDKUI_Globals.js +6 -0
  52. package/lib/helper/SDKUI_Localizator.d.ts +11 -2
  53. package/lib/helper/SDKUI_Localizator.js +102 -12
  54. package/lib/helper/TMUtils.d.ts +18 -0
  55. package/lib/helper/TMUtils.js +58 -0
  56. package/lib/helper/helpers.d.ts +6 -2
  57. package/lib/helper/helpers.js +23 -8
  58. package/lib/helper/index.d.ts +1 -0
  59. package/lib/helper/index.js +1 -0
  60. package/lib/helper/queryHelper.js +1 -1
  61. package/lib/hooks/useBetaFeatures.d.ts +1 -0
  62. package/lib/hooks/useBetaFeatures.js +41 -0
  63. package/lib/hooks/useDcmtOperations.js +14 -2
  64. package/lib/hooks/useRelatedDocuments.js +34 -11
  65. package/lib/index.d.ts +1 -0
  66. package/lib/index.js +1 -0
  67. package/package.json +11 -11
@@ -1,64 +1,18 @@
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();
@@ -106,13 +60,8 @@ const TMTaskForm = (props) => {
106
60
  };
107
61
  const { formData, setFormData, formDataOrig, validationItems, exception, saveDataAsync } = useSaveForm(formMode, id, sfo, validator, onSaved, onStatusChanged, customizeFormData);
108
62
  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
63
  const [showDcmtForm, setShowDcmtForm] = useState(false);
115
- const mobileBreakpoint = 768;
64
+ const [showChangeStateForm, setShowChangeStateForm] = useState(false);
116
65
  const [users, setUsers] = useState([]); // State to store the users
117
66
  // Initial state for the fields' editability (readonly)
118
67
  const [fieldsReadOnly, setFieldsReadOnly] = useState({
@@ -144,22 +93,18 @@ const TMTaskForm = (props) => {
144
93
  };
145
94
  fetchUsers();
146
95
  }, []);
147
- useEffect(() => {
148
- if (isModal)
149
- setIsMobile(true);
150
- }, [isModal]);
151
96
  useEffect(() => {
152
97
  if (formDataOrig && formMode === FormModes.Update) {
153
- const isTaskAssignedByDifferentUser = areDifferentIDs(formDataOrig.fromID, SDK_Globals.tmSession?.SessionDescr?.userID);
98
+ const taskRole = getCurrentUserTaskRole(formDataOrig);
154
99
  setFieldsReadOnly({
155
- name: isTaskAssignedByDifferentUser,
156
- description: isTaskAssignedByDifferentUser,
157
- fromID: isTaskAssignedByDifferentUser,
158
- assignedTO: isTaskAssignedByDifferentUser,
100
+ name: taskRole === 'receiver',
101
+ description: taskRole === 'receiver',
102
+ fromID: taskRole === 'receiver',
103
+ assignedTO: taskRole === 'receiver',
159
104
  status: false,
160
- priority: isTaskAssignedByDifferentUser,
161
- startDate: isTaskAssignedByDifferentUser,
162
- endDate: isTaskAssignedByDifferentUser,
105
+ priority: taskRole === 'receiver',
106
+ startDate: taskRole === 'receiver',
107
+ endDate: taskRole === 'receiver',
163
108
  remTime: false,
164
109
  response: false
165
110
  });
@@ -183,44 +128,12 @@ const TMTaskForm = (props) => {
183
128
  });
184
129
  }
185
130
  }, [formDataOrig, formMode]);
186
- 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)
212
- return;
213
- setFormData({ ...formData ?? {}, state: e?.target?.value });
214
- };
215
131
  // Function to handle changes in the priority value of a TM Drop Down
216
132
  const onPriorityValueChange = (e) => {
217
133
  if (!e?.target?.value)
218
134
  return;
219
135
  setFormData({ ...formData ?? {}, priority: e?.target?.value });
220
136
  };
221
- const onAnswerChange = (e) => {
222
- setFormData({ ...formData ?? {}, response: e.target.value ?? '' });
223
- };
224
137
  // Function to handle the undo action
225
138
  const onUndoCallback = () => {
226
139
  setFormData(formDataOrig);
@@ -330,6 +243,9 @@ const TMTaskForm = (props) => {
330
243
  await editTaskCallback(task);
331
244
  onClose?.();
332
245
  };
246
+ const handleShowChangeStateForm = (value) => {
247
+ setShowChangeStateForm(value);
248
+ };
333
249
  const handleNavigateToReference = (ref) => {
334
250
  switch (ref.objClass) {
335
251
  case ObjectClasses.Dossier:
@@ -349,94 +265,26 @@ const TMTaskForm = (props) => {
349
265
  console.warn(`Unhandled object type: ${ref.objClass}`);
350
266
  }
351
267
  };
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) => {
268
+ 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.None) && _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) => {
269
+ if (newValue === undefined)
270
+ return;
271
+ setFormData({ ...formData ?? {}, toID: newValue[0] });
272
+ } }), _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 })] }), (formMode === FormModes.Update || formMode === FormModes.Duplicate) && _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
273
  if (newValue === undefined)
433
274
  return;
434
275
  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 })] }) }) }));
276
+ } }), _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: {
277
+ position: 'absolute',
278
+ bottom: 0,
279
+ left: 0,
280
+ right: 0,
281
+ padding: '8px 12px',
282
+ backgroundColor: '#fff',
283
+ borderTop: '1px solid #e6e6e6',
284
+ display: 'flex',
285
+ justifyContent: 'flex-end',
286
+ alignItems: 'center'
287
+ }, children: _jsx(TaskFormAssignmentNoticeBadge, { task: formData, users: users }) })), (showDcmtForm && formData?.iD1 && formData?.iD2) &&
288
+ _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
289
  };
442
290
  export default TMTaskForm;
@@ -0,0 +1,74 @@
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
+ }
10
+ export declare const TaskFormAssignmentNoticeBadge: (props: TaskFormAssignmentNoticeSectionProps) => import("react/jsx-runtime").JSX.Element | null;
11
+ interface RenderContextBlockParams {
12
+ condition: boolean;
13
+ pdg: PdGs;
14
+ label: string | undefined;
15
+ }
16
+ export declare const RenderAttachmentBlock: ({ condition, pdg, label }: RenderContextBlockParams) => JSX.Element | null;
17
+ interface TaskFormContextualAttachmentsProps {
18
+ taskContext: TaskContext | undefined;
19
+ }
20
+ export declare const TaskFormContextualAttachments: ({ taskContext }: TaskFormContextualAttachmentsProps) => JSX.Element | null;
21
+ interface TaskFormAssignedToProps {
22
+ formMode: FormModes;
23
+ formData: TaskDescriptor | undefined;
24
+ formDataOrig: TaskDescriptor | undefined;
25
+ taskContext: TaskContext | undefined;
26
+ validationItems: Array<ValidationItem>;
27
+ fieldsReadOnly: IFieldsEditability;
28
+ usersList?: Array<UserDescriptor>;
29
+ onValueChanged: (newValue: Array<number> | undefined) => void;
30
+ }
31
+ export declare const TaskAssigneeField: (props: TaskFormAssignedToProps) => import("react/jsx-runtime").JSX.Element;
32
+ interface RenderFieldBaseProps {
33
+ fieldsReadOnly: IFieldsEditability;
34
+ formDataOrig?: TaskDescriptor;
35
+ formData?: TaskDescriptor;
36
+ }
37
+ interface RenderFieldProps extends RenderFieldBaseProps {
38
+ validationItems?: Array<ValidationItem>;
39
+ setFormData: React.Dispatch<React.SetStateAction<TaskDescriptor | undefined>>;
40
+ }
41
+ interface RenderPriorityFieldProps extends RenderFieldBaseProps {
42
+ onPriorityValueChange: (e: React.ChangeEvent<HTMLSelectElement>) => void;
43
+ }
44
+ interface RenderDateFieldProps extends RenderFieldProps {
45
+ onContentReady?: () => void;
46
+ }
47
+ export declare const RenderNameField: ({ validationItems, setFormData, formData, formDataOrig, fieldsReadOnly }: RenderFieldProps) => import("react/jsx-runtime").JSX.Element;
48
+ export declare const RenderDescriptionField: ({ validationItems, setFormData, formData, formDataOrig, fieldsReadOnly }: RenderFieldProps) => import("react/jsx-runtime").JSX.Element;
49
+ export declare const RenderPriorityField: ({ formData, formDataOrig, fieldsReadOnly, onPriorityValueChange }: RenderPriorityFieldProps) => import("react/jsx-runtime").JSX.Element;
50
+ export declare const RenderStartDateField: ({ validationItems, setFormData, formData, formDataOrig, fieldsReadOnly, onContentReady }: RenderDateFieldProps) => import("react/jsx-runtime").JSX.Element;
51
+ export declare const RenderEndDateField: ({ validationItems, setFormData, formData, formDataOrig, fieldsReadOnly, onContentReady }: RenderDateFieldProps) => import("react/jsx-runtime").JSX.Element;
52
+ export declare const RenderRemindDateField: ({ validationItems, setFormData, formData, formDataOrig, fieldsReadOnly }: RenderFieldProps) => import("react/jsx-runtime").JSX.Element;
53
+ interface RenderTaskFormStateFieldProps {
54
+ formDataOrig: TaskDescriptor | undefined;
55
+ formData: TaskDescriptor | undefined;
56
+ formMode: FormModes;
57
+ gotoPDGExtendedLabelClickCallback: () => void;
58
+ handleShowChangeStateForm: (value: boolean) => void;
59
+ onSavedCallback?: (task: TaskDescriptor) => void;
60
+ }
61
+ export declare const RenderTaskFormStateField: (props: RenderTaskFormStateFieldProps) => JSX.Element | null;
62
+ interface TMChangeStateFormProps {
63
+ formData: TaskDescriptor;
64
+ formDataOrig?: TaskDescriptor;
65
+ handleShowChangeStateForm: (value: boolean) => void;
66
+ setFormData: React.Dispatch<React.SetStateAction<TaskDescriptor | undefined>>;
67
+ }
68
+ export declare const TMChangeStateForm: (props: TMChangeStateFormProps) => import("react/jsx-runtime").JSX.Element;
69
+ type TaskRole = "personal" | "sender" | "receiver";
70
+ type StatusTransitionMap = {
71
+ [key in Task_States]?: Task_States[];
72
+ };
73
+ export declare const STATUS_TRANSITIONS: Record<TaskRole, StatusTransitionMap>;
74
+ export {};