@zeniai/client-epic-state 5.0.30 → 5.0.31-beta0ND

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 (100) 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 +8 -5
  22. package/lib/esm/init.js +5 -2
  23. package/lib/esm/reducer.js +3 -0
  24. package/lib/esm/view/profitAndLossClassesView/profitAndLossHorizontalEnrichment.js +42 -0
  25. package/lib/esm/view/taskManager/cannedResponsesView/cannedResponses.js +1 -0
  26. package/lib/esm/view/taskManager/cannedResponsesView/cannedResponsesPayload.js +12 -0
  27. package/lib/esm/view/taskManager/cannedResponsesView/cannedResponsesReducer.js +64 -0
  28. package/lib/esm/view/taskManager/cannedResponsesView/cannedResponsesSelector.js +3 -0
  29. package/lib/esm/view/taskManager/cannedResponsesView/epics/deleteCannedResponseEpic.js +17 -0
  30. package/lib/esm/view/taskManager/cannedResponsesView/epics/fetchCannedResponsesEpic.js +21 -0
  31. package/lib/esm/view/taskManager/cannedResponsesView/epics/saveCannedResponseEpic.js +29 -0
  32. package/lib/esm/view/taskManager/taskDetailView/epics/archiveTaskEpic.js +3 -0
  33. package/lib/esm/view/taskManager/taskDetailView/epics/deleteTaskEpic.js +5 -0
  34. package/lib/esm/view/taskManager/taskDetailView/epics/initializeTaskToLocalStoreEpic.js +1 -0
  35. package/lib/esm/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +1 -0
  36. package/lib/esm/view/taskManager/taskDetailView/epics/snoozeTaskEpic.js +66 -0
  37. package/lib/esm/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.js +57 -0
  38. package/lib/esm/view/taskManager/taskDetailView/taskDetail.js +4 -0
  39. package/lib/esm/view/taskManager/taskDetailView/taskDetailReducer.js +60 -7
  40. package/lib/esm/view/taskManager/taskDetailView/taskDetailSelector.js +12 -0
  41. package/lib/esm/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.js +56 -21
  42. package/lib/esm/view/taskManager/taskListView/epics/dragNDropTasksEpic.js +1 -0
  43. package/lib/esm/view/taskManager/taskListView/epics/fetchTaskListEpic.js +13 -4
  44. package/lib/esm/view/taskManager/taskListView/epics/updateTaskFromListViewEpic.js +3 -2
  45. package/lib/esm/view/taskManager/taskListView/taskList.js +7 -0
  46. package/lib/esm/view/taskManager/taskListView/taskListReducer.js +106 -12
  47. package/lib/esm/view/taskManager/taskListView/taskListSelector.js +48 -39
  48. package/lib/index.d.ts +9 -5
  49. package/lib/index.js +39 -26
  50. package/lib/init.d.ts +2 -1
  51. package/lib/init.js +6 -3
  52. package/lib/reducer.d.ts +3 -0
  53. package/lib/reducer.js +3 -0
  54. package/lib/tsconfig.typecheck.tsbuildinfo +1 -0
  55. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  56. package/lib/view/profitAndLossClassesView/profitAndLossHorizontalEnrichment.d.ts +15 -1
  57. package/lib/view/profitAndLossClassesView/profitAndLossHorizontalEnrichment.js +43 -0
  58. package/lib/view/taskManager/cannedResponsesView/cannedResponses.d.ts +19 -0
  59. package/lib/view/taskManager/cannedResponsesView/cannedResponses.js +2 -0
  60. package/lib/view/taskManager/cannedResponsesView/cannedResponsesPayload.d.ts +21 -0
  61. package/lib/view/taskManager/cannedResponsesView/cannedResponsesPayload.js +15 -0
  62. package/lib/view/taskManager/cannedResponsesView/cannedResponsesReducer.d.ts +30 -0
  63. package/lib/view/taskManager/cannedResponsesView/cannedResponsesReducer.js +68 -0
  64. package/lib/view/taskManager/cannedResponsesView/cannedResponsesSelector.d.ts +3 -0
  65. package/lib/view/taskManager/cannedResponsesView/cannedResponsesSelector.js +6 -0
  66. package/lib/view/taskManager/cannedResponsesView/epics/deleteCannedResponseEpic.d.ts +7 -0
  67. package/lib/view/taskManager/cannedResponsesView/epics/deleteCannedResponseEpic.js +21 -0
  68. package/lib/view/taskManager/cannedResponsesView/epics/fetchCannedResponsesEpic.d.ts +7 -0
  69. package/lib/view/taskManager/cannedResponsesView/epics/fetchCannedResponsesEpic.js +25 -0
  70. package/lib/view/taskManager/cannedResponsesView/epics/saveCannedResponseEpic.d.ts +7 -0
  71. package/lib/view/taskManager/cannedResponsesView/epics/saveCannedResponseEpic.js +33 -0
  72. package/lib/view/taskManager/taskDetailView/epics/archiveTaskEpic.d.ts +2 -1
  73. package/lib/view/taskManager/taskDetailView/epics/archiveTaskEpic.js +3 -0
  74. package/lib/view/taskManager/taskDetailView/epics/deleteTaskEpic.d.ts +2 -1
  75. package/lib/view/taskManager/taskDetailView/epics/deleteTaskEpic.js +5 -0
  76. package/lib/view/taskManager/taskDetailView/epics/initializeTaskToLocalStoreEpic.js +1 -0
  77. package/lib/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +1 -0
  78. package/lib/view/taskManager/taskDetailView/epics/snoozeTaskEpic.d.ts +9 -0
  79. package/lib/view/taskManager/taskDetailView/epics/snoozeTaskEpic.js +70 -0
  80. package/lib/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.d.ts +9 -0
  81. package/lib/view/taskManager/taskDetailView/epics/unsnoozeTaskEpic.js +61 -0
  82. package/lib/view/taskManager/taskDetailView/taskDetail.d.ts +2 -0
  83. package/lib/view/taskManager/taskDetailView/taskDetail.js +4 -0
  84. package/lib/view/taskManager/taskDetailView/taskDetailReducer.d.ts +10 -1
  85. package/lib/view/taskManager/taskDetailView/taskDetailReducer.js +61 -8
  86. package/lib/view/taskManager/taskDetailView/taskDetailSelector.d.ts +5 -0
  87. package/lib/view/taskManager/taskDetailView/taskDetailSelector.js +12 -0
  88. package/lib/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.d.ts +6 -7
  89. package/lib/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.js +56 -22
  90. package/lib/view/taskManager/taskListView/epics/dragNDropTasksEpic.js +1 -0
  91. package/lib/view/taskManager/taskListView/epics/fetchTaskListEpic.js +13 -4
  92. package/lib/view/taskManager/taskListView/epics/updateTaskFromListViewEpic.js +3 -2
  93. package/lib/view/taskManager/taskListView/taskList.d.ts +14 -1
  94. package/lib/view/taskManager/taskListView/taskList.js +8 -1
  95. package/lib/view/taskManager/taskListView/taskListPayload.d.ts +3 -0
  96. package/lib/view/taskManager/taskListView/taskListReducer.d.ts +9 -6
  97. package/lib/view/taskManager/taskListView/taskListReducer.js +107 -13
  98. package/lib/view/taskManager/taskListView/taskListSelector.d.ts +9 -3
  99. package/lib/view/taskManager/taskListView/taskListSelector.js +48 -39
  100. package/package.json +1 -1
@@ -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: {
@@ -1,6 +1,20 @@
1
- import { ProfitAndLossByClassHorizontalReport } from './profitAndLossClassesByClassHorizontalSelectorTypes';
1
+ import { COABalance } from '../../commonStateTypes/coaBalance/coaBalance';
2
+ import { HorizontalAccountRow, ProfitAndLossByClassHorizontalReport } from './profitAndLossClassesByClassHorizontalSelectorTypes';
2
3
  /**
3
4
  * Populates `sectionHeaderBalancesSlice`, and per-account `accountReportData`, so the
4
5
  * web layer only maps selector output to tree nodes.
5
6
  */
6
7
  export declare function enrichProfitAndLossByClassHorizontalReport(report: ProfitAndLossByClassHorizontalReport): void;
8
+ /**
9
+ * Sum balances across descendant accounts (recursive).
10
+ *
11
+ * Parent rows in the horizontal pivot only carry their own direct postings
12
+ * (zero for "container" accounts), so callers rendering "Total {parent}" rows
13
+ * must aggregate from descendants to get the real per-class totals.
14
+ *
15
+ * Returns one `COABalance` per class column + total (same shape as the
16
+ * enriched `balancesInTimeframe.balances`), with `amount` summed and `type`
17
+ * set to `default_with_null_balance` for zeros. Returns `[]` when no
18
+ * descendants have enriched data.
19
+ */
20
+ export declare function aggregateHorizontalDescendantBalances(accounts: readonly HorizontalAccountRow[], childIndices: readonly number[], childrenByParent: Readonly<Record<number, readonly number[]>>): COABalance[];
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.enrichProfitAndLossByClassHorizontalReport = enrichProfitAndLossByClassHorizontalReport;
4
+ exports.aggregateHorizontalDescendantBalances = aggregateHorizontalDescendantBalances;
4
5
  const currencyHelper_1 = require("../../commonStateTypes/currencyHelper");
5
6
  const horizontalSectionEmptyBalancesSlice_1 = require("./horizontalSectionEmptyBalancesSlice");
6
7
  const profitAndLossClassesByClassHorizontalSelectorTypes_1 = require("./profitAndLossClassesByClassHorizontalSelectorTypes");
@@ -118,6 +119,48 @@ function buildHorizontalClassColumnBalancesSlice(report, classAmounts, totalAmou
118
119
  },
119
120
  };
120
121
  }
122
+ /**
123
+ * Sum balances across descendant accounts (recursive).
124
+ *
125
+ * Parent rows in the horizontal pivot only carry their own direct postings
126
+ * (zero for "container" accounts), so callers rendering "Total {parent}" rows
127
+ * must aggregate from descendants to get the real per-class totals.
128
+ *
129
+ * Returns one `COABalance` per class column + total (same shape as the
130
+ * enriched `balancesInTimeframe.balances`), with `amount` summed and `type`
131
+ * set to `default_with_null_balance` for zeros. Returns `[]` when no
132
+ * descendants have enriched data.
133
+ */
134
+ function aggregateHorizontalDescendantBalances(accounts, childIndices, childrenByParent) {
135
+ let template;
136
+ const sums = new Map();
137
+ const walk = (idx) => {
138
+ const childRow = accounts[idx];
139
+ const childBalances = childRow?.accountReportData?.balancesInTimeframe.balances;
140
+ if (childBalances != null) {
141
+ if (template == null) {
142
+ template = childBalances;
143
+ }
144
+ childBalances.forEach((b, i) => {
145
+ sums.set(i, (sums.get(i) ?? 0) + (b.balance.amount ?? 0));
146
+ });
147
+ const grandChildren = childrenByParent[idx] ?? [];
148
+ grandChildren.forEach(walk);
149
+ }
150
+ };
151
+ childIndices.forEach(walk);
152
+ if (template == null) {
153
+ return [];
154
+ }
155
+ return template.map((tpl, i) => {
156
+ const amount = sums.get(i) ?? 0;
157
+ return {
158
+ ...tpl,
159
+ balance: { ...tpl.balance, amount },
160
+ type: amount === 0 ? 'default_with_null_balance' : 'default',
161
+ };
162
+ });
163
+ }
121
164
  /**
122
165
  * Parent index per DFS row — O(n). Matches the scan in the former
123
166
  * `findHorizontalAccountParentIndex` (depth &lt;= 2 rows have no parent).
@@ -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,3 @@
1
+ import { RootState } from '../../../reducer';
2
+ import { CannedResponsesViewState } from './cannedResponses';
3
+ export declare function getCannedResponsesView(state: RootState): CannedResponsesViewState;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCannedResponsesView = getCannedResponsesView;
4
+ function getCannedResponsesView(state) {
5
+ return state.cannedResponsesState;
6
+ }
@@ -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
  };
@@ -0,0 +1,9 @@
1
+ import { ActionsObservable, StateObservable } from 'redux-observable';
2
+ import { openSnackbar } from '../../../../entity/snackbar/snackbarReducer';
3
+ import { updateTasks } from '../../../../entity/task/taskReducer';
4
+ import { RootState } from '../../../../reducer';
5
+ import { ZeniAPI } from '../../../../zeniAPI';
6
+ import { fetchTaskList, removeTaskFromList } from '../../taskListView/taskListReducer';
7
+ import { snoozeTask, snoozeTaskSuccessOrFailure } from '../taskDetailReducer';
8
+ export type ActionType = ReturnType<typeof snoozeTask> | ReturnType<typeof updateTasks> | ReturnType<typeof openSnackbar> | ReturnType<typeof fetchTaskList> | ReturnType<typeof snoozeTaskSuccessOrFailure> | ReturnType<typeof removeTaskFromList>;
9
+ export declare const snoozeTaskEpic: (actions$: ActionsObservable<ActionType>, _state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => import("rxjs").Observable<ActionType>;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.snoozeTaskEpic = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const operators_1 = require("rxjs/operators");
6
+ const formatZeniDateFY_1 = require("../../../../commonStateTypes/fiscalYearHelpers/formatZeniDateFY");
7
+ const snackbarReducer_1 = require("../../../../entity/snackbar/snackbarReducer");
8
+ const taskReducer_1 = require("../../../../entity/task/taskReducer");
9
+ const responsePayload_1 = require("../../../../responsePayload");
10
+ const zeniDayJS_1 = require("../../../../zeniDayJS");
11
+ const taskListReducer_1 = require("../../taskListView/taskListReducer");
12
+ const taskDetailReducer_1 = require("../taskDetailReducer");
13
+ const snoozeTaskEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(taskDetailReducer_1.snoozeTask.match), (0, operators_1.mergeMap)((action) => handleSnoozeTask(action.payload.taskId, action.payload.snoozedUntil, zeniAPI)));
14
+ exports.snoozeTaskEpic = snoozeTaskEpic;
15
+ const formatSnoozedUntilForDisplay = (snoozedUntil) => (0, zeniDayJS_1.date)(snoozedUntil).format(formatZeniDateFY_1.SNOOZED_DISPLAY_FORMAT);
16
+ const handleSnoozeTask = (taskId, snoozedUntil, zeniAPI) => {
17
+ const snoozeTaskApi$ = zeniAPI.postAndGetJSON(`${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/tasks/${taskId}/snooze`, { snoozed_until: snoozedUntil });
18
+ return snoozeTaskApi$.pipe((0, operators_1.mergeMap)((response) => handleApiResponse(response, taskId, snoozedUntil)), (0, operators_1.catchError)((error) => (0, rxjs_1.of)((0, taskDetailReducer_1.snoozeTaskSuccessOrFailure)({
19
+ fetchState: 'Error',
20
+ taskId,
21
+ error: (0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', 'Snooze Task REST API call errored out: ' + JSON.stringify(error)),
22
+ }))));
23
+ };
24
+ const handleApiResponse = (response, taskId, snoozedUntil) => {
25
+ if ((0, responsePayload_1.isSuccessResponse)(response) &&
26
+ response.data != null &&
27
+ response.data.tasks.length > 0) {
28
+ const fetchActions = [
29
+ (0, taskReducer_1.updateTasks)(response.data.tasks),
30
+ (0, taskListReducer_1.removeTaskFromList)(taskId),
31
+ (0, taskListReducer_1.fetchTaskList)(),
32
+ (0, taskDetailReducer_1.snoozeTaskSuccessOrFailure)({
33
+ fetchState: 'Completed',
34
+ taskId,
35
+ }),
36
+ (0, snackbarReducer_1.openSnackbar)({
37
+ messageSection: 'snooze_task',
38
+ messageText: 'success',
39
+ type: 'success',
40
+ variables: [
41
+ {
42
+ variableName: '_snoozed_until_',
43
+ variableValue: formatSnoozedUntilForDisplay(snoozedUntil),
44
+ },
45
+ ],
46
+ }),
47
+ ];
48
+ return (0, rxjs_1.from)(fetchActions);
49
+ }
50
+ else {
51
+ return (0, rxjs_1.from)([
52
+ (0, taskDetailReducer_1.snoozeTaskSuccessOrFailure)({
53
+ fetchState: 'Error',
54
+ taskId,
55
+ error: response.status,
56
+ }),
57
+ (0, snackbarReducer_1.openSnackbar)({
58
+ messageSection: 'snooze_task',
59
+ messageText: 'failed',
60
+ type: 'error',
61
+ variables: [
62
+ {
63
+ variableName: '_api-error_',
64
+ variableValue: response.status.message,
65
+ },
66
+ ],
67
+ }),
68
+ ]);
69
+ }
70
+ };
@@ -0,0 +1,9 @@
1
+ import { ActionsObservable, StateObservable } from 'redux-observable';
2
+ import { openSnackbar } from '../../../../entity/snackbar/snackbarReducer';
3
+ import { updateTasks } from '../../../../entity/task/taskReducer';
4
+ import { RootState } from '../../../../reducer';
5
+ import { ZeniAPI } from '../../../../zeniAPI';
6
+ import { fetchTaskList, removeTaskFromList } from '../../taskListView/taskListReducer';
7
+ import { snoozeTaskSuccessOrFailure, unsnoozeTask } from '../taskDetailReducer';
8
+ export type ActionType = ReturnType<typeof unsnoozeTask> | ReturnType<typeof updateTasks> | ReturnType<typeof openSnackbar> | ReturnType<typeof fetchTaskList> | ReturnType<typeof removeTaskFromList> | ReturnType<typeof snoozeTaskSuccessOrFailure>;
9
+ export declare const unsnoozeTaskEpic: (actions$: ActionsObservable<ActionType>, _state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => import("rxjs").Observable<ActionType>;