@topconsultnpm/sdkui-react 6.19.0-dev1.56 → 6.19.0-dev1.58

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.
@@ -17,7 +17,7 @@ interface ITMArchiveProps {
17
17
  value: string;
18
18
  }>) => void;
19
19
  isSharedArchive?: boolean;
20
- allTasks: Array<TaskDescriptor>;
20
+ allTasks?: Array<TaskDescriptor>;
21
21
  getAllTasks?: () => Promise<void>;
22
22
  deleteTaskByIdsCallback?: (deletedTaskIds: Array<number>) => Promise<void>;
23
23
  addTaskCallback?: (task: TaskDescriptor) => Promise<void>;
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useEffect, useRef, useState } from 'react';
3
- import { ObjectClasses, TaskDescriptor, Priorities, PdGs, SDK_Globals, UserListCacheService, SDK_Localizator } from '@topconsultnpm/sdk-ts';
3
+ import { ObjectClasses, TaskDescriptor, Priorities, PdGs, SDK_Globals, UserListCacheService, SDK_Localizator, Task_States } from '@topconsultnpm/sdk-ts';
4
4
  import { areDifferentIDs, formatDate, getOriginLabel, getPriorityLocalizatorValue, getPriorityLocalizatorValues, getStatusLocalizatorValues, gotoPDGExtendedLabel, taskValidatorAsync } from './TMTasksUtils';
5
5
  import ScrollView from 'devextreme-react/cjs/scroll-view';
6
6
  import TMLayoutContainer from '../../base/TMLayout';
@@ -18,6 +18,41 @@ import TMTextArea from '../../editors/TMTextArea';
18
18
  import TMTextBox from '../../editors/TMTextBox';
19
19
  import TMSaveForm from '../../forms/TMSaveForm';
20
20
  import TMDcmtForm from '../documents/TMDcmtForm';
21
+ import styled from 'styled-components';
22
+ import { TMColors } from '../../../utils/theme';
23
+ const ResponseCommentWrapper = styled.div `
24
+ position: relative;
25
+ width: 100%;
26
+ `;
27
+ const ResponseCommentLabel = styled.label `
28
+ position: absolute;
29
+ top: -8px;
30
+ left: 12px;
31
+ background-color: white;
32
+ padding: 0 4px;
33
+ font-size: 0.9rem;
34
+ color: rgb(80,80,80);
35
+ pointer-events: none;
36
+ `;
37
+ const ResponseCommentTextArea = styled.textarea.attrs({
38
+ maxLength: 500,
39
+ }) `
40
+ width: 100%;
41
+ height: 100px;
42
+ border: 1px solid ${props => props.$isValid ? (props.$isModifiedWhen ? "#E29000" : '#b4b4b4') : TMColors.error};
43
+ border-radius: 10px;
44
+ padding: 10px;
45
+ &:focus {
46
+ outline: none;
47
+ border-bottom: 4px solid ${props => props.$isValid ? TMColors.primaryColor : TMColors.error};
48
+ }
49
+ `;
50
+ const ResponseCommentCharacterCounter = styled.div `
51
+ text-align: right;
52
+ font-size: 0.8rem;
53
+ color: #6c757d;
54
+ margin-top: 4px;
55
+ `;
21
56
  const TMTaskForm = (props) => {
22
57
  // Custom hook to manage workflow approval data
23
58
  const { refreshWorkflowApprove } = useWorkflowApprove();
@@ -66,7 +101,8 @@ const TMTaskForm = (props) => {
66
101
  priority: false,
67
102
  startDate: false,
68
103
  endDate: false,
69
- remTime: false
104
+ remTime: false,
105
+ response: false
70
106
  });
71
107
  useEffect(() => {
72
108
  const fetchUsers = async () => {
@@ -101,7 +137,8 @@ const TMTaskForm = (props) => {
101
137
  priority: isTaskAssignedByDifferentUser,
102
138
  startDate: isTaskAssignedByDifferentUser,
103
139
  endDate: isTaskAssignedByDifferentUser,
104
- remTime: false
140
+ remTime: false,
141
+ response: false
105
142
  });
106
143
  const newTaskDescriptor = new TaskDescriptor();
107
144
  Object.assign(newTaskDescriptor, formDataOrig);
@@ -118,7 +155,8 @@ const TMTaskForm = (props) => {
118
155
  priority: false,
119
156
  startDate: false,
120
157
  endDate: false,
121
- remTime: false
158
+ remTime: false,
159
+ response: false
122
160
  });
123
161
  }
124
162
  }, [formDataOrig, formMode]);
@@ -157,6 +195,9 @@ const TMTaskForm = (props) => {
157
195
  return;
158
196
  setFormData({ ...formData ?? {}, priority: e?.target?.value });
159
197
  };
198
+ const onAnswerChange = (e) => {
199
+ setFormData({ ...formData ?? {}, response: e.target.value ?? '' });
200
+ };
160
201
  // Function to handle the undo action
161
202
  const onUndoCallback = () => {
162
203
  setFormData(formDataOrig);
@@ -285,7 +326,9 @@ const TMTaskForm = (props) => {
285
326
  setFormData({ ...formData ?? {}, toID: newValue[0] });
286
327
  } }) })
287
328
  : 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, 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 })
288
- : _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 }) }) })] }) }) }), (showDcmtForm && formData?.iD1 && formData?.iD2) &&
329
+ : _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) ||
330
+ (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 ?? "") !== "" &&
331
+ (formData?.state && ![Task_States.Completed, Task_States.Waiting, Task_States.Deferred].includes(formData?.state)) }), _jsx(ResponseCommentLabel, { htmlFor: "responseId", children: SDKUI_Localizator.Answer }), _jsx(ResponseCommentCharacterCounter, { children: `${500 - (formData?.response ?? '').length} ${SDKUI_Localizator.CharactersRemaining}` })] }) }) })] }) }) }), (showDcmtForm && formData?.iD1 && formData?.iD2) &&
289
332
  _jsx(TMDcmtForm, { titleModal: formData.iD1Name ?? '-', isModal: true, TID: formData.iD1, DID: formData.iD2, allowButtonsRefs: true, taskMoreInfo: 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 })] }) }) }));
290
333
  };
291
334
  export default TMTaskForm;
@@ -48,8 +48,9 @@ const TMTasksPanelContent = (props) => {
48
48
  default:
49
49
  break;
50
50
  }
51
- tasks = applyContextFilters(allTasks, showContextualWG, showContextualDossier, showContextualDocument, taskContext);
52
- return filterTreeTask(tasks, appliedGlobalFilters);
51
+ tasks = applyContextFilters(tasks, showContextualWG, showContextualDossier, showContextualDocument, taskContext);
52
+ tasks = filterTreeTask(tasks, appliedGlobalFilters);
53
+ return tasks;
53
54
  };
54
55
  setAssignedToMeCount(getFilteredTasks(AssignedTab.AssignedToMe).length);
55
56
  setAssignedByMeCount(getFilteredTasks(AssignedTab.AssignedByMe).length);
@@ -32,6 +32,7 @@ export interface IFieldsEditability {
32
32
  startDate: boolean;
33
33
  endDate: boolean;
34
34
  remTime: boolean;
35
+ response: boolean;
35
36
  }
36
37
  export declare const sortTasks: (tasks: Array<TaskDescriptor>) => Array<TaskDescriptor>;
37
38
  export declare const taskIsToday: (startTime: Date, endTime: Date) => boolean;
@@ -289,13 +289,13 @@ const TMTasksView = (props) => {
289
289
  }
290
290
  setShowTaskForm(false);
291
291
  };
292
- const handleNavigateToDossiersWrapper = useCallback((dossierId) => {
292
+ const handleNavigateToDossiersWrapper = useCallback(async (dossierId) => {
293
293
  setShowTaskForm(false);
294
- handleNavigateToDossiers(dossierId);
294
+ await handleNavigateToDossiers(dossierId);
295
295
  }, []);
296
- const handleNavigateToWGsWrapper = useCallback((workGroupId) => {
296
+ const handleNavigateToWGsWrapper = useCallback(async (workGroupId) => {
297
297
  setShowTaskForm(false);
298
- handleNavigateToWGs(workGroupId);
298
+ await handleNavigateToWGs(workGroupId);
299
299
  }, []);
300
300
  const onContextMenuPreparing = (e) => {
301
301
  if (e === undefined)
@@ -524,7 +524,7 @@ const TMTasksView = (props) => {
524
524
  _jsxs(_Fragment, { children: [activeComponent === TaskView.CALENDAR_TASK && getFromOrToCalendarElement(visualizedTasks, false, true), activeComponent === TaskView.AGENDA_TASK && getFromOrToAgendaElement(visualizedTasks, false, true), activeComponent === TaskView.LIST_TASK && getFromOrToDatagridElement(visualizedTasks, false, true)] }) : '' }), _jsx(Item, { title: SDKUI_Localizator.AllFemale, icon: "fields", tabRender: (params) => {
525
525
  return _jsxs(StyledTabItem, { "$isSelected": activeTabIndex === AssignedTab.All, children: [_jsxs(TMTooltip, { content: SDKUI_Localizator.AllFemale, children: [_jsx("i", { className: `dx-icon-${params.icon}` }), "\u00A0", params.title, " ", (allTasksFilteredCount > 0) ? `(${allTasksFilteredCount})` : ''] }), newTaskCount > 0 && (_jsx(TMTooltip, { content: SDKUI_Localizator.NewAssignedActivitiesNumber + ": " + newTaskCount, children: _jsx(TMCountBadge, { children: newTaskCount }) }))] });
526
526
  }, render: () => activeTabIndex === AssignedTab.All ?
527
- _jsxs(_Fragment, { children: [activeComponent === TaskView.CALENDAR_TASK && getFromOrToCalendarElement(visualizedTasks, true, true), activeComponent === TaskView.AGENDA_TASK && getFromOrToAgendaElement(visualizedTasks, true, true), activeComponent === TaskView.LIST_TASK && getFromOrToDatagridElement(visualizedTasks, true, true)] }) : '' })] }) }), showTaskForm && _jsx(TMTaskForm, { id: currentTask?.id ?? -1, width: calcResponsiveSizes(deviceType, '700px', '700px', '95%'), height: calcResponsiveSizes(deviceType, '670px', '80%', '95%'), title: SDKUI_Localizator.Widget_Activities, isModal: true, formMode: formMode ?? FormModes.Create, visualizedTasks: visualizedTasks, currentTask: currentTask, setCurrentTask: setCurrentTask, selectedRowKeys: selectedRowKeys, handleFocusedRowKeyChange: handleFocusedRowChange, taskContext: taskContext, usersList: usersList, onStatusChanged: () => { }, onClose: closeTaskFormCallback, onCancel: closeTaskFormCallback, showBackButton: false, onSaved: onSavedCallback, startDate: calendarStartDate, endDate: calendarEndDate, onOpenS4TViewerRequest: onOpenS4TViewerRequest, s4TViewerDialogComponent: s4TViewerDialogComponent, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }), _jsx("button", { style: {
527
+ _jsxs(_Fragment, { children: [activeComponent === TaskView.CALENDAR_TASK && getFromOrToCalendarElement(visualizedTasks, true, true), activeComponent === TaskView.AGENDA_TASK && getFromOrToAgendaElement(visualizedTasks, true, true), activeComponent === TaskView.LIST_TASK && getFromOrToDatagridElement(visualizedTasks, true, true)] }) : '' })] }) }), showTaskForm && _jsx(TMTaskForm, { id: currentTask?.id ?? -1, width: calcResponsiveSizes(deviceType, '700px', '700px', '95%'), height: calcResponsiveSizes(deviceType, '700px', '700px', '95%'), title: SDKUI_Localizator.Widget_Activities, isModal: true, formMode: formMode ?? FormModes.Create, visualizedTasks: visualizedTasks, currentTask: currentTask, setCurrentTask: setCurrentTask, selectedRowKeys: selectedRowKeys, handleFocusedRowKeyChange: handleFocusedRowChange, taskContext: taskContext, usersList: usersList, onStatusChanged: () => { }, onClose: closeTaskFormCallback, onCancel: closeTaskFormCallback, showBackButton: false, onSaved: onSavedCallback, startDate: calendarStartDate, endDate: calendarEndDate, onOpenS4TViewerRequest: onOpenS4TViewerRequest, s4TViewerDialogComponent: s4TViewerDialogComponent, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGsWrapper, handleNavigateToDossiers: handleNavigateToDossiersWrapper }), _jsx("button", { style: {
528
528
  position: 'absolute',
529
529
  bottom: hasFilters ? '90px' : '18px',
530
530
  right: '20px',
@@ -33,6 +33,7 @@ export declare class SDKUI_Localizator {
33
33
  static get AllPriorities(): "Alle Prioritäten" | "All priorities" | "Todas las prioridades" | "Toutes les priorités" | "Todas as prioridades" | "Tutte le priorità";
34
34
  static get AllStates(): "Alle Staaten" | "All states" | "Todos los estados" | "Tous les états" | "Todos os estados" | "Tutti gli stati";
35
35
  static get Alphabetic(): "Alphabetisch" | "Alphabetic" | "Alfabético" | "Alphabétique" | "Alfabética" | "Alfabetico";
36
+ static get Answer(): "Antwort" | "Answer" | "Respuesta" | "Réponse" | "Resposta" | "Risposta";
36
37
  static get Application(): "Anwendung" | "Application" | "Aplicación" | "Aplicação" | "Applicazione";
37
38
  static get Applied(): string;
38
39
  static get Apply(): "Anwenden" | "Apply" | "Aplicar" | "Applique" | "Applica";
@@ -278,6 +278,16 @@ export class SDKUI_Localizator {
278
278
  default: return "Alfabetico";
279
279
  }
280
280
  }
281
+ static get Answer() {
282
+ switch (this._cultureID) {
283
+ case CultureIDs.De_DE: return "Antwort";
284
+ case CultureIDs.En_US: return "Answer";
285
+ case CultureIDs.Es_ES: return "Respuesta";
286
+ case CultureIDs.Fr_FR: return "Réponse";
287
+ case CultureIDs.Pt_PT: return "Resposta";
288
+ default: return "Risposta";
289
+ }
290
+ }
281
291
  static get Application() {
282
292
  switch (this._cultureID) {
283
293
  case CultureIDs.De_DE: return "Anwendung";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@topconsultnpm/sdkui-react",
3
- "version": "6.19.0-dev1.56",
3
+ "version": "6.19.0-dev1.58",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1",