@zeniai/client-epic-state 5.0.97 → 5.0.98-betaJK1

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 (91) hide show
  1. package/lib/entity/approvalRule/approvalRuleConflict.d.ts +56 -0
  2. package/lib/entity/approvalRule/approvalRuleConflict.js +77 -0
  3. package/lib/entity/approvalRule/approvalRulePayload.d.ts +34 -5
  4. package/lib/entity/approvalRule/approvalRulePayload.js +145 -10
  5. package/lib/entity/approvalRule/approvalRuleSelector.d.ts +25 -1
  6. package/lib/entity/approvalRule/approvalRuleSelector.js +40 -0
  7. package/lib/entity/approvalRule/approvalRuleState.d.ts +59 -7
  8. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  9. package/lib/entity/snackbar/snackbarTypes.js +3 -0
  10. package/lib/entity/task/taskPayload.d.ts +1 -0
  11. package/lib/entity/task/taskPayload.js +1 -0
  12. package/lib/entity/task/taskReducer.d.ts +5 -1
  13. package/lib/entity/task/taskReducer.js +8 -2
  14. package/lib/entity/task/taskState.d.ts +1 -0
  15. package/lib/epic.d.ts +5 -1
  16. package/lib/epic.js +5 -1
  17. package/lib/esm/entity/approvalRule/approvalRuleConflict.js +74 -0
  18. package/lib/esm/entity/approvalRule/approvalRulePayload.js +145 -10
  19. package/lib/esm/entity/approvalRule/approvalRuleSelector.js +35 -0
  20. package/lib/esm/entity/snackbar/snackbarTypes.js +3 -0
  21. package/lib/esm/entity/task/taskPayload.js +1 -0
  22. package/lib/esm/entity/task/taskReducer.js +7 -1
  23. package/lib/esm/epic.js +5 -1
  24. package/lib/esm/index.js +9 -7
  25. package/lib/esm/view/spendManagement/billPay/billPayReview/billPayReviewSelector.js +14 -0
  26. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewReducer.js +109 -12
  27. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/deleteBillPayApprovalRuleEpic.js +10 -2
  28. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/fetchBillPaySetupApproverViewEpic.js +8 -4
  29. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/initializeBillPaySetupApproverViewUpdateDataEpic.js +11 -7
  30. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/reorderBillPayApprovalRulesEpic.js +54 -0
  31. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/saveBillPaySetupApproverViewUpdatesEpic.js +13 -4
  32. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/types/commonPayload.js +140 -16
  33. package/lib/esm/view/spendManagement/billPay/editBillView/editBillViewSelector.js +60 -4
  34. package/lib/esm/view/spendManagement/billPay/editBillView/epics/fetchEditBillDetailPageEpic.js +8 -2
  35. package/lib/esm/view/spendManagement/reimbursement/editRemiView/epics/fetchEditRemiDetailPageEpic.js +5 -1
  36. package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/deleteRemiApprovalRuleEpic.js +10 -2
  37. package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/fetchRemiSetupApproverViewEpic.js +8 -2
  38. package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/initializeRemiSetupApproverViewUpdateDataEpic.js +11 -7
  39. package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/reorderRemiApprovalRulesEpic.js +61 -0
  40. package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/saveRemiSetupApproverViewUpdatesEpic.js +13 -4
  41. package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewReducer.js +80 -11
  42. package/lib/esm/view/taskManager/taskDetailView/epics/createSubTaskEpic.js +80 -0
  43. package/lib/esm/view/taskManager/taskDetailView/epics/fetchSubTasksEpic.js +36 -0
  44. package/lib/esm/view/taskManager/taskDetailView/epics/fetchTaskDetailEpic.js +13 -0
  45. package/lib/esm/view/taskManager/taskDetailView/taskDetailReducer.js +51 -2
  46. package/lib/esm/view/taskManager/taskDetailView/taskDetailSelector.js +19 -8
  47. package/lib/index.d.ts +11 -9
  48. package/lib/index.js +32 -19
  49. package/lib/view/companyTaskManagerView/companyTaskManagerViewReducer.d.ts +2 -2
  50. package/lib/view/companyView/types/cockpitTypes.d.ts +1 -1
  51. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  52. package/lib/view/spendManagement/billPay/billPayReview/billPayReviewSelector.d.ts +7 -0
  53. package/lib/view/spendManagement/billPay/billPayReview/billPayReviewSelector.js +14 -0
  54. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewReducer.d.ts +14 -3
  55. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewReducer.js +110 -13
  56. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewState.d.ts +16 -0
  57. package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/deleteBillPayApprovalRuleEpic.js +10 -2
  58. package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/fetchBillPaySetupApproverViewEpic.js +8 -4
  59. package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/initializeBillPaySetupApproverViewUpdateDataEpic.js +10 -6
  60. package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/reorderBillPayApprovalRulesEpic.d.ts +23 -0
  61. package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/reorderBillPayApprovalRulesEpic.js +58 -0
  62. package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/saveBillPaySetupApproverViewUpdatesEpic.js +12 -3
  63. package/lib/view/spendManagement/billPay/billPaySetupApproverView/types/commonPayload.d.ts +59 -1
  64. package/lib/view/spendManagement/billPay/billPaySetupApproverView/types/commonPayload.js +142 -17
  65. package/lib/view/spendManagement/billPay/billPaySetupApproverView/types/commonState.d.ts +31 -5
  66. package/lib/view/spendManagement/billPay/editBillView/editBillViewSelector.d.ts +8 -1
  67. package/lib/view/spendManagement/billPay/editBillView/editBillViewSelector.js +60 -4
  68. package/lib/view/spendManagement/billPay/editBillView/epics/fetchEditBillDetailPageEpic.js +8 -2
  69. package/lib/view/spendManagement/reimbursement/editRemiView/epics/fetchEditRemiDetailPageEpic.js +5 -1
  70. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/deleteRemiApprovalRuleEpic.js +10 -2
  71. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/fetchRemiSetupApproverViewEpic.js +8 -2
  72. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/initializeRemiSetupApproverViewUpdateDataEpic.js +10 -6
  73. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/reorderRemiApprovalRulesEpic.d.ts +14 -0
  74. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/reorderRemiApprovalRulesEpic.js +65 -0
  75. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/saveRemiSetupApproverViewUpdatesEpic.js +12 -3
  76. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewReducer.d.ts +14 -3
  77. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewReducer.js +81 -12
  78. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewState.d.ts +12 -0
  79. package/lib/view/taskManager/taskDetailView/epics/createSubTaskEpic.d.ts +9 -0
  80. package/lib/view/taskManager/taskDetailView/epics/createSubTaskEpic.js +84 -0
  81. package/lib/view/taskManager/taskDetailView/epics/fetchSubTasksEpic.d.ts +8 -0
  82. package/lib/view/taskManager/taskDetailView/epics/fetchSubTasksEpic.js +40 -0
  83. package/lib/view/taskManager/taskDetailView/epics/fetchTaskDetailEpic.d.ts +2 -1
  84. package/lib/view/taskManager/taskDetailView/epics/fetchTaskDetailEpic.js +13 -0
  85. package/lib/view/taskManager/taskDetailView/taskDetail.d.ts +13 -0
  86. package/lib/view/taskManager/taskDetailView/taskDetailReducer.d.ts +14 -2
  87. package/lib/view/taskManager/taskDetailView/taskDetailReducer.js +52 -3
  88. package/lib/view/taskManager/taskDetailView/taskDetailSelector.d.ts +2 -1
  89. package/lib/view/taskManager/taskDetailView/taskDetailSelector.js +17 -6
  90. package/lib/view/taskManager/taskListView/taskList.d.ts +3 -3
  91. package/package.json +1 -1
@@ -0,0 +1,80 @@
1
+ import { from, of } from 'rxjs';
2
+ import { catchError, filter, mergeMap } from 'rxjs/operators';
3
+ import { convertHHMMStrToMinutes } from '../../../../commonStateTypes/fiscalYearHelpers/formatMinutesToFromHHMM';
4
+ import { openSnackbar } from '../../../../entity/snackbar/snackbarReducer';
5
+ import { appendSubTaskId, updateTasks, } from '../../../../entity/task/taskReducer';
6
+ import { getTaskById } from '../../../../entity/task/taskSelector';
7
+ import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
8
+ import { updateTaskListOnNewTaskCreationSuccess } from '../../taskListView/taskListReducer';
9
+ import { createSubTask, createSubTaskSuccessOrFailure, } from '../taskDetailReducer';
10
+ export const createSubTaskEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(createSubTask.match), mergeMap((action) => {
11
+ const state = state$.value;
12
+ const parentTask = getTaskById(state.taskState, action.payload.parentTaskId);
13
+ const parentTaskGroupId = parentTask?.taskGroupIds[0];
14
+ const isTaskListFetched = state.taskListState.fetchState === 'Completed';
15
+ const payload = prepareSubTaskPayload(action.payload, parentTaskGroupId);
16
+ return zeniAPI
17
+ .postAndGetJSON(`${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/tasks`, payload)
18
+ .pipe(mergeMap((response) => {
19
+ if (isSuccessResponse(response) &&
20
+ response.data != null &&
21
+ response.data.tasks.length > 0) {
22
+ const newTaskId = response.data.tasks[0].task_id;
23
+ const actions = [
24
+ updateTasks(response.data.tasks),
25
+ appendSubTaskId({
26
+ parentTaskId: action.payload.parentTaskId,
27
+ subTaskId: newTaskId,
28
+ }),
29
+ createSubTaskSuccessOrFailure({
30
+ fetchState: 'Completed',
31
+ newTaskId,
32
+ }),
33
+ openSnackbar({
34
+ messageSection: 'create_sub_task',
35
+ messageText: 'success',
36
+ type: 'success',
37
+ }),
38
+ ];
39
+ if (isTaskListFetched === true && parentTaskGroupId != null) {
40
+ actions.push(updateTaskListOnNewTaskCreationSuccess({
41
+ taskGroupId: parentTaskGroupId,
42
+ task: response.data.tasks[0],
43
+ }));
44
+ }
45
+ return from(actions);
46
+ }
47
+ else {
48
+ return of(createSubTaskSuccessOrFailure({
49
+ fetchState: 'Error',
50
+ error: response.status,
51
+ }), openSnackbar({
52
+ messageSection: 'create_sub_task',
53
+ messageText: 'failed',
54
+ type: 'error',
55
+ variables: [
56
+ {
57
+ variableName: '_api-error_',
58
+ variableValue: response.status.message,
59
+ },
60
+ ],
61
+ }));
62
+ }
63
+ }), catchError((error) => of(createSubTaskSuccessOrFailure({
64
+ fetchState: 'Error',
65
+ error: createZeniAPIStatus('Unexpected Error', 'Create Sub Task REST API call errored out' +
66
+ JSON.stringify(error)),
67
+ }))));
68
+ }));
69
+ const prepareSubTaskPayload = (subTask, parentTaskGroupId) => ({
70
+ name: subTask.name,
71
+ assignees: subTask.assignee,
72
+ description: subTask.description,
73
+ priority: subTask.priority,
74
+ status: subTask.status,
75
+ tags: subTask.tagIds,
76
+ time_spent: convertHHMMStrToMinutes(subTask.timeSpent),
77
+ group_assignees: subTask.groupAssignees,
78
+ parent_task_id: subTask.parentTaskId,
79
+ task_group_ids: parentTaskGroupId == null ? [] : [parentTaskGroupId],
80
+ });
@@ -0,0 +1,36 @@
1
+ import { of } from 'rxjs';
2
+ import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
3
+ import { updateTasks } from '../../../../entity/task/taskReducer';
4
+ import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
5
+ import { fetchSubTasks, updateSubTasks, updateSubTasksFetchStatus, } from '../taskDetailReducer';
6
+ export const fetchSubTasksEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(fetchSubTasks.match), switchMap((action) => {
7
+ const { parentTaskId } = action.payload;
8
+ const query = JSON.stringify({
9
+ task_type: 'subtasks',
10
+ parent_task_id: parentTaskId,
11
+ });
12
+ return zeniAPI
13
+ .getJSON(`${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/tasks?query=${encodeURIComponent(query)}`)
14
+ .pipe(mergeMap((response) => {
15
+ if (isSuccessResponse(response) && response.data != null) {
16
+ const { tasks } = response.data;
17
+ return of(updateTasks(tasks), updateSubTasks({
18
+ parentTaskId,
19
+ }));
20
+ }
21
+ else {
22
+ return of(updateSubTasksFetchStatus({
23
+ parentTaskId,
24
+ fetchState: 'Error',
25
+ error: response.status,
26
+ }));
27
+ }
28
+ }), catchError((error) => {
29
+ return of(updateSubTasksFetchStatus({
30
+ parentTaskId,
31
+ fetchState: 'Error',
32
+ error: createZeniAPIStatus('Unexpected Error', 'Fetch Sub Tasks REST API call errored out' +
33
+ JSON.stringify(error)),
34
+ }));
35
+ }));
36
+ }));
@@ -4,13 +4,16 @@ import { catchError, filter, mergeMap } from 'rxjs/operators';
4
4
  import { openSnackbar } from '../../../../entity/snackbar/snackbarReducer';
5
5
  import { updateTags } from '../../../../entity/tag/tagReducer';
6
6
  import { updateTasks } from '../../../../entity/task/taskReducer';
7
+ import { getTaskById } from '../../../../entity/task/taskSelector';
7
8
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
8
9
  import { fetchFileList } from '../../../fileView/fileViewReducer';
10
+ import { updateTaskListOnNewTaskCreationSuccess } from '../../taskListView/taskListReducer';
9
11
  import { fetchTaskDetail, initializeTaskToLocalStore, removeTaskDetail, updateEditTaskFetchStatus, } from '../taskDetailReducer';
10
12
  export const fetchTaskDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(fetchTaskDetail.match), mergeMap((action) => {
11
13
  const { taskId, cacheOverride } = action.payload;
12
14
  const taskActions = [];
13
15
  const state = state$.value;
16
+ const isTaskListFetched = state.taskListState.fetchState === 'Completed';
14
17
  const taskDetail = recordGet(state.taskDetailState.editTaskStateById, taskId, undefined);
15
18
  if (cacheOverride === true) {
16
19
  taskActions.push(removeTaskDetail(taskId));
@@ -32,6 +35,16 @@ export const fetchTaskDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe(
32
35
  updateTags(response.data.tasks.map((task) => task.tags).flat()),
33
36
  initializeTaskToLocalStore(taskId),
34
37
  ];
38
+ if (isTaskListFetched === true) {
39
+ const taskGroupId = response.data.tasks[0].task_group_ids?.[0];
40
+ if (taskGroupId != null) {
41
+ fetchActions.push(updateTaskListOnNewTaskCreationSuccess({
42
+ taskGroupId,
43
+ task: response.data.tasks[0],
44
+ currentTaskState: getTaskById(state.taskState, taskId),
45
+ }));
46
+ }
47
+ }
35
48
  const fileIds = response.data.tasks[0].file_ids;
36
49
  if (fileIds.length > 0) {
37
50
  fetchActions.push(fetchFileList(fileIds));
@@ -6,6 +6,11 @@ import { initialTaskDetail, } from './taskDetail';
6
6
  export const initialState = {
7
7
  newTaskState: initialTaskDetail,
8
8
  editTaskStateById: {},
9
+ subTaskCreateStatus: {
10
+ fetchState: 'Not-Started',
11
+ error: undefined,
12
+ },
13
+ subTaskListFetchStatusByParentId: {},
9
14
  taskHistoryById: {},
10
15
  };
11
16
  const taskDetailView = createSlice({
@@ -50,7 +55,7 @@ const taskDetailView = createSlice({
50
55
  updateEditTaskFetchStatus(draft, action) {
51
56
  const { taskId, fetchState, error } = action.payload;
52
57
  draft.editTaskStateById[taskId] = {
53
- ...draft.editTaskStateById[taskId],
58
+ ...(draft.editTaskStateById[taskId] ?? initialTaskDetail),
54
59
  fetchTaskStatus: {
55
60
  fetchState,
56
61
  error: fetchState === 'Error' ? error : undefined,
@@ -318,10 +323,54 @@ const taskDetailView = createSlice({
318
323
  error,
319
324
  };
320
325
  },
326
+ createSubTask: {
327
+ reducer(draft) {
328
+ draft.subTaskCreateStatus = {
329
+ fetchState: 'In-Progress',
330
+ error: undefined,
331
+ };
332
+ },
333
+ prepare(payload) {
334
+ return { payload };
335
+ },
336
+ },
337
+ createSubTaskSuccessOrFailure(draft, action) {
338
+ const { fetchState, error } = action.payload;
339
+ draft.subTaskCreateStatus = {
340
+ fetchState,
341
+ error,
342
+ };
343
+ },
344
+ fetchSubTasks: {
345
+ reducer(draft, action) {
346
+ const { parentTaskId } = action.payload;
347
+ draft.subTaskListFetchStatusByParentId[parentTaskId] = {
348
+ fetchState: 'In-Progress',
349
+ error: undefined,
350
+ };
351
+ },
352
+ prepare(parentTaskId) {
353
+ return { payload: { parentTaskId } };
354
+ },
355
+ },
356
+ updateSubTasks(draft, action) {
357
+ const { parentTaskId } = action.payload;
358
+ draft.subTaskListFetchStatusByParentId[parentTaskId] = {
359
+ fetchState: 'Completed',
360
+ error: undefined,
361
+ };
362
+ },
363
+ updateSubTasksFetchStatus(draft, action) {
364
+ const { parentTaskId, fetchState, error } = action.payload;
365
+ draft.subTaskListFetchStatusByParentId[parentTaskId] = {
366
+ fetchState,
367
+ error,
368
+ };
369
+ },
321
370
  clearTaskDetail(draft) {
322
371
  Object.assign(draft, initialState);
323
372
  },
324
373
  },
325
374
  });
326
- export const { fetchTaskDetailPage, fetchTaskDetail, initializeTaskToLocalStore, updateEditTaskFetchStatus, saveTaskUpdatesToLocalStore, discardTaskUpdatesInLocalStore, saveTaskDetail, archiveTask, archiveTaskSuccessOrFailure, saveTaskSuccessOrFailure, deleteTask, removeTaskDetail, deleteTaskSuccessOrFailure, snoozeTask, snoozeTaskSuccessOrFailure, unsnoozeTask, fetchTaskHistory, updateTaskHistory, updateTaskHistoryFetchStatus, clearTaskDetail, updateCreatedTagToLocalStore, updateDeletedTagToLocalStore, } = taskDetailView.actions;
375
+ export const { fetchTaskDetailPage, fetchTaskDetail, initializeTaskToLocalStore, updateEditTaskFetchStatus, saveTaskUpdatesToLocalStore, discardTaskUpdatesInLocalStore, saveTaskDetail, archiveTask, archiveTaskSuccessOrFailure, saveTaskSuccessOrFailure, createSubTask, createSubTaskSuccessOrFailure, fetchSubTasks, updateSubTasks, updateSubTasksFetchStatus, deleteTask, removeTaskDetail, deleteTaskSuccessOrFailure, snoozeTask, snoozeTaskSuccessOrFailure, unsnoozeTask, fetchTaskHistory, updateTaskHistory, updateTaskHistoryFetchStatus, clearTaskDetail, updateCreatedTagToLocalStore, updateDeletedTagToLocalStore, } = taskDetailView.actions;
327
376
  export default taskDetailView.reducer;
@@ -1,8 +1,8 @@
1
1
  import isEqual from 'lodash/isEqual';
2
- import { reduceFetchState } from '../../../commonStateTypes/reduceFetchState';
2
+ import { reduceAnyFetchState } from '../../../commonStateTypes/reduceFetchState';
3
3
  import { getClassesByIds } from '../../../entity/class/classSelector';
4
4
  import { getFilesByFileIds } from '../../../entity/file/fileSelector';
5
- import { getTaskById } from '../../../entity/task/taskSelector';
5
+ import { getTaskById, getTasksByIds } from '../../../entity/task/taskSelector';
6
6
  import { getUserAndUserRole, } from '../../companyView/types/userAndRole';
7
7
  import { getFileDeleteStatusById, getFileUpdateNameStatusById, } from '../../fileView/fileViewSelector';
8
8
  import { getUserList, } from '../../userListView/userListViewSelector';
@@ -27,8 +27,13 @@ export const getTaskDetail = (state, taskId) => {
27
27
  let recurringSourceTaskId = undefined;
28
28
  let snoozedUntil = undefined;
29
29
  let taskGroupId = undefined;
30
+ let subtasks = [];
30
31
  if (taskId != null && sourceTaskDetail != null) {
31
32
  const taskEntity = getTaskById(taskState, taskId);
33
+ subtasks =
34
+ taskEntity != null
35
+ ? getTasksByIds(taskState, taskEntity.subTasksIds)
36
+ : [];
32
37
  const fileIdsInEntity = taskEntity?.fileIds ?? [];
33
38
  if (taskEntity != null) {
34
39
  createdByUser = getUserAndUserRole(userState, userRoleState, addressState, taskEntity.createdBy);
@@ -39,25 +44,27 @@ export const getTaskDetail = (state, taskId) => {
39
44
  taskGroupId = taskEntity.taskGroupIds[0];
40
45
  }
41
46
  if (fileIdsInEntity.length > 0) {
42
- fetchStatus = reduceFetchState([
47
+ fetchStatus = reduceAnyFetchState([
43
48
  fileViewState.fetchFilesStatus,
44
49
  sourceTaskDetail.fetchTaskStatus,
45
50
  userList,
46
51
  classListState,
52
+ taskDetailState.subTaskListFetchStatusByParentId[taskId] ?? fetchStatus,
47
53
  ]);
48
54
  }
49
55
  else {
50
- fetchStatus = reduceFetchState([
56
+ fetchStatus = reduceAnyFetchState([
51
57
  sourceTaskDetail.fetchTaskStatus,
52
58
  userList,
53
59
  classListState,
60
+ taskDetailState.subTaskListFetchStatusByParentId[taskId] ?? fetchStatus,
54
61
  ]);
55
62
  }
56
63
  showTaskDetailFormFooter = showFormFooter(sourceTaskDetail.taskDetailLocalData, taskEntity);
57
64
  taskHistory = taskDetailState.taskHistoryById[taskId]?.historicEvents ?? [];
58
65
  }
59
66
  else if (taskId == null) {
60
- fetchStatus = reduceFetchState([userList, classListState]);
67
+ fetchStatus = reduceAnyFetchState([userList, classListState]);
61
68
  }
62
69
  const { classIds } = classListState;
63
70
  const allAccountingClasses = getClassesByIds(classState, {
@@ -90,6 +97,7 @@ export const getTaskDetail = (state, taskId) => {
90
97
  showTaskDetailFormFooter,
91
98
  snoozedUntil,
92
99
  taskGroupId,
100
+ subtasks,
93
101
  };
94
102
  };
95
103
  export const allTaskStatus = [
@@ -137,13 +145,16 @@ export const allTaskPriority = [
137
145
  },
138
146
  ];
139
147
  const showFormFooter = (taskDetailLocalData, taskDetailInStore) => {
140
- if (taskDetailLocalData.name !== taskDetailInStore?.name ||
148
+ if (taskDetailInStore == null) {
149
+ return false;
150
+ }
151
+ if (taskDetailLocalData.name !== taskDetailInStore.name ||
141
152
  taskDetailLocalData.description !== taskDetailInStore.description ||
142
153
  taskDetailLocalData.priority !== taskDetailInStore.priority.code ||
143
154
  taskDetailLocalData.status !== taskDetailInStore.status.code ||
144
155
  !isEqual(taskDetailInStore.tagIds, taskDetailLocalData.tagIds) ||
145
- !isEqual(taskDetailLocalData.assignee, taskDetailInStore?.assignees ?? []) ||
146
- !isEqual(taskDetailLocalData.groupAssignees, taskDetailInStore?.groupAssignees ?? []) ||
156
+ !isEqual(taskDetailLocalData.assignee, taskDetailInStore.assignees ?? []) ||
157
+ !isEqual(taskDetailLocalData.groupAssignees, taskDetailInStore.groupAssignees ?? []) ||
147
158
  !isEqual(taskDetailLocalData.fileIds, taskDetailInStore.fileIds ?? []) ||
148
159
  !isEqual(taskDetailLocalData.dueDate, taskDetailInStore.dueDate) ||
149
160
  !isEqual(taskDetailLocalData.type, taskDetailInStore.type) ||
package/lib/index.d.ts CHANGED
@@ -52,7 +52,9 @@ import { AccountReconciliationEntity, getAccountReconByAccountIdAndSelectedPerio
52
52
  import { BalanceDataStatusCodeType, BankStatusCodeType, RecommendedActionCodeType, ReconciliationStatusCodeType, StatementDataStatusCodeType, StatementStatusCodeType, TransactionsToReview } from './entity/accountRecon/accountReconState';
53
53
  import { getAddressByAddressId } from './entity/address/addressSelector';
54
54
  import { Address } from './entity/address/addressState';
55
- import { Actor, ActorType, ApprovalActionType, ApprovalRule, ApprovalRuleState, Approvers, AttributeType, RoleType, Step, StepOperatorType, toAttributeOrRoleTypeStrict, toAttributeTypeStrict, toRoleTypeStrict } from './entity/approvalRule/approvalRuleState';
55
+ import { Actor, ActorType, AmountComparator, AmountCriteria, ApprovalActionType, ApprovalRule, ApprovalRuleState, Approvers, AttributeType, ConditionType, Criteria, DepartmentCriteria, RoleType, Step, StepOperatorType, VendorCriteria, toAttributeOrRoleTypeStrict, toAttributeTypeStrict, toRoleTypeStrict } from './entity/approvalRule/approvalRuleState';
56
+ import { getAmountCriteria, getApprovalRulesByEntityType, getDepartmentCriteria, getFallbackApprovalRule, getVendorCriteria } from './entity/approvalRule/approvalRuleSelector';
57
+ import { DetectRuleOverlapInput, RuleForOverlapCheck, RuleOverlap, detectRuleOverlap } from './entity/approvalRule/approvalRuleConflict';
56
58
  import { BankAccount } from './entity/bankAccount/bankAccount';
57
59
  import { BillPayInfo, BillPaymentRefundStatus, BillPaymentRefundStatusCodeType, BillPaymentStatus, BillPaymentStatusCodeType, BillStage, BillStageCodeType, BillStatus, BillStatusCodeType, BillTransaction, DeletionSourceType, InternationalTransferFeeBearerPaymentMethod, toOutsideZeniPaymentModeType } from './entity/billPay/billTransaction/billTransactionState';
58
60
  import { Contact } from './entity/billPay/contact/contact';
@@ -421,7 +423,7 @@ import { getInternationalSubConfigCodeKey } from './view/spendManagement/billPay
421
423
  import { AccountTypeSubConfigCodeKeyType, BILL_NEW_PAYMENT_METHODS, BillPayConfig, BillPaymentConfigCodeType, BillPaymentSubConfigCodeType, InternationalSubConfigCodeType, LOCAL_CURRENCY_INTERNATIONAL_METHOD_SUBTEXT, NEW_INTERNATIONAL_METHOD_SUBTEXT, SWIFT_OUR_INTERNATIONAL_METHOD_SUBTEXT, VendorCurrency } from './view/spendManagement/billPay/billPayConfig/billPayConfigState';
422
424
  import { clearBillPayReview, fetchDuplicateBill } from './view/spendManagement/billPay/billPayReview/billPayReviewReducer';
423
425
  import { BillPayReviewSelectorView, DuplicateBillsSelectorView, getReviewPageBillDetail } from './view/spendManagement/billPay/billPayReview/billPayReviewSelector';
424
- import { clearBillPaySetupApproverView, clearBillPaySetupApproverViewUpdateData, deleteBillPayApprovalRule, fetchBillPayApproversDetails, fetchBillPayApproversList, fetchBillPaySetupApproverView, initializeBillPaySetupApproverViewUpdateData, saveBillPaySetupApproverViewUpdateData, saveBillPaySetupApproverViewUpdates, setListeningToPusherEvent as setBillsSetupApproverViewListeningToPusherEvent } from './view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewReducer';
426
+ import { clearBillPaySetupApproverView, clearBillPaySetupApproverViewUpdateData, deleteBillPayApprovalRule, fetchBillPayApproversDetails, fetchBillPayApproversList, fetchBillPaySetupApproverView, initializeBillPaySetupApproverViewUpdateData, reorderBillPayApprovalRules, saveBillPaySetupApproverViewUpdateData, saveBillPaySetupApproverViewUpdates, setListeningToPusherEvent as setBillsSetupApproverViewListeningToPusherEvent } from './view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewReducer';
425
427
  import { getBillPaySetupApproverUpdateDataView, getBillPaySetupApproverView } from './view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelector';
426
428
  import { ApprovalRuleWithUser as BillPayApprovalRuleWithUser, BillPaySetupApproverUpdateDataView, BillPaySetupApproverView } from './view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelectorTypes';
427
429
  import { BillPaySetupApproverViewState } from './view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewState';
@@ -506,7 +508,7 @@ import { RemiListDownloadReport, getRemiDownloadList } from './view/spendManagem
506
508
  import { fetchRemiList, fetchRemiListPerTab, updateRemiDetailSaveRemiCode, updateRemiListDownloadUIState, updateFilterResult as updateRemiListFilterResult, updateSearchResult as updateRemiListSearchResult, updateSubTab as updateRemiListSubTab, updateTab as updateRemiListTab, updateRemiListUIState } from './view/spendManagement/reimbursement/remiListView/remiListReducer';
507
509
  import { ReimbursementView, RemiListReport, getRemiList } from './view/spendManagement/reimbursement/remiListView/remiListSelector';
508
510
  import { REIMBURSEMENT_FILTER_CATEGORIES, REIMBURSEMENT_FILTER_CATEGORIES_RESTRICTED, ReimbursementFilterCategory, ReimbursementFilters, ReimbursementViewSortKey, RemiBulkSelectExceptionInfoType, RemiListUIState, RemiListViewFilterCategoryField, RemiSubTabType, RemiTabType, toRemiSubTabType, toRemiSubTabTypeStrict, toRemiTabType, toRemiTabTypeStrict } from './view/spendManagement/reimbursement/remiListView/remiListState';
509
- import { clearRemiSetupApproverView, clearRemiSetupApproverViewUpdateData, deleteRemiApprovalRule, fetchRemiApproversDetails, fetchRemiApproversList, fetchRemiSetupApproverView, initializeRemiSetupApproverViewUpdateData, saveRemiSetupApproverViewUpdateData, saveRemiSetupApproverViewUpdates, setListeningToPusherEvent as setRemiSetupApproverViewListeningToPusherEvent } from './view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewReducer';
511
+ import { clearRemiSetupApproverView, clearRemiSetupApproverViewUpdateData, deleteRemiApprovalRule, fetchRemiApproversDetails, fetchRemiApproversList, fetchRemiSetupApproverView, initializeRemiSetupApproverViewUpdateData, reorderRemiApprovalRules, saveRemiSetupApproverViewUpdateData, saveRemiSetupApproverViewUpdates, setListeningToPusherEvent as setRemiSetupApproverViewListeningToPusherEvent } from './view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewReducer';
510
512
  import { getRemiSetupApproverUpdateDataView, getRemiSetupApproverView } from './view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewSelector';
511
513
  import { ApprovalRuleWithUser as RemiApprovalRuleWithUser, RemiSetupApproverUpdateDataView, RemiSetupApproverView } from './view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewSelectorTypes';
512
514
  import { RemiSetupApproverViewState } from './view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewState';
@@ -557,8 +559,8 @@ import { TagViewState } from './view/tagView/tagViewState';
557
559
  import { CannedResponse, CannedResponsesViewState } from './view/taskManager/cannedResponsesView/cannedResponses';
558
560
  import { deleteCannedResponse, fetchCannedResponses, saveCannedResponse } from './view/taskManager/cannedResponsesView/cannedResponsesReducer';
559
561
  import { getCannedResponsesView } from './view/taskManager/cannedResponsesView/cannedResponsesSelector';
560
- import { EditTaskLocalData, initialTaskDetail, initialTaskDetailLocalData } from './view/taskManager/taskDetailView/taskDetail';
561
- import { archiveTask, deleteTask, discardTaskUpdatesInLocalStore, fetchTaskDetailPage, saveTaskDetail, saveTaskUpdatesToLocalStore, snoozeTask, unsnoozeTask } from './view/taskManager/taskDetailView/taskDetailReducer';
562
+ import { CreateSubTaskPayload, EditTaskLocalData, initialTaskDetail, initialTaskDetailLocalData } from './view/taskManager/taskDetailView/taskDetail';
563
+ import { archiveTask, createSubTask, deleteTask, discardTaskUpdatesInLocalStore, fetchSubTasks, fetchTaskDetailPage, saveTaskDetail, saveTaskUpdatesToLocalStore, snoozeTask, unsnoozeTask } from './view/taskManager/taskDetailView/taskDetailReducer';
562
564
  import { TaskDetailSelectorView, allTaskPriority, allTaskStatus, getTaskDetail } from './view/taskManager/taskDetailView/taskDetailSelector';
563
565
  import { createTaskFromTaskGroupTemplate } from './view/taskManager/taskGroupTemplateView/taskGroupTemplateViewReducer';
564
566
  import { createNewTaskGroup, deleteTaskGroup, fetchAllTaskGroups, updateTaskGroupName } from './view/taskManager/taskGroupView/taskGroupViewReducer';
@@ -816,9 +818,9 @@ export { RemiSetupViewState, RemiSetupViewLocalData, MileageDetailsLocalData, Mi
816
818
  export { PaymentAccount, Logo, VERIFIED_PAYMENT_ACCOUNT_PROVIDER_VERIFICATION_STATUS, };
817
819
  export { SubscriptionPaymentAccount };
818
820
  export { PreviousBillsSelectorView, InvoiceProcessingPayload, InvoiceProcessingResponse, isSuccessResponse, isInvalidSessionError, isAccessDeniedError, };
819
- export { Step, Actor as ApprovalRuleActor, ActorType, ApprovalActionType, StepOperatorType, ApprovalRuleState, ApprovalRule, AttributeType, Approvers, RoleType, EntityApprovalStatusState, EntityApprovalStatus, SpendManagementEntityType, SpendManagementEntityTypeWithOtherConnection, toAttributeTypeStrict, toAttributeOrRoleTypeStrict, toRoleTypeStrict, };
820
- export { ApprovalRuleUpdateData, ApprovalRuleCreateData, BillPayApprovalRuleWithUser, ApprovalUpdateActionType, ApproverViewUpdateData, BillPaySetupApproverViewState, BillPaySetupApproverView, BillPaySetupApproverUpdateDataView, getBillPaySetupApproverView, getBillPaySetupApproverUpdateDataView, fetchBillPaySetupApproverView, fetchBillPayApproversDetails, fetchBillPayApproversList, deleteBillPayApprovalRule, saveBillPaySetupApproverViewUpdateData, saveBillPaySetupApproverViewUpdates, setBillsSetupApproverViewListeningToPusherEvent, initializeBillPaySetupApproverViewUpdateData, clearBillPaySetupApproverViewUpdateData, clearBillPaySetupApproverView, };
821
- export { RemiApprovalRuleWithUser, RemiSetupApproverViewState, RemiSetupApproverView, RemiSetupApproverUpdateDataView, getRemiSetupApproverView, getRemiSetupApproverUpdateDataView, fetchRemiSetupApproverView, fetchRemiApproversList, fetchRemiApproversDetails, deleteRemiApprovalRule, saveRemiSetupApproverViewUpdateData, saveRemiSetupApproverViewUpdates, initializeRemiSetupApproverViewUpdateData, setRemiSetupApproverViewListeningToPusherEvent, clearRemiSetupApproverViewUpdateData, clearRemiSetupApproverView, };
821
+ export { Step, Actor as ApprovalRuleActor, ActorType, ApprovalActionType, StepOperatorType, ApprovalRuleState, ApprovalRule, AmountComparator, AmountCriteria, ConditionType, Criteria, DepartmentCriteria, VendorCriteria, AttributeType, Approvers, RoleType, EntityApprovalStatusState, EntityApprovalStatus, SpendManagementEntityType, SpendManagementEntityTypeWithOtherConnection, getAmountCriteria, getApprovalRulesByEntityType, getDepartmentCriteria, getFallbackApprovalRule, getVendorCriteria, toAttributeTypeStrict, toAttributeOrRoleTypeStrict, toRoleTypeStrict, DetectRuleOverlapInput, RuleForOverlapCheck, RuleOverlap, detectRuleOverlap, };
822
+ export { ApprovalRuleUpdateData, ApprovalRuleCreateData, BillPayApprovalRuleWithUser, ApprovalUpdateActionType, ApproverViewUpdateData, BillPaySetupApproverViewState, BillPaySetupApproverView, BillPaySetupApproverUpdateDataView, getBillPaySetupApproverView, getBillPaySetupApproverUpdateDataView, fetchBillPaySetupApproverView, fetchBillPayApproversDetails, fetchBillPayApproversList, deleteBillPayApprovalRule, reorderBillPayApprovalRules, saveBillPaySetupApproverViewUpdateData, saveBillPaySetupApproverViewUpdates, setBillsSetupApproverViewListeningToPusherEvent, initializeBillPaySetupApproverViewUpdateData, clearBillPaySetupApproverViewUpdateData, clearBillPaySetupApproverView, };
823
+ export { RemiApprovalRuleWithUser, RemiSetupApproverViewState, RemiSetupApproverView, RemiSetupApproverUpdateDataView, getRemiSetupApproverView, getRemiSetupApproverUpdateDataView, fetchRemiSetupApproverView, fetchRemiApproversList, fetchRemiApproversDetails, deleteRemiApprovalRule, reorderRemiApprovalRules, saveRemiSetupApproverViewUpdateData, saveRemiSetupApproverViewUpdates, initializeRemiSetupApproverViewUpdateData, setRemiSetupApproverViewListeningToPusherEvent, clearRemiSetupApproverViewUpdateData, clearRemiSetupApproverView, };
822
824
  export { RemiDetailViewSelector, getRemiDetailView, RemiActivity, RemiDetails, checkApproveRejectBtnShowForRemi, };
823
825
  export { RemiApprovalType, RemiDetailView, DuplicateLine };
824
826
  export { saveRealTimeApproval, updateIsEditModeRealTimeApprovals, RealTimeApprovalDetailLocalData, RealTimeStepsData, };
@@ -887,7 +889,7 @@ export { fetchGlobalMerchantRecommendation, createGlobalMerchant, updateCreateGl
887
889
  export { approveVendorGlobalReview, rejectVendorGlobalReview, fetchVendorGlobalReviewView, updateSelectedGlobalMerchant, updateVendorGlobalReviewViewUIState, getVendorGlobalReviewView, getTenantMerchantByMerchantId, toVendorGlobalReviewColumnSortKeyType, VendorGlobalReview, VendorGlobalReviewViewUIState, VendorGlobalReviewViewColumnSortKey, VendorGlobalReviewViewSelectorView, VendorGlobalReviewViewState, VendorGlobalReviewViewLocalData, updateVendorGlobalReviewViewLocalData, GlobalReviewPageCurrentSelectionByColumn, GlobalRecommendationFetchSource, };
888
890
  export { fetchArAging, updateArAgingUIState, fetchArAgingDetail, updateArAgingDetailUIState, ArAgingReport, ArAgingDetail, NestedAgingBalancesByCustomer, getArAgingReport, getArAgingDetailForCustomer, updateArAgingNodeCollapseState, };
889
891
  export { toRecurringBillFrequency, toRecurringBillFrequencyStrict, RecurringBillFrequency, RecurringBillDetail, RecurringBillConfig, RecurringBillStatus, RecurringBillPaymentStatus, };
890
- export { Task, TaskPayload, 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, };
892
+ export { Task, TaskPayload, TaskListSelectorView, TaskWithUserDetails, TaskListViewSortKey, TaskListUIState, TaskDetailSelectorView, EditTaskLocalData, TaskStatusCodeType, PriorityCodeType, getTaskGroupById, TaskStatus, TaskPriority, TaskCodeType, getAllTasks, fetchTaskListPage, getTaskDetail, fetchTaskDetailPage, saveTaskUpdatesToLocalStore, saveTaskDetail, createSubTask, fetchSubTasks, CreateSubTaskPayload, 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, };
891
893
  export { Tag, TagState, TagViewState, getAllTags, TagViewSelectorView, fetchTagList, createTag, deleteTag, };
892
894
  export { CardPayment, CardPaymentViewState, SetupIntentData, CardPaymentSelectorView, getAllCardsAndBankPaymentMethods, createCardSetupIntent, confirmCardSetupIntent, addCardPaymentSource, fetchPaymentSources, resetCardPaymentErrorStatuses, clearCardPaymentView, AddCardPaymentSourceType, };
893
895
  export { getAuditReportGroupViewSelectorView, getAuditRuleGroupViewSelectorView, getUserFromAllUsers, AuditReportGroupSelectorView, AuditReportGroupViewSelectorView, AuditRuleGroupViewSelectorView, fetchAuditRuleGroupView, fetchAuditReportGroupView, saveReasonForAuditRule, AuditRuleGroup, AuditRuleGroupReport, AuditReportRule, AuditRuleEntityType, AuditRuleEntityIdType, AuditRuleBypassReason, clearAuditReportGroupViewByCompanyId, };