@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.
- package/lib/commonStateTypes/fiscalYearHelpers/formatZeniDateFY.d.ts +1 -0
- package/lib/commonStateTypes/fiscalYearHelpers/formatZeniDateFY.js +2 -1
- package/lib/entity/file/fileState.d.ts +4 -4
- package/lib/entity/file/fileState.js +4 -0
- package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
- package/lib/entity/snackbar/snackbarTypes.js +4 -0
- package/lib/entity/task/taskPayload.d.ts +3 -0
- package/lib/entity/task/taskPayload.js +5 -0
- package/lib/entity/task/taskState.d.ts +3 -0
- package/lib/entity/tenant/clearAllEpic.d.ts +4 -2
- package/lib/entity/tenant/clearAllEpic.js +4 -0
- package/lib/entity/transaction/stateTypes/attachment.d.ts +2 -2
- package/lib/epic.d.ts +7 -1
- package/lib/epic.js +7 -1
- package/lib/esm/commonStateTypes/fiscalYearHelpers/formatZeniDateFY.js +1 -0
- package/lib/esm/entity/file/fileState.js +4 -0
- package/lib/esm/entity/snackbar/snackbarTypes.js +4 -0
- package/lib/esm/entity/task/taskPayload.js +5 -0
- package/lib/esm/entity/tenant/clearAllEpic.js +4 -0
- package/lib/esm/epic.js +7 -1
- package/lib/esm/index.js +10 -4
- package/lib/esm/init.js +24 -4
- package/lib/esm/reducer.js +6 -0
- package/lib/esm/view/taskManager/cannedResponsesView/cannedResponses.js +1 -0
- package/lib/esm/view/taskManager/cannedResponsesView/cannedResponsesPayload.js +12 -0
- package/lib/esm/view/taskManager/cannedResponsesView/cannedResponsesReducer.js +64 -0
- package/lib/esm/view/taskManager/cannedResponsesView/cannedResponsesSelector.js +3 -0
- package/lib/esm/view/taskManager/cannedResponsesView/epics/deleteCannedResponseEpic.js +17 -0
- package/lib/esm/view/taskManager/cannedResponsesView/epics/fetchCannedResponsesEpic.js +21 -0
- package/lib/esm/view/taskManager/cannedResponsesView/epics/saveCannedResponseEpic.js +29 -0
- package/lib/esm/view/taskManager/taskDetailView/epics/archiveTaskEpic.js +3 -0
- package/lib/esm/view/taskManager/taskDetailView/epics/deleteTaskEpic.js +5 -0
- package/lib/esm/view/taskManager/taskDetailView/epics/initializeTaskToLocalStoreEpic.js +1 -0
- package/lib/esm/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +1 -0
- package/lib/esm/view/taskManager/taskDetailView/epics/snoozeTaskEpic.js +66 -0
- package/lib/esm/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.js +57 -0
- package/lib/esm/view/taskManager/taskDetailView/taskDetail.js +4 -0
- package/lib/esm/view/taskManager/taskDetailView/taskDetailReducer.js +60 -7
- package/lib/esm/view/taskManager/taskDetailView/taskDetailSelector.js +12 -0
- package/lib/esm/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.js +56 -21
- package/lib/esm/view/taskManager/taskListView/epics/dragNDropTasksEpic.js +1 -0
- package/lib/esm/view/taskManager/taskListView/epics/fetchTaskListEpic.js +13 -4
- package/lib/esm/view/taskManager/taskListView/epics/updateTaskFromListViewEpic.js +3 -2
- package/lib/esm/view/taskManager/taskListView/taskList.js +7 -0
- package/lib/esm/view/taskManager/taskListView/taskListReducer.js +106 -12
- package/lib/esm/view/taskManager/taskListView/taskListSelector.js +48 -39
- package/lib/esm/view/zeniOAuthView/epics/approveOAuthConsentEpic.js +64 -0
- package/lib/esm/view/zeniOAuthView/zeniOAuthParamsParser.js +41 -0
- package/lib/esm/view/zeniOAuthView/zeniOAuthReducer.js +49 -0
- package/lib/esm/view/zeniOAuthView/zeniOAuthSelector.js +3 -0
- package/lib/esm/view/zeniOAuthView/zeniOAuthState.js +1 -0
- package/lib/index.d.ts +12 -4
- package/lib/index.js +28 -5
- package/lib/init.d.ts +5 -3
- package/lib/init.js +24 -4
- package/lib/reducer.d.ts +6 -0
- package/lib/reducer.js +6 -0
- package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
- package/lib/view/taskManager/cannedResponsesView/cannedResponses.d.ts +19 -0
- package/lib/view/taskManager/cannedResponsesView/cannedResponses.js +2 -0
- package/lib/view/taskManager/cannedResponsesView/cannedResponsesPayload.d.ts +21 -0
- package/lib/view/taskManager/cannedResponsesView/cannedResponsesPayload.js +15 -0
- package/lib/view/taskManager/cannedResponsesView/cannedResponsesReducer.d.ts +30 -0
- package/lib/view/taskManager/cannedResponsesView/cannedResponsesReducer.js +68 -0
- package/lib/view/taskManager/cannedResponsesView/cannedResponsesSelector.d.ts +3 -0
- package/lib/view/taskManager/cannedResponsesView/cannedResponsesSelector.js +6 -0
- package/lib/view/taskManager/cannedResponsesView/epics/deleteCannedResponseEpic.d.ts +7 -0
- package/lib/view/taskManager/cannedResponsesView/epics/deleteCannedResponseEpic.js +21 -0
- package/lib/view/taskManager/cannedResponsesView/epics/fetchCannedResponsesEpic.d.ts +7 -0
- package/lib/view/taskManager/cannedResponsesView/epics/fetchCannedResponsesEpic.js +25 -0
- package/lib/view/taskManager/cannedResponsesView/epics/saveCannedResponseEpic.d.ts +7 -0
- package/lib/view/taskManager/cannedResponsesView/epics/saveCannedResponseEpic.js +33 -0
- package/lib/view/taskManager/taskDetailView/epics/archiveTaskEpic.d.ts +2 -1
- package/lib/view/taskManager/taskDetailView/epics/archiveTaskEpic.js +3 -0
- package/lib/view/taskManager/taskDetailView/epics/deleteTaskEpic.d.ts +2 -1
- package/lib/view/taskManager/taskDetailView/epics/deleteTaskEpic.js +5 -0
- package/lib/view/taskManager/taskDetailView/epics/initializeTaskToLocalStoreEpic.js +1 -0
- package/lib/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +1 -0
- package/lib/view/taskManager/taskDetailView/epics/snoozeTaskEpic.d.ts +9 -0
- package/lib/view/taskManager/taskDetailView/epics/snoozeTaskEpic.js +70 -0
- package/lib/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.d.ts +9 -0
- package/lib/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.js +61 -0
- package/lib/view/taskManager/taskDetailView/taskDetail.d.ts +2 -0
- package/lib/view/taskManager/taskDetailView/taskDetail.js +4 -0
- package/lib/view/taskManager/taskDetailView/taskDetailReducer.d.ts +10 -1
- package/lib/view/taskManager/taskDetailView/taskDetailReducer.js +61 -8
- package/lib/view/taskManager/taskDetailView/taskDetailSelector.d.ts +5 -0
- package/lib/view/taskManager/taskDetailView/taskDetailSelector.js +12 -0
- package/lib/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.d.ts +6 -7
- package/lib/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.js +56 -22
- package/lib/view/taskManager/taskListView/epics/dragNDropTasksEpic.js +1 -0
- package/lib/view/taskManager/taskListView/epics/fetchTaskListEpic.js +13 -4
- package/lib/view/taskManager/taskListView/epics/updateTaskFromListViewEpic.js +3 -2
- package/lib/view/taskManager/taskListView/taskList.d.ts +14 -1
- package/lib/view/taskManager/taskListView/taskList.js +8 -1
- package/lib/view/taskManager/taskListView/taskListPayload.d.ts +3 -0
- package/lib/view/taskManager/taskListView/taskListReducer.d.ts +9 -6
- package/lib/view/taskManager/taskListView/taskListReducer.js +107 -13
- package/lib/view/taskManager/taskListView/taskListSelector.d.ts +9 -3
- package/lib/view/taskManager/taskListView/taskListSelector.js +48 -39
- package/lib/view/zeniOAuthView/epics/approveOAuthConsentEpic.d.ts +27 -0
- package/lib/view/zeniOAuthView/epics/approveOAuthConsentEpic.js +68 -0
- package/lib/view/zeniOAuthView/zeniOAuthParamsParser.d.ts +16 -0
- package/lib/view/zeniOAuthView/zeniOAuthParamsParser.js +44 -0
- package/lib/view/zeniOAuthView/zeniOAuthReducer.d.ts +29 -0
- package/lib/view/zeniOAuthView/zeniOAuthReducer.js +53 -0
- package/lib/view/zeniOAuthView/zeniOAuthSelector.d.ts +5 -0
- package/lib/view/zeniOAuthView/zeniOAuthSelector.js +9 -0
- package/lib/view/zeniOAuthView/zeniOAuthState.d.ts +4 -0
- package/lib/view/zeniOAuthView/zeniOAuthState.js +2 -0
- package/package.json +1 -1
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zeniai/client-epic-state",
|
|
3
|
-
"version": "5.0.
|
|
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",
|