@zeniai/client-epic-state 4.20.2-beta0ND → 4.20.2-beta25RR

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 (167) hide show
  1. package/lib/commonStateTypes/animations.d.ts +1 -1
  2. package/lib/entity/aiCfo/aiCfoSelector.d.ts +2 -1
  3. package/lib/entity/billPay/billTransaction/billTransactionState.d.ts +2 -2
  4. package/lib/entity/jeSchedules/jeSchedulesPayload.d.ts +0 -38
  5. package/lib/entity/jeSchedules/jeSchedulesPayload.js +0 -78
  6. package/lib/entity/jeSchedules/jeSchedulesSelector.d.ts +1 -4
  7. package/lib/entity/jeSchedules/jeSchedulesSelector.js +1 -5
  8. package/lib/entity/jeSchedules/jeSchedulesState.d.ts +0 -37
  9. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  10. package/lib/entity/snackbar/snackbarTypes.js +2 -0
  11. package/lib/entity/task/taskPayload.d.ts +3 -0
  12. package/lib/entity/task/taskPayload.js +5 -0
  13. package/lib/entity/task/taskState.d.ts +3 -0
  14. package/lib/entity/tenant/tenantPayload.d.ts +0 -1
  15. package/lib/entity/tenant/tenantReducer.js +0 -1
  16. package/lib/entity/tenant/tenantSelector.d.ts +0 -1
  17. package/lib/entity/tenant/tenantSelector.js +1 -9
  18. package/lib/entity/tenant/tenantState.d.ts +0 -1
  19. package/lib/entity/transaction/payloadTypes/scheduleTransactionPayload.d.ts +1 -4
  20. package/lib/entity/transaction/payloadTypes/scheduleTransactionPayload.js +0 -1
  21. package/lib/entity/transaction/payloadTypes/transactionPayload.d.ts +0 -3
  22. package/lib/entity/transaction/payloadTypes/transactionPayload.js +1 -17
  23. package/lib/entity/transaction/stateTypes/scheduleTransaction.d.ts +0 -1
  24. package/lib/entity/transaction/stateTypes/transaction.d.ts +0 -5
  25. package/lib/entity/transaction/stateTypes/transactionLine.d.ts +1 -1
  26. package/lib/epic.d.ts +3 -2
  27. package/lib/epic.js +3 -2
  28. package/lib/esm/entity/jeSchedules/jeSchedulesPayload.js +0 -78
  29. package/lib/esm/entity/jeSchedules/jeSchedulesSelector.js +1 -5
  30. package/lib/esm/entity/snackbar/snackbarTypes.js +2 -0
  31. package/lib/esm/entity/task/taskPayload.js +5 -0
  32. package/lib/esm/entity/tenant/tenantReducer.js +0 -1
  33. package/lib/esm/entity/tenant/tenantSelector.js +0 -7
  34. package/lib/esm/entity/transaction/payloadTypes/scheduleTransactionPayload.js +0 -1
  35. package/lib/esm/entity/transaction/payloadTypes/transactionPayload.js +1 -17
  36. package/lib/esm/epic.js +3 -2
  37. package/lib/esm/index.js +9 -10
  38. package/lib/esm/view/aiCfoView/aiCfoViewReducer.js +1 -82
  39. package/lib/esm/view/aiCfoView/aiCfoViewSelector.js +2 -8
  40. package/lib/esm/view/classList/fetchClassListEpic.js +2 -9
  41. package/lib/esm/view/commonVendorView/vendorView/vendorViewSelector.js +5 -18
  42. package/lib/esm/view/commonVendorView/vendorsTabVendorView/vendorsTabVendorViewSelector.js +2 -6
  43. package/lib/esm/view/companyView/types/cockpitTypes.js +1 -0
  44. package/lib/esm/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.js +2 -2
  45. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic.js +2 -2
  46. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js +3 -4
  47. package/lib/esm/view/expenseAutomationView/expenseAutomationViewSelector.js +1 -0
  48. package/lib/esm/view/expenseAutomationView/helpers/saveTransactionHelper.js +2 -2
  49. package/lib/esm/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.js +2 -2
  50. package/lib/esm/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +1 -17
  51. package/lib/esm/view/expenseAutomationView/selectors/fluxAnalysisViewSelector.js +2 -10
  52. package/lib/esm/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +6 -63
  53. package/lib/esm/view/expenseAutomationView/selectors/missingReceiptsSelector.js +4 -12
  54. package/lib/esm/view/expenseAutomationView/selectors/reconciliationViewSelector.js +9 -22
  55. package/lib/esm/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +6 -12
  56. package/lib/esm/view/expenseAutomationView/types/jeSchedulesViewState.js +1 -18
  57. package/lib/esm/view/profitAndLossClassesView/profitAndLossClassesByClassHorizontalSelector.js +0 -3
  58. package/lib/esm/view/spendManagement/billPay/billList/billListSelector.js +0 -10
  59. package/lib/esm/view/spendManagement/billPay/billList/billListState.js +0 -1
  60. package/lib/esm/view/spendManagement/billPay/billPayReview/billPayReviewSelector.js +3 -7
  61. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelector.js +5 -5
  62. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/fetchBillPayApproversDetailsEpic.js +2 -7
  63. package/lib/esm/view/spendManagement/billPay/editBillView/editBillViewSelector.js +6 -13
  64. package/lib/esm/view/spendManagement/chargeCards/chargeCardList/chargeCardList.js +0 -1
  65. package/lib/esm/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.js +0 -2
  66. package/lib/esm/view/spendManagement/reimbursement/editRemiView/editRemiViewSelector.js +4 -7
  67. package/lib/esm/view/spendManagement/reimbursement/remiListView/remiListSelector.js +0 -12
  68. package/lib/esm/view/spendManagement/reimbursement/remiListView/remiListState.js +0 -1
  69. package/lib/esm/view/taskManager/taskDetailView/epics/archiveTaskEpic.js +2 -0
  70. package/lib/esm/view/taskManager/taskDetailView/epics/deleteTaskEpic.js +4 -0
  71. package/lib/esm/view/taskManager/taskDetailView/epics/initializeTaskToLocalStoreEpic.js +1 -0
  72. package/lib/esm/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +1 -0
  73. package/lib/esm/view/taskManager/taskDetailView/epics/snoozeTaskEpic.js +64 -0
  74. package/lib/esm/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.js +54 -0
  75. package/lib/esm/view/taskManager/taskDetailView/taskDetail.js +4 -0
  76. package/lib/esm/view/taskManager/taskDetailView/taskDetailReducer.js +49 -1
  77. package/lib/esm/view/taskManager/taskDetailView/taskDetailSelector.js +5 -2
  78. package/lib/esm/view/taskManager/taskListView/taskList.js +1 -0
  79. package/lib/esm/view/taskManager/taskListView/taskListReducer.js +23 -1
  80. package/lib/esm/view/taskManager/taskListView/taskListSelector.js +43 -11
  81. package/lib/esm/view/transactionDetail/epics/saveTransactionHelper.js +2 -2
  82. package/lib/esm/view/transactionDetail/transactionDetailLocalDataHelper.js +14 -16
  83. package/lib/index.d.ts +12 -15
  84. package/lib/index.js +34 -42
  85. package/lib/tsconfig.typecheck.tsbuildinfo +1 -1
  86. package/lib/view/aiCfoView/aiCfoViewPayload.d.ts +0 -7
  87. package/lib/view/aiCfoView/aiCfoViewReducer.d.ts +1 -15
  88. package/lib/view/aiCfoView/aiCfoViewReducer.js +2 -83
  89. package/lib/view/aiCfoView/aiCfoViewSelector.d.ts +1 -4
  90. package/lib/view/aiCfoView/aiCfoViewSelector.js +2 -9
  91. package/lib/view/aiCfoView/aiCfoViewState.d.ts +1 -15
  92. package/lib/view/auditReportView/auditReportViewState.d.ts +1 -1
  93. package/lib/view/classList/fetchClassListEpic.d.ts +1 -1
  94. package/lib/view/classList/fetchClassListEpic.js +1 -8
  95. package/lib/view/commonVendorView/vendorView/vendorViewSelector.d.ts +0 -1
  96. package/lib/view/commonVendorView/vendorView/vendorViewSelector.js +5 -18
  97. package/lib/view/commonVendorView/vendorsTabVendorView/vendorsTabVendorViewSelector.d.ts +0 -1
  98. package/lib/view/commonVendorView/vendorsTabVendorView/vendorsTabVendorViewSelector.js +2 -6
  99. package/lib/view/companyTaskManagerView/companyTaskManagerViewReducer.d.ts +2 -2
  100. package/lib/view/companyView/types/cockpitTypes.d.ts +1 -1
  101. package/lib/view/companyView/types/cockpitTypes.js +1 -0
  102. package/lib/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.js +2 -2
  103. package/lib/view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic.js +1 -1
  104. package/lib/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js +3 -4
  105. package/lib/view/expenseAutomationView/expenseAutomationViewSelector.js +1 -0
  106. package/lib/view/expenseAutomationView/helpers/saveTransactionHelper.js +2 -2
  107. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  108. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.js +2 -2
  109. package/lib/view/expenseAutomationView/payload/jeSchedulesPayload.d.ts +1 -1
  110. package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.d.ts +2 -2
  111. package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +2 -18
  112. package/lib/view/expenseAutomationView/selectorTypes/jeSchedulesSelectorTypes.d.ts +0 -2
  113. package/lib/view/expenseAutomationView/selectors/fluxAnalysisViewSelector.js +2 -10
  114. package/lib/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +6 -63
  115. package/lib/view/expenseAutomationView/selectors/missingReceiptsSelector.js +4 -12
  116. package/lib/view/expenseAutomationView/selectors/reconciliationViewSelector.js +9 -22
  117. package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +5 -11
  118. package/lib/view/expenseAutomationView/types/jeSchedulesViewState.d.ts +0 -5
  119. package/lib/view/expenseAutomationView/types/jeSchedulesViewState.js +0 -20
  120. package/lib/view/profitAndLossClassesView/profitAndLossClassesByClassHorizontalSelector.js +0 -3
  121. package/lib/view/scheduleView/scheduleListView/scheduleListTypes.d.ts +1 -1
  122. package/lib/view/spendManagement/billPay/billList/billListSelector.js +0 -10
  123. package/lib/view/spendManagement/billPay/billList/billListState.d.ts +1 -1
  124. package/lib/view/spendManagement/billPay/billList/billListState.js +0 -1
  125. package/lib/view/spendManagement/billPay/billPayReview/billPayReviewSelector.js +3 -7
  126. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewSelector.js +5 -5
  127. package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/fetchBillPayApproversDetailsEpic.js +2 -7
  128. package/lib/view/spendManagement/billPay/editBillView/editBillViewSelector.js +6 -13
  129. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardList.d.ts +1 -1
  130. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardList.js +0 -1
  131. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardListSelector.js +0 -2
  132. package/lib/view/spendManagement/reimbursement/editRemiView/editRemiViewSelector.js +3 -6
  133. package/lib/view/spendManagement/reimbursement/remiListView/remiListSelector.d.ts +0 -1
  134. package/lib/view/spendManagement/reimbursement/remiListView/remiListSelector.js +0 -12
  135. package/lib/view/spendManagement/reimbursement/remiListView/remiListState.d.ts +1 -1
  136. package/lib/view/spendManagement/reimbursement/remiListView/remiListState.js +0 -1
  137. package/lib/view/taskManager/taskDetailView/epics/archiveTaskEpic.d.ts +2 -1
  138. package/lib/view/taskManager/taskDetailView/epics/archiveTaskEpic.js +2 -0
  139. package/lib/view/taskManager/taskDetailView/epics/deleteTaskEpic.d.ts +2 -1
  140. package/lib/view/taskManager/taskDetailView/epics/deleteTaskEpic.js +4 -0
  141. package/lib/view/taskManager/taskDetailView/epics/initializeTaskToLocalStoreEpic.js +1 -0
  142. package/lib/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +1 -0
  143. package/lib/view/taskManager/taskDetailView/epics/snoozeTaskEpic.d.ts +9 -0
  144. package/lib/view/taskManager/taskDetailView/epics/snoozeTaskEpic.js +68 -0
  145. package/lib/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.d.ts +8 -0
  146. package/lib/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.js +58 -0
  147. package/lib/view/taskManager/taskDetailView/taskDetail.d.ts +2 -0
  148. package/lib/view/taskManager/taskDetailView/taskDetail.js +4 -0
  149. package/lib/view/taskManager/taskDetailView/taskDetailReducer.d.ts +10 -1
  150. package/lib/view/taskManager/taskDetailView/taskDetailReducer.js +50 -2
  151. package/lib/view/taskManager/taskDetailView/taskDetailSelector.d.ts +2 -0
  152. package/lib/view/taskManager/taskDetailView/taskDetailSelector.js +5 -2
  153. package/lib/view/taskManager/taskListView/taskList.d.ts +1 -1
  154. package/lib/view/taskManager/taskListView/taskList.js +1 -0
  155. package/lib/view/taskManager/taskListView/taskListReducer.d.ts +3 -3
  156. package/lib/view/taskManager/taskListView/taskListReducer.js +24 -2
  157. package/lib/view/taskManager/taskListView/taskListSelector.d.ts +6 -2
  158. package/lib/view/taskManager/taskListView/taskListSelector.js +43 -11
  159. package/lib/view/transactionDetail/epics/saveTransactionHelper.js +2 -2
  160. package/lib/view/transactionDetail/transactionDetailLocalDataHelper.js +14 -16
  161. package/package.json +1 -1
  162. package/lib/common/aiCfo/aiCfoSuggestedQuestionsPageContext.d.ts +0 -19
  163. package/lib/common/aiCfo/aiCfoSuggestedQuestionsPageContext.js +0 -2
  164. package/lib/esm/common/aiCfo/aiCfoSuggestedQuestionsPageContext.js +0 -1
  165. package/lib/esm/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.js +0 -29
  166. package/lib/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.d.ts +0 -8
  167. package/lib/view/aiCfoView/epics/fetchSuggestedQuestionsEpic.js +0 -33
@@ -45,7 +45,6 @@ export const getRemiList = (state, currentTimePeriod, isBulkActionFeatureEnabled
45
45
  return {
46
46
  ...reimbursement,
47
47
  submittedBy: getUserByUserId(userState, reimbursement.reimburseeUserId),
48
- createdByUser: getUserByUserId(userState, reimbursement.createdBy),
49
48
  approvers: approvers,
50
49
  };
51
50
  });
@@ -416,14 +415,6 @@ export const getRemiListOnSort = (sortKey, sortOrder, currentTab, reimbursements
416
415
  reimbursementsWithNoSortKeyValue.push(reimbursement);
417
416
  }
418
417
  break;
419
- case 'createdBy':
420
- if (reimbursement.createdByUser != null) {
421
- reimbursementsWithSortKeyValue.push(reimbursement);
422
- }
423
- else {
424
- reimbursementsWithNoSortKeyValue.push(reimbursement);
425
- }
426
- break;
427
418
  }
428
419
  });
429
420
  const getColumnWiseSortOrder = (sortOrder) => {
@@ -431,7 +422,6 @@ export const getRemiListOnSort = (sortKey, sortOrder, currentTab, reimbursements
431
422
  case 'reportName':
432
423
  case 'type':
433
424
  case 'status':
434
- case 'createdBy':
435
425
  return sortOrder === 'ascending' ? 'asc' : 'desc';
436
426
  default:
437
427
  return sortOrder === 'ascending' ? 'desc' : 'asc';
@@ -451,8 +441,6 @@ export const getRemiListOnSort = (sortKey, sortOrder, currentTab, reimbursements
451
441
  return getStatusPerTab(reimbursement);
452
442
  case 'amount':
453
443
  return reimbursement.amount.amount ?? 0;
454
- case 'createdBy':
455
- return `${reimbursement.createdByUser?.firstName ?? ''} ${reimbursement.createdByUser?.lastName ?? ''}`.toLowerCase();
456
444
  }
457
445
  }, getColumnWiseSortOrder(sortOrder));
458
446
  return [
@@ -55,7 +55,6 @@ export const toRemiSubTabUnderScoreType = (v) => stringToUnion(v, REMI_SUB_TAB_U
55
55
  const ALL_REIMBURSEMENT_SORT_KEYS = [
56
56
  'reportName',
57
57
  'submittedOn',
58
- 'createdBy',
59
58
  'type',
60
59
  'status',
61
60
  'amount',
@@ -4,6 +4,7 @@ import { openSnackbar } from '../../../../entity/snackbar/snackbarReducer';
4
4
  import { updateTasks } from '../../../../entity/task/taskReducer';
5
5
  import { getTaskById } from '../../../../entity/task/taskSelector';
6
6
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
7
+ import { removeTaskFromList } from '../../taskListView/taskListReducer';
7
8
  import { archiveTask, archiveTaskSuccessOrFailure } from '../taskDetailReducer';
8
9
  // Epic function to handle archiving of tasks
9
10
  export const archiveTaskEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(archiveTask.match), mergeMap((action) => handleArchiveTask(action.payload.taskId, state$, zeniAPI)));
@@ -25,6 +26,7 @@ const handleApiResponse = (response, taskId) => {
25
26
  response.data.tasks.length > 0) {
26
27
  const fetchActions = [
27
28
  updateTasks(response.data.tasks),
29
+ removeTaskFromList(taskId),
28
30
  archiveTaskSuccessOrFailure({
29
31
  fetchState: 'Completed',
30
32
  taskId,
@@ -2,6 +2,7 @@ import { from, of } from 'rxjs';
2
2
  import { catchError, filter, mergeMap } from 'rxjs/operators';
3
3
  import { openSnackbar } from '../../../../entity/snackbar/snackbarReducer';
4
4
  import { createZeniAPIStatus, isSuccessStatus, } from '../../../../responsePayload';
5
+ import { removeTaskFromList } from '../../taskListView/taskListReducer';
5
6
  import { deleteTask, deleteTaskSuccessOrFailure } from '../taskDetailReducer';
6
7
  export const deleteTaskEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(deleteTask.match), mergeMap((action) => {
7
8
  const { taskId } = action.payload;
@@ -10,6 +11,9 @@ export const deleteTaskEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filt
10
11
  .pipe(mergeMap((response) => {
11
12
  if (isSuccessStatus(response)) {
12
13
  const actions = [];
14
+ if (taskId != null) {
15
+ actions.push(removeTaskFromList(taskId));
16
+ }
13
17
  actions.push(deleteTaskSuccessOrFailure({ fetchState: 'Completed', taskId }));
14
18
  return from(actions);
15
19
  }
@@ -25,6 +25,7 @@ export const initializeTaskToLocalStoreEpic = (actions$, state$) => actions$.pip
25
25
  savedRecurringEndDate: task.recurringEndDate,
26
26
  recurringStartDate: task.recurringStartDate,
27
27
  timeSpent: task.timeSpent,
28
+ isPrivate: task.isPrivate,
28
29
  };
29
30
  const actions = [
30
31
  saveTaskUpdatesToLocalStore({ taskDetailLocalData, taskId }),
@@ -94,5 +94,6 @@ const prepareTaskPayload = (state, taskId, taskGroupId) => {
94
94
  sync_token: syncToken,
95
95
  task_group_ids: taskGroupId != null ? [taskGroupId] : [],
96
96
  time_spent: convertHHMMStrToMinutes(localData.timeSpent),
97
+ ...(taskId == null ? { is_private: localData.isPrivate ?? false } : {}),
97
98
  };
98
99
  };
@@ -0,0 +1,64 @@
1
+ import { from, of } from 'rxjs';
2
+ import { catchError, filter, mergeMap } from 'rxjs/operators';
3
+ import { openSnackbar } from '../../../../entity/snackbar/snackbarReducer';
4
+ import { updateTasks } from '../../../../entity/task/taskReducer';
5
+ import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
6
+ import { date } from '../../../../zeniDayJS';
7
+ import { removeTaskFromList } from '../../taskListView/taskListReducer';
8
+ import { snoozeTask, snoozeTaskSuccessOrFailure } from '../taskDetailReducer';
9
+ export const snoozeTaskEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(snoozeTask.match), mergeMap((action) => handleSnoozeTask(action.payload.taskId, action.payload.snoozedUntil, zeniAPI)));
10
+ const formatSnoozedUntilForDisplay = (snoozedUntil) => date(snoozedUntil).format('MMM D, h:mm A');
11
+ const handleSnoozeTask = (taskId, snoozedUntil, zeniAPI) => {
12
+ const snoozeTaskApi$ = zeniAPI.postAndGetJSON(`${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/tasks/${taskId}/snooze`, { snoozed_until: snoozedUntil });
13
+ return snoozeTaskApi$.pipe(mergeMap((response) => handleApiResponse(response, taskId, snoozedUntil)), catchError((error) => of(snoozeTaskSuccessOrFailure({
14
+ fetchState: 'Error',
15
+ taskId,
16
+ error: createZeniAPIStatus('Unexpected Error', 'Snooze Task REST API call errored out: ' + JSON.stringify(error)),
17
+ }))));
18
+ };
19
+ const handleApiResponse = (response, taskId, snoozedUntil) => {
20
+ if (isSuccessResponse(response) &&
21
+ response.data != null &&
22
+ response.data.tasks.length > 0) {
23
+ const fetchActions = [
24
+ updateTasks(response.data.tasks),
25
+ removeTaskFromList(taskId),
26
+ snoozeTaskSuccessOrFailure({
27
+ fetchState: 'Completed',
28
+ taskId,
29
+ }),
30
+ openSnackbar({
31
+ messageSection: 'snooze_task',
32
+ messageText: 'success',
33
+ type: 'success',
34
+ variables: [
35
+ {
36
+ variableName: '_snoozed_until_',
37
+ variableValue: formatSnoozedUntilForDisplay(snoozedUntil),
38
+ },
39
+ ],
40
+ }),
41
+ ];
42
+ return from(fetchActions);
43
+ }
44
+ else {
45
+ return from([
46
+ snoozeTaskSuccessOrFailure({
47
+ fetchState: 'Error',
48
+ taskId,
49
+ error: response.status,
50
+ }),
51
+ openSnackbar({
52
+ messageSection: 'snooze_task',
53
+ messageText: 'failed',
54
+ type: 'error',
55
+ variables: [
56
+ {
57
+ variableName: '_api-error_',
58
+ variableValue: response.status.message,
59
+ },
60
+ ],
61
+ }),
62
+ ]);
63
+ }
64
+ };
@@ -0,0 +1,54 @@
1
+ import { from, of } from 'rxjs';
2
+ import { catchError, filter, mergeMap } from 'rxjs/operators';
3
+ import { openSnackbar } from '../../../../entity/snackbar/snackbarReducer';
4
+ import { updateTasks } from '../../../../entity/task/taskReducer';
5
+ import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
6
+ import { snoozeTaskSuccessOrFailure, unsnoozeTask, } from '../taskDetailReducer';
7
+ export const unsnoozeTaskEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(unsnoozeTask.match), mergeMap((action) => handleUnsnoozeTask(action.payload.taskId, zeniAPI)));
8
+ const handleUnsnoozeTask = (taskId, zeniAPI) => {
9
+ const unsnoozeTaskApi$ = zeniAPI.deleteAndGetJSON(`${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/tasks/${taskId}/snooze`);
10
+ return unsnoozeTaskApi$.pipe(mergeMap((response) => handleApiResponse(response, taskId)), catchError((error) => of(snoozeTaskSuccessOrFailure({
11
+ fetchState: 'Error',
12
+ taskId,
13
+ error: createZeniAPIStatus('Unexpected Error', 'Unsnooze Task REST API call errored out: ' + JSON.stringify(error)),
14
+ }))));
15
+ };
16
+ const handleApiResponse = (response, taskId) => {
17
+ if (isSuccessResponse(response) &&
18
+ response.data != null &&
19
+ response.data.tasks.length > 0) {
20
+ const fetchActions = [
21
+ updateTasks(response.data.tasks),
22
+ snoozeTaskSuccessOrFailure({
23
+ fetchState: 'Completed',
24
+ taskId,
25
+ }),
26
+ openSnackbar({
27
+ messageSection: 'unsnooze_task',
28
+ messageText: 'success',
29
+ type: 'success',
30
+ }),
31
+ ];
32
+ return from(fetchActions);
33
+ }
34
+ else {
35
+ return from([
36
+ snoozeTaskSuccessOrFailure({
37
+ fetchState: 'Error',
38
+ taskId,
39
+ error: response.status,
40
+ }),
41
+ openSnackbar({
42
+ messageSection: 'unsnooze_task',
43
+ messageText: 'failed',
44
+ type: 'error',
45
+ variables: [
46
+ {
47
+ variableName: '_api-error_',
48
+ variableValue: response.status.message,
49
+ },
50
+ ],
51
+ }),
52
+ ]);
53
+ }
54
+ };
@@ -31,5 +31,9 @@ export const initialTaskDetail = {
31
31
  fetchState: 'Not-Started',
32
32
  error: undefined,
33
33
  },
34
+ snoozeStatus: {
35
+ fetchState: 'Not-Started',
36
+ error: undefined,
37
+ },
34
38
  taskDetailLocalData: initialTaskDetailLocalData,
35
39
  };
@@ -185,6 +185,54 @@ const taskDetailView = createSlice({
185
185
  draft.editTaskStateById[taskId].archiveStatus.fetchState = fetchState;
186
186
  draft.editTaskStateById[taskId].archiveStatus.error = error;
187
187
  },
188
+ snoozeTask: {
189
+ reducer(draft, action) {
190
+ const { taskId } = action.payload;
191
+ draft.editTaskStateById[taskId] = {
192
+ ...(draft.editTaskStateById[taskId] != null
193
+ ? draft.editTaskStateById[taskId]
194
+ : initialTaskDetail),
195
+ snoozeStatus: {
196
+ fetchState: 'In-Progress',
197
+ error: undefined,
198
+ },
199
+ };
200
+ },
201
+ prepare(taskId, snoozedUntil) {
202
+ return {
203
+ payload: {
204
+ taskId,
205
+ snoozedUntil,
206
+ },
207
+ };
208
+ },
209
+ },
210
+ snoozeTaskSuccessOrFailure(draft, action) {
211
+ const { taskId, fetchState, error } = action.payload;
212
+ draft.editTaskStateById[taskId].snoozeStatus.fetchState = fetchState;
213
+ draft.editTaskStateById[taskId].snoozeStatus.error = error;
214
+ },
215
+ unsnoozeTask: {
216
+ reducer(draft, action) {
217
+ const { taskId } = action.payload;
218
+ draft.editTaskStateById[taskId] = {
219
+ ...(draft.editTaskStateById[taskId] != null
220
+ ? draft.editTaskStateById[taskId]
221
+ : initialTaskDetail),
222
+ snoozeStatus: {
223
+ fetchState: 'In-Progress',
224
+ error: undefined,
225
+ },
226
+ };
227
+ },
228
+ prepare(taskId) {
229
+ return {
230
+ payload: {
231
+ taskId,
232
+ },
233
+ };
234
+ },
235
+ },
188
236
  deleteTask: {
189
237
  reducer(draft, action) {
190
238
  const { taskId } = action.payload;
@@ -270,5 +318,5 @@ const taskDetailView = createSlice({
270
318
  },
271
319
  },
272
320
  });
273
- export const { fetchTaskDetailPage, fetchTaskDetail, initializeTaskToLocalStore, updateEditTaskFetchStatus, saveTaskUpdatesToLocalStore, discardTaskUpdatesInLocalStore, saveTaskDetail, archiveTask, archiveTaskSuccessOrFailure, saveTaskSuccessOrFailure, deleteTask, removeTaskDetail, deleteTaskSuccessOrFailure, fetchTaskHistory, updateTaskHistory, updateTaskHistoryFetchStatus, clearTaskDetail, updateCreatedTagToLocalStore, updateDeletedTagToLocalStore, } = taskDetailView.actions;
321
+ export const { fetchTaskDetailPage, fetchTaskDetail, initializeTaskToLocalStore, updateEditTaskFetchStatus, saveTaskUpdatesToLocalStore, discardTaskUpdatesInLocalStore, saveTaskDetail, archiveTask, archiveTaskSuccessOrFailure, snoozeTask, snoozeTaskSuccessOrFailure, unsnoozeTask, saveTaskSuccessOrFailure, deleteTask, removeTaskDetail, deleteTaskSuccessOrFailure, fetchTaskHistory, updateTaskHistory, updateTaskHistoryFetchStatus, clearTaskDetail, updateCreatedTagToLocalStore, updateDeletedTagToLocalStore, } = taskDetailView.actions;
274
322
  export default taskDetailView.reducer;
@@ -21,11 +21,13 @@ export const getTaskDetail = (state, taskId) => {
21
21
  };
22
22
  let taskHistory = [];
23
23
  let createdByUser = undefined;
24
+ let snoozedUntil = undefined;
24
25
  if (taskId != null && sourceTaskDetail != null) {
25
26
  const taskEntity = getTaskById(taskState, taskId);
26
27
  const fileIdsInEntity = taskEntity?.fileIds ?? [];
27
28
  if (taskEntity != null) {
28
29
  createdByUser = getUserAndUserRole(userState, userRoleState, addressState, taskEntity.createdBy);
30
+ snoozedUntil = taskEntity.snoozedUntil;
29
31
  }
30
32
  if (fileIdsInEntity.length > 0) {
31
33
  fetchStatus = reduceFetchState([
@@ -74,6 +76,7 @@ export const getTaskDetail = (state, taskId) => {
74
76
  version: 0,
75
77
  createdByUser,
76
78
  showTaskDetailFormFooter,
79
+ snoozedUntil,
77
80
  };
78
81
  };
79
82
  export const allTaskStatus = [
@@ -91,11 +94,11 @@ export const allTaskStatus = [
91
94
  },
92
95
  {
93
96
  code: 'done',
94
- name: 'In Review',
97
+ name: 'Done',
95
98
  },
96
99
  {
97
100
  code: 'resolved',
98
- name: 'Complete',
101
+ name: 'Resolved',
99
102
  },
100
103
  ];
101
104
  export const allTaskPriority = [
@@ -26,6 +26,7 @@ const ALL_TASK_LIST_SORT_KEYS = [
26
26
  'status',
27
27
  'priority',
28
28
  'timeSpent',
29
+ 'visibility',
29
30
  ];
30
31
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
31
32
  const toTaskListSortKeyType = (v) => stringToUnion(v, ALL_TASK_LIST_SORT_KEYS);
@@ -404,12 +404,34 @@ const taskList = createSlice({
404
404
  draft.updateTasksFetchState.fetchState = 'Error';
405
405
  draft.updateTasksFetchState.error = action.payload.error;
406
406
  },
407
+ removeTaskFromList(draft, action) {
408
+ const taskIdToRemove = action.payload;
409
+ draft.taskIds = draft.taskIds.filter((id) => id !== taskIdToRemove);
410
+ Object.keys(draft.taskIdsByGroupsIds).forEach((groupId) => {
411
+ draft.taskIdsByGroupsIds[groupId] = draft.taskIdsByGroupsIds[groupId].filter((id) => id !== taskIdToRemove);
412
+ });
413
+ Object.keys(draft.taskIdsByPriority).forEach((key) => {
414
+ draft.taskIdsByPriority[key] = draft.taskIdsByPriority[key].filter((id) => id !== taskIdToRemove);
415
+ });
416
+ Object.keys(draft.taskIdsByStatus).forEach((key) => {
417
+ draft.taskIdsByStatus[key] = draft.taskIdsByStatus[key].filter((id) => id !== taskIdToRemove);
418
+ });
419
+ Object.keys(draft.taskIdsByDueDate).forEach((key) => {
420
+ draft.taskIdsByDueDate[key] = draft.taskIdsByDueDate[key].filter((id) => id !== taskIdToRemove);
421
+ });
422
+ Object.keys(draft.taskIdsByAssignees).forEach((key) => {
423
+ draft.taskIdsByAssignees[key] = draft.taskIdsByAssignees[key].filter((id) => id !== taskIdToRemove);
424
+ });
425
+ Object.keys(draft.taskIdsByTags).forEach((key) => {
426
+ draft.taskIdsByTags[key] = draft.taskIdsByTags[key].filter((id) => id !== taskIdToRemove);
427
+ });
428
+ },
407
429
  clearTaskList(draft) {
408
430
  Object.assign(draft, initialState);
409
431
  },
410
432
  },
411
433
  });
412
- export const { fetchTaskListPage, fetchTaskList, updateTaskList, updateTaskListFetchStatus, updateTaskListSearchText, updateTaskListUIState, updateTaskFilters, updateTaskListOnNewGroupCreationSuccess, bulkUpdateTaskList, updateTasksListOnBulkUpdateTasksSuccess, updateTasksListOnBulkUpdateTasksFailure, initiateTaskListLocalData, updateTaskListLocalData, updateTaskListOnTaskGroupDeletion, dragNDropTasks, updateTaskListOnNewTaskCreationSuccess, updateTaskListOnTaskGroupNameUpdate, updateTaskFromListView, updateTasksListOnUpdateTaskSuccess, updateTasksListOnUpdateTaskFailure, updateTaskListOnCreateTaskFromTemplateSuccess, clearTaskList, } = taskList.actions;
434
+ export const { fetchTaskListPage, fetchTaskList, updateTaskList, updateTaskListFetchStatus, updateTaskListSearchText, updateTaskListUIState, updateTaskFilters, updateTaskListOnNewGroupCreationSuccess, bulkUpdateTaskList, updateTasksListOnBulkUpdateTasksSuccess, updateTasksListOnBulkUpdateTasksFailure, initiateTaskListLocalData, updateTaskListLocalData, updateTaskListOnTaskGroupDeletion, dragNDropTasks, updateTaskListOnNewTaskCreationSuccess, updateTaskListOnTaskGroupNameUpdate, updateTaskFromListView, updateTasksListOnUpdateTaskSuccess, updateTasksListOnUpdateTaskFailure, updateTaskListOnCreateTaskFromTemplateSuccess, removeTaskFromList, clearTaskList, } = taskList.actions;
413
435
  export default taskList.reducer;
414
436
  /**
415
437
  * helpers
@@ -17,8 +17,12 @@ import { allTaskPriority, allTaskStatus, } from '../taskDetailView/taskDetailSel
17
17
  import { DUE_DATE_GROUP_KEYS, } from './taskList';
18
18
  import { initialState } from './taskListReducer';
19
19
  const isDefaultFilters = (taskListState) => {
20
- return (isEqual(taskListState.filters, initialState.filters) &&
21
- initialState.uiState.searchText === taskListState.uiState.searchText);
20
+ if (taskListState.uiState.searchText !== initialState.uiState.searchText) {
21
+ return false;
22
+ }
23
+ const hasNoActiveFilters = taskListState.filters.categories == null ||
24
+ taskListState.filters.categories.length === 0;
25
+ return (hasNoActiveFilters || isEqual(taskListState.filters, initialState.filters));
22
26
  };
23
27
  const sortTasksList = (tagState, tasksList, sortKey, sortOrder) => {
24
28
  const tasksInOrder = orderBy(tasksList, (task) => {
@@ -34,8 +38,12 @@ const sortTasksList = (tagState, tasksList, sortKey, sortOrder) => {
34
38
  return task.status.name;
35
39
  case 'priority':
36
40
  return ALL_PRIORITY_CODE.indexOf(task.priority.code);
41
+ case 'assignee':
42
+ return task.firstAssigneeSortName;
37
43
  case 'timeSpent':
38
44
  return task.timeSpent;
45
+ case 'visibility':
46
+ return task.isPrivate ? 1 : 0;
39
47
  case 'name':
40
48
  default:
41
49
  return task.name.toLowerCase();
@@ -43,7 +51,7 @@ const sortTasksList = (tagState, tasksList, sortKey, sortOrder) => {
43
51
  }, sortOrder);
44
52
  return tasksInOrder;
45
53
  };
46
- const getTasksWithUserDetails = ({ taskListState, taskState, userState, userRoleState, addressState, taskIds, tagState, }) => {
54
+ const getTasksWithUserDetails = ({ taskListState, taskState, userState, userRoleState, addressState, taskIds, tagState, userGroupsState, }) => {
47
55
  const { sortKey, searchText } = taskListState.uiState;
48
56
  const sortOrder = getSortOrder(taskListState.uiState.sortOrder);
49
57
  const tasks = taskIds
@@ -53,7 +61,18 @@ const getTasksWithUserDetails = ({ taskListState, taskState, userState, userRole
53
61
  const assigneeUsers = task.assignees
54
62
  .map((userId) => getUserAndUserRole(userState, userRoleState, addressState, userId))
55
63
  .filter((value) => value != null);
56
- return { ...task, assigneeUsers };
64
+ // Compute sort name matching display order: users first, then groups
65
+ const firstUser = assigneeUsers[0]?.user;
66
+ const firstUserName = (firstUser != null ? getUserName(firstUser) : '') ||
67
+ firstUser?.email ||
68
+ '';
69
+ const firstGroupName = task.groupAssignees
70
+ .map((gId) => userGroupsState.userGroupByUserGroupId[gId]?.name)
71
+ .find((name) => name != null && name !== '');
72
+ const firstAssigneeSortName = (firstUserName ||
73
+ firstGroupName ||
74
+ '').toLowerCase();
75
+ return { ...task, assigneeUsers, firstAssigneeSortName };
57
76
  }
58
77
  return undefined;
59
78
  })
@@ -62,7 +81,7 @@ const getTasksWithUserDetails = ({ taskListState, taskState, userState, userRole
62
81
  const sortedTaskList = sortTasksList(tagState, filteredTaskList, sortKey, sortOrder);
63
82
  return sortedTaskList;
64
83
  };
65
- const getTaskListGroupedByGroupName = ({ taskListState, taskState, taskGroupState, taskGroupViewState, userState, userRoleState, addressState, tagState, }) => {
84
+ const getTaskListGroupedByGroupName = ({ taskListState, taskState, taskGroupState, taskGroupViewState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
66
85
  const { taskGroupsIds } = taskGroupViewState;
67
86
  const taskGroupsWithTasksList = taskGroupsIds
68
87
  .map((taskGroupId) => {
@@ -76,6 +95,7 @@ const getTaskListGroupedByGroupName = ({ taskListState, taskState, taskGroupStat
76
95
  addressState,
77
96
  taskIds,
78
97
  tagState,
98
+ userGroupsState,
79
99
  });
80
100
  if (taskGroup != null) {
81
101
  return {
@@ -109,7 +129,7 @@ const getTaskListGroupedByGroupName = ({ taskListState, taskState, taskGroupStat
109
129
  }
110
130
  return sortedTaskGroupsWithTasksList;
111
131
  };
112
- export const getTaskListGroupedByAssignees = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }) => {
132
+ export const getTaskListGroupedByAssignees = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
113
133
  const assigneeGroups = Object.keys(taskListState.taskIdsByAssignees);
114
134
  const taskGroupsWithTasksList = assigneeGroups.map((groupKey) => {
115
135
  const taskIds = taskListState.taskIdsByAssignees[groupKey];
@@ -121,6 +141,7 @@ export const getTaskListGroupedByAssignees = ({ taskListState, taskState, userSt
121
141
  addressState,
122
142
  taskIds,
123
143
  tagState,
144
+ userGroupsState,
124
145
  });
125
146
  const assigneeIds = groupKey.split(',');
126
147
  const groupName = getUsersByUserIds(userState, assigneeIds)
@@ -141,7 +162,7 @@ export const getTaskListGroupedByAssignees = ({ taskListState, taskState, userSt
141
162
  }
142
163
  return taskGroupsWithTasksList;
143
164
  };
144
- export const getTaskListGroupedByPriority = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }) => {
165
+ export const getTaskListGroupedByPriority = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
145
166
  const taskGroupsWithTasksList = ALL_PRIORITY_CODE.map((groupKey) => {
146
167
  const taskIds = taskListState.taskIdsByPriority[groupKey] ?? [];
147
168
  const tasksWithUserDetails = getTasksWithUserDetails({
@@ -152,6 +173,7 @@ export const getTaskListGroupedByPriority = ({ taskListState, taskState, userSta
152
173
  addressState,
153
174
  taskIds,
154
175
  tagState,
176
+ userGroupsState,
155
177
  });
156
178
  return {
157
179
  groupName: allTaskPriority.find((priority) => priority.code === groupKey)?.name ??
@@ -166,7 +188,7 @@ export const getTaskListGroupedByPriority = ({ taskListState, taskState, userSta
166
188
  }
167
189
  return taskGroupsWithTasksList;
168
190
  };
169
- const getTaskListGroupedByStatus = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }) => {
191
+ const getTaskListGroupedByStatus = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
170
192
  const taskGroupsWithTasksList = ALL_TASK_STATUS_CODE.map((groupKey) => {
171
193
  const taskIds = taskListState.taskIdsByStatus[groupKey] ?? [];
172
194
  const tasksWithUserDetails = getTasksWithUserDetails({
@@ -177,6 +199,7 @@ const getTaskListGroupedByStatus = ({ taskListState, taskState, userState, userR
177
199
  addressState,
178
200
  taskIds,
179
201
  tagState,
202
+ userGroupsState,
180
203
  });
181
204
  return {
182
205
  groupName: allTaskStatus.find((taskStatus) => taskStatus.code === groupKey)
@@ -191,7 +214,7 @@ const getTaskListGroupedByStatus = ({ taskListState, taskState, userState, userR
191
214
  }
192
215
  return taskGroupsWithTasksList;
193
216
  };
194
- const getTaskListGroupedByTags = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }) => {
217
+ const getTaskListGroupedByTags = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
195
218
  const tagGroups = Object.keys(taskListState.taskIdsByTags);
196
219
  const taskGroupsWithTasksList = tagGroups.map((groupKey) => {
197
220
  const taskIds = taskListState.taskIdsByTags[groupKey];
@@ -203,6 +226,7 @@ const getTaskListGroupedByTags = ({ taskListState, taskState, userState, userRol
203
226
  addressState,
204
227
  taskIds,
205
228
  tagState,
229
+ userGroupsState,
206
230
  });
207
231
  const tagIds = groupKey.split(',');
208
232
  const groupName = getTagsByIds(tagState, tagIds)
@@ -222,7 +246,7 @@ const getTaskListGroupedByTags = ({ taskListState, taskState, userState, userRol
222
246
  }
223
247
  return taskGroupsWithTasksList;
224
248
  };
225
- const getTaskListGroupedByDueDate = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, }) => {
249
+ const getTaskListGroupedByDueDate = ({ taskListState, taskState, userState, userRoleState, addressState, tagState, userGroupsState, }) => {
226
250
  const taskGroupsWithTasksList = DUE_DATE_GROUP_KEYS.map((groupKey) => {
227
251
  const taskIds = taskListState.taskIdsByDueDate[groupKey];
228
252
  const tasksWithUserDetails = getTasksWithUserDetails({
@@ -233,6 +257,7 @@ const getTaskListGroupedByDueDate = ({ taskListState, taskState, userState, user
233
257
  addressState,
234
258
  taskIds,
235
259
  tagState,
260
+ userGroupsState,
236
261
  });
237
262
  return {
238
263
  groupName: groupKey,
@@ -246,7 +271,7 @@ const getTaskListGroupedByDueDate = ({ taskListState, taskState, userState, user
246
271
  }
247
272
  return taskGroupsWithTasksList;
248
273
  };
249
- const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRoleState, addressState, taskGroupState, taskGroupViewState, tagState, }) => {
274
+ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRoleState, addressState, taskGroupState, taskGroupViewState, tagState, userGroupsState, }) => {
250
275
  const { groupByKey } = taskListState.uiState;
251
276
  if (groupByKey === 'groupName') {
252
277
  return getTaskListGroupedByGroupName({
@@ -258,6 +283,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
258
283
  taskGroupState,
259
284
  taskGroupViewState,
260
285
  tagState,
286
+ userGroupsState,
261
287
  });
262
288
  }
263
289
  if (groupByKey === 'assignee') {
@@ -268,6 +294,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
268
294
  userRoleState,
269
295
  addressState,
270
296
  tagState,
297
+ userGroupsState,
271
298
  });
272
299
  }
273
300
  if (groupByKey === 'priority') {
@@ -278,6 +305,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
278
305
  userRoleState,
279
306
  addressState,
280
307
  tagState,
308
+ userGroupsState,
281
309
  });
282
310
  }
283
311
  if (groupByKey === 'status') {
@@ -288,6 +316,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
288
316
  userRoleState,
289
317
  addressState,
290
318
  tagState,
319
+ userGroupsState,
291
320
  });
292
321
  }
293
322
  if (groupByKey === 'tag') {
@@ -298,6 +327,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
298
327
  userRoleState,
299
328
  addressState,
300
329
  tagState,
330
+ userGroupsState,
301
331
  });
302
332
  }
303
333
  return getTaskListGroupedByDueDate({
@@ -307,6 +337,7 @@ const getTaskGroupsWithTaskList = ({ taskListState, taskState, userState, userRo
307
337
  userRoleState,
308
338
  addressState,
309
339
  tagState,
340
+ userGroupsState,
310
341
  });
311
342
  };
312
343
  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 +351,7 @@ export const getAllTasks = createSelector((state) => state.taskListState, (state
320
351
  taskGroupState,
321
352
  taskGroupViewState,
322
353
  tagState,
354
+ userGroupsState,
323
355
  });
324
356
  const fetchStateVariables = [
325
357
  taskListState,
@@ -75,8 +75,8 @@ export const toTransactionUpdatesFromTransactionDetailLocalData = (transactionDe
75
75
  lineItem.account?.qboId !== accountLine.account.qboId &&
76
76
  Boolean(lineItem.account?.qboId);
77
77
  hasClassChanged =
78
- (lineItem.class?.qboId != null || accountLine.class?.qboId != null) &&
79
- lineItem.class?.qboId !== accountLine.class?.qboId;
78
+ Boolean(lineItem.class?.qboId) &&
79
+ lineItem.class?.qboId !== accountLine.class.qboId;
80
80
  const recommendedAccountBase = toRecommendedAccountBase(lineItem.amount.amount, lineItem.account);
81
81
  const recommendedClassBase = toRecommendedClassBase(lineItem.amount.amount, lineItem.class);
82
82
  const latestRecommendedCategory = lineItem.recommendedAccount;