@zeniai/client-epic-state 5.1.68-betaDI2 → 5.1.69-betaAK0

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/esm/index.js +9 -9
  2. package/lib/esm/view/invoicing/couponView/couponViewEpics.js +0 -3
  3. package/lib/esm/view/invoicing/couponView/couponViewReducer.js +7 -1
  4. package/lib/esm/view/invoicing/couponView/couponViewSelector.js +27 -14
  5. package/lib/esm/view/invoicing/invoiceList/fetchInvoiceListEpic.js +7 -5
  6. package/lib/esm/view/invoicing/invoiceList/fetchInvoiceListPageEpic.js +2 -1
  7. package/lib/esm/view/invoicing/invoiceList/invoiceListReducer.js +62 -36
  8. package/lib/esm/view/invoicing/invoiceList/invoiceListSelector.js +19 -15
  9. package/lib/esm/view/invoicing/invoiceList/invoiceListState.js +10 -0
  10. package/lib/esm/view/invoicing/invoicingCreditNoteListView/epics/fetchInvoicingCreditNoteListEpic.js +0 -3
  11. package/lib/esm/view/invoicing/invoicingCreditNoteListView/invoicingCreditNoteListViewReducer.js +7 -1
  12. package/lib/esm/view/invoicing/invoicingCreditNoteListView/invoicingCreditNoteListViewSelector.js +23 -13
  13. package/lib/esm/view/invoicing/invoicingCustomerDetailView/fetchInvoicingCustomerDetailPageEpic.js +3 -2
  14. package/lib/esm/view/invoicing/invoicingCustomerDetailView/invoicingCustomerDetailViewSelector.js +1 -1
  15. package/lib/esm/view/invoicing/invoicingCustomerListView/epics/fetchInvoicingCustomerListEpic.js +0 -3
  16. package/lib/esm/view/invoicing/invoicingCustomerListView/invoicingCustomerListViewReducer.js +7 -1
  17. package/lib/esm/view/invoicing/invoicingCustomerListView/invoicingCustomerListViewSelector.js +25 -12
  18. package/lib/esm/view/invoicing/invoicingDunningCaseListView/epics/fetchInvoicingDunningCaseListEpic.js +0 -3
  19. package/lib/esm/view/invoicing/invoicingDunningCaseListView/invoicingDunningCaseListViewReducer.js +7 -1
  20. package/lib/esm/view/invoicing/invoicingDunningCaseListView/invoicingDunningCaseListViewSelector.js +23 -13
  21. package/lib/esm/view/invoicing/invoicingSubscriptionListView/epics/fetchInvoicingSubscriptionListEpic.js +0 -3
  22. package/lib/esm/view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewReducer.js +7 -1
  23. package/lib/esm/view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewSelector.js +22 -12
  24. package/lib/esm/view/invoicing/invoicingTransactionListView/epics/fetchInvoicingTransactionListEpic.js +7 -5
  25. package/lib/esm/view/invoicing/invoicingTransactionListView/epics/fetchInvoicingTransactionListPageEpic.js +2 -1
  26. package/lib/esm/view/invoicing/invoicingTransactionListView/invoicingTransactionListViewReducer.js +56 -25
  27. package/lib/esm/view/invoicing/invoicingTransactionListView/invoicingTransactionListViewSelector.js +15 -11
  28. package/lib/esm/view/invoicing/invoicingTransactionListView/invoicingTransactionListViewState.js +10 -0
  29. package/lib/esm/view/notificationPreferencesView/epics/saveNotificationPreferencesEpic.js +12 -9
  30. package/lib/esm/view/notificationPreferencesView/notificationPreferencesViewPayload.js +2 -7
  31. package/lib/esm/view/notificationPreferencesView/notificationPreferencesViewReducer.js +2 -47
  32. package/lib/esm/view/notificationPreferencesView/notificationPreferencesViewSelector.js +0 -9
  33. package/lib/esm/view/notificationPreferencesView/notificationPreferencesViewState.js +0 -1
  34. package/lib/esm/view/spendManagement/billPay/billDetailView/billDetailViewSelector.js +8 -2
  35. package/lib/esm/view/spendManagement/helpers.js +12 -0
  36. package/lib/esm/view/spendManagement/reimbursement/editRemiView/epics/fetchEditRemiDetailPageEpic.js +0 -12
  37. package/lib/esm/view/spendManagement/reimbursement/remiDetailView/remiDetailViewSelector.js +4 -2
  38. package/lib/index.d.ts +9 -9
  39. package/lib/index.js +21 -16
  40. package/lib/view/invoicing/couponView/couponViewEpics.js +0 -3
  41. package/lib/view/invoicing/couponView/couponViewReducer.d.ts +1 -1
  42. package/lib/view/invoicing/couponView/couponViewReducer.js +8 -2
  43. package/lib/view/invoicing/couponView/couponViewSelector.d.ts +1 -0
  44. package/lib/view/invoicing/couponView/couponViewSelector.js +27 -14
  45. package/lib/view/invoicing/couponView/couponViewState.d.ts +2 -1
  46. package/lib/view/invoicing/invoiceList/fetchInvoiceListEpic.d.ts +1 -1
  47. package/lib/view/invoicing/invoiceList/fetchInvoiceListEpic.js +7 -5
  48. package/lib/view/invoicing/invoiceList/fetchInvoiceListPageEpic.js +2 -1
  49. package/lib/view/invoicing/invoiceList/invoiceListReducer.d.ts +5 -4
  50. package/lib/view/invoicing/invoiceList/invoiceListReducer.js +63 -37
  51. package/lib/view/invoicing/invoiceList/invoiceListSelector.d.ts +1 -0
  52. package/lib/view/invoicing/invoiceList/invoiceListSelector.js +19 -15
  53. package/lib/view/invoicing/invoiceList/invoiceListState.d.ts +21 -7
  54. package/lib/view/invoicing/invoiceList/invoiceListState.js +13 -1
  55. package/lib/view/invoicing/invoicingCreditNoteListView/epics/fetchInvoicingCreditNoteListEpic.js +0 -3
  56. package/lib/view/invoicing/invoicingCreditNoteListView/invoicingCreditNoteListViewReducer.d.ts +1 -1
  57. package/lib/view/invoicing/invoicingCreditNoteListView/invoicingCreditNoteListViewReducer.js +8 -2
  58. package/lib/view/invoicing/invoicingCreditNoteListView/invoicingCreditNoteListViewSelector.d.ts +1 -0
  59. package/lib/view/invoicing/invoicingCreditNoteListView/invoicingCreditNoteListViewSelector.js +23 -13
  60. package/lib/view/invoicing/invoicingCreditNoteListView/invoicingCreditNoteListViewState.d.ts +2 -1
  61. package/lib/view/invoicing/invoicingCustomerDetailView/fetchInvoicingCustomerDetailPageEpic.js +3 -2
  62. package/lib/view/invoicing/invoicingCustomerDetailView/invoicingCustomerDetailViewSelector.js +1 -1
  63. package/lib/view/invoicing/invoicingCustomerListView/epics/fetchInvoicingCustomerListEpic.js +0 -3
  64. package/lib/view/invoicing/invoicingCustomerListView/invoicingCustomerListViewReducer.d.ts +1 -1
  65. package/lib/view/invoicing/invoicingCustomerListView/invoicingCustomerListViewReducer.js +8 -2
  66. package/lib/view/invoicing/invoicingCustomerListView/invoicingCustomerListViewSelector.d.ts +1 -0
  67. package/lib/view/invoicing/invoicingCustomerListView/invoicingCustomerListViewSelector.js +25 -12
  68. package/lib/view/invoicing/invoicingCustomerListView/invoicingCustomerListViewState.d.ts +2 -1
  69. package/lib/view/invoicing/invoicingDunningCaseListView/epics/fetchInvoicingDunningCaseListEpic.js +0 -3
  70. package/lib/view/invoicing/invoicingDunningCaseListView/invoicingDunningCaseListViewReducer.d.ts +1 -1
  71. package/lib/view/invoicing/invoicingDunningCaseListView/invoicingDunningCaseListViewReducer.js +8 -2
  72. package/lib/view/invoicing/invoicingDunningCaseListView/invoicingDunningCaseListViewSelector.d.ts +1 -0
  73. package/lib/view/invoicing/invoicingDunningCaseListView/invoicingDunningCaseListViewSelector.js +23 -13
  74. package/lib/view/invoicing/invoicingDunningCaseListView/invoicingDunningCaseListViewState.d.ts +2 -1
  75. package/lib/view/invoicing/invoicingSubscriptionListView/epics/fetchInvoicingSubscriptionListEpic.js +0 -3
  76. package/lib/view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewReducer.d.ts +1 -1
  77. package/lib/view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewReducer.js +8 -2
  78. package/lib/view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewSelector.d.ts +1 -0
  79. package/lib/view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewSelector.js +22 -12
  80. package/lib/view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewState.d.ts +3 -1
  81. package/lib/view/invoicing/invoicingTransactionListView/epics/fetchInvoicingTransactionListEpic.d.ts +1 -1
  82. package/lib/view/invoicing/invoicingTransactionListView/epics/fetchInvoicingTransactionListEpic.js +7 -5
  83. package/lib/view/invoicing/invoicingTransactionListView/epics/fetchInvoicingTransactionListPageEpic.js +2 -1
  84. package/lib/view/invoicing/invoicingTransactionListView/invoicingTransactionListViewReducer.d.ts +1 -1
  85. package/lib/view/invoicing/invoicingTransactionListView/invoicingTransactionListViewReducer.js +57 -26
  86. package/lib/view/invoicing/invoicingTransactionListView/invoicingTransactionListViewSelector.d.ts +1 -0
  87. package/lib/view/invoicing/invoicingTransactionListView/invoicingTransactionListViewSelector.js +15 -11
  88. package/lib/view/invoicing/invoicingTransactionListView/invoicingTransactionListViewState.d.ts +18 -4
  89. package/lib/view/invoicing/invoicingTransactionListView/invoicingTransactionListViewState.js +13 -1
  90. package/lib/view/notificationPreferencesView/epics/saveNotificationPreferencesEpic.d.ts +8 -2
  91. package/lib/view/notificationPreferencesView/epics/saveNotificationPreferencesEpic.js +9 -6
  92. package/lib/view/notificationPreferencesView/notificationPreferencesViewPayload.d.ts +0 -1
  93. package/lib/view/notificationPreferencesView/notificationPreferencesViewPayload.js +2 -7
  94. package/lib/view/notificationPreferencesView/notificationPreferencesViewReducer.d.ts +1 -6
  95. package/lib/view/notificationPreferencesView/notificationPreferencesViewReducer.js +3 -48
  96. package/lib/view/notificationPreferencesView/notificationPreferencesViewSelector.js +0 -9
  97. package/lib/view/notificationPreferencesView/notificationPreferencesViewState.d.ts +0 -1
  98. package/lib/view/notificationPreferencesView/notificationPreferencesViewState.js +0 -1
  99. package/lib/view/spendManagement/billPay/billDetailView/billDetailViewSelector.d.ts +1 -0
  100. package/lib/view/spendManagement/billPay/billDetailView/billDetailViewSelector.js +7 -1
  101. package/lib/view/spendManagement/helpers.d.ts +1 -0
  102. package/lib/view/spendManagement/helpers.js +14 -1
  103. package/lib/view/spendManagement/reimbursement/editRemiView/epics/fetchEditRemiDetailPageEpic.d.ts +1 -2
  104. package/lib/view/spendManagement/reimbursement/editRemiView/epics/fetchEditRemiDetailPageEpic.js +0 -12
  105. package/lib/view/spendManagement/reimbursement/remiDetailView/remiDetailViewSelector.d.ts +1 -0
  106. package/lib/view/spendManagement/reimbursement/remiDetailView/remiDetailViewSelector.js +3 -1
  107. package/package.json +1 -1
@@ -9,9 +9,6 @@ const invoicingApiHelper_1 = require("../../invoicingApiHelper");
9
9
  const invoicingDunningCaseListViewReducer_1 = require("../invoicingDunningCaseListViewReducer");
10
10
  const buildQuery = (filters, cursor, sort) => {
11
11
  const params = new URLSearchParams();
12
- if (filters.status != null && filters.status.length > 0) {
13
- params.set('status', filters.status);
14
- }
15
12
  if (filters.search != null && filters.search.length > 0) {
16
13
  params.set('search', filters.search);
17
14
  }
@@ -26,6 +26,6 @@ export declare const fetchInvoicingDunningCaseList: import("@reduxjs/toolkit").A
26
26
  ids: ID[];
27
27
  keepExistingListItems: boolean;
28
28
  nextCursor: string | null;
29
- }, "invoicingDunningCaseListView/updateInvoicingDunningCaseList">, updateInvoicingDunningCaseListFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<ZeniAPIStatus<Record<string, unknown>>, "invoicingDunningCaseListView/updateInvoicingDunningCaseListFailure">, fetchInvoicingDunningCaseCounts: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"invoicingDunningCaseListView/fetchInvoicingDunningCaseCounts">, updateInvoicingDunningCaseCounts: import("@reduxjs/toolkit").ActionCreatorWithPayload<InvoicingListCounts, "invoicingDunningCaseListView/updateInvoicingDunningCaseCounts">, updateInvoicingDunningCaseCountsFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<ZeniAPIStatus<Record<string, unknown>>, "invoicingDunningCaseListView/updateInvoicingDunningCaseCountsFailure">, updateInvoicingDunningCaseFilters: import("@reduxjs/toolkit").ActionCreatorWithPayload<InvoicingDunningCaseFilters, "invoicingDunningCaseListView/updateInvoicingDunningCaseFilters">, clearInvoicingDunningCaseListView: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"invoicingDunningCaseListView/clearInvoicingDunningCaseListView">;
29
+ }, "invoicingDunningCaseListView/updateInvoicingDunningCaseList">, updateInvoicingDunningCaseListFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<ZeniAPIStatus<Record<string, unknown>>, "invoicingDunningCaseListView/updateInvoicingDunningCaseListFailure">, fetchInvoicingDunningCaseCounts: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"invoicingDunningCaseListView/fetchInvoicingDunningCaseCounts">, updateInvoicingDunningCaseCounts: import("@reduxjs/toolkit").ActionCreatorWithPayload<InvoicingListCounts, "invoicingDunningCaseListView/updateInvoicingDunningCaseCounts">, updateInvoicingDunningCaseCountsFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<ZeniAPIStatus<Record<string, unknown>>, "invoicingDunningCaseListView/updateInvoicingDunningCaseCountsFailure">, updateInvoicingDunningCaseFilters: import("@reduxjs/toolkit").ActionCreatorWithPayload<InvoicingDunningCaseFilters, "invoicingDunningCaseListView/updateInvoicingDunningCaseFilters">, setInvoicingDunningCaseActiveTab: import("@reduxjs/toolkit").ActionCreatorWithPayload<"Retrying" | "Scheduled" | "Manual Review" | "Resolved" | "Cancelled" | "all", "invoicingDunningCaseListView/setInvoicingDunningCaseActiveTab">, clearInvoicingDunningCaseListView: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"invoicingDunningCaseListView/clearInvoicingDunningCaseListView">;
30
30
  declare const _default: import("redux").Reducer<InvoicingDunningCaseListViewState>;
31
31
  export default _default;
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
  var _a;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.clearInvoicingDunningCaseListView = exports.updateInvoicingDunningCaseFilters = exports.updateInvoicingDunningCaseCountsFailure = exports.updateInvoicingDunningCaseCounts = exports.fetchInvoicingDunningCaseCounts = exports.updateInvoicingDunningCaseListFailure = exports.updateInvoicingDunningCaseList = exports.fetchInvoicingDunningCaseListPage = exports.fetchInvoicingDunningCaseList = exports.initialState = void 0;
4
+ exports.clearInvoicingDunningCaseListView = exports.setInvoicingDunningCaseActiveTab = exports.updateInvoicingDunningCaseFilters = exports.updateInvoicingDunningCaseCountsFailure = exports.updateInvoicingDunningCaseCounts = exports.fetchInvoicingDunningCaseCounts = exports.updateInvoicingDunningCaseListFailure = exports.updateInvoicingDunningCaseList = exports.fetchInvoicingDunningCaseListPage = exports.fetchInvoicingDunningCaseList = exports.initialState = void 0;
5
5
  const toolkit_1 = require("@reduxjs/toolkit");
6
6
  exports.initialState = {
7
7
  fetchState: 'Not-Started',
8
8
  error: undefined,
9
+ activeTab: 'all',
9
10
  ids: [],
10
11
  nextCursor: null,
11
12
  filters: {},
@@ -84,10 +85,15 @@ const invoicingDunningCaseListView = (0, toolkit_1.createSlice)({
84
85
  updateInvoicingDunningCaseFilters(draft, action) {
85
86
  draft.filters = action.payload;
86
87
  },
88
+ // Select a status tab. The list API ignores `status` (returns all statuses),
89
+ // so the selector filters rows to this tab client-side — no refetch needed.
90
+ setInvoicingDunningCaseActiveTab(draft, action) {
91
+ draft.activeTab = action.payload;
92
+ },
87
93
  clearInvoicingDunningCaseListView(draft) {
88
94
  Object.assign(draft, exports.initialState);
89
95
  },
90
96
  },
91
97
  });
92
- _a = invoicingDunningCaseListView.actions, exports.fetchInvoicingDunningCaseList = _a.fetchInvoicingDunningCaseList, exports.fetchInvoicingDunningCaseListPage = _a.fetchInvoicingDunningCaseListPage, exports.updateInvoicingDunningCaseList = _a.updateInvoicingDunningCaseList, exports.updateInvoicingDunningCaseListFailure = _a.updateInvoicingDunningCaseListFailure, exports.fetchInvoicingDunningCaseCounts = _a.fetchInvoicingDunningCaseCounts, exports.updateInvoicingDunningCaseCounts = _a.updateInvoicingDunningCaseCounts, exports.updateInvoicingDunningCaseCountsFailure = _a.updateInvoicingDunningCaseCountsFailure, exports.updateInvoicingDunningCaseFilters = _a.updateInvoicingDunningCaseFilters, exports.clearInvoicingDunningCaseListView = _a.clearInvoicingDunningCaseListView;
98
+ _a = invoicingDunningCaseListView.actions, exports.fetchInvoicingDunningCaseList = _a.fetchInvoicingDunningCaseList, exports.fetchInvoicingDunningCaseListPage = _a.fetchInvoicingDunningCaseListPage, exports.updateInvoicingDunningCaseList = _a.updateInvoicingDunningCaseList, exports.updateInvoicingDunningCaseListFailure = _a.updateInvoicingDunningCaseListFailure, exports.fetchInvoicingDunningCaseCounts = _a.fetchInvoicingDunningCaseCounts, exports.updateInvoicingDunningCaseCounts = _a.updateInvoicingDunningCaseCounts, exports.updateInvoicingDunningCaseCountsFailure = _a.updateInvoicingDunningCaseCountsFailure, exports.updateInvoicingDunningCaseFilters = _a.updateInvoicingDunningCaseFilters, exports.setInvoicingDunningCaseActiveTab = _a.setInvoicingDunningCaseActiveTab, exports.clearInvoicingDunningCaseListView = _a.clearInvoicingDunningCaseListView;
93
99
  exports.default = invoicingDunningCaseListView.reducer;
@@ -6,6 +6,7 @@ import { RootState } from '../../../reducer';
6
6
  import { InvoicingListSort } from '../invoicingApiHelper';
7
7
  import { InvoicingDunningCaseColumnConfig, InvoicingDunningCaseFilters, InvoicingDunningCaseTabId } from './invoicingDunningCaseListViewState';
8
8
  export interface InvoicingDunningCaseListView extends SelectorView {
9
+ activeTab: InvoicingDunningCaseTabId;
9
10
  columns: InvoicingDunningCaseColumnConfig[];
10
11
  count: InvoicingListCounts;
11
12
  countsFetchState: FetchStateAndError;
@@ -9,16 +9,26 @@ const invoicingDunningCaseListViewState_1 = require("./invoicingDunningCaseListV
9
9
  * object) keep referential identity until the dunning-case entity slice or the
10
10
  * list-view slice actually change.
11
11
  */
12
- exports.getInvoicingDunningCaseListView = (0, toolkit_1.createSelector)((state) => state.invoicingDunningCaseState, (state) => state.invoicingDunningCaseListViewState, (dunningCaseState, listViewState) => ({
13
- columns: invoicingDunningCaseListViewState_1.INVOICING_DUNNING_CASE_COLUMNS,
14
- dunningCases: (0, dunningCaseSelector_1.getInvoicingDunningCasesByIds)(dunningCaseState, listViewState.ids),
15
- count: listViewState.counts,
16
- countsFetchState: listViewState.countsFetchState,
17
- filters: listViewState.filters,
18
- nextCursor: listViewState.nextCursor,
19
- fetchState: listViewState.fetchState,
20
- error: listViewState.error,
21
- tabIds: invoicingDunningCaseListViewState_1.INVOICING_DUNNING_CASE_TABS,
22
- sort: listViewState.sort,
23
- version: 1.0,
24
- }));
12
+ exports.getInvoicingDunningCaseListView = (0, toolkit_1.createSelector)((state) => state.invoicingDunningCaseState, (state) => state.invoicingDunningCaseListViewState, (dunningCaseState, listViewState) => {
13
+ const { activeTab } = listViewState;
14
+ const allDunningCases = (0, dunningCaseSelector_1.getInvoicingDunningCasesByIds)(dunningCaseState, listViewState.ids);
15
+ // The list API ignores `status`, so it returns every status; filter to the
16
+ // active tab client-side ('all' shows everything).
17
+ const dunningCases = activeTab === 'all'
18
+ ? allDunningCases
19
+ : allDunningCases.filter((dunningCase) => dunningCase.status === activeTab);
20
+ return {
21
+ activeTab,
22
+ columns: invoicingDunningCaseListViewState_1.INVOICING_DUNNING_CASE_COLUMNS,
23
+ dunningCases,
24
+ count: listViewState.counts,
25
+ countsFetchState: listViewState.countsFetchState,
26
+ filters: listViewState.filters,
27
+ nextCursor: listViewState.nextCursor,
28
+ fetchState: listViewState.fetchState,
29
+ error: listViewState.error,
30
+ tabIds: invoicingDunningCaseListViewState_1.INVOICING_DUNNING_CASE_TABS,
31
+ sort: listViewState.sort,
32
+ version: 1.0,
33
+ };
34
+ });
@@ -3,7 +3,6 @@ import { InvoicingListCounts } from '../../../entity/invoicing/invoicingCommonPa
3
3
  import { InvoicingListSort } from '../invoicingApiHelper';
4
4
  export interface InvoicingDunningCaseFilters {
5
5
  search?: string;
6
- status?: string;
7
6
  }
8
7
  export declare const ALL_INVOICING_DUNNING_CASE_SORT_KEYS: readonly ["customer", "invoice", "attempts", "nextRetry", "daysPastDue", "failureReason", "status", "amount"];
9
8
  export declare const toInvoicingDunningCaseSortKey: (v: string) => "amount" | "status" | "invoice" | "customer" | "attempts" | "daysPastDue" | "failureReason" | "nextRetry";
@@ -31,6 +30,8 @@ export type InvoicingDunningCaseTabId = ReturnType<typeof toInvoicingDunningCase
31
30
  */
32
31
  export declare const INVOICING_DUNNING_CASE_TABS: InvoicingDunningCaseTabId[];
33
32
  export interface InvoicingDunningCaseListViewState extends FetchedState {
33
+ /** Selected status tab (CES-owned so it persists across page revisits). */
34
+ activeTab: InvoicingDunningCaseTabId;
34
35
  counts: InvoicingListCounts;
35
36
  countsFetchState: FetchStateAndError;
36
37
  filters: InvoicingDunningCaseFilters;
@@ -11,9 +11,6 @@ const invoicingApiHelper_1 = require("../../invoicingApiHelper");
11
11
  const invoicingSubscriptionListViewReducer_1 = require("../invoicingSubscriptionListViewReducer");
12
12
  const buildQuery = (filters, cursor, sort) => {
13
13
  const params = new URLSearchParams();
14
- if (filters.status != null && filters.status.length > 0) {
15
- params.set('status', filters.status);
16
- }
17
14
  if (filters.customerId != null) {
18
15
  params.set('customer_id', filters.customerId);
19
16
  }
@@ -27,7 +27,7 @@ export declare const fetchInvoicingSubscriptionList: import("@reduxjs/toolkit").
27
27
  ids: ID[];
28
28
  keepExistingListItems: boolean;
29
29
  nextCursor: string | null;
30
- }, "invoicingSubscriptionListView/updateInvoicingSubscriptionList">, updateInvoicingSubscriptionListFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<ZeniAPIStatus<Record<string, unknown>>, "invoicingSubscriptionListView/updateInvoicingSubscriptionListFailure">, fetchInvoicingSubscriptionCounts: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"invoicingSubscriptionListView/fetchInvoicingSubscriptionCounts">, updateInvoicingSubscriptionCounts: import("@reduxjs/toolkit").ActionCreatorWithPayload<InvoicingListCounts, "invoicingSubscriptionListView/updateInvoicingSubscriptionCounts">, updateInvoicingSubscriptionCountsFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<ZeniAPIStatus<Record<string, unknown>>, "invoicingSubscriptionListView/updateInvoicingSubscriptionCountsFailure">, updateInvoicingSubscriptionFilters: import("@reduxjs/toolkit").ActionCreatorWithPayload<InvoicingSubscriptionFilters, "invoicingSubscriptionListView/updateInvoicingSubscriptionFilters">, addInvoicingSubscriptionToList: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
30
+ }, "invoicingSubscriptionListView/updateInvoicingSubscriptionList">, updateInvoicingSubscriptionListFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<ZeniAPIStatus<Record<string, unknown>>, "invoicingSubscriptionListView/updateInvoicingSubscriptionListFailure">, fetchInvoicingSubscriptionCounts: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"invoicingSubscriptionListView/fetchInvoicingSubscriptionCounts">, updateInvoicingSubscriptionCounts: import("@reduxjs/toolkit").ActionCreatorWithPayload<InvoicingListCounts, "invoicingSubscriptionListView/updateInvoicingSubscriptionCounts">, updateInvoicingSubscriptionCountsFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<ZeniAPIStatus<Record<string, unknown>>, "invoicingSubscriptionListView/updateInvoicingSubscriptionCountsFailure">, updateInvoicingSubscriptionFilters: import("@reduxjs/toolkit").ActionCreatorWithPayload<InvoicingSubscriptionFilters, "invoicingSubscriptionListView/updateInvoicingSubscriptionFilters">, setInvoicingSubscriptionActiveTab: import("@reduxjs/toolkit").ActionCreatorWithPayload<"active" | "cancelled" | "future" | "in_trial" | "non_renewing" | "paused" | "all", "invoicingSubscriptionListView/setInvoicingSubscriptionActiveTab">, addInvoicingSubscriptionToList: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
31
31
  id: ID;
32
32
  status?: InvoicingSubscriptionStatus;
33
33
  }, "invoicingSubscriptionListView/addInvoicingSubscriptionToList">, clearInvoicingSubscriptionListView: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"invoicingSubscriptionListView/clearInvoicingSubscriptionListView">;
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
  var _a;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.clearInvoicingSubscriptionListView = exports.addInvoicingSubscriptionToList = exports.updateInvoicingSubscriptionFilters = exports.updateInvoicingSubscriptionCountsFailure = exports.updateInvoicingSubscriptionCounts = exports.fetchInvoicingSubscriptionCounts = exports.updateInvoicingSubscriptionListFailure = exports.updateInvoicingSubscriptionList = exports.fetchInvoicingSubscriptionListPage = exports.fetchInvoicingSubscriptionList = exports.initialState = void 0;
4
+ exports.clearInvoicingSubscriptionListView = exports.addInvoicingSubscriptionToList = exports.setInvoicingSubscriptionActiveTab = exports.updateInvoicingSubscriptionFilters = exports.updateInvoicingSubscriptionCountsFailure = exports.updateInvoicingSubscriptionCounts = exports.fetchInvoicingSubscriptionCounts = exports.updateInvoicingSubscriptionListFailure = exports.updateInvoicingSubscriptionList = exports.fetchInvoicingSubscriptionListPage = exports.fetchInvoicingSubscriptionList = exports.initialState = void 0;
5
5
  const toolkit_1 = require("@reduxjs/toolkit");
6
6
  exports.initialState = {
7
7
  fetchState: 'Not-Started',
8
8
  error: undefined,
9
+ activeTab: 'all',
9
10
  ids: [],
10
11
  nextCursor: null,
11
12
  filters: {},
@@ -84,6 +85,11 @@ const invoicingSubscriptionListView = (0, toolkit_1.createSlice)({
84
85
  updateInvoicingSubscriptionFilters(draft, action) {
85
86
  draft.filters = action.payload;
86
87
  },
88
+ // Select a status tab. The list API ignores `status` (returns all statuses),
89
+ // so the selector filters rows to this tab client-side — no refetch needed.
90
+ setInvoicingSubscriptionActiveTab(draft, action) {
91
+ draft.activeTab = action.payload;
92
+ },
87
93
  // Reflect a newly created subscription in the cached list + tab counts so the
88
94
  // subscription page shows it without refetching from the server. The status
89
95
  // doubles as the per-tab count key (tab ids mirror InvoicingSubscriptionStatus).
@@ -103,5 +109,5 @@ const invoicingSubscriptionListView = (0, toolkit_1.createSlice)({
103
109
  },
104
110
  },
105
111
  });
106
- _a = invoicingSubscriptionListView.actions, exports.fetchInvoicingSubscriptionList = _a.fetchInvoicingSubscriptionList, exports.fetchInvoicingSubscriptionListPage = _a.fetchInvoicingSubscriptionListPage, exports.updateInvoicingSubscriptionList = _a.updateInvoicingSubscriptionList, exports.updateInvoicingSubscriptionListFailure = _a.updateInvoicingSubscriptionListFailure, exports.fetchInvoicingSubscriptionCounts = _a.fetchInvoicingSubscriptionCounts, exports.updateInvoicingSubscriptionCounts = _a.updateInvoicingSubscriptionCounts, exports.updateInvoicingSubscriptionCountsFailure = _a.updateInvoicingSubscriptionCountsFailure, exports.updateInvoicingSubscriptionFilters = _a.updateInvoicingSubscriptionFilters, exports.addInvoicingSubscriptionToList = _a.addInvoicingSubscriptionToList, exports.clearInvoicingSubscriptionListView = _a.clearInvoicingSubscriptionListView;
112
+ _a = invoicingSubscriptionListView.actions, exports.fetchInvoicingSubscriptionList = _a.fetchInvoicingSubscriptionList, exports.fetchInvoicingSubscriptionListPage = _a.fetchInvoicingSubscriptionListPage, exports.updateInvoicingSubscriptionList = _a.updateInvoicingSubscriptionList, exports.updateInvoicingSubscriptionListFailure = _a.updateInvoicingSubscriptionListFailure, exports.fetchInvoicingSubscriptionCounts = _a.fetchInvoicingSubscriptionCounts, exports.updateInvoicingSubscriptionCounts = _a.updateInvoicingSubscriptionCounts, exports.updateInvoicingSubscriptionCountsFailure = _a.updateInvoicingSubscriptionCountsFailure, exports.updateInvoicingSubscriptionFilters = _a.updateInvoicingSubscriptionFilters, exports.setInvoicingSubscriptionActiveTab = _a.setInvoicingSubscriptionActiveTab, exports.addInvoicingSubscriptionToList = _a.addInvoicingSubscriptionToList, exports.clearInvoicingSubscriptionListView = _a.clearInvoicingSubscriptionListView;
107
113
  exports.default = invoicingSubscriptionListView.reducer;
@@ -6,6 +6,7 @@ import { RootState } from '../../../reducer';
6
6
  import { InvoicingListSort } from '../invoicingApiHelper';
7
7
  import { InvoicingSubscriptionColumnConfig, InvoicingSubscriptionFilters, InvoicingSubscriptionTabId } from './invoicingSubscriptionListViewState';
8
8
  export interface InvoicingSubscriptionListView extends SelectorView {
9
+ activeTab: InvoicingSubscriptionTabId;
9
10
  columns: InvoicingSubscriptionColumnConfig[];
10
11
  count: InvoicingListCounts;
11
12
  countsFetchState: FetchStateAndError;
@@ -11,15 +11,25 @@ const invoicingSubscriptionListViewState_1 = require("./invoicingSubscriptionLis
11
11
  * re-rendered on every unrelated redux action because a fresh array was built
12
12
  * each call.
13
13
  */
14
- exports.getInvoicingSubscriptionListView = (0, toolkit_1.createSelector)((state) => state.invoicingSubscriptionState, (state) => state.invoicingSubscriptionListViewState, (subscriptionState, listViewState) => ({
15
- columns: invoicingSubscriptionListViewState_1.INVOICING_SUBSCRIPTION_COLUMNS,
16
- subscriptions: (0, invoicingSubscriptionSelector_1.getInvoicingSubscriptionsByIds)(subscriptionState, listViewState.ids),
17
- fetchState: listViewState.fetchState,
18
- error: listViewState.error,
19
- nextCursor: listViewState.nextCursor,
20
- filters: listViewState.filters,
21
- count: listViewState.counts,
22
- countsFetchState: listViewState.countsFetchState,
23
- tabIds: invoicingSubscriptionListViewState_1.INVOICING_SUBSCRIPTION_TABS,
24
- sort: listViewState.sort,
25
- }));
14
+ exports.getInvoicingSubscriptionListView = (0, toolkit_1.createSelector)((state) => state.invoicingSubscriptionState, (state) => state.invoicingSubscriptionListViewState, (subscriptionState, listViewState) => {
15
+ const { activeTab } = listViewState;
16
+ const allSubscriptions = (0, invoicingSubscriptionSelector_1.getInvoicingSubscriptionsByIds)(subscriptionState, listViewState.ids);
17
+ // The list API ignores `status`, so it returns every status; filter to the
18
+ // active tab client-side ('all' shows everything).
19
+ const subscriptions = activeTab === 'all'
20
+ ? allSubscriptions
21
+ : allSubscriptions.filter((subscription) => subscription.status === activeTab);
22
+ return {
23
+ activeTab,
24
+ columns: invoicingSubscriptionListViewState_1.INVOICING_SUBSCRIPTION_COLUMNS,
25
+ subscriptions,
26
+ fetchState: listViewState.fetchState,
27
+ error: listViewState.error,
28
+ nextCursor: listViewState.nextCursor,
29
+ filters: listViewState.filters,
30
+ count: listViewState.counts,
31
+ countsFetchState: listViewState.countsFetchState,
32
+ tabIds: invoicingSubscriptionListViewState_1.INVOICING_SUBSCRIPTION_TABS,
33
+ sort: listViewState.sort,
34
+ };
35
+ });
@@ -6,7 +6,6 @@ export interface InvoicingSubscriptionFilters {
6
6
  search?: string;
7
7
  startedFrom?: string;
8
8
  startedTo?: string;
9
- status?: string;
10
9
  }
11
10
  export declare const ALL_INVOICING_SUBSCRIPTION_SORT_KEYS: readonly ["subscription", "customer", "plan", "product_code", "term_end", "next_billing", "auto_collect", "status", "mrr"];
12
11
  export declare const toInvoicingSubscriptionSortKey: (v: string) => "status" | "customer" | "mrr" | "plan" | "subscription" | "product_code" | "term_end" | "next_billing" | "auto_collect";
@@ -34,9 +33,12 @@ export type InvoicingSubscriptionTabId = ReturnType<typeof toInvoicingSubscripti
34
33
  */
35
34
  export declare const INVOICING_SUBSCRIPTION_TABS: InvoicingSubscriptionTabId[];
36
35
  export interface InvoicingSubscriptionListViewState extends FetchedState {
36
+ /** Selected status tab (CES-owned so it persists across page revisits). */
37
+ activeTab: InvoicingSubscriptionTabId;
37
38
  counts: InvoicingListCounts;
38
39
  countsFetchState: FetchStateAndError;
39
40
  filters: InvoicingSubscriptionFilters;
41
+ /** Full list ids (all statuses); the selector filters by `activeTab`. */
40
42
  ids: ID[];
41
43
  nextCursor: string | null;
42
44
  /** Active server-side sort (undefined = backend default order). */
@@ -5,4 +5,4 @@ import { RootState } from '../../../../reducer';
5
5
  import { ZeniAPI } from '../../../../zeniAPI';
6
6
  import { fetchInvoicingTransactionList, updateInvoicingTransactionList, updateInvoicingTransactionListFailure } from '../invoicingTransactionListViewReducer';
7
7
  export type ActionType = ReturnType<typeof fetchInvoicingTransactionList> | ReturnType<typeof updateInvoicingTransactionList> | ReturnType<typeof updateInvoicingTransactionListFailure> | ReturnType<typeof updateInvoicingTransactions>;
8
- export declare const fetchInvoicingTransactionListEpic: (actions$: ActionsObservable<ActionType>, _state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => Observable<ActionType>;
8
+ export declare const fetchInvoicingTransactionListEpic: (actions$: ActionsObservable<ActionType>, state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => Observable<ActionType>;
@@ -7,13 +7,13 @@ const invoicingTransactionReducer_1 = require("../../../../entity/invoicing/invo
7
7
  const responsePayload_1 = require("../../../../responsePayload");
8
8
  const invoicingApiHelper_1 = require("../../invoicingApiHelper");
9
9
  const invoicingTransactionListViewReducer_1 = require("../invoicingTransactionListViewReducer");
10
- const buildQuery = (filters, cursor, sort) => {
10
+ const buildQuery = (filters, type, cursor, sort) => {
11
11
  const params = new URLSearchParams();
12
12
  if (filters.status != null && filters.status.length > 0) {
13
13
  params.set('status', filters.status);
14
14
  }
15
- if (filters.type != null && filters.type.length > 0) {
16
- params.set('type', filters.type);
15
+ if (type != null && type.length > 0) {
16
+ params.set('type', type);
17
17
  }
18
18
  if (filters.customerId != null) {
19
19
  params.set('customer_id', filters.customerId);
@@ -28,9 +28,11 @@ const buildQuery = (filters, cursor, sort) => {
28
28
  (0, invoicingApiHelper_1.applyListSortParams)(params, sort);
29
29
  return params;
30
30
  };
31
- const fetchInvoicingTransactionListEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(invoicingTransactionListViewReducer_1.fetchInvoicingTransactionList.match), (0, operators_1.switchMap)((action) => {
31
+ const fetchInvoicingTransactionListEpic = (actions$, state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(invoicingTransactionListViewReducer_1.fetchInvoicingTransactionList.match), (0, operators_1.switchMap)((action) => {
32
32
  const { filters, cursor, keepExistingListItems, sort } = action.payload;
33
- const apiUrl = (0, invoicingApiHelper_1.withQuery)(`${zeniAPI.apiEndPoints.invoicingMicroServiceBaseUrl}/1.0/payments`, buildQuery(filters, cursor, sort));
33
+ const { activeTab } = state$.value.invoicingTransactionListViewState;
34
+ const type = activeTab !== 'all' ? activeTab : undefined;
35
+ const apiUrl = (0, invoicingApiHelper_1.withQuery)(`${zeniAPI.apiEndPoints.invoicingMicroServiceBaseUrl}/1.0/payments`, buildQuery(filters, type, cursor, sort));
34
36
  return zeniAPI.getJSON(apiUrl).pipe((0, operators_1.switchMap)((response) => {
35
37
  if ((0, responsePayload_1.isSuccessResponse)(response)) {
36
38
  const items = response.data?.items ?? [];
@@ -19,8 +19,9 @@ const shouldFetch = (fetchStateAndError, cacheOverride) => cacheOverride ||
19
19
  const fetchInvoicingTransactionListPageEpic = (actions$, state$) => actions$.pipe((0, operators_1.filter)(invoicingTransactionListViewReducer_1.fetchInvoicingTransactionListPage.match), (0, operators_1.mergeMap)((action) => {
20
20
  const { cacheOverride, filters, sort } = action.payload;
21
21
  const state = state$.value.invoicingTransactionListViewState;
22
+ const activeTabState = state.byTab[state.activeTab];
22
23
  const pageActions = [];
23
- if (shouldFetch({ fetchState: state.fetchState, error: state.error }, cacheOverride)) {
24
+ if (shouldFetch({ fetchState: activeTabState.fetchState, error: activeTabState.error }, cacheOverride)) {
24
25
  pageActions.push((0, invoicingTransactionListViewReducer_1.fetchInvoicingTransactionList)({ filters, sort }));
25
26
  }
26
27
  return (0, rxjs_1.concat)((0, rxjs_1.from)(pageActions));
@@ -25,6 +25,6 @@ export declare const fetchInvoicingTransactionList: import("@reduxjs/toolkit").A
25
25
  ids: ID[];
26
26
  keepExistingListItems: boolean;
27
27
  nextCursor: string | null;
28
- }, "invoicingTransactionListView/updateInvoicingTransactionList">, updateInvoicingTransactionListFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<ZeniAPIStatus<Record<string, unknown>>, "invoicingTransactionListView/updateInvoicingTransactionListFailure">, updateInvoicingTransactionFilters: import("@reduxjs/toolkit").ActionCreatorWithPayload<InvoicingTransactionFilters, "invoicingTransactionListView/updateInvoicingTransactionFilters">, addInvoicingTransactionToList: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "invoicingTransactionListView/addInvoicingTransactionToList">, clearInvoicingTransactionListView: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"invoicingTransactionListView/clearInvoicingTransactionListView">;
28
+ }, "invoicingTransactionListView/updateInvoicingTransactionList">, updateInvoicingTransactionListFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<ZeniAPIStatus<Record<string, unknown>>, "invoicingTransactionListView/updateInvoicingTransactionListFailure">, updateInvoicingTransactionFilters: import("@reduxjs/toolkit").ActionCreatorWithPayload<InvoicingTransactionFilters, "invoicingTransactionListView/updateInvoicingTransactionFilters">, setInvoicingTransactionActiveTab: import("@reduxjs/toolkit").ActionCreatorWithPayload<"refund" | "payment" | "all" | "authorization" | "payment_reversal", "invoicingTransactionListView/setInvoicingTransactionActiveTab">, addInvoicingTransactionToList: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "invoicingTransactionListView/addInvoicingTransactionToList">, clearInvoicingTransactionListView: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"invoicingTransactionListView/clearInvoicingTransactionListView">;
29
29
  declare const _default: import("redux").Reducer<InvoicingTransactionListViewState>;
30
30
  export default _default;
@@ -1,17 +1,23 @@
1
1
  "use strict";
2
2
  var _a;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.clearInvoicingTransactionListView = exports.addInvoicingTransactionToList = exports.updateInvoicingTransactionFilters = exports.updateInvoicingTransactionListFailure = exports.updateInvoicingTransactionList = exports.fetchInvoicingTransactionListPage = exports.fetchInvoicingTransactionList = exports.initialState = void 0;
4
+ exports.clearInvoicingTransactionListView = exports.addInvoicingTransactionToList = exports.setInvoicingTransactionActiveTab = exports.updateInvoicingTransactionFilters = exports.updateInvoicingTransactionListFailure = exports.updateInvoicingTransactionList = exports.fetchInvoicingTransactionListPage = exports.fetchInvoicingTransactionList = exports.initialState = void 0;
5
5
  const toolkit_1 = require("@reduxjs/toolkit");
6
+ const invoicingTransactionListViewState_1 = require("./invoicingTransactionListViewState");
7
+ /**
8
+ * Whether two transaction-list queries share the same base (tab-independent)
9
+ * query. When the base query changes (search / customer / status / sort) every
10
+ * per-tab cache is stale, so the reducer resets them all.
11
+ */
12
+ const sameTransactionBaseQuery = (a, b) => a.filters.customerId === b.filters.customerId &&
13
+ a.filters.status === b.filters.status &&
14
+ a.filters.search === b.filters.search &&
15
+ a.sort?.field === b.sort?.field &&
16
+ a.sort?.dir === b.sort?.dir;
6
17
  exports.initialState = {
7
- fetchState: 'Not-Started',
8
- error: undefined,
9
- ids: [],
10
- nextCursor: null,
18
+ activeTab: 'all',
19
+ byTab: (0, invoicingTransactionListViewState_1.makeInvoicingTransactionIdsByTab)(),
11
20
  filters: {},
12
- hasValidState() {
13
- return this.fetchState === 'Completed';
14
- },
15
21
  };
16
22
  const invoicingTransactionListView = (0, toolkit_1.createSlice)({
17
23
  name: 'invoicingTransactionListView',
@@ -19,14 +25,15 @@ const invoicingTransactionListView = (0, toolkit_1.createSlice)({
19
25
  reducers: {
20
26
  fetchInvoicingTransactionList: {
21
27
  reducer(draft, action) {
28
+ const tab = draft.byTab[draft.activeTab];
22
29
  if (!action.payload.keepExistingListItems) {
23
- draft.ids = [];
24
- draft.nextCursor = null;
30
+ tab.ids = [];
31
+ tab.nextCursor = null;
25
32
  }
26
33
  draft.filters = action.payload.filters;
27
34
  draft.sort = action.payload.sort;
28
- draft.fetchState = 'In-Progress';
29
- draft.error = undefined;
35
+ tab.fetchState = 'In-Progress';
36
+ tab.error = undefined;
30
37
  },
31
38
  prepare(payload) {
32
39
  return {
@@ -41,6 +48,12 @@ const invoicingTransactionListView = (0, toolkit_1.createSlice)({
41
48
  },
42
49
  fetchInvoicingTransactionListPage: {
43
50
  reducer(draft, action) {
51
+ // A different base query invalidates every tab's cache — reset so the
52
+ // page epic's shouldFetch refetches the active tab instead of showing
53
+ // rows fetched under a stale search/customer/status/sort.
54
+ if (!sameTransactionBaseQuery(draft, action.payload)) {
55
+ draft.byTab = (0, invoicingTransactionListViewState_1.makeInvoicingTransactionIdsByTab)();
56
+ }
44
57
  draft.filters = action.payload.filters;
45
58
  draft.sort = action.payload.sort;
46
59
  },
@@ -55,34 +68,52 @@ const invoicingTransactionListView = (0, toolkit_1.createSlice)({
55
68
  },
56
69
  },
57
70
  updateInvoicingTransactionList(draft, action) {
58
- draft.ids = action.payload.keepExistingListItems
59
- ? [...new Set([...draft.ids, ...action.payload.ids])]
71
+ const tab = draft.byTab[draft.activeTab];
72
+ tab.ids = action.payload.keepExistingListItems
73
+ ? [...new Set([...tab.ids, ...action.payload.ids])]
60
74
  : action.payload.ids;
61
- draft.nextCursor = action.payload.nextCursor;
62
- draft.fetchState = 'Completed';
63
- draft.error = undefined;
75
+ tab.nextCursor = action.payload.nextCursor;
76
+ tab.fetchState = 'Completed';
77
+ tab.error = undefined;
64
78
  },
65
79
  updateInvoicingTransactionListFailure(draft, action) {
66
- draft.fetchState = 'Error';
67
- draft.error = action.payload;
80
+ const tab = draft.byTab[draft.activeTab];
81
+ tab.fetchState = 'Error';
82
+ tab.error = action.payload;
68
83
  },
69
84
  updateInvoicingTransactionFilters(draft, action) {
70
85
  draft.filters = action.payload;
71
86
  },
87
+ // Select a type tab. The view dispatches the follow-up
88
+ // fetchInvoicingTransactionListPage so the page epic fetches the tab when
89
+ // its cache is empty and reuses it when already loaded.
90
+ setInvoicingTransactionActiveTab(draft, action) {
91
+ draft.activeTab = action.payload;
92
+ },
72
93
  // Reflect a newly recorded payment's transaction in the cached list so the
73
- // payments page shows it without refetching. The list view has no counts
74
- // slice, so we only prepend the id (dedup/no-op if already present).
94
+ // payments page shows it without refetching. The payload carries no type,
95
+ // so prepend to the 'all' tab and the tab currently in view (dedup/no-op if
96
+ // already present); other tabs refetch fresh on their next visit.
75
97
  addInvoicingTransactionToList(draft, action) {
76
98
  const id = action.payload;
77
- if (draft.ids.includes(id)) {
78
- return;
99
+ const prependTo = (tabId) => {
100
+ const tab = draft.byTab[tabId];
101
+ if (!tab.ids.includes(id)) {
102
+ tab.ids = [id, ...tab.ids];
103
+ }
104
+ };
105
+ prependTo('all');
106
+ if (draft.activeTab !== 'all') {
107
+ prependTo(draft.activeTab);
79
108
  }
80
- draft.ids = [id, ...draft.ids];
81
109
  },
82
110
  clearInvoicingTransactionListView(draft) {
83
- Object.assign(draft, exports.initialState);
111
+ draft.activeTab = 'all';
112
+ draft.byTab = (0, invoicingTransactionListViewState_1.makeInvoicingTransactionIdsByTab)();
113
+ draft.filters = {};
114
+ draft.sort = undefined;
84
115
  },
85
116
  },
86
117
  });
87
- _a = invoicingTransactionListView.actions, exports.fetchInvoicingTransactionList = _a.fetchInvoicingTransactionList, exports.fetchInvoicingTransactionListPage = _a.fetchInvoicingTransactionListPage, exports.updateInvoicingTransactionList = _a.updateInvoicingTransactionList, exports.updateInvoicingTransactionListFailure = _a.updateInvoicingTransactionListFailure, exports.updateInvoicingTransactionFilters = _a.updateInvoicingTransactionFilters, exports.addInvoicingTransactionToList = _a.addInvoicingTransactionToList, exports.clearInvoicingTransactionListView = _a.clearInvoicingTransactionListView;
118
+ _a = invoicingTransactionListView.actions, exports.fetchInvoicingTransactionList = _a.fetchInvoicingTransactionList, exports.fetchInvoicingTransactionListPage = _a.fetchInvoicingTransactionListPage, exports.updateInvoicingTransactionList = _a.updateInvoicingTransactionList, exports.updateInvoicingTransactionListFailure = _a.updateInvoicingTransactionListFailure, exports.updateInvoicingTransactionFilters = _a.updateInvoicingTransactionFilters, exports.setInvoicingTransactionActiveTab = _a.setInvoicingTransactionActiveTab, exports.addInvoicingTransactionToList = _a.addInvoicingTransactionToList, exports.clearInvoicingTransactionListView = _a.clearInvoicingTransactionListView;
88
119
  exports.default = invoicingTransactionListView.reducer;
@@ -4,6 +4,7 @@ import { RootState } from '../../../reducer';
4
4
  import { InvoicingListSort } from '../invoicingApiHelper';
5
5
  import { InvoicingTransactionColumnConfig, InvoicingTransactionFilters, InvoicingTransactionTabId } from './invoicingTransactionListViewState';
6
6
  export interface InvoicingTransactionListView extends SelectorView {
7
+ activeTab: InvoicingTransactionTabId;
7
8
  columns: InvoicingTransactionColumnConfig[];
8
9
  filters: InvoicingTransactionFilters;
9
10
  nextCursor: string | null;
@@ -9,14 +9,18 @@ const invoicingTransactionListViewState_1 = require("./invoicingTransactionListV
9
9
  * object) keep referential identity until the transaction entity slice or the
10
10
  * list-view slice actually change.
11
11
  */
12
- exports.getInvoicingTransactionListView = (0, toolkit_1.createSelector)((state) => state.invoicingTransactionState, (state) => state.invoicingTransactionListViewState, (transactionState, listViewState) => ({
13
- columns: invoicingTransactionListViewState_1.INVOICING_TRANSACTION_COLUMNS,
14
- transactions: (0, invoicingTransactionSelector_1.getInvoicingTransactionsByIds)(transactionState, listViewState.ids),
15
- filters: listViewState.filters,
16
- nextCursor: listViewState.nextCursor,
17
- fetchState: listViewState.fetchState,
18
- error: listViewState.error,
19
- tabIds: invoicingTransactionListViewState_1.INVOICING_TRANSACTION_TABS,
20
- sort: listViewState.sort,
21
- version: 1.0,
22
- }));
12
+ exports.getInvoicingTransactionListView = (0, toolkit_1.createSelector)((state) => state.invoicingTransactionState, (state) => state.invoicingTransactionListViewState, (transactionState, listViewState) => {
13
+ const activeTabState = listViewState.byTab[listViewState.activeTab];
14
+ return {
15
+ activeTab: listViewState.activeTab,
16
+ columns: invoicingTransactionListViewState_1.INVOICING_TRANSACTION_COLUMNS,
17
+ transactions: (0, invoicingTransactionSelector_1.getInvoicingTransactionsByIds)(transactionState, activeTabState.ids),
18
+ filters: listViewState.filters,
19
+ nextCursor: activeTabState.nextCursor,
20
+ fetchState: activeTabState.fetchState,
21
+ error: activeTabState.error,
22
+ tabIds: invoicingTransactionListViewState_1.INVOICING_TRANSACTION_TABS,
23
+ sort: listViewState.sort,
24
+ version: 1.0,
25
+ };
26
+ });
@@ -1,10 +1,9 @@
1
- import { FetchedState, ID } from '../../../commonStateTypes/common';
1
+ import { FetchStateAndError, ID } from '../../../commonStateTypes/common';
2
2
  import { InvoicingListSort } from '../invoicingApiHelper';
3
3
  export interface InvoicingTransactionFilters {
4
4
  customerId?: ID;
5
5
  search?: string;
6
6
  status?: string;
7
- type?: string;
8
7
  }
9
8
  export declare const ALL_INVOICING_TRANSACTION_SORT_KEYS: readonly ["transaction", "customer", "method", "date", "type", "gateway", "status", "amount"];
10
9
  export declare const toInvoicingTransactionSortKey: (v: string) => "date" | "amount" | "status" | "type" | "transaction" | "customer" | "gateway" | "method";
@@ -31,10 +30,25 @@ export type InvoicingTransactionTabId = ReturnType<typeof toInvoicingTransaction
31
30
  * display order.
32
31
  */
33
32
  export declare const INVOICING_TRANSACTION_TABS: InvoicingTransactionTabId[];
34
- export interface InvoicingTransactionListViewState extends FetchedState {
35
- filters: InvoicingTransactionFilters;
33
+ /**
34
+ * Per-tab cache slice. Each `type` tab is a separate server query (the backend
35
+ * filters by `type`), so its loaded ids, pagination cursor and fetch state are
36
+ * cached independently. Mirrors the `userListByType` per-key cache pattern.
37
+ */
38
+ export interface InvoicingTransactionTabState extends FetchStateAndError {
36
39
  ids: ID[];
37
40
  nextCursor: string | null;
41
+ }
42
+ export type InvoicingTransactionIdsByTab = Record<InvoicingTransactionTabId, InvoicingTransactionTabState>;
43
+ export interface InvoicingTransactionListViewState {
44
+ /** Selected type tab (CES-owned so it persists across page revisits). */
45
+ activeTab: InvoicingTransactionTabId;
46
+ /** Per-tab cached ids + cursor + fetch state. */
47
+ byTab: InvoicingTransactionIdsByTab;
48
+ /** Base query shared across tabs (search / customer / status). */
49
+ filters: InvoicingTransactionFilters;
38
50
  /** Active server-side sort (undefined = backend default order). */
39
51
  sort?: InvoicingListSort;
40
52
  }
53
+ export declare const makeInvoicingTransactionTabState: () => InvoicingTransactionTabState;
54
+ export declare const makeInvoicingTransactionIdsByTab: () => InvoicingTransactionIdsByTab;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.INVOICING_TRANSACTION_TABS = exports.toInvoicingTransactionTabId = exports.ALL_INVOICING_TRANSACTION_TAB_IDS = exports.INVOICING_TRANSACTION_COLUMNS = exports.toInvoicingTransactionSortKey = exports.ALL_INVOICING_TRANSACTION_SORT_KEYS = void 0;
3
+ exports.makeInvoicingTransactionIdsByTab = exports.makeInvoicingTransactionTabState = exports.INVOICING_TRANSACTION_TABS = exports.toInvoicingTransactionTabId = exports.ALL_INVOICING_TRANSACTION_TAB_IDS = exports.INVOICING_TRANSACTION_COLUMNS = exports.toInvoicingTransactionSortKey = exports.ALL_INVOICING_TRANSACTION_SORT_KEYS = void 0;
4
4
  const stringToUnion_1 = require("../../../commonStateTypes/stringToUnion");
5
5
  exports.ALL_INVOICING_TRANSACTION_SORT_KEYS = [
6
6
  'transaction',
@@ -42,3 +42,15 @@ exports.toInvoicingTransactionTabId = toInvoicingTransactionTabId;
42
42
  exports.INVOICING_TRANSACTION_TABS = [
43
43
  ...exports.ALL_INVOICING_TRANSACTION_TAB_IDS,
44
44
  ];
45
+ const makeInvoicingTransactionTabState = () => ({
46
+ ids: [],
47
+ nextCursor: null,
48
+ fetchState: 'Not-Started',
49
+ error: undefined,
50
+ });
51
+ exports.makeInvoicingTransactionTabState = makeInvoicingTransactionTabState;
52
+ const makeInvoicingTransactionIdsByTab = () => exports.ALL_INVOICING_TRANSACTION_TAB_IDS.reduce((acc, tabId) => {
53
+ acc[tabId] = (0, exports.makeInvoicingTransactionTabState)();
54
+ return acc;
55
+ }, {});
56
+ exports.makeInvoicingTransactionIdsByTab = makeInvoicingTransactionIdsByTab;
@@ -2,8 +2,8 @@ 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 { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, saveNotificationPreferences, saveNotificationPreferencesFailure, saveNotificationPreferencesSuccess } from '../notificationPreferencesViewReducer';
6
- export type ActionType = ReturnType<typeof clearAllNotificationPreferencesView> | ReturnType<typeof clearNotificationPreferencesLocalOverrides> | ReturnType<typeof saveNotificationPreferences> | ReturnType<typeof saveNotificationPreferencesFailure> | ReturnType<typeof saveNotificationPreferencesSuccess> | ReturnType<typeof openSnackbar>;
5
+ import { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, saveNotificationPreferences, saveNotificationPreferencesFailure, saveNotificationPreferencesSuccess, setGroupFrequency, toggleEventChannel } from '../notificationPreferencesViewReducer';
6
+ export type ActionType = ReturnType<typeof clearAllNotificationPreferencesView> | ReturnType<typeof clearNotificationPreferencesLocalOverrides> | ReturnType<typeof saveNotificationPreferences> | ReturnType<typeof saveNotificationPreferencesFailure> | ReturnType<typeof saveNotificationPreferencesSuccess> | ReturnType<typeof setGroupFrequency> | ReturnType<typeof toggleEventChannel> | ReturnType<typeof openSnackbar>;
7
7
  export declare const saveNotificationPreferencesEpic: (actions$: ActionsObservable<ActionType>, state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => import("rxjs").Observable<{
8
8
  payload: undefined;
9
9
  type: "notificationPreferencesView/clearAllNotificationPreferencesView";
@@ -31,4 +31,10 @@ export declare const saveNotificationPreferencesEpic: (actions$: ActionsObservab
31
31
  } | {
32
32
  payload: import("../notificationPreferencesViewReducer").SaveNotificationPreferencesSuccessPayload;
33
33
  type: "notificationPreferencesView/saveNotificationPreferencesSuccess";
34
+ } | {
35
+ payload: import("../notificationPreferencesViewReducer").SetFrequencyPayload;
36
+ type: "notificationPreferencesView/setGroupFrequency";
37
+ } | {
38
+ payload: import("../notificationPreferencesViewReducer").TogglePreferencePayload;
39
+ type: "notificationPreferencesView/toggleEventChannel";
34
40
  }>;