@zeniai/client-epic-state 5.0.37 → 5.0.38

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 (144) 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 +5 -2
  11. package/lib/entity/tenant/clearAllEpic.js +6 -0
  12. package/lib/entity/tenant/epic/deleteConnectionEpic.d.ts +19 -0
  13. package/lib/entity/tenant/epic/deleteConnectionEpic.js +29 -0
  14. package/lib/entity/tenant/epic/saveAPIKeyConnectionEpic.d.ts +19 -0
  15. package/lib/entity/tenant/epic/saveAPIKeyConnectionEpic.js +31 -0
  16. package/lib/entity/tenant/epic/saveOAuthConnectionEpic.d.ts +19 -0
  17. package/lib/entity/tenant/epic/saveOAuthConnectionEpic.js +33 -0
  18. package/lib/entity/tenant/tenantPayload.d.ts +1 -0
  19. package/lib/entity/tenant/tenantReducer.d.ts +59 -1
  20. package/lib/entity/tenant/tenantReducer.js +139 -4
  21. package/lib/entity/tenant/tenantState.d.ts +7 -0
  22. package/lib/entity/transaction/stateTypes/attachment.d.ts +2 -2
  23. package/lib/epic.d.ts +9 -1
  24. package/lib/epic.js +12 -1
  25. package/lib/esm/commonStateTypes/fiscalYearHelpers/formatZeniDateFY.js +1 -0
  26. package/lib/esm/entity/file/fileState.js +4 -0
  27. package/lib/esm/entity/snackbar/snackbarTypes.js +4 -0
  28. package/lib/esm/entity/task/taskPayload.js +5 -0
  29. package/lib/esm/entity/tenant/clearAllEpic.js +6 -0
  30. package/lib/esm/entity/tenant/epic/deleteConnectionEpic.js +25 -0
  31. package/lib/esm/entity/tenant/epic/saveAPIKeyConnectionEpic.js +27 -0
  32. package/lib/esm/entity/tenant/epic/saveOAuthConnectionEpic.js +29 -0
  33. package/lib/esm/entity/tenant/tenantReducer.js +135 -2
  34. package/lib/esm/epic.js +12 -1
  35. package/lib/esm/index.js +15 -6
  36. package/lib/esm/init.js +71 -16
  37. package/lib/esm/reducer.js +9 -0
  38. package/lib/esm/view/featureNotificationView/epics/fetchRegisteredInterestsEpic.js +23 -0
  39. package/lib/esm/view/featureNotificationView/epics/notifyMeForFeatureEpic.js +25 -0
  40. package/lib/esm/view/featureNotificationView/featureNotificationViewPayload.js +11 -0
  41. package/lib/esm/view/featureNotificationView/featureNotificationViewReducer.js +106 -0
  42. package/lib/esm/view/featureNotificationView/featureNotificationViewSelector.js +4 -0
  43. package/lib/esm/view/featureNotificationView/featureNotificationViewState.js +1 -0
  44. package/lib/esm/view/taskManager/cannedResponsesView/cannedResponses.js +1 -0
  45. package/lib/esm/view/taskManager/cannedResponsesView/cannedResponsesPayload.js +12 -0
  46. package/lib/esm/view/taskManager/cannedResponsesView/cannedResponsesReducer.js +64 -0
  47. package/lib/esm/view/taskManager/cannedResponsesView/cannedResponsesSelector.js +3 -0
  48. package/lib/esm/view/taskManager/cannedResponsesView/epics/deleteCannedResponseEpic.js +17 -0
  49. package/lib/esm/view/taskManager/cannedResponsesView/epics/fetchCannedResponsesEpic.js +21 -0
  50. package/lib/esm/view/taskManager/cannedResponsesView/epics/saveCannedResponseEpic.js +29 -0
  51. package/lib/esm/view/taskManager/taskDetailView/epics/archiveTaskEpic.js +3 -0
  52. package/lib/esm/view/taskManager/taskDetailView/epics/deleteTaskEpic.js +5 -0
  53. package/lib/esm/view/taskManager/taskDetailView/epics/initializeTaskToLocalStoreEpic.js +1 -0
  54. package/lib/esm/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +1 -0
  55. package/lib/esm/view/taskManager/taskDetailView/epics/snoozeTaskEpic.js +66 -0
  56. package/lib/esm/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.js +57 -0
  57. package/lib/esm/view/taskManager/taskDetailView/taskDetail.js +4 -0
  58. package/lib/esm/view/taskManager/taskDetailView/taskDetailReducer.js +60 -7
  59. package/lib/esm/view/taskManager/taskDetailView/taskDetailSelector.js +12 -0
  60. package/lib/esm/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.js +56 -21
  61. package/lib/esm/view/taskManager/taskListView/epics/dragNDropTasksEpic.js +1 -0
  62. package/lib/esm/view/taskManager/taskListView/epics/fetchTaskListEpic.js +13 -4
  63. package/lib/esm/view/taskManager/taskListView/epics/updateTaskFromListViewEpic.js +3 -2
  64. package/lib/esm/view/taskManager/taskListView/taskList.js +7 -0
  65. package/lib/esm/view/taskManager/taskListView/taskListReducer.js +106 -12
  66. package/lib/esm/view/taskManager/taskListView/taskListSelector.js +48 -39
  67. package/lib/esm/view/zeniOAuthView/epics/approveOAuthConsentEpic.js +65 -0
  68. package/lib/esm/view/zeniOAuthView/zeniOAuthParamsParser.js +41 -0
  69. package/lib/esm/view/zeniOAuthView/zeniOAuthReducer.js +49 -0
  70. package/lib/esm/view/zeniOAuthView/zeniOAuthSelector.js +3 -0
  71. package/lib/esm/view/zeniOAuthView/zeniOAuthState.js +1 -0
  72. package/lib/index.d.ts +18 -6
  73. package/lib/index.js +67 -30
  74. package/lib/init.d.ts +5 -3
  75. package/lib/init.js +71 -16
  76. package/lib/reducer.d.ts +9 -0
  77. package/lib/reducer.js +9 -0
  78. package/lib/tsconfig.typecheck.tsbuildinfo +1 -1
  79. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  80. package/lib/view/featureNotificationView/epics/fetchRegisteredInterestsEpic.d.ts +16 -0
  81. package/lib/view/featureNotificationView/epics/fetchRegisteredInterestsEpic.js +27 -0
  82. package/lib/view/featureNotificationView/epics/notifyMeForFeatureEpic.d.ts +14 -0
  83. package/lib/view/featureNotificationView/epics/notifyMeForFeatureEpic.js +29 -0
  84. package/lib/view/featureNotificationView/featureNotificationViewPayload.d.ts +23 -0
  85. package/lib/view/featureNotificationView/featureNotificationViewPayload.js +15 -0
  86. package/lib/view/featureNotificationView/featureNotificationViewReducer.d.ts +19 -0
  87. package/lib/view/featureNotificationView/featureNotificationViewReducer.js +110 -0
  88. package/lib/view/featureNotificationView/featureNotificationViewSelector.d.ts +6 -0
  89. package/lib/view/featureNotificationView/featureNotificationViewSelector.js +11 -0
  90. package/lib/view/featureNotificationView/featureNotificationViewState.d.ts +26 -0
  91. package/lib/view/featureNotificationView/featureNotificationViewState.js +2 -0
  92. package/lib/view/taskManager/cannedResponsesView/cannedResponses.d.ts +19 -0
  93. package/lib/view/taskManager/cannedResponsesView/cannedResponses.js +2 -0
  94. package/lib/view/taskManager/cannedResponsesView/cannedResponsesPayload.d.ts +21 -0
  95. package/lib/view/taskManager/cannedResponsesView/cannedResponsesPayload.js +15 -0
  96. package/lib/view/taskManager/cannedResponsesView/cannedResponsesReducer.d.ts +30 -0
  97. package/lib/view/taskManager/cannedResponsesView/cannedResponsesReducer.js +68 -0
  98. package/lib/view/taskManager/cannedResponsesView/cannedResponsesSelector.d.ts +3 -0
  99. package/lib/view/taskManager/cannedResponsesView/cannedResponsesSelector.js +6 -0
  100. package/lib/view/taskManager/cannedResponsesView/epics/deleteCannedResponseEpic.d.ts +7 -0
  101. package/lib/view/taskManager/cannedResponsesView/epics/deleteCannedResponseEpic.js +21 -0
  102. package/lib/view/taskManager/cannedResponsesView/epics/fetchCannedResponsesEpic.d.ts +7 -0
  103. package/lib/view/taskManager/cannedResponsesView/epics/fetchCannedResponsesEpic.js +25 -0
  104. package/lib/view/taskManager/cannedResponsesView/epics/saveCannedResponseEpic.d.ts +7 -0
  105. package/lib/view/taskManager/cannedResponsesView/epics/saveCannedResponseEpic.js +33 -0
  106. package/lib/view/taskManager/taskDetailView/epics/archiveTaskEpic.d.ts +2 -1
  107. package/lib/view/taskManager/taskDetailView/epics/archiveTaskEpic.js +3 -0
  108. package/lib/view/taskManager/taskDetailView/epics/deleteTaskEpic.d.ts +2 -1
  109. package/lib/view/taskManager/taskDetailView/epics/deleteTaskEpic.js +5 -0
  110. package/lib/view/taskManager/taskDetailView/epics/initializeTaskToLocalStoreEpic.js +1 -0
  111. package/lib/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +1 -0
  112. package/lib/view/taskManager/taskDetailView/epics/snoozeTaskEpic.d.ts +9 -0
  113. package/lib/view/taskManager/taskDetailView/epics/snoozeTaskEpic.js +70 -0
  114. package/lib/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.d.ts +9 -0
  115. package/lib/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.js +61 -0
  116. package/lib/view/taskManager/taskDetailView/taskDetail.d.ts +2 -0
  117. package/lib/view/taskManager/taskDetailView/taskDetail.js +4 -0
  118. package/lib/view/taskManager/taskDetailView/taskDetailReducer.d.ts +10 -1
  119. package/lib/view/taskManager/taskDetailView/taskDetailReducer.js +61 -8
  120. package/lib/view/taskManager/taskDetailView/taskDetailSelector.d.ts +5 -0
  121. package/lib/view/taskManager/taskDetailView/taskDetailSelector.js +12 -0
  122. package/lib/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.d.ts +6 -7
  123. package/lib/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.js +56 -22
  124. package/lib/view/taskManager/taskListView/epics/dragNDropTasksEpic.js +1 -0
  125. package/lib/view/taskManager/taskListView/epics/fetchTaskListEpic.js +13 -4
  126. package/lib/view/taskManager/taskListView/epics/updateTaskFromListViewEpic.js +3 -2
  127. package/lib/view/taskManager/taskListView/taskList.d.ts +14 -1
  128. package/lib/view/taskManager/taskListView/taskList.js +8 -1
  129. package/lib/view/taskManager/taskListView/taskListPayload.d.ts +3 -0
  130. package/lib/view/taskManager/taskListView/taskListReducer.d.ts +9 -6
  131. package/lib/view/taskManager/taskListView/taskListReducer.js +107 -13
  132. package/lib/view/taskManager/taskListView/taskListSelector.d.ts +9 -3
  133. package/lib/view/taskManager/taskListView/taskListSelector.js +48 -39
  134. package/lib/view/zeniOAuthView/epics/approveOAuthConsentEpic.d.ts +27 -0
  135. package/lib/view/zeniOAuthView/epics/approveOAuthConsentEpic.js +69 -0
  136. package/lib/view/zeniOAuthView/zeniOAuthParamsParser.d.ts +16 -0
  137. package/lib/view/zeniOAuthView/zeniOAuthParamsParser.js +44 -0
  138. package/lib/view/zeniOAuthView/zeniOAuthReducer.d.ts +29 -0
  139. package/lib/view/zeniOAuthView/zeniOAuthReducer.js +53 -0
  140. package/lib/view/zeniOAuthView/zeniOAuthSelector.d.ts +5 -0
  141. package/lib/view/zeniOAuthView/zeniOAuthSelector.js +9 -0
  142. package/lib/view/zeniOAuthView/zeniOAuthState.d.ts +4 -0
  143. package/lib/view/zeniOAuthView/zeniOAuthState.js +2 -0
  144. package/package.json +1 -1
@@ -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,7 +41,7 @@ const sortTasksList = (tagState, tasksList, sortKey, sortOrder) => {
43
41
  }, sortOrder);
44
42
  return tasksInOrder;
45
43
  };
46
- const getTasksWithUserDetails = ({ taskListState, taskState, userState, userRoleState, addressState, taskIds, tagState, }) => {
44
+ const getTasksWithUserDetails = ({ taskListState, taskState, userState, userRoleState, addressState, taskIds, tagState, userGroupsState, }) => {
47
45
  const { sortKey, searchText } = taskListState.uiState;
48
46
  const sortOrder = getSortOrder(taskListState.uiState.sortOrder);
49
47
  const tasks = taskIds
@@ -53,7 +51,15 @@ const getTasksWithUserDetails = ({ taskListState, taskState, userState, userRole
53
51
  const assigneeUsers = task.assignees
54
52
  .map((userId) => getUserAndUserRole(userState, userRoleState, addressState, userId))
55
53
  .filter((value) => value != null);
56
- return { ...task, assigneeUsers };
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 };
57
63
  }
58
64
  return undefined;
59
65
  })
@@ -62,7 +68,7 @@ const getTasksWithUserDetails = ({ taskListState, taskState, userState, userRole
62
68
  const sortedTaskList = sortTasksList(tagState, filteredTaskList, sortKey, sortOrder);
63
69
  return sortedTaskList;
64
70
  };
65
- const getTaskListGroupedByGroupName = ({ taskListState, taskState, taskGroupState, taskGroupViewState, userState, userRoleState, addressState, tagState, }) => {
71
+ const getTaskListGroupedByGroupName = ({ taskListState, taskState, taskGroupState, taskGroupViewState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
66
72
  const { taskGroupsIds } = taskGroupViewState;
67
73
  const taskGroupsWithTasksList = taskGroupsIds
68
74
  .map((taskGroupId) => {
@@ -76,6 +82,7 @@ const getTaskListGroupedByGroupName = ({ taskListState, taskState, taskGroupStat
76
82
  addressState,
77
83
  taskIds,
78
84
  tagState,
85
+ userGroupsState,
79
86
  });
80
87
  if (taskGroup != null) {
81
88
  return {
@@ -104,12 +111,9 @@ const getTaskListGroupedByGroupName = ({ taskListState, taskState, taskGroupStat
104
111
  if (defaultTaskGroup != null) {
105
112
  sortedTaskGroupsWithTasksList.push(defaultTaskGroup);
106
113
  }
107
- if (isDefaultFilters(taskListState) === false) {
108
- return sortedTaskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
109
- }
110
- return sortedTaskGroupsWithTasksList;
114
+ return sortedTaskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
111
115
  };
112
- export const getTaskListGroupedByAssignees = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }) => {
116
+ export const getTaskListGroupedByAssignees = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
113
117
  const assigneeGroups = Object.keys(taskListState.taskIdsByAssignees);
114
118
  const taskGroupsWithTasksList = assigneeGroups.map((groupKey) => {
115
119
  const taskIds = taskListState.taskIdsByAssignees[groupKey];
@@ -121,6 +125,7 @@ export const getTaskListGroupedByAssignees = ({ taskListState, taskState, userSt
121
125
  addressState,
122
126
  taskIds,
123
127
  tagState,
128
+ userGroupsState,
124
129
  });
125
130
  const assigneeIds = groupKey.split(',');
126
131
  const groupName = getUsersByUserIds(userState, assigneeIds)
@@ -136,12 +141,9 @@ export const getTaskListGroupedByAssignees = ({ taskListState, taskState, userSt
136
141
  tasks: tasksWithUserDetails,
137
142
  };
138
143
  });
139
- if (isDefaultFilters(taskListState) === false) {
140
- return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
141
- }
142
- return taskGroupsWithTasksList;
144
+ return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
143
145
  };
144
- export const getTaskListGroupedByPriority = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }) => {
146
+ export const getTaskListGroupedByPriority = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
145
147
  const taskGroupsWithTasksList = ALL_PRIORITY_CODE.map((groupKey) => {
146
148
  const taskIds = taskListState.taskIdsByPriority[groupKey] ?? [];
147
149
  const tasksWithUserDetails = getTasksWithUserDetails({
@@ -152,6 +154,7 @@ export const getTaskListGroupedByPriority = ({ taskListState, taskState, userSta
152
154
  addressState,
153
155
  taskIds,
154
156
  tagState,
157
+ userGroupsState,
155
158
  });
156
159
  return {
157
160
  groupName: allTaskPriority.find((priority) => priority.code === groupKey)?.name ??
@@ -161,12 +164,9 @@ export const getTaskListGroupedByPriority = ({ taskListState, taskState, userSta
161
164
  tasks: tasksWithUserDetails,
162
165
  };
163
166
  });
164
- if (isDefaultFilters(taskListState) === false) {
165
- return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
166
- }
167
- return taskGroupsWithTasksList;
167
+ return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
168
168
  };
169
- const getTaskListGroupedByStatus = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }) => {
169
+ const getTaskListGroupedByStatus = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
170
170
  const taskGroupsWithTasksList = ALL_TASK_STATUS_CODE.map((groupKey) => {
171
171
  const taskIds = taskListState.taskIdsByStatus[groupKey] ?? [];
172
172
  const tasksWithUserDetails = getTasksWithUserDetails({
@@ -177,6 +177,7 @@ const getTaskListGroupedByStatus = ({ taskListState, taskState, userState, userR
177
177
  addressState,
178
178
  taskIds,
179
179
  tagState,
180
+ userGroupsState,
180
181
  });
181
182
  return {
182
183
  groupName: allTaskStatus.find((taskStatus) => taskStatus.code === groupKey)
@@ -186,12 +187,9 @@ const getTaskListGroupedByStatus = ({ taskListState, taskState, userState, userR
186
187
  tasks: tasksWithUserDetails,
187
188
  };
188
189
  });
189
- if (isDefaultFilters(taskListState) === false) {
190
- return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
191
- }
192
- return taskGroupsWithTasksList;
190
+ return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
193
191
  };
194
- const getTaskListGroupedByTags = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }) => {
192
+ const getTaskListGroupedByTags = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
195
193
  const tagGroups = Object.keys(taskListState.taskIdsByTags);
196
194
  const taskGroupsWithTasksList = tagGroups.map((groupKey) => {
197
195
  const taskIds = taskListState.taskIdsByTags[groupKey];
@@ -203,6 +201,7 @@ const getTaskListGroupedByTags = ({ taskListState, taskState, userState, userRol
203
201
  addressState,
204
202
  taskIds,
205
203
  tagState,
204
+ userGroupsState,
206
205
  });
207
206
  const tagIds = groupKey.split(',');
208
207
  const groupName = getTagsByIds(tagState, tagIds)
@@ -217,12 +216,9 @@ const getTaskListGroupedByTags = ({ taskListState, taskState, userState, userRol
217
216
  tasks: tasksWithUserDetails,
218
217
  };
219
218
  });
220
- if (isDefaultFilters(taskListState) === false) {
221
- return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
222
- }
223
- return taskGroupsWithTasksList;
219
+ return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
224
220
  };
225
- const getTaskListGroupedByDueDate = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }) => {
221
+ const getTaskListGroupedByDueDate = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
226
222
  const taskGroupsWithTasksList = DUE_DATE_GROUP_KEYS.map((groupKey) => {
227
223
  const taskIds = taskListState.taskIdsByDueDate[groupKey];
228
224
  const tasksWithUserDetails = getTasksWithUserDetails({
@@ -233,6 +229,7 @@ const getTaskListGroupedByDueDate = ({ taskListState, taskState, userState, user
233
229
  addressState,
234
230
  taskIds,
235
231
  tagState,
232
+ userGroupsState,
236
233
  });
237
234
  return {
238
235
  groupName: groupKey,
@@ -241,12 +238,9 @@ const getTaskListGroupedByDueDate = ({ taskListState, taskState, userState, user
241
238
  tasks: tasksWithUserDetails,
242
239
  };
243
240
  });
244
- if (isDefaultFilters(taskListState) === false) {
245
- return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
246
- }
247
- return taskGroupsWithTasksList;
241
+ return taskGroupsWithTasksList.filter((group) => group.tasks.length > 0);
248
242
  };
249
- const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRoleState, addressState, taskGroupState, taskGroupViewState, tagState, }) => {
243
+ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRoleState, addressState, taskGroupState, taskGroupViewState, tagState, userGroupsState, }) => {
250
244
  const { groupByKey } = taskListState.uiState;
251
245
  if (groupByKey === 'groupName') {
252
246
  return getTaskListGroupedByGroupName({
@@ -258,6 +252,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
258
252
  taskGroupState,
259
253
  taskGroupViewState,
260
254
  tagState,
255
+ userGroupsState,
261
256
  });
262
257
  }
263
258
  if (groupByKey === 'assignee') {
@@ -268,6 +263,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
268
263
  userRoleState,
269
264
  addressState,
270
265
  tagState,
266
+ userGroupsState,
271
267
  });
272
268
  }
273
269
  if (groupByKey === 'priority') {
@@ -278,6 +274,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
278
274
  userRoleState,
279
275
  addressState,
280
276
  tagState,
277
+ userGroupsState,
281
278
  });
282
279
  }
283
280
  if (groupByKey === 'status') {
@@ -288,6 +285,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
288
285
  userRoleState,
289
286
  addressState,
290
287
  tagState,
288
+ userGroupsState,
291
289
  });
292
290
  }
293
291
  if (groupByKey === 'tag') {
@@ -298,6 +296,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
298
296
  userRoleState,
299
297
  addressState,
300
298
  tagState,
299
+ userGroupsState,
301
300
  });
302
301
  }
303
302
  return getTaskListGroupedByDueDate({
@@ -307,6 +306,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
307
306
  userRoleState,
308
307
  addressState,
309
308
  tagState,
309
+ userGroupsState,
310
310
  });
311
311
  };
312
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) => {
@@ -320,6 +320,7 @@ export const getAllTasks = createSelector((state) => state.taskListState, (state
320
320
  taskGroupState,
321
321
  taskGroupViewState,
322
322
  tagState,
323
+ userGroupsState,
323
324
  });
324
325
  const fetchStateVariables = [
325
326
  taskListState,
@@ -331,7 +332,15 @@ export const getAllTasks = createSelector((state) => state.taskListState, (state
331
332
  }
332
333
  const { fetchState, error } = reduceAnyFetchState(fetchStateVariables);
333
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
+ };
334
341
  return {
342
+ currentTab: taskListState.currentTab,
343
+ tabCounts,
335
344
  uiState: taskListState.uiState,
336
345
  filters: taskListState.filters,
337
346
  taskGroupTemplates,
@@ -0,0 +1,65 @@
1
+ import { from, of } from 'rxjs';
2
+ import { catchError, concatMap, exhaustMap, filter, mergeMap, } from 'rxjs/operators';
3
+ import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
4
+ import { createZeniAPIStatus } from '../../../responsePayload';
5
+ import { approveOAuthConsent, approveOAuthConsentFailure, approveOAuthConsentSuccess, } from '../zeniOAuthReducer';
6
+ const failureSnackbar = (reason) => openSnackbar({
7
+ messageSection: 'oauth_consent_approve',
8
+ messageText: 'failed',
9
+ type: 'error',
10
+ variables: [{ variableName: '__reason__', variableValue: reason }],
11
+ });
12
+ export const approveOAuthConsentEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(approveOAuthConsent.match),
13
+ // `approveOAuthConsent` reducer sets fetchState to In-Progress before epics
14
+ // run, so a guard on In-Progress would block every legitimate request.
15
+ // exhaustMap drops duplicate approve clicks while the HTTP call is in flight.
16
+ exhaustMap((action) => {
17
+ const { userId, zeniSessionId, tenantId, clientId, redirectUri, codeChallenge, codeChallengeMethod, state, responseType, } = action.payload;
18
+ const authHeaders = {
19
+ 'zeni-user-id': userId,
20
+ 'zeni-tenant-id': tenantId,
21
+ };
22
+ if (zeniSessionId != null) {
23
+ authHeaders['zeni-session-id'] = zeniSessionId;
24
+ }
25
+ return zeniAPI
26
+ .postJSON(`${zeniAPI.apiEndPoints.authMicroServiceBaseUrl}/oauth/authorize/approve`, {
27
+ client_id: clientId,
28
+ redirect_uri: redirectUri,
29
+ code_challenge: codeChallenge,
30
+ code_challenge_method: codeChallengeMethod,
31
+ state,
32
+ response_type: responseType,
33
+ tenant_id: tenantId,
34
+ }, authHeaders)
35
+ .pipe(concatMap((response) => from(response.json()).pipe(mergeMap((responseJson) => {
36
+ if (!response.ok) {
37
+ const errBody = responseJson;
38
+ const errorMessage = errBody?.error ??
39
+ errBody?.message ??
40
+ errBody?.status?.message ??
41
+ `Authorization failed (${response.status})`;
42
+ return from([
43
+ approveOAuthConsentFailure(createZeniAPIStatus(errorMessage)),
44
+ failureSnackbar(errorMessage),
45
+ ]);
46
+ }
47
+ const body = responseJson;
48
+ const redirectUrl = body?.redirect_url ?? body?.data?.redirect_url;
49
+ if (redirectUrl == null || redirectUrl === '') {
50
+ const noRedirectMessage = 'No redirect URL returned from authorization server';
51
+ return from([
52
+ approveOAuthConsentFailure(createZeniAPIStatus(noRedirectMessage)),
53
+ failureSnackbar(noRedirectMessage),
54
+ ]);
55
+ }
56
+ return of(approveOAuthConsentSuccess({ redirectUrl }));
57
+ }))), catchError((error) => {
58
+ const errorDetail = error instanceof Error ? error.message : JSON.stringify(error);
59
+ const networkErrorMessage = 'OAuth approve request failed: ' + errorDetail;
60
+ return from([
61
+ approveOAuthConsentFailure(createZeniAPIStatus(networkErrorMessage)),
62
+ failureSnackbar(networkErrorMessage),
63
+ ]);
64
+ }));
65
+ }));
@@ -0,0 +1,41 @@
1
+ export function parseOAuthParams(search) {
2
+ const searchParams = new URLSearchParams(search);
3
+ const clientId = searchParams.get('client_id');
4
+ const redirectUri = searchParams.get('redirect_uri');
5
+ const codeChallenge = searchParams.get('code_challenge');
6
+ const codeChallengeMethod = searchParams.get('code_challenge_method') ?? 'S256';
7
+ const state = searchParams.get('state');
8
+ const responseType = searchParams.get('response_type') ?? 'code';
9
+ if (clientId == null || clientId === '') {
10
+ return { params: null, error: 'Missing client_id parameter' };
11
+ }
12
+ if (redirectUri == null || redirectUri === '') {
13
+ return { params: null, error: 'Missing redirect_uri parameter' };
14
+ }
15
+ try {
16
+ void new URL(redirectUri);
17
+ }
18
+ catch {
19
+ return { params: null, error: 'Invalid redirect_uri parameter' };
20
+ }
21
+ if (codeChallenge == null || codeChallenge === '') {
22
+ return {
23
+ params: null,
24
+ error: 'Missing code_challenge parameter (PKCE required)',
25
+ };
26
+ }
27
+ if (state == null || state === '') {
28
+ return { params: null, error: 'Missing state parameter' };
29
+ }
30
+ return {
31
+ params: {
32
+ clientId,
33
+ redirectUri,
34
+ codeChallenge,
35
+ codeChallengeMethod,
36
+ state,
37
+ responseType,
38
+ },
39
+ error: null,
40
+ };
41
+ }
@@ -0,0 +1,49 @@
1
+ import { createSlice } from '@reduxjs/toolkit';
2
+ export const initialState = {
3
+ fetchState: 'Not-Started',
4
+ error: undefined,
5
+ approveRedirectUrl: undefined,
6
+ };
7
+ const zeniOAuthView = createSlice({
8
+ name: 'zeniOAuthView',
9
+ initialState,
10
+ reducers: {
11
+ approveOAuthConsent: {
12
+ prepare(userId, zeniSessionId, tenantId, clientId, redirectUri, codeChallenge, codeChallengeMethod, state, responseType) {
13
+ return {
14
+ payload: {
15
+ userId,
16
+ zeniSessionId,
17
+ tenantId,
18
+ clientId,
19
+ redirectUri,
20
+ codeChallenge,
21
+ codeChallengeMethod,
22
+ state,
23
+ responseType,
24
+ },
25
+ };
26
+ },
27
+ reducer(draft) {
28
+ draft.fetchState = 'In-Progress';
29
+ draft.error = undefined;
30
+ draft.approveRedirectUrl = undefined;
31
+ },
32
+ },
33
+ approveOAuthConsentSuccess(draft, action) {
34
+ draft.fetchState = 'Completed';
35
+ draft.error = undefined;
36
+ draft.approveRedirectUrl = action.payload.redirectUrl;
37
+ },
38
+ approveOAuthConsentFailure(draft, action) {
39
+ draft.fetchState = 'Error';
40
+ draft.error = action.payload;
41
+ draft.approveRedirectUrl = undefined;
42
+ },
43
+ clearZeniOAuthView() {
44
+ return initialState;
45
+ },
46
+ },
47
+ });
48
+ export const { approveOAuthConsent, approveOAuthConsentSuccess, approveOAuthConsentFailure, clearZeniOAuthView, } = zeniOAuthView.actions;
49
+ export default zeniOAuthView.reducer;
@@ -0,0 +1,3 @@
1
+ export const getZeniOAuthApproveFetchState = (state) => state.zeniOAuthViewState.fetchState;
2
+ export const getZeniOAuthApproveRedirectUrl = (state) => state.zeniOAuthViewState.approveRedirectUrl;
3
+ export const getZeniOAuthApproveError = (state) => state.zeniOAuthViewState.error?.message ?? null;
@@ -0,0 +1 @@
1
+ export {};
package/lib/index.d.ts CHANGED
@@ -123,7 +123,7 @@ import { PriorityCodeType, Task, TaskCodeType, TaskPriority, TaskStatus, TaskSta
123
123
  import { getTaskGroupById } from './entity/taskGroup/taskGroupSelector';
124
124
  import { TaskGroupState } from './entity/taskGroup/taskGroupState';
125
125
  import { TaskGroupTemplate } from './entity/taskGroupTemplate/taskGroupTemplateState';
126
- import { DoSignInPayload, clearAll, doMagicLinkSignIn, doSignIn, doSignOut, sendSessionHeartbeat, fetchActiveTenant, fetchAllTenants, fetchExcludedResources as fetchExcludedResourcesForTenant, fetchExternalConnections as fetchExternalConnectionsForTenant, fetchSubscriptionSummaryForTenant, resendVerifyDeviceOTP, resetSignInState, saveExternalConnection as saveExternalConnectionForTenant, sendEmailMagicLinkToUser, updateCurrentTenant, updateSignInState, verifyDeviceWithTwoFA } from './entity/tenant/tenantReducer';
126
+ import { DoSignInPayload, clearAll, doMagicLinkSignIn, doSignIn, doSignOut, sendSessionHeartbeat, fetchActiveTenant, fetchAllTenants, fetchExcludedResources as fetchExcludedResourcesForTenant, fetchExternalConnections as fetchExternalConnectionsForTenant, fetchSubscriptionSummaryForTenant, resendVerifyDeviceOTP, resetSignInState, deleteConnection, saveAPIKeyConnection, saveExternalConnection as saveExternalConnectionForTenant, saveOAuthConnection, sendEmailMagicLinkToUser, toExternalIntegrationType, toExternalSupportedTool, updateCurrentTenant, updateSignInState, verifyDeviceWithTwoFA } from './entity/tenant/tenantReducer';
127
127
  import { CurrentTenant, TenantBaseView, TenantCoreDetailsView, TenantView, TenantsBaseOrdered, TenantsOrdered, getCurrentTenant, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, getTenantBaseById, getTenantBaseViewForTenantId, getTenantBaseViewForTenantView, getTenantsBaseByCheckInDateSelector, getTenantsByCheckInDateSelector, getTenantsCoreDetailsByCheckInDateSelector, isOtherProductsEnabledForTenant, isTenantBankingOnly, isTenantBookkeepingEnabled, isTenantCardsOnly, isTenantUsingZeniCOA, isZeniDomainTenant, toTenantCoreDetailsView } from './entity/tenant/tenantSelector';
128
128
  import { Connection, LoggedInUser, RoleResource, Tenant, TenantProductSettings } from './entity/tenant/tenantState';
129
129
  import { ToastNotificationPayload } from './entity/toastNotification/toastNotificationPayload';
@@ -322,6 +322,9 @@ import { AverageMonthsCount, NetBurnOrIncomeRunway, NetBurnOrIncomeStoryCardStat
322
322
  import { fetchNotificationUnreadCount, fetchNotificationUnreadCountSuccess, fetchNotificationView, updateNotificationViewAllNotificationsStatus, updateNotificationViewCurrentTabAndSubTab, updateNotificationViewNotificationStatus, updateNotificationViewSubTab, updateNotificationViewTabState, updateNotificationViewUIState } from './view/notificationView/notificationViewReducer';
323
323
  import { NotificationView, getExternalNotificationsForSelectedSubTab, getNotificationView, getNotificationsForSelectedSubTab } from './view/notificationView/notificationViewSelector';
324
324
  import { NotificationSubTabType, NotificationTabState, NotificationTabType, NotificationViewUIState, toNotificationSubTabTypeStrict, toNotificationTabTypeStrict } from './view/notificationView/notificationViewState';
325
+ import { clearFeatureNotificationView, fetchRegisteredInterests, notifyMeForFeature } from './view/featureNotificationView/featureNotificationViewReducer';
326
+ import { getFeatureNotificationView, getRegisteredInterests, getRegisteredInterestsByFeature, isFeatureInterestRegistered } from './view/featureNotificationView/featureNotificationViewSelector';
327
+ import { FeatureInterest, FeatureNotificationViewState } from './view/featureNotificationView/featureNotificationViewState';
325
328
  import { clearOnboardingCustomerViewUpdateData, fetchCompanyOnboardingView, fetchOnboardingCompletedCompanies, fetchQBOConnectionPool, getOnboardingEmailGroup, initializeOnboardingCustomerViewUpdateData, resetNewOnboardedCustomerId, retryBankAccountConnectionForOnboarding, saveOnboardingCustomerCompletedStatus, saveOnboardingCustomerDataInLocalStore, saveOnboardingCustomerNotes, saveOnboardingCustomerViewUpdateData, saveOnboardingCustomerViewUpdates, sendOnboardingCustomerViewInvite, updateCustomerCreationStatus, updateOnboardingCustomerDataInLocalStore, updateOnboardingCustomerListUIState, updateQBOConnectionPoolExternalConnection, updateStatusAfterOnboardingCompleted } from './view/onboardingView/cockpitView/onboardingCockpitViewReducer';
326
329
  import { NewOnboardingCustomerLocalData, NewOnboardingCustomerView, OnboardingCockpitView, ProductInfo, getNewOnboardingCustomerView, getOnboardingCockpitView } from './view/onboardingView/cockpitView/onboardingCockpitViewSelector';
327
330
  import { OnboardingCustomerListUIState, QBOConnectionPool } from './view/onboardingView/cockpitView/onboardingCockpitViewState';
@@ -537,12 +540,15 @@ import { createTag, deleteTag, fetchTagList } from './view/tagView/tagViewReduce
537
540
  import { TagViewSelectorView, getAllTags } from './view/tagView/tagViewSelector';
538
541
  import { TagViewState } from './view/tagView/tagViewState';
539
542
  import { EditTaskLocalData, initialTaskDetail, initialTaskDetailLocalData } from './view/taskManager/taskDetailView/taskDetail';
540
- import { archiveTask, deleteTask, discardTaskUpdatesInLocalStore, fetchTaskDetailPage, saveTaskDetail, saveTaskUpdatesToLocalStore } from './view/taskManager/taskDetailView/taskDetailReducer';
543
+ import { archiveTask, deleteTask, discardTaskUpdatesInLocalStore, fetchTaskDetailPage, saveTaskDetail, saveTaskUpdatesToLocalStore, snoozeTask, unsnoozeTask } from './view/taskManager/taskDetailView/taskDetailReducer';
544
+ import { CannedResponse, CannedResponsesViewState } from './view/taskManager/cannedResponsesView/cannedResponses';
545
+ import { deleteCannedResponse, fetchCannedResponses, saveCannedResponse } from './view/taskManager/cannedResponsesView/cannedResponsesReducer';
546
+ import { getCannedResponsesView } from './view/taskManager/cannedResponsesView/cannedResponsesSelector';
541
547
  import { TaskDetailSelectorView, allTaskPriority, allTaskStatus, getTaskDetail } from './view/taskManager/taskDetailView/taskDetailSelector';
542
548
  import { createTaskFromTaskGroupTemplate } from './view/taskManager/taskGroupTemplateView/taskGroupTemplateViewReducer';
543
549
  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, dragNDropTasks, fetchTaskListPage, initiateTaskListLocalData, updateTaskFilters, updateTaskFromListView, updateTaskListLocalData, updateTaskListSearchText, updateTaskListUIState } from './view/taskManager/taskListView/taskListReducer';
550
+ 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';
551
+ import { bulkUpdateTaskList, dragNDropTasks, fetchTaskListPage, initiateTaskListLocalData, removeTaskFromList, updateTaskFilters, updateTaskFromListView, updateTaskListLocalData, updateTaskListSearchText, updateTaskListTab, updateTaskListUIState } from './view/taskManager/taskListView/taskListReducer';
546
552
  import { TaskGroupWithTasksList, TaskListSelectorView, TaskWithUserDetails, getAllTasks } from './view/taskManager/taskListView/taskListSelector';
547
553
  import { getDueDateValueFromDueDateGroupId, getTaskUpdates } from './view/taskManager/taskListView/taskListViewHelpers';
548
554
  import { fetchTasksCard } from './view/tasksCard/tasksCardReducer';
@@ -608,6 +614,10 @@ import { ZeniAccStatementsSelectorView, getZeniAccStatements } from './view/zeni
608
614
  import { fetchZeniAccountsPromoCard } from './view/zeniAccountsPromoCard/zeniAccountsPromoCardReducer';
609
615
  import { ZeniAccountsPromoCardReport, getZeniAccountsPromoCard } from './view/zeniAccountsPromoCard/zeniAccountsPromoCardSelector';
610
616
  import { ZeniAccountsPromoCardState } from './view/zeniAccountsPromoCard/zeniAccountsPromoCardState';
617
+ import { ApproveOAuthConsentPayload, approveOAuthConsent, approveOAuthConsentFailure, approveOAuthConsentSuccess, clearZeniOAuthView } from './view/zeniOAuthView/zeniOAuthReducer';
618
+ import { OAuthParams, ParseOAuthParamsResult, parseOAuthParams } from './view/zeniOAuthView/zeniOAuthParamsParser';
619
+ import { getZeniOAuthApproveError, getZeniOAuthApproveFetchState, getZeniOAuthApproveRedirectUrl } from './view/zeniOAuthView/zeniOAuthSelector';
620
+ import { ZeniOAuthViewState } from './view/zeniOAuthView/zeniOAuthState';
611
621
  import { RESTAPIEndpoints } from './zeniAPI';
612
622
  import { Dayjs, ZeniDate, date, dateFromYearMonthDate, dateInLocal, dateLocal, dateNow, getBusinessDayOfDate, getLocalTimezone, getMinDate, getMonthIndex, setLocalTimezone, updateZeniDateLocaleID } from './zeniDayJS';
613
623
  import { ZeniUrl, toZeniUrl, toZeniUrlWithoutBaseURL } from './zeniUrl';
@@ -643,7 +653,7 @@ export { TimeframeTick, TimeframeTickWithMetaData, toTimeframeTick, mapTimePerio
643
653
  export { VendorSpendTrendFilterTabType, toVendorSpendTrendFilterTabsTypeStrict, } from './entity/vendorExpense/vendorExpenseSelector';
644
654
  export { getNumberOfPeriods };
645
655
  export { SCHEDULE_DAYS_OF_MONTH, ScheduleDaysOfMonth, toScheduleDaysOfMonth, Day, Month, toMonth, toMonthStrict, Quarter, toQuarter, toQuarterStrict, AbsoluteDay, TimePeriod, };
646
- export { Tenant, TenantView, LoggedInUser, TenantBaseView, CurrentTenant, TenantProductSettings, getTenantBaseById, getCurrentTenant, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, getTenantsByCheckInDateSelector, getTenantsBaseByCheckInDateSelector, getTenantsCoreDetailsByCheckInDateSelector, toTenantCoreDetailsView, getTenantBaseViewForTenantView, getTenantBaseViewForTenantId, isZeniDomainTenant, isTenantUsingZeniCOA, TenantsBaseOrdered, TenantsOrdered, TenantCoreDetailsView, fetchActiveTenant, fetchAllTenants, updateCurrentTenant, clearAll, doMagicLinkSignIn, verifyDeviceWithTwoFA, resendVerifyDeviceOTP, sendEmailMagicLinkToUser, doSignIn, updateSignInState, DoSignInPayload, doSignOut, sendSessionHeartbeat, resetSignInState, RoleResource, Connection, fetchExcludedResourcesForTenant, fetchExternalConnectionsForTenant, saveExternalConnectionForTenant, fetchSubscriptionSummaryForTenant, isTenantBankingOnly, isTenantCardsOnly, isTenantBookkeepingEnabled, isOtherProductsEnabledForTenant, };
656
+ export { Tenant, TenantView, LoggedInUser, TenantBaseView, CurrentTenant, TenantProductSettings, getTenantBaseById, getCurrentTenant, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, getTenantsByCheckInDateSelector, getTenantsBaseByCheckInDateSelector, getTenantsCoreDetailsByCheckInDateSelector, toTenantCoreDetailsView, getTenantBaseViewForTenantView, getTenantBaseViewForTenantId, isZeniDomainTenant, isTenantUsingZeniCOA, TenantsBaseOrdered, TenantsOrdered, TenantCoreDetailsView, fetchActiveTenant, fetchAllTenants, updateCurrentTenant, clearAll, doMagicLinkSignIn, verifyDeviceWithTwoFA, resendVerifyDeviceOTP, sendEmailMagicLinkToUser, doSignIn, updateSignInState, DoSignInPayload, doSignOut, sendSessionHeartbeat, resetSignInState, RoleResource, Connection, fetchExcludedResourcesForTenant, fetchExternalConnectionsForTenant, saveExternalConnectionForTenant, deleteConnection, saveAPIKeyConnection, saveOAuthConnection, toExternalIntegrationType, toExternalSupportedTool, fetchSubscriptionSummaryForTenant, isTenantBankingOnly, isTenantCardsOnly, isTenantBookkeepingEnabled, isOtherProductsEnabledForTenant, };
647
657
  export { Account, AccountType, AccountBase, StatementCloseDay, toAccountType, AccountReport, NestedAccountReport, AccountWithBalanceReport, AccountGroup, AccountGroupReportV2, AccountGroupType, toAccountGroupType, AccountGroupReport, getAccountGroupKey, AccountGroupKey, RecommendedAccountBase, };
648
658
  export { Class, ClassBase, RecommendedClassBase, } from './entity/class/classState';
649
659
  export { getClassById } from './entity/class/classSelector';
@@ -847,14 +857,16 @@ export { fetchGlobalMerchantRecommendation, createGlobalMerchant, updateCreateGl
847
857
  export { approveVendorGlobalReview, rejectVendorGlobalReview, fetchVendorGlobalReviewView, updateSelectedGlobalMerchant, updateVendorGlobalReviewViewUIState, getVendorGlobalReviewView, getTenantMerchantByMerchantId, toVendorGlobalReviewColumnSortKeyType, VendorGlobalReview, VendorGlobalReviewViewUIState, VendorGlobalReviewViewColumnSortKey, VendorGlobalReviewViewSelectorView, VendorGlobalReviewViewState, VendorGlobalReviewViewLocalData, updateVendorGlobalReviewViewLocalData, GlobalReviewPageCurrentSelectionByColumn, GlobalRecommendationFetchSource, };
848
858
  export { fetchArAging, updateArAgingUIState, fetchArAgingDetail, updateArAgingDetailUIState, ArAgingReport, ArAgingDetail, NestedAgingBalancesByCustomer, getArAgingReport, getArAgingDetailForCustomer, updateArAgingNodeCollapseState, };
849
859
  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, updateTaskFromListView, convertHHMMStrToMinutes, initialTaskDetailLocalData, };
860
+ export { Task, TaskListSelectorView, TaskWithUserDetails, TaskListViewSortKey, TaskListUIState, TaskDetailSelectorView, EditTaskLocalData, TaskStatusCodeType, PriorityCodeType, getTaskGroupById, TaskStatus, TaskPriority, TaskCodeType, getAllTasks, fetchTaskListPage, getTaskDetail, fetchTaskDetailPage, saveTaskUpdatesToLocalStore, saveTaskDetail, archiveTask, CannedResponse, CannedResponsesViewState, fetchCannedResponses, saveCannedResponse, deleteCannedResponse, getCannedResponsesView, 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
861
  export { Tag, TagState, TagViewState, getAllTags, TagViewSelectorView, fetchTagList, createTag, deleteTag, };
852
862
  export { CardPayment, CardPaymentViewState, SetupIntentData, CardPaymentSelectorView, getAllCardsAndBankPaymentMethods, createCardSetupIntent, confirmCardSetupIntent, addCardPaymentSource, fetchPaymentSources, resetCardPaymentErrorStatuses, clearCardPaymentView, AddCardPaymentSourceType, };
853
863
  export { getAuditReportGroupViewSelectorView, getAuditRuleGroupViewSelectorView, getUserFromAllUsers, AuditReportGroupSelectorView, AuditReportGroupViewSelectorView, AuditRuleGroupViewSelectorView, fetchAuditRuleGroupView, fetchAuditReportGroupView, saveReasonForAuditRule, AuditRuleGroup, AuditRuleGroupReport, AuditReportRule, AuditRuleEntityType, AuditRuleEntityIdType, AuditRuleBypassReason, clearAuditReportGroupViewByCompanyId, };
854
864
  export { AuthenticationFeatureType, AuthenticationDetails, AuthenticationViewState, fetchCollaborationAuthToken, getAuthenticationView, };
855
865
  export { ZeniAccountsPromoCardState, getZeniAccountsPromoCard, ZeniAccountsPromoCardReport, fetchZeniAccountsPromoCard, };
866
+ export { ApproveOAuthConsentPayload, OAuthParams, ParseOAuthParamsResult, ZeniOAuthViewState, approveOAuthConsent, approveOAuthConsentFailure, approveOAuthConsentSuccess, clearZeniOAuthView, getZeniOAuthApproveError, getZeniOAuthApproveFetchState, getZeniOAuthApproveRedirectUrl, parseOAuthParams, };
856
867
  export { ExternalNotificationData, NotificationGroup, NotificationActivityType, NotificationIdentifierType, NotificationUpdateValue, NotificationMode, NotificationStatus, Notification, NotificationWithAuthors, NotificationMetaData, NotificationEventData, NotificationActivity, NotificationUpdates, NotificationValueFormat, toNotificationModeStrict, updateCommentsNotifications, updateCommentsNotificationsStatuses, };
857
868
  export { NotificationView, NotificationViewUIState, NotificationTabState, NotificationTabType, NotificationSubTabType, toNotificationSubTabTypeStrict, toNotificationTabTypeStrict, fetchNotificationView, fetchNotificationUnreadCount, fetchNotificationUnreadCountSuccess, updateNotificationViewAllNotificationsStatus, updateNotificationViewNotificationStatus, updateNotificationViewTabState, updateNotificationViewCurrentTabAndSubTab, updateNotificationViewSubTab, updateNotificationViewUIState, getNotificationView, getExternalNotificationsForSelectedSubTab, getNotificationsForSelectedSubTab, };
869
+ export { clearFeatureNotificationView, fetchRegisteredInterests, notifyMeForFeature, getFeatureNotificationView, getRegisteredInterests, getRegisteredInterestsByFeature, isFeatureInterestRegistered, FeatureInterest, FeatureNotificationViewState, };
858
870
  export { pushToastNotification, ToastNotification, ToastNotificationPayload, getLastNotificationTime, getNotifications, };
859
871
  export { getReferralListView, getInviteFormView, ReferralListSelectorView, ReferralViewState, InviteCompanyLocalData, ReferralInvitation, ReferralListViewSortKey, ReferralViewUIState, toReferralListViewSortKeyType, ReferralStatus, ReferralAmountStatus, StatusTypes, AmountStatusTypes, fetchReferrals, sendReferralInvite, clearReferrals, saveReferralFormDataInLocalStore, updateReferralListSortUiState, resendReferralInvite, fetchRewardsPlan, RewardsPlanCardReport, getRewardsPlanCard, updateReferViewed, RewardsPlanData, };
860
872
  export { RecurringFrequencyType, getRecurringEndDateFromCount, toRecurringFrequency, getMinAllowedEndDate, RecurringDatePickerOptions, };