@zeniai/client-epic-state 5.0.32 → 5.0.33-betaRR0

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 (112) hide show
  1. package/lib/commonStateTypes/fiscalYearHelpers/formatZeniDateFY.d.ts +1 -0
  2. package/lib/commonStateTypes/fiscalYearHelpers/formatZeniDateFY.js +2 -1
  3. package/lib/entity/file/fileState.d.ts +4 -4
  4. package/lib/entity/file/fileState.js +4 -0
  5. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  6. package/lib/entity/snackbar/snackbarTypes.js +4 -0
  7. package/lib/entity/task/taskPayload.d.ts +3 -0
  8. package/lib/entity/task/taskPayload.js +5 -0
  9. package/lib/entity/task/taskState.d.ts +3 -0
  10. package/lib/entity/tenant/clearAllEpic.d.ts +4 -2
  11. package/lib/entity/tenant/clearAllEpic.js +4 -0
  12. package/lib/entity/transaction/stateTypes/attachment.d.ts +2 -2
  13. package/lib/epic.d.ts +7 -1
  14. package/lib/epic.js +7 -1
  15. package/lib/esm/commonStateTypes/fiscalYearHelpers/formatZeniDateFY.js +1 -0
  16. package/lib/esm/entity/file/fileState.js +4 -0
  17. package/lib/esm/entity/snackbar/snackbarTypes.js +4 -0
  18. package/lib/esm/entity/task/taskPayload.js +5 -0
  19. package/lib/esm/entity/tenant/clearAllEpic.js +4 -0
  20. package/lib/esm/epic.js +7 -1
  21. package/lib/esm/index.js +10 -4
  22. package/lib/esm/init.js +24 -4
  23. package/lib/esm/reducer.js +6 -0
  24. package/lib/esm/view/taskManager/cannedResponsesView/cannedResponses.js +1 -0
  25. package/lib/esm/view/taskManager/cannedResponsesView/cannedResponsesPayload.js +12 -0
  26. package/lib/esm/view/taskManager/cannedResponsesView/cannedResponsesReducer.js +64 -0
  27. package/lib/esm/view/taskManager/cannedResponsesView/cannedResponsesSelector.js +3 -0
  28. package/lib/esm/view/taskManager/cannedResponsesView/epics/deleteCannedResponseEpic.js +17 -0
  29. package/lib/esm/view/taskManager/cannedResponsesView/epics/fetchCannedResponsesEpic.js +21 -0
  30. package/lib/esm/view/taskManager/cannedResponsesView/epics/saveCannedResponseEpic.js +29 -0
  31. package/lib/esm/view/taskManager/taskDetailView/epics/archiveTaskEpic.js +3 -0
  32. package/lib/esm/view/taskManager/taskDetailView/epics/deleteTaskEpic.js +5 -0
  33. package/lib/esm/view/taskManager/taskDetailView/epics/initializeTaskToLocalStoreEpic.js +1 -0
  34. package/lib/esm/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +1 -0
  35. package/lib/esm/view/taskManager/taskDetailView/epics/snoozeTaskEpic.js +66 -0
  36. package/lib/esm/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.js +57 -0
  37. package/lib/esm/view/taskManager/taskDetailView/taskDetail.js +4 -0
  38. package/lib/esm/view/taskManager/taskDetailView/taskDetailReducer.js +60 -7
  39. package/lib/esm/view/taskManager/taskDetailView/taskDetailSelector.js +12 -0
  40. package/lib/esm/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.js +56 -21
  41. package/lib/esm/view/taskManager/taskListView/epics/dragNDropTasksEpic.js +1 -0
  42. package/lib/esm/view/taskManager/taskListView/epics/fetchTaskListEpic.js +13 -4
  43. package/lib/esm/view/taskManager/taskListView/epics/updateTaskFromListViewEpic.js +3 -2
  44. package/lib/esm/view/taskManager/taskListView/taskList.js +7 -0
  45. package/lib/esm/view/taskManager/taskListView/taskListReducer.js +106 -12
  46. package/lib/esm/view/taskManager/taskListView/taskListSelector.js +48 -39
  47. package/lib/esm/view/zeniOAuthView/epics/approveOAuthConsentEpic.js +64 -0
  48. package/lib/esm/view/zeniOAuthView/zeniOAuthParamsParser.js +41 -0
  49. package/lib/esm/view/zeniOAuthView/zeniOAuthReducer.js +49 -0
  50. package/lib/esm/view/zeniOAuthView/zeniOAuthSelector.js +3 -0
  51. package/lib/esm/view/zeniOAuthView/zeniOAuthState.js +1 -0
  52. package/lib/index.d.ts +12 -4
  53. package/lib/index.js +28 -5
  54. package/lib/init.d.ts +5 -3
  55. package/lib/init.js +24 -4
  56. package/lib/reducer.d.ts +6 -0
  57. package/lib/reducer.js +6 -0
  58. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  59. package/lib/view/taskManager/cannedResponsesView/cannedResponses.d.ts +19 -0
  60. package/lib/view/taskManager/cannedResponsesView/cannedResponses.js +2 -0
  61. package/lib/view/taskManager/cannedResponsesView/cannedResponsesPayload.d.ts +21 -0
  62. package/lib/view/taskManager/cannedResponsesView/cannedResponsesPayload.js +15 -0
  63. package/lib/view/taskManager/cannedResponsesView/cannedResponsesReducer.d.ts +30 -0
  64. package/lib/view/taskManager/cannedResponsesView/cannedResponsesReducer.js +68 -0
  65. package/lib/view/taskManager/cannedResponsesView/cannedResponsesSelector.d.ts +3 -0
  66. package/lib/view/taskManager/cannedResponsesView/cannedResponsesSelector.js +6 -0
  67. package/lib/view/taskManager/cannedResponsesView/epics/deleteCannedResponseEpic.d.ts +7 -0
  68. package/lib/view/taskManager/cannedResponsesView/epics/deleteCannedResponseEpic.js +21 -0
  69. package/lib/view/taskManager/cannedResponsesView/epics/fetchCannedResponsesEpic.d.ts +7 -0
  70. package/lib/view/taskManager/cannedResponsesView/epics/fetchCannedResponsesEpic.js +25 -0
  71. package/lib/view/taskManager/cannedResponsesView/epics/saveCannedResponseEpic.d.ts +7 -0
  72. package/lib/view/taskManager/cannedResponsesView/epics/saveCannedResponseEpic.js +33 -0
  73. package/lib/view/taskManager/taskDetailView/epics/archiveTaskEpic.d.ts +2 -1
  74. package/lib/view/taskManager/taskDetailView/epics/archiveTaskEpic.js +3 -0
  75. package/lib/view/taskManager/taskDetailView/epics/deleteTaskEpic.d.ts +2 -1
  76. package/lib/view/taskManager/taskDetailView/epics/deleteTaskEpic.js +5 -0
  77. package/lib/view/taskManager/taskDetailView/epics/initializeTaskToLocalStoreEpic.js +1 -0
  78. package/lib/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +1 -0
  79. package/lib/view/taskManager/taskDetailView/epics/snoozeTaskEpic.d.ts +9 -0
  80. package/lib/view/taskManager/taskDetailView/epics/snoozeTaskEpic.js +70 -0
  81. package/lib/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.d.ts +9 -0
  82. package/lib/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.js +61 -0
  83. package/lib/view/taskManager/taskDetailView/taskDetail.d.ts +2 -0
  84. package/lib/view/taskManager/taskDetailView/taskDetail.js +4 -0
  85. package/lib/view/taskManager/taskDetailView/taskDetailReducer.d.ts +10 -1
  86. package/lib/view/taskManager/taskDetailView/taskDetailReducer.js +61 -8
  87. package/lib/view/taskManager/taskDetailView/taskDetailSelector.d.ts +5 -0
  88. package/lib/view/taskManager/taskDetailView/taskDetailSelector.js +12 -0
  89. package/lib/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.d.ts +6 -7
  90. package/lib/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.js +56 -22
  91. package/lib/view/taskManager/taskListView/epics/dragNDropTasksEpic.js +1 -0
  92. package/lib/view/taskManager/taskListView/epics/fetchTaskListEpic.js +13 -4
  93. package/lib/view/taskManager/taskListView/epics/updateTaskFromListViewEpic.js +3 -2
  94. package/lib/view/taskManager/taskListView/taskList.d.ts +14 -1
  95. package/lib/view/taskManager/taskListView/taskList.js +8 -1
  96. package/lib/view/taskManager/taskListView/taskListPayload.d.ts +3 -0
  97. package/lib/view/taskManager/taskListView/taskListReducer.d.ts +9 -6
  98. package/lib/view/taskManager/taskListView/taskListReducer.js +107 -13
  99. package/lib/view/taskManager/taskListView/taskListSelector.d.ts +9 -3
  100. package/lib/view/taskManager/taskListView/taskListSelector.js +48 -39
  101. package/lib/view/zeniOAuthView/epics/approveOAuthConsentEpic.d.ts +27 -0
  102. package/lib/view/zeniOAuthView/epics/approveOAuthConsentEpic.js +68 -0
  103. package/lib/view/zeniOAuthView/zeniOAuthParamsParser.d.ts +16 -0
  104. package/lib/view/zeniOAuthView/zeniOAuthParamsParser.js +44 -0
  105. package/lib/view/zeniOAuthView/zeniOAuthReducer.d.ts +29 -0
  106. package/lib/view/zeniOAuthView/zeniOAuthReducer.js +53 -0
  107. package/lib/view/zeniOAuthView/zeniOAuthSelector.d.ts +5 -0
  108. package/lib/view/zeniOAuthView/zeniOAuthSelector.js +9 -0
  109. package/lib/view/zeniOAuthView/zeniOAuthState.d.ts +4 -0
  110. package/lib/view/zeniOAuthView/zeniOAuthState.js +2 -0
  111. package/package.json +1 -1
  112. package/lib/tsconfig.typecheck.tsbuildinfo +0 -1
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.getAllTasks = exports.getTaskListGroupedByPriority = exports.getTaskListGroupedByAssignees = void 0;
7
7
  const toolkit_1 = require("@reduxjs/toolkit");
8
- const isEqual_1 = __importDefault(require("lodash/isEqual"));
9
8
  const orderBy_1 = __importDefault(require("lodash/orderBy"));
10
9
  const sortOrderPayload_1 = require("../../../commonPayloadTypes/sortOrderPayload");
11
10
  const reduceFetchState_1 = require("../../../commonStateTypes/reduceFetchState");
@@ -21,11 +20,6 @@ const userGroupListViewSelector_1 = require("../../userGroupListView/userGroupLi
21
20
  const userListViewSelector_1 = require("../../userListView/userListViewSelector");
22
21
  const taskDetailSelector_1 = require("../taskDetailView/taskDetailSelector");
23
22
  const taskList_1 = require("./taskList");
24
- const taskListReducer_1 = require("./taskListReducer");
25
- const isDefaultFilters = (taskListState) => {
26
- return ((0, isEqual_1.default)(taskListState.filters, taskListReducer_1.initialState.filters) &&
27
- taskListReducer_1.initialState.uiState.searchText === taskListState.uiState.searchText);
28
- };
29
23
  const sortTasksList = (tagState, tasksList, sortKey, sortOrder) => {
30
24
  const tasksInOrder = (0, orderBy_1.default)(tasksList, (task) => {
31
25
  const tagsByIds = (0, tagSelector_1.getTagsByIds)(tagState, task.tagIds);
@@ -40,8 +34,12 @@ const sortTasksList = (tagState, tasksList, sortKey, sortOrder) => {
40
34
  return task.status.name;
41
35
  case 'priority':
42
36
  return taskState_1.ALL_PRIORITY_CODE.indexOf(task.priority.code);
37
+ case 'assignee':
38
+ return task.firstAssigneeSortName;
43
39
  case 'timeSpent':
44
40
  return task.timeSpent;
41
+ case 'visibility':
42
+ return task.isPrivate === true ? 1 : 0;
45
43
  case 'name':
46
44
  default:
47
45
  return task.name.toLowerCase();
@@ -49,7 +47,7 @@ const sortTasksList = (tagState, tasksList, sortKey, sortOrder) => {
49
47
  }, sortOrder);
50
48
  return tasksInOrder;
51
49
  };
52
- const getTasksWithUserDetails = ({ taskListState, taskState, userState, userRoleState, addressState, taskIds, tagState, }) => {
50
+ const getTasksWithUserDetails = ({ taskListState, taskState, userState, userRoleState, addressState, taskIds, tagState, userGroupsState, }) => {
53
51
  const { sortKey, searchText } = taskListState.uiState;
54
52
  const sortOrder = (0, sortOrderPayload_1.getSortOrder)(taskListState.uiState.sortOrder);
55
53
  const tasks = taskIds
@@ -59,7 +57,15 @@ const getTasksWithUserDetails = ({ taskListState, taskState, userState, userRole
59
57
  const assigneeUsers = task.assignees
60
58
  .map((userId) => (0, userAndRole_1.getUserAndUserRole)(userState, userRoleState, addressState, userId))
61
59
  .filter((value) => value != null);
62
- return { ...task, assigneeUsers };
60
+ const firstUser = assigneeUsers[0]?.user;
61
+ const firstUserName = (firstUser != null ? (0, userSelector_1.getUserName)(firstUser) : '') ||
62
+ firstUser?.email ||
63
+ '';
64
+ const firstGroupName = task.groupAssignees
65
+ .map((gId) => userGroupsState.userGroupByUserGroupId[gId]?.name)
66
+ .find((name) => name != null && name !== '');
67
+ const firstAssigneeSortName = (firstUserName !== '' ? firstUserName : (firstGroupName ?? '')).toLowerCase();
68
+ return { ...task, assigneeUsers, firstAssigneeSortName };
63
69
  }
64
70
  return undefined;
65
71
  })
@@ -68,7 +74,7 @@ const getTasksWithUserDetails = ({ taskListState, taskState, userState, userRole
68
74
  const sortedTaskList = sortTasksList(tagState, filteredTaskList, sortKey, sortOrder);
69
75
  return sortedTaskList;
70
76
  };
71
- const getTaskListGroupedByGroupName = ({ taskListState, taskState, taskGroupState, taskGroupViewState, userState, userRoleState, addressState, tagState, }) => {
77
+ const getTaskListGroupedByGroupName = ({ taskListState, taskState, taskGroupState, taskGroupViewState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
72
78
  const { taskGroupsIds } = taskGroupViewState;
73
79
  const taskGroupsWithTasksList = taskGroupsIds
74
80
  .map((taskGroupId) => {
@@ -82,6 +88,7 @@ const getTaskListGroupedByGroupName = ({ taskListState, taskState, taskGroupStat
82
88
  addressState,
83
89
  taskIds,
84
90
  tagState,
91
+ userGroupsState,
85
92
  });
86
93
  if (taskGroup != null) {
87
94
  return {
@@ -110,12 +117,9 @@ const getTaskListGroupedByGroupName = ({ taskListState, taskState, taskGroupStat
110
117
  if (defaultTaskGroup != null) {
111
118
  sortedTaskGroupsWithTasksList.push(defaultTaskGroup);
112
119
  }
113
- if (isDefaultFilters(taskListState) === false) {
114
- return sortedTaskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
115
- }
116
- return sortedTaskGroupsWithTasksList;
120
+ return sortedTaskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
117
121
  };
118
- const getTaskListGroupedByAssignees = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }) => {
122
+ const getTaskListGroupedByAssignees = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
119
123
  const assigneeGroups = Object.keys(taskListState.taskIdsByAssignees);
120
124
  const taskGroupsWithTasksList = assigneeGroups.map((groupKey) => {
121
125
  const taskIds = taskListState.taskIdsByAssignees[groupKey];
@@ -127,6 +131,7 @@ const getTaskListGroupedByAssignees = ({ taskListState, taskState, userState, us
127
131
  addressState,
128
132
  taskIds,
129
133
  tagState,
134
+ userGroupsState,
130
135
  });
131
136
  const assigneeIds = groupKey.split(',');
132
137
  const groupName = (0, userSelector_1.getUsersByUserIds)(userState, assigneeIds)
@@ -142,13 +147,10 @@ const getTaskListGroupedByAssignees = ({ taskListState, taskState, userState, us
142
147
  tasks: tasksWithUserDetails,
143
148
  };
144
149
  });
145
- if (isDefaultFilters(taskListState) === false) {
146
- return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
147
- }
148
- return taskGroupsWithTasksList;
150
+ return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
149
151
  };
150
152
  exports.getTaskListGroupedByAssignees = getTaskListGroupedByAssignees;
151
- const getTaskListGroupedByPriority = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }) => {
153
+ const getTaskListGroupedByPriority = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
152
154
  const taskGroupsWithTasksList = taskState_1.ALL_PRIORITY_CODE.map((groupKey) => {
153
155
  const taskIds = taskListState.taskIdsByPriority[groupKey] ?? [];
154
156
  const tasksWithUserDetails = getTasksWithUserDetails({
@@ -159,6 +161,7 @@ const getTaskListGroupedByPriority = ({ taskListState, taskState, userState, use
159
161
  addressState,
160
162
  taskIds,
161
163
  tagState,
164
+ userGroupsState,
162
165
  });
163
166
  return {
164
167
  groupName: taskDetailSelector_1.allTaskPriority.find((priority) => priority.code === groupKey)?.name ??
@@ -168,13 +171,10 @@ const getTaskListGroupedByPriority = ({ taskListState, taskState, userState, use
168
171
  tasks: tasksWithUserDetails,
169
172
  };
170
173
  });
171
- if (isDefaultFilters(taskListState) === false) {
172
- return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
173
- }
174
- return taskGroupsWithTasksList;
174
+ return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
175
175
  };
176
176
  exports.getTaskListGroupedByPriority = getTaskListGroupedByPriority;
177
- const getTaskListGroupedByStatus = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }) => {
177
+ const getTaskListGroupedByStatus = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
178
178
  const taskGroupsWithTasksList = taskState_1.ALL_TASK_STATUS_CODE.map((groupKey) => {
179
179
  const taskIds = taskListState.taskIdsByStatus[groupKey] ?? [];
180
180
  const tasksWithUserDetails = getTasksWithUserDetails({
@@ -185,6 +185,7 @@ const getTaskListGroupedByStatus = ({ taskListState, taskState, userState, userR
185
185
  addressState,
186
186
  taskIds,
187
187
  tagState,
188
+ userGroupsState,
188
189
  });
189
190
  return {
190
191
  groupName: taskDetailSelector_1.allTaskStatus.find((taskStatus) => taskStatus.code === groupKey)
@@ -194,12 +195,9 @@ const getTaskListGroupedByStatus = ({ taskListState, taskState, userState, userR
194
195
  tasks: tasksWithUserDetails,
195
196
  };
196
197
  });
197
- if (isDefaultFilters(taskListState) === false) {
198
- return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
199
- }
200
- return taskGroupsWithTasksList;
198
+ return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
201
199
  };
202
- const getTaskListGroupedByTags = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }) => {
200
+ const getTaskListGroupedByTags = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
203
201
  const tagGroups = Object.keys(taskListState.taskIdsByTags);
204
202
  const taskGroupsWithTasksList = tagGroups.map((groupKey) => {
205
203
  const taskIds = taskListState.taskIdsByTags[groupKey];
@@ -211,6 +209,7 @@ const getTaskListGroupedByTags = ({ taskListState, taskState, userState, userRol
211
209
  addressState,
212
210
  taskIds,
213
211
  tagState,
212
+ userGroupsState,
214
213
  });
215
214
  const tagIds = groupKey.split(',');
216
215
  const groupName = (0, tagSelector_1.getTagsByIds)(tagState, tagIds)
@@ -225,12 +224,9 @@ const getTaskListGroupedByTags = ({ taskListState, taskState, userState, userRol
225
224
  tasks: tasksWithUserDetails,
226
225
  };
227
226
  });
228
- if (isDefaultFilters(taskListState) === false) {
229
- return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
230
- }
231
- return taskGroupsWithTasksList;
227
+ return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
232
228
  };
233
- const getTaskListGroupedByDueDate = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }) => {
229
+ const getTaskListGroupedByDueDate = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
234
230
  const taskGroupsWithTasksList = taskList_1.DUE_DATE_GROUP_KEYS.map((groupKey) => {
235
231
  const taskIds = taskListState.taskIdsByDueDate[groupKey];
236
232
  const tasksWithUserDetails = getTasksWithUserDetails({
@@ -241,6 +237,7 @@ const getTaskListGroupedByDueDate = ({ taskListState, taskState, userState, user
241
237
  addressState,
242
238
  taskIds,
243
239
  tagState,
240
+ userGroupsState,
244
241
  });
245
242
  return {
246
243
  groupName: groupKey,
@@ -249,12 +246,9 @@ const getTaskListGroupedByDueDate = ({ taskListState, taskState, userState, user
249
246
  tasks: tasksWithUserDetails,
250
247
  };
251
248
  });
252
- if (isDefaultFilters(taskListState) === false) {
253
- return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
254
- }
255
- return taskGroupsWithTasksList;
249
+ return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
256
250
  };
257
- const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRoleState, addressState, taskGroupState, taskGroupViewState, tagState, }) => {
251
+ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRoleState, addressState, taskGroupState, taskGroupViewState, tagState, userGroupsState, }) => {
258
252
  const { groupByKey } = taskListState.uiState;
259
253
  if (groupByKey === 'groupName') {
260
254
  return getTaskListGroupedByGroupName({
@@ -266,6 +260,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
266
260
  taskGroupState,
267
261
  taskGroupViewState,
268
262
  tagState,
263
+ userGroupsState,
269
264
  });
270
265
  }
271
266
  if (groupByKey === 'assignee') {
@@ -276,6 +271,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
276
271
  userRoleState,
277
272
  addressState,
278
273
  tagState,
274
+ userGroupsState,
279
275
  });
280
276
  }
281
277
  if (groupByKey === 'priority') {
@@ -286,6 +282,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
286
282
  userRoleState,
287
283
  addressState,
288
284
  tagState,
285
+ userGroupsState,
289
286
  });
290
287
  }
291
288
  if (groupByKey === 'status') {
@@ -296,6 +293,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
296
293
  userRoleState,
297
294
  addressState,
298
295
  tagState,
296
+ userGroupsState,
299
297
  });
300
298
  }
301
299
  if (groupByKey === 'tag') {
@@ -306,6 +304,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
306
304
  userRoleState,
307
305
  addressState,
308
306
  tagState,
307
+ userGroupsState,
309
308
  });
310
309
  }
311
310
  return getTaskListGroupedByDueDate({
@@ -315,6 +314,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
315
314
  userRoleState,
316
315
  addressState,
317
316
  tagState,
317
+ userGroupsState,
318
318
  });
319
319
  };
320
320
  exports.getAllTasks = (0, toolkit_1.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) => {
@@ -328,6 +328,7 @@ exports.getAllTasks = (0, toolkit_1.createSelector)((state) => state.taskListSta
328
328
  taskGroupState,
329
329
  taskGroupViewState,
330
330
  tagState,
331
+ userGroupsState,
331
332
  });
332
333
  const fetchStateVariables = [
333
334
  taskListState,
@@ -339,7 +340,15 @@ exports.getAllTasks = (0, toolkit_1.createSelector)((state) => state.taskListSta
339
340
  }
340
341
  const { fetchState, error } = (0, reduceFetchState_1.reduceAnyFetchState)(fetchStateVariables);
341
342
  const taskGroupTemplates = (0, taskGroupTemplateSelector_1.getTaskGroupTemplateByIds)(taskGroupTemplateState, taskGroupTemplateViewState.taskGroupTemplateIds);
343
+ const tabCounts = {
344
+ live: taskListState.byTab.live.taskIds.length,
345
+ archived: taskListState.byTab.archived.taskIds.length,
346
+ deleted: taskListState.byTab.deleted.taskIds.length,
347
+ snoozed: taskListState.byTab.snoozed.taskIds.length,
348
+ };
342
349
  return {
350
+ currentTab: taskListState.currentTab,
351
+ tabCounts,
343
352
  uiState: taskListState.uiState,
344
353
  filters: taskListState.filters,
345
354
  taskGroupTemplates,
@@ -0,0 +1,27 @@
1
+ import { ActionsObservable, StateObservable } from 'redux-observable';
2
+ import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
3
+ import { RootState } from '../../../reducer';
4
+ import { ZeniAPI } from '../../../zeniAPI';
5
+ import { approveOAuthConsent, approveOAuthConsentFailure, approveOAuthConsentSuccess } from '../zeniOAuthReducer';
6
+ export type ActionType = ReturnType<typeof approveOAuthConsent> | ReturnType<typeof approveOAuthConsentSuccess> | ReturnType<typeof approveOAuthConsentFailure> | ReturnType<typeof openSnackbar>;
7
+ export declare const approveOAuthConsentEpic: (actions$: ActionsObservable<ActionType>, state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => import("rxjs").Observable<{
8
+ payload: {
9
+ messageSection: import("../../..").SnackbarMessageSections;
10
+ messageText: import("../../..").SnackbarMessageSectionTexts;
11
+ type: import("../../..").SnackbarMessageType;
12
+ showStatusIcon?: boolean;
13
+ variables?: {
14
+ variableName: string;
15
+ variableValue: string;
16
+ }[];
17
+ };
18
+ type: "snackbar/openSnackbar";
19
+ } | {
20
+ payload: {
21
+ redirectUrl: string;
22
+ };
23
+ type: "zeniOAuthView/approveOAuthConsentSuccess";
24
+ } | {
25
+ payload: import("../../../responsePayload").ZeniAPIStatus<Record<string, unknown>>;
26
+ type: "zeniOAuthView/approveOAuthConsentFailure";
27
+ }>;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.approveOAuthConsentEpic = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const operators_1 = require("rxjs/operators");
6
+ const snackbarReducer_1 = require("../../../entity/snackbar/snackbarReducer");
7
+ const responsePayload_1 = require("../../../responsePayload");
8
+ const zeniOAuthReducer_1 = require("../zeniOAuthReducer");
9
+ const failureSnackbar = (reason) => (0, snackbarReducer_1.openSnackbar)({
10
+ messageSection: 'oauth_consent_approve',
11
+ messageText: 'failed',
12
+ type: 'error',
13
+ variables: [{ variableName: '__reason__', variableValue: reason }],
14
+ });
15
+ const approveOAuthConsentEpic = (actions$, state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(zeniOAuthReducer_1.approveOAuthConsent.match), (0, operators_1.switchMap)((action) => {
16
+ if (state$.value.zeniOAuthViewState.fetchState === 'In-Progress') {
17
+ return (0, rxjs_1.from)([]);
18
+ }
19
+ const { userId, zeniSessionId, tenantId, clientId, redirectUri, codeChallenge, codeChallengeMethod, state, responseType, } = action.payload;
20
+ const authHeaders = {
21
+ 'zeni-user-id': userId,
22
+ 'zeni-tenant-id': tenantId,
23
+ };
24
+ if (zeniSessionId != null) {
25
+ authHeaders['zeni-session-id'] = zeniSessionId;
26
+ }
27
+ return zeniAPI
28
+ .postJSON(`${zeniAPI.apiEndPoints.authMicroServiceBaseUrl}/oauth/authorize/approve`, {
29
+ client_id: clientId,
30
+ redirect_uri: redirectUri,
31
+ code_challenge: codeChallenge,
32
+ code_challenge_method: codeChallengeMethod,
33
+ state,
34
+ response_type: responseType,
35
+ tenant_id: tenantId,
36
+ }, authHeaders)
37
+ .pipe((0, operators_1.concatMap)((response) => (0, rxjs_1.from)(response.json()).pipe((0, operators_1.mergeMap)((responseJson) => {
38
+ if (!response.ok) {
39
+ const errBody = responseJson;
40
+ const errorMessage = errBody?.error ??
41
+ errBody?.message ??
42
+ errBody?.status?.message ??
43
+ `Authorization failed (${response.status})`;
44
+ return (0, rxjs_1.from)([
45
+ (0, zeniOAuthReducer_1.approveOAuthConsentFailure)((0, responsePayload_1.createZeniAPIStatus)(errorMessage)),
46
+ failureSnackbar(errorMessage),
47
+ ]);
48
+ }
49
+ const body = responseJson;
50
+ const redirectUrl = body?.redirect_url ?? body?.data?.redirect_url;
51
+ if (redirectUrl == null || redirectUrl === '') {
52
+ const noRedirectMessage = 'No redirect URL returned from authorization server';
53
+ return (0, rxjs_1.from)([
54
+ (0, zeniOAuthReducer_1.approveOAuthConsentFailure)((0, responsePayload_1.createZeniAPIStatus)(noRedirectMessage)),
55
+ failureSnackbar(noRedirectMessage),
56
+ ]);
57
+ }
58
+ return (0, rxjs_1.of)((0, zeniOAuthReducer_1.approveOAuthConsentSuccess)({ redirectUrl }));
59
+ }))), (0, operators_1.catchError)((error) => {
60
+ const errorDetail = error instanceof Error ? error.message : JSON.stringify(error);
61
+ const networkErrorMessage = 'OAuth approve request failed: ' + errorDetail;
62
+ return (0, rxjs_1.from)([
63
+ (0, zeniOAuthReducer_1.approveOAuthConsentFailure)((0, responsePayload_1.createZeniAPIStatus)(networkErrorMessage)),
64
+ failureSnackbar(networkErrorMessage),
65
+ ]);
66
+ }));
67
+ }));
68
+ exports.approveOAuthConsentEpic = approveOAuthConsentEpic;
@@ -0,0 +1,16 @@
1
+ export interface OAuthParams {
2
+ clientId: string;
3
+ codeChallenge: string;
4
+ codeChallengeMethod: string;
5
+ redirectUri: string;
6
+ responseType: string;
7
+ state: string;
8
+ }
9
+ export type ParseOAuthParamsResult = {
10
+ error: null;
11
+ params: OAuthParams;
12
+ } | {
13
+ error: string;
14
+ params: null;
15
+ };
16
+ export declare function parseOAuthParams(search: string): ParseOAuthParamsResult;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseOAuthParams = parseOAuthParams;
4
+ function parseOAuthParams(search) {
5
+ const searchParams = new URLSearchParams(search);
6
+ const clientId = searchParams.get('client_id');
7
+ const redirectUri = searchParams.get('redirect_uri');
8
+ const codeChallenge = searchParams.get('code_challenge');
9
+ const codeChallengeMethod = searchParams.get('code_challenge_method') ?? 'S256';
10
+ const state = searchParams.get('state');
11
+ const responseType = searchParams.get('response_type') ?? 'code';
12
+ if (clientId == null || clientId === '') {
13
+ return { params: null, error: 'Missing client_id parameter' };
14
+ }
15
+ if (redirectUri == null || redirectUri === '') {
16
+ return { params: null, error: 'Missing redirect_uri parameter' };
17
+ }
18
+ try {
19
+ void new URL(redirectUri);
20
+ }
21
+ catch {
22
+ return { params: null, error: 'Invalid redirect_uri parameter' };
23
+ }
24
+ if (codeChallenge == null || codeChallenge === '') {
25
+ return {
26
+ params: null,
27
+ error: 'Missing code_challenge parameter (PKCE required)',
28
+ };
29
+ }
30
+ if (state == null || state === '') {
31
+ return { params: null, error: 'Missing state parameter' };
32
+ }
33
+ return {
34
+ params: {
35
+ clientId,
36
+ redirectUri,
37
+ codeChallenge,
38
+ codeChallengeMethod,
39
+ state,
40
+ responseType,
41
+ },
42
+ error: null,
43
+ };
44
+ }
@@ -0,0 +1,29 @@
1
+ import { ZeniAPIStatus } from '../../responsePayload';
2
+ import { ZeniOAuthViewState } from './zeniOAuthState';
3
+ export declare const initialState: ZeniOAuthViewState;
4
+ export interface ApproveOAuthConsentPayload {
5
+ clientId: string;
6
+ codeChallenge: string;
7
+ codeChallengeMethod: string;
8
+ redirectUri: string;
9
+ responseType: string;
10
+ state: string;
11
+ tenantId: string;
12
+ userId: string;
13
+ zeniSessionId: string | undefined;
14
+ }
15
+ export declare const approveOAuthConsent: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[userId: string, zeniSessionId: string | undefined, tenantId: string, clientId: string, redirectUri: string, codeChallenge: string, codeChallengeMethod: string, state: string, responseType: string], {
16
+ userId: string;
17
+ zeniSessionId: string | undefined;
18
+ tenantId: string;
19
+ clientId: string;
20
+ redirectUri: string;
21
+ codeChallenge: string;
22
+ codeChallengeMethod: string;
23
+ state: string;
24
+ responseType: string;
25
+ }, "zeniOAuthView/approveOAuthConsent", never, never>, approveOAuthConsentSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
26
+ redirectUrl: string;
27
+ }, "zeniOAuthView/approveOAuthConsentSuccess">, approveOAuthConsentFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<ZeniAPIStatus<Record<string, unknown>>, "zeniOAuthView/approveOAuthConsentFailure">, clearZeniOAuthView: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"zeniOAuthView/clearZeniOAuthView">;
28
+ declare const _default: import("redux").Reducer<ZeniOAuthViewState>;
29
+ export default _default;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.clearZeniOAuthView = exports.approveOAuthConsentFailure = exports.approveOAuthConsentSuccess = exports.approveOAuthConsent = exports.initialState = void 0;
5
+ const toolkit_1 = require("@reduxjs/toolkit");
6
+ exports.initialState = {
7
+ fetchState: 'Not-Started',
8
+ error: undefined,
9
+ approveRedirectUrl: undefined,
10
+ };
11
+ const zeniOAuthView = (0, toolkit_1.createSlice)({
12
+ name: 'zeniOAuthView',
13
+ initialState: exports.initialState,
14
+ reducers: {
15
+ approveOAuthConsent: {
16
+ prepare(userId, zeniSessionId, tenantId, clientId, redirectUri, codeChallenge, codeChallengeMethod, state, responseType) {
17
+ return {
18
+ payload: {
19
+ userId,
20
+ zeniSessionId,
21
+ tenantId,
22
+ clientId,
23
+ redirectUri,
24
+ codeChallenge,
25
+ codeChallengeMethod,
26
+ state,
27
+ responseType,
28
+ },
29
+ };
30
+ },
31
+ reducer(draft) {
32
+ draft.fetchState = 'In-Progress';
33
+ draft.error = undefined;
34
+ draft.approveRedirectUrl = undefined;
35
+ },
36
+ },
37
+ approveOAuthConsentSuccess(draft, action) {
38
+ draft.fetchState = 'Completed';
39
+ draft.error = undefined;
40
+ draft.approveRedirectUrl = action.payload.redirectUrl;
41
+ },
42
+ approveOAuthConsentFailure(draft, action) {
43
+ draft.fetchState = 'Error';
44
+ draft.error = action.payload;
45
+ draft.approveRedirectUrl = undefined;
46
+ },
47
+ clearZeniOAuthView() {
48
+ return exports.initialState;
49
+ },
50
+ },
51
+ });
52
+ _a = zeniOAuthView.actions, exports.approveOAuthConsent = _a.approveOAuthConsent, exports.approveOAuthConsentSuccess = _a.approveOAuthConsentSuccess, exports.approveOAuthConsentFailure = _a.approveOAuthConsentFailure, exports.clearZeniOAuthView = _a.clearZeniOAuthView;
53
+ exports.default = zeniOAuthView.reducer;
@@ -0,0 +1,5 @@
1
+ import { RootState } from '../../reducer';
2
+ import { FetchState } from '../../commonStateTypes/common';
3
+ export declare const getZeniOAuthApproveFetchState: (state: RootState) => FetchState;
4
+ export declare const getZeniOAuthApproveRedirectUrl: (state: RootState) => string | undefined;
5
+ export declare const getZeniOAuthApproveError: (state: RootState) => string | null;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getZeniOAuthApproveError = exports.getZeniOAuthApproveRedirectUrl = exports.getZeniOAuthApproveFetchState = void 0;
4
+ const getZeniOAuthApproveFetchState = (state) => state.zeniOAuthViewState.fetchState;
5
+ exports.getZeniOAuthApproveFetchState = getZeniOAuthApproveFetchState;
6
+ const getZeniOAuthApproveRedirectUrl = (state) => state.zeniOAuthViewState.approveRedirectUrl;
7
+ exports.getZeniOAuthApproveRedirectUrl = getZeniOAuthApproveRedirectUrl;
8
+ const getZeniOAuthApproveError = (state) => state.zeniOAuthViewState.error?.message ?? null;
9
+ exports.getZeniOAuthApproveError = getZeniOAuthApproveError;
@@ -0,0 +1,4 @@
1
+ import { FetchStateAndError } from '../../commonStateTypes/common';
2
+ export interface ZeniOAuthViewState extends FetchStateAndError {
3
+ approveRedirectUrl?: string;
4
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeniai/client-epic-state",
3
- "version": "5.0.32",
3
+ "version": "5.0.33-betaRR0",
4
4
  "description": "Shared module between Web & Mobile containing required abstractions for state management, async network communication. ",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib/esm/index.js",