@topconsultnpm/sdkui-react 6.20.0-dev2.6 → 6.20.0-dev2.60

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 (82) 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/TMDynDataListItemChooser.js +11 -6
  14. package/lib/components/choosers/TMImageIDChooser.d.ts +16 -0
  15. package/lib/components/choosers/TMImageIDChooser.js +53 -0
  16. package/lib/components/choosers/TMMetadataChooser.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/TMMetadataValues.js +3 -1
  21. package/lib/components/editors/TMTextBox.js +8 -9
  22. package/lib/components/features/archive/TMArchive.js +29 -42
  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.js +193 -45
  26. package/lib/components/features/documents/TMDcmtPreview.js +2 -1
  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.js +5 -2
  30. package/lib/components/features/documents/TMMasterDetailDcmts.js +68 -84
  31. package/lib/components/features/documents/TMRelationViewer.d.ts +7 -1
  32. package/lib/components/features/documents/TMRelationViewer.js +395 -78
  33. package/lib/components/features/search/TMSearchResult.d.ts +1 -0
  34. package/lib/components/features/search/TMSearchResult.js +46 -77
  35. package/lib/components/features/search/TMSearchResultsMenuItems.js +2 -2
  36. package/lib/components/features/tasks/TMTaskForm.d.ts +1 -0
  37. package/lib/components/features/tasks/TMTaskForm.js +61 -193
  38. package/lib/components/features/tasks/TMTaskFormUtils.d.ts +80 -0
  39. package/lib/components/features/tasks/TMTaskFormUtils.js +559 -0
  40. package/lib/components/features/tasks/TMTasksUtils.d.ts +3 -1
  41. package/lib/components/features/tasks/TMTasksUtils.js +45 -15
  42. package/lib/components/features/tasks/TMTasksUtilsView.d.ts +0 -7
  43. package/lib/components/features/tasks/TMTasksUtilsView.js +7 -14
  44. package/lib/components/features/tasks/TMTasksView.js +5 -3
  45. package/lib/components/features/workflow/TMWorkflowPopup.d.ts +20 -3
  46. package/lib/components/features/workflow/TMWorkflowPopup.js +14 -92
  47. package/lib/components/features/workflow/diagram/ConnectionComponent.d.ts +1 -0
  48. package/lib/components/features/workflow/diagram/ConnectionComponent.js +6 -2
  49. package/lib/components/features/workflow/diagram/DiagramItemForm.js +1 -1
  50. package/lib/components/features/workflow/diagram/WFDiagram.js +75 -5
  51. package/lib/components/forms/Login/TMLoginForm.js +1 -1
  52. package/lib/components/forms/TMSaveForm.js +61 -13
  53. package/lib/components/grids/TMBlogsPost.js +8 -8
  54. package/lib/components/grids/TMBlogsPostUtils.js +2 -2
  55. package/lib/components/index.d.ts +2 -0
  56. package/lib/components/index.js +2 -0
  57. package/lib/components/layout/panelManager/TMPanelManagerContainer.js +3 -2
  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 +17 -3
  66. package/lib/helper/SDKUI_Localizator.js +162 -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 +23 -0
  70. package/lib/helper/TMUtils.js +66 -3
  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/package.json +11 -11
@@ -0,0 +1,559 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import React, { useCallback, useEffect, useMemo, useState } from "react";
3
+ import { PdGs, Priorities, SDK_Globals, Task_States } from "@topconsultnpm/sdk-ts";
4
+ import { FormModes } from "../../../ts";
5
+ import { calcResponsiveSizes, DateDisplayTypes, getPdgsIconMap, IconSave, PDGS_COLORS, SDKUI_Localizator, TASK_MORE_INFO_PREFIX_NAME } from "../../../helper";
6
+ import { areDifferentIDs, formatDate, getOriginLabel, getPriorityLocalizatorValue, getPriorityLocalizatorValues, getStatusLocalizatorValue } from "./TMTasksUtils";
7
+ import TMTooltip from "../../base/TMTooltip";
8
+ import TMTextBox from "../../editors/TMTextBox";
9
+ import TMUserChooser from "../../choosers/TMUserChooser";
10
+ import styled from "styled-components";
11
+ import { TMColors } from "../../../utils/theme";
12
+ import TMTextArea from "../../editors/TMTextArea";
13
+ import TMDropDown from "../../editors/TMDropDown";
14
+ import TMDateBox from "../../editors/TMDateBox";
15
+ import { DeviceType, useDeviceType } from "../../base/TMDeviceProvider";
16
+ import TMModal from "../../base/TMModal";
17
+ import TMButton from "../../base/TMButton";
18
+ import { ButtonNames, TMExceptionBoxManager, TMMessageBoxManager } from "../../base/TMPopUp";
19
+ import TMSpinner from "../../base/TMSpinner";
20
+ import { taskStateIconMap } from "./TMTasksUtilsView";
21
+ import TMHtmlContentDisplay from "../../editors/TMHtmlContentDisplay";
22
+ export const getCurrentUserTaskRole = (task) => {
23
+ if (!task)
24
+ return "personal";
25
+ // ID dell'utente a cui il task è assegnato
26
+ const taskToId = task.toID;
27
+ // ID dell'utente che ha creato/assegnato il task
28
+ const taskFromId = task.fromID;
29
+ // ID dell'utente attualmente loggato nella sessione
30
+ const userSessionId = SDK_Globals.tmSession?.SessionDescr?.userID;
31
+ // TRUE se il task è stato assegnato da un utente diverso da quello corrente
32
+ const isAssignedByOtherUser = areDifferentIDs(taskFromId, userSessionId);
33
+ // TRUE se il task è assegnato a un utente diverso da quello corrente
34
+ const isAssignedToOtherUser = areDifferentIDs(taskToId, userSessionId);
35
+ // Caso 1: Task personale: non è un work item, è stato creato da me, è assegnato a me
36
+ if (!isAssignedByOtherUser && !isAssignedToOtherUser) {
37
+ return "personal";
38
+ }
39
+ else if (!isAssignedByOtherUser && isAssignedToOtherUser) {
40
+ // Caso 2: Task che ho assegnato a un altro utente: creato da me, assegnato a un altro utente
41
+ return "sender";
42
+ }
43
+ else if (isAssignedByOtherUser) {
44
+ // Caso 3: il task è stato creato da un altro utente
45
+ return "receiver";
46
+ }
47
+ else {
48
+ // Default case, consider it as personal task
49
+ return "personal";
50
+ }
51
+ };
52
+ export const TaskFormAssignmentNoticeBadge = (props) => {
53
+ const { task, users, requestMoreInfo = false } = props;
54
+ const taskRole = useMemo(() => getCurrentUserTaskRole(task), [task?.toID, task?.fromID, SDK_Globals.tmSession?.SessionDescr?.userID]);
55
+ const getMessage = () => {
56
+ const assigneeName = users.find(user => user.id === task.toID)?.name;
57
+ if (requestMoreInfo)
58
+ return assigneeName ? SDKUI_Localizator.MoreInfoRequestedTo.replaceParams(assigneeName) : SDKUI_Localizator.MoreInfoRequested;
59
+ if (taskRole === "personal")
60
+ return SDKUI_Localizator.PersonalTaskAssignmentMessage;
61
+ if (taskRole === "receiver")
62
+ return SDKUI_Localizator.TaskAssignedMessage.replaceParams(task.fromName ?? '');
63
+ if (taskRole === "sender")
64
+ return SDKUI_Localizator.TaskAssignedToUserMessage.replaceParams(assigneeName);
65
+ return null;
66
+ };
67
+ const message = getMessage();
68
+ if (!message)
69
+ return null;
70
+ return (_jsxs("div", { style: {
71
+ display: 'flex',
72
+ justifyContent: 'flex-end',
73
+ alignItems: 'center',
74
+ gap: 6,
75
+ width: '100%',
76
+ }, children: [_jsx("i", { className: "dx-icon-info", style: {
77
+ fontSize: 15,
78
+ color: taskRole === "receiver" ? '#A66300' : '#2559A5',
79
+ display: 'flex',
80
+ alignItems: 'center'
81
+ } }), _jsx("span", { style: {
82
+ fontSize: 13,
83
+ color: taskRole === "receiver" ? '#A66300' : '#2559A5',
84
+ lineHeight: 1
85
+ }, children: message })] }));
86
+ };
87
+ export const RenderAttachmentBlock = ({ condition, pdg, label }) => {
88
+ if (!condition || !label)
89
+ return null;
90
+ return (_jsxs("span", { style: { display: 'inline-flex', alignItems: 'center', gap: 4 }, children: [SDKUI_Localizator.Attachment, ": ", _jsx("span", { style: { flexShrink: 0 }, children: getPdgsIconMap().get(pdg) }), " ", label] }));
91
+ };
92
+ export const TaskFormContextualAttachments = (props) => {
93
+ const { currentTask, taskContext } = props;
94
+ const getAttachmentInfo = useCallback(() => {
95
+ let hasWorkingGroup = false;
96
+ let workingGroupName;
97
+ let hasDossier = false;
98
+ let dossierName;
99
+ let hasDocument = false;
100
+ let documentName;
101
+ let hasWorkItem = false;
102
+ let workItemName;
103
+ if (taskContext) {
104
+ hasWorkingGroup = !!taskContext?.workingGroup?.id;
105
+ workingGroupName = taskContext?.workingGroup?.name;
106
+ hasDossier = !!taskContext?.dossier?.id;
107
+ dossierName = taskContext?.dossier?.name;
108
+ hasDocument = !!taskContext?.document?.tid && !!taskContext?.document?.did;
109
+ documentName = taskContext?.document?.name;
110
+ hasWorkItem = !!taskContext?.workItem?.tid && !!taskContext?.workItem?.did;
111
+ workItemName = taskContext?.workItem?.name;
112
+ }
113
+ else if (currentTask) {
114
+ switch (currentTask.pdG) {
115
+ case PdGs.WG:
116
+ hasWorkingGroup = true;
117
+ workingGroupName = currentTask.iD1Name;
118
+ break;
119
+ case PdGs.CF:
120
+ hasDossier = true;
121
+ dossierName = currentTask.iD1Name;
122
+ break;
123
+ case PdGs.DT:
124
+ hasDocument = true;
125
+ documentName = currentTask.iD1Name;
126
+ break;
127
+ }
128
+ }
129
+ const hasAnyAttachment = hasWorkingGroup || hasDossier || hasDocument || hasWorkItem;
130
+ return { hasWorkingGroup, workingGroupName, hasDossier, dossierName, hasDocument, documentName, hasWorkItem, workItemName, hasAnyAttachment };
131
+ }, [currentTask, taskContext]);
132
+ const { hasWorkingGroup, workingGroupName, hasDossier, dossierName, hasDocument, documentName, hasWorkItem, workItemName, hasAnyAttachment } = useMemo(() => getAttachmentInfo(), [getAttachmentInfo]);
133
+ return (_jsx("div", { style: { width: '100%', marginTop: 15, marginLeft: 5 }, children: !hasAnyAttachment ? (_jsxs("span", { children: [SDKUI_Localizator.Attachment, ":", " ", _jsx("span", { style: { color: "#6c757d", fontStyle: "italic" }, children: "Nessun allegato" })] })) : (_jsxs(_Fragment, { children: [_jsx(RenderAttachmentBlock, { condition: hasWorkingGroup, pdg: PdGs.WG, label: `${SDKUI_Localizator.WorkGroup} "${getOriginLabel(PdGs.WG, workingGroupName)}"` }), _jsx(RenderAttachmentBlock, { condition: hasDossier, pdg: PdGs.CF, label: `${SDKUI_Localizator.Dossier} "${getOriginLabel(PdGs.CF, dossierName)}"` }), _jsx(RenderAttachmentBlock, { condition: hasDocument, pdg: PdGs.DT, label: `${SDKUI_Localizator.Document} "${getOriginLabel(PdGs.DT, documentName)}"` }), _jsx(RenderAttachmentBlock, { condition: hasWorkItem, pdg: PdGs.DT, label: `${SDKUI_Localizator.Document} "${getOriginLabel(PdGs.DT, workItemName)}"` })] })) }));
134
+ };
135
+ const TaskPdgOriginNavigator = (props) => {
136
+ const { formMode, formData, isMobile, gotoPDGExtendedLabelClickCallback } = props;
137
+ let backgroundColor;
138
+ let backgroundHoverColor;
139
+ switch (formData?.pdG) {
140
+ case PdGs.WG:
141
+ backgroundColor = PDGS_COLORS.WORKING_GROUP;
142
+ backgroundHoverColor = "#007300";
143
+ break;
144
+ case PdGs.CF:
145
+ backgroundColor = PDGS_COLORS.DOSSIER;
146
+ backgroundHoverColor = "#b94700";
147
+ break;
148
+ case PdGs.DT:
149
+ backgroundColor = PDGS_COLORS.DOCUMENT;
150
+ backgroundHoverColor = "#8c6700";
151
+ break;
152
+ default:
153
+ backgroundColor = "#C2388B";
154
+ backgroundHoverColor = "#A12D78";
155
+ break;
156
+ }
157
+ return formMode === FormModes.Update && formData?.pdG && formData?.iD1Name && (_jsx("div", { style: { display: 'flex', flexDirection: 'row', width: '100%', gap: 16, padding: '8px 0' }, children: _jsx("div", { style: { width: "100%", display: 'flex', alignItems: 'center', justifyContent: 'center' }, children: _jsxs("div", { onClick: () => formData.pdG !== PdGs.None ? gotoPDGExtendedLabelClickCallback() : null, style: {
158
+ backgroundColor: backgroundColor,
159
+ color: "#fff",
160
+ padding: "10px 16px",
161
+ borderRadius: "20px",
162
+ display: "flex",
163
+ alignItems: "center",
164
+ justifyContent: "space-between",
165
+ cursor: "pointer",
166
+ fontWeight: 600,
167
+ transition: 'background-color 0.3s, transform 0.2s',
168
+ minWidth: "180px",
169
+ maxWidth: "100%",
170
+ flexWrap: "wrap",
171
+ gap: "8px",
172
+ }, onMouseEnter: e => {
173
+ if (formData.pdG !== PdGs.None)
174
+ e.currentTarget.style.backgroundColor = backgroundHoverColor;
175
+ e.currentTarget.style.transform = 'scale(1.05)';
176
+ }, onMouseLeave: e => {
177
+ if (formData.pdG !== PdGs.None)
178
+ e.currentTarget.style.backgroundColor = backgroundColor;
179
+ e.currentTarget.style.transform = 'scale(1)';
180
+ }, children: [_jsxs("span", { style: {
181
+ flex: 1,
182
+ textAlign: "center",
183
+ gap: "6px",
184
+ display: "flex",
185
+ justifyContent: "center",
186
+ alignItems: "center",
187
+ }, 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 }), (() => {
188
+ const originLabel = getOriginLabel(formData.pdG, formData.iD1Name);
189
+ if (!originLabel)
190
+ return null;
191
+ const maxLength = isMobile ? 10 : 25;
192
+ const displayText = originLabel.length > maxLength ? originLabel.slice(0, maxLength) + "..." : originLabel;
193
+ return _jsxs("span", { children: ["\u201C", displayText, "\u201D"] });
194
+ })()] }), _jsx(TMTooltip, { content: _jsxs("div", { style: { textAlign: "left" }, children: [formData.pdG && (_jsxs(_Fragment, { children: [_jsxs("div", { style: {
195
+ display: "flex",
196
+ alignItems: "center",
197
+ gap: "6px",
198
+ fontWeight: 600,
199
+ }, 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 } }) })] }) }) }));
200
+ };
201
+ export const TaskAssigneeField = (props) => {
202
+ const { formMode, formData, taskContext, validationItems, fieldsReadOnly, formDataOrig, usersList, label = SDKUI_Localizator.AssignedTo_Female, onValueChanged, } = props;
203
+ const { isCreateMode, isUpdateMode, isAssignedByOtherUser, isAssignedToOtherUser } = useMemo(() => {
204
+ const isCreateMode = formMode === FormModes.Create;
205
+ const isUpdateMode = formMode === FormModes.Update;
206
+ const taskToId = formData?.toID;
207
+ const taskFromId = formData?.fromID;
208
+ const userSessionId = SDK_Globals.tmSession?.SessionDescr?.userID;
209
+ // Vero se il task è stato creato da un altro utente
210
+ // taskFromId = ID dell’utente che ha assegnato il task
211
+ // userSessionId = ID dell’utente attualmente loggato
212
+ const isAssignedByOtherUser = areDifferentIDs(taskFromId, userSessionId);
213
+ // Vero se il task è assegnato a un altro utente
214
+ // taskToId = ID dell’utente a cui è assegnato il task
215
+ // userSessionId = ID dell’utente attualmente loggato
216
+ const isAssignedToOtherUser = areDifferentIDs(taskToId, userSessionId);
217
+ return {
218
+ isCreateMode,
219
+ isUpdateMode,
220
+ isAssignedByOtherUser,
221
+ isAssignedToOtherUser
222
+ };
223
+ }, [formData?.toID, formData?.fromID, formMode, SDK_Globals.tmSession?.SessionDescr?.userID]);
224
+ let content = null;
225
+ if (isCreateMode || !isAssignedByOtherUser) {
226
+ content = (_jsx("div", { id: "assignedToAnotherUserField", style: { width: '100%' }, children: _jsx(TMUserChooser, { dataSource: usersList, allowShowAllUsers: !!taskContext?.dossier, allowMultipleSelection: false, label: label, readOnly: fieldsReadOnly.assignedTO, values: formData?.toID ? [formData?.toID] : [], isModifiedWhen: formData?.toID !== formDataOrig?.toID, validationItems: validationItems?.filter(o => o.PropertyName === SDKUI_Localizator.AssignedTo_Female), onValueChanged: onValueChanged }) }));
227
+ }
228
+ else if (isUpdateMode) {
229
+ content = (_jsxs(_Fragment, { children: [isAssignedByOtherUser && (_jsx("div", { style: { width: '100%' }, children: _jsx(TMTextBox, { label: SDKUI_Localizator.AssignedBy, value: formData?.fromName ?? '', readOnly: true }) })), isAssignedToOtherUser && (_jsx("div", { style: { width: '100%' }, children: _jsx(TMTextBox, { label: SDKUI_Localizator.AssignedTo_Female, value: formData?.toName ?? '', readOnly: true }) }))] }));
230
+ }
231
+ return (_jsx("div", { style: { display: 'flex', flexDirection: 'row', width: '100%', gap: 10 }, children: content }));
232
+ };
233
+ const FloatingLabelFieldCard = styled.div `
234
+ position: relative;
235
+ width: 100%;
236
+ background: #ffffff;
237
+ border: 1px solid ${props => props.$isModifiedWhen ? '#E29000' : '#e6e6e6'};
238
+ border-radius: 10px;
239
+ padding: 12px 15px;
240
+ box-shadow: 0 2px 6px rgba(0,0,0,0.05);
241
+ `;
242
+ const FloatingFieldLabel = styled.label `
243
+ position: absolute;
244
+ top: -9px;
245
+ left: 9px;
246
+ padding: 0 3px;
247
+ font-size: 0.9rem;
248
+ background-color: white;
249
+ color: ${props => props.$isModifiedWhen ? '#E29000' : 'rgb(80,80,80)'};
250
+ display: inline-flex;
251
+ align-items: center;
252
+ gap: 6px;
253
+ `;
254
+ const StatusFieldLabel = styled.div `
255
+ display: flex;
256
+ align-items: center;
257
+ gap: 8px; // spazio tra label e valore
258
+ font-size: 1rem;
259
+ color: #000; // nero semplice
260
+ font-weight: 400;
261
+ `;
262
+ const StatusValue = styled.span `
263
+ display: inline-flex;
264
+ align-items: center;
265
+ gap: 6px;
266
+ font-size: 1rem;
267
+ font-weight: 500;
268
+ padding: 4px 10px;
269
+ border-radius: 999px;
270
+ border: 2px solid transparent;
271
+ background: ${props => props.$isModifiedWhen
272
+ ? "#FFF4E0"
273
+ : `linear-gradient(#F6F7F9, #F6F7F9) padding-box,
274
+ linear-gradient(270deg, #46B5A2 16%, #3BAABC 34%, #3BAABC 34%, #3681AD 54%, #3368A5 72%, #2F549D 88%, #304F99 100%) border-box`};
275
+ ${props => props.$isModifiedWhen && `border-color: #FFD79A;`}
276
+ color: ${props => props.$isModifiedWhen ? "#B46900" : "#3A3A3A"};
277
+ transition: all 0.2s ease;
278
+ `;
279
+ const ResponseCommentWrapper = styled.div `
280
+ position: relative;
281
+ width: 100%;
282
+ `;
283
+ const ResponseCommentLabel = styled.label `
284
+ position: absolute;
285
+ top: -8px;
286
+ left: 12px;
287
+ background-color: white;
288
+ padding: 0 4px;
289
+ font-size: 0.9rem;
290
+ color: rgb(80,80,80);
291
+ display: inline-flex;
292
+ align-items: center;
293
+ gap: 4px;
294
+ color: ${props => props.$isModifiedWhen ? '#E29000' : 'rgb(80,80,80)'};
295
+ `;
296
+ const ResponseCommentTextArea = styled.textarea.attrs({
297
+ maxLength: 500,
298
+ }) `
299
+ width: 100%;
300
+ height: 100px;
301
+ border: 1px solid ${props => props.$isValid ? (props.$isModifiedWhen ? "#E29000" : 'rgb(80,80,80)') : TMColors.error};
302
+ border-radius: 10px;
303
+ padding: 10px;
304
+ resize: none;
305
+ cursor: ${props => props.disabled ? 'not-allowed' : 'text'};
306
+ &:focus {
307
+ outline: none;
308
+ border-bottom: 4px solid ${props => props.$isValid ? TMColors.primaryColor : TMColors.error};
309
+ }
310
+ color: ${props => props.$isModifiedWhen ? '#E29000' : '#000000'};
311
+ `;
312
+ const ResponseCommentCharacterCounter = styled.div `
313
+ text-align: right;
314
+ font-size: 0.8rem;
315
+ color: #6c757d;
316
+ margin-top: 4px;
317
+ `;
318
+ const TaskFormResponseComment = (props) => {
319
+ const { originalResponse = "", currentResponse = "", onAnswerChange, readonly = false } = props;
320
+ const [showFullscreen, setShowFullscreen] = useState(false);
321
+ const deviceType = useDeviceType();
322
+ return (_jsx("div", { style: { width: '100%', marginTop: !readonly ? 10 : 0 }, children: readonly ?
323
+ _jsxs(_Fragment, { children: [_jsxs("div", { style: {
324
+ width: '100%',
325
+ backgroundColor: '#fff',
326
+ border: '1px solid #ccc',
327
+ borderRadius: 8,
328
+ padding: 8,
329
+ boxSizing: 'border-box',
330
+ height: '5.4rem',
331
+ overflowY: 'auto',
332
+ position: 'relative',
333
+ }, children: [_jsx("i", { className: "dx-icon-fullscreen", onClick: () => setShowFullscreen(true), style: {
334
+ position: 'absolute',
335
+ top: 6,
336
+ right: 6,
337
+ fontSize: '1.1rem',
338
+ color: '#6c757d',
339
+ cursor: 'pointer',
340
+ transition: 'color 0.2s',
341
+ }, onMouseEnter: e => e.currentTarget.style.color = '#333', onMouseLeave: e => e.currentTarget.style.color = '#6c757d' }), _jsx("div", { style: {
342
+ fontSize: '1rem',
343
+ color: '#000',
344
+ whiteSpace: 'pre-wrap',
345
+ lineHeight: '1.6rem',
346
+ paddingRight: 20,
347
+ }, children: currentResponse && currentResponse.length > 0
348
+ ? _jsx(TMHtmlContentDisplay, { markup: currentResponse ?? '-', isSelected: false })
349
+ : _jsx("span", { style: { color: '#6c757d', fontStyle: 'italic' }, children: SDKUI_Localizator.NoAnswerProvided }) })] }), showFullscreen && (_jsx(TMModal, { title: SDKUI_Localizator.Answer, width: calcResponsiveSizes(deviceType, '600px', '600px', '95%'), height: calcResponsiveSizes(deviceType, '400px', '400px', '80%'), isModal: true, resizable: true, onClose: () => setShowFullscreen(false), children: _jsx("div", { style: {
350
+ padding: 16,
351
+ fontSize: '1rem',
352
+ color: '#000',
353
+ whiteSpace: 'pre-wrap',
354
+ lineHeight: '1.6rem',
355
+ overflowY: 'auto',
356
+ height: '100%',
357
+ boxSizing: 'border-box',
358
+ }, children: currentResponse && currentResponse.length > 0
359
+ ? _jsx(TMHtmlContentDisplay, { markup: currentResponse ?? '-', isSelected: false })
360
+ : _jsx("span", { style: { color: '#6c757d', fontStyle: 'italic' }, children: SDKUI_Localizator.NoAnswerProvided }) }) }))] })
361
+ : (_jsxs(ResponseCommentWrapper, { children: [_jsx(ResponseCommentTextArea, { id: "responseId", name: "response", "$isValid": true, value: currentResponse ?? '', onChange: onAnswerChange ? onAnswerChange : undefined, "$isModifiedWhen": currentResponse !== originalResponse }), _jsx(ResponseCommentLabel, { htmlFor: "responseId", "$isModifiedWhen": currentResponse !== originalResponse, children: SDKUI_Localizator.Answer }), _jsx(ResponseCommentCharacterCounter, { children: `${500 - (currentResponse ?? '').length} ${SDKUI_Localizator.CharactersRemaining}` })] })) }));
362
+ };
363
+ // Stile comune per i container dei campi
364
+ const fieldContainerStyle = { width: '100%' };
365
+ const fieldContainerWithMarginStyle = { width: '100%', marginTop: 10 };
366
+ export const RenderNameField = ({ requestMoreInfo = false, validationItems, setFormData, formData, formDataOrig, fieldsReadOnly }) => {
367
+ // Se requestMoreInfo, il valore viene visualizzato senza prefisso nel campo di input
368
+ const displayValue = requestMoreInfo && formData?.name?.startsWith(TASK_MORE_INFO_PREFIX_NAME) ? formData.name.substring(TASK_MORE_INFO_PREFIX_NAME.length) : formData?.name ?? '';
369
+ return (_jsxs("div", { style: fieldContainerStyle, children: [_jsx(TMTextBox, { label: SDKUI_Localizator.Subject, value: displayValue, readOnly: fieldsReadOnly.name, autoFocus: true, maxLength: 100, isModifiedWhen: formData?.name !== formDataOrig?.name, onValueChanged: (e) => {
370
+ const newValue = e.target.value;
371
+ if (requestMoreInfo) {
372
+ setFormData({ ...formData ?? {}, name: `${TASK_MORE_INFO_PREFIX_NAME}${newValue}` });
373
+ }
374
+ else {
375
+ setFormData({ ...formData ?? {}, name: newValue });
376
+ }
377
+ }, validationItems: validationItems?.filter(o => o.PropertyName === SDKUI_Localizator.Name) }), requestMoreInfo && (_jsx("p", { style: { fontStyle: 'italic', fontSize: '0.9rem', marginTop: '5px' }, children: `${TASK_MORE_INFO_PREFIX_NAME}${displayValue}` }))] }));
378
+ };
379
+ export const RenderDescriptionField = ({ validationItems, setFormData, formData, formDataOrig, fieldsReadOnly }) => (_jsx("div", { style: fieldContainerStyle, 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 }) }));
380
+ export const RenderPriorityField = ({ formData, formDataOrig, fieldsReadOnly, onPriorityValueChange }) => (_jsx("div", { style: fieldContainerStyle, children: !fieldsReadOnly.priority ? (_jsx(TMDropDown, { label: SDKUI_Localizator.Priority, value: formData?.priority, dataSource: getPriorityLocalizatorValues(), isModifiedWhen: formData?.priority !== formDataOrig?.priority, onValueChanged: onPriorityValueChange })) : (_jsx(TMTextBox, { label: SDKUI_Localizator.Priority, value: getPriorityLocalizatorValue(formData?.priority ?? Priorities.Low), readOnly: true })) }));
381
+ export const RenderStartDateField = ({ label = SDKUI_Localizator.StartDate, validationItems, setFormData, formData, formDataOrig, fieldsReadOnly, onContentReady }) => (_jsx("div", { style: fieldContainerWithMarginStyle, children: !fieldsReadOnly.startDate ? (_jsx(TMDateBox, { id: "start-date", resetTimeToZeroOnKeyPress: false, label: label, dateDisplayType: DateDisplayTypes.DateTime, value: formData?.startTime, isModifiedWhen: formData?.startTime !== formDataOrig?.startTime, validationItems: validationItems?.filter(o => o.PropertyName === SDKUI_Localizator.ErrorStartEndDate), onContentReady: onContentReady, onValueChange: (value) => setFormData({ ...formData ?? {}, startTime: value }), showClearButton: true })) : (_jsx(TMTextBox, { label: SDKUI_Localizator.StartDate, value: formData?.startTime ? formatDate(formData?.startTime) : '', readOnly: true })) }));
382
+ export const RenderEndDateField = ({ label = SDKUI_Localizator.ExpirationDate, validationItems, setFormData, formData, formDataOrig, fieldsReadOnly, onContentReady }) => (_jsx("div", { style: fieldContainerWithMarginStyle, children: !fieldsReadOnly.startDate ? (_jsx(TMDateBox, { id: "end-date", resetTimeToZeroOnKeyPress: false, label: label, 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: onContentReady, onValueChange: (value) => setFormData({ ...formData ?? {}, endTime: value }), showClearButton: true, readOnly: fieldsReadOnly.endDate })) : (_jsx(TMTextBox, { label: SDKUI_Localizator.ExpirationDate, value: formData?.endTime ? formatDate(formData?.endTime) : '', readOnly: true })) }));
383
+ export const RenderRemindDateField = ({ validationItems, setFormData, formData, formDataOrig, fieldsReadOnly }) => (_jsx("div", { style: fieldContainerWithMarginStyle, 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 }) }));
384
+ export const RenderTaskFormStateField = (props) => {
385
+ // Get the current device type (e.g., mobile, tablet, desktop) using a custom hook.
386
+ const deviceType = useDeviceType();
387
+ // This avoids unnecessary re-renders by only recalculating when deviceType changes.
388
+ let isMobile = useMemo(() => { return deviceType === DeviceType.MOBILE; }, [deviceType]);
389
+ const { formDataOrig, formData, formMode, gotoPDGExtendedLabelClickCallback, handleShowChangeStateForm, onSavedCallback } = props;
390
+ const taskRole = getCurrentUserTaskRole(formDataOrig);
391
+ // Condizione per mostrare il pulsante
392
+ const showCloseButton = taskRole === 'sender' && formDataOrig?.state === Task_States.Completed;
393
+ const showModifyButton = !(taskRole === 'sender' && formDataOrig?.state === Task_States.Completed);
394
+ const closeTaskCallback = () => {
395
+ if (!formData || !formData.id)
396
+ return;
397
+ const msg = _jsxs("span", { children: ["Sei sicuro voler chiudere l'attivit\u00E0 \"", _jsx("b", { children: formData.name ?? "N/A" }), "\"?"] });
398
+ TMMessageBoxManager.show({
399
+ title: SDKUI_Localizator.CloseTask, message: msg, buttons: [ButtonNames.YES, ButtonNames.NO],
400
+ onButtonClick: async (e) => {
401
+ if (e !== ButtonNames.YES)
402
+ return;
403
+ TMSpinner.show();
404
+ try {
405
+ const selectedTask = await SDK_Globals.tmSession?.NewTaskEngine().RetrieveAsync(formData.id);
406
+ if (!selectedTask) {
407
+ TMMessageBoxManager.show({ title: SDKUI_Localizator.Error, message: `Attività ${formData.name ?? 'N/A'} non trovata.` });
408
+ return;
409
+ }
410
+ selectedTask.state = Task_States.Closed;
411
+ await SDK_Globals.tmSession?.NewTaskEngine().UpdateAsync(selectedTask);
412
+ onSavedCallback?.(selectedTask);
413
+ }
414
+ catch (err) {
415
+ TMExceptionBoxManager.show({ exception: err });
416
+ }
417
+ finally {
418
+ TMSpinner.hide();
419
+ }
420
+ }
421
+ });
422
+ };
423
+ // Non renderizzare nulla finché i dati non sono pronti
424
+ if (!formDataOrig)
425
+ return null;
426
+ return (_jsx("div", { style: { width: '100%', marginTop: 15 }, children: _jsxs(FloatingLabelFieldCard, { "$isModifiedWhen": formDataOrig?.state !== formData?.state, style: { display: 'flex', flexDirection: 'column', gap: 10 }, children: [_jsx(FloatingFieldLabel, { "$isModifiedWhen": formDataOrig?.state !== formData?.state, children: SDKUI_Localizator.StatusAndAnswer }), _jsxs("div", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', width: '100%' }, children: [_jsx(StatusFieldLabel, { children: _jsxs(StatusValue, { "$isModifiedWhen": formDataOrig?.state !== formData?.state, children: [_jsx("span", { style: { display: 'flex', alignItems: 'center' }, children: taskStateIconMap(20).get(formData?.state ?? Task_States.None) }), getStatusLocalizatorValue(formData?.state ?? Task_States.None)] }) }), _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '8px' }, children: [showModifyButton && (_jsxs("div", { onClick: () => handleShowChangeStateForm(true), style: {
427
+ backgroundColor: "#d17800",
428
+ color: "#fff",
429
+ padding: "10px 16px",
430
+ borderRadius: "20px",
431
+ display: "inline-flex",
432
+ alignItems: "center",
433
+ justifyContent: "center",
434
+ gap: "8px",
435
+ cursor: "pointer",
436
+ fontWeight: 600,
437
+ width: "120px",
438
+ transition: 'background-color 0.3s, transform 0.2s',
439
+ }, onMouseEnter: e => {
440
+ e.currentTarget.style.backgroundColor = "#a66300";
441
+ e.currentTarget.style.transform = 'scale(1.05)';
442
+ }, onMouseLeave: e => {
443
+ e.currentTarget.style.backgroundColor = "#d17800";
444
+ e.currentTarget.style.transform = 'scale(1)';
445
+ }, children: [_jsx("span", { style: { fontWeight: 500 }, children: SDKUI_Localizator.Update }), _jsx("i", { className: "dx-icon-edit", style: { fontSize: '20px' } })] })), showCloseButton && (_jsxs("div", { onClick: closeTaskCallback, style: {
446
+ backgroundColor: "#d17800",
447
+ color: "#fff",
448
+ padding: "10px 16px",
449
+ borderRadius: "20px",
450
+ display: "inline-flex",
451
+ alignItems: "center",
452
+ justifyContent: "center",
453
+ gap: "8px",
454
+ cursor: "pointer",
455
+ fontWeight: 600,
456
+ width: "150px",
457
+ transition: 'background-color 0.3s, transform 0.2s',
458
+ }, onMouseEnter: e => {
459
+ e.currentTarget.style.backgroundColor = "#a66300";
460
+ e.currentTarget.style.transform = 'scale(1.05)';
461
+ }, onMouseLeave: e => {
462
+ e.currentTarget.style.backgroundColor = "#d17800";
463
+ e.currentTarget.style.transform = 'scale(1)';
464
+ }, children: [_jsx("span", { style: { fontWeight: 500 }, children: SDKUI_Localizator.CloseTask }), _jsx("i", { className: "dx-icon-lock", style: { fontSize: '20px' } })] }))] })] }), _jsx(TaskFormResponseComment, { originalResponse: formDataOrig?.response, currentResponse: formData?.response, readonly: true }), _jsx("div", { style: { display: 'flex', justifyContent: 'center', width: '100%' }, children: _jsx(TaskPdgOriginNavigator, { formMode: formMode, formData: formDataOrig, isMobile: isMobile, gotoPDGExtendedLabelClickCallback: gotoPDGExtendedLabelClickCallback }) })] }) }));
465
+ };
466
+ export const TMChangeStateForm = (props) => {
467
+ const { formData, formDataOrig, handleShowChangeStateForm, setFormData } = props;
468
+ const deviceType = useDeviceType();
469
+ const taskRole = useMemo(() => getCurrentUserTaskRole(formData), [formData.toID, formData.fromID, SDK_Globals.tmSession?.SessionDescr?.userID]);
470
+ const [statusValue, setStatusValue] = React.useState(formData?.state ?? Task_States.None);
471
+ const [responseValue, setResponseValue] = React.useState(formData?.response ?? '');
472
+ const [dropdownValues, setDropdownValues] = React.useState([]);
473
+ useEffect(() => {
474
+ const availableTransitions = getAvailableTaskTransitions(formData?.state ?? Task_States.None, taskRole);
475
+ const values = getDropdownValuesFromTaskStates(availableTransitions);
476
+ setDropdownValues(values);
477
+ if (values.length > 0) {
478
+ const currentState = formData?.state ?? Task_States.None;
479
+ const existsInDropdown = values.some(v => v.value === currentState);
480
+ setStatusValue(existsInDropdown ? currentState : values[0].value);
481
+ }
482
+ else {
483
+ setStatusValue(Task_States.NotStarted);
484
+ }
485
+ setResponseValue(formData?.response ?? '');
486
+ }, [formData, taskRole]);
487
+ const onStatusValueChange = (e) => {
488
+ if (!e?.target?.value)
489
+ return;
490
+ setStatusValue(e?.target?.value);
491
+ };
492
+ const onAnswerChange = (e) => {
493
+ setResponseValue(e.target.value ?? '');
494
+ };
495
+ const onSaveCallback = () => {
496
+ setFormData(({ ...formData ?? {}, state: statusValue, response: responseValue }));
497
+ handleShowChangeStateForm(false);
498
+ };
499
+ return _jsx(TMModal, { title: `Modifica stato: ` + getStatusLocalizatorValue(formDataOrig?.state ?? Task_States.None), width: calcResponsiveSizes(deviceType, '570px', '570px', '95%'), height: calcResponsiveSizes(deviceType, '300px', '300px', '95%'), isModal: true, resizable: false, onClose: () => handleShowChangeStateForm(false), children: _jsxs("div", { style: {
500
+ display: 'flex',
501
+ flexDirection: 'column',
502
+ gap: '5px',
503
+ padding: '5px 24px',
504
+ justifyContent: 'center',
505
+ height: '100%',
506
+ }, children: [_jsx(TMDropDown, { label: SDKUI_Localizator.Status, value: statusValue, dataSource: dropdownValues, isModifiedWhen: statusValue !== formDataOrig?.state, onValueChanged: onStatusValueChange }), _jsx(TaskFormResponseComment, { currentResponse: responseValue, originalResponse: formDataOrig?.response, onAnswerChange: onAnswerChange }), _jsx("div", { style: {
507
+ display: 'flex',
508
+ justifyContent: 'center',
509
+ gap: '10px',
510
+ marginTop: '5px'
511
+ }, children: _jsx(TMButton, { caption: SDKUI_Localizator.ApplyAndClose, advancedColor: TMColors.primary, icon: _jsx(IconSave, {}), showTooltip: false, onClick: onSaveCallback }) })] }) });
512
+ };
513
+ export const STATUS_TRANSITIONS = {
514
+ // Proprietario del task: può cambiare liberamente in qualsiasi stato
515
+ personal: {
516
+ [Task_States.NotStarted]: [Task_States.NotStarted, Task_States.InProgress, Task_States.Waiting, Task_States.Deferred, Task_States.Completed, Task_States.Closed],
517
+ [Task_States.InProgress]: [Task_States.NotStarted, Task_States.InProgress, Task_States.Waiting, Task_States.Deferred, Task_States.Completed, Task_States.Closed],
518
+ [Task_States.Waiting]: [Task_States.NotStarted, Task_States.InProgress, Task_States.Waiting, Task_States.Deferred, Task_States.Completed, Task_States.Closed],
519
+ [Task_States.Deferred]: [Task_States.NotStarted, Task_States.InProgress, Task_States.Waiting, Task_States.Deferred, Task_States.Completed, Task_States.Closed],
520
+ [Task_States.Completed]: [Task_States.NotStarted, Task_States.InProgress, Task_States.Waiting, Task_States.Deferred, Task_States.Completed, Task_States.Closed],
521
+ [Task_States.Closed]: [Task_States.NotStarted, Task_States.InProgress, Task_States.Waiting, Task_States.Deferred, Task_States.Completed, Task_States.Closed]
522
+ },
523
+ // Mittente del task: può modificare lo stato liberamente, ma solo riaprire o chiudere se completato
524
+ sender: {
525
+ [Task_States.NotStarted]: [Task_States.NotStarted, Task_States.InProgress, Task_States.Waiting, Task_States.Deferred, Task_States.Completed],
526
+ [Task_States.InProgress]: [Task_States.NotStarted, Task_States.InProgress, Task_States.Waiting, Task_States.Deferred, Task_States.Completed],
527
+ [Task_States.Waiting]: [Task_States.NotStarted, Task_States.InProgress, Task_States.Waiting, Task_States.Deferred, Task_States.Completed],
528
+ [Task_States.Deferred]: [Task_States.NotStarted, Task_States.InProgress, Task_States.Waiting, Task_States.Deferred, Task_States.Completed],
529
+ [Task_States.Completed]: [Task_States.Completed, Task_States.Closed, Task_States.InProgress],
530
+ [Task_States.Closed]: [Task_States.NotStarted, Task_States.InProgress, Task_States.Waiting, Task_States.Deferred, Task_States.Completed, Task_States.Closed]
531
+ },
532
+ // Destinatario del task: può modificare lo stato liberamente, ma solo riaprire o chiudere se completato
533
+ receiver: {
534
+ [Task_States.NotStarted]: [Task_States.NotStarted, Task_States.InProgress, Task_States.Waiting, Task_States.Deferred, Task_States.Completed],
535
+ [Task_States.InProgress]: [Task_States.NotStarted, Task_States.InProgress, Task_States.Waiting, Task_States.Deferred, Task_States.Completed],
536
+ [Task_States.Waiting]: [Task_States.NotStarted, Task_States.InProgress, Task_States.Waiting, Task_States.Deferred, Task_States.Completed],
537
+ [Task_States.Deferred]: [Task_States.NotStarted, Task_States.InProgress, Task_States.Waiting, Task_States.Deferred, Task_States.Completed],
538
+ [Task_States.Completed]: [Task_States.Completed, Task_States.Closed, Task_States.InProgress],
539
+ [Task_States.Closed]: [Task_States.NotStarted, Task_States.InProgress, Task_States.Waiting, Task_States.Deferred, Task_States.Completed, Task_States.Closed]
540
+ }
541
+ };
542
+ const getAvailableTaskTransitions = (currentStatus, role) => {
543
+ const transitions = STATUS_TRANSITIONS[role];
544
+ return transitions?.[currentStatus] ?? [];
545
+ };
546
+ const getDropdownValuesFromTaskStates = (states) => {
547
+ const map = {
548
+ [Task_States.Completed]: SDKUI_Localizator.Completed,
549
+ [Task_States.Closed]: SDKUI_Localizator.Closed,
550
+ [Task_States.Deferred]: SDKUI_Localizator.Postponed,
551
+ [Task_States.InProgress]: SDKUI_Localizator.InProgress,
552
+ [Task_States.NotStarted]: SDKUI_Localizator.NewFemale,
553
+ [Task_States.Waiting]: SDKUI_Localizator.Pending,
554
+ [Task_States.None]: "",
555
+ };
556
+ return states
557
+ .filter(state => state !== Task_States.None)
558
+ .map(state => ({ value: state, display: map[state] }));
559
+ };
@@ -62,6 +62,7 @@ export declare const getTaskNotPersonalAssignedToMe: (tasks: Array<TaskDescripto
62
62
  export declare const getTaskPersonalAssignedToMe: (tasks: Array<TaskDescriptor>) => Array<TaskDescriptor>;
63
63
  export declare const getTaskAssignedByMe: (tasks: Array<TaskDescriptor>) => Array<TaskDescriptor>;
64
64
  export declare const getTaskNotCompletedAssignedByMe: (tasks: Array<TaskDescriptor>) => Array<TaskDescriptor>;
65
+ export declare const getTaskCompletedAssignedByMe: (tasks: Array<TaskDescriptor>) => Array<TaskDescriptor>;
65
66
  export declare const getHeaderStatusFilterConfig: () => {
66
67
  enabled: boolean;
67
68
  dataSource: {
@@ -95,7 +96,7 @@ export declare const getTaskColor: (taskState: Task_States) => {
95
96
  export declare const mergeUniqueTasks: (existing: Array<TaskDescriptor>, // Array of existing tasks
96
97
  newTasks: Array<TaskDescriptor>) => Array<TaskDescriptor>;
97
98
  export declare const getOriginLabel: (pdg: PdGs | undefined, ID1Name: string | undefined) => string;
98
- export declare const taskValidatorAsync: (taskDescriptor: TaskDescriptor) => Promise<ValidationItem[]>;
99
+ export declare const taskValidatorAsync: (taskDescriptor: TaskDescriptor, requestMoreInfo?: boolean) => Promise<ValidationItem[]>;
99
100
  export declare const gotoPDGExtendedLabel: (gotoVisible: boolean, pdg: PdGs, iD1Name: string | undefined) => string;
100
101
  export declare const convertToSchedulerAppointments: (tasks: Array<TaskDescriptor>) => Array<Appointment>;
101
102
  export declare const formatDate: (date: Date) => string;
@@ -123,6 +124,7 @@ export declare enum FilterCategoryId {
123
124
  New = 1.2,
124
125
  InProgress = 1.3,
125
126
  Completed = 1.4,
127
+ Closed = 1.45,
126
128
  Pending = 1.5,
127
129
  Postponed = 1.6,
128
130
  Low = 2.1,