@zeniai/client-epic-state 5.1.61 → 5.1.62-betaRD2
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.
- package/lib/coreEpics.js +3 -2
- package/lib/entity/chargeCard/chargeCard.d.ts +1 -1
- package/lib/entity/jeSchedules/jeSchedulesPayload.d.ts +2 -0
- package/lib/entity/jeSchedules/jeSchedulesPayload.js +2 -0
- package/lib/entity/jeSchedules/jeSchedulesSelector.d.ts +4 -0
- package/lib/entity/jeSchedules/jeSchedulesSelector.js +11 -1
- package/lib/entity/jeSchedules/jeSchedulesState.d.ts +2 -0
- package/lib/entity/notificationRegistry/notificationRegistryPayload.d.ts +18 -0
- package/lib/entity/notificationRegistry/notificationRegistryPayload.js +28 -0
- package/lib/entity/notificationRegistry/notificationRegistryReducer.d.ts +10 -0
- package/lib/entity/notificationRegistry/notificationRegistryReducer.js +50 -0
- package/lib/entity/notificationRegistry/notificationRegistrySelector.d.ts +2 -0
- package/lib/entity/notificationRegistry/notificationRegistrySelector.js +10 -0
- package/lib/entity/notificationRegistry/notificationRegistryState.d.ts +32 -0
- package/lib/entity/notificationRegistry/notificationRegistryState.js +10 -0
- package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
- package/lib/entity/snackbar/snackbarTypes.js +3 -0
- package/lib/entity/tenant/clearAllEpic.d.ts +3 -1
- package/lib/entity/tenant/clearAllEpic.js +4 -0
- package/lib/entity/tenant/tenantReducer.d.ts +4 -1
- package/lib/entity/tenant/tenantReducer.js +8 -2
- package/lib/entity/tenant/tenantSelector.d.ts +1 -0
- package/lib/entity/tenant/tenantSelector.js +4 -0
- package/lib/entity/transaction/scheduleTransactionHelper.d.ts +15 -0
- package/lib/entity/transaction/scheduleTransactionHelper.js +43 -0
- package/lib/epic.d.ts +9 -1
- package/lib/epic.js +9 -1
- package/lib/esm/coreEpics.js +3 -2
- package/lib/esm/entity/jeSchedules/jeSchedulesPayload.js +2 -0
- package/lib/esm/entity/jeSchedules/jeSchedulesSelector.js +11 -1
- package/lib/esm/entity/notificationRegistry/notificationRegistryPayload.js +24 -0
- package/lib/esm/entity/notificationRegistry/notificationRegistryReducer.js +46 -0
- package/lib/esm/entity/notificationRegistry/notificationRegistrySelector.js +6 -0
- package/lib/esm/entity/notificationRegistry/notificationRegistryState.js +5 -0
- package/lib/esm/entity/snackbar/snackbarTypes.js +3 -0
- package/lib/esm/entity/tenant/clearAllEpic.js +4 -0
- package/lib/esm/entity/tenant/tenantReducer.js +7 -1
- package/lib/esm/entity/tenant/tenantSelector.js +3 -0
- package/lib/esm/entity/transaction/scheduleTransactionHelper.js +39 -0
- package/lib/esm/epic.js +9 -1
- package/lib/esm/index.js +14 -6
- package/lib/esm/reducer.js +6 -0
- package/lib/esm/view/companyView/companyViewReducer.js +68 -1
- package/lib/esm/view/companyView/epic/companyPassport/dismissCapitalizationOnboardingEpic.js +2 -1
- package/lib/esm/view/companyView/epic/companyPassport/projects/disableAccountingProjectsEpic.js +56 -0
- package/lib/esm/view/companyView/epic/companyPassport/projects/enableAccountingProjectsEpic.js +37 -0
- package/lib/esm/view/companyView/epic/companyPassport/projects/resumeEnableAccountingProjectsEpic.js +73 -0
- package/lib/esm/view/companyView/epic/companyPassport/updateAccountingClassesEnabledEpic.js +2 -1
- package/lib/esm/view/companyView/epic/companyPassport/updateCapitalizationAccountThresholdEpic.js +2 -1
- package/lib/esm/view/companyView/types/companyPassport/companyPassportViewState.js +5 -0
- package/lib/esm/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.js +15 -2
- package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/initializeNewScheduleEpic.js +21 -0
- package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/saveNewScheduleEpic.js +110 -0
- package/lib/esm/view/expenseAutomationView/epics/jeSchedule/newSchedule/searchTransactionsForNewScheduleEpic.js +44 -0
- package/lib/esm/view/expenseAutomationView/epics/jeSchedule/switchJESchedulesTabEpic.js +22 -0
- package/lib/esm/view/expenseAutomationView/helpers/newScheduleLocalDataHelper.js +152 -0
- package/lib/esm/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +126 -6
- package/lib/esm/view/expenseAutomationView/selectorTypes/jeNewScheduleViewSelectorTypes.js +1 -0
- package/lib/esm/view/expenseAutomationView/selectors/jeNewScheduleViewSelector.js +71 -0
- package/lib/esm/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +78 -11
- package/lib/esm/view/expenseAutomationView/types/jeSchedulesViewState.js +3 -6
- package/lib/esm/view/notificationPreferencesView/epics/saveNotificationPreferencesEpic.js +116 -0
- package/lib/esm/view/notificationPreferencesView/notificationPreferencesEndpoint.js +5 -0
- package/lib/esm/view/notificationPreferencesView/notificationPreferencesViewPayload.js +36 -0
- package/lib/esm/view/notificationPreferencesView/notificationPreferencesViewReducer.js +222 -0
- package/lib/esm/view/notificationPreferencesView/notificationPreferencesViewSelector.js +25 -0
- package/lib/esm/view/notificationPreferencesView/notificationPreferencesViewState.js +4 -0
- package/lib/esm/view/settingsView/epic/fetchNotificationSettingsEpic.js +34 -2
- package/lib/esm/view/settingsView/epic/saveNotificationSettingsEpic.js +2 -1
- package/lib/esm/view/settingsView/settingsViewHelpers.js +3 -2
- package/lib/index.d.ts +17 -8
- package/lib/index.js +85 -47
- package/lib/reducer.d.ts +6 -0
- package/lib/reducer.js +6 -0
- package/lib/view/common/recurringViewHelper.d.ts +2 -2
- package/lib/view/companyView/companyViewReducer.d.ts +9 -1
- package/lib/view/companyView/companyViewReducer.js +70 -3
- package/lib/view/companyView/epic/companyPassport/dismissCapitalizationOnboardingEpic.js +2 -1
- package/lib/view/companyView/epic/companyPassport/projects/disableAccountingProjectsEpic.d.ts +10 -0
- package/lib/view/companyView/epic/companyPassport/projects/disableAccountingProjectsEpic.js +60 -0
- package/lib/view/companyView/epic/companyPassport/projects/enableAccountingProjectsEpic.d.ts +11 -0
- package/lib/view/companyView/epic/companyPassport/projects/enableAccountingProjectsEpic.js +41 -0
- package/lib/view/companyView/epic/companyPassport/projects/resumeEnableAccountingProjectsEpic.d.ts +13 -0
- package/lib/view/companyView/epic/companyPassport/projects/resumeEnableAccountingProjectsEpic.js +77 -0
- package/lib/view/companyView/epic/companyPassport/updateAccountingClassesEnabledEpic.js +2 -1
- package/lib/view/companyView/epic/companyPassport/updateCapitalizationAccountThresholdEpic.js +2 -1
- package/lib/view/companyView/types/companyPassport/companyPassportViewState.d.ts +2 -0
- package/lib/view/companyView/types/companyPassport/companyPassportViewState.js +5 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/fetchJeSchedulesEpic.js +14 -1
- package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/initializeNewScheduleEpic.d.ts +8 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/initializeNewScheduleEpic.js +25 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/saveNewScheduleEpic.d.ts +45 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/saveNewScheduleEpic.js +114 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/searchTransactionsForNewScheduleEpic.d.ts +8 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/newSchedule/searchTransactionsForNewScheduleEpic.js +48 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/switchJESchedulesTabEpic.d.ts +6 -0
- package/lib/view/expenseAutomationView/epics/jeSchedule/switchJESchedulesTabEpic.js +26 -0
- package/lib/view/expenseAutomationView/helpers/newScheduleLocalDataHelper.d.ts +43 -0
- package/lib/view/expenseAutomationView/helpers/newScheduleLocalDataHelper.js +158 -0
- package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
- package/lib/view/expenseAutomationView/payload/jeSchedulesPayload.d.ts +1 -0
- package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.d.ts +36 -8
- package/lib/view/expenseAutomationView/reducers/jeSchedulesViewReducer.js +128 -7
- package/lib/view/expenseAutomationView/selectorTypes/jeNewScheduleViewSelectorTypes.d.ts +25 -0
- package/lib/view/expenseAutomationView/selectorTypes/jeNewScheduleViewSelectorTypes.js +2 -0
- package/lib/view/expenseAutomationView/selectorTypes/jeSchedulesSelectorTypes.d.ts +29 -4
- package/lib/view/expenseAutomationView/selectors/jeNewScheduleViewSelector.d.ts +10 -0
- package/lib/view/expenseAutomationView/selectors/jeNewScheduleViewSelector.js +76 -0
- package/lib/view/expenseAutomationView/selectors/jeSchedulesViewSelector.d.ts +1 -0
- package/lib/view/expenseAutomationView/selectors/jeSchedulesViewSelector.js +80 -11
- package/lib/view/expenseAutomationView/types/jeSchedulesViewState.d.ts +53 -6
- package/lib/view/expenseAutomationView/types/jeSchedulesViewState.js +5 -8
- package/lib/view/notificationPreferencesView/epics/saveNotificationPreferencesEpic.d.ts +40 -0
- package/lib/view/notificationPreferencesView/epics/saveNotificationPreferencesEpic.js +120 -0
- package/lib/view/notificationPreferencesView/notificationPreferencesEndpoint.d.ts +2 -0
- package/lib/view/notificationPreferencesView/notificationPreferencesEndpoint.js +9 -0
- package/lib/view/notificationPreferencesView/notificationPreferencesViewPayload.d.ts +7 -0
- package/lib/view/notificationPreferencesView/notificationPreferencesViewPayload.js +41 -0
- package/lib/view/notificationPreferencesView/notificationPreferencesViewReducer.d.ts +30 -0
- package/lib/view/notificationPreferencesView/notificationPreferencesViewReducer.js +226 -0
- package/lib/view/notificationPreferencesView/notificationPreferencesViewSelector.d.ts +7 -0
- package/lib/view/notificationPreferencesView/notificationPreferencesViewSelector.js +32 -0
- package/lib/view/notificationPreferencesView/notificationPreferencesViewState.d.ts +14 -0
- package/lib/view/notificationPreferencesView/notificationPreferencesViewState.js +8 -0
- package/lib/view/settingsView/epic/fetchNotificationSettingsEpic.d.ts +9 -1
- package/lib/view/settingsView/epic/fetchNotificationSettingsEpic.js +34 -2
- package/lib/view/settingsView/epic/saveNotificationSettingsEpic.js +2 -1
- package/lib/view/settingsView/settingsViewHelpers.d.ts +1 -1
- package/lib/view/settingsView/settingsViewHelpers.js +3 -2
- package/lib/view/settingsView/settingsViewPayload.d.ts +4 -0
- package/lib/view/settingsView/settingsViewState.d.ts +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { createSlice } from '@reduxjs/toolkit';
|
|
2
|
+
import { mapPayloadToPreferences, } from './notificationPreferencesViewPayload';
|
|
3
|
+
import { emptyNotificationPreferences, } from './notificationPreferencesViewState';
|
|
4
|
+
export const initialState = {
|
|
5
|
+
cancelEpoch: 0,
|
|
6
|
+
localOverrides: emptyNotificationPreferences(),
|
|
7
|
+
preferences: emptyNotificationPreferences(),
|
|
8
|
+
saveEpoch: 0,
|
|
9
|
+
savePreferencesState: { fetchState: 'Not-Started' },
|
|
10
|
+
};
|
|
11
|
+
const mergePreferences = (base, patch) => {
|
|
12
|
+
const eventEnabledByChannel = {
|
|
13
|
+
...base.eventEnabledByChannel,
|
|
14
|
+
};
|
|
15
|
+
Object.entries(patch.eventEnabledByChannel).forEach(([eventId, channels]) => {
|
|
16
|
+
eventEnabledByChannel[eventId] = {
|
|
17
|
+
...(base.eventEnabledByChannel[eventId] ?? {}),
|
|
18
|
+
...channels,
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
return {
|
|
22
|
+
eventEnabledByChannel,
|
|
23
|
+
groupFrequencyByGroupId: {
|
|
24
|
+
...base.groupFrequencyByGroupId,
|
|
25
|
+
...patch.groupFrequencyByGroupId,
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
// Remove only the (eventId, channel) and groupId keys that were actually saved
|
|
30
|
+
// to the server from `localOverrides` — AND whose current value still equals
|
|
31
|
+
// what was saved. Any new edits the user added while the PUT was in flight
|
|
32
|
+
// (either new keys not present in `saved`, OR same keys the user flipped back
|
|
33
|
+
// to a different value) are preserved so the next debounce cycle picks them up.
|
|
34
|
+
//
|
|
35
|
+
// Presence-only subtraction (the prior implementation) silently dropped a
|
|
36
|
+
// same-key re-edit that landed AFTER debounce fired but BEFORE the response
|
|
37
|
+
// returned. Concrete case:
|
|
38
|
+
// 1. toggle evt1.email = false → localOverrides = {evt1:{email:false}}
|
|
39
|
+
// 2. debounce PUT #1 fires with savedOverrides = {evt1:{email:false}}
|
|
40
|
+
// 3. user re-toggles evt1.email = true → localOverrides = {evt1:{email:true}}
|
|
41
|
+
// 4. PUT #1 success → subtract dropped `email` on presence, so the true
|
|
42
|
+
// re-edit disappeared and next-debounce found nothing to send.
|
|
43
|
+
const subtractSavedOverrides = (current, saved) => {
|
|
44
|
+
const eventEnabledByChannel = {};
|
|
45
|
+
Object.entries(current.eventEnabledByChannel).forEach(([eventId, channels]) => {
|
|
46
|
+
const savedChannels = saved.eventEnabledByChannel[eventId];
|
|
47
|
+
if (savedChannels == null) {
|
|
48
|
+
eventEnabledByChannel[eventId] = channels;
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const remainingChannels = {};
|
|
52
|
+
Object.keys(channels).forEach((channel) => {
|
|
53
|
+
// Preserve the key when it's a new channel OR when the user's
|
|
54
|
+
// current value differs from what was saved (same-key re-edit).
|
|
55
|
+
if (!(channel in savedChannels) ||
|
|
56
|
+
channels[channel] !== savedChannels[channel]) {
|
|
57
|
+
remainingChannels[channel] = channels[channel];
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
if (Object.keys(remainingChannels).length > 0) {
|
|
61
|
+
eventEnabledByChannel[eventId] = remainingChannels;
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
const groupFrequencyByGroupId = {};
|
|
65
|
+
Object.entries(current.groupFrequencyByGroupId).forEach(([groupId, frequency]) => {
|
|
66
|
+
if (saved.groupFrequencyByGroupId[groupId] !== frequency) {
|
|
67
|
+
groupFrequencyByGroupId[groupId] = frequency;
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
return { eventEnabledByChannel, groupFrequencyByGroupId };
|
|
71
|
+
};
|
|
72
|
+
const notificationPreferencesView = createSlice({
|
|
73
|
+
name: 'notificationPreferencesView',
|
|
74
|
+
initialState,
|
|
75
|
+
reducers: {
|
|
76
|
+
clearAllNotificationPreferencesView(draft) {
|
|
77
|
+
// Reset everything EXCEPT `cancelEpoch`, which must stay monotonic
|
|
78
|
+
// across the lifetime of the app instance. `initialState.cancelEpoch`
|
|
79
|
+
// is `0`; returning `initialState` verbatim would rewind the counter
|
|
80
|
+
// to zero, and any in-flight save whose `cancelEpochAtDispatch` was
|
|
81
|
+
// captured pre-clearAll (>0) would then satisfy the "captured >=
|
|
82
|
+
// current" epoch guard and merge stale edits into fresh preferences.
|
|
83
|
+
// Bumping instead of resetting also invalidates the abandoned save
|
|
84
|
+
// for free — Cursor Bugbot bc7876f1 followup.
|
|
85
|
+
const nextCancelEpoch = draft.cancelEpoch + 1;
|
|
86
|
+
// saveEpoch must also stay monotonic across clearAll for the same
|
|
87
|
+
// reason (Cursor Bugbot 3632510237). Rewinding to 0 would let a
|
|
88
|
+
// stale-in-flight GET whose `saveEpochAtDispatch` was captured >0
|
|
89
|
+
// satisfy the "captured >= current" epoch guard and clobber fresh
|
|
90
|
+
// preferences on any subsequent save.
|
|
91
|
+
const nextSaveEpoch = draft.saveEpoch + 1;
|
|
92
|
+
return {
|
|
93
|
+
...initialState,
|
|
94
|
+
cancelEpoch: nextCancelEpoch,
|
|
95
|
+
saveEpoch: nextSaveEpoch,
|
|
96
|
+
};
|
|
97
|
+
},
|
|
98
|
+
clearNotificationPreferencesLocalOverrides(draft) {
|
|
99
|
+
// Discards in-flight per-event/per-group edits held in `localOverrides`
|
|
100
|
+
// without touching the fetched `preferences` snapshot. Used by the
|
|
101
|
+
// settings-page Cancel affordance so the effective preferences revert
|
|
102
|
+
// to the last server-known state without triggering a refetch race.
|
|
103
|
+
//
|
|
104
|
+
// Cancel/in-flight-save race: every Cancel bumps `cancelEpoch`
|
|
105
|
+
// monotonically. Any save that captured a lower epoch value at
|
|
106
|
+
// dispatch time is treated as stale by the Success/Failure reducer
|
|
107
|
+
// — its merge is skipped. Unconditional bump (vs the earlier
|
|
108
|
+
// counter model) survives switchMap abandonment and double-Cancel
|
|
109
|
+
// (Cursor Bugbot 4aa021f7): even if the abandoned save's
|
|
110
|
+
// Success/Failure never dispatches, subsequent legitimate saves
|
|
111
|
+
// still work because their captured epoch matches the current one.
|
|
112
|
+
draft.cancelEpoch += 1;
|
|
113
|
+
draft.localOverrides = emptyNotificationPreferences();
|
|
114
|
+
// Also drop `savePreferencesState` back to Not-Started so any
|
|
115
|
+
// "Saving…" affordance bound to `getNotificationPreferencesSaveState`
|
|
116
|
+
// clears on Cancel. Without this, a Cancel-during-save whose stale
|
|
117
|
+
// Success/Failure never fires (switchMap abandonment) leaves the
|
|
118
|
+
// selector reporting In-Progress forever — Cursor Bugbot bc7876f1.
|
|
119
|
+
draft.savePreferencesState = { fetchState: 'Not-Started' };
|
|
120
|
+
},
|
|
121
|
+
fetchNotificationPreferencesSuccess(draft, action) {
|
|
122
|
+
// Piggybacks on the settings-envelope fetch. The GET response is a full
|
|
123
|
+
// snapshot of the server-known preferences (empty maps included), so
|
|
124
|
+
// REPLACE `preferences` rather than merging — merging would leak keys
|
|
125
|
+
// the server has since removed. DO NOT touch `localOverrides`: a refetch
|
|
126
|
+
// that fires while the user has in-flight edits (pre-debounce) must not
|
|
127
|
+
// silently drop them; the save-success path is the only clearer.
|
|
128
|
+
// A `null`/`undefined` payload isn't a snapshot at all (e.g. the
|
|
129
|
+
// envelope key was omitted); no-op instead of wiping preferences.
|
|
130
|
+
if (action.payload.preferences == null) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
// Stale-GET guard (Cursor Bugbot 3632510237): if the fetch epic
|
|
134
|
+
// captured a `saveEpoch` lower than the current one, a save has
|
|
135
|
+
// succeeded since this GET dispatched — the response is carrying
|
|
136
|
+
// the pre-PUT snapshot and would clobber the just-saved server
|
|
137
|
+
// truth back to the pre-edit state until the next refetch. Skip
|
|
138
|
+
// the replace; the store already reflects the fresher save.
|
|
139
|
+
if (action.payload.saveEpochAtDispatch < draft.saveEpoch) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
draft.preferences = mapPayloadToPreferences(action.payload.preferences);
|
|
143
|
+
},
|
|
144
|
+
saveNotificationPreferences(draft) {
|
|
145
|
+
draft.savePreferencesState = { fetchState: 'In-Progress' };
|
|
146
|
+
},
|
|
147
|
+
saveNotificationPreferencesFailure(draft, action) {
|
|
148
|
+
// Stale failure from a cancelled-since save — swallow silently so
|
|
149
|
+
// the UI doesn't surface an error banner for a save the user
|
|
150
|
+
// already abandoned.
|
|
151
|
+
if (action.payload.cancelEpochAtDispatch < draft.cancelEpoch) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
// Preserve `localOverrides` so the user's in-flight edits survive a
|
|
155
|
+
// transient network blip. UI should surface an error affordance and
|
|
156
|
+
// allow retry.
|
|
157
|
+
draft.savePreferencesState = {
|
|
158
|
+
fetchState: 'Error',
|
|
159
|
+
error: action.payload.error,
|
|
160
|
+
};
|
|
161
|
+
},
|
|
162
|
+
saveNotificationPreferencesSuccess(draft, action) {
|
|
163
|
+
// Preserve-on-partial: PUT /preferences is patch-semantic. The response
|
|
164
|
+
// echoes only the fields that changed, so merge into `preferences`
|
|
165
|
+
// instead of replacing — otherwise a single-channel toggle would wipe
|
|
166
|
+
// every other stored preference.
|
|
167
|
+
//
|
|
168
|
+
// Rollback invariant (F5): `serverEcho` may be `undefined` if the server
|
|
169
|
+
// rolls back to an older shape that omits the echo entirely. In that
|
|
170
|
+
// case fall back to merging `savedOverrides` into `preferences` — the
|
|
171
|
+
// PUT succeeded (2xx), so the values we sent are now server truth. If
|
|
172
|
+
// we merged an empty patch instead, `subtractSavedOverrides` would
|
|
173
|
+
// still strip the just-saved keys from `localOverrides`, leaving the
|
|
174
|
+
// effective preferences (preferences ∪ localOverrides) reverted to the
|
|
175
|
+
// pre-edit server snapshot until the next refetch.
|
|
176
|
+
//
|
|
177
|
+
// In-flight-edit invariant: `savedOverrides` is the exact snapshot the
|
|
178
|
+
// epic PUT to the server. Subtracting those keys from `localOverrides`
|
|
179
|
+
// (instead of clearing it wholesale) preserves any edits the user
|
|
180
|
+
// added AFTER the debounce fired but BEFORE the response landed. The
|
|
181
|
+
// next debounce cycle will pick them up. Clearing wholesale drops
|
|
182
|
+
// in-flight edits from both UI (once server echo lands) and server.
|
|
183
|
+
// Cancel/in-flight-save race: `cancelEpoch` monotonically increases
|
|
184
|
+
// on every Cancel. If the save captured a lower epoch at dispatch,
|
|
185
|
+
// the user has pressed Cancel since — skip the `preferences` merge
|
|
186
|
+
// and the `localOverrides` subtract (Cancel already emptied it).
|
|
187
|
+
// Do NOT flip fetchState so a subsequent legit save can still show
|
|
188
|
+
// its own In-Progress → Completed lifecycle. The server itself has
|
|
189
|
+
// accepted the write — reverting server-side is out of FE scope; UI
|
|
190
|
+
// reflects the cancelled intention until the next refetch merges
|
|
191
|
+
// whatever the server persisted.
|
|
192
|
+
if (action.payload.cancelEpochAtDispatch < draft.cancelEpoch) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
// Bump `saveEpoch` so any settings-envelope GET that was in flight
|
|
196
|
+
// BEFORE this PUT resolved is treated as stale. Its captured epoch
|
|
197
|
+
// will be lower than the new value, so its reducer branch will
|
|
198
|
+
// skip the `preferences` replace. Cursor Bugbot 3632510237.
|
|
199
|
+
draft.saveEpoch += 1;
|
|
200
|
+
draft.savePreferencesState = { fetchState: 'Completed' };
|
|
201
|
+
const patch = action.payload.serverEcho == null
|
|
202
|
+
? action.payload.savedOverrides
|
|
203
|
+
: mapPayloadToPreferences(action.payload.serverEcho);
|
|
204
|
+
draft.preferences = mergePreferences(draft.preferences, patch);
|
|
205
|
+
draft.localOverrides = subtractSavedOverrides(draft.localOverrides, action.payload.savedOverrides);
|
|
206
|
+
},
|
|
207
|
+
setGroupFrequency(draft, action) {
|
|
208
|
+
draft.localOverrides.groupFrequencyByGroupId[action.payload.groupId] =
|
|
209
|
+
action.payload.frequency;
|
|
210
|
+
},
|
|
211
|
+
toggleEventChannel(draft, action) {
|
|
212
|
+
const { channel, enabled, eventId } = action.payload;
|
|
213
|
+
const eventMap = {
|
|
214
|
+
...(draft.localOverrides.eventEnabledByChannel[eventId] ?? {}),
|
|
215
|
+
};
|
|
216
|
+
eventMap[channel] = enabled;
|
|
217
|
+
draft.localOverrides.eventEnabledByChannel[eventId] = eventMap;
|
|
218
|
+
},
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
export const { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, fetchNotificationPreferencesSuccess, saveNotificationPreferences, saveNotificationPreferencesFailure, saveNotificationPreferencesSuccess, setGroupFrequency, toggleEventChannel, } = notificationPreferencesView.actions;
|
|
222
|
+
export default notificationPreferencesView.reducer;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
const getView = (state) => state.notificationPreferencesViewState;
|
|
2
|
+
export const getNotificationPreferencesSaveState = (state) => getView(state).savePreferencesState;
|
|
3
|
+
export const getEffectiveNotificationPreferences = (state) => {
|
|
4
|
+
const view = getView(state);
|
|
5
|
+
const mergedEventEnabledByChannel = { ...view.preferences.eventEnabledByChannel };
|
|
6
|
+
Object.entries(view.localOverrides.eventEnabledByChannel).forEach(([eventId, channels]) => {
|
|
7
|
+
mergedEventEnabledByChannel[eventId] = {
|
|
8
|
+
...(view.preferences.eventEnabledByChannel[eventId] ?? {}),
|
|
9
|
+
...channels,
|
|
10
|
+
};
|
|
11
|
+
});
|
|
12
|
+
return {
|
|
13
|
+
eventEnabledByChannel: mergedEventEnabledByChannel,
|
|
14
|
+
groupFrequencyByGroupId: {
|
|
15
|
+
...view.preferences.groupFrequencyByGroupId,
|
|
16
|
+
...view.localOverrides.groupFrequencyByGroupId,
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export const getNotificationLocalOverrides = (state) => getView(state).localOverrides;
|
|
21
|
+
export const hasUnsavedNotificationPreferences = (state) => {
|
|
22
|
+
const overrides = getView(state).localOverrides;
|
|
23
|
+
return (Object.keys(overrides.eventEnabledByChannel).length > 0 ||
|
|
24
|
+
Object.keys(overrides.groupFrequencyByGroupId).length > 0);
|
|
25
|
+
};
|
|
@@ -1,19 +1,51 @@
|
|
|
1
1
|
import { from, of } from 'rxjs';
|
|
2
2
|
import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
|
|
3
|
+
import { updateNotificationRegistry } from '../../../entity/notificationRegistry/notificationRegistryReducer';
|
|
3
4
|
import { createZeniAPIStatus, isSuccessResponse } from '../../../responsePayload';
|
|
5
|
+
import { notificationPreferencesUrl } from '../../notificationPreferencesView/notificationPreferencesEndpoint';
|
|
6
|
+
import { fetchNotificationPreferencesSuccess } from '../../notificationPreferencesView/notificationPreferencesViewReducer';
|
|
4
7
|
import { fetchNotificationSettings, updateNotificationSettingsOnFailure, updateNotificationSettingsOnSuccess, } from '../settingsViewReducer';
|
|
5
8
|
export const fetchNotificationSettingsEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(fetchNotificationSettings.match), switchMap(() => {
|
|
6
9
|
const state = state$.value;
|
|
7
|
-
const URL = `${zeniAPI.apiEndPoints.notificationMicroServiceBaseUrl}/1.0/notification-preferences`;
|
|
8
10
|
const userEmail = state.tenantState.loggedInUser?.userEmail;
|
|
9
11
|
if (userEmail == null) {
|
|
10
12
|
return from([]);
|
|
11
13
|
}
|
|
12
|
-
|
|
14
|
+
// Snapshot the save epoch at GET-dispatch time. The reducer compares
|
|
15
|
+
// the captured value against the current `saveEpoch` on response and
|
|
16
|
+
// skips the `preferences` replace when a save has landed in the
|
|
17
|
+
// meantime — the GET is carrying the pre-PUT snapshot and would
|
|
18
|
+
// otherwise clobber the fresh save. Cursor Bugbot 3632510237.
|
|
19
|
+
const saveEpochAtDispatch = state.notificationPreferencesViewState.saveEpoch;
|
|
20
|
+
// Snapshot the registry clear epoch at GET-dispatch time (same idiom as
|
|
21
|
+
// `saveEpochAtDispatch` above). The registry reducer compares it against
|
|
22
|
+
// the current `registryEpoch` and skips its write when a
|
|
23
|
+
// `clearAllNotificationRegistry` (tenant switch) has landed since — the
|
|
24
|
+
// GET is carrying the prior tenant's snapshot. Cursor Bugbot 67d6918e.
|
|
25
|
+
const registryEpochAtDispatch = state.notificationRegistryState.registryEpoch;
|
|
26
|
+
return zeniAPI
|
|
27
|
+
.getJSON(notificationPreferencesUrl(zeniAPI))
|
|
28
|
+
.pipe(mergeMap((response) => {
|
|
13
29
|
if (isSuccessResponse(response) && response.data != null) {
|
|
14
30
|
const updateActions = [
|
|
15
31
|
updateNotificationSettingsOnSuccess(response.data, userEmail),
|
|
16
32
|
];
|
|
33
|
+
// Always dispatch — an absent `task_checklist_registry` (gate
|
|
34
|
+
// off) must CLEAR the prior tenant's registry, not leave it in
|
|
35
|
+
// place. The reducer clears on `undefined` and full-replaces
|
|
36
|
+
// otherwise, both guarded by the registry epoch so a stale GET
|
|
37
|
+
// that lands after a tenant switch is skipped. Cursor Bugbot
|
|
38
|
+
// 67d6918e.
|
|
39
|
+
updateActions.push(updateNotificationRegistry({
|
|
40
|
+
registry: response.data.task_checklist_registry ?? undefined,
|
|
41
|
+
registryEpochAtDispatch,
|
|
42
|
+
}));
|
|
43
|
+
if (response.data.task_checklist_preferences != null) {
|
|
44
|
+
updateActions.push(fetchNotificationPreferencesSuccess({
|
|
45
|
+
preferences: response.data.task_checklist_preferences,
|
|
46
|
+
saveEpochAtDispatch,
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
17
49
|
return of(...updateActions);
|
|
18
50
|
}
|
|
19
51
|
else {
|
|
@@ -2,9 +2,10 @@ import { of } from 'rxjs';
|
|
|
2
2
|
import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
|
|
3
3
|
import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
|
|
4
4
|
import { createZeniAPIStatus, isSuccessResponse } from '../../../responsePayload';
|
|
5
|
+
import { notificationPreferencesUrl } from '../../notificationPreferencesView/notificationPreferencesEndpoint';
|
|
5
6
|
import { saveNotificationSettings, updateNotificationSettingsOnSaveFailure, updateNotificationSettingsOnSaveSuccess, } from '../settingsViewReducer';
|
|
6
7
|
export const saveNotificationSettingsEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(saveNotificationSettings.match), switchMap(() => {
|
|
7
|
-
const URL =
|
|
8
|
+
const URL = notificationPreferencesUrl(zeniAPI);
|
|
8
9
|
const { notificationSettings, notificationSettingsLocalData } = state$.value.settingsViewState.notification;
|
|
9
10
|
const payload = toSaveNotificationSettingsPayload(notificationSettingsLocalData, notificationSettings);
|
|
10
11
|
return zeniAPI
|
|
@@ -145,13 +145,14 @@ export const isMonthEndNotificationsSectionVisibleOnSettingsPage = (monthEndInsi
|
|
|
145
145
|
return (monthEndInsightsNotificationSettings.enabled != null ||
|
|
146
146
|
monthEndInsightsNotificationSettings.recipientEmailIds.includes(signedInUseEmail));
|
|
147
147
|
};
|
|
148
|
-
export const isNotificationsTabVisible = (notificationSettings, signedInUseEmail, isDebitCardFlagEnabled, currentTenant) => {
|
|
148
|
+
export const isNotificationsTabVisible = (notificationSettings, signedInUseEmail, isDebitCardFlagEnabled, currentTenant, hasTaskChecklistAccess) => {
|
|
149
149
|
if (currentTenant == null) {
|
|
150
150
|
return false;
|
|
151
151
|
}
|
|
152
152
|
const { reminderNotificationSettings, monthEndInsightsNotificationSettings } = notificationSettings;
|
|
153
153
|
return ((isRemindersSectionVisibleOnSettingsPage(reminderNotificationSettings) ||
|
|
154
|
-
isMonthEndNotificationsSectionVisibleOnSettingsPage(monthEndInsightsNotificationSettings, signedInUseEmail)
|
|
154
|
+
isMonthEndNotificationsSectionVisibleOnSettingsPage(monthEndInsightsNotificationSettings, signedInUseEmail) ||
|
|
155
|
+
hasTaskChecklistAccess) &&
|
|
155
156
|
(isTenantAccountingServicesEnabled(currentTenant) ||
|
|
156
157
|
(isTenantBankingOnly(isDebitCardFlagEnabled, currentTenant) === false &&
|
|
157
158
|
isTenantCardsOnly(currentTenant) === false)));
|
package/lib/index.d.ts
CHANGED
|
@@ -106,6 +106,8 @@ import { updateCommentsNotifications, updateCommentsNotificationsStatuses } from
|
|
|
106
106
|
import { NotificationWithAuthors } from './entity/notification/types/notificationSelectorTypes';
|
|
107
107
|
import { Notification, NotificationActivity, NotificationEventData, NotificationMetaData, NotificationUpdates, NotificationValueFormat } from './entity/notification/types/notificationStateTypes';
|
|
108
108
|
import { ExternalNotificationData, NotificationActivityType, NotificationGroup, NotificationIdentifierType, NotificationMode, NotificationStatus, NotificationUpdateValue, toNotificationModeStrict } from './entity/notification/types/notificationTypes';
|
|
109
|
+
import { getNotificationRegistry } from './entity/notificationRegistry/notificationRegistrySelector';
|
|
110
|
+
import { NotificationChannel, NotificationFrequency, NotificationRegistry, RegistryNotificationEvent, RegistryNotificationGroup, toNotificationChannel, toNotificationFrequency } from './entity/notificationRegistry/notificationRegistryState';
|
|
109
111
|
import { getPlaidPaymentAccounts } from './entity/paymentAccount/paymentAccountSelector';
|
|
110
112
|
import { Logo, PaymentAccount, VERIFIED_PAYMENT_ACCOUNT_PROVIDER_VERIFICATION_STATUS } from './entity/paymentAccount/paymentAccountState';
|
|
111
113
|
import { PaymentInstrument } from './entity/paymentInstrument/paymentInstrument';
|
|
@@ -248,7 +250,7 @@ import { AuditSummaryData, CompanyMonthEndReportData, CompanyMonthReportTemplate
|
|
|
248
250
|
import { fetchCockpitContext, fetchCompanyTaskManagerView, fetchTaskManagerMetrics, updateCompanyTaskManagerViewFilters } from './view/companyTaskManagerView/companyTaskManagerViewReducer';
|
|
249
251
|
import { CompanyTaskManagerSelectorView, TaskWithCompanyDetail, getCompanyTaskManagerView } from './view/companyTaskManagerView/companyTaskManagerViewSelector';
|
|
250
252
|
import { CompanyTaskManagerViewUIState, TaskManagerMetrics } from './view/companyTaskManagerView/companyTaskManagerViewState';
|
|
251
|
-
import { clearCompanyView, companyManagementSaveUpdates, companyPassportClearDataInLocalStore, companyPassportSaveDataInLocalStore, deleteCompanyOfficerInLocalStore, dismissCapitalizationOnboarding, fetchAllCockpitViews, fetchCompanyManagementView, fetchCompanyPassportView, fetchCompanyPortfolioView, fetchManagementView, fetchOnboardingView, fetchParentSubsidiaryManagementView, fetchPortfolioView, fetchSubscriptionView, fetchZeniUsers, saveCompanyPassportDetails, saveIndustryAndIncDateInCompanyPassportLocalStore, updateAccountingClassesEnabled, updateCapitalizationAccountThreshold, updateCompanyDownloadState, updateCompanyManagementUIState, updateCompanyPassportLocalStoreData, updateCompanyPortfolioUIState } from './view/companyView/companyViewReducer';
|
|
253
|
+
import { clearCompanyView, companyManagementSaveUpdates, companyPassportClearDataInLocalStore, companyPassportSaveDataInLocalStore, deleteCompanyOfficerInLocalStore, dismissCapitalizationOnboarding, fetchAllCockpitViews, fetchCompanyManagementView, fetchCompanyPassportView, fetchCompanyPortfolioView, fetchManagementView, fetchOnboardingView, fetchParentSubsidiaryManagementView, fetchPortfolioView, fetchSubscriptionView, fetchZeniUsers, saveCompanyPassportDetails, saveIndustryAndIncDateInCompanyPassportLocalStore, updateAccountingClassesEnabled, enableAccountingProjects, resumeEnableAccountingProjects, disableAccountingProjects, clearQboProjectsReconnectRequest, updateCapitalizationAccountThreshold, updateCompanyDownloadState, updateCompanyManagementUIState, updateCompanyPassportLocalStoreData, updateCompanyPortfolioUIState } from './view/companyView/companyViewReducer';
|
|
252
254
|
import { FilterCategoryValueType, canSendMonthEndEmailReport, shouldEnableCalendarPickerForLastReportSent } from './view/companyView/helpers/cockpitHelpers';
|
|
253
255
|
import { getParentSubsidiaryManagementView } from './view/companyView/parentSubsidiaryView/parentSubsidiaryViewSelector';
|
|
254
256
|
import { CompanyManagementView, CompanyWithUpdateStatusView, getAddonListZeniSku, getCompanyManagementView, getPlanListZeniSku } from './view/companyView/selector/companyManagementViewSelector';
|
|
@@ -273,30 +275,33 @@ import uploadAccountStatementIntoDocumentAI from './view/expenseAutomationView/e
|
|
|
273
275
|
import { fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedPeriod, updateCurrentSelectedView } from './view/expenseAutomationView/expenseAutomationViewReducer';
|
|
274
276
|
import { getExpenseAutomationView } from './view/expenseAutomationView/expenseAutomationViewSelector';
|
|
275
277
|
import { ExpenseAutomationViewState, ExpenseAutomationViewType, toExpenseAutomationViewType } from './view/expenseAutomationView/expenseAutomationViewState';
|
|
278
|
+
import { computeNewScheduleJeDetails } from './view/expenseAutomationView/helpers/newScheduleLocalDataHelper';
|
|
276
279
|
import { isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardCreditType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType } from './view/expenseAutomationView/helpers/reconciliationHelpers';
|
|
277
280
|
import { MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, getLineItemsByTransactionIdsFromLocalData, isAnyItemWithUncategorizedExpenseAccount } from './view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper';
|
|
278
281
|
import { UploadStatementDocumentAIPayload, UploadStatementDocumentAIResponse } from './view/expenseAutomationView/payload/reconciliationPayload';
|
|
279
282
|
import { clearExpenseAutomationFluxAnalysisView, fetchFluxAnalysisView, reviewFluxAnalysisView, updateFluxAnalysisViewPageMetaData, updateFluxAnalysisViewUIState, updateOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview } from './view/expenseAutomationView/reducers/fluxAnalysisViewReducer';
|
|
280
|
-
import { clearJeScheduleLocalData as clearExpenseAutomationJEScheduleLocalData, clearExpenseAutomationJESchedulesView, fetchJeSchedulesPage as fetchExpenseAutomationJESchedulesPage, ignoreRecommendedJeSchedule as ignoreExpenseAutomationJESchedule, initializeAccountSettingsView as initializeJeAccountSettingsView, initializeJeScheduleLocalData, removeJeScheduleTransactionKey, retryJeSchedule as retryExpenseAutomationJESchedule, saveAccountSettings as saveJeAccountSettings, saveAccountSettingsLocalData as saveJeAccountSettingsLocalData, updateJESchedulesUIState as updateExpenseAutomationJESchedulesUIState, updateJeScheduleLocalDataById, updateJeScheduleTransactionKeys } from './view/expenseAutomationView/reducers/jeSchedulesViewReducer';
|
|
283
|
+
import { clearJeScheduleLocalData as clearExpenseAutomationJEScheduleLocalData, clearExpenseAutomationJESchedulesView, clearSearchTransactionsForNewSchedule as clearJeSearchTransactionsForNewSchedule, fetchJeSchedulesPage as fetchExpenseAutomationJESchedulesPage, ignoreRecommendedJeSchedule as ignoreExpenseAutomationJESchedule, initializeAccountSettingsView as initializeJeAccountSettingsView, initializeNewSchedule as initializeJeNewSchedule, initializeJeScheduleLocalData, removeJeScheduleTransactionKey, resetNewScheduleLocalData as resetJeNewScheduleLocalData, retryJeSchedule as retryExpenseAutomationJESchedule, saveAccountSettings as saveJeAccountSettings, saveAccountSettingsLocalData as saveJeAccountSettingsLocalData, saveNewSchedule as saveJeNewSchedule, saveNewScheduleFailure as saveJeNewScheduleFailure, saveNewScheduleSuccess as saveJeNewScheduleSuccess, searchTransactionsForNewSchedule as searchJeTransactionsForNewSchedule, searchTransactionsForNewScheduleFailure as searchJeTransactionsForNewScheduleFailure, searchTransactionsForNewScheduleSuccess as searchJeTransactionsForNewScheduleSuccess, toggleJECreatedGroupCollapsed, toggleJEPendingGroupCollapsed, updateJESchedulesUIState as updateExpenseAutomationJESchedulesUIState, updateJEScheduleTypeFilter, updateNewScheduleLocalData as updateJeNewScheduleLocalData, updateJeScheduleLocalDataById, updateJeScheduleTransactionKeys } from './view/expenseAutomationView/reducers/jeSchedulesViewReducer';
|
|
281
284
|
import { acknowledgeBulkUploadConfirmMatchComplete, bulkUploadAutomatchingTimedOut, bulkUploadReceipts, bulkUploadReceiptsFailure, bulkUploadReceiptsSuccess, clearBulkUpload, clearBulkUploadBatchDetailsForScopeChange, clearManualSearchResults, clearMissingReceiptsTabNavigation, confirmBulkUploadMatch, confirmBulkUploadMatchFailure, confirmBulkUploadMatchSuccess, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsFailure, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatches, fetchBulkUploadBatchesFailure, fetchBulkUploadBatchesSuccess, fetchCompletedTransactions, fetchCompletedTransactionsFailure, fetchCompletedTransactionsSuccess, fetchMissingReceipts as fetchExpenseAutomationMissingReceipts, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, markBatchDetailRefreshAttempted, markMissingReceiptAsDone as markExpenseAutomationMissingReceiptAsDone, pusherBatchStatusUpdate, refreshBatchDetailsForBatchId, requestMissingReceiptsTabNavigation, restoreBulkUploadAutomatchingOnMount, restoreBulkUploadMatchingState, searchTransactionsForManualMatch, searchTransactionsForManualMatchFailure, searchTransactionsForManualMatchSuccess, setBulkUploadCompletedSubTab, setBulkUploadResultsTab, setBulkUploadSortConfig, setBulkUploadUploadedFileCount, storeBatchDetails, updateBulkUploadProgress, updateMissingReceiptUploadState as updateExpenseAutomationMissingReceiptUploadState, updateMissingReceiptsUIState as updateExpenseAutomationMissingReceiptsUIState, uploadMissingReceiptSuccess as uploadExpenseAutomationMissingReceiptSuccess } from './view/expenseAutomationView/reducers/missingReceiptsViewReducer';
|
|
282
285
|
import { clearStatementDateConflict, deleteAccountStatement, excludeAccountFromReconciliation, fetchReconciliation as fetchReconciliationView, includeAccountInReconciliation, parseStatement, parseStatementFailure, parseStatementSuccess, reparseStatement, reparseStatementFailure, reparseStatementSuccess, resetReparseStatementStatus, saveReconciliationDetail as saveExpenseAutomationReconciliationDetail, saveReconciliationReview as saveExpenseAutomationReconciliationReview, setConnectionInProgressForAccount as setConnectionInProgressForAccountReconciliation, setStatementParseInProgress, setStatementProcessingDismissedToBackground, submitStatementUpdate, updateAccountReconciliationLocalData as updateExpenseAutomationAccountReconciliationLocalData, updateSelectedAccountId as updateExpenseAutomationAccountReconciliationSelectedAccountId, updateSelectedTab as updateExpenseAutomationAccountReconciliationSelectedTab, updateReconListScrollPosition as updateExpenseAutomationReconListScrollPosition, updateReviewTabSortState as updateExpenseAutomationReconReviewTabListSortState, updateReviewTabLocalData as updateExpenseAutomationReconReviewTabLocalData, updateReconcileTabListScrollState as updateExpenseAutomationReconcileTabListScrollState, updateReconcileTabListSortState as updateExpenseAutomationReconcileTabListSortState, updateReconcileTabLocalData as updateExpenseAutomationReconcileTabLocalData, updateSelectedDrawerAccountId as updateExpenseAutomationSelectedDrawerAccountId, updateNodeCollapseState, updateParsedStatementData, updateStatementProcessingBackgroundCompletedSteps, updateStatementProcessingFailed, updateStatementUpdateLocalData, updateStatementUploadChosen, uploadAccountStatement } from './view/expenseAutomationView/reducers/reconciliationViewReducer';
|
|
283
286
|
import { backgroundRefetchReviewTab, clearExpenseAutomationTransactionsView, fetchTransactionCategorization, fetchTransactionCategorizationFailure, fetchTransactionCategorizationView, initializeTransactionCategorizationViewLocalData, markCategoryClassRecommendationsFailureForCategorization, markTransactionAsNotMiscategorized, removeTransactionFromAllTabs, saveTransactionCategorization, saveTransactionCategorizationLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, setEntityRecommendationForLineIdsForCategorization, syncTransactionCategorizationFromDetailSave, updateCurrentSelectedTransactionCategorizationTab, updateSelectedCheckboxTransactionIds, updateSelectedCustomerForTransaction, updateSelectedTransactionId, updateSelectedVendorForTransaction, updateTransactionCategorization, updateTransactionCategorizationCompletedSubTab, updateTransactionCategorizationSaveStatus, updateTransactionCategorizationUIState, updateTransactionCategorizationUploadReceiptState, updateTransactionFilters, uploadTransactionCategorizationReceiptSuccess } from './view/expenseAutomationView/reducers/transactionsViewReducer';
|
|
284
287
|
import { ExpenseAutomationStepDetails, ExpenseAutomationViewSelector } from './view/expenseAutomationView/selectorTypes/expenseAutomationViewSelectorTypes';
|
|
285
288
|
import { ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisOperatingExpenseView, FluxAnalysisSectionType, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView } from './view/expenseAutomationView/selectorTypes/fluxAnalysisViewSelectorTypes';
|
|
286
289
|
import { JEAccountSettingsView } from './view/expenseAutomationView/selectorTypes/jeAccountSettingsViewSelectorTypes';
|
|
287
|
-
import {
|
|
290
|
+
import { NewScheduleSearchTransactionsView, NewScheduleView } from './view/expenseAutomationView/selectorTypes/jeNewScheduleViewSelectorTypes';
|
|
291
|
+
import { ExpenseAutomationJESchedulesViewSelector, JEKpiSummary } from './view/expenseAutomationView/selectorTypes/jeSchedulesSelectorTypes';
|
|
288
292
|
import { BulkUploadSelectorData, ExpenseAutomationMissingReceiptsViewSelector } from './view/expenseAutomationView/selectorTypes/missingReceiptsSelectorTypes';
|
|
289
293
|
import { CompletedTransactionsSelectorData, ResolvedBatchDetails, ResolvedBatchFile, ResolvedCandidate } from './view/expenseAutomationView/selectorTypes/missingReceiptsSelectorTypes';
|
|
290
294
|
import { AccountReconSectionID, AccountReconciliationByAccount, AccountReconciliationBySection, ExpenseAutomationReconciliationViewSelector } from './view/expenseAutomationView/selectorTypes/reconciliationViewSelectorTypes';
|
|
291
295
|
import { ExpenseAutomationTransactionViewSelector, TransactionReviewLocalDataSelectorView } from './view/expenseAutomationView/selectorTypes/transactionsViewSelectorTypes';
|
|
292
296
|
import { getExpenseAutomationFluxAnalysisView } from './view/expenseAutomationView/selectors/fluxAnalysisViewSelector';
|
|
297
|
+
import { getNewScheduleSearchTransactionsView as getJeNewScheduleSearchTransactionsView, getNewScheduleView as getJeNewScheduleView } from './view/expenseAutomationView/selectors/jeNewScheduleViewSelector';
|
|
293
298
|
import { JEScheduledTransactionWithFailedEntries } from './view/expenseAutomationView/selectors/jeSchedulesViewSelector';
|
|
294
299
|
import { getExpenseAutomationReconciliationView, getReparseStatementStatusByAccountId, isAccountReconReport } from './view/expenseAutomationView/selectors/reconciliationViewSelector';
|
|
295
300
|
import { getExpenseAutomationTransactionView, getLastTransferEntryReplacement } from './view/expenseAutomationView/selectors/transactionCategorizationSelector';
|
|
296
301
|
import { TRANSACTION_FILTER_CATEGORIES, TransactionFilterAmountMatchingOperator, TransactionFilterCategory, TransactionFilterCategoryDropdownOption, TransactionFilterCategoryField, TransactionFilterEntityType, TransactionFilters, applyTransactionFilters } from './view/expenseAutomationView/transactionFilterHelpers';
|
|
297
302
|
import { CompletedSubTab, DEFAULT_COMPLETED_SUB_TAB, toCompletedSubTab } from './view/expenseAutomationView/types/completedSubTab';
|
|
298
303
|
import { FluxAnalysisActionType, FluxAnalysisReviewStatus, FluxAnalysisSortKey, FluxAnalysisViewUIState, FluxBalancesByMonth } from './view/expenseAutomationView/types/fluxAnalysisViewState';
|
|
299
|
-
import { AccountSettingsLocalData,
|
|
304
|
+
import { AccountSettingsLocalData, JEScheduleSortKey as ExpenseAutomationJEScheduleSortKey, JESchedulesViewUIState as ExpenseAutomationJESchedulesViewUIState, JEPageTab, JEScheduleLocalData, NewJeDetailLocalData, NewJeScheduleState, NewScheduleLocalData, NewScheduleLocalDataFixedAssets, SearchTransactionsState, toJEScheduleSortKey as toExpenseAutomationJEScheduleSortKey, toJEPageTab } from './view/expenseAutomationView/types/jeSchedulesViewState';
|
|
300
305
|
import { BATCH_FILE_STATUSES, BatchDetails, BatchFile, BatchFileStatus, BatchListItem, BatchStatus, BatchStatusValue, BatchSummary, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CandidateRef, MatchCandidate, MatchSource, MissingReceiptsTab, isUnmatchedTabFileStatus, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toMatchSource, toMissingReceiptsTab } from './view/expenseAutomationView/types/missingReceiptsViewState';
|
|
301
306
|
import { MissingReceiptsSortKey as ExpenseAutomationMissingReceiptsSortKey, MissingReceiptsViewState as ExpenseAutomationMissingReceiptsViewState, MissingReceiptsViewUIState as ExpenseAutomationMissingReceiptsViewUIState, toMissingReceiptsSortKey as toExpenseAutomationMissingReceiptsSortKey } from './view/expenseAutomationView/types/missingReceiptsViewState';
|
|
302
307
|
import { AccountReconciliationLocalData, ExcludeAccountFromReconciliationPayload, ReconciliationViewTabType as ExpenseAutomationReconciliationViewTab, ParsedStatementData, ReconReconcileSortKey, ReconReviewSortKey, ReconciliationReconcileTabLocalData, ReconciliationReviewTabLocalData, SaveReconcileDetailActionPayload as SaveExpenseAutomationReconciliationActionType, StatementDateConflict, StatementMeta, StatementTransaction, StatementTransactionForUpdate, StatementTransactionsUpdate, StatementUpdateLocalData, toReconciliationTabsType } from './view/expenseAutomationView/types/reconciliationViewState';
|
|
@@ -335,6 +340,9 @@ import { fetchNetBurnOrIncomeStoryCard, updateNetBurnOrIncomeStoryCardSettings }
|
|
|
335
340
|
import { getNetBurnOrIncomeStoryCardReport } from './view/netBurnOrIncomeStoryCard/netBurnOrIncomeStoryCardSelector';
|
|
336
341
|
import { AccountingMethod, NetBurnOrIncomeStoryCardReport } from './view/netBurnOrIncomeStoryCard/netBurnOrIncomeStoryCardSelectorTypes';
|
|
337
342
|
import { AverageMonthsCount, NetBurnOrIncomeRunway, NetBurnOrIncomeStoryCardState, TimeSpanIdForAverage } from './view/netBurnOrIncomeStoryCard/netBurnOrIncomeStoryCardState';
|
|
343
|
+
import { clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, setGroupFrequency, toggleEventChannel } from './view/notificationPreferencesView/notificationPreferencesViewReducer';
|
|
344
|
+
import { getEffectiveNotificationPreferences, getNotificationLocalOverrides, getNotificationPreferencesSaveState, hasUnsavedNotificationPreferences } from './view/notificationPreferencesView/notificationPreferencesViewSelector';
|
|
345
|
+
import { NotificationPreferences } from './view/notificationPreferencesView/notificationPreferencesViewState';
|
|
338
346
|
import { fetchNotificationUnreadCount, fetchNotificationUnreadCountSuccess, fetchNotificationView, updateNotificationViewAllNotificationsStatus, updateNotificationViewCurrentTabAndSubTab, updateNotificationViewNotificationStatus, updateNotificationViewSubTab, updateNotificationViewTabState, updateNotificationViewUIState } from './view/notificationView/notificationViewReducer';
|
|
339
347
|
import { NotificationView, getExternalNotificationsForSelectedSubTab, getNotificationView, getNotificationsForSelectedSubTab } from './view/notificationView/notificationViewSelector';
|
|
340
348
|
import { NotificationSubTabType, NotificationTabState, NotificationTabType, NotificationViewUIState, toNotificationSubTabTypeStrict, toNotificationTabTypeStrict } from './view/notificationView/notificationViewState';
|
|
@@ -674,9 +682,9 @@ export { TransactionsOrder, COABalancesSliceOrder, EntityOrder, Section, Section
|
|
|
674
682
|
export { ClassesViewSelectorReportV2 };
|
|
675
683
|
export { BalancesTimeseries, TrendTimeseries, BalanceKind };
|
|
676
684
|
export { fetchMonthEndCloseChecks, fetchMonthClosePerformanceTrend, MonthClosePerformanceTrend, MonthEndCloseCheck, getMonthEndCloseChecksViewByTenantId, MonthEndCloseChecksView, MonthEndCloseCheckFrequency, MonthCloseCheckMetrics, MonthCloseCheckProgressJson, ALL_MONTH_END_CLOSE_CHECKS_FREQUENCY, MonthEndAuditSummary, };
|
|
677
|
-
export { ExpenseAutomationViewSelector, ExpenseAutomationStepDetails, ExpenseAutomationViewType, ExpenseAutomationMissingReceiptsViewSelector, BulkUploadSelectorData, ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView, ExpenseAutomationMissingReceiptsViewUIState, ExpenseAutomationMissingReceiptsViewState, ExpenseAutomationViewState, ExpenseAutomationTransactionsTab, ExpenseAutomationMissingReceiptsSortKey, BATCH_FILE_STATUSES, BatchDetails, BatchFile, BatchFileStatus, BatchListItem, isUnmatchedTabFileStatus, BatchStatus, BatchStatusValue, BatchSummary, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CandidateRef, CompletedSubTab, CompletedTransactionsSelectorData, DEFAULT_COMPLETED_SUB_TAB, MatchCandidate, MatchSource, MissingReceiptsTab, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toCompletedSubTab, toMatchSource, toMissingReceiptsTab, ResolvedBatchFile, ResolvedBatchDetails, ResolvedCandidate,
|
|
685
|
+
export { ExpenseAutomationViewSelector, ExpenseAutomationStepDetails, ExpenseAutomationViewType, ExpenseAutomationMissingReceiptsViewSelector, BulkUploadSelectorData, ExpenseAutomationFluxAnalysisViewSelector, FluxAnalysisVendorView, FluxAnalysisViewSectionReport, FluxVendorAccountsAndClassesView, ExpenseAutomationMissingReceiptsViewUIState, ExpenseAutomationMissingReceiptsViewState, ExpenseAutomationViewState, ExpenseAutomationTransactionsTab, ExpenseAutomationMissingReceiptsSortKey, BATCH_FILE_STATUSES, BatchDetails, BatchFile, BatchFileStatus, BatchListItem, isUnmatchedTabFileStatus, BatchStatus, BatchStatusValue, BatchSummary, BulkUploadPhase, BulkUploadResultsTab, BulkUploadSortKey, BulkUploadState, CandidateRef, CompletedSubTab, CompletedTransactionsSelectorData, DEFAULT_COMPLETED_SUB_TAB, MatchCandidate, MatchSource, MissingReceiptsTab, toBatchFileStatus, toBatchStatusValue, toBulkUploadPhase, toBulkUploadResultsTab, toBulkUploadSortKey, toCompletedSubTab, toMatchSource, toMissingReceiptsTab, ResolvedBatchFile, ResolvedBatchDetails, ResolvedCandidate, ExpenseAutomationJEScheduleSortKey, ExpenseAutomationJESchedulesViewUIState, JEKpiSummary, JEPageTab, toExpenseAutomationJEScheduleSortKey, toJEPageTab, toggleJECreatedGroupCollapsed, toggleJEPendingGroupCollapsed, updateJEScheduleTypeFilter, getExpenseAutomationView, toExpenseAutomationMissingReceiptsSortKey, toExpenseAutomationTransactionsTabKey, toExpenseAutomationViewType, uploadExpenseAutomationMissingReceiptSuccess, markExpenseAutomationMissingReceiptAsDone, fetchAllExpenseAutomationTabs, refreshExpenseAutomationCurrentTab, updateCurrentSelectedTransactionCategorizationTab, updateTransactionCategorizationCompletedSubTab, fetchExpenseAutomationMissingReceipts, bulkUploadReceipts, bulkUploadAutomatchingTimedOut, bulkUploadReceiptsSuccess, bulkUploadReceiptsFailure, restoreBulkUploadAutomatchingOnMount, restoreBulkUploadMatchingState, updateBulkUploadProgress, pusherBatchStatusUpdate, requestMissingReceiptsTabNavigation, clearMissingReceiptsTabNavigation, fetchBulkUploadBatchDetails, fetchBulkUploadBatchDetailsSuccess, fetchBulkUploadBatchDetailsFailure, storeBatchDetails, fetchMoreBatchDetails, fetchMoreBatchDetailsComplete, fetchMoreBatchDetailsFailure, fetchBulkUploadBatches, fetchBulkUploadBatchesSuccess, fetchBulkUploadBatchesFailure, clearBulkUploadBatchDetailsForScopeChange, markBatchDetailRefreshAttempted, refreshBatchDetailsForBatchId, confirmBulkUploadMatch, confirmBulkUploadMatchSuccess, confirmBulkUploadMatchFailure, setBulkUploadResultsTab, setBulkUploadCompletedSubTab, setBulkUploadSortConfig, setBulkUploadUploadedFileCount, clearBulkUpload, searchTransactionsForManualMatch, searchTransactionsForManualMatchSuccess, searchTransactionsForManualMatchFailure, clearManualSearchResults, acknowledgeBulkUploadConfirmMatchComplete, fetchCompletedTransactions, fetchCompletedTransactionsSuccess, fetchCompletedTransactionsFailure, fetchFluxAnalysisView, clearExpenseAutomationFluxAnalysisView, updateOperatingExpensesIdsForReview as updateFluxOperatingExpensesIdsForReview, updateSelectedSectionIdsForReview as updateFluxAnalysisSelectedSectionIdsForReview, reviewFluxAnalysisView, updateExpenseAutomationMissingReceiptUploadState, updateExpenseAutomationMissingReceiptsUIState, updateTransactionCategorizationUploadReceiptState, uploadTransactionCategorizationReceiptSuccess, FluxAnalysisOperatingExpenseView, FluxAnalysisSectionType, getExpenseAutomationFluxAnalysisView, FluxAnalysisSortKey, FluxAnalysisActionType, FluxBalancesByMonth, updateCurrentSelectedView, updateCurrentSelectedPeriod, getExpenseAutomationTransactionView, getLastTransferEntryReplacement, ReconReconcileSortKey, ReconciliationReconcileTabLocalData, FluxAnalysisReviewStatus, updateFluxAnalysisViewUIState, FluxAnalysisViewUIState, updateFluxAnalysisViewPageMetaData, MAX_SELECTION_LIMIT, checkIfAllLineItemsAreCategoryClassFilled, getLineItemsByTransactionIdsFromLocalData, isAnyItemWithUncategorizedExpenseAccount, SaveExpenseAutomationReconciliationActionType, ExcludeAccountFromReconciliationPayload, excludeAccountFromReconciliation, includeAccountInReconciliation, saveExpenseAutomationReconciliationDetail, updateExpenseAutomationReconcileTabListScrollState, updateExpenseAutomationReconReviewTabListSortState, updateExpenseAutomationReconcileTabListSortState, updateExpenseAutomationReconcileTabLocalData, updateExpenseAutomationAccountReconciliationSelectedTab, updateExpenseAutomationAccountReconciliationSelectedAccountId, ExpenseAutomationReconciliationViewSelector, getExpenseAutomationReconciliationView, getReparseStatementStatusByAccountId, AccountReconciliationBySection, fetchReconciliationView, uploadAccountStatementIntoDocumentAI, UploadStatementDocumentAIResponse, updateExpenseAutomationReconListScrollPosition, setConnectionInProgressForAccountReconciliation, AccountReconciliationByAccount, AccountReconciliationEntity, getAccountReconByAccountIdAndSelectedPeriod, ExpenseAutomationReconciliationViewTab, toReconciliationTabsType, isAccountReconReport, ReconReviewSortKey, AccountReconSectionID, ReconciliationReviewTabLocalData, TransactionsToReview, RecommendedActionCodeType, ReconciliationStatusCodeType, BalanceDataStatusCodeType, updateExpenseAutomationReconReviewTabLocalData, updateExpenseAutomationSelectedDrawerAccountId, updateStatementProcessingFailed, saveExpenseAutomationReconciliationReview, updateExpenseAutomationAccountReconciliationLocalData, BankStatusCodeType, ReconciliationAccountSourceType, toReconciliationAccountSource, StatementStatusCodeType, AccountReconciliationLocalData, StatementDataStatusCodeType, deleteAccountStatement, uploadAccountStatement, parseStatement, parseStatementSuccess, parseStatementFailure, reparseStatement, reparseStatementSuccess, reparseStatementFailure, resetReparseStatementStatus, updateParsedStatementData, updateNodeCollapseState, UploadStatementDocumentAIPayload, updateStatementUploadChosen, submitStatementUpdate, clearStatementDateConflict, StatementDateConflict, updateStatementUpdateLocalData, isReviewTransactionBankTransferType, isReviewTransactionBillPaymentType, isReviewTransactionCreditCardPaymentType, isReviewTransactionDepositType, isReviewTransactionExpenseType, isReviewTransactionCreditCardCreditType, setStatementParseInProgress, setStatementProcessingDismissedToBackground, updateStatementProcessingBackgroundCompletedSteps, ParsedStatementData, StatementUpdateLocalData, StatementMeta, StatementTransaction, StatementTransactionForUpdate, StatementTransactionsUpdate, };
|
|
678
686
|
export { JEScheduleLocalData };
|
|
679
|
-
export { ExpenseAutomationJESchedulesViewSelector, JEAccountSettingsView, JEScheduledTransactionWithFailedEntries, };
|
|
687
|
+
export { ExpenseAutomationJESchedulesViewSelector, JEAccountSettingsView, JEScheduledTransactionWithFailedEntries, NewJeDetailLocalData, NewJeScheduleState, NewScheduleLocalData, NewScheduleLocalDataFixedAssets, NewScheduleSearchTransactionsView, NewScheduleView, SearchTransactionsState, computeNewScheduleJeDetails, getJeNewScheduleSearchTransactionsView, getJeNewScheduleView, };
|
|
680
688
|
export { fetchTransactionCategorization, fetchTransactionCategorizationView, updateTransactionCategorizationUIState, updateTransactionFilters, updateSelectedCheckboxTransactionIds, markCategoryClassRecommendationsFailureForCategorization, setEntityRecommendationForLineIdsForCategorization, initializeTransactionCategorizationViewLocalData, setAllItemsToCategoryClassInLocalDataForCategorization, saveTransactionCategorizationLocalData, fetchTransactionCategorizationFailure, saveTransactionCategorization, updateTransactionCategorization, updateTransactionCategorizationSaveStatus, markTransactionAsNotMiscategorized, updateSelectedVendorForTransaction, updateSelectedCustomerForTransaction, updateSelectedTransactionId, syncTransactionCategorizationFromDetailSave, backgroundRefetchReviewTab, createTransferEntry, createTransferEntryFailure, createTransferEntryReplacedTransaction, createTransferEntrySuccess, resetCreateTransferEntryStatus, clearTransferEntryRouteReplacement, fetchAccountsForTransferFlow, removeTransactionFromAllTabs, clearExpenseAutomationTransactionsView, TransactionsSortKey, toTransactionsSortKey, TransactionsTab, TransactionCategorizationLineItemData, TransactionReviewLocalData, SupportedTransactionCategorization, ExpenseAutomationTransactionsViewState, ExpenseAutomationTransactionsViewUIState, ExpenseAutomationTransactionViewSelector, TransactionReviewLocalDataSelectorView, };
|
|
681
689
|
export { TopExpense, TopExTimePeriod, TOP_EX_TIME_PERIODS };
|
|
682
690
|
export { TimeframeTick, TimeframeTickWithMetaData, toTimeframeTick, mapTimePeriodtoTimeframeTick, toTimePeriod, toAbsoluteDay, toMonthYearPeriodId, convertToPeriod, MonthYearPeriod, };
|
|
@@ -787,7 +795,7 @@ export { CockpitFilterCategory, CockpitFilters, DownloadCockpitTabOptions, Filte
|
|
|
787
795
|
export { CockpitDownloadTabsID, CockpitTabsFileType, CockpitTabsID, ALL_COCKPIT_TABS_FILE_TYPES, ALL_COCKPIT_TABS_IDS, toCockpitTabsIDStrict, toCockpitTabsFileTypeStrict, };
|
|
788
796
|
export { AllowedValueWithCode, AllowedValue, AllowedValueWithID, isAllowedValueWithCode, isAllowedValueWithID, };
|
|
789
797
|
export { ManagementUIState, PortfolioUIState };
|
|
790
|
-
export { fetchCompanyPassportView, CompanyPassportView, getCompanyPassportView, getCompanyPassportLocalStoreData, isCompanyPassportDataToBeSaved, companyPassportSaveDataInLocalStore, saveIndustryAndIncDateInCompanyPassportLocalStore, deleteCompanyOfficerInLocalStore, companyPassportClearDataInLocalStore, updateCompanyPassportLocalStoreData, saveCompanyPassportDetails, updateAccountingClassesEnabled, updateCapitalizationAccountThreshold, dismissCapitalizationOnboarding, clearCompanyView, UpdateActionType, CompanyPassportLocalStoreDataView, };
|
|
798
|
+
export { fetchCompanyPassportView, CompanyPassportView, getCompanyPassportView, getCompanyPassportLocalStoreData, isCompanyPassportDataToBeSaved, companyPassportSaveDataInLocalStore, saveIndustryAndIncDateInCompanyPassportLocalStore, deleteCompanyOfficerInLocalStore, companyPassportClearDataInLocalStore, updateCompanyPassportLocalStoreData, saveCompanyPassportDetails, updateAccountingClassesEnabled, enableAccountingProjects, resumeEnableAccountingProjects, disableAccountingProjects, clearQboProjectsReconnectRequest, updateCapitalizationAccountThreshold, dismissCapitalizationOnboarding, clearCompanyView, UpdateActionType, CompanyPassportLocalStoreDataView, };
|
|
791
799
|
export { CompanyInfoLocalData, IncInfoLocalData, TaxDetailsLocalData, CompanyDetailsLocalData, PrimaryContactLocalData, CompanyOfficerLocalData, CompanyOfficerType, CompanyPassportLocalData, toCompanyPassportLocalData, };
|
|
792
800
|
export type { CompanyOnboardingIndustryTypeCode, CompanyOnboardingSubIndustryTypeCode, CompanyPurposeOfAccountCode, CompanySourceOfFundsCode, CompanyTransactionVolumeCode, CompanyUsNexusTypeCode, };
|
|
793
801
|
export { COMPANY_ONBOARDING_INDUSTRY_TYPE_CODES, COMPANY_ONBOARDING_SUB_INDUSTRY_CODES_BY_INDUSTRY, COMPANY_PURPOSE_OF_ACCOUNT_CODES, COMPANY_SOURCE_OF_FUNDS_CODES, COMPANY_TRANSACTION_VOLUME_CODES, COMPANY_US_NEXUS_TYPE_CODES, getCompanyOnboardingSubIndustryCodesForIndustry, };
|
|
@@ -883,7 +891,7 @@ export { TIME_SERIES_DURATIONS, PerformanceReportKey, TimeSeriesDuration, conver
|
|
|
883
891
|
export { fetchApAging, getApAgingReport, updateApAgingUIState, AgingReportId, ApAgingReport, AgingBalance, AgingPeriod, AgingReportSortKey, AgingBalancesByVendor, AgingReportUIState, AgingDetailReportUIState, AgingDetailReportInvoice, AgingDateSelectionType, };
|
|
884
892
|
export { fetchApAgingDetail, AgingReportInvoice, ApAgingDetail, getApAgingDetailForVendor, updateApAgingDetailUIState, };
|
|
885
893
|
export { LinkBillExpenseKey };
|
|
886
|
-
export { clearExpenseAutomationJEScheduleLocalData, clearExpenseAutomationJESchedulesView, fetchExpenseAutomationJESchedulesPage, ignoreExpenseAutomationJESchedule, initializeJeAccountSettingsView, initializeJeScheduleLocalData, removeJeScheduleTransactionKey, retryExpenseAutomationJESchedule, updateExpenseAutomationJESchedulesUIState, updateJeScheduleLocalDataById, updateJeScheduleTransactionKeys, };
|
|
894
|
+
export { clearExpenseAutomationJEScheduleLocalData, clearExpenseAutomationJESchedulesView, clearJeSearchTransactionsForNewSchedule, fetchExpenseAutomationJESchedulesPage, ignoreExpenseAutomationJESchedule, initializeJeAccountSettingsView, initializeJeNewSchedule, initializeJeScheduleLocalData, removeJeScheduleTransactionKey, resetJeNewScheduleLocalData, retryExpenseAutomationJESchedule, saveJeNewSchedule, saveJeNewScheduleFailure, saveJeNewScheduleSuccess, searchJeTransactionsForNewSchedule, searchJeTransactionsForNewScheduleFailure, searchJeTransactionsForNewScheduleSuccess, updateExpenseAutomationJESchedulesUIState, updateJeNewScheduleLocalData, updateJeScheduleLocalDataById, updateJeScheduleTransactionKeys, };
|
|
887
895
|
export { createNewSchedulesAccrued, deleteScheduleAccruedDetail, cancelScheduleAccruedJournalEntry, fetchScheduleAccruedDetails, fetchScheduleAccruedDetailsPage, resetJEAccruedLinkInLocalData, saveScheduleAccruedDetails, updateAmountsInScheduleAccruedDetail, updatedJEAccruedLinkWithRecommendedLocalData, updatedJELinkInLocalDataAccruedExpenses, fetchRecommendedTransactionRowIndex, clearSelectedJELinkRowIndex, updateLinkBillExpenseLocalData, updateScheduleAccruedDetailsLocalData, updateSelectedJEAccruedScheduleKey, resetSelectedJEAccruedScheduleKey, resetAccruedDetailNewScheduleState, };
|
|
888
896
|
export { JEScheduleKey, JEScheduleTransactionKey, ScheduleTransactionID, getJEScheduleTransactionKey, ALL_SCHEDULES_TYPES, JEScheduledTransaction, JEAccruedSchedule, JEScheduleAISummaries, JEScheduleFieldRecommendation, ScheduleTypes, ScheduleJournalEntryStatusCodeType, ScheduleListReport, ScheduleAccruedListReport, getScheduleListReport, getAccruedScheduleListReport, ScheduleSubTabType, ScheduleListSortKey, fetchScheduleList, fetchAccruedScheduleList, fetchDownloadSchedules, fetchSchedulesAccount, updateScheduleListLocalData, getFetchStateForScheduleAccountList, toScheduleTypesType, toScheduleTypesTypeStrict, toScheduleListTabsFileTypeStrict, ScheduleListLocalData, ScheduleDetailsLocalDataFixedAssets, ScheduleDetailsLocalDataAccruedExpenses, ScheduleDetailsView, ScheduleAccruedDetailsView, LinkBillExpenseView, LinkBillExpenseLocalData, JEScheduleDetailsLocalData, ScheduleDetailsLocalData, toScheduleSubTabType, ScheduleStatusCodeType, JournalEntryErrorCodeType, ScheduleTransaction, updateScheduleListSubTab, updateScheduleListSearchText, updateScheduleListScrollState, updateScheduleListSortState, ScheduleDetailSortKey, ScheduledJournalEntry, updateSelectedJEScheduleKey, fetchScheduleDetails, getScheduleDetailsView, getAccruedScheduleDetailsView, fetchScheduleDetailsPage, saveScheduleDetails, deleteScheduleDetail, createNewSchedules, updateScheduleDetailsLocalData, JETransactionLink, updateScheduleListDownloadState, updateAccruedJEScheduleAccruedByListKey, DownloadJEScheduleTabOptions, updatedSelectedJELinkRowIndex, ScheduleListTabsFileType, getQBOUrlForLink, getThirdPartyIDFromQBOURL, updatedJELinkInLocalData, updateAmountsInScheduleDetail, ScheduleDetailUIState, resetJELinkInLocalData, JEScheduledTransactionWithBalance, JEScheduleWithBalance, JELinkType, updatedJELinkWithRecommendedLocalData, getFetchStateForScheduleListByType, getDefaultSelectedTimeframeForScheduleType, markAsCompleteScheduleDetail, resetMarkAsCompleteStatus, fetchVendorTabView, updateVendorTabViewTab, VendorTabViewTabType, getVendorTabView, VendorTabViewSelectorView, };
|
|
889
897
|
export { GlobalMerchant, GlobalMerchantBase, TenantMerchant };
|
|
@@ -903,6 +911,7 @@ export { ExternalNotificationData, NotificationGroup, NotificationActivityType,
|
|
|
903
911
|
export { NotificationView, NotificationViewUIState, NotificationTabState, NotificationTabType, NotificationSubTabType, toNotificationSubTabTypeStrict, toNotificationTabTypeStrict, fetchNotificationView, fetchNotificationUnreadCount, fetchNotificationUnreadCountSuccess, updateNotificationViewAllNotificationsStatus, updateNotificationViewNotificationStatus, updateNotificationViewTabState, updateNotificationViewCurrentTabAndSubTab, updateNotificationViewSubTab, updateNotificationViewUIState, getNotificationView, getExternalNotificationsForSelectedSubTab, getNotificationsForSelectedSubTab, };
|
|
904
912
|
export { clearFeatureNotificationView, fetchRegisteredInterests, notifyMeForFeature, getFeatureNotificationView, getRegisteredInterests, getRegisteredInterestsByFeature, isFeatureInterestRegistered, FeatureInterest, FeatureNotificationViewState, };
|
|
905
913
|
export { pushToastNotification, ToastNotification, ToastNotificationPayload, getLastNotificationTime, getNotifications, };
|
|
914
|
+
export { getEffectiveNotificationPreferences, getNotificationLocalOverrides, getNotificationPreferencesSaveState, getNotificationRegistry, hasUnsavedNotificationPreferences, NotificationChannel, NotificationFrequency, NotificationPreferences, NotificationRegistry, RegistryNotificationEvent, RegistryNotificationGroup, clearAllNotificationPreferencesView, clearNotificationPreferencesLocalOverrides, setGroupFrequency, toggleEventChannel, toNotificationChannel, toNotificationFrequency, };
|
|
906
915
|
export { getReferralListView, getInviteFormView, ReferralListSelectorView, ReferralViewState, InviteCompanyLocalData, ReferralInvitation, ReferralListViewSortKey, ReferralViewUIState, toReferralListViewSortKeyType, ReferralStatus, ReferralAmountStatus, StatusTypes, AmountStatusTypes, DEFAULT_REFERRER_AMOUNT, fetchReferrals, sendReferralInvite, clearReferrals, saveReferralFormDataInLocalStore, updateReferralListSortUiState, resendReferralInvite, fetchRewardsPlan, RewardsPlanCardReport, getRewardsPlanCard, updateReferViewed, RewardsPlanData, };
|
|
907
916
|
export { ALL_WEEK_DAYS, DayOfWeek, RecurringDatePickerOptions, RecurringFrequencyType, SEMI_WEEKLY_REQUIRED_DAYS_COUNT, getMinAllowedEndDate, getRecurringEndDateFromCount, toDayOfWeek, toRecurringFrequency, };
|
|
908
917
|
export { fetchCockpitContext, fetchCompanyTaskManagerView, fetchTaskManagerMetrics, CompanyTaskManagerSelectorView, CompanyTaskManagerViewUIState, TaskManagerMetrics, getCompanyTaskManagerView, TaskWithCompanyDetail, createTaskFromTaskGroupTemplate, TaskGroupTemplate, };
|