@zeniai/client-epic-state 5.1.68 → 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 (93) hide show
  1. package/lib/esm/index.js +7 -7
  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/spendManagement/billPay/billDetailView/billDetailViewSelector.js +8 -2
  30. package/lib/esm/view/spendManagement/helpers.js +12 -0
  31. package/lib/esm/view/spendManagement/reimbursement/editRemiView/epics/fetchEditRemiDetailPageEpic.js +0 -12
  32. package/lib/esm/view/spendManagement/reimbursement/remiDetailView/remiDetailViewSelector.js +4 -2
  33. package/lib/index.d.ts +7 -7
  34. package/lib/index.js +15 -8
  35. package/lib/view/invoicing/couponView/couponViewEpics.js +0 -3
  36. package/lib/view/invoicing/couponView/couponViewReducer.d.ts +1 -1
  37. package/lib/view/invoicing/couponView/couponViewReducer.js +8 -2
  38. package/lib/view/invoicing/couponView/couponViewSelector.d.ts +1 -0
  39. package/lib/view/invoicing/couponView/couponViewSelector.js +27 -14
  40. package/lib/view/invoicing/couponView/couponViewState.d.ts +2 -1
  41. package/lib/view/invoicing/invoiceList/fetchInvoiceListEpic.d.ts +1 -1
  42. package/lib/view/invoicing/invoiceList/fetchInvoiceListEpic.js +7 -5
  43. package/lib/view/invoicing/invoiceList/fetchInvoiceListPageEpic.js +2 -1
  44. package/lib/view/invoicing/invoiceList/invoiceListReducer.d.ts +5 -4
  45. package/lib/view/invoicing/invoiceList/invoiceListReducer.js +63 -37
  46. package/lib/view/invoicing/invoiceList/invoiceListSelector.d.ts +1 -0
  47. package/lib/view/invoicing/invoiceList/invoiceListSelector.js +19 -15
  48. package/lib/view/invoicing/invoiceList/invoiceListState.d.ts +21 -7
  49. package/lib/view/invoicing/invoiceList/invoiceListState.js +13 -1
  50. package/lib/view/invoicing/invoicingCreditNoteListView/epics/fetchInvoicingCreditNoteListEpic.js +0 -3
  51. package/lib/view/invoicing/invoicingCreditNoteListView/invoicingCreditNoteListViewReducer.d.ts +1 -1
  52. package/lib/view/invoicing/invoicingCreditNoteListView/invoicingCreditNoteListViewReducer.js +8 -2
  53. package/lib/view/invoicing/invoicingCreditNoteListView/invoicingCreditNoteListViewSelector.d.ts +1 -0
  54. package/lib/view/invoicing/invoicingCreditNoteListView/invoicingCreditNoteListViewSelector.js +23 -13
  55. package/lib/view/invoicing/invoicingCreditNoteListView/invoicingCreditNoteListViewState.d.ts +2 -1
  56. package/lib/view/invoicing/invoicingCustomerDetailView/fetchInvoicingCustomerDetailPageEpic.js +3 -2
  57. package/lib/view/invoicing/invoicingCustomerDetailView/invoicingCustomerDetailViewSelector.js +1 -1
  58. package/lib/view/invoicing/invoicingCustomerListView/epics/fetchInvoicingCustomerListEpic.js +0 -3
  59. package/lib/view/invoicing/invoicingCustomerListView/invoicingCustomerListViewReducer.d.ts +1 -1
  60. package/lib/view/invoicing/invoicingCustomerListView/invoicingCustomerListViewReducer.js +8 -2
  61. package/lib/view/invoicing/invoicingCustomerListView/invoicingCustomerListViewSelector.d.ts +1 -0
  62. package/lib/view/invoicing/invoicingCustomerListView/invoicingCustomerListViewSelector.js +25 -12
  63. package/lib/view/invoicing/invoicingCustomerListView/invoicingCustomerListViewState.d.ts +2 -1
  64. package/lib/view/invoicing/invoicingDunningCaseListView/epics/fetchInvoicingDunningCaseListEpic.js +0 -3
  65. package/lib/view/invoicing/invoicingDunningCaseListView/invoicingDunningCaseListViewReducer.d.ts +1 -1
  66. package/lib/view/invoicing/invoicingDunningCaseListView/invoicingDunningCaseListViewReducer.js +8 -2
  67. package/lib/view/invoicing/invoicingDunningCaseListView/invoicingDunningCaseListViewSelector.d.ts +1 -0
  68. package/lib/view/invoicing/invoicingDunningCaseListView/invoicingDunningCaseListViewSelector.js +23 -13
  69. package/lib/view/invoicing/invoicingDunningCaseListView/invoicingDunningCaseListViewState.d.ts +2 -1
  70. package/lib/view/invoicing/invoicingSubscriptionListView/epics/fetchInvoicingSubscriptionListEpic.js +0 -3
  71. package/lib/view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewReducer.d.ts +1 -1
  72. package/lib/view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewReducer.js +8 -2
  73. package/lib/view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewSelector.d.ts +1 -0
  74. package/lib/view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewSelector.js +22 -12
  75. package/lib/view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewState.d.ts +3 -1
  76. package/lib/view/invoicing/invoicingTransactionListView/epics/fetchInvoicingTransactionListEpic.d.ts +1 -1
  77. package/lib/view/invoicing/invoicingTransactionListView/epics/fetchInvoicingTransactionListEpic.js +7 -5
  78. package/lib/view/invoicing/invoicingTransactionListView/epics/fetchInvoicingTransactionListPageEpic.js +2 -1
  79. package/lib/view/invoicing/invoicingTransactionListView/invoicingTransactionListViewReducer.d.ts +1 -1
  80. package/lib/view/invoicing/invoicingTransactionListView/invoicingTransactionListViewReducer.js +57 -26
  81. package/lib/view/invoicing/invoicingTransactionListView/invoicingTransactionListViewSelector.d.ts +1 -0
  82. package/lib/view/invoicing/invoicingTransactionListView/invoicingTransactionListViewSelector.js +15 -11
  83. package/lib/view/invoicing/invoicingTransactionListView/invoicingTransactionListViewState.d.ts +18 -4
  84. package/lib/view/invoicing/invoicingTransactionListView/invoicingTransactionListViewState.js +13 -1
  85. package/lib/view/spendManagement/billPay/billDetailView/billDetailViewSelector.d.ts +1 -0
  86. package/lib/view/spendManagement/billPay/billDetailView/billDetailViewSelector.js +7 -1
  87. package/lib/view/spendManagement/helpers.d.ts +1 -0
  88. package/lib/view/spendManagement/helpers.js +14 -1
  89. package/lib/view/spendManagement/reimbursement/editRemiView/epics/fetchEditRemiDetailPageEpic.d.ts +1 -2
  90. package/lib/view/spendManagement/reimbursement/editRemiView/epics/fetchEditRemiDetailPageEpic.js +0 -12
  91. package/lib/view/spendManagement/reimbursement/remiDetailView/remiDetailViewSelector.d.ts +1 -0
  92. package/lib/view/spendManagement/reimbursement/remiDetailView/remiDetailViewSelector.js +3 -1
  93. package/package.json +1 -1
@@ -2,6 +2,7 @@ import { createSlice } from '@reduxjs/toolkit';
2
2
  export const initialState = {
3
3
  fetchState: 'Not-Started',
4
4
  error: undefined,
5
+ activeTab: 'all',
5
6
  ids: [],
6
7
  nextCursor: null,
7
8
  filters: {},
@@ -80,10 +81,15 @@ const invoicingDunningCaseListView = createSlice({
80
81
  updateInvoicingDunningCaseFilters(draft, action) {
81
82
  draft.filters = action.payload;
82
83
  },
84
+ // Select a status tab. The list API ignores `status` (returns all statuses),
85
+ // so the selector filters rows to this tab client-side — no refetch needed.
86
+ setInvoicingDunningCaseActiveTab(draft, action) {
87
+ draft.activeTab = action.payload;
88
+ },
83
89
  clearInvoicingDunningCaseListView(draft) {
84
90
  Object.assign(draft, initialState);
85
91
  },
86
92
  },
87
93
  });
88
- export const { fetchInvoicingDunningCaseList, fetchInvoicingDunningCaseListPage, updateInvoicingDunningCaseList, updateInvoicingDunningCaseListFailure, fetchInvoicingDunningCaseCounts, updateInvoicingDunningCaseCounts, updateInvoicingDunningCaseCountsFailure, updateInvoicingDunningCaseFilters, clearInvoicingDunningCaseListView, } = invoicingDunningCaseListView.actions;
94
+ export const { fetchInvoicingDunningCaseList, fetchInvoicingDunningCaseListPage, updateInvoicingDunningCaseList, updateInvoicingDunningCaseListFailure, fetchInvoicingDunningCaseCounts, updateInvoicingDunningCaseCounts, updateInvoicingDunningCaseCountsFailure, updateInvoicingDunningCaseFilters, setInvoicingDunningCaseActiveTab, clearInvoicingDunningCaseListView, } = invoicingDunningCaseListView.actions;
89
95
  export default invoicingDunningCaseListView.reducer;
@@ -6,16 +6,26 @@ import { INVOICING_DUNNING_CASE_COLUMNS, INVOICING_DUNNING_CASE_TABS, } from './
6
6
  * object) keep referential identity until the dunning-case entity slice or the
7
7
  * list-view slice actually change.
8
8
  */
9
- export const getInvoicingDunningCaseListView = createSelector((state) => state.invoicingDunningCaseState, (state) => state.invoicingDunningCaseListViewState, (dunningCaseState, listViewState) => ({
10
- columns: INVOICING_DUNNING_CASE_COLUMNS,
11
- dunningCases: getInvoicingDunningCasesByIds(dunningCaseState, listViewState.ids),
12
- count: listViewState.counts,
13
- countsFetchState: listViewState.countsFetchState,
14
- filters: listViewState.filters,
15
- nextCursor: listViewState.nextCursor,
16
- fetchState: listViewState.fetchState,
17
- error: listViewState.error,
18
- tabIds: INVOICING_DUNNING_CASE_TABS,
19
- sort: listViewState.sort,
20
- version: 1.0,
21
- }));
9
+ export const getInvoicingDunningCaseListView = createSelector((state) => state.invoicingDunningCaseState, (state) => state.invoicingDunningCaseListViewState, (dunningCaseState, listViewState) => {
10
+ const { activeTab } = listViewState;
11
+ const allDunningCases = getInvoicingDunningCasesByIds(dunningCaseState, listViewState.ids);
12
+ // The list API ignores `status`, so it returns every status; filter to the
13
+ // active tab client-side ('all' shows everything).
14
+ const dunningCases = activeTab === 'all'
15
+ ? allDunningCases
16
+ : allDunningCases.filter((dunningCase) => dunningCase.status === activeTab);
17
+ return {
18
+ activeTab,
19
+ columns: INVOICING_DUNNING_CASE_COLUMNS,
20
+ dunningCases,
21
+ count: listViewState.counts,
22
+ countsFetchState: listViewState.countsFetchState,
23
+ filters: listViewState.filters,
24
+ nextCursor: listViewState.nextCursor,
25
+ fetchState: listViewState.fetchState,
26
+ error: listViewState.error,
27
+ tabIds: INVOICING_DUNNING_CASE_TABS,
28
+ sort: listViewState.sort,
29
+ version: 1.0,
30
+ };
31
+ });
@@ -8,9 +8,6 @@ import { INVOICING_LIST_PAGE_SIZE, applyListSortParams, withQuery, } from '../..
8
8
  import { fetchInvoicingSubscriptionList, updateInvoicingSubscriptionList, updateInvoicingSubscriptionListFailure, } from '../invoicingSubscriptionListViewReducer';
9
9
  const buildQuery = (filters, cursor, sort) => {
10
10
  const params = new URLSearchParams();
11
- if (filters.status != null && filters.status.length > 0) {
12
- params.set('status', filters.status);
13
- }
14
11
  if (filters.customerId != null) {
15
12
  params.set('customer_id', filters.customerId);
16
13
  }
@@ -2,6 +2,7 @@ import { createSlice } from '@reduxjs/toolkit';
2
2
  export const initialState = {
3
3
  fetchState: 'Not-Started',
4
4
  error: undefined,
5
+ activeTab: 'all',
5
6
  ids: [],
6
7
  nextCursor: null,
7
8
  filters: {},
@@ -80,6 +81,11 @@ const invoicingSubscriptionListView = createSlice({
80
81
  updateInvoicingSubscriptionFilters(draft, action) {
81
82
  draft.filters = action.payload;
82
83
  },
84
+ // Select a status tab. The list API ignores `status` (returns all statuses),
85
+ // so the selector filters rows to this tab client-side — no refetch needed.
86
+ setInvoicingSubscriptionActiveTab(draft, action) {
87
+ draft.activeTab = action.payload;
88
+ },
83
89
  // Reflect a newly created subscription in the cached list + tab counts so the
84
90
  // subscription page shows it without refetching from the server. The status
85
91
  // doubles as the per-tab count key (tab ids mirror InvoicingSubscriptionStatus).
@@ -99,5 +105,5 @@ const invoicingSubscriptionListView = createSlice({
99
105
  },
100
106
  },
101
107
  });
102
- export const { fetchInvoicingSubscriptionList, fetchInvoicingSubscriptionListPage, updateInvoicingSubscriptionList, updateInvoicingSubscriptionListFailure, fetchInvoicingSubscriptionCounts, updateInvoicingSubscriptionCounts, updateInvoicingSubscriptionCountsFailure, updateInvoicingSubscriptionFilters, addInvoicingSubscriptionToList, clearInvoicingSubscriptionListView, } = invoicingSubscriptionListView.actions;
108
+ export const { fetchInvoicingSubscriptionList, fetchInvoicingSubscriptionListPage, updateInvoicingSubscriptionList, updateInvoicingSubscriptionListFailure, fetchInvoicingSubscriptionCounts, updateInvoicingSubscriptionCounts, updateInvoicingSubscriptionCountsFailure, updateInvoicingSubscriptionFilters, setInvoicingSubscriptionActiveTab, addInvoicingSubscriptionToList, clearInvoicingSubscriptionListView, } = invoicingSubscriptionListView.actions;
103
109
  export default invoicingSubscriptionListView.reducer;
@@ -8,15 +8,25 @@ import { INVOICING_SUBSCRIPTION_COLUMNS, INVOICING_SUBSCRIPTION_TABS, } from './
8
8
  * re-rendered on every unrelated redux action because a fresh array was built
9
9
  * each call.
10
10
  */
11
- export const getInvoicingSubscriptionListView = createSelector((state) => state.invoicingSubscriptionState, (state) => state.invoicingSubscriptionListViewState, (subscriptionState, listViewState) => ({
12
- columns: INVOICING_SUBSCRIPTION_COLUMNS,
13
- subscriptions: getInvoicingSubscriptionsByIds(subscriptionState, listViewState.ids),
14
- fetchState: listViewState.fetchState,
15
- error: listViewState.error,
16
- nextCursor: listViewState.nextCursor,
17
- filters: listViewState.filters,
18
- count: listViewState.counts,
19
- countsFetchState: listViewState.countsFetchState,
20
- tabIds: INVOICING_SUBSCRIPTION_TABS,
21
- sort: listViewState.sort,
22
- }));
11
+ export const getInvoicingSubscriptionListView = createSelector((state) => state.invoicingSubscriptionState, (state) => state.invoicingSubscriptionListViewState, (subscriptionState, listViewState) => {
12
+ const { activeTab } = listViewState;
13
+ const allSubscriptions = getInvoicingSubscriptionsByIds(subscriptionState, listViewState.ids);
14
+ // The list API ignores `status`, so it returns every status; filter to the
15
+ // active tab client-side ('all' shows everything).
16
+ const subscriptions = activeTab === 'all'
17
+ ? allSubscriptions
18
+ : allSubscriptions.filter((subscription) => subscription.status === activeTab);
19
+ return {
20
+ activeTab,
21
+ columns: INVOICING_SUBSCRIPTION_COLUMNS,
22
+ subscriptions,
23
+ fetchState: listViewState.fetchState,
24
+ error: listViewState.error,
25
+ nextCursor: listViewState.nextCursor,
26
+ filters: listViewState.filters,
27
+ count: listViewState.counts,
28
+ countsFetchState: listViewState.countsFetchState,
29
+ tabIds: INVOICING_SUBSCRIPTION_TABS,
30
+ sort: listViewState.sort,
31
+ };
32
+ });
@@ -4,13 +4,13 @@ import { updateInvoicingTransactions } from '../../../../entity/invoicing/invoic
4
4
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
5
5
  import { INVOICING_LIST_PAGE_SIZE, applyListSortParams, withQuery, } from '../../invoicingApiHelper';
6
6
  import { fetchInvoicingTransactionList, updateInvoicingTransactionList, updateInvoicingTransactionListFailure, } from '../invoicingTransactionListViewReducer';
7
- const buildQuery = (filters, cursor, sort) => {
7
+ const buildQuery = (filters, type, cursor, sort) => {
8
8
  const params = new URLSearchParams();
9
9
  if (filters.status != null && filters.status.length > 0) {
10
10
  params.set('status', filters.status);
11
11
  }
12
- if (filters.type != null && filters.type.length > 0) {
13
- params.set('type', filters.type);
12
+ if (type != null && type.length > 0) {
13
+ params.set('type', type);
14
14
  }
15
15
  if (filters.customerId != null) {
16
16
  params.set('customer_id', filters.customerId);
@@ -25,9 +25,11 @@ const buildQuery = (filters, cursor, sort) => {
25
25
  applyListSortParams(params, sort);
26
26
  return params;
27
27
  };
28
- export const fetchInvoicingTransactionListEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(fetchInvoicingTransactionList.match), switchMap((action) => {
28
+ export const fetchInvoicingTransactionListEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(fetchInvoicingTransactionList.match), switchMap((action) => {
29
29
  const { filters, cursor, keepExistingListItems, sort } = action.payload;
30
- const apiUrl = withQuery(`${zeniAPI.apiEndPoints.invoicingMicroServiceBaseUrl}/1.0/payments`, buildQuery(filters, cursor, sort));
30
+ const { activeTab } = state$.value.invoicingTransactionListViewState;
31
+ const type = activeTab !== 'all' ? activeTab : undefined;
32
+ const apiUrl = withQuery(`${zeniAPI.apiEndPoints.invoicingMicroServiceBaseUrl}/1.0/payments`, buildQuery(filters, type, cursor, sort));
31
33
  return zeniAPI.getJSON(apiUrl).pipe(switchMap((response) => {
32
34
  if (isSuccessResponse(response)) {
33
35
  const items = response.data?.items ?? [];
@@ -16,8 +16,9 @@ const shouldFetch = (fetchStateAndError, cacheOverride) => cacheOverride ||
16
16
  export const fetchInvoicingTransactionListPageEpic = (actions$, state$) => actions$.pipe(filter(fetchInvoicingTransactionListPage.match), mergeMap((action) => {
17
17
  const { cacheOverride, filters, sort } = action.payload;
18
18
  const state = state$.value.invoicingTransactionListViewState;
19
+ const activeTabState = state.byTab[state.activeTab];
19
20
  const pageActions = [];
20
- if (shouldFetch({ fetchState: state.fetchState, error: state.error }, cacheOverride)) {
21
+ if (shouldFetch({ fetchState: activeTabState.fetchState, error: activeTabState.error }, cacheOverride)) {
21
22
  pageActions.push(fetchInvoicingTransactionList({ filters, sort }));
22
23
  }
23
24
  return concat(from(pageActions));
@@ -1,13 +1,19 @@
1
1
  import { createSlice } from '@reduxjs/toolkit';
2
+ import { makeInvoicingTransactionIdsByTab, } from './invoicingTransactionListViewState';
3
+ /**
4
+ * Whether two transaction-list queries share the same base (tab-independent)
5
+ * query. When the base query changes (search / customer / status / sort) every
6
+ * per-tab cache is stale, so the reducer resets them all.
7
+ */
8
+ const sameTransactionBaseQuery = (a, b) => a.filters.customerId === b.filters.customerId &&
9
+ a.filters.status === b.filters.status &&
10
+ a.filters.search === b.filters.search &&
11
+ a.sort?.field === b.sort?.field &&
12
+ a.sort?.dir === b.sort?.dir;
2
13
  export const initialState = {
3
- fetchState: 'Not-Started',
4
- error: undefined,
5
- ids: [],
6
- nextCursor: null,
14
+ activeTab: 'all',
15
+ byTab: makeInvoicingTransactionIdsByTab(),
7
16
  filters: {},
8
- hasValidState() {
9
- return this.fetchState === 'Completed';
10
- },
11
17
  };
12
18
  const invoicingTransactionListView = createSlice({
13
19
  name: 'invoicingTransactionListView',
@@ -15,14 +21,15 @@ const invoicingTransactionListView = createSlice({
15
21
  reducers: {
16
22
  fetchInvoicingTransactionList: {
17
23
  reducer(draft, action) {
24
+ const tab = draft.byTab[draft.activeTab];
18
25
  if (!action.payload.keepExistingListItems) {
19
- draft.ids = [];
20
- draft.nextCursor = null;
26
+ tab.ids = [];
27
+ tab.nextCursor = null;
21
28
  }
22
29
  draft.filters = action.payload.filters;
23
30
  draft.sort = action.payload.sort;
24
- draft.fetchState = 'In-Progress';
25
- draft.error = undefined;
31
+ tab.fetchState = 'In-Progress';
32
+ tab.error = undefined;
26
33
  },
27
34
  prepare(payload) {
28
35
  return {
@@ -37,6 +44,12 @@ const invoicingTransactionListView = createSlice({
37
44
  },
38
45
  fetchInvoicingTransactionListPage: {
39
46
  reducer(draft, action) {
47
+ // A different base query invalidates every tab's cache — reset so the
48
+ // page epic's shouldFetch refetches the active tab instead of showing
49
+ // rows fetched under a stale search/customer/status/sort.
50
+ if (!sameTransactionBaseQuery(draft, action.payload)) {
51
+ draft.byTab = makeInvoicingTransactionIdsByTab();
52
+ }
40
53
  draft.filters = action.payload.filters;
41
54
  draft.sort = action.payload.sort;
42
55
  },
@@ -51,34 +64,52 @@ const invoicingTransactionListView = createSlice({
51
64
  },
52
65
  },
53
66
  updateInvoicingTransactionList(draft, action) {
54
- draft.ids = action.payload.keepExistingListItems
55
- ? [...new Set([...draft.ids, ...action.payload.ids])]
67
+ const tab = draft.byTab[draft.activeTab];
68
+ tab.ids = action.payload.keepExistingListItems
69
+ ? [...new Set([...tab.ids, ...action.payload.ids])]
56
70
  : action.payload.ids;
57
- draft.nextCursor = action.payload.nextCursor;
58
- draft.fetchState = 'Completed';
59
- draft.error = undefined;
71
+ tab.nextCursor = action.payload.nextCursor;
72
+ tab.fetchState = 'Completed';
73
+ tab.error = undefined;
60
74
  },
61
75
  updateInvoicingTransactionListFailure(draft, action) {
62
- draft.fetchState = 'Error';
63
- draft.error = action.payload;
76
+ const tab = draft.byTab[draft.activeTab];
77
+ tab.fetchState = 'Error';
78
+ tab.error = action.payload;
64
79
  },
65
80
  updateInvoicingTransactionFilters(draft, action) {
66
81
  draft.filters = action.payload;
67
82
  },
83
+ // Select a type tab. The view dispatches the follow-up
84
+ // fetchInvoicingTransactionListPage so the page epic fetches the tab when
85
+ // its cache is empty and reuses it when already loaded.
86
+ setInvoicingTransactionActiveTab(draft, action) {
87
+ draft.activeTab = action.payload;
88
+ },
68
89
  // Reflect a newly recorded payment's transaction in the cached list so the
69
- // payments page shows it without refetching. The list view has no counts
70
- // slice, so we only prepend the id (dedup/no-op if already present).
90
+ // payments page shows it without refetching. The payload carries no type,
91
+ // so prepend to the 'all' tab and the tab currently in view (dedup/no-op if
92
+ // already present); other tabs refetch fresh on their next visit.
71
93
  addInvoicingTransactionToList(draft, action) {
72
94
  const id = action.payload;
73
- if (draft.ids.includes(id)) {
74
- return;
95
+ const prependTo = (tabId) => {
96
+ const tab = draft.byTab[tabId];
97
+ if (!tab.ids.includes(id)) {
98
+ tab.ids = [id, ...tab.ids];
99
+ }
100
+ };
101
+ prependTo('all');
102
+ if (draft.activeTab !== 'all') {
103
+ prependTo(draft.activeTab);
75
104
  }
76
- draft.ids = [id, ...draft.ids];
77
105
  },
78
106
  clearInvoicingTransactionListView(draft) {
79
- Object.assign(draft, initialState);
107
+ draft.activeTab = 'all';
108
+ draft.byTab = makeInvoicingTransactionIdsByTab();
109
+ draft.filters = {};
110
+ draft.sort = undefined;
80
111
  },
81
112
  },
82
113
  });
83
- export const { fetchInvoicingTransactionList, fetchInvoicingTransactionListPage, updateInvoicingTransactionList, updateInvoicingTransactionListFailure, updateInvoicingTransactionFilters, addInvoicingTransactionToList, clearInvoicingTransactionListView, } = invoicingTransactionListView.actions;
114
+ export const { fetchInvoicingTransactionList, fetchInvoicingTransactionListPage, updateInvoicingTransactionList, updateInvoicingTransactionListFailure, updateInvoicingTransactionFilters, setInvoicingTransactionActiveTab, addInvoicingTransactionToList, clearInvoicingTransactionListView, } = invoicingTransactionListView.actions;
84
115
  export default invoicingTransactionListView.reducer;
@@ -6,14 +6,18 @@ import { INVOICING_TRANSACTION_COLUMNS, INVOICING_TRANSACTION_TABS, } from './in
6
6
  * object) keep referential identity until the transaction entity slice or the
7
7
  * list-view slice actually change.
8
8
  */
9
- export const getInvoicingTransactionListView = createSelector((state) => state.invoicingTransactionState, (state) => state.invoicingTransactionListViewState, (transactionState, listViewState) => ({
10
- columns: INVOICING_TRANSACTION_COLUMNS,
11
- transactions: getInvoicingTransactionsByIds(transactionState, listViewState.ids),
12
- filters: listViewState.filters,
13
- nextCursor: listViewState.nextCursor,
14
- fetchState: listViewState.fetchState,
15
- error: listViewState.error,
16
- tabIds: INVOICING_TRANSACTION_TABS,
17
- sort: listViewState.sort,
18
- version: 1.0,
19
- }));
9
+ export const getInvoicingTransactionListView = createSelector((state) => state.invoicingTransactionState, (state) => state.invoicingTransactionListViewState, (transactionState, listViewState) => {
10
+ const activeTabState = listViewState.byTab[listViewState.activeTab];
11
+ return {
12
+ activeTab: listViewState.activeTab,
13
+ columns: INVOICING_TRANSACTION_COLUMNS,
14
+ transactions: getInvoicingTransactionsByIds(transactionState, activeTabState.ids),
15
+ filters: listViewState.filters,
16
+ nextCursor: activeTabState.nextCursor,
17
+ fetchState: activeTabState.fetchState,
18
+ error: activeTabState.error,
19
+ tabIds: INVOICING_TRANSACTION_TABS,
20
+ sort: listViewState.sort,
21
+ version: 1.0,
22
+ };
23
+ });
@@ -37,3 +37,13 @@ export const toInvoicingTransactionTabId = (v) => stringToUnion(v, ALL_INVOICING
37
37
  export const INVOICING_TRANSACTION_TABS = [
38
38
  ...ALL_INVOICING_TRANSACTION_TAB_IDS,
39
39
  ];
40
+ export const makeInvoicingTransactionTabState = () => ({
41
+ ids: [],
42
+ nextCursor: null,
43
+ fetchState: 'Not-Started',
44
+ error: undefined,
45
+ });
46
+ export const makeInvoicingTransactionIdsByTab = () => ALL_INVOICING_TRANSACTION_TAB_IDS.reduce((acc, tabId) => {
47
+ acc[tabId] = makeInvoicingTransactionTabState();
48
+ return acc;
49
+ }, {});
@@ -13,7 +13,7 @@ import { getUserByUserId } from '../../../../entity/user/userSelector';
13
13
  import { getUserRoleByUserId } from '../../../../entity/userRole/userRoleSelector';
14
14
  import { getActivityHistory, } from '../../commonHistoryView/commonHistorySelector';
15
15
  import { getAllFundingAccounts, } from '../../commonSetup/setupViewSelector';
16
- import { getLatestApprovalDate, isAwaitingMarkAsPaid, isSodAdminFallbackEligibleForStep, isSodExcludedViewerBlocked, } from '../../helpers';
16
+ import { getLatestApprovalDate, isAwaitingMarkAsPaid, isSodAdminFallbackEligibleForStep, isSodExcludedViewerBlocked, shouldShowSodAdminLabel, } from '../../helpers';
17
17
  import { getActivityRealTimeApproval, } from '../../realTimeApprovalView/realTimeApprovalSelector';
18
18
  import { getEntityRealTimeApprovalDetailKey } from '../../realTimeApprovalView/realTimeApprovalState';
19
19
  import { getBillPaymentSubConfigCodeKey, getInternationalSubConfigCodeKey, getInternationalWireMethodCodeKey, } from '../billPayConfig/billPayConfigPayload';
@@ -22,7 +22,12 @@ import { getBillPayConfigMethodKey, toBillPaymentSubConfigCodeKeyType, } from '.
22
22
  import { getPreviousBills, } from '../previousBills/previousBillsSelector';
23
23
  import { getBillTransactionDetailKey, initialBillDetailView, } from './billDetailViewState';
24
24
  export const getBillActivities = (state, billId, billStageCode) => {
25
- const { billDetailViewState, approvalRuleState, entityApprovalStatusState, userState, } = state;
25
+ const { billDetailViewState, approvalRuleState, entityApprovalStatusState, userState, billTransactionState, } = state;
26
+ // Note: createdBy is undefined until billTransactionState is populated.
27
+ // getBillActivities is called from getBillDetailView which runs after the
28
+ // bill entity epic completes — this assumption must hold for showSodAdminLabel
29
+ // to render on first paint.
30
+ const createdBy = billTransactionState.transactionById[billId]?.createdBy;
26
31
  const key = getBillTransactionDetailKey(billId);
27
32
  const billDetail = recordGet(billDetailViewState.billDetailById, key, undefined);
28
33
  let billActivities = [];
@@ -85,6 +90,7 @@ export const getBillActivities = (state, billId, billStageCode) => {
85
90
  actorsActivity,
86
91
  isOriginalApprovalStep: step.isOriginalApprovalStep,
87
92
  displayPendingApproverAsAdmin: isSodAdminFallbackEligibleForStep(sodExcludedApproverUserId, isAdminFallbackApprover, actorsActivity),
93
+ showSodAdminLabel: shouldShowSodAdminLabel(sodExcludedApproverUserId, actorsActivity, createdBy),
88
94
  };
89
95
  }),
90
96
  };
@@ -19,6 +19,18 @@ export const isSodAdminFallbackEligibleForStep = (sodExcludedApproverUserId, isA
19
19
  return (pendingResolvedApprovers.length > 0 &&
20
20
  pendingResolvedApprovers.every((activity) => getUserActorId(activity) === sodExcludedApproverUserId));
21
21
  };
22
+ const isSodExcludedUserSolePendingApproverOnStep = (sodExcludedApproverUserId, stepActorsActivity = []) => {
23
+ if (sodExcludedApproverUserId == null) {
24
+ return false;
25
+ }
26
+ const pendingResolvedApprovers = stepActorsActivity.filter((activity) => activity.activity === 'pending' && getUserActorId(activity) != null);
27
+ return (pendingResolvedApprovers.length > 0 &&
28
+ pendingResolvedApprovers.every((activity) => getUserActorId(activity) === sodExcludedApproverUserId));
29
+ };
30
+ export const shouldShowSodAdminLabel = (sodExcludedApproverUserId, stepActorsActivity = [], entitySubjectUserId) => sodExcludedApproverUserId != null &&
31
+ entitySubjectUserId != null &&
32
+ sodExcludedApproverUserId === entitySubjectUserId &&
33
+ isSodExcludedUserSolePendingApproverOnStep(sodExcludedApproverUserId, stepActorsActivity);
22
34
  export const getLatestApprovalDate = (allActivities) => {
23
35
  let allStepsWithStatus = [];
24
36
  let allApprovedActions = [];
@@ -6,7 +6,6 @@ import { fetchUserFinancialAccount } from '../../../../userFinancialAccount/user
6
6
  import { getLatestCreatedUserBankAccount } from '../../../../userFinancialAccount/userFinancialAccountSelector';
7
7
  import { fetchMerchantList } from '../../../merchantList/merchantListReducer';
8
8
  import { fetchReimbursementConfig } from '../../reimbursementConfig/reimbursementConfigReducer';
9
- import { fetchRemiSetupApproverView } from '../../remiSetupApproverView/remiSetupApproverViewReducer';
10
9
  import { fetchEditRemiDetailPage, fetchRemiAndInitializeLocalStore, updatesPaymentToInLocalStore, } from '../editRemiViewReducer';
11
10
  export const fetchEditRemiDetailPageEpic = (actions$, state$) => actions$.pipe(filter(fetchEditRemiDetailPage.match), mergeMap((action) => {
12
11
  const { cacheOverride, isLimitedCategoryEnabled, reimbursementId, isShowDeletedReimbursementEnabled, } = action.payload;
@@ -59,17 +58,6 @@ export const fetchEditRemiDetailPageEpic = (actions$, state$) => actions$.pipe(f
59
58
  if (reimbursementId != null) {
60
59
  remiDetailActions.push(fetchRemiAndInitializeLocalStore(reimbursementId, false, isShowDeletedReimbursementEnabled));
61
60
  }
62
- else {
63
- const approvalRules = state.remiSetupApproverViewState;
64
- if (approvalRules.fetchState !== 'Completed' &&
65
- approvalRules.fetchState !== 'In-Progress') {
66
- // Side-fetch from the edit-reim page bootstrap. The
67
- // triggering action doesn't carry the V3 flag, so we
68
- // explicitly target v1; v3 tenants re-fetch via their
69
- // own screen connector.
70
- remiDetailActions.push(fetchRemiSetupApproverView(true, false, false, false));
71
- }
72
- }
73
61
  }
74
62
  return concat(from(remiDetailActions));
75
63
  }));
@@ -7,7 +7,7 @@ import { getEntityApprovalStatusByIds } from '../../../../entity/entityApprovalS
7
7
  import { getUserByUserId } from '../../../../entity/user/userSelector';
8
8
  import { getUserRoleByUserId } from '../../../../entity/userRole/userRoleSelector';
9
9
  import { getActivityHistory, } from '../../commonHistoryView/commonHistorySelector';
10
- import { getLatestApprovalDate, isSodAdminFallbackEligibleForStep, isSodExcludedViewerBlocked, } from '../../helpers';
10
+ import { getLatestApprovalDate, isSodAdminFallbackEligibleForStep, isSodExcludedViewerBlocked, shouldShowSodAdminLabel, } from '../../helpers';
11
11
  import { getActivityRealTimeApproval, } from '../../realTimeApprovalView/realTimeApprovalSelector';
12
12
  import { getReimbursementConfigByKey } from '../reimbursementConfig/reimbursementConfigSelector';
13
13
  import { REIMBURSEMENT_PAYMENT_NUMBER_OF_DAYS } from '../reimbursementConfig/reimbursementConfigState';
@@ -110,7 +110,8 @@ export const getRemiDetailView = (state, reimbursementId) => {
110
110
  };
111
111
  };
112
112
  export const getRemiActivities = (state, reimbursementId, billStageCode) => {
113
- const { remiDetailViewState, approvalRuleState, entityApprovalStatusState, userState, } = state;
113
+ const { remiDetailViewState, approvalRuleState, entityApprovalStatusState, userState, reimbursementState, } = state;
114
+ const reimburseeUserId = reimbursementState.reimbursementById[reimbursementId]?.reimburseeUserId;
114
115
  const remiTransactionDetails = recordGet(remiDetailViewState.remiDetailById, reimbursementId, undefined);
115
116
  let remiActivities = [];
116
117
  if (remiTransactionDetails != null) {
@@ -172,6 +173,7 @@ export const getRemiActivities = (state, reimbursementId, billStageCode) => {
172
173
  actorsActivity,
173
174
  isOriginalApprovalStep: step.isOriginalApprovalStep,
174
175
  displayPendingApproverAsAdmin: isSodAdminFallbackEligibleForStep(sodExcludedApproverUserId, isAdminFallbackApprover, actorsActivity),
176
+ showSodAdminLabel: shouldShowSodAdminLabel(sodExcludedApproverUserId, actorsActivity, reimburseeUserId),
175
177
  };
176
178
  }),
177
179
  };
package/lib/index.d.ts CHANGED
@@ -1014,7 +1014,7 @@ export type { InvoicingDataImportStatusRow, FetchInvoicingMigrationDiagnosticsPa
1014
1014
  export type { StripeConnectCredentials } from './view/invoicing/settingsView/settingsViewPayload';
1015
1015
  export { clearAllInvoices, removeInvoice, updateInvoices, } from './entity/invoicing/invoice/invoiceReducer';
1016
1016
  export { getInvoiceById, getInvoicesByIds, } from './entity/invoicing/invoice/invoiceSelector';
1017
- export { clearInvoiceList, fetchInvoiceCounts, fetchInvoiceKPIs, fetchInvoiceList, fetchInvoiceListPage, updateInvoiceListFilters, } from './view/invoicing/invoiceList/invoiceListReducer';
1017
+ export { clearInvoiceList, fetchInvoiceCounts, fetchInvoiceKPIs, fetchInvoiceList, fetchInvoiceListPage, setInvoiceActiveTab, updateInvoiceListFilters, } from './view/invoicing/invoiceList/invoiceListReducer';
1018
1018
  export { ALL_INVOICING_INVOICE_TAB_IDS, INVOICING_INVOICE_TABS, } from './view/invoicing/invoiceList/invoiceListState';
1019
1019
  export type { InvoiceListFilters, InvoiceListState, InvoicingInvoiceTabId, } from './view/invoicing/invoiceList/invoiceListState';
1020
1020
  export { getInvoiceListView } from './view/invoicing/invoiceList/invoiceListSelector';
@@ -1116,7 +1116,7 @@ export { getInvoicingDataImportActionState } from './view/invoicing/dataImportAc
1116
1116
  export { INVOICING_LIST_PAGE_SIZE } from './view/invoicing/invoicingApiHelper';
1117
1117
  export type { InvoicingListSort } from './view/invoicing/invoicingApiHelper';
1118
1118
  export { clearAllInvoicingCustomers, removeInvoicingCustomer, updateInvoicingCustomers, } from './entity/invoicing/invoicingCustomer/invoicingCustomerReducer';
1119
- export { clearInvoicingCustomerListView, fetchInvoicingCustomerCounts, fetchInvoicingCustomerList, fetchInvoicingCustomerListPage, updateInvoicingCustomerFilters, } from './view/invoicing/invoicingCustomerListView/invoicingCustomerListViewReducer';
1119
+ export { clearInvoicingCustomerListView, fetchInvoicingCustomerCounts, fetchInvoicingCustomerList, fetchInvoicingCustomerListPage, setInvoicingCustomerActiveTab, updateInvoicingCustomerFilters, } from './view/invoicing/invoicingCustomerListView/invoicingCustomerListViewReducer';
1120
1120
  export { ALL_INVOICING_CUSTOMER_SORT_KEYS, ALL_INVOICING_CUSTOMER_TAB_IDS, INVOICING_CUSTOMER_COLUMNS, INVOICING_CUSTOMER_TABS, } from './view/invoicing/invoicingCustomerListView/invoicingCustomerListViewState';
1121
1121
  export type { InvoicingCustomerColumnConfig, InvoicingCustomerFilters, InvoicingCustomerSortKey, InvoicingCustomerTabId, } from './view/invoicing/invoicingCustomerListView/invoicingCustomerListViewState';
1122
1122
  export { getInvoicingCustomerListView } from './view/invoicing/invoicingCustomerListView/invoicingCustomerListViewSelector';
@@ -1130,7 +1130,7 @@ export { getInvoicingPaymentLinkSendState, getInvoicingPaymentMethodSaveState, g
1130
1130
  export { submitAddPromotionalCredits, resetPromotionalCreditAction, } from './view/invoicing/promotionalCreditAction/promotionalCreditActionReducer';
1131
1131
  export type { PromotionalCreditActionState } from './view/invoicing/promotionalCreditAction/promotionalCreditActionState';
1132
1132
  export { clearAllInvoicingSubscriptions, removeInvoicingSubscription, updateInvoicingSubscriptions, } from './entity/invoicing/invoicingSubscription/invoicingSubscriptionReducer';
1133
- export { clearInvoicingSubscriptionListView, fetchInvoicingSubscriptionCounts, fetchInvoicingSubscriptionList, fetchInvoicingSubscriptionListPage, updateInvoicingSubscriptionFilters, } from './view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewReducer';
1133
+ export { clearInvoicingSubscriptionListView, fetchInvoicingSubscriptionCounts, fetchInvoicingSubscriptionList, fetchInvoicingSubscriptionListPage, setInvoicingSubscriptionActiveTab, updateInvoicingSubscriptionFilters, } from './view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewReducer';
1134
1134
  export { ALL_INVOICING_SUBSCRIPTION_SORT_KEYS, ALL_INVOICING_SUBSCRIPTION_TAB_IDS, INVOICING_SUBSCRIPTION_COLUMNS, INVOICING_SUBSCRIPTION_TABS, } from './view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewState';
1135
1135
  export type { InvoicingSubscriptionColumnConfig, InvoicingSubscriptionFilters, InvoicingSubscriptionSortKey, InvoicingSubscriptionTabId, } from './view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewState';
1136
1136
  export { getInvoicingSubscriptionListView } from './view/invoicing/invoicingSubscriptionListView/invoicingSubscriptionListViewSelector';
@@ -1139,7 +1139,7 @@ export { clearInvoicingSubscriptionDetailView, fetchInvoicingSubscriptionDetail,
1139
1139
  export { getInvoicingSubscriptionById, getInvoicingSubscriptionDetail, } from './view/invoicing/invoicingSubscriptionDetailView/invoicingSubscriptionDetailViewSelector';
1140
1140
  export type { InvoicingSubscriptionDetailView } from './view/invoicing/invoicingSubscriptionDetailView/invoicingSubscriptionDetailViewSelector';
1141
1141
  export { clearAllInvoicingTransactions, removeInvoicingTransaction, updateInvoicingTransactions, } from './entity/invoicing/invoicingTransaction/invoicingTransactionReducer';
1142
- export { clearInvoicingTransactionListView, fetchInvoicingTransactionList, fetchInvoicingTransactionListPage, updateInvoicingTransactionFilters, } from './view/invoicing/invoicingTransactionListView/invoicingTransactionListViewReducer';
1142
+ export { clearInvoicingTransactionListView, fetchInvoicingTransactionList, fetchInvoicingTransactionListPage, setInvoicingTransactionActiveTab, updateInvoicingTransactionFilters, } from './view/invoicing/invoicingTransactionListView/invoicingTransactionListViewReducer';
1143
1143
  export { ALL_INVOICING_TRANSACTION_SORT_KEYS, ALL_INVOICING_TRANSACTION_TAB_IDS, INVOICING_TRANSACTION_COLUMNS, INVOICING_TRANSACTION_TABS, } from './view/invoicing/invoicingTransactionListView/invoicingTransactionListViewState';
1144
1144
  export type { InvoicingTransactionColumnConfig, InvoicingTransactionFilters, InvoicingTransactionSortKey, InvoicingTransactionTabId, } from './view/invoicing/invoicingTransactionListView/invoicingTransactionListViewState';
1145
1145
  export { getInvoicingTransactionListView } from './view/invoicing/invoicingTransactionListView/invoicingTransactionListViewSelector';
@@ -1148,7 +1148,7 @@ export { clearInvoicingTransactionDetailView, fetchInvoicingTransactionDetail, }
1148
1148
  export { getInvoicingTransactionById, getInvoicingTransactionDetail, } from './view/invoicing/invoicingTransactionDetailView/invoicingTransactionDetailViewSelector';
1149
1149
  export type { InvoicingTransactionDetailView } from './view/invoicing/invoicingTransactionDetailView/invoicingTransactionDetailViewSelector';
1150
1150
  export { clearAllInvoicingCreditNotes, removeInvoicingCreditNote, updateInvoicingCreditNotes, } from './entity/invoicing/creditNote/creditNoteReducer';
1151
- export { clearInvoicingCreditNoteListView, fetchInvoicingCreditNoteCounts, fetchInvoicingCreditNoteList, fetchInvoicingCreditNoteListPage, updateInvoicingCreditNoteFilters, } from './view/invoicing/invoicingCreditNoteListView/invoicingCreditNoteListViewReducer';
1151
+ export { clearInvoicingCreditNoteListView, fetchInvoicingCreditNoteCounts, fetchInvoicingCreditNoteList, fetchInvoicingCreditNoteListPage, setInvoicingCreditNoteActiveTab, updateInvoicingCreditNoteFilters, } from './view/invoicing/invoicingCreditNoteListView/invoicingCreditNoteListViewReducer';
1152
1152
  export { ALL_INVOICING_CREDIT_NOTE_SORT_KEYS, ALL_INVOICING_CREDIT_NOTE_TAB_IDS, INVOICING_CREDIT_NOTE_COLUMNS, INVOICING_CREDIT_NOTE_TABS, } from './view/invoicing/invoicingCreditNoteListView/invoicingCreditNoteListViewState';
1153
1153
  export type { InvoicingCreditNoteColumnConfig, InvoicingCreditNoteFilters, InvoicingCreditNoteSortKey, InvoicingCreditNoteTabId, } from './view/invoicing/invoicingCreditNoteListView/invoicingCreditNoteListViewState';
1154
1154
  export { getInvoicingCreditNoteListView } from './view/invoicing/invoicingCreditNoteListView/invoicingCreditNoteListViewSelector';
@@ -1157,7 +1157,7 @@ export { clearInvoicingCreditNoteDetailView, fetchInvoicingCreditNoteDetail, } f
1157
1157
  export { getInvoicingCreditNoteById, getInvoicingCreditNoteDetail, } from './view/invoicing/invoicingCreditNoteDetailView/invoicingCreditNoteDetailViewSelector';
1158
1158
  export type { InvoicingCreditNoteDetailView } from './view/invoicing/invoicingCreditNoteDetailView/invoicingCreditNoteDetailViewSelector';
1159
1159
  export { clearAllInvoicingCoupons, removeInvoicingCoupon, updateInvoicingCoupons, } from './entity/invoicing/coupon/couponReducer';
1160
- export { clearInvoicingCouponView, fetchInvoicingCouponCounts, fetchInvoicingCouponList, fetchInvoicingCouponListPage, updateInvoicingCouponFilters, } from './view/invoicing/couponView/couponViewReducer';
1160
+ export { clearInvoicingCouponView, fetchInvoicingCouponCounts, fetchInvoicingCouponList, fetchInvoicingCouponListPage, setInvoicingCouponActiveTab, updateInvoicingCouponFilters, } from './view/invoicing/couponView/couponViewReducer';
1161
1161
  export { ALL_INVOICING_COUPON_SORT_KEYS, ALL_INVOICING_COUPON_TAB_IDS, INVOICING_COUPON_COLUMNS, INVOICING_COUPON_TABS, } from './view/invoicing/couponView/couponViewState';
1162
1162
  export type { InvoicingCouponColumnConfig, InvoicingCouponFilters, InvoicingCouponSortKey, InvoicingCouponTabId, } from './view/invoicing/couponView/couponViewState';
1163
1163
  export { getInvoicingCouponCounts, getInvoicingCouponListFetchState, getInvoicingCouponListFilters, getInvoicingCouponListHasMore, getInvoicingCouponListItems, getInvoicingCouponListNextCursor, getInvoicingCouponListView, } from './view/invoicing/couponView/couponViewSelector';
@@ -1167,7 +1167,7 @@ export { clearInvoicingCouponDetailView, fetchInvoicingCouponDetail, } from './v
1167
1167
  export { getInvoicingCouponDetail } from './view/invoicing/invoicingCouponDetailView/invoicingCouponDetailViewSelector';
1168
1168
  export type { InvoicingCouponDetailView } from './view/invoicing/invoicingCouponDetailView/invoicingCouponDetailViewSelector';
1169
1169
  export { clearAllInvoicingDunningCases, removeInvoicingDunningCase, updateInvoicingDunningCases, } from './entity/invoicing/dunningCase/dunningCaseReducer';
1170
- export { clearInvoicingDunningCaseListView, fetchInvoicingDunningCaseCounts, fetchInvoicingDunningCaseList, fetchInvoicingDunningCaseListPage, updateInvoicingDunningCaseFilters, } from './view/invoicing/invoicingDunningCaseListView/invoicingDunningCaseListViewReducer';
1170
+ export { clearInvoicingDunningCaseListView, fetchInvoicingDunningCaseCounts, fetchInvoicingDunningCaseList, fetchInvoicingDunningCaseListPage, setInvoicingDunningCaseActiveTab, updateInvoicingDunningCaseFilters, } from './view/invoicing/invoicingDunningCaseListView/invoicingDunningCaseListViewReducer';
1171
1171
  export { ALL_INVOICING_DUNNING_CASE_SORT_KEYS, ALL_INVOICING_DUNNING_CASE_TAB_IDS, INVOICING_DUNNING_CASE_COLUMNS, INVOICING_DUNNING_CASE_TABS, } from './view/invoicing/invoicingDunningCaseListView/invoicingDunningCaseListViewState';
1172
1172
  export type { InvoicingDunningCaseColumnConfig, InvoicingDunningCaseFilters, InvoicingDunningCaseSortKey, InvoicingDunningCaseTabId, } from './view/invoicing/invoicingDunningCaseListView/invoicingDunningCaseListViewState';
1173
1173
  export { getInvoicingDunningCaseListView } from './view/invoicing/invoicingDunningCaseListView/invoicingDunningCaseListViewSelector';