@zeniai/client-epic-state 4.20.2-beta30ND → 4.20.2-beta31RR

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 (65) hide show
  1. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  2. package/lib/entity/snackbar/snackbarTypes.js +2 -0
  3. package/lib/entity/task/taskPayload.d.ts +3 -0
  4. package/lib/entity/task/taskPayload.js +5 -0
  5. package/lib/entity/task/taskState.d.ts +3 -0
  6. package/lib/epic.d.ts +3 -1
  7. package/lib/epic.js +3 -1
  8. package/lib/esm/entity/snackbar/snackbarTypes.js +2 -0
  9. package/lib/esm/entity/task/taskPayload.js +5 -0
  10. package/lib/esm/epic.js +3 -1
  11. package/lib/esm/index.js +4 -4
  12. package/lib/esm/view/companyView/types/cockpitTypes.js +1 -0
  13. package/lib/esm/view/profitAndLossClassesView/profitAndLossClassesByClassHorizontalSelector.js +1 -15
  14. package/lib/esm/view/profitAndLossClassesView/profitAndLossHorizontalEnrichment.js +14 -17
  15. package/lib/esm/view/taskManager/taskDetailView/epics/archiveTaskEpic.js +2 -0
  16. package/lib/esm/view/taskManager/taskDetailView/epics/deleteTaskEpic.js +4 -0
  17. package/lib/esm/view/taskManager/taskDetailView/epics/initializeTaskToLocalStoreEpic.js +1 -0
  18. package/lib/esm/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +1 -0
  19. package/lib/esm/view/taskManager/taskDetailView/epics/snoozeTaskEpic.js +64 -0
  20. package/lib/esm/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.js +54 -0
  21. package/lib/esm/view/taskManager/taskDetailView/taskDetail.js +4 -0
  22. package/lib/esm/view/taskManager/taskDetailView/taskDetailReducer.js +49 -1
  23. package/lib/esm/view/taskManager/taskDetailView/taskDetailSelector.js +3 -0
  24. package/lib/esm/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.js +49 -2
  25. package/lib/esm/view/taskManager/taskListView/epics/fetchTaskListEpic.js +13 -3
  26. package/lib/esm/view/taskManager/taskListView/taskList.js +8 -0
  27. package/lib/esm/view/taskManager/taskListView/taskListReducer.js +107 -11
  28. package/lib/esm/view/taskManager/taskListView/taskListSelector.js +56 -17
  29. package/lib/index.d.ts +4 -4
  30. package/lib/index.js +8 -4
  31. package/lib/tsconfig.typecheck.tsbuildinfo +1 -1
  32. package/lib/view/companyTaskManagerView/companyTaskManagerViewReducer.d.ts +2 -2
  33. package/lib/view/companyView/types/cockpitTypes.d.ts +1 -1
  34. package/lib/view/companyView/types/cockpitTypes.js +1 -0
  35. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  36. package/lib/view/profitAndLossClassesView/profitAndLossClassesByClassHorizontalSelector.d.ts +0 -2
  37. package/lib/view/profitAndLossClassesView/profitAndLossClassesByClassHorizontalSelector.js +2 -16
  38. package/lib/view/profitAndLossClassesView/profitAndLossHorizontalEnrichment.js +14 -17
  39. package/lib/view/taskManager/taskDetailView/epics/archiveTaskEpic.d.ts +2 -1
  40. package/lib/view/taskManager/taskDetailView/epics/archiveTaskEpic.js +2 -0
  41. package/lib/view/taskManager/taskDetailView/epics/deleteTaskEpic.d.ts +2 -1
  42. package/lib/view/taskManager/taskDetailView/epics/deleteTaskEpic.js +4 -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 +68 -0
  47. package/lib/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.d.ts +8 -0
  48. package/lib/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.js +58 -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 +50 -2
  53. package/lib/view/taskManager/taskDetailView/taskDetailSelector.d.ts +2 -0
  54. package/lib/view/taskManager/taskDetailView/taskDetailSelector.js +3 -0
  55. package/lib/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.d.ts +6 -0
  56. package/lib/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.js +49 -2
  57. package/lib/view/taskManager/taskListView/epics/fetchTaskListEpic.js +13 -3
  58. package/lib/view/taskManager/taskListView/taskList.d.ts +15 -1
  59. package/lib/view/taskManager/taskListView/taskList.js +10 -1
  60. package/lib/view/taskManager/taskListView/taskListPayload.d.ts +3 -0
  61. package/lib/view/taskManager/taskListView/taskListReducer.d.ts +7 -4
  62. package/lib/view/taskManager/taskListView/taskListReducer.js +108 -12
  63. package/lib/view/taskManager/taskListView/taskListSelector.d.ts +8 -3
  64. package/lib/view/taskManager/taskListView/taskListSelector.js +56 -17
  65. package/package.json +1 -1
@@ -16,10 +16,11 @@ const bulkUpdateTaskListEpic = (actions$, state$, zeniAPI) => actions$.pipe((0,
16
16
  const state = state$.value;
17
17
  const { taskIds, updates, groupId } = action.payload;
18
18
  const payload = {
19
- tasks: (0, exports.getTasksListPayload)(state, taskIds, updates),
19
+ task_ids: taskIds,
20
+ updates: toBulkUpdatesPayload(state, updates, groupId),
20
21
  };
21
22
  return zeniAPI
22
- .putAndGetJSON(`${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/tasks`, payload)
23
+ .putAndGetJSON(`${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/tasks/bulk-update`, payload)
23
24
  .pipe((0, operators_1.mergeMap)((response) => {
24
25
  if ((0, responsePayload_1.isSuccessResponse)(response) && response.data != null) {
25
26
  return (0, rxjs_1.of)((0, taskReducer_1.updateTasks)(response.data.tasks), (0, taskListReducer_1.updateTasksListOnBulkUpdateTasksSuccess)({
@@ -40,6 +41,46 @@ const bulkUpdateTaskListEpic = (actions$, state$, zeniAPI) => actions$.pipe((0,
40
41
  }));
41
42
  }));
42
43
  exports.bulkUpdateTaskListEpic = bulkUpdateTaskListEpic;
44
+ const toBulkUpdatesPayload = (_state, updates, groupId) => {
45
+ const payload = {};
46
+ if (updates.status != null) {
47
+ payload.status = updates.status.code;
48
+ }
49
+ if (updates.priority != null) {
50
+ payload.priority = updates.priority.code;
51
+ }
52
+ if (updates.assignees != null) {
53
+ payload.assignees = updates.assignees;
54
+ }
55
+ if (updates.groupAssignees != null) {
56
+ payload.group_assignees = updates.groupAssignees;
57
+ }
58
+ if (updates.dueDate != null) {
59
+ payload.due_date = updates.dueDate.format(formatZeniDateFY_1.DEFAULT_DATE_FORMAT);
60
+ }
61
+ if (updates.tagIds != null) {
62
+ payload.tags = updates.tagIds;
63
+ }
64
+ if (updates.timeSpent != null) {
65
+ payload.time_spent = (0, formatMinutesToFromHHMM_1.convertHHMMStrToMinutes)(updates.timeSpent);
66
+ }
67
+ if (updates.isArchived != null) {
68
+ payload.is_archived = updates.isArchived;
69
+ }
70
+ if (updates.isDeleted != null) {
71
+ payload.is_deleted = updates.isDeleted;
72
+ }
73
+ if ('snoozedUntil' in updates) {
74
+ payload.snoozed_until = null;
75
+ payload.snoozed_by = null;
76
+ payload.snoozed_at = null;
77
+ payload.is_snooze_notification_sent = false;
78
+ }
79
+ if (groupId != null) {
80
+ payload.task_group_ids = [groupId];
81
+ }
82
+ return payload;
83
+ };
43
84
  const getTasksListPayload = (state, taskIds, updates) => {
44
85
  const { taskState } = state;
45
86
  const tasksList = taskIds
@@ -80,6 +121,12 @@ const toTaskPayload = (state, task) => {
80
121
  assignees: task.assignees,
81
122
  description: task.description,
82
123
  group_assignees: task.groupAssignees,
124
+ is_archived: task.isArchived,
125
+ is_deleted: task.isDeleted,
126
+ is_snooze_notification_sent: false,
127
+ snoozed_at: null,
128
+ snoozed_by: null,
129
+ snoozed_until: task.snoozedUntil != null ? task.snoozedUntil.toISOString() : null,
83
130
  due_date: task.dueDate != null ? task.dueDate.format(formatZeniDateFY_1.DEFAULT_DATE_FORMAT) : null,
84
131
  priority: task.priority.code,
85
132
  status: task.status.code,
@@ -12,10 +12,20 @@ const fetchTaskListEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, oper
12
12
  .getJSON(`${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/tasks?query=${encodeURIComponent(`{"task_type": "all"}`)}`)
13
13
  .pipe((0, operators_1.mergeMap)((response) => {
14
14
  if ((0, responsePayload_1.isSuccessResponse)(response) && response.data != null) {
15
- return (0, rxjs_1.of)((0, taskReducer_1.updateTasks)(response.data.tasks), (0, taskListReducer_1.updateTaskList)({
16
- data: response.data.tasks,
15
+ const { tasks, deleted, archived, snoozed } = response.data;
16
+ const allTasks = [
17
+ ...tasks,
18
+ ...(deleted ?? []),
19
+ ...(archived ?? []),
20
+ ...(snoozed ?? []),
21
+ ];
22
+ return (0, rxjs_1.of)((0, taskReducer_1.updateTasks)(allTasks), (0, taskListReducer_1.updateTaskList)({
23
+ data: tasks,
24
+ deleted: deleted ?? [],
25
+ archived: archived ?? [],
26
+ snoozed: snoozed ?? [],
17
27
  updateType: 'replace',
18
- }), (0, tagReducer_1.updateTags)(response.data.tasks.map((task) => task.tags).flat()));
28
+ }), (0, tagReducer_1.updateTags)(allTasks.map((task) => task.tags).flat()));
19
29
  }
20
30
  else {
21
31
  return (0, rxjs_1.of)((0, taskListReducer_1.updateTaskListFetchStatus)({
@@ -3,6 +3,18 @@ import { PriorityCodeType, TaskStatusCodeType } from '../../../entity/task/taskS
3
3
  import { ZeniDate } from '../../../zeniDayJS';
4
4
  import { SpendManagementUIState } from '../../spendManagement/billPay/billList/billListState';
5
5
  import { CategoryCombinationOperator, FilterCategoryType } from '../../spendManagement/spendManagementFilterHelpers';
6
+ export declare const ALL_TASK_LIST_TABS: readonly ["live", "archived", "deleted", "snoozed"];
7
+ export declare const toTaskListTabType: (v: string) => "deleted" | "live" | "archived" | "snoozed";
8
+ export type TaskListTab = (typeof ALL_TASK_LIST_TABS)[number];
9
+ export interface TaskListTabData {
10
+ taskIds: ID[];
11
+ taskIdsByAssignees: Record<ID, ID[]>;
12
+ taskIdsByDueDate: Record<DueDateGroupKey, ID[]>;
13
+ taskIdsByGroupsIds: Record<ID, ID[]>;
14
+ taskIdsByPriority: Record<PriorityCodeType, ID[]>;
15
+ taskIdsByStatus: Record<TaskStatusCodeType, ID[]>;
16
+ taskIdsByTags: Record<ID, ID[]>;
17
+ }
6
18
  export interface TaskListLocalData {
7
19
  defaultTaskGroupId: ID | null;
8
20
  existingTaskGroupNamesByGroupId: Record<ID, string>;
@@ -13,6 +25,8 @@ export declare const DUE_DATE_GROUP_KEYS: readonly ["overdue", "today", "this_we
13
25
  export declare const toDueDateGroupKeyType: (v: string) => "overdue" | "today" | "this_week" | "this_month" | "upcoming";
14
26
  export declare type DueDateGroupKey = ReturnType<typeof toDueDateGroupKeyType>;
15
27
  export interface TaskListState extends FetchedState {
28
+ byTab: Record<TaskListTab, TaskListTabData>;
29
+ currentTab: TaskListTab;
16
30
  filters: TaskListFilters;
17
31
  localData: TaskListLocalData;
18
32
  taskIds: ID[];
@@ -45,7 +59,7 @@ export interface TaskListUIState extends SpendManagementUIState {
45
59
  searchText: string;
46
60
  sortKey: TaskListViewSortKey;
47
61
  }
48
- declare const toTaskListSortKeyType: (v: string) => "status" | "name" | "dueDate" | "tag" | "priority" | "timeSpent" | "assignee" | "creationDate";
62
+ declare const toTaskListSortKeyType: (v: string) => "status" | "name" | "dueDate" | "tag" | "priority" | "timeSpent" | "assignee" | "creationDate" | "visibility";
49
63
  export declare type TaskListViewSortKey = ReturnType<typeof toTaskListSortKeyType>;
50
64
  export declare const TASK_LIST_FILTER_CATEGORIES: TaskListFilterCategoryOption[];
51
65
  interface TaskListFilterCategoryOption {
@@ -1,7 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TASK_LIST_GROUP_BY_CATEGORIES = exports.TASK_LIST_FILTER_CATEGORIES = exports.toTaskListGroupByKeyTypeStrict = exports.toTaskListGroupByKeyType = exports.TASK_LIST_GROUP_BY_KEYS = exports.toDueDateGroupKeyType = exports.DUE_DATE_GROUP_KEYS = void 0;
3
+ exports.TASK_LIST_GROUP_BY_CATEGORIES = exports.TASK_LIST_FILTER_CATEGORIES = exports.toTaskListGroupByKeyTypeStrict = exports.toTaskListGroupByKeyType = exports.TASK_LIST_GROUP_BY_KEYS = exports.toDueDateGroupKeyType = exports.DUE_DATE_GROUP_KEYS = exports.toTaskListTabType = exports.ALL_TASK_LIST_TABS = void 0;
4
4
  const stringToUnion_1 = require("../../../commonStateTypes/stringToUnion");
5
+ exports.ALL_TASK_LIST_TABS = [
6
+ 'live',
7
+ 'archived',
8
+ 'deleted',
9
+ 'snoozed',
10
+ ];
11
+ const toTaskListTabType = (v) => (0, stringToUnion_1.stringToUnion)(v, exports.ALL_TASK_LIST_TABS);
12
+ exports.toTaskListTabType = toTaskListTabType;
5
13
  exports.DUE_DATE_GROUP_KEYS = [
6
14
  'overdue',
7
15
  'today',
@@ -32,6 +40,7 @@ const ALL_TASK_LIST_SORT_KEYS = [
32
40
  'status',
33
41
  'priority',
34
42
  'timeSpent',
43
+ 'visibility',
35
44
  ];
36
45
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
37
46
  const toTaskListSortKeyType = (v) => (0, stringToUnion_1.stringToUnion)(v, ALL_TASK_LIST_SORT_KEYS);
@@ -1,6 +1,9 @@
1
1
  import { TaskPayload } from '../../../entity/task/taskPayload';
2
2
  import { ZeniAPIResponse } from '../../../responsePayload';
3
3
  interface FetchTaskListPayload {
4
+ archived: TaskPayload[];
5
+ deleted: TaskPayload[];
6
+ snoozed: TaskPayload[];
4
7
  tasks: TaskPayload[];
5
8
  }
6
9
  export type FetchTaskListResponse = ZeniAPIResponse<FetchTaskListPayload>;
@@ -12,7 +12,10 @@ export declare const fetchTaskListPage: import("@reduxjs/toolkit").ActionCreator
12
12
  }, "taskList/fetchTaskListPage", never, never>, fetchTaskList: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"taskList/fetchTaskList">, updateTaskList: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
13
13
  data: TaskPayload[];
14
14
  updateType: UpdateType;
15
- }, "taskList/updateTaskList">, updateTaskListFetchStatus: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
15
+ archived?: TaskPayload[];
16
+ deleted?: TaskPayload[];
17
+ snoozed?: TaskPayload[];
18
+ }, "taskList/updateTaskList">, updateTaskListTab: import("@reduxjs/toolkit").ActionCreatorWithPayload<"deleted" | "live" | "archived" | "snoozed", "taskList/updateTaskListTab">, updateTaskListFetchStatus: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
16
19
  fetchState: FetchState;
17
20
  error?: ZeniAPIStatus;
18
21
  }, "taskList/updateTaskListFetchStatus">, updateTaskListSearchText: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
@@ -23,10 +26,10 @@ export declare const fetchTaskListPage: import("@reduxjs/toolkit").ActionCreator
23
26
  filters: TaskListFilters;
24
27
  }, "taskList/updateTaskFilters">, updateTaskListOnNewGroupCreationSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
25
28
  newTaskGroup: TaskGroupPayload;
26
- }, "taskList/updateTaskListOnNewGroupCreationSuccess">, bulkUpdateTaskList: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[taskIds: string[], groupId: string, updates: Partial<Task>], {
29
+ }, "taskList/updateTaskListOnNewGroupCreationSuccess">, bulkUpdateTaskList: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[taskIds: string[], groupId: string | null, updates: Partial<Task>], {
27
30
  taskIds: string[];
28
31
  updates: Partial<Task>;
29
- groupId: string;
32
+ groupId: string | null;
30
33
  }, "taskList/bulkUpdateTaskList", never, never>, updateTasksListOnBulkUpdateTasksSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
31
34
  groupId: ID | null;
32
35
  taskIds: ID[];
@@ -55,6 +58,6 @@ export declare const fetchTaskListPage: import("@reduxjs/toolkit").ActionCreator
55
58
  error: ZeniAPIStatus;
56
59
  }, "taskList/updateTasksListOnUpdateTaskFailure">, updateTaskListOnCreateTaskFromTemplateSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
57
60
  tasks: TaskPayload[];
58
- }, "taskList/updateTaskListOnCreateTaskFromTemplateSuccess">, clearTaskList: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"taskList/clearTaskList">;
61
+ }, "taskList/updateTaskListOnCreateTaskFromTemplateSuccess">, removeTaskFromList: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "taskList/removeTaskFromList">, clearTaskList: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"taskList/clearTaskList">;
59
62
  declare const _default: import("redux").Reducer<TaskListState>;
60
63
  export default _default;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  var _a;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.clearTaskList = exports.updateTaskListOnCreateTaskFromTemplateSuccess = exports.updateTasksListOnUpdateTaskFailure = exports.updateTasksListOnUpdateTaskSuccess = exports.updateTaskFromListView = exports.updateTaskListOnTaskGroupNameUpdate = exports.updateTaskListOnNewTaskCreationSuccess = exports.dragNDropTasks = exports.updateTaskListOnTaskGroupDeletion = exports.updateTaskListLocalData = exports.initiateTaskListLocalData = exports.updateTasksListOnBulkUpdateTasksFailure = exports.updateTasksListOnBulkUpdateTasksSuccess = exports.bulkUpdateTaskList = exports.updateTaskListOnNewGroupCreationSuccess = exports.updateTaskFilters = exports.updateTaskListUIState = exports.updateTaskListSearchText = exports.updateTaskListFetchStatus = exports.updateTaskList = exports.fetchTaskList = exports.fetchTaskListPage = exports.initialState = void 0;
4
+ exports.clearTaskList = exports.removeTaskFromList = exports.updateTaskListOnCreateTaskFromTemplateSuccess = exports.updateTasksListOnUpdateTaskFailure = exports.updateTasksListOnUpdateTaskSuccess = exports.updateTaskFromListView = exports.updateTaskListOnTaskGroupNameUpdate = exports.updateTaskListOnNewTaskCreationSuccess = exports.dragNDropTasks = exports.updateTaskListOnTaskGroupDeletion = exports.updateTaskListLocalData = exports.initiateTaskListLocalData = exports.updateTasksListOnBulkUpdateTasksFailure = exports.updateTasksListOnBulkUpdateTasksSuccess = exports.bulkUpdateTaskList = exports.updateTaskListOnNewGroupCreationSuccess = exports.updateTaskFilters = exports.updateTaskListUIState = exports.updateTaskListSearchText = exports.updateTaskListFetchStatus = exports.updateTaskListTab = exports.updateTaskList = exports.fetchTaskList = exports.fetchTaskListPage = exports.initialState = void 0;
5
5
  const toolkit_1 = require("@reduxjs/toolkit");
6
6
  const taskState_1 = require("../../../entity/task/taskState");
7
7
  const zeniDayJS_1 = require("../../../zeniDayJS");
@@ -33,7 +33,23 @@ const initialTaskIdsByDueDate = {
33
33
  today: [],
34
34
  upcoming: [],
35
35
  };
36
+ const initialTabData = {
37
+ taskIds: [],
38
+ taskIdsByAssignees: {},
39
+ taskIdsByDueDate: { ...initialTaskIdsByDueDate },
40
+ taskIdsByGroupsIds: {},
41
+ taskIdsByPriority: { ...initialTaskIdsByPriority },
42
+ taskIdsByStatus: { ...initialTaskIdsByStatus },
43
+ taskIdsByTags: {},
44
+ };
36
45
  exports.initialState = {
46
+ currentTab: 'live',
47
+ byTab: {
48
+ live: { ...initialTabData },
49
+ archived: { ...initialTabData },
50
+ deleted: { ...initialTabData },
51
+ snoozed: { ...initialTabData },
52
+ },
37
53
  taskIds: [],
38
54
  taskIdsByGroupsIds: {},
39
55
  taskIdsByPriority: initialTaskIdsByPriority,
@@ -90,17 +106,30 @@ const taskList = (0, toolkit_1.createSlice)({
90
106
  draft.error = undefined;
91
107
  },
92
108
  updateTaskList(draft, action) {
93
- const { data } = action.payload;
109
+ const { data, archived, deleted, snoozed } = action.payload;
94
110
  draft.fetchState = 'Completed';
95
111
  draft.error = undefined;
96
- const { taskIds, taskIdsGroupedByPriority, taskIdsByGroupIds, taskIdsGroupedByStatus, taskIdsByAssignees, taskIdsByDueDate, taskIdsByTags, } = getGroupedTaskIds(data);
97
- draft.taskIds = taskIds;
98
- draft.taskIdsByGroupsIds = taskIdsByGroupIds;
99
- draft.taskIdsByPriority = taskIdsGroupedByPriority;
100
- draft.taskIdsByStatus = taskIdsGroupedByStatus;
101
- draft.taskIdsByAssignees = taskIdsByAssignees;
102
- draft.taskIdsByDueDate = taskIdsByDueDate;
103
- draft.taskIdsByTags = taskIdsByTags;
112
+ // Group live tasks
113
+ const liveGrouped = getGroupedTaskIds(data);
114
+ draft.byTab.live = toTabData(liveGrouped);
115
+ // Group other tabs if provided
116
+ if (archived != null) {
117
+ draft.byTab.archived = toTabData(getGroupedTaskIds(archived));
118
+ }
119
+ if (deleted != null) {
120
+ draft.byTab.deleted = toTabData(getGroupedTaskIds(deleted));
121
+ }
122
+ if (snoozed != null) {
123
+ draft.byTab.snoozed = toTabData(getGroupedTaskIds(snoozed));
124
+ }
125
+ // Copy active tab data to top-level fields
126
+ const activeTabData = draft.byTab[draft.currentTab];
127
+ copyTabDataToTopLevel(draft, activeTabData);
128
+ },
129
+ updateTaskListTab(draft, action) {
130
+ draft.currentTab = action.payload;
131
+ const activeTabData = draft.byTab[action.payload];
132
+ copyTabDataToTopLevel(draft, activeTabData);
104
133
  },
105
134
  initiateTaskListLocalData(draft, action) {
106
135
  const { taskGroupById } = action.payload;
@@ -191,7 +220,12 @@ const taskList = (0, toolkit_1.createSlice)({
191
220
  const { taskIds, groupId } = action.payload;
192
221
  draft.updateTasksFetchState.fetchState = 'Completed';
193
222
  draft.updateTasksFetchState.error = undefined;
194
- if (groupId != null) {
223
+ if (groupId == null) {
224
+ // Tab-changing operations (archive/delete/unarchive/undo-delete/unsnooze):
225
+ // Remove affected tasks from the current tab's top-level indices
226
+ removeTaskIdsFromTopLevel(draft, taskIds);
227
+ }
228
+ else if (groupId != null) {
195
229
  const { groupByKey } = draft.uiState;
196
230
  if (groupByKey === 'groupName') {
197
231
  Object.keys(draft.taskIdsByGroupsIds).forEach((gId) => {
@@ -408,12 +442,34 @@ const taskList = (0, toolkit_1.createSlice)({
408
442
  draft.updateTasksFetchState.fetchState = 'Error';
409
443
  draft.updateTasksFetchState.error = action.payload.error;
410
444
  },
445
+ removeTaskFromList(draft, action) {
446
+ const taskIdToRemove = action.payload;
447
+ draft.taskIds = draft.taskIds.filter((id) => id !== taskIdToRemove);
448
+ Object.keys(draft.taskIdsByGroupsIds).forEach((groupId) => {
449
+ draft.taskIdsByGroupsIds[groupId] = draft.taskIdsByGroupsIds[groupId].filter((id) => id !== taskIdToRemove);
450
+ });
451
+ Object.keys(draft.taskIdsByPriority).forEach((key) => {
452
+ draft.taskIdsByPriority[key] = draft.taskIdsByPriority[key].filter((id) => id !== taskIdToRemove);
453
+ });
454
+ Object.keys(draft.taskIdsByStatus).forEach((key) => {
455
+ draft.taskIdsByStatus[key] = draft.taskIdsByStatus[key].filter((id) => id !== taskIdToRemove);
456
+ });
457
+ Object.keys(draft.taskIdsByDueDate).forEach((key) => {
458
+ draft.taskIdsByDueDate[key] = draft.taskIdsByDueDate[key].filter((id) => id !== taskIdToRemove);
459
+ });
460
+ Object.keys(draft.taskIdsByAssignees).forEach((key) => {
461
+ draft.taskIdsByAssignees[key] = draft.taskIdsByAssignees[key].filter((id) => id !== taskIdToRemove);
462
+ });
463
+ Object.keys(draft.taskIdsByTags).forEach((key) => {
464
+ draft.taskIdsByTags[key] = draft.taskIdsByTags[key].filter((id) => id !== taskIdToRemove);
465
+ });
466
+ },
411
467
  clearTaskList(draft) {
412
468
  Object.assign(draft, exports.initialState);
413
469
  },
414
470
  },
415
471
  });
416
- _a = taskList.actions, exports.fetchTaskListPage = _a.fetchTaskListPage, exports.fetchTaskList = _a.fetchTaskList, exports.updateTaskList = _a.updateTaskList, exports.updateTaskListFetchStatus = _a.updateTaskListFetchStatus, exports.updateTaskListSearchText = _a.updateTaskListSearchText, exports.updateTaskListUIState = _a.updateTaskListUIState, exports.updateTaskFilters = _a.updateTaskFilters, exports.updateTaskListOnNewGroupCreationSuccess = _a.updateTaskListOnNewGroupCreationSuccess, exports.bulkUpdateTaskList = _a.bulkUpdateTaskList, exports.updateTasksListOnBulkUpdateTasksSuccess = _a.updateTasksListOnBulkUpdateTasksSuccess, exports.updateTasksListOnBulkUpdateTasksFailure = _a.updateTasksListOnBulkUpdateTasksFailure, exports.initiateTaskListLocalData = _a.initiateTaskListLocalData, exports.updateTaskListLocalData = _a.updateTaskListLocalData, exports.updateTaskListOnTaskGroupDeletion = _a.updateTaskListOnTaskGroupDeletion, exports.dragNDropTasks = _a.dragNDropTasks, exports.updateTaskListOnNewTaskCreationSuccess = _a.updateTaskListOnNewTaskCreationSuccess, exports.updateTaskListOnTaskGroupNameUpdate = _a.updateTaskListOnTaskGroupNameUpdate, exports.updateTaskFromListView = _a.updateTaskFromListView, exports.updateTasksListOnUpdateTaskSuccess = _a.updateTasksListOnUpdateTaskSuccess, exports.updateTasksListOnUpdateTaskFailure = _a.updateTasksListOnUpdateTaskFailure, exports.updateTaskListOnCreateTaskFromTemplateSuccess = _a.updateTaskListOnCreateTaskFromTemplateSuccess, exports.clearTaskList = _a.clearTaskList;
472
+ _a = taskList.actions, exports.fetchTaskListPage = _a.fetchTaskListPage, exports.fetchTaskList = _a.fetchTaskList, exports.updateTaskList = _a.updateTaskList, exports.updateTaskListTab = _a.updateTaskListTab, exports.updateTaskListFetchStatus = _a.updateTaskListFetchStatus, exports.updateTaskListSearchText = _a.updateTaskListSearchText, exports.updateTaskListUIState = _a.updateTaskListUIState, exports.updateTaskFilters = _a.updateTaskFilters, exports.updateTaskListOnNewGroupCreationSuccess = _a.updateTaskListOnNewGroupCreationSuccess, exports.bulkUpdateTaskList = _a.bulkUpdateTaskList, exports.updateTasksListOnBulkUpdateTasksSuccess = _a.updateTasksListOnBulkUpdateTasksSuccess, exports.updateTasksListOnBulkUpdateTasksFailure = _a.updateTasksListOnBulkUpdateTasksFailure, exports.initiateTaskListLocalData = _a.initiateTaskListLocalData, exports.updateTaskListLocalData = _a.updateTaskListLocalData, exports.updateTaskListOnTaskGroupDeletion = _a.updateTaskListOnTaskGroupDeletion, exports.dragNDropTasks = _a.dragNDropTasks, exports.updateTaskListOnNewTaskCreationSuccess = _a.updateTaskListOnNewTaskCreationSuccess, exports.updateTaskListOnTaskGroupNameUpdate = _a.updateTaskListOnTaskGroupNameUpdate, exports.updateTaskFromListView = _a.updateTaskFromListView, exports.updateTasksListOnUpdateTaskSuccess = _a.updateTasksListOnUpdateTaskSuccess, exports.updateTasksListOnUpdateTaskFailure = _a.updateTasksListOnUpdateTaskFailure, exports.updateTaskListOnCreateTaskFromTemplateSuccess = _a.updateTaskListOnCreateTaskFromTemplateSuccess, exports.removeTaskFromList = _a.removeTaskFromList, exports.clearTaskList = _a.clearTaskList;
417
473
  exports.default = taskList.reducer;
418
474
  /**
419
475
  * helpers
@@ -492,6 +548,46 @@ const getTagsGroupKey = (tags) => {
492
548
  tagIds.sort();
493
549
  return tagIds.join(',');
494
550
  };
551
+ const removeTaskIdsFromTopLevel = (draft, taskIds) => {
552
+ const isRemoved = (id) => taskIds.includes(id);
553
+ draft.taskIds = draft.taskIds.filter((id) => !isRemoved(id));
554
+ Object.keys(draft.taskIdsByGroupsIds).forEach((gId) => {
555
+ draft.taskIdsByGroupsIds[gId] = draft.taskIdsByGroupsIds[gId].filter((id) => !isRemoved(id));
556
+ });
557
+ Object.keys(draft.taskIdsByPriority).forEach((key) => {
558
+ draft.taskIdsByPriority[key] = draft.taskIdsByPriority[key].filter((id) => !isRemoved(id));
559
+ });
560
+ Object.keys(draft.taskIdsByStatus).forEach((key) => {
561
+ draft.taskIdsByStatus[key] = draft.taskIdsByStatus[key].filter((id) => !isRemoved(id));
562
+ });
563
+ Object.keys(draft.taskIdsByDueDate).forEach((key) => {
564
+ draft.taskIdsByDueDate[key] = draft.taskIdsByDueDate[key].filter((id) => !isRemoved(id));
565
+ });
566
+ Object.keys(draft.taskIdsByAssignees).forEach((key) => {
567
+ draft.taskIdsByAssignees[key] = draft.taskIdsByAssignees[key].filter((id) => !isRemoved(id));
568
+ });
569
+ Object.keys(draft.taskIdsByTags).forEach((key) => {
570
+ draft.taskIdsByTags[key] = draft.taskIdsByTags[key].filter((id) => !isRemoved(id));
571
+ });
572
+ };
573
+ const toTabData = (grouped) => ({
574
+ taskIds: grouped.taskIds,
575
+ taskIdsByAssignees: grouped.taskIdsByAssignees,
576
+ taskIdsByDueDate: grouped.taskIdsByDueDate,
577
+ taskIdsByGroupsIds: grouped.taskIdsByGroupIds,
578
+ taskIdsByPriority: grouped.taskIdsGroupedByPriority,
579
+ taskIdsByStatus: grouped.taskIdsGroupedByStatus,
580
+ taskIdsByTags: grouped.taskIdsByTags,
581
+ });
582
+ const copyTabDataToTopLevel = (draft, tabData) => {
583
+ draft.taskIds = tabData.taskIds;
584
+ draft.taskIdsByGroupsIds = tabData.taskIdsByGroupsIds;
585
+ draft.taskIdsByPriority = tabData.taskIdsByPriority;
586
+ draft.taskIdsByStatus = tabData.taskIdsByStatus;
587
+ draft.taskIdsByAssignees = tabData.taskIdsByAssignees;
588
+ draft.taskIdsByDueDate = tabData.taskIdsByDueDate;
589
+ draft.taskIdsByTags = tabData.taskIdsByTags;
590
+ };
495
591
  const getGroupedTaskIds = (tasks) => {
496
592
  const taskIds = [];
497
593
  const taskIdsByGroupIds = {};
@@ -5,14 +5,16 @@ import { TagState } from '../../../entity/tag/tagState';
5
5
  import { Task, TaskState } from '../../../entity/task/taskState';
6
6
  import { TaskGroupTemplate } from '../../../entity/taskGroupTemplate/taskGroupTemplateState';
7
7
  import { UserState } from '../../../entity/user/userState';
8
+ import { UserGroupsState } from '../../../entity/userGroups/userGroupsState';
8
9
  import { UserRoleState } from '../../../entity/userRole/userRoleState';
9
10
  import { RootState } from '../../../reducer';
10
11
  import { UserAndRole } from '../../companyView/types/userAndRole';
11
12
  import { UserGroupListSelectorView } from '../../userGroupListView/userGroupListViewSelector';
12
13
  import { UserListSelectorView } from '../../userListView/userListViewSelector';
13
- import { TaskListFilters, TaskListLocalData, TaskListState, TaskListUIState } from './taskList';
14
+ import { TaskListFilters, TaskListLocalData, TaskListState, TaskListTab, TaskListUIState } from './taskList';
14
15
  export interface TaskWithUserDetails extends Task {
15
16
  assigneeUsers: UserAndRole[];
17
+ firstAssigneeSortName: string;
16
18
  }
17
19
  export interface TaskGroupWithTasksList {
18
20
  groupName: string;
@@ -21,6 +23,7 @@ export interface TaskGroupWithTasksList {
21
23
  tasks: TaskWithUserDetails[];
22
24
  }
23
25
  export interface TaskListSelectorView extends SelectorView {
26
+ currentTab: TaskListTab;
24
27
  filters: TaskListFilters;
25
28
  localData: TaskListLocalData;
26
29
  taskCreationFromTemplateStatus: FetchStateAndError;
@@ -34,11 +37,12 @@ export interface TaskListSelectorView extends SelectorView {
34
37
  userGroupList: UserGroupListSelectorView;
35
38
  userList: UserListSelectorView;
36
39
  }
37
- export declare const getTaskListGroupedByAssignees: ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }: {
40
+ export declare const getTaskListGroupedByAssignees: ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }: {
38
41
  addressState: AddressState;
39
42
  tagState: TagState;
40
43
  taskListState: TaskListState;
41
44
  taskState: TaskState;
45
+ userGroupsState: UserGroupsState;
42
46
  userRoleState: UserRoleState;
43
47
  userState: UserState;
44
48
  }) => {
@@ -47,11 +51,12 @@ export declare const getTaskListGroupedByAssignees: ({ taskListState, taskState,
47
51
  isDefault: boolean;
48
52
  tasks: TaskWithUserDetails[];
49
53
  }[];
50
- export declare const getTaskListGroupedByPriority: ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }: {
54
+ export declare const getTaskListGroupedByPriority: ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }: {
51
55
  addressState: AddressState;
52
56
  tagState: TagState;
53
57
  taskListState: TaskListState;
54
58
  taskState: TaskState;
59
+ userGroupsState: UserGroupsState;
55
60
  userRoleState: UserRoleState;
56
61
  userState: UserState;
57
62
  }) => {