@zeniai/client-epic-state 5.0.26 → 5.0.27-betaRR01

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 (107) hide show
  1. package/lib/commonStateTypes/fiscalYearHelpers/formatZeniDateFY.d.ts +1 -0
  2. package/lib/commonStateTypes/fiscalYearHelpers/formatZeniDateFY.js +2 -1
  3. package/lib/entity/file/fileState.d.ts +4 -4
  4. package/lib/entity/file/fileState.js +4 -0
  5. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  6. package/lib/entity/snackbar/snackbarTypes.js +2 -0
  7. package/lib/entity/task/taskPayload.d.ts +3 -0
  8. package/lib/entity/task/taskPayload.js +5 -0
  9. package/lib/entity/task/taskState.d.ts +3 -0
  10. package/lib/entity/tenant/clearAllEpic.d.ts +2 -1
  11. package/lib/entity/tenant/clearAllEpic.js +2 -0
  12. package/lib/entity/transaction/stateTypes/attachment.d.ts +2 -2
  13. package/lib/epic.d.ts +6 -1
  14. package/lib/epic.js +6 -1
  15. package/lib/esm/commonStateTypes/fiscalYearHelpers/formatZeniDateFY.js +1 -0
  16. package/lib/esm/entity/file/fileState.js +4 -0
  17. package/lib/esm/entity/snackbar/snackbarTypes.js +2 -0
  18. package/lib/esm/entity/task/taskPayload.js +5 -0
  19. package/lib/esm/entity/tenant/clearAllEpic.js +2 -0
  20. package/lib/esm/epic.js +6 -1
  21. package/lib/esm/index.js +5 -4
  22. package/lib/esm/reducer.js +3 -0
  23. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchCompletedTransactionsEpic.js +6 -2
  24. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.js +7 -2
  25. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js +5 -5
  26. package/lib/esm/view/expenseAutomationView/epics/transactionCategorization/updateTransactionCategorizationEpic.js +9 -1
  27. package/lib/esm/view/expenseAutomationView/reducers/missingReceiptsViewReducer.js +7 -3
  28. package/lib/esm/view/expenseAutomationView/selectors/missingReceiptsSelector.js +2 -0
  29. package/lib/esm/view/taskManager/cannedResponsesView/cannedResponses.js +1 -0
  30. package/lib/esm/view/taskManager/cannedResponsesView/cannedResponsesPayload.js +12 -0
  31. package/lib/esm/view/taskManager/cannedResponsesView/cannedResponsesReducer.js +64 -0
  32. package/lib/esm/view/taskManager/cannedResponsesView/epics/deleteCannedResponseEpic.js +17 -0
  33. package/lib/esm/view/taskManager/cannedResponsesView/epics/fetchCannedResponsesEpic.js +21 -0
  34. package/lib/esm/view/taskManager/cannedResponsesView/epics/saveCannedResponseEpic.js +29 -0
  35. package/lib/esm/view/taskManager/taskDetailView/epics/archiveTaskEpic.js +3 -0
  36. package/lib/esm/view/taskManager/taskDetailView/epics/deleteTaskEpic.js +5 -0
  37. package/lib/esm/view/taskManager/taskDetailView/epics/initializeTaskToLocalStoreEpic.js +1 -0
  38. package/lib/esm/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +1 -0
  39. package/lib/esm/view/taskManager/taskDetailView/epics/snoozeTaskEpic.js +66 -0
  40. package/lib/esm/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.js +57 -0
  41. package/lib/esm/view/taskManager/taskDetailView/taskDetail.js +4 -0
  42. package/lib/esm/view/taskManager/taskDetailView/taskDetailReducer.js +60 -7
  43. package/lib/esm/view/taskManager/taskDetailView/taskDetailSelector.js +12 -0
  44. package/lib/esm/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.js +56 -21
  45. package/lib/esm/view/taskManager/taskListView/epics/dragNDropTasksEpic.js +1 -0
  46. package/lib/esm/view/taskManager/taskListView/epics/fetchTaskListEpic.js +13 -4
  47. package/lib/esm/view/taskManager/taskListView/epics/updateTaskFromListViewEpic.js +3 -2
  48. package/lib/esm/view/taskManager/taskListView/taskList.js +7 -0
  49. package/lib/esm/view/taskManager/taskListView/taskListReducer.js +106 -12
  50. package/lib/esm/view/taskManager/taskListView/taskListSelector.js +48 -39
  51. package/lib/index.d.ts +6 -4
  52. package/lib/index.js +14 -5
  53. package/lib/reducer.d.ts +3 -0
  54. package/lib/reducer.js +3 -0
  55. package/lib/tsconfig.typecheck.tsbuildinfo +1 -1
  56. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchCompletedTransactionsEpic.js +6 -2
  57. package/lib/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.js +7 -2
  58. package/lib/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.d.ts +6 -4
  59. package/lib/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js +4 -4
  60. package/lib/view/expenseAutomationView/epics/transactionCategorization/updateTransactionCategorizationEpic.js +9 -1
  61. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  62. package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.d.ts +7 -7
  63. package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.js +7 -3
  64. package/lib/view/expenseAutomationView/selectorTypes/missingReceiptsSelectorTypes.d.ts +4 -2
  65. package/lib/view/expenseAutomationView/selectors/missingReceiptsSelector.js +2 -0
  66. package/lib/view/expenseAutomationView/types/missingReceiptsViewState.d.ts +2 -2
  67. package/lib/view/taskManager/cannedResponsesView/cannedResponses.d.ts +19 -0
  68. package/lib/view/taskManager/cannedResponsesView/cannedResponses.js +2 -0
  69. package/lib/view/taskManager/cannedResponsesView/cannedResponsesPayload.d.ts +21 -0
  70. package/lib/view/taskManager/cannedResponsesView/cannedResponsesPayload.js +15 -0
  71. package/lib/view/taskManager/cannedResponsesView/cannedResponsesReducer.d.ts +30 -0
  72. package/lib/view/taskManager/cannedResponsesView/cannedResponsesReducer.js +68 -0
  73. package/lib/view/taskManager/cannedResponsesView/epics/deleteCannedResponseEpic.d.ts +7 -0
  74. package/lib/view/taskManager/cannedResponsesView/epics/deleteCannedResponseEpic.js +21 -0
  75. package/lib/view/taskManager/cannedResponsesView/epics/fetchCannedResponsesEpic.d.ts +7 -0
  76. package/lib/view/taskManager/cannedResponsesView/epics/fetchCannedResponsesEpic.js +25 -0
  77. package/lib/view/taskManager/cannedResponsesView/epics/saveCannedResponseEpic.d.ts +7 -0
  78. package/lib/view/taskManager/cannedResponsesView/epics/saveCannedResponseEpic.js +33 -0
  79. package/lib/view/taskManager/taskDetailView/epics/archiveTaskEpic.d.ts +2 -1
  80. package/lib/view/taskManager/taskDetailView/epics/archiveTaskEpic.js +3 -0
  81. package/lib/view/taskManager/taskDetailView/epics/deleteTaskEpic.d.ts +2 -1
  82. package/lib/view/taskManager/taskDetailView/epics/deleteTaskEpic.js +5 -0
  83. package/lib/view/taskManager/taskDetailView/epics/initializeTaskToLocalStoreEpic.js +1 -0
  84. package/lib/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +1 -0
  85. package/lib/view/taskManager/taskDetailView/epics/snoozeTaskEpic.d.ts +9 -0
  86. package/lib/view/taskManager/taskDetailView/epics/snoozeTaskEpic.js +70 -0
  87. package/lib/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.d.ts +9 -0
  88. package/lib/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.js +61 -0
  89. package/lib/view/taskManager/taskDetailView/taskDetail.d.ts +2 -0
  90. package/lib/view/taskManager/taskDetailView/taskDetail.js +4 -0
  91. package/lib/view/taskManager/taskDetailView/taskDetailReducer.d.ts +10 -1
  92. package/lib/view/taskManager/taskDetailView/taskDetailReducer.js +61 -8
  93. package/lib/view/taskManager/taskDetailView/taskDetailSelector.d.ts +5 -0
  94. package/lib/view/taskManager/taskDetailView/taskDetailSelector.js +12 -0
  95. package/lib/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.d.ts +6 -7
  96. package/lib/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.js +56 -22
  97. package/lib/view/taskManager/taskListView/epics/dragNDropTasksEpic.js +1 -0
  98. package/lib/view/taskManager/taskListView/epics/fetchTaskListEpic.js +13 -4
  99. package/lib/view/taskManager/taskListView/epics/updateTaskFromListViewEpic.js +3 -2
  100. package/lib/view/taskManager/taskListView/taskList.d.ts +14 -1
  101. package/lib/view/taskManager/taskListView/taskList.js +8 -1
  102. package/lib/view/taskManager/taskListView/taskListPayload.d.ts +3 -0
  103. package/lib/view/taskManager/taskListView/taskListReducer.d.ts +9 -6
  104. package/lib/view/taskManager/taskListView/taskListReducer.js +107 -13
  105. package/lib/view/taskManager/taskListView/taskListSelector.d.ts +9 -3
  106. package/lib/view/taskManager/taskListView/taskListSelector.js +48 -39
  107. package/package.json +1 -1
@@ -33,11 +33,15 @@ const fetchCompletedTransactionsEpic = (actions$, state$, zeniAPI) => actions$.p
33
33
  const queryPayload = {
34
34
  start_date: period.start,
35
35
  end_date: period.end,
36
- sort_by: sortKey,
37
- sort_order: sortOrder === 'ascending' ? 'asc' : 'desc',
38
36
  page_token: action.payload.pageToken ?? null,
39
37
  page_size: 25,
40
38
  };
39
+ if (sortKey != null) {
40
+ queryPayload.sort_by = sortKey;
41
+ }
42
+ if (sortOrder != null) {
43
+ queryPayload.sort_order = sortOrder === 'ascending' ? 'asc' : 'desc';
44
+ }
41
45
  if (completedSubTab !== 'all') {
42
46
  queryPayload.match_type = completedSubTab;
43
47
  }
@@ -35,12 +35,17 @@ const searchTransactionsForManualMatchEpic = (actions$, state$, zeniAPI) => {
35
35
  const state = state$.value;
36
36
  const { expenseAutomationMissingReceiptsViewState: { bulkUpload: { manualSearch, sortKey, sortOrder }, }, } = state;
37
37
  const { end, start } = (0, rollingCalendarDateRangeInclusive_1.rollingCalendarDateRangeInclusive)(MANUAL_SEARCH_TRANSACTION_DATE_RANGE_DAYS);
38
+ // Manual search is independent of the Completed tab's optional sort: when the
39
+ // bulk upload sort is neutral (no user-applied sort), fall back to date/desc so
40
+ // search results stay deterministic for the matching UX.
41
+ const manualSearchSortKey = sortKey ?? 'date';
42
+ const manualSearchSortOrder = sortOrder ?? 'descending';
38
43
  const queryParam = {
39
44
  start_date: start,
40
45
  end_date: end,
41
46
  auto_categorized: exports.MANUAL_TRANSACTION_SEARCH_AUTO_CATEGORIZED,
42
- sort_by: (0, transactionsViewState_1.toTransactionsSortKey)(sortKey),
43
- sort_order: sortOrder === 'ascending' ? 'asc' : 'desc',
47
+ sort_by: (0, transactionsViewState_1.toTransactionsSortKey)(manualSearchSortKey),
48
+ sort_order: manualSearchSortOrder === 'ascending' ? 'asc' : 'desc',
44
49
  page_token: pageToken ?? null,
45
50
  page_size: manualSearch.pageSize,
46
51
  search_text: query,
@@ -4,11 +4,13 @@ import { openSnackbar } from '../../../../entity/snackbar/snackbarReducer';
4
4
  import { updateTransactions } from '../../../../entity/transaction/transactionReducer';
5
5
  import { RootState } from '../../../../reducer';
6
6
  import { ZeniAPI } from '../../../../zeniAPI';
7
- import { bulkUploadAutomatchingTimedOut, bulkUploadReceiptsSuccess, clearBulkUpload, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatches, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, restoreBulkUploadMatchingState } from '../../reducers/missingReceiptsViewReducer';
8
- export type ActionType = ReturnType<typeof bulkUploadReceiptsSuccess> | ReturnType<typeof restoreBulkUploadMatchingState> | ReturnType<typeof pusherBatchStatusUpdate> | ReturnType<typeof fetchBulkUploadBatchDetails> | ReturnType<typeof fetchBulkUploadBatchDetailsSuccess> | ReturnType<typeof fetchBulkUploadBatches> | ReturnType<typeof requestMissingReceiptsTabNavigation> | ReturnType<typeof updateTransactions> | ReturnType<typeof clearBulkUpload> | ReturnType<typeof openSnackbar> | ReturnType<typeof bulkUploadAutomatchingTimedOut>;
7
+ import { bulkUploadAutomatchingTimedOut, bulkUploadReceiptsSuccess, clearBulkUpload, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatches, pusherBatchStatusUpdate, restoreBulkUploadMatchingState } from '../../reducers/missingReceiptsViewReducer';
8
+ export type ActionType = ReturnType<typeof bulkUploadReceiptsSuccess> | ReturnType<typeof restoreBulkUploadMatchingState> | ReturnType<typeof pusherBatchStatusUpdate> | ReturnType<typeof fetchBulkUploadBatchDetails> | ReturnType<typeof fetchBulkUploadBatchDetailsSuccess> | ReturnType<typeof fetchBulkUploadBatches> | ReturnType<typeof updateTransactions> | ReturnType<typeof clearBulkUpload> | ReturnType<typeof openSnackbar> | ReturnType<typeof bulkUploadAutomatchingTimedOut>;
9
9
  /**
10
- * On Pusher batch completion: refresh batch list (then fetchMultipleBatchDetailsEpic runs),
11
- * and request switching to the Unmatched tab. Debounced to reduce duplicate refreshes.
10
+ * On Pusher batch completion: refresh batch list (then fetchMultipleBatchDetailsEpic runs).
11
+ * Debounced to reduce duplicate refreshes. The post-match tab decision
12
+ * (Unmatched vs Completed) is made client-side in `ExpenseAutomationPage` once fresh
13
+ * batch details land -- do not dispatch `requestMissingReceiptsTabNavigation` here.
12
14
  */
13
15
  export declare const pusherBatchStatusCompletionEpic: (actions$: ActionsObservable<ActionType>) => Observable<ActionType>;
14
16
  /**
@@ -15,15 +15,16 @@ const FALLBACK_FIRST_DELAY_MS = 30000;
15
15
  const RESTORE_FIRST_DELAY_MS = 5000;
16
16
  const FALLBACK_POLL_INTERVAL_MS = 10000;
17
17
  /**
18
- * On Pusher batch completion: refresh batch list (then fetchMultipleBatchDetailsEpic runs),
19
- * and request switching to the Unmatched tab. Debounced to reduce duplicate refreshes.
18
+ * On Pusher batch completion: refresh batch list (then fetchMultipleBatchDetailsEpic runs).
19
+ * Debounced to reduce duplicate refreshes. The post-match tab decision
20
+ * (Unmatched vs Completed) is made client-side in `ExpenseAutomationPage` once fresh
21
+ * batch details land -- do not dispatch `requestMissingReceiptsTabNavigation` here.
20
22
  */
21
23
  const pusherBatchStatusCompletionEpic = (actions$) => actions$.pipe((0, operators_1.filter)(missingReceiptsViewReducer_1.pusherBatchStatusUpdate.match), (0, operators_1.filter)((action) => action.payload.status === 'completed'), (0, operators_1.debounceTime)(300), (0, operators_1.mergeMap)(() => (0, rxjs_1.from)([
22
24
  (0, missingReceiptsViewReducer_1.fetchBulkUploadBatches)({
23
25
  cacheOverride: true,
24
26
  invalidateBatchDetailsCache: true,
25
27
  }),
26
- (0, missingReceiptsViewReducer_1.requestMissingReceiptsTabNavigation)({ tab: 'unmatched' }),
27
28
  ])));
28
29
  exports.pusherBatchStatusCompletionEpic = pusherBatchStatusCompletionEpic;
29
30
  /**
@@ -81,7 +82,6 @@ const pollBulkUploadBatchStatusEpic = (actions$, _state$, zeniAPI) => actions$.p
81
82
  }
82
83
  actions.push((0, missingReceiptsViewReducer_1.fetchBulkUploadBatchDetailsSuccess)((0, missingReceiptsPayload_1.toBatchDetails)(response.data, zeniAPI.apiEndPoints.fileMicroServiceBaseUrl)));
83
84
  actions.push((0, missingReceiptsViewReducer_1.fetchBulkUploadBatches)({ cacheOverride: true }));
84
- actions.push((0, missingReceiptsViewReducer_1.requestMissingReceiptsTabNavigation)({ tab: 'unmatched' }));
85
85
  return (0, rxjs_1.from)(actions);
86
86
  }
87
87
  }
@@ -127,7 +127,15 @@ const toTransactionUpdatePayload = (updates, detail, transactionId, cotTrackingB
127
127
  lineToBeUpdated.customer = undefined;
128
128
  }
129
129
  if (lineUpdates.vendor != null) {
130
- lineToBeUpdated.vendor = lineUpdates.vendor;
130
+ if (lineUpdates.vendor?.id === lineUpdates.vendor?.name) {
131
+ lineToBeUpdated.vendor = {
132
+ id: '',
133
+ name: lineUpdates.vendor.name,
134
+ };
135
+ }
136
+ else {
137
+ lineToBeUpdated.vendor = lineUpdates.vendor;
138
+ }
131
139
  }
132
140
  else {
133
141
  lineToBeUpdated.vendor = undefined;
@@ -37,7 +37,7 @@ export declare const getLineItemsByTransactionsIdsFromResponse: (transactions: S
37
37
  export declare const getLineItemsByTransactionIdsFromLocalData: (transactionLocalData: TransactionReviewLocalDataSelectorView[], selectedTab: TransactionsTab) => Record<ID, string[]>;
38
38
  export declare const mergeTabSpecificLineItems: (currentTabSpecificLineItems: TabSpecificLineItems, selectedTab: TransactionsTab, newLineItems: TabSpecificLineItems) => TabSpecificLineItems;
39
39
  export declare const getSnackbarMessageForTransactionReview: (updatedCount: number, failedCount: number, categorizedCount: number) => {
40
- messageSection: "common" | "transactionDetails_updatingPastTransactions" | "transactionDetails_transactionUpdated" | "cockpit_month_end_email_sent" | "cockpit_month_end_email_save" | "cockpit_month_end_email_attachment_upload" | "je_bill_link" | "je_posted" | "audit_score_updated" | "people_invite_people" | "people_invite_multiple_people" | "people_delete_person" | "people_update_person" | "reimbursement_updated" | "reimbursement_deleted" | "reimbursement_cancelled_deleted" | "reimbursement_cancelled" | "reimbursement_approved" | "reimbursement_rejected" | "reimbursement_sent_for_approval" | "account_added" | "business_verification_save" | "business_verification_submit" | "business_verification_from_bills_submit" | "plaid_connection" | "unlink_deposit_account" | "reimbursement_setup" | "reimbursement_approval_create" | "reimbursement_duplicate_approval_create" | "reimbursement_approval_update" | "reimbursement_duplicate_approval_update" | "reimbursement_approval_delete" | "reimbursement_create_mileage" | "reimbursement_update_mileage" | "reimbursement_accept_term" | "reimbursement_accept_employee_term" | "reimbursement_bulk_submit" | "reimbursement_bulk_processed" | "bill_pay_setup" | "zeni_accounts_setup" | "bill_pay_approval_create" | "bill_pay_duplicate_approval_create" | "bill_pay_approval_update" | "bill_pay_duplicate_approval_update" | "bill_pay_approval_delete" | "bill_pay_updated" | "bill_pay_deleted" | "bill_pay_cancelled_deleted" | "bill_pay_cancelled" | "bill_pay_approved" | "real_time_approver_added" | "bill_pay_rejected" | "bill_pay_sent_for_approval" | "bill_pay_accept_term" | "bill_pay_bulk_submit" | "bill_pay_bulk_processed" | "bill_pay_refund" | "bill_pay_retry" | "bill_pay_marked_as_paid" | "zeni_account_accept_term" | "update_vendor" | "data_refresh_update" | "delete_bank_account" | "create_bank_account" | "create_bank_account_ach" | "create_bank_account_wire" | "create_bank_account_international" | "transfer_money" | "update_zeni_account_nickname" | "create_checking_account" | "deposit_check" | "create_vendor" | "onboarding_customer_view" | "onboarding_customer_view_complete" | "onboarding_customer_identity_verification_save" | "onboarding_customer_identity_verification_submit" | "onboarding_customer_business_verification_save" | "onboarding_customer_business_verification_submit" | "retry_bank_account_connection" | "dashboard_invite_sent" | "onboarding_info_saved" | "approve_original_merchant" | "approve_global_merchant" | "reject_global_merchant" | "create_global_merchant" | "fetch_global_merchant_no_recommendation" | "save_vendor_renamed" | "save_vendor_sent_for_review" | "save_vendor_marked_as_employee" | "save_vendor_marked_as_local_contractor" | "charge_card_setup" | "charge_card_accept_term" | "charge_card_receipt_upload" | "charge_card_resend_invite" | "charge_card_revoke_invite" | "charge_card_update_limit" | "charge_cards_update_limit" | "close_charge_card" | "lock_charge_card" | "lock_charge_card_card_user" | "lock_charge_cards" | "unlock_charge_card" | "unlock_charge_card_card_user" | "unlock_charge_cards" | "close_charge_cards" | "revoke_invite_charge_cards" | "charge_card_express_interest" | "create_schedule" | "save_schedule" | "delete_schedule" | "ignore_schedule" | "save_task_detail" | "fetch_task_detail" | "delete_task" | "archive_task" | "create_tag" | "delete_tag" | "update_charge_card" | "update_charge_card_name" | "update_charge_card_name_card_user" | "issue_charge_card" | "issue_charge_cards" | "notification_settings_saved" | "referral_invite_sent" | "notification_mark_as_read" | "mark_as_complete_schedule" | "cancel_journal_entry" | "settings_accounting_accounts_updated" | "create_card_setup" | "confirm_card_setup" | "add_card_payment_source" | "fetch_payment_sources" | "task_assigned_toast_notification" | "task_due_tomorrow_toast_notification" | "task_deleted_toast_notification" | "task_archived_toast_notification" | "task_overdue_toast_notification" | "task_overdue_toast_notification_creator" | "task_notification_count" | "task_activities_toast_notification" | "task_created_toast_notification" | "task_group_creation_success" | "task_group_deletion_success" | "task_group_update_success" | "primary_funding_account_updated" | "task_time_spent_validation" | "missing_receipts_attachment" | "flux_analysis_unreviewed" | "flux_analysis_reviewed" | "receipt_match" | "receipts_upload" | "receipts_bulk_match" | "billing_address_view" | "express_pay_submit" | "exclude_transaction" | "reconcile" | "save_reconcile_for_later" | "recon_transaction_categorize" | "recon_transaction_match" | "update_debit_card_pin_attempt" | "set_debit_card_pin" | "ai_cfo_create_session_and_submit" | "ai_cfo_chat_session_deleted" | "charge_card_auto_pay_enable" | "charge_card_auto_pay_disable" | "treasury_setup" | "treasury_accept_term" | "treasury_transfer_money" | "treasury_transfer_money_failed" | "auto_transfer_rule_create" | "auto_transfer_rule_update" | "auto_transfer_rule_delete" | "auto_transfer_rule_pause" | "auto_transfer_rule_resume" | "treasury_update_portfolio_allocation" | "send_email_magic_link_to_user" | "complete_profile_done" | "reports_resync" | "invalid_phone_number" | "transactions_categorized_updated_failed" | "transaction_categorized_updated_failed" | "transactionsCategorized_transactionsUpdated" | "transactionsCategorized_transactionUpdated" | "transactionCategorized_transactionsUpdated" | "transactionCategorized_transactionUpdated" | "transactionsCategorized_transactionsFailed" | "transactionsCategorized_transactionFailed" | "transactionCategorized_transactionsFailed" | "transactionCategorized_transactionFailed" | "transactionsUpdated_transactionsFailed" | "transactionsUpdated_transactionFailed" | "transactionUpdated_transactionsFailed" | "transactionUpdated_transactionFailed" | "transactionsCategorized_transactionsUpdated_transactionsFailed" | "transactionsCategorized_transactionsUpdated_transactionFailed" | "transactionsCategorized_transactionUpdated_transactionsFailed" | "transactionCategorized_transactionsUpdated_transactionsFailed" | "transactionsCategorized_transactionUpdated_transactionFailed" | "transactionCategorized_transactionsUpdated_transactionFailed" | "transactionCategorized_transactionUpdated_transactionsFailed" | "transactionCategorized_transactionUpdated_transactionFailed" | "accounting_classes_enabled_update" | "account_excluded_from_reconciliation" | "account_included_in_reconciliation" | "ai_accountant_trigger_job";
40
+ messageSection: "common" | "transactionDetails_updatingPastTransactions" | "transactionDetails_transactionUpdated" | "cockpit_month_end_email_sent" | "cockpit_month_end_email_save" | "cockpit_month_end_email_attachment_upload" | "je_bill_link" | "je_posted" | "audit_score_updated" | "people_invite_people" | "people_invite_multiple_people" | "people_delete_person" | "people_update_person" | "reimbursement_updated" | "reimbursement_deleted" | "reimbursement_cancelled_deleted" | "reimbursement_cancelled" | "reimbursement_approved" | "reimbursement_rejected" | "reimbursement_sent_for_approval" | "account_added" | "business_verification_save" | "business_verification_submit" | "business_verification_from_bills_submit" | "plaid_connection" | "unlink_deposit_account" | "reimbursement_setup" | "reimbursement_approval_create" | "reimbursement_duplicate_approval_create" | "reimbursement_approval_update" | "reimbursement_duplicate_approval_update" | "reimbursement_approval_delete" | "reimbursement_create_mileage" | "reimbursement_update_mileage" | "reimbursement_accept_term" | "reimbursement_accept_employee_term" | "reimbursement_bulk_submit" | "reimbursement_bulk_processed" | "bill_pay_setup" | "zeni_accounts_setup" | "bill_pay_approval_create" | "bill_pay_duplicate_approval_create" | "bill_pay_approval_update" | "bill_pay_duplicate_approval_update" | "bill_pay_approval_delete" | "bill_pay_updated" | "bill_pay_deleted" | "bill_pay_cancelled_deleted" | "bill_pay_cancelled" | "bill_pay_approved" | "real_time_approver_added" | "bill_pay_rejected" | "bill_pay_sent_for_approval" | "bill_pay_accept_term" | "bill_pay_bulk_submit" | "bill_pay_bulk_processed" | "bill_pay_refund" | "bill_pay_retry" | "bill_pay_marked_as_paid" | "zeni_account_accept_term" | "update_vendor" | "data_refresh_update" | "delete_bank_account" | "create_bank_account" | "create_bank_account_ach" | "create_bank_account_wire" | "create_bank_account_international" | "transfer_money" | "update_zeni_account_nickname" | "create_checking_account" | "deposit_check" | "create_vendor" | "onboarding_customer_view" | "onboarding_customer_view_complete" | "onboarding_customer_identity_verification_save" | "onboarding_customer_identity_verification_submit" | "onboarding_customer_business_verification_save" | "onboarding_customer_business_verification_submit" | "retry_bank_account_connection" | "dashboard_invite_sent" | "onboarding_info_saved" | "approve_original_merchant" | "approve_global_merchant" | "reject_global_merchant" | "create_global_merchant" | "fetch_global_merchant_no_recommendation" | "save_vendor_renamed" | "save_vendor_sent_for_review" | "save_vendor_marked_as_employee" | "save_vendor_marked_as_local_contractor" | "charge_card_setup" | "charge_card_accept_term" | "charge_card_receipt_upload" | "charge_card_resend_invite" | "charge_card_revoke_invite" | "charge_card_update_limit" | "charge_cards_update_limit" | "close_charge_card" | "lock_charge_card" | "lock_charge_card_card_user" | "lock_charge_cards" | "unlock_charge_card" | "unlock_charge_card_card_user" | "unlock_charge_cards" | "close_charge_cards" | "revoke_invite_charge_cards" | "charge_card_express_interest" | "create_schedule" | "save_schedule" | "delete_schedule" | "ignore_schedule" | "save_task_detail" | "fetch_task_detail" | "delete_task" | "archive_task" | "snooze_task" | "unsnooze_task" | "create_tag" | "delete_tag" | "update_charge_card" | "update_charge_card_name" | "update_charge_card_name_card_user" | "issue_charge_card" | "issue_charge_cards" | "notification_settings_saved" | "referral_invite_sent" | "notification_mark_as_read" | "mark_as_complete_schedule" | "cancel_journal_entry" | "settings_accounting_accounts_updated" | "create_card_setup" | "confirm_card_setup" | "add_card_payment_source" | "fetch_payment_sources" | "task_assigned_toast_notification" | "task_due_tomorrow_toast_notification" | "task_deleted_toast_notification" | "task_archived_toast_notification" | "task_overdue_toast_notification" | "task_overdue_toast_notification_creator" | "task_notification_count" | "task_activities_toast_notification" | "task_created_toast_notification" | "task_group_creation_success" | "task_group_deletion_success" | "task_group_update_success" | "primary_funding_account_updated" | "task_time_spent_validation" | "missing_receipts_attachment" | "flux_analysis_unreviewed" | "flux_analysis_reviewed" | "receipt_match" | "receipts_upload" | "receipts_bulk_match" | "billing_address_view" | "express_pay_submit" | "exclude_transaction" | "reconcile" | "save_reconcile_for_later" | "recon_transaction_categorize" | "recon_transaction_match" | "update_debit_card_pin_attempt" | "set_debit_card_pin" | "ai_cfo_create_session_and_submit" | "ai_cfo_chat_session_deleted" | "charge_card_auto_pay_enable" | "charge_card_auto_pay_disable" | "treasury_setup" | "treasury_accept_term" | "treasury_transfer_money" | "treasury_transfer_money_failed" | "auto_transfer_rule_create" | "auto_transfer_rule_update" | "auto_transfer_rule_delete" | "auto_transfer_rule_pause" | "auto_transfer_rule_resume" | "treasury_update_portfolio_allocation" | "send_email_magic_link_to_user" | "complete_profile_done" | "reports_resync" | "invalid_phone_number" | "transactions_categorized_updated_failed" | "transaction_categorized_updated_failed" | "transactionsCategorized_transactionsUpdated" | "transactionsCategorized_transactionUpdated" | "transactionCategorized_transactionsUpdated" | "transactionCategorized_transactionUpdated" | "transactionsCategorized_transactionsFailed" | "transactionsCategorized_transactionFailed" | "transactionCategorized_transactionsFailed" | "transactionCategorized_transactionFailed" | "transactionsUpdated_transactionsFailed" | "transactionsUpdated_transactionFailed" | "transactionUpdated_transactionsFailed" | "transactionUpdated_transactionFailed" | "transactionsCategorized_transactionsUpdated_transactionsFailed" | "transactionsCategorized_transactionsUpdated_transactionFailed" | "transactionsCategorized_transactionUpdated_transactionsFailed" | "transactionCategorized_transactionsUpdated_transactionsFailed" | "transactionsCategorized_transactionUpdated_transactionFailed" | "transactionCategorized_transactionsUpdated_transactionFailed" | "transactionCategorized_transactionUpdated_transactionsFailed" | "transactionCategorized_transactionUpdated_transactionFailed" | "accounting_classes_enabled_update" | "account_excluded_from_reconciliation" | "account_included_in_reconciliation" | "ai_accountant_trigger_job";
41
41
  messageText: "notification" | "failed" | "success";
42
42
  type: "error" | "success" | "info";
43
43
  variables: {
@@ -7,7 +7,7 @@ import { TransactionPayload } from '../../../entity/transaction/payloadTypes/tra
7
7
  import { SupportedTransactionPayload } from '../../../entity/transaction/transactionState';
8
8
  import { ZeniAPIStatus } from '../../../responsePayload';
9
9
  import { type BatchDetails, type BatchListItem, type BatchStatus, type BulkUploadResultsTab, type BulkUploadSortKey, type BulkUploadState, type CompletedSubTab, type ManualSearchResult, type MissingReceiptsViewState, type MissingReceiptsViewUIState } from '../types/missingReceiptsViewState';
10
- export declare const getCompletedTransactionsCacheKey: (periodId: MonthYearPeriodId, sortKey: BulkUploadSortKey, sortOrder: SortOrder, subTab: CompletedSubTab) => string;
10
+ export declare const getCompletedTransactionsCacheKey: (periodId: MonthYearPeriodId, sortKey: BulkUploadSortKey | undefined, sortOrder: SortOrder | undefined, subTab: CompletedSubTab) => string;
11
11
  export declare const initialBulkUploadState: BulkUploadState;
12
12
  export declare const initialState: MissingReceiptsViewState;
13
13
  /** Epic trigger only; batch-details fetch is handled in epics. */
@@ -85,8 +85,8 @@ export declare const fetchMissingReceipts: import("@reduxjs/toolkit").ActionCrea
85
85
  }, "expenseAutomationMissingReceiptsView/confirmBulkUploadMatchSuccess">, confirmBulkUploadMatchFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
86
86
  error: ZeniAPIStatus;
87
87
  }, "expenseAutomationMissingReceiptsView/confirmBulkUploadMatchFailure">, setBulkUploadResultsTab: import("@reduxjs/toolkit").ActionCreatorWithPayload<"completed" | "unmatched", "expenseAutomationMissingReceiptsView/setBulkUploadResultsTab">, setBulkUploadCompletedSubTab: import("@reduxjs/toolkit").ActionCreatorWithPayload<"all" | "manual" | "ai_accountant", "expenseAutomationMissingReceiptsView/setBulkUploadCompletedSubTab">, setBulkUploadSortConfig: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
88
- sortKey: BulkUploadSortKey;
89
- sortOrder: SortOrder;
88
+ sortKey: BulkUploadSortKey | undefined;
89
+ sortOrder: SortOrder | undefined;
90
90
  }, "expenseAutomationMissingReceiptsView/setBulkUploadSortConfig">, clearBulkUpload: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"expenseAutomationMissingReceiptsView/clearBulkUpload">, searchTransactionsForManualMatch: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[query: string, pageToken?: string | null | undefined], {
91
91
  query: string;
92
92
  pageToken: string | undefined;
@@ -105,16 +105,16 @@ export declare const fetchMissingReceipts: import("@reduxjs/toolkit").ActionCrea
105
105
  isInitialLoad: boolean;
106
106
  nextPageToken: string | null;
107
107
  selectedPeriod: MonthYearPeriod;
108
- sortKey: BulkUploadSortKey;
109
- sortOrder: SortOrder;
108
+ sortKey: BulkUploadSortKey | undefined;
109
+ sortOrder: SortOrder | undefined;
110
110
  totalCount: number;
111
111
  transactionIds: ID[];
112
112
  }, "expenseAutomationMissingReceiptsView/fetchCompletedTransactionsSuccess">, fetchCompletedTransactionsFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
113
113
  completedSubTab: CompletedSubTab;
114
114
  error: ZeniAPIStatus;
115
115
  selectedPeriod: MonthYearPeriod;
116
- sortKey: BulkUploadSortKey;
117
- sortOrder: SortOrder;
116
+ sortKey: BulkUploadSortKey | undefined;
117
+ sortOrder: SortOrder | undefined;
118
118
  }, "expenseAutomationMissingReceiptsView/fetchCompletedTransactionsFailure">;
119
119
  declare const _default: import("redux").Reducer<MissingReceiptsViewState>;
120
120
  export default _default;
@@ -5,7 +5,11 @@ exports.fetchCompletedTransactionsFailure = exports.fetchCompletedTransactionsSu
5
5
  const toolkit_1 = require("@reduxjs/toolkit");
6
6
  const timePeriod_1 = require("../../../commonStateTypes/timePeriod");
7
7
  const missingReceiptsViewState_1 = require("../types/missingReceiptsViewState");
8
- const getCompletedTransactionsCacheKey = (periodId, sortKey, sortOrder, subTab) => `completed-${subTab}-${sortKey}-${sortOrder === 'ascending' ? 'asc' : 'desc'}-${periodId}`;
8
+ const getCompletedTransactionsCacheKey = (periodId, sortKey, sortOrder, subTab) => {
9
+ const sortKeyPart = sortKey ?? 'none';
10
+ const sortOrderPart = sortOrder == null ? 'none' : sortOrder === 'ascending' ? 'asc' : 'desc';
11
+ return `completed-${subTab}-${sortKeyPart}-${sortOrderPart}-${periodId}`;
12
+ };
9
13
  exports.getCompletedTransactionsCacheKey = getCompletedTransactionsCacheKey;
10
14
  exports.initialBulkUploadState = {
11
15
  batchDetailsById: {},
@@ -30,8 +34,8 @@ exports.initialBulkUploadState = {
30
34
  totalCount: 0,
31
35
  },
32
36
  phase: 'idle',
33
- sortKey: 'date',
34
- sortOrder: 'descending',
37
+ sortKey: undefined,
38
+ sortOrder: undefined,
35
39
  uploadedFileCount: 0,
36
40
  uploadProgress: 0,
37
41
  uploadStatus: { fetchState: 'Not-Started', error: undefined },
@@ -48,12 +48,14 @@ export interface BulkUploadSelectorData {
48
48
  processed: number;
49
49
  total: number;
50
50
  };
51
- sortKey: BulkUploadSortKey;
52
- sortOrder: SortOrder;
51
+ sortKey: BulkUploadSortKey | undefined;
52
+ sortOrder: SortOrder | undefined;
53
53
  unmatchedFiles: ResolvedBatchFile[];
54
54
  uploadedFileCount: number;
55
55
  uploadProgress: number;
56
56
  uploadStatus: FetchStateAndError;
57
+ /** True iff `batchDetailsById[currentBatchId]` is populated -- signals post-match data is fresh. */
58
+ currentBatchDetailsFetched?: boolean;
57
59
  currentBatchId?: ID;
58
60
  }
59
61
  export interface ResolvedBatchDetails {
@@ -205,6 +205,8 @@ function getExpenseAutomationMissingReceiptsView(state) {
205
205
  batchDetails: resolvedBatchDetails,
206
206
  completedSubTab: bulkUpload.completedSubTab,
207
207
  currentBatchId: bulkUpload.currentBatchId,
208
+ currentBatchDetailsFetched: bulkUpload.currentBatchId != null &&
209
+ bulkUpload.batchDetailsById[bulkUpload.currentBatchId] != null,
208
210
  completedTransactions: {
209
211
  fetchState: completedTransactionsForPeriod?.fetchState ?? {
210
212
  fetchState: 'Not-Started',
@@ -145,8 +145,8 @@ export interface BulkUploadState {
145
145
  manualSearch: ManualSearchState;
146
146
  manualSearchUiResetKey: number;
147
147
  phase: BulkUploadPhase;
148
- sortKey: BulkUploadSortKey;
149
- sortOrder: SortOrder;
148
+ sortKey: BulkUploadSortKey | undefined;
149
+ sortOrder: SortOrder | undefined;
150
150
  uploadedFileCount: number;
151
151
  uploadProgress: number;
152
152
  uploadStatus: FetchStateAndError;
@@ -0,0 +1,19 @@
1
+ import { FetchState, ID } from '../../../commonStateTypes/common';
2
+ import { ZeniAPIStatus } from '../../../responsePayload';
3
+ import { ZeniDate } from '../../../zeniDayJS';
4
+ export interface CannedResponse {
5
+ cannedResponseId: ID;
6
+ content: string;
7
+ createdBy: ID;
8
+ createTime: ZeniDate;
9
+ isDeleted: boolean;
10
+ name: string;
11
+ updateTime: ZeniDate;
12
+ }
13
+ export interface CannedResponsesViewState {
14
+ cannedResponses: CannedResponse[];
15
+ deleteFetchState: FetchState;
16
+ fetchState: FetchState;
17
+ saveFetchState: FetchState;
18
+ error?: ZeniAPIStatus;
19
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,21 @@
1
+ import { ZeniAPIResponse } from '../../../responsePayload';
2
+ import { CannedResponse } from './cannedResponses';
3
+ export interface CannedResponsePayload {
4
+ canned_response_id: string;
5
+ content: string;
6
+ create_time: string;
7
+ created_by: string;
8
+ is_deleted: boolean;
9
+ name: string;
10
+ update_time: string;
11
+ }
12
+ interface FetchCannedResponsesPayload {
13
+ canned_responses: CannedResponsePayload[];
14
+ }
15
+ export type FetchCannedResponsesResponse = ZeniAPIResponse<FetchCannedResponsesPayload>;
16
+ export type SaveCannedResponseResponse = ZeniAPIResponse<{
17
+ canned_response: CannedResponsePayload;
18
+ }>;
19
+ export type DeleteCannedResponseResponse = ZeniAPIResponse<unknown>;
20
+ export declare function mapCannedResponsePayloadToCannedResponse(payload: CannedResponsePayload): CannedResponse;
21
+ export {};
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mapCannedResponsePayloadToCannedResponse = mapCannedResponsePayloadToCannedResponse;
4
+ const zeniDayJS_1 = require("../../../zeniDayJS");
5
+ function mapCannedResponsePayloadToCannedResponse(payload) {
6
+ return {
7
+ cannedResponseId: payload.canned_response_id,
8
+ content: payload.content,
9
+ createTime: (0, zeniDayJS_1.date)(payload.create_time),
10
+ createdBy: payload.created_by,
11
+ isDeleted: payload.is_deleted,
12
+ name: payload.name,
13
+ updateTime: (0, zeniDayJS_1.date)(payload.update_time),
14
+ };
15
+ }
@@ -0,0 +1,30 @@
1
+ import { FetchState, ID } from '../../../commonStateTypes/common';
2
+ import { ZeniAPIStatus } from '../../../responsePayload';
3
+ import { CannedResponse, CannedResponsesViewState } from './cannedResponses';
4
+ export declare const initialState: CannedResponsesViewState;
5
+ export declare const fetchCannedResponses: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"cannedResponsesView/fetchCannedResponses">, updateCannedResponses: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
6
+ cannedResponses: CannedResponse[];
7
+ }, "cannedResponsesView/updateCannedResponses">, updateCannedResponsesFetchStatus: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
8
+ fetchState: FetchState;
9
+ error?: ZeniAPIStatus;
10
+ }, "cannedResponsesView/updateCannedResponsesFetchStatus">, saveCannedResponse: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[payload: {
11
+ content: string;
12
+ name: string;
13
+ cannedResponseId?: ID;
14
+ }], {
15
+ content: string;
16
+ name: string;
17
+ cannedResponseId?: ID;
18
+ }, "cannedResponsesView/saveCannedResponse", never, never>, saveCannedResponseSuccess: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"cannedResponsesView/saveCannedResponseSuccess">, saveCannedResponseFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
19
+ error?: ZeniAPIStatus;
20
+ }, "cannedResponsesView/saveCannedResponseFailure">, deleteCannedResponse: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[payload: {
21
+ cannedResponseId: ID;
22
+ }], {
23
+ cannedResponseId: ID;
24
+ }, "cannedResponsesView/deleteCannedResponse", never, never>, deleteCannedResponseSuccess: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
25
+ cannedResponseId: ID;
26
+ }, "cannedResponsesView/deleteCannedResponseSuccess">, deleteCannedResponseFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
27
+ error?: ZeniAPIStatus;
28
+ }, "cannedResponsesView/deleteCannedResponseFailure">, clearCannedResponses: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"cannedResponsesView/clearCannedResponses">;
29
+ declare const _default: import("redux").Reducer<CannedResponsesViewState>;
30
+ export default _default;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.clearCannedResponses = exports.deleteCannedResponseFailure = exports.deleteCannedResponseSuccess = exports.deleteCannedResponse = exports.saveCannedResponseFailure = exports.saveCannedResponseSuccess = exports.saveCannedResponse = exports.updateCannedResponsesFetchStatus = exports.updateCannedResponses = exports.fetchCannedResponses = exports.initialState = void 0;
5
+ const toolkit_1 = require("@reduxjs/toolkit");
6
+ exports.initialState = {
7
+ cannedResponses: [],
8
+ fetchState: 'Not-Started',
9
+ saveFetchState: 'Not-Started',
10
+ deleteFetchState: 'Not-Started',
11
+ error: undefined,
12
+ };
13
+ const cannedResponsesView = (0, toolkit_1.createSlice)({
14
+ name: 'cannedResponsesView',
15
+ initialState: exports.initialState,
16
+ reducers: {
17
+ fetchCannedResponses(draft) {
18
+ draft.fetchState =
19
+ draft.cannedResponses.length > 0 ? 'Completed' : 'In-Progress';
20
+ draft.error = undefined;
21
+ },
22
+ updateCannedResponses(draft, action) {
23
+ draft.cannedResponses = action.payload.cannedResponses;
24
+ draft.fetchState = 'Completed';
25
+ draft.error = undefined;
26
+ },
27
+ updateCannedResponsesFetchStatus(draft, action) {
28
+ draft.fetchState = action.payload.fetchState;
29
+ draft.error = action.payload.error;
30
+ },
31
+ saveCannedResponse: {
32
+ reducer(draft) {
33
+ draft.saveFetchState = 'In-Progress';
34
+ },
35
+ prepare(payload) {
36
+ return { payload };
37
+ },
38
+ },
39
+ saveCannedResponseSuccess(draft) {
40
+ draft.saveFetchState = 'Completed';
41
+ },
42
+ saveCannedResponseFailure(draft, action) {
43
+ draft.saveFetchState = 'Error';
44
+ draft.error = action.payload.error;
45
+ },
46
+ deleteCannedResponse: {
47
+ reducer(draft) {
48
+ draft.deleteFetchState = 'In-Progress';
49
+ },
50
+ prepare(payload) {
51
+ return { payload };
52
+ },
53
+ },
54
+ deleteCannedResponseSuccess(draft, action) {
55
+ draft.deleteFetchState = 'Completed';
56
+ draft.cannedResponses = draft.cannedResponses.filter((r) => r.cannedResponseId !== action.payload.cannedResponseId);
57
+ },
58
+ deleteCannedResponseFailure(draft, action) {
59
+ draft.deleteFetchState = 'Error';
60
+ draft.error = action.payload.error;
61
+ },
62
+ clearCannedResponses() {
63
+ return exports.initialState;
64
+ },
65
+ },
66
+ });
67
+ _a = cannedResponsesView.actions, exports.fetchCannedResponses = _a.fetchCannedResponses, exports.updateCannedResponses = _a.updateCannedResponses, exports.updateCannedResponsesFetchStatus = _a.updateCannedResponsesFetchStatus, exports.saveCannedResponse = _a.saveCannedResponse, exports.saveCannedResponseSuccess = _a.saveCannedResponseSuccess, exports.saveCannedResponseFailure = _a.saveCannedResponseFailure, exports.deleteCannedResponse = _a.deleteCannedResponse, exports.deleteCannedResponseSuccess = _a.deleteCannedResponseSuccess, exports.deleteCannedResponseFailure = _a.deleteCannedResponseFailure, exports.clearCannedResponses = _a.clearCannedResponses;
68
+ exports.default = cannedResponsesView.reducer;
@@ -0,0 +1,7 @@
1
+ import { ActionsObservable, StateObservable } from 'redux-observable';
2
+ import { Observable } from 'rxjs';
3
+ import { RootState } from '../../../../reducer';
4
+ import { ZeniAPI } from '../../../../zeniAPI';
5
+ import { deleteCannedResponse, deleteCannedResponseFailure, deleteCannedResponseSuccess } from '../cannedResponsesReducer';
6
+ export type ActionType = ReturnType<typeof deleteCannedResponse> | ReturnType<typeof deleteCannedResponseSuccess> | ReturnType<typeof deleteCannedResponseFailure>;
7
+ export declare const deleteCannedResponseEpic: (actions$: ActionsObservable<ActionType>, _state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => Observable<ActionType>;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deleteCannedResponseEpic = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const operators_1 = require("rxjs/operators");
6
+ const responsePayload_1 = require("../../../../responsePayload");
7
+ const cannedResponsesReducer_1 = require("../cannedResponsesReducer");
8
+ const deleteCannedResponseEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(cannedResponsesReducer_1.deleteCannedResponse.match), (0, operators_1.mergeMap)((action) => {
9
+ const { cannedResponseId } = action.payload;
10
+ return zeniAPI
11
+ .deleteAndGetJSON(`${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/canned-responses/${cannedResponseId}`)
12
+ .pipe((0, operators_1.mergeMap)((response) => {
13
+ if ((0, responsePayload_1.isSuccessResponse)(response)) {
14
+ return (0, rxjs_1.of)((0, cannedResponsesReducer_1.deleteCannedResponseSuccess)({ cannedResponseId }));
15
+ }
16
+ return (0, rxjs_1.of)((0, cannedResponsesReducer_1.deleteCannedResponseFailure)({ error: response.status }));
17
+ }), (0, operators_1.catchError)((error) => (0, rxjs_1.of)((0, cannedResponsesReducer_1.deleteCannedResponseFailure)({
18
+ error: (0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', 'Delete Canned Response errored: ' + JSON.stringify(error)),
19
+ }))));
20
+ }));
21
+ exports.deleteCannedResponseEpic = deleteCannedResponseEpic;
@@ -0,0 +1,7 @@
1
+ import { ActionsObservable, StateObservable } from 'redux-observable';
2
+ import { Observable } from 'rxjs';
3
+ import { RootState } from '../../../../reducer';
4
+ import { ZeniAPI } from '../../../../zeniAPI';
5
+ import { fetchCannedResponses, updateCannedResponses, updateCannedResponsesFetchStatus } from '../cannedResponsesReducer';
6
+ export type ActionType = ReturnType<typeof fetchCannedResponses> | ReturnType<typeof updateCannedResponses> | ReturnType<typeof updateCannedResponsesFetchStatus>;
7
+ export declare const fetchCannedResponsesEpic: (actions$: ActionsObservable<ActionType>, _state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => Observable<ActionType>;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchCannedResponsesEpic = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const operators_1 = require("rxjs/operators");
6
+ const responsePayload_1 = require("../../../../responsePayload");
7
+ const cannedResponsesPayload_1 = require("../cannedResponsesPayload");
8
+ const cannedResponsesReducer_1 = require("../cannedResponsesReducer");
9
+ const fetchCannedResponsesEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(cannedResponsesReducer_1.fetchCannedResponses.match), (0, operators_1.switchMap)(() => zeniAPI
10
+ .getJSON(`${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/canned-responses`)
11
+ .pipe((0, operators_1.mergeMap)((response) => {
12
+ if ((0, responsePayload_1.isSuccessResponse)(response) && response.data != null) {
13
+ return (0, rxjs_1.of)((0, cannedResponsesReducer_1.updateCannedResponses)({
14
+ cannedResponses: (response.data.canned_responses ?? []).map(cannedResponsesPayload_1.mapCannedResponsePayloadToCannedResponse),
15
+ }));
16
+ }
17
+ return (0, rxjs_1.of)((0, cannedResponsesReducer_1.updateCannedResponsesFetchStatus)({
18
+ fetchState: 'Error',
19
+ error: response.status,
20
+ }));
21
+ }), (0, operators_1.catchError)((error) => (0, rxjs_1.of)((0, cannedResponsesReducer_1.updateCannedResponsesFetchStatus)({
22
+ fetchState: 'Error',
23
+ error: (0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', 'Fetch Canned Responses errored: ' + JSON.stringify(error)),
24
+ }))))));
25
+ exports.fetchCannedResponsesEpic = fetchCannedResponsesEpic;
@@ -0,0 +1,7 @@
1
+ import { ActionsObservable, StateObservable } from 'redux-observable';
2
+ import { Observable } from 'rxjs';
3
+ import { RootState } from '../../../../reducer';
4
+ import { ZeniAPI } from '../../../../zeniAPI';
5
+ import { fetchCannedResponses, saveCannedResponse, saveCannedResponseFailure, saveCannedResponseSuccess } from '../cannedResponsesReducer';
6
+ export type ActionType = ReturnType<typeof saveCannedResponse> | ReturnType<typeof saveCannedResponseSuccess> | ReturnType<typeof saveCannedResponseFailure> | ReturnType<typeof fetchCannedResponses>;
7
+ export declare const saveCannedResponseEpic: (actions$: ActionsObservable<ActionType>, _state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => Observable<ActionType>;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.saveCannedResponseEpic = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const operators_1 = require("rxjs/operators");
6
+ const responsePayload_1 = require("../../../../responsePayload");
7
+ const cannedResponsesReducer_1 = require("../cannedResponsesReducer");
8
+ const saveCannedResponseEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(cannedResponsesReducer_1.saveCannedResponse.match), (0, operators_1.switchMap)((action) => {
9
+ const { name, content, cannedResponseId } = action.payload;
10
+ const isUpdate = cannedResponseId != null;
11
+ const url = isUpdate
12
+ ? `${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/canned-responses/${cannedResponseId}`
13
+ : `${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/canned-responses`;
14
+ const apiCall = isUpdate
15
+ ? zeniAPI.putAndGetJSON(url, {
16
+ name,
17
+ content,
18
+ })
19
+ : zeniAPI.postAndGetJSON(url, {
20
+ name,
21
+ content,
22
+ });
23
+ return apiCall.pipe((0, operators_1.mergeMap)((response) => {
24
+ if ((0, responsePayload_1.isSuccessResponse)(response)) {
25
+ return (0, rxjs_1.of)((0, cannedResponsesReducer_1.saveCannedResponseSuccess)(), (0, cannedResponsesReducer_1.fetchCannedResponses)() // Refresh list after save
26
+ );
27
+ }
28
+ return (0, rxjs_1.of)((0, cannedResponsesReducer_1.saveCannedResponseFailure)({ error: response.status }));
29
+ }), (0, operators_1.catchError)((error) => (0, rxjs_1.of)((0, cannedResponsesReducer_1.saveCannedResponseFailure)({
30
+ error: (0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', 'Save Canned Response errored: ' + JSON.stringify(error)),
31
+ }))));
32
+ }));
33
+ exports.saveCannedResponseEpic = saveCannedResponseEpic;
@@ -3,6 +3,7 @@ import { openSnackbar } from '../../../../entity/snackbar/snackbarReducer';
3
3
  import { updateTasks } from '../../../../entity/task/taskReducer';
4
4
  import { RootState } from '../../../../reducer';
5
5
  import { ZeniAPI } from '../../../../zeniAPI';
6
+ import { fetchTaskList, removeTaskFromList } from '../../taskListView/taskListReducer';
6
7
  import { archiveTask, archiveTaskSuccessOrFailure } from '../taskDetailReducer';
7
- export type ActionType = ReturnType<typeof archiveTask> | ReturnType<typeof updateTasks> | ReturnType<typeof openSnackbar> | ReturnType<typeof archiveTaskSuccessOrFailure>;
8
+ export type ActionType = ReturnType<typeof archiveTask> | ReturnType<typeof updateTasks> | ReturnType<typeof openSnackbar> | ReturnType<typeof fetchTaskList> | ReturnType<typeof archiveTaskSuccessOrFailure> | ReturnType<typeof removeTaskFromList>;
8
9
  export declare const archiveTaskEpic: (actions$: ActionsObservable<ActionType>, state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => import("rxjs").Observable<ActionType>;
@@ -7,6 +7,7 @@ const snackbarReducer_1 = require("../../../../entity/snackbar/snackbarReducer")
7
7
  const taskReducer_1 = require("../../../../entity/task/taskReducer");
8
8
  const taskSelector_1 = require("../../../../entity/task/taskSelector");
9
9
  const responsePayload_1 = require("../../../../responsePayload");
10
+ const taskListReducer_1 = require("../../taskListView/taskListReducer");
10
11
  const taskDetailReducer_1 = require("../taskDetailReducer");
11
12
  // Epic function to handle archiving of tasks
12
13
  const archiveTaskEpic = (actions$, state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(taskDetailReducer_1.archiveTask.match), (0, operators_1.mergeMap)((action) => handleArchiveTask(action.payload.taskId, state$, zeniAPI)));
@@ -29,6 +30,8 @@ const handleApiResponse = (response, taskId) => {
29
30
  response.data.tasks.length > 0) {
30
31
  const fetchActions = [
31
32
  (0, taskReducer_1.updateTasks)(response.data.tasks),
33
+ (0, taskListReducer_1.removeTaskFromList)(taskId),
34
+ (0, taskListReducer_1.fetchTaskList)(),
32
35
  (0, taskDetailReducer_1.archiveTaskSuccessOrFailure)({
33
36
  fetchState: 'Completed',
34
37
  taskId,
@@ -2,6 +2,7 @@ import { ActionsObservable, StateObservable } from 'redux-observable';
2
2
  import { openSnackbar } from '../../../../entity/snackbar/snackbarReducer';
3
3
  import { RootState } from '../../../../reducer';
4
4
  import { ZeniAPI } from '../../../../zeniAPI';
5
+ import { fetchTaskList, removeTaskFromList } from '../../taskListView/taskListReducer';
5
6
  import { deleteTask, deleteTaskSuccessOrFailure } from '../taskDetailReducer';
6
- export type ActionType = ReturnType<typeof deleteTask> | ReturnType<typeof openSnackbar> | ReturnType<typeof deleteTaskSuccessOrFailure>;
7
+ export type ActionType = ReturnType<typeof deleteTask> | ReturnType<typeof openSnackbar> | ReturnType<typeof fetchTaskList> | ReturnType<typeof deleteTaskSuccessOrFailure> | ReturnType<typeof removeTaskFromList>;
7
8
  export declare const deleteTaskEpic: (actions$: ActionsObservable<ActionType>, _state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => import("rxjs").Observable<ActionType>;
@@ -5,6 +5,7 @@ const rxjs_1 = require("rxjs");
5
5
  const operators_1 = require("rxjs/operators");
6
6
  const snackbarReducer_1 = require("../../../../entity/snackbar/snackbarReducer");
7
7
  const responsePayload_1 = require("../../../../responsePayload");
8
+ const taskListReducer_1 = require("../../taskListView/taskListReducer");
8
9
  const taskDetailReducer_1 = require("../taskDetailReducer");
9
10
  const deleteTaskEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(taskDetailReducer_1.deleteTask.match), (0, operators_1.mergeMap)((action) => {
10
11
  const { taskId } = action.payload;
@@ -13,6 +14,10 @@ const deleteTaskEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, operato
13
14
  .pipe((0, operators_1.mergeMap)((response) => {
14
15
  if ((0, responsePayload_1.isSuccessStatus)(response)) {
15
16
  const actions = [];
17
+ if (taskId != null) {
18
+ actions.push((0, taskListReducer_1.removeTaskFromList)(taskId));
19
+ }
20
+ actions.push((0, taskListReducer_1.fetchTaskList)());
16
21
  actions.push((0, taskDetailReducer_1.deleteTaskSuccessOrFailure)({ fetchState: 'Completed', taskId }));
17
22
  return (0, rxjs_1.from)(actions);
18
23
  }
@@ -31,6 +31,7 @@ const initializeTaskToLocalStoreEpic = (actions$, state$) => actions$.pipe((0, o
31
31
  savedRecurringEndDate: task.recurringEndDate,
32
32
  recurringStartDate: task.recurringStartDate,
33
33
  timeSpent: task.timeSpent,
34
+ isPrivate: task.isPrivate,
34
35
  };
35
36
  const actions = [
36
37
  (0, taskDetailReducer_1.saveTaskUpdatesToLocalStore)({ taskDetailLocalData, taskId }),
@@ -98,5 +98,6 @@ const prepareTaskPayload = (state, taskId, taskGroupId) => {
98
98
  sync_token: syncToken,
99
99
  task_group_ids: taskGroupId != null ? [taskGroupId] : [],
100
100
  time_spent: (0, formatMinutesToFromHHMM_1.convertHHMMStrToMinutes)(localData.timeSpent),
101
+ ...(taskId == null ? { is_private: localData.isPrivate ?? false } : {}),
101
102
  };
102
103
  };