@zeniai/client-epic-state 5.0.11-betaND1 → 5.0.11-betaRR2

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 (71) hide show
  1. package/lib/entity/file/fileState.d.ts +4 -4
  2. package/lib/entity/file/fileState.js +4 -0
  3. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  4. package/lib/entity/snackbar/snackbarTypes.js +2 -0
  5. package/lib/entity/task/taskPayload.d.ts +3 -1
  6. package/lib/entity/task/taskPayload.js +5 -3
  7. package/lib/entity/task/taskState.d.ts +3 -1
  8. package/lib/entity/transaction/stateTypes/attachment.d.ts +2 -2
  9. package/lib/epic.d.ts +3 -2
  10. package/lib/epic.js +3 -2
  11. package/lib/esm/entity/file/fileState.js +4 -0
  12. package/lib/esm/entity/snackbar/snackbarTypes.js +2 -0
  13. package/lib/esm/entity/task/taskPayload.js +5 -3
  14. package/lib/esm/epic.js +3 -2
  15. package/lib/esm/index.js +4 -4
  16. package/lib/esm/view/spendManagement/billPay/billDetailView/epics/fetchBillDetailEpic.js +5 -5
  17. package/lib/esm/view/taskManager/taskDetailView/epics/archiveTaskEpic.js +3 -0
  18. package/lib/esm/view/taskManager/taskDetailView/epics/deleteTaskEpic.js +5 -0
  19. package/lib/esm/view/taskManager/taskDetailView/epics/initializeTaskToLocalStoreEpic.js +1 -0
  20. package/lib/esm/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +1 -0
  21. package/lib/esm/view/taskManager/taskDetailView/epics/snoozeTaskEpic.js +65 -0
  22. package/lib/esm/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.js +56 -0
  23. package/lib/esm/view/taskManager/taskDetailView/taskDetail.js +4 -0
  24. package/lib/esm/view/taskManager/taskDetailView/taskDetailReducer.js +51 -1
  25. package/lib/esm/view/taskManager/taskDetailView/taskDetailSelector.js +15 -2
  26. package/lib/esm/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.js +56 -21
  27. package/lib/esm/view/taskManager/taskListView/epics/dragNDropTasksEpic.js +1 -0
  28. package/lib/esm/view/taskManager/taskListView/epics/fetchTaskListEpic.js +12 -5
  29. package/lib/esm/view/taskManager/taskListView/epics/updateTaskFromListViewEpic.js +3 -2
  30. package/lib/esm/view/taskManager/taskListView/taskList.js +7 -0
  31. package/lib/esm/view/taskManager/taskListView/taskListPayload.js +1 -5
  32. package/lib/esm/view/taskManager/taskListView/taskListReducer.js +89 -39
  33. package/lib/esm/view/taskManager/taskListView/taskListSelector.js +51 -65
  34. package/lib/index.d.ts +4 -4
  35. package/lib/index.js +9 -6
  36. package/lib/tsconfig.typecheck.tsbuildinfo +1 -1
  37. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  38. package/lib/view/spendManagement/billPay/billDetailView/epics/fetchBillDetailEpic.js +5 -5
  39. package/lib/view/taskManager/taskDetailView/epics/archiveTaskEpic.d.ts +2 -1
  40. package/lib/view/taskManager/taskDetailView/epics/archiveTaskEpic.js +3 -0
  41. package/lib/view/taskManager/taskDetailView/epics/deleteTaskEpic.d.ts +2 -1
  42. package/lib/view/taskManager/taskDetailView/epics/deleteTaskEpic.js +5 -0
  43. package/lib/view/taskManager/taskDetailView/epics/initializeTaskToLocalStoreEpic.js +1 -0
  44. package/lib/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +1 -0
  45. package/lib/view/taskManager/taskDetailView/epics/snoozeTaskEpic.d.ts +9 -0
  46. package/lib/view/taskManager/taskDetailView/epics/snoozeTaskEpic.js +69 -0
  47. package/lib/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.d.ts +9 -0
  48. package/lib/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.js +60 -0
  49. package/lib/view/taskManager/taskDetailView/taskDetail.d.ts +2 -0
  50. package/lib/view/taskManager/taskDetailView/taskDetail.js +4 -0
  51. package/lib/view/taskManager/taskDetailView/taskDetailReducer.d.ts +10 -1
  52. package/lib/view/taskManager/taskDetailView/taskDetailReducer.js +52 -2
  53. package/lib/view/taskManager/taskDetailView/taskDetailSelector.d.ts +5 -0
  54. package/lib/view/taskManager/taskDetailView/taskDetailSelector.js +15 -2
  55. package/lib/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.d.ts +6 -7
  56. package/lib/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.js +56 -22
  57. package/lib/view/taskManager/taskListView/epics/dragNDropTasksEpic.js +1 -0
  58. package/lib/view/taskManager/taskListView/epics/fetchTaskListEpic.js +12 -5
  59. package/lib/view/taskManager/taskListView/epics/updateTaskFromListViewEpic.js +3 -2
  60. package/lib/view/taskManager/taskListView/taskList.d.ts +14 -3
  61. package/lib/view/taskManager/taskListView/taskList.js +8 -1
  62. package/lib/view/taskManager/taskListView/taskListPayload.d.ts +4 -31
  63. package/lib/view/taskManager/taskListView/taskListPayload.js +0 -7
  64. package/lib/view/taskManager/taskListView/taskListReducer.d.ts +9 -9
  65. package/lib/view/taskManager/taskListView/taskListReducer.js +90 -40
  66. package/lib/view/taskManager/taskListView/taskListSelector.d.ts +10 -7
  67. package/lib/view/taskManager/taskListView/taskListSelector.js +51 -65
  68. package/package.json +2 -2
  69. package/lib/esm/view/taskManager/taskListView/epics/createSubtaskFromListViewEpic.js +0 -31
  70. package/lib/view/taskManager/taskListView/epics/createSubtaskFromListViewEpic.d.ts +0 -8
  71. package/lib/view/taskManager/taskListView/epics/createSubtaskFromListViewEpic.js +0 -35
@@ -8,9 +8,10 @@ export const updateTaskFromListViewEpic = (actions$, state$, zeniAPI) => actions
8
8
  const state = state$.value;
9
9
  const { task, updates } = action.payload;
10
10
  const taskId = task.id;
11
- const taskData = getTaskPayload(state, taskId, updates);
11
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
12
+ const { snoozed_until: _snoozedUntil, ...taskData } = getTaskPayload(state, taskId, updates);
12
13
  return zeniAPI
13
- .putAndGetJSON(`${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/tasks/${taskId}`, { ...taskData })
14
+ .putAndGetJSON(`${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/tasks/${taskId}`, taskData)
14
15
  .pipe(mergeMap((response) => {
15
16
  if (isSuccessResponse(response) && response.data != null) {
16
17
  return from([
@@ -1,4 +1,10 @@
1
1
  import { stringToUnion, stringToUnionStrict, } from '../../../commonStateTypes/stringToUnion';
2
+ export const ALL_TASK_LIST_TABS = [
3
+ 'live',
4
+ 'archived',
5
+ 'deleted',
6
+ 'snoozed',
7
+ ];
2
8
  export const DUE_DATE_GROUP_KEYS = [
3
9
  'overdue',
4
10
  'today',
@@ -26,6 +32,7 @@ const ALL_TASK_LIST_SORT_KEYS = [
26
32
  'status',
27
33
  'priority',
28
34
  'timeSpent',
35
+ 'visibility',
29
36
  ];
30
37
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
31
38
  const toTaskListSortKeyType = (v) => stringToUnion(v, ALL_TASK_LIST_SORT_KEYS);
@@ -1,5 +1 @@
1
- /** Parent tasks and nested subtasks as flat `TaskPayload`s for `updateTasks`. */
2
- export const flattenTasksAndSubtasksForEntity = (tasks) => tasks.flatMap((task) => {
3
- const { subtasks, ...parent } = task;
4
- return [parent, ...(subtasks ?? [])];
5
- });
1
+ export {};
@@ -29,8 +29,23 @@ const initialTaskIdsByDueDate = {
29
29
  today: [],
30
30
  upcoming: [],
31
31
  };
32
+ const initialTabData = {
33
+ taskIds: [],
34
+ taskIdsByAssignees: {},
35
+ taskIdsByDueDate: { ...initialTaskIdsByDueDate },
36
+ taskIdsByGroupsIds: {},
37
+ taskIdsByPriority: { ...initialTaskIdsByPriority },
38
+ taskIdsByStatus: { ...initialTaskIdsByStatus },
39
+ taskIdsByTags: {},
40
+ };
32
41
  export const initialState = {
33
- subtaskIdsByParentTaskId: {},
42
+ currentTab: 'live',
43
+ byTab: {
44
+ live: { ...initialTabData },
45
+ archived: { ...initialTabData },
46
+ deleted: { ...initialTabData },
47
+ snoozed: { ...initialTabData },
48
+ },
34
49
  taskIds: [],
35
50
  taskIdsByGroupsIds: {},
36
51
  taskIdsByPriority: initialTaskIdsByPriority,
@@ -87,18 +102,30 @@ const taskList = createSlice({
87
102
  draft.error = undefined;
88
103
  },
89
104
  updateTaskList(draft, action) {
90
- const { data } = action.payload;
105
+ const { data, archived, deleted, snoozed } = action.payload;
91
106
  draft.fetchState = 'Completed';
92
107
  draft.error = undefined;
93
- draft.subtaskIdsByParentTaskId = buildSubtaskIdsByParentTaskId(data);
94
- const { taskIds, taskIdsGroupedByPriority, taskIdsByGroupIds, taskIdsGroupedByStatus, taskIdsByAssignees, taskIdsByDueDate, taskIdsByTags, } = getGroupedTaskIds(data);
95
- draft.taskIds = taskIds;
96
- draft.taskIdsByGroupsIds = taskIdsByGroupIds;
97
- draft.taskIdsByPriority = taskIdsGroupedByPriority;
98
- draft.taskIdsByStatus = taskIdsGroupedByStatus;
99
- draft.taskIdsByAssignees = taskIdsByAssignees;
100
- draft.taskIdsByDueDate = taskIdsByDueDate;
101
- draft.taskIdsByTags = taskIdsByTags;
108
+ // Group live tasks
109
+ const liveGrouped = getGroupedTaskIds(data);
110
+ draft.byTab.live = toTabData(liveGrouped);
111
+ // Group other tabs if provided
112
+ if (archived != null) {
113
+ draft.byTab.archived = toTabData(getGroupedTaskIds(archived));
114
+ }
115
+ if (deleted != null) {
116
+ draft.byTab.deleted = toTabData(getGroupedTaskIds(deleted));
117
+ }
118
+ if (snoozed != null) {
119
+ draft.byTab.snoozed = toTabData(getGroupedTaskIds(snoozed));
120
+ }
121
+ // Copy active tab data to top-level fields
122
+ const activeTabData = draft.byTab[draft.currentTab];
123
+ copyTabDataToTopLevel(draft, activeTabData);
124
+ },
125
+ updateTaskListTab(draft, action) {
126
+ draft.currentTab = action.payload;
127
+ const activeTabData = draft.byTab[action.payload];
128
+ copyTabDataToTopLevel(draft, activeTabData);
102
129
  },
103
130
  initiateTaskListLocalData(draft, action) {
104
131
  const { taskGroupById } = action.payload;
@@ -186,10 +213,13 @@ const taskList = createSlice({
186
213
  },
187
214
  },
188
215
  updateTasksListOnBulkUpdateTasksSuccess(draft, action) {
189
- const { taskIds, groupId } = action.payload;
216
+ const { taskIds, groupId, removeFromList } = action.payload;
190
217
  draft.updateTasksFetchState.fetchState = 'Completed';
191
218
  draft.updateTasksFetchState.error = undefined;
192
- if (groupId != null) {
219
+ if (removeFromList) {
220
+ removeTaskIds(draft, taskIds);
221
+ }
222
+ else if (groupId != null) {
193
223
  const { groupByKey } = draft.uiState;
194
224
  if (groupByKey === 'groupName') {
195
225
  Object.keys(draft.taskIdsByGroupsIds).forEach((gId) => {
@@ -342,17 +372,6 @@ const taskList = createSlice({
342
372
  [taskGroupId]: taskGroupName,
343
373
  };
344
374
  },
345
- createSubtaskFromListView: {
346
- reducer(draft) {
347
- draft.updateTasksFetchState = {
348
- fetchState: 'In-Progress',
349
- error: undefined,
350
- };
351
- },
352
- prepare(payload) {
353
- return { payload };
354
- },
355
- },
356
375
  updateTaskFromListView(draft, action) {
357
376
  const { updates, task } = action.payload;
358
377
  const taskId = task.id;
@@ -409,13 +428,6 @@ const taskList = createSlice({
409
428
  }
410
429
  }
411
430
  },
412
- updateTasksListOnCreateSubtaskFromListViewSuccess(draft, action) {
413
- const { parentTaskId, subtaskId } = action.payload;
414
- draft.updateTasksFetchState.fetchState = 'Completed';
415
- draft.updateTasksFetchState.error = undefined;
416
- const existing = draft.subtaskIdsByParentTaskId[parentTaskId] ?? [];
417
- draft.subtaskIdsByParentTaskId[parentTaskId] = [...existing, subtaskId];
418
- },
419
431
  updateTasksListOnUpdateTaskSuccess(draft) {
420
432
  draft.updateTasksFetchState.fetchState = 'Completed';
421
433
  draft.updateTasksFetchState.error = undefined;
@@ -424,12 +436,15 @@ const taskList = createSlice({
424
436
  draft.updateTasksFetchState.fetchState = 'Error';
425
437
  draft.updateTasksFetchState.error = action.payload.error;
426
438
  },
439
+ removeTaskFromList(draft, action) {
440
+ removeTaskIds(draft, [action.payload]);
441
+ },
427
442
  clearTaskList(draft) {
428
443
  Object.assign(draft, initialState);
429
444
  },
430
445
  },
431
446
  });
432
- export const { fetchTaskListPage, fetchTaskList, updateTaskList, updateTaskListFetchStatus, updateTaskListSearchText, updateTaskListUIState, updateTaskFilters, updateTaskListOnNewGroupCreationSuccess, bulkUpdateTaskList, updateTasksListOnBulkUpdateTasksSuccess, updateTasksListOnBulkUpdateTasksFailure, initiateTaskListLocalData, updateTaskListLocalData, updateTaskListOnTaskGroupDeletion, dragNDropTasks, updateTaskListOnNewTaskCreationSuccess, updateTaskListOnTaskGroupNameUpdate, createSubtaskFromListView, updateTaskFromListView, updateTasksListOnCreateSubtaskFromListViewSuccess, updateTasksListOnUpdateTaskSuccess, updateTasksListOnUpdateTaskFailure, updateTaskListOnCreateTaskFromTemplateSuccess, clearTaskList, } = taskList.actions;
447
+ export const { fetchTaskListPage, fetchTaskList, updateTaskList, updateTaskListTab, updateTaskListFetchStatus, updateTaskListSearchText, updateTaskListUIState, updateTaskFilters, updateTaskListOnNewGroupCreationSuccess, bulkUpdateTaskList, updateTasksListOnBulkUpdateTasksSuccess, updateTasksListOnBulkUpdateTasksFailure, initiateTaskListLocalData, updateTaskListLocalData, updateTaskListOnTaskGroupDeletion, dragNDropTasks, updateTaskListOnNewTaskCreationSuccess, updateTaskListOnTaskGroupNameUpdate, updateTaskFromListView, updateTasksListOnUpdateTaskSuccess, updateTasksListOnUpdateTaskFailure, updateTaskListOnCreateTaskFromTemplateSuccess, removeTaskFromList, clearTaskList, } = taskList.actions;
433
448
  export default taskList.reducer;
434
449
  /**
435
450
  * helpers
@@ -508,14 +523,49 @@ const getTagsGroupKey = (tags) => {
508
523
  tagIds.sort();
509
524
  return tagIds.join(',');
510
525
  };
511
- const buildSubtaskIdsByParentTaskId = (tasks) => {
512
- const subtaskIdsByParentTaskId = {};
513
- tasks.forEach((task) => {
514
- if (task.subtasks != null && task.subtasks.length > 0) {
515
- subtaskIdsByParentTaskId[task.task_id] = task.subtasks.map((s) => s.task_id);
516
- }
526
+ const toTabData = (grouped) => ({
527
+ taskIds: grouped.taskIds,
528
+ taskIdsByAssignees: grouped.taskIdsByAssignees,
529
+ taskIdsByDueDate: grouped.taskIdsByDueDate,
530
+ taskIdsByGroupsIds: grouped.taskIdsByGroupIds,
531
+ taskIdsByPriority: grouped.taskIdsGroupedByPriority,
532
+ taskIdsByStatus: grouped.taskIdsGroupedByStatus,
533
+ taskIdsByTags: grouped.taskIdsByTags,
534
+ });
535
+ const copyTabDataToTopLevel = (draft, tabData) => {
536
+ draft.taskIds = tabData.taskIds;
537
+ draft.taskIdsByGroupsIds = tabData.taskIdsByGroupsIds;
538
+ draft.taskIdsByPriority = tabData.taskIdsByPriority;
539
+ draft.taskIdsByStatus = tabData.taskIdsByStatus;
540
+ draft.taskIdsByAssignees = tabData.taskIdsByAssignees;
541
+ draft.taskIdsByDueDate = tabData.taskIdsByDueDate;
542
+ draft.taskIdsByTags = tabData.taskIdsByTags;
543
+ };
544
+ const removeIdsFromTabData = (tabData, taskIds) => {
545
+ const isRemoved = (id) => taskIds.includes(id);
546
+ tabData.taskIds = tabData.taskIds.filter((id) => !isRemoved(id));
547
+ Object.keys(tabData.taskIdsByGroupsIds).forEach((gId) => {
548
+ tabData.taskIdsByGroupsIds[gId] = tabData.taskIdsByGroupsIds[gId].filter((id) => !isRemoved(id));
549
+ });
550
+ Object.keys(tabData.taskIdsByPriority).forEach((key) => {
551
+ tabData.taskIdsByPriority[key] = tabData.taskIdsByPriority[key].filter((id) => !isRemoved(id));
552
+ });
553
+ Object.keys(tabData.taskIdsByStatus).forEach((key) => {
554
+ tabData.taskIdsByStatus[key] = tabData.taskIdsByStatus[key].filter((id) => !isRemoved(id));
517
555
  });
518
- return subtaskIdsByParentTaskId;
556
+ Object.keys(tabData.taskIdsByDueDate).forEach((key) => {
557
+ tabData.taskIdsByDueDate[key] = tabData.taskIdsByDueDate[key].filter((id) => !isRemoved(id));
558
+ });
559
+ Object.keys(tabData.taskIdsByAssignees).forEach((key) => {
560
+ tabData.taskIdsByAssignees[key] = tabData.taskIdsByAssignees[key].filter((id) => !isRemoved(id));
561
+ });
562
+ Object.keys(tabData.taskIdsByTags).forEach((key) => {
563
+ tabData.taskIdsByTags[key] = tabData.taskIdsByTags[key].filter((id) => !isRemoved(id));
564
+ });
565
+ };
566
+ const removeTaskIds = (draft, taskIds) => {
567
+ removeIdsFromTabData(draft, taskIds);
568
+ removeIdsFromTabData(draft.byTab[draft.currentTab], taskIds);
519
569
  };
520
570
  const getGroupedTaskIds = (tasks) => {
521
571
  const taskIds = [];
@@ -1,5 +1,4 @@
1
1
  import { createSelector } from '@reduxjs/toolkit';
2
- import isEqual from 'lodash/isEqual';
3
2
  import orderBy from 'lodash/orderBy';
4
3
  import { getSortOrder, } from '../../../commonPayloadTypes/sortOrderPayload';
5
4
  import { reduceAnyFetchState } from '../../../commonStateTypes/reduceFetchState';
@@ -15,11 +14,6 @@ import { getUserGroupList } from '../../userGroupListView/userGroupListViewSelec
15
14
  import { getUserList, } from '../../userListView/userListViewSelector';
16
15
  import { allTaskPriority, allTaskStatus, } from '../taskDetailView/taskDetailSelector';
17
16
  import { DUE_DATE_GROUP_KEYS, } from './taskList';
18
- import { initialState } from './taskListReducer';
19
- const isDefaultFilters = (taskListState) => {
20
- return (isEqual(taskListState.filters, initialState.filters) &&
21
- initialState.uiState.searchText === taskListState.uiState.searchText);
22
- };
23
17
  const sortTasksList = (tagState, tasksList, sortKey, sortOrder) => {
24
18
  const tasksInOrder = orderBy(tasksList, (task) => {
25
19
  const tagsByIds = getTagsByIds(tagState, task.tagIds);
@@ -34,8 +28,12 @@ const sortTasksList = (tagState, tasksList, sortKey, sortOrder) => {
34
28
  return task.status.name;
35
29
  case 'priority':
36
30
  return ALL_PRIORITY_CODE.indexOf(task.priority.code);
31
+ case 'assignee':
32
+ return task.firstAssigneeSortName;
37
33
  case 'timeSpent':
38
34
  return task.timeSpent;
35
+ case 'visibility':
36
+ return task.isPrivate === true ? 1 : 0;
39
37
  case 'name':
40
38
  default:
41
39
  return task.name.toLowerCase();
@@ -43,39 +41,25 @@ const sortTasksList = (tagState, tasksList, sortKey, sortOrder) => {
43
41
  }, sortOrder);
44
42
  return tasksInOrder;
45
43
  };
46
- const taskToTaskWithUserDetails = (task, userState, userRoleState, addressState) => ({
47
- ...task,
48
- assigneeUsers: task.assignees
49
- .map((userId) => getUserAndUserRole(userState, userRoleState, addressState, userId))
50
- .filter((value) => value != null),
51
- subtasks: [],
52
- });
53
- const attachSubtasksForTask = (taskWithAssignees, taskListState, taskState, userState, userRoleState, addressState) => {
54
- const subtaskIds = taskListState.subtaskIdsByParentTaskId[taskWithAssignees.id] ?? [];
55
- if (subtaskIds.length === 0) {
56
- return { ...taskWithAssignees, subtasks: [] };
57
- }
58
- const subtasks = subtaskIds
59
- .map((subtaskId) => {
60
- const subtask = getTaskById(taskState, subtaskId);
61
- if (subtask == null) {
62
- return undefined;
63
- }
64
- const withAssignees = taskToTaskWithUserDetails(subtask, userState, userRoleState, addressState);
65
- return attachSubtasksForTask(withAssignees, taskListState, taskState, userState, userRoleState, addressState);
66
- })
67
- .filter((value) => value != null);
68
- return { ...taskWithAssignees, subtasks };
69
- };
70
- const getTasksWithUserDetails = ({ taskListState, taskState, userState, userRoleState, addressState, taskIds, tagState, }) => {
44
+ const getTasksWithUserDetails = ({ taskListState, taskState, userState, userRoleState, addressState, taskIds, tagState, userGroupsState, }) => {
71
45
  const { sortKey, searchText } = taskListState.uiState;
72
46
  const sortOrder = getSortOrder(taskListState.uiState.sortOrder);
73
47
  const tasks = taskIds
74
48
  .map((taskId) => {
75
49
  const task = getTaskById(taskState, taskId);
76
50
  if (task != null) {
77
- const taskWithAssignees = taskToTaskWithUserDetails(task, userState, userRoleState, addressState);
78
- return attachSubtasksForTask(taskWithAssignees, taskListState, taskState, userState, userRoleState, addressState);
51
+ const assigneeUsers = task.assignees
52
+ .map((userId) => getUserAndUserRole(userState, userRoleState, addressState, userId))
53
+ .filter((value) => value != null);
54
+ const firstUser = assigneeUsers[0]?.user;
55
+ const firstUserName = (firstUser != null ? getUserName(firstUser) : '') ||
56
+ firstUser?.email ||
57
+ '';
58
+ const firstGroupName = task.groupAssignees
59
+ .map((gId) => userGroupsState.userGroupByUserGroupId[gId]?.name)
60
+ .find((name) => name != null && name !== '');
61
+ const firstAssigneeSortName = (firstUserName !== '' ? firstUserName : (firstGroupName ?? '')).toLowerCase();
62
+ return { ...task, assigneeUsers, firstAssigneeSortName };
79
63
  }
80
64
  return undefined;
81
65
  })
@@ -84,7 +68,7 @@ const getTasksWithUserDetails = ({ taskListState, taskState, userState, userRole
84
68
  const sortedTaskList = sortTasksList(tagState, filteredTaskList, sortKey, sortOrder);
85
69
  return sortedTaskList;
86
70
  };
87
- const getTaskListGroupedByGroupName = ({ taskListState, taskState, taskGroupState, taskGroupViewState, userState, userRoleState, addressState, tagState, }) => {
71
+ const getTaskListGroupedByGroupName = ({ taskListState, taskState, taskGroupState, taskGroupViewState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
88
72
  const { taskGroupsIds } = taskGroupViewState;
89
73
  const taskGroupsWithTasksList = taskGroupsIds
90
74
  .map((taskGroupId) => {
@@ -98,6 +82,7 @@ const getTaskListGroupedByGroupName = ({ taskListState, taskState, taskGroupStat
98
82
  addressState,
99
83
  taskIds,
100
84
  tagState,
85
+ userGroupsState,
101
86
  });
102
87
  if (taskGroup != null) {
103
88
  return {
@@ -126,12 +111,9 @@ const getTaskListGroupedByGroupName = ({ taskListState, taskState, taskGroupStat
126
111
  if (defaultTaskGroup != null) {
127
112
  sortedTaskGroupsWithTasksList.push(defaultTaskGroup);
128
113
  }
129
- if (isDefaultFilters(taskListState) === false) {
130
- return sortedTaskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
131
- }
132
- return sortedTaskGroupsWithTasksList;
114
+ return sortedTaskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
133
115
  };
134
- export const getTaskListGroupedByAssignees = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }) => {
116
+ export const getTaskListGroupedByAssignees = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
135
117
  const assigneeGroups = Object.keys(taskListState.taskIdsByAssignees);
136
118
  const taskGroupsWithTasksList = assigneeGroups.map((groupKey) => {
137
119
  const taskIds = taskListState.taskIdsByAssignees[groupKey];
@@ -143,6 +125,7 @@ export const getTaskListGroupedByAssignees = ({ taskListState, taskState, userSt
143
125
  addressState,
144
126
  taskIds,
145
127
  tagState,
128
+ userGroupsState,
146
129
  });
147
130
  const assigneeIds = groupKey.split(',');
148
131
  const groupName = getUsersByUserIds(userState, assigneeIds)
@@ -158,12 +141,9 @@ export const getTaskListGroupedByAssignees = ({ taskListState, taskState, userSt
158
141
  tasks: tasksWithUserDetails,
159
142
  };
160
143
  });
161
- if (isDefaultFilters(taskListState) === false) {
162
- return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
163
- }
164
- return taskGroupsWithTasksList;
144
+ return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
165
145
  };
166
- export const getTaskListGroupedByPriority = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }) => {
146
+ export const getTaskListGroupedByPriority = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
167
147
  const taskGroupsWithTasksList = ALL_PRIORITY_CODE.map((groupKey) => {
168
148
  const taskIds = taskListState.taskIdsByPriority[groupKey] ?? [];
169
149
  const tasksWithUserDetails = getTasksWithUserDetails({
@@ -174,6 +154,7 @@ export const getTaskListGroupedByPriority = ({ taskListState, taskState, userSta
174
154
  addressState,
175
155
  taskIds,
176
156
  tagState,
157
+ userGroupsState,
177
158
  });
178
159
  return {
179
160
  groupName: allTaskPriority.find((priority) => priority.code === groupKey)?.name ??
@@ -183,12 +164,9 @@ export const getTaskListGroupedByPriority = ({ taskListState, taskState, userSta
183
164
  tasks: tasksWithUserDetails,
184
165
  };
185
166
  });
186
- if (isDefaultFilters(taskListState) === false) {
187
- return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
188
- }
189
- return taskGroupsWithTasksList;
167
+ return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
190
168
  };
191
- const getTaskListGroupedByStatus = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }) => {
169
+ const getTaskListGroupedByStatus = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
192
170
  const taskGroupsWithTasksList = ALL_TASK_STATUS_CODE.map((groupKey) => {
193
171
  const taskIds = taskListState.taskIdsByStatus[groupKey] ?? [];
194
172
  const tasksWithUserDetails = getTasksWithUserDetails({
@@ -199,6 +177,7 @@ const getTaskListGroupedByStatus = ({ taskListState, taskState, userState, userR
199
177
  addressState,
200
178
  taskIds,
201
179
  tagState,
180
+ userGroupsState,
202
181
  });
203
182
  return {
204
183
  groupName: allTaskStatus.find((taskStatus) => taskStatus.code === groupKey)
@@ -208,12 +187,9 @@ const getTaskListGroupedByStatus = ({ taskListState, taskState, userState, userR
208
187
  tasks: tasksWithUserDetails,
209
188
  };
210
189
  });
211
- if (isDefaultFilters(taskListState) === false) {
212
- return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
213
- }
214
- return taskGroupsWithTasksList;
190
+ return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
215
191
  };
216
- const getTaskListGroupedByTags = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }) => {
192
+ const getTaskListGroupedByTags = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
217
193
  const tagGroups = Object.keys(taskListState.taskIdsByTags);
218
194
  const taskGroupsWithTasksList = tagGroups.map((groupKey) => {
219
195
  const taskIds = taskListState.taskIdsByTags[groupKey];
@@ -225,6 +201,7 @@ const getTaskListGroupedByTags = ({ taskListState, taskState, userState, userRol
225
201
  addressState,
226
202
  taskIds,
227
203
  tagState,
204
+ userGroupsState,
228
205
  });
229
206
  const tagIds = groupKey.split(',');
230
207
  const groupName = getTagsByIds(tagState, tagIds)
@@ -239,12 +216,9 @@ const getTaskListGroupedByTags = ({ taskListState, taskState, userState, userRol
239
216
  tasks: tasksWithUserDetails,
240
217
  };
241
218
  });
242
- if (isDefaultFilters(taskListState) === false) {
243
- return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
244
- }
245
- return taskGroupsWithTasksList;
219
+ return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
246
220
  };
247
- const getTaskListGroupedByDueDate = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }) => {
221
+ const getTaskListGroupedByDueDate = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
248
222
  const taskGroupsWithTasksList = DUE_DATE_GROUP_KEYS.map((groupKey) => {
249
223
  const taskIds = taskListState.taskIdsByDueDate[groupKey];
250
224
  const tasksWithUserDetails = getTasksWithUserDetails({
@@ -255,6 +229,7 @@ const getTaskListGroupedByDueDate = ({ taskListState, taskState, userState, user
255
229
  addressState,
256
230
  taskIds,
257
231
  tagState,
232
+ userGroupsState,
258
233
  });
259
234
  return {
260
235
  groupName: groupKey,
@@ -263,12 +238,9 @@ const getTaskListGroupedByDueDate = ({ taskListState, taskState, userState, user
263
238
  tasks: tasksWithUserDetails,
264
239
  };
265
240
  });
266
- if (isDefaultFilters(taskListState) === false) {
267
- return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
268
- }
269
- return taskGroupsWithTasksList;
241
+ return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
270
242
  };
271
- const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRoleState, addressState, taskGroupState, taskGroupViewState, tagState, }) => {
243
+ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRoleState, addressState, taskGroupState, taskGroupViewState, tagState, userGroupsState, }) => {
272
244
  const { groupByKey } = taskListState.uiState;
273
245
  if (groupByKey === 'groupName') {
274
246
  return getTaskListGroupedByGroupName({
@@ -280,6 +252,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
280
252
  taskGroupState,
281
253
  taskGroupViewState,
282
254
  tagState,
255
+ userGroupsState,
283
256
  });
284
257
  }
285
258
  if (groupByKey === 'assignee') {
@@ -290,6 +263,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
290
263
  userRoleState,
291
264
  addressState,
292
265
  tagState,
266
+ userGroupsState,
293
267
  });
294
268
  }
295
269
  if (groupByKey === 'priority') {
@@ -300,6 +274,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
300
274
  userRoleState,
301
275
  addressState,
302
276
  tagState,
277
+ userGroupsState,
303
278
  });
304
279
  }
305
280
  if (groupByKey === 'status') {
@@ -310,6 +285,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
310
285
  userRoleState,
311
286
  addressState,
312
287
  tagState,
288
+ userGroupsState,
313
289
  });
314
290
  }
315
291
  if (groupByKey === 'tag') {
@@ -320,6 +296,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
320
296
  userRoleState,
321
297
  addressState,
322
298
  tagState,
299
+ userGroupsState,
323
300
  });
324
301
  }
325
302
  return getTaskListGroupedByDueDate({
@@ -329,6 +306,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
329
306
  userRoleState,
330
307
  addressState,
331
308
  tagState,
309
+ userGroupsState,
332
310
  });
333
311
  };
334
312
  export const getAllTasks = createSelector((state) => state.taskListState, (state) => state.taskState, (state) => state.userState, (state) => state.userRoleState, (state) => state.userListViewState, (state) => state.addressState, (state) => state.taskGroupState, (state) => state.taskGroupViewState, (state) => state.tagViewState, (state) => state.tagState, (state) => state.taskGroupTemplateState, (state) => state.taskGroupTemplateViewState, (state) => state.userGroupsState, (state) => state.userGroupListViewState, (_state, isTaskTemplatesEnabled) => isTaskTemplatesEnabled, (taskListState, taskState, userState, userRoleState, userListViewState, addressState, taskGroupState, taskGroupViewState, tagViewState, tagState, taskGroupTemplateState, taskGroupTemplateViewState, userGroupsState, userGroupListViewState, isTaskTemplatesEnabled) => {
@@ -342,6 +320,7 @@ export const getAllTasks = createSelector((state) => state.taskListState, (state
342
320
  taskGroupState,
343
321
  taskGroupViewState,
344
322
  tagState,
323
+ userGroupsState,
345
324
  });
346
325
  const fetchStateVariables = [
347
326
  taskListState,
@@ -353,10 +332,17 @@ export const getAllTasks = createSelector((state) => state.taskListState, (state
353
332
  }
354
333
  const { fetchState, error } = reduceAnyFetchState(fetchStateVariables);
355
334
  const taskGroupTemplates = getTaskGroupTemplateByIds(taskGroupTemplateState, taskGroupTemplateViewState.taskGroupTemplateIds);
335
+ const tabCounts = {
336
+ live: taskListState.byTab.live.taskIds.length,
337
+ archived: taskListState.byTab.archived.taskIds.length,
338
+ deleted: taskListState.byTab.deleted.taskIds.length,
339
+ snoozed: taskListState.byTab.snoozed.taskIds.length,
340
+ };
356
341
  return {
342
+ currentTab: taskListState.currentTab,
343
+ tabCounts,
357
344
  uiState: taskListState.uiState,
358
345
  filters: taskListState.filters,
359
- subtaskIdsByParentTaskId: taskListState.subtaskIdsByParentTaskId,
360
346
  taskGroupTemplates,
361
347
  fetchState: fetchState,
362
348
  userList: getUserList(userState, userRoleState, userListViewState, 'taskManagerCandidate'),
package/lib/index.d.ts CHANGED
@@ -537,12 +537,12 @@ import { createTag, deleteTag, fetchTagList } from './view/tagView/tagViewReduce
537
537
  import { TagViewSelectorView, getAllTags } from './view/tagView/tagViewSelector';
538
538
  import { TagViewState } from './view/tagView/tagViewState';
539
539
  import { EditTaskLocalData, initialTaskDetail, initialTaskDetailLocalData } from './view/taskManager/taskDetailView/taskDetail';
540
- import { archiveTask, deleteTask, discardTaskUpdatesInLocalStore, fetchTaskDetailPage, saveTaskDetail, saveTaskUpdatesToLocalStore } from './view/taskManager/taskDetailView/taskDetailReducer';
540
+ import { archiveTask, deleteTask, discardTaskUpdatesInLocalStore, fetchTaskDetailPage, saveTaskDetail, saveTaskUpdatesToLocalStore, snoozeTask, unsnoozeTask } from './view/taskManager/taskDetailView/taskDetailReducer';
541
541
  import { TaskDetailSelectorView, allTaskPriority, allTaskStatus, getTaskDetail } from './view/taskManager/taskDetailView/taskDetailSelector';
542
542
  import { createTaskFromTaskGroupTemplate } from './view/taskManager/taskGroupTemplateView/taskGroupTemplateViewReducer';
543
543
  import { createNewTaskGroup, deleteTaskGroup, fetchAllTaskGroups, updateTaskGroupName } from './view/taskManager/taskGroupView/taskGroupViewReducer';
544
- import { DueDateGroupKey, TASK_LIST_FILTER_CATEGORIES, TASK_LIST_GROUP_BY_CATEGORIES, TaskFilterCategory, TaskGroupKey, TaskListFilterCategoryField, TaskListFilters, TaskListLocalData, TaskListUIState, TaskListViewSortKey, toDueDateGroupKeyType, toTaskListGroupByKeyType, toTaskListGroupByKeyTypeStrict } from './view/taskManager/taskListView/taskList';
545
- import { bulkUpdateTaskList, createSubtaskFromListView, dragNDropTasks, fetchTaskListPage, initiateTaskListLocalData, updateTaskFilters, updateTaskFromListView, updateTaskListLocalData, updateTaskListSearchText, updateTaskListUIState, updateTasksListOnCreateSubtaskFromListViewSuccess } from './view/taskManager/taskListView/taskListReducer';
544
+ import { DueDateGroupKey, TASK_LIST_FILTER_CATEGORIES, TASK_LIST_GROUP_BY_CATEGORIES, TaskFilterCategory, TaskGroupKey, TaskListFilterCategoryField, TaskListFilters, TaskListLocalData, TaskListUIState, TaskListViewSortKey, toDueDateGroupKeyType, toTaskListGroupByKeyType, toTaskListGroupByKeyTypeStrict, ALL_TASK_LIST_TABS, TaskListTab } from './view/taskManager/taskListView/taskList';
545
+ import { bulkUpdateTaskList, dragNDropTasks, fetchTaskListPage, initiateTaskListLocalData, removeTaskFromList, updateTaskFilters, updateTaskFromListView, updateTaskListLocalData, updateTaskListSearchText, updateTaskListTab, updateTaskListUIState } from './view/taskManager/taskListView/taskListReducer';
546
546
  import { TaskGroupWithTasksList, TaskListSelectorView, TaskWithUserDetails, getAllTasks } from './view/taskManager/taskListView/taskListSelector';
547
547
  import { getDueDateValueFromDueDateGroupId, getTaskUpdates } from './view/taskManager/taskListView/taskListViewHelpers';
548
548
  import { fetchTasksCard } from './view/tasksCard/tasksCardReducer';
@@ -847,7 +847,7 @@ export { fetchGlobalMerchantRecommendation, createGlobalMerchant, updateCreateGl
847
847
  export { approveVendorGlobalReview, rejectVendorGlobalReview, fetchVendorGlobalReviewView, updateSelectedGlobalMerchant, updateVendorGlobalReviewViewUIState, getVendorGlobalReviewView, getTenantMerchantByMerchantId, toVendorGlobalReviewColumnSortKeyType, VendorGlobalReview, VendorGlobalReviewViewUIState, VendorGlobalReviewViewColumnSortKey, VendorGlobalReviewViewSelectorView, VendorGlobalReviewViewState, VendorGlobalReviewViewLocalData, updateVendorGlobalReviewViewLocalData, GlobalReviewPageCurrentSelectionByColumn, GlobalRecommendationFetchSource, };
848
848
  export { fetchArAging, updateArAgingUIState, fetchArAgingDetail, updateArAgingDetailUIState, ArAgingReport, ArAgingDetail, NestedAgingBalancesByCustomer, getArAgingReport, getArAgingDetailForCustomer, updateArAgingNodeCollapseState, };
849
849
  export { toRecurringBillFrequency, toRecurringBillFrequencyStrict, RecurringBillFrequency, RecurringBillDetail, RecurringBillConfig, RecurringBillStatus, RecurringBillPaymentStatus, };
850
- export { Task, TaskListSelectorView, TaskWithUserDetails, TaskListViewSortKey, TaskListUIState, TaskDetailSelectorView, EditTaskLocalData, TaskStatusCodeType, PriorityCodeType, getTaskGroupById, TaskStatus, TaskPriority, TaskCodeType, getAllTasks, fetchTaskListPage, getTaskDetail, fetchTaskDetailPage, saveTaskUpdatesToLocalStore, saveTaskDetail, archiveTask, updateTaskListSearchText, updateTaskListUIState, allTaskStatus, allTaskPriority, TaskListFilters, updateTaskFilters, TASK_LIST_FILTER_CATEGORIES, TASK_LIST_GROUP_BY_CATEGORIES, TaskListFilterCategoryField, deleteTask, discardTaskUpdatesInLocalStore, TaskFilterCategory, TaskType, TaskGroupWithTasksList, TaskListLocalData, bulkUpdateTaskList, createNewTaskGroup, initiateTaskListLocalData, deleteTaskGroup, updateTaskListLocalData, dragNDropTasks, updateTaskGroupName, TaskGroupState, TaskGroupKey, toTaskListGroupByKeyType, toTaskListGroupByKeyTypeStrict, getTaskUpdates, fetchAllTaskGroups, initialTaskDetail, getDueDateValueFromDueDateGroupId, toPriorityCodeType, toTaskStatusCodeType, DueDateGroupKey, toDueDateGroupKeyType, createSubtaskFromListView, updateTaskFromListView, updateTasksListOnCreateSubtaskFromListViewSuccess, convertHHMMStrToMinutes, initialTaskDetailLocalData, };
850
+ export { Task, TaskListSelectorView, TaskWithUserDetails, TaskListViewSortKey, TaskListUIState, TaskDetailSelectorView, EditTaskLocalData, TaskStatusCodeType, PriorityCodeType, getTaskGroupById, TaskStatus, TaskPriority, TaskCodeType, getAllTasks, fetchTaskListPage, getTaskDetail, fetchTaskDetailPage, saveTaskUpdatesToLocalStore, saveTaskDetail, archiveTask, updateTaskListSearchText, updateTaskListUIState, allTaskStatus, allTaskPriority, TaskListFilters, updateTaskFilters, TASK_LIST_FILTER_CATEGORIES, TASK_LIST_GROUP_BY_CATEGORIES, TaskListFilterCategoryField, deleteTask, discardTaskUpdatesInLocalStore, TaskFilterCategory, TaskType, TaskGroupWithTasksList, TaskListLocalData, bulkUpdateTaskList, createNewTaskGroup, initiateTaskListLocalData, deleteTaskGroup, updateTaskListLocalData, dragNDropTasks, updateTaskGroupName, TaskGroupState, TaskGroupKey, toTaskListGroupByKeyType, toTaskListGroupByKeyTypeStrict, getTaskUpdates, fetchAllTaskGroups, initialTaskDetail, getDueDateValueFromDueDateGroupId, toPriorityCodeType, toTaskStatusCodeType, DueDateGroupKey, toDueDateGroupKeyType, updateTaskFromListView, updateTaskListTab, removeTaskFromList, snoozeTask, unsnoozeTask, convertHHMMStrToMinutes, initialTaskDetailLocalData, TaskListTab, ALL_TASK_LIST_TABS, };
851
851
  export { Tag, TagState, TagViewState, getAllTags, TagViewSelectorView, fetchTagList, createTag, deleteTag, };
852
852
  export { CardPayment, CardPaymentViewState, SetupIntentData, CardPaymentSelectorView, getAllCardsAndBankPaymentMethods, createCardSetupIntent, confirmCardSetupIntent, addCardPaymentSource, fetchPaymentSources, resetCardPaymentErrorStatuses, clearCardPaymentView, AddCardPaymentSourceType, };
853
853
  export { getAuditReportGroupViewSelectorView, getAuditRuleGroupViewSelectorView, getUserFromAllUsers, AuditReportGroupSelectorView, AuditReportGroupViewSelectorView, AuditRuleGroupViewSelectorView, fetchAuditRuleGroupView, fetchAuditReportGroupView, saveReasonForAuditRule, AuditRuleGroup, AuditRuleGroupReport, AuditReportRule, AuditRuleEntityType, AuditRuleEntityIdType, AuditRuleBypassReason, clearAuditReportGroupViewByCompanyId, };