@mx-cartographer/experiences 4.0.14-alpha.JB0 → 4.0.14-alpha.JB2

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 (75) hide show
  1. package/dist/AccountStore-B23-oV1B.mjs +244 -0
  2. package/dist/AccountStore-B23-oV1B.mjs.map +1 -0
  3. package/dist/BeatApi-BxXgbSJY.mjs +99 -0
  4. package/dist/BeatApi-BxXgbSJY.mjs.map +1 -0
  5. package/dist/BudgetUtil-BSn9Zr71.mjs +208 -0
  6. package/dist/BudgetUtil-BSn9Zr71.mjs.map +1 -0
  7. package/dist/CashflowApi-zcebgnO1.mjs +103 -0
  8. package/dist/CashflowApi-zcebgnO1.mjs.map +1 -0
  9. package/dist/CashflowStore-gPEEBiXo.mjs +53 -0
  10. package/dist/CashflowStore-gPEEBiXo.mjs.map +1 -0
  11. package/dist/Categories-XVFviD23.mjs +117 -0
  12. package/dist/Categories-XVFviD23.mjs.map +1 -0
  13. package/dist/CategoryStore-CSNSMNA6.mjs +298 -0
  14. package/dist/CategoryStore-CSNSMNA6.mjs.map +1 -0
  15. package/dist/ConnectMiniWidget-Ep65CtHH.mjs +10854 -0
  16. package/dist/ConnectMiniWidget-Ep65CtHH.mjs.map +1 -0
  17. package/dist/DebtsStore-Duf3n1vZ.mjs +127 -0
  18. package/dist/DebtsStore-Duf3n1vZ.mjs.map +1 -0
  19. package/dist/Donut-DgMeKScZ.mjs +53 -0
  20. package/dist/Donut-DgMeKScZ.mjs.map +1 -0
  21. package/dist/Fetch-DpUi1_Dx.mjs +99 -0
  22. package/dist/Fetch-DpUi1_Dx.mjs.map +1 -0
  23. package/dist/GoalStore-BYoRLx99.mjs +128 -0
  24. package/dist/GoalStore-BYoRLx99.mjs.map +1 -0
  25. package/dist/MerchantStore-RhLvDvX-.mjs +118 -0
  26. package/dist/MerchantStore-RhLvDvX-.mjs.map +1 -0
  27. package/dist/NetWorthStore-syD1VnxE.mjs +66 -0
  28. package/dist/NetWorthStore-syD1VnxE.mjs.map +1 -0
  29. package/dist/NotificationStore-CqTYHfJC.mjs +141 -0
  30. package/dist/NotificationStore-CqTYHfJC.mjs.map +1 -0
  31. package/dist/RecurringActivityStore-B_COvGWG.mjs +304 -0
  32. package/dist/RecurringActivityStore-B_COvGWG.mjs.map +1 -0
  33. package/dist/StackedLineChart-CCqGRwvs.mjs +342 -0
  34. package/dist/StackedLineChart-CCqGRwvs.mjs.map +1 -0
  35. package/dist/TransactionStore-BUrjBWkk.mjs +478 -0
  36. package/dist/TransactionStore-BUrjBWkk.mjs.map +1 -0
  37. package/dist/index.es.js +12 -17869
  38. package/dist/index.es.js.map +1 -1
  39. package/dist/index.es10.js +107 -0
  40. package/dist/index.es10.js.map +1 -0
  41. package/dist/index.es11.js +159 -0
  42. package/dist/index.es11.js.map +1 -0
  43. package/dist/index.es12.js +483 -0
  44. package/dist/index.es12.js.map +1 -0
  45. package/dist/index.es13.js +620 -0
  46. package/dist/index.es13.js.map +1 -0
  47. package/dist/index.es14.js +788 -0
  48. package/dist/index.es14.js.map +1 -0
  49. package/dist/index.es15.js +891 -0
  50. package/dist/index.es15.js.map +1 -0
  51. package/dist/index.es16.js +962 -0
  52. package/dist/index.es16.js.map +1 -0
  53. package/dist/index.es17.js +1904 -0
  54. package/dist/index.es17.js.map +1 -0
  55. package/dist/index.es2.js +11 -0
  56. package/dist/index.es2.js.map +1 -0
  57. package/dist/index.es3.js +10 -0
  58. package/dist/index.es3.js.map +1 -0
  59. package/dist/index.es4.js +9 -0
  60. package/dist/index.es4.js.map +1 -0
  61. package/dist/index.es5.js +7 -0
  62. package/dist/index.es5.js.map +1 -0
  63. package/dist/index.es6.js +7 -0
  64. package/dist/index.es6.js.map +1 -0
  65. package/dist/index.es7.js +10 -0
  66. package/dist/index.es7.js.map +1 -0
  67. package/dist/index.es8.js +10 -0
  68. package/dist/index.es8.js.map +1 -0
  69. package/dist/index.es9.js +18 -0
  70. package/dist/index.es9.js.map +1 -0
  71. package/dist/useCombineEvents-CZUDHE96.mjs +170 -0
  72. package/dist/useCombineEvents-CZUDHE96.mjs.map +1 -0
  73. package/dist/usePrevious-BLb3umpI.mjs +11 -0
  74. package/dist/usePrevious-BLb3umpI.mjs.map +1 -0
  75. package/package.json +1 -1
@@ -0,0 +1,478 @@
1
+ import { makeAutoObservable as R, runInAction as u } from "mobx";
2
+ import { getUnixTime as A } from "date-fns/getUnixTime";
3
+ import { endOfToday as f } from "date-fns/endOfToday";
4
+ import { formatISO as N } from "date-fns/formatISO";
5
+ import { fromUnixTime as y } from "date-fns/fromUnixTime";
6
+ import { isBefore as b } from "date-fns/isBefore";
7
+ import { startOfMonth as I } from "date-fns/startOfMonth";
8
+ import { startOfToday as C } from "date-fns/startOfToday";
9
+ import { subDays as O } from "date-fns/subDays";
10
+ import "bowser";
11
+ import "date-fns/intlFormat";
12
+ import { V as v, an as x, ao as _, af as T, ag as m, ap as B, aq as L } from "./ConnectMiniWidget-Ep65CtHH.mjs";
13
+ import "react";
14
+ import "@honeybadger-io/react";
15
+ import "numeral";
16
+ import "date-fns/addMonths";
17
+ import "date-fns/addQuarters";
18
+ import "date-fns/addWeeks";
19
+ import "date-fns/addYears";
20
+ import "date-fns/getDay";
21
+ import "date-fns/nextDay";
22
+ import "date-fns/setDate";
23
+ import { B as D } from "./BeatApi-BxXgbSJY.mjs";
24
+ import "react/jsx-runtime";
25
+ import "@mui/material/Button";
26
+ import "@kyper/mui";
27
+ import "@mui/material/Tooltip";
28
+ import "@mui/material/Box";
29
+ import "@mui/material/IconButton";
30
+ import "@mui/material/styles/useTheme";
31
+ import "@mui/material/useMediaQuery";
32
+ import "@mxenabled/cssinjs";
33
+ import "date-fns/addDays";
34
+ import "date-fns/eachDayOfInterval";
35
+ import "date-fns/eachWeekOfInterval";
36
+ import { endOfMonth as M } from "date-fns/endOfMonth";
37
+ import { format as G } from "date-fns/format";
38
+ import "date-fns/isSameMonth";
39
+ import "date-fns/subMonths";
40
+ import "@mui/material/Paper";
41
+ import "@mui/icons-material/KeyboardArrowLeftRounded";
42
+ import "@mui/icons-material/KeyboardArrowRightRounded";
43
+ import "date-fns/isSameDay";
44
+ import "date-fns/isWithinInterval";
45
+ import "d3";
46
+ import "@mui/material/styles";
47
+ import "@mui/x-charts";
48
+ import "@mui/material/Stack";
49
+ import "@mui/material";
50
+ import "date-fns/differenceInCalendarDays";
51
+ import "date-fns/endOfYear";
52
+ import "date-fns/startOfYear";
53
+ import "date-fns/subYears";
54
+ import "@mui/material/ButtonGroup";
55
+ import "@mui/material/Tab";
56
+ import "@mui/material/Tabs";
57
+ import "@mui/material/ToggleButton";
58
+ import "@mui/material/ToggleButtonGroup";
59
+ import "@mui/material/Dialog";
60
+ import "@mui/material/DialogContent";
61
+ import "@mui/icons-material/ArrowBackOutlined";
62
+ import "@mui/material/Card";
63
+ import "@mui/material/CardHeader";
64
+ import "@mui/material/CardContent";
65
+ import "uuid";
66
+ import "@mui/material/CircularProgress";
67
+ import "@mui/material/FormControlLabel";
68
+ import "@mui/material/Radio";
69
+ import "@mui/material/Avatar";
70
+ import "@mui/material/ListItem";
71
+ import "@mui/material/ListItemAvatar";
72
+ import "@mui/material/ListItemButton";
73
+ import "@mui/material/ListItemText";
74
+ import "@mui/material/ListItemIcon";
75
+ import "date-fns/differenceInDays";
76
+ import "@mui/x-data-grid-pro";
77
+ import "date-fns";
78
+ import "date-fns/getMonth";
79
+ import "date-fns/isAfter";
80
+ import "date-fns/parseISO";
81
+ import "date-fns/subWeeks";
82
+ import { F as U, A as c } from "./Fetch-DpUi1_Dx.mjs";
83
+ class w {
84
+ fetchInstance;
85
+ constructor(t, a) {
86
+ this.fetchInstance = new U(t, a);
87
+ }
88
+ addTag = async (t) => this.fetchInstance.post(c.TAGS, t).then((a) => a.tag);
89
+ addTagging = async (t) => this.fetchInstance.post(c.TAGGINGS, t).then((a) => a.tagging);
90
+ addTransaction = async (t) => this.fetchInstance.post(c.TRANSACTIONS, t).then((a) => a.transaction);
91
+ addTransactionRule = async (t) => this.fetchInstance.post(c.TRANSACTION_RULES, t).then((a) => a);
92
+ getTaggings = async () => this.fetchInstance.get(c.TAGGINGS).then((t) => t.map((a) => a.tagging));
93
+ getTags = async () => this.fetchInstance.get(c.TAGS).then((t) => t.map((a) => a.tag));
94
+ getTransactionRules = async () => this.fetchInstance.get(c.TRANSACTION_RULES).then((t) => t.transaction_rules);
95
+ getTransactionsByDateRange = async (t, a) => this.fetchInstance.get(`${c.TRANSACTIONS}/by_date/${t}/${a}`).then((e) => e.map((i) => i.transaction));
96
+ // DEPRECATED
97
+ getTransactionsByAccountsAndDateRange = async (t, a, e) => {
98
+ console.warn("DEPRECATED: getTransactionsByAccountsAndDateRange will be removed");
99
+ const i = t.reduce(
100
+ (o, n, s) => `${o}account_guids[]=${n}${s !== t.length - 1 ? "&" : ""}`,
101
+ ""
102
+ );
103
+ return this.fetchInstance.get(`${c.TRANSACTIONS}/by_date/${a}/${e}?${i}`).then((o) => o.map((n) => n.transaction));
104
+ };
105
+ // DEPRECATED
106
+ getTransactionsByGuids = async (t) => (console.warn("DEPRECATED: getTransactionsByGuids will be removed"), this.fetchInstance.post(`${c.TRANSACTIONS}/by_guids`, { guids: t.join("+") }).then((a) => a.map((e) => e.transaction)));
107
+ // DEPRECATED
108
+ getTransactionsByCategoryAndDate = async (t, a, e) => (console.warn("DEPRECATED: getTransactionsByCategoryAndDate will be removed"), this.fetchInstance.get(
109
+ `${c.TRANSACTIONS}/by_category_guid/${t}/by_date/${a}/${e}`
110
+ ).then((i) => i.map((o) => o.transaction)));
111
+ // DEPRECATED
112
+ getTransactionsByCategoryDateAndAccounts = async (t, a, e, i) => {
113
+ console.warn("DEPRECATED: getTransactionsByCategoryDateAndAccounts will be removed");
114
+ const o = i.reduce(
115
+ (n, s, r) => `${n}account_guids[]=${s}${r !== i.length - 1 ? "&" : ""}`,
116
+ ""
117
+ );
118
+ return this.fetchInstance.get(
119
+ `${c.TRANSACTIONS}/by_category_guid/${t}/by_date/${a}/${e}?${o}`
120
+ ).then((n) => n.map((s) => s.transaction));
121
+ };
122
+ // DEPRECATED
123
+ getTransactionsByCategoriesDateAndAccounts = async (t, a, e, i) => {
124
+ console.warn("DEPRECATED: getTransactionsByCategoriesDateAndAccounts will be removed");
125
+ const o = i.reduce(
126
+ (n, s, r) => `${n}account_guids[]=${s}${r !== i.length - 1 ? "&" : ""}`,
127
+ ""
128
+ );
129
+ return this.fetchInstance.get(
130
+ `${c.TRANSACTIONS}/by_category_guids/${t.join(
131
+ "+"
132
+ )}/by_date/${a}/${e}?${o}`
133
+ ).then((n) => n.map((s) => s.transaction));
134
+ };
135
+ /**
136
+ * DEPRECATED
137
+ * Get all transactions by the top level category, between begin date and end date, and optionally
138
+ * filtered by accounts
139
+ * @param categoryGuid The top level category guid
140
+ * @param beginDate the start date
141
+ * @param endDate the end date
142
+ * @param accountGuids an optional list of account guids
143
+ */
144
+ getTransactionsByTopLevelCategoryAndDate = async (t, a, e, i = []) => {
145
+ console.warn("DEPRECATED: getTransactionsByTopLevelCategoryAndDate will be removed");
146
+ let o = `${c.TRANSACTIONS}/by_top_level_category_guid/${t}/by_date/${a}/${e}`;
147
+ if (i.length > 0) {
148
+ const n = i.reduce(
149
+ (s, r, g) => `${s}account_guids[]=${r}${g !== i.length - 1 ? "&" : ""}`,
150
+ ""
151
+ );
152
+ o += `?${n}`;
153
+ }
154
+ return this.fetchInstance.get(o).then((n) => n.map((s) => s.transaction));
155
+ };
156
+ removeTag = async (t) => this.fetchInstance.delete(`${c.TAGS}/${t}`).then((a) => a);
157
+ removeTagging = async (t) => this.fetchInstance.delete(`${c.TAGGINGS}/${t}`).then((a) => a);
158
+ removeTransaction = async (t) => this.fetchInstance.delete(`${c.TRANSACTIONS}/${t}`).then((a) => a);
159
+ removeTransactionSplit = async (t) => this.fetchInstance.delete(`${c.TRANSACTIONS}/${t}/unsplit`).then((a) => a);
160
+ updateTransactionRule = async (t) => this.fetchInstance.put(`${c.TRANSACTION_RULES}/${t.guid}`, t).then((a) => a);
161
+ updateTag = async (t) => this.fetchInstance.put(`${c.TAGS}/${t.guid}`, t).then((a) => a.tag);
162
+ updateTransaction = async (t) => this.fetchInstance.put(`${c.TRANSACTIONS}/${t.guid}`, t).then((a) => a.transaction);
163
+ }
164
+ const E = {
165
+ ASC: "ASC",
166
+ DESC: "DESC",
167
+ DIRECTION: {
168
+ ASC: "ascending",
169
+ DESC: "descending"
170
+ },
171
+ ALIGN: {
172
+ center: "center",
173
+ left: "flex-start",
174
+ right: "flex-end"
175
+ }
176
+ }, P = (d, t, a, e = []) => {
177
+ const i = t.reduce((s, r) => ({ ...s, [r.guid]: r }), {}), o = a.reduce((s, r) => ({ ...s, [r.guid]: r }), {}), n = e.reduce((s, r) => {
178
+ const { transaction_guid: g, tag_guid: h } = r;
179
+ if (!s[g])
180
+ return {
181
+ ...s,
182
+ [g]: [h]
183
+ };
184
+ const p = [...s[g], h];
185
+ return {
186
+ ...s,
187
+ [g]: p
188
+ };
189
+ }, {});
190
+ return d.map((s) => {
191
+ const r = i[s.account_guid], g = s.category_guid ? o[s.category_guid] : null, h = n[s.guid] ?? [];
192
+ return {
193
+ ...s,
194
+ account: r?.user_name || "Unknown",
195
+ accountIsClosed: r?.is_closed,
196
+ accountIsHidden: r?.is_hidden,
197
+ category: g?.name || "Uncategorized",
198
+ isIncome: s.top_level_category_guid === v.INCOME,
199
+ isPending: s.feed_status === x.PENDING,
200
+ number: r?.account_number || "",
201
+ payee: s.description,
202
+ tags: h
203
+ };
204
+ });
205
+ }, F = async (d, t) => !t || !_[d] ? null : t.sendAnalyticEvent(_[d]), S = {
206
+ FLAG: "flag",
207
+ DATE: "date",
208
+ PAYEE: "payee",
209
+ CATEGORY: "category",
210
+ ACCOUNT: "account",
211
+ AMOUNT: "amount"
212
+ }, V = "uncategorized", z = (d, t, a, e, i, o) => {
213
+ const n = Y(d, i, o), s = H(n, a, e);
214
+ return t.forEach((r) => {
215
+ const g = s.findIndex((p) => p.guid === r), h = o.filter((p) => p.parent_guid === r);
216
+ s.splice(g + 1, 0, ...h);
217
+ }), s;
218
+ }, Y = (d, t, a) => {
219
+ const {
220
+ accounts: e = [],
221
+ dateRange: i = { start: I(C()), end: f() },
222
+ custom: o = () => !0,
223
+ searchTerm: n = ""
224
+ } = d;
225
+ return a.filter((s) => !s.parent_guid).filter((s) => !!e.find((r) => r === s.account_guid)).filter((s) => s.date > A(i.start) && s.date < A(i.end)).filter(o).filter((s) => {
226
+ if (n === V && s.has_been_split)
227
+ return !1;
228
+ if (/^spl/i.test(n) && (s.has_been_split || s.parent_guid))
229
+ return !0;
230
+ const g = s.tags.some(
231
+ (p) => l(n, t.find(($) => $.guid === p)?.name)
232
+ ), h = y(s.date);
233
+ return l(n, s.payee) || l(n, s.feed_description) || l(n, s.category) || l(n, T(h, m.MONTH)) || l(n, T(h, m.DAY)) || l(n, T(h, m.FULL_MONTH_DAY)) || l(n, T(h, m.MONTH_DAY_YEAR)) || l(n, G(h, B)) || l(n, s.account) || l(n, `${s.amount}`) || l(n, s.memo) || g;
234
+ });
235
+ }, H = (d, t, a) => [...d].sort((e, i) => {
236
+ const o = t, n = (e[o] || "") > (i[o] || "");
237
+ let s = n ? -1 : 1, r = n ? 1 : -1;
238
+ return (t === S.DATE || t === S.AMOUNT) && (s = n ? 1 : -1, r = n ? -1 : 1), a === E.ASC ? s : r;
239
+ }), l = (d, t) => {
240
+ const a = d.toLowerCase().split(" "), e = t?.toString().toLowerCase() ?? "";
241
+ return a.every((i) => e.indexOf(i) > -1);
242
+ };
243
+ class j {
244
+ beginDate = I(/* @__PURE__ */ new Date());
245
+ endDate = M(/* @__PURE__ */ new Date());
246
+ expandedSplits = [];
247
+ isInitialized = !1;
248
+ height = 550;
249
+ width = 1e3;
250
+ shouldDisableDrawerScroll = !1;
251
+ searchValue = "";
252
+ selectedAccountGuids = [];
253
+ manualTransaction = L;
254
+ isAmountValid = !1;
255
+ showInsights = !1;
256
+ constructor() {
257
+ R(this);
258
+ }
259
+ setDateRange = (t, a) => {
260
+ this.beginDate = t, this.endDate = a;
261
+ };
262
+ setIsInitialized = (t) => this.isInitialized = t;
263
+ setIsAmountValid = (t) => this.isAmountValid = t;
264
+ setSearchValue = (t) => this.searchValue = t;
265
+ setSelectedAccountGuids = (t) => this.selectedAccountGuids = t;
266
+ setShouldDisableDrawerScroll = (t) => this.shouldDisableDrawerScroll = t;
267
+ setShowInsights = (t) => {
268
+ this.showInsights = t;
269
+ };
270
+ setSize = (t, a) => {
271
+ this.height = t, this.width = a;
272
+ };
273
+ toggleSplit = (t) => {
274
+ const a = [...this.expandedSplits], e = this.expandedSplits.findIndex((i) => i === t);
275
+ e >= 0 ? a.splice(e, 1) : a.push(t), this.expandedSplits = a;
276
+ };
277
+ updateManualTransaction = (t) => {
278
+ this.manualTransaction = t;
279
+ };
280
+ }
281
+ class Sa {
282
+ api = new w("/", "");
283
+ beatApi = new D("/", "");
284
+ globalStore;
285
+ uiStore;
286
+ isLoading = !0;
287
+ taggings = [];
288
+ tags = [];
289
+ transactionRules = [];
290
+ transactions = [];
291
+ associatedBeats = [];
292
+ cachedStartDate = O(C(), 90);
293
+ onAnalyticEvent = F;
294
+ sortColumn = S.DATE;
295
+ sortDirection = E.DESC;
296
+ filter = {};
297
+ constructor(t) {
298
+ this.globalStore = t, this.uiStore = new j(), R(this);
299
+ }
300
+ initialize = async (t, a) => {
301
+ this.api = new w(t, a), this.beatApi = new D(t, a), Promise.all([
302
+ this.loadAssociatedBeats(I(/* @__PURE__ */ new Date())),
303
+ this.loadTags(),
304
+ this.loadTaggings(),
305
+ this.loadTransactionRules(),
306
+ // By default loads 90 days of transactions
307
+ this.loadTransactions()
308
+ ]).then(() => this.uiStore.setIsInitialized(!0));
309
+ };
310
+ get sortedTransactions() {
311
+ return z(
312
+ this.filter,
313
+ this.uiStore.expandedSplits,
314
+ this.sortColumn,
315
+ this.sortDirection,
316
+ this.tags,
317
+ this.transactions
318
+ );
319
+ }
320
+ addTag = async (t) => {
321
+ await this.api.addTag({ name: t }), await this.loadTags();
322
+ };
323
+ addTagging = async (t, a) => {
324
+ await this.api.addTagging({
325
+ tag_guid: t,
326
+ transaction_guid: a
327
+ });
328
+ };
329
+ addOrUpdateTransactionRule = async (t, a) => {
330
+ const e = this.transactionRules.find(
331
+ (i) => i.guid === a.user_transaction_rule_guid
332
+ );
333
+ e ? await this.api.updateTransactionRule({
334
+ ...e,
335
+ category_guid: t,
336
+ description: a.description
337
+ }) : await this.api.addTransactionRule({
338
+ category_guid: t,
339
+ description: a.description,
340
+ match_description: a.description
341
+ }), await this.loadTransactionRules();
342
+ };
343
+ addTransaction = async (t) => {
344
+ const a = await this.api.addTransaction(t);
345
+ a && u(
346
+ () => this.transactions = this.augmentTransactions([a, ...this.transactions])
347
+ );
348
+ };
349
+ augmentTransactions = (t) => P(
350
+ t,
351
+ this.globalStore.accountStore.accounts,
352
+ this.globalStore.categoryStore.categories,
353
+ this.taggings
354
+ );
355
+ loadAssociatedBeats = async (t) => {
356
+ const a = t ? N(t, { representation: "date" }) : void 0, e = await this.beatApi.getBeatsWithAssociatedTransaction(a);
357
+ u(() => this.associatedBeats = e);
358
+ };
359
+ loadTags = async () => {
360
+ const t = await this.api.getTags();
361
+ u(() => this.tags = t);
362
+ };
363
+ loadTaggings = async () => {
364
+ const t = await this.api.getTaggings();
365
+ u(() => this.taggings = t);
366
+ };
367
+ loadTransactionRules = async () => {
368
+ const t = await this.api.getTransactionRules();
369
+ u(() => this.transactionRules = t);
370
+ };
371
+ loadTransactions = async (t = this.cachedStartDate, a = f()) => {
372
+ this.setIsLoading(!0), this.transactions = [];
373
+ try {
374
+ const e = await this.api.getTransactionsByDateRange(
375
+ A(t),
376
+ A(a)
377
+ );
378
+ u(() => {
379
+ this.transactions = this.augmentTransactions(e);
380
+ });
381
+ } catch (e) {
382
+ console.error(`Error occurred while loading transactions: ${e}`);
383
+ }
384
+ this.setIsLoading(!1);
385
+ };
386
+ // DEPRECATED
387
+ loadTransactionsByDateRange = async (t, a) => {
388
+ console.warn("DEPRECATED: loadTransactionsByDateRange will be removed"), this.setFilter({
389
+ ...this.filter,
390
+ dateRange: { start: y(a), end: y(t) }
391
+ });
392
+ };
393
+ removeTag = async (t) => {
394
+ await this.api.removeTag(t), await this.loadTags();
395
+ };
396
+ removeTagging = async (t) => {
397
+ await this.api.removeTagging(t);
398
+ };
399
+ removeTransaction = async (t) => {
400
+ await this.api.removeTransaction(t);
401
+ const a = this.transactions.findIndex((e) => e.guid === t);
402
+ if (a >= 0) {
403
+ const e = [...this.transactions];
404
+ e.splice(a, 1), u(() => this.transactions = e);
405
+ }
406
+ };
407
+ setFilter = (t) => {
408
+ this.filter = t, t.dateRange && b(t.dateRange.start, this.cachedStartDate) && this.loadTransactions(t.dateRange.start, f()).then(() => {
409
+ t.dateRange && (this.cachedStartDate = t.dateRange.start);
410
+ });
411
+ };
412
+ setIsLoading = (t) => this.isLoading = t;
413
+ setSortData = (t, a) => {
414
+ this.sortColumn = t, this.sortDirection = a;
415
+ };
416
+ splitTransaction = async (t, a) => {
417
+ const e = await this.api.updateTransaction(t), i = [];
418
+ for (let n = 0; n < a.length; n++) {
419
+ const s = await this.api.addTransaction(a[n]);
420
+ i.push(s);
421
+ }
422
+ const o = this.transactions.findIndex((n) => n.guid === t.guid);
423
+ o >= 0 && u(
424
+ () => this.transactions = this.augmentTransactions([
425
+ ...this.transactions.slice(0, o),
426
+ e,
427
+ ...this.transactions.slice(o + 1),
428
+ ...i
429
+ ])
430
+ );
431
+ };
432
+ unSplitTransaction = async (t) => {
433
+ const a = this.transactions.filter((n) => n.parent_guid === t);
434
+ await this.api.removeTransactionSplit(t);
435
+ const e = [...this.transactions];
436
+ a.forEach((n) => {
437
+ const s = e.findIndex((r) => r.guid === n.guid);
438
+ s >= 0 && e.splice(s, 1);
439
+ });
440
+ const i = e.findIndex((n) => n.guid === t), o = e[i];
441
+ o.has_been_split = !1, i >= 0 && u(
442
+ () => this.transactions = [
443
+ ...e.slice(0, i),
444
+ o,
445
+ ...e.slice(i + 1)
446
+ ]
447
+ );
448
+ };
449
+ updateTaggings = async (t, a) => {
450
+ for (let e = 0; e < t.length; e++) {
451
+ const i = t[e];
452
+ this.taggings.some((o) => o.tag_guid === i) || await this.addTagging(i, a);
453
+ }
454
+ for (let e = 0; e < this.taggings.length; e++) {
455
+ const i = this.taggings[e];
456
+ t.includes(i.tag_guid) || await this.removeTagging(i.guid);
457
+ }
458
+ await this.loadTaggings();
459
+ };
460
+ updateTag = async (t) => {
461
+ await this.api.updateTag(t), await this.loadTags();
462
+ };
463
+ updateTransaction = async (t) => {
464
+ const a = await this.api.updateTransaction(t), e = this.transactions.findIndex((i) => i.guid === t.guid);
465
+ e >= 0 && u(
466
+ () => this.transactions = this.augmentTransactions([
467
+ ...this.transactions.slice(0, e),
468
+ a,
469
+ ...this.transactions.slice(e + 1)
470
+ ])
471
+ );
472
+ };
473
+ }
474
+ export {
475
+ w as T,
476
+ Sa as a
477
+ };
478
+ //# sourceMappingURL=TransactionStore-BUrjBWkk.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransactionStore-BUrjBWkk.mjs","sources":["../src/transactions/api/TransactionApi.ts","../src/common/constants/Table.ts","../src/transactions/utils/buildDetailedTransactions.ts","../src/transactions/analytics.ts","../src/transactions/constants/TransactionsTable.ts","../src/transactions/utils/sortAndFilterTransactions.ts","../src/transactions/stores/UiStore.ts","../src/transactions/stores/TransactionStore.ts"],"sourcesContent":["import { Fetch } from '../../common'\nimport { ApiEndpoints } from '../../common'\n\nimport type { Tag, Tagging, Transaction, TransactionRule } from '../../common'\n\nexport class TransactionApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string) {\n this.fetchInstance = new Fetch(endpoint, token)\n }\n\n addTag = async (tag: Tag) => {\n return this.fetchInstance.post(ApiEndpoints.TAGS, tag).then((data) => data.tag)\n }\n\n addTagging = async (tagging: Tagging) => {\n return this.fetchInstance.post(ApiEndpoints.TAGGINGS, tagging).then((data) => data.tagging)\n }\n\n addTransaction = async (transaction: Transaction) => {\n return this.fetchInstance\n .post(ApiEndpoints.TRANSACTIONS, transaction)\n .then((data) => data.transaction)\n }\n\n addTransactionRule = async (rule: TransactionRule) => {\n return this.fetchInstance.post(ApiEndpoints.TRANSACTION_RULES, rule).then((data) => data)\n }\n\n getTaggings = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.TAGGINGS)\n .then((data) => data.map((item: { tagging: Tagging }) => item.tagging))\n }\n\n getTags = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.TAGS)\n .then((data) => data.map((item: { tag: Tag }) => item.tag))\n }\n\n getTransactionRules = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.TRANSACTION_RULES)\n .then((data) => data.transaction_rules)\n }\n\n getTransactionsByDateRange = async (startDate: number, endDate: number) => {\n return this.fetchInstance\n .get(`${ApiEndpoints.TRANSACTIONS}/by_date/${startDate}/${endDate}`)\n .then((data) => data.map((item: { transaction: Transaction }) => item.transaction))\n }\n\n // DEPRECATED\n getTransactionsByAccountsAndDateRange = async (\n accountGuids: string[],\n beginDate: number,\n endDate: number,\n ) => {\n console.warn('DEPRECATED: getTransactionsByAccountsAndDateRange will be removed')\n const accountsList = accountGuids.reduce(\n (acc: string, guid: string, i: number) =>\n `${acc}account_guids[]=${guid}${i !== accountGuids.length - 1 ? '&' : ''}`,\n '',\n )\n\n return this.fetchInstance\n .get(`${ApiEndpoints.TRANSACTIONS}/by_date/${beginDate}/${endDate}?${accountsList}`)\n .then((data) => data.map((item: { transaction: Transaction }) => item.transaction))\n }\n\n // DEPRECATED\n getTransactionsByGuids = async (guids: string[]) => {\n console.warn('DEPRECATED: getTransactionsByGuids will be removed')\n return this.fetchInstance\n .post(`${ApiEndpoints.TRANSACTIONS}/by_guids`, { guids: guids.join('+') })\n .then((data) => data.map((item: { transaction: Transaction }) => item.transaction))\n }\n\n // DEPRECATED\n getTransactionsByCategoryAndDate = async (\n categoryGuid: string,\n beginDate: number,\n endDate: number,\n ) => {\n console.warn('DEPRECATED: getTransactionsByCategoryAndDate will be removed')\n return this.fetchInstance\n .get(\n `${ApiEndpoints.TRANSACTIONS}/by_category_guid/${categoryGuid}/by_date/${beginDate}/${endDate}`,\n )\n .then((data) => data.map((item: { transaction: Transaction }) => item.transaction))\n }\n\n // DEPRECATED\n getTransactionsByCategoryDateAndAccounts = async (\n categoryGuid: string,\n beginDate: number,\n endDate: number,\n accountGuids: string[],\n ) => {\n console.warn('DEPRECATED: getTransactionsByCategoryDateAndAccounts will be removed')\n const accountsList = accountGuids.reduce(\n (acc: string, guid: string, i: number) =>\n `${acc}account_guids[]=${guid}${i !== accountGuids.length - 1 ? '&' : ''}`,\n '',\n )\n\n return this.fetchInstance\n .get(\n `${ApiEndpoints.TRANSACTIONS}/by_category_guid/${categoryGuid}/by_date/${beginDate}/${endDate}?${accountsList}`,\n )\n .then((data) => data.map((item: { transaction: Transaction }) => item.transaction))\n }\n\n // DEPRECATED\n getTransactionsByCategoriesDateAndAccounts = async (\n categoryGuids: string[],\n beginDate: number,\n endDate: number,\n accountGuids: string[],\n ) => {\n console.warn('DEPRECATED: getTransactionsByCategoriesDateAndAccounts will be removed')\n const accountsList = accountGuids.reduce(\n (acc: string, guid: string, i: number) =>\n `${acc}account_guids[]=${guid}${i !== accountGuids.length - 1 ? '&' : ''}`,\n '',\n )\n\n return this.fetchInstance\n .get(\n `${ApiEndpoints.TRANSACTIONS}/by_category_guids/${categoryGuids.join(\n '+',\n )}/by_date/${beginDate}/${endDate}?${accountsList}`,\n )\n .then((data) => data.map((item: { transaction: Transaction }) => item.transaction))\n }\n\n /**\n * DEPRECATED\n * Get all transactions by the top level category, between begin date and end date, and optionally\n * filtered by accounts\n * @param categoryGuid The top level category guid\n * @param beginDate the start date\n * @param endDate the end date\n * @param accountGuids an optional list of account guids\n */\n getTransactionsByTopLevelCategoryAndDate = async (\n categoryGuid: string,\n beginDate: number,\n endDate: number,\n accountGuids: string[] = [],\n ) => {\n console.warn('DEPRECATED: getTransactionsByTopLevelCategoryAndDate will be removed')\n let url = `${ApiEndpoints.TRANSACTIONS}/by_top_level_category_guid/${categoryGuid}/by_date/${beginDate}/${endDate}`\n\n if (accountGuids.length > 0) {\n const accountsList = accountGuids.reduce(\n (acc: string, guid: string, i: number) =>\n `${acc}account_guids[]=${guid}${i !== accountGuids.length - 1 ? '&' : ''}`,\n '',\n )\n url += `?${accountsList}`\n }\n\n return this.fetchInstance\n .get(url)\n .then((data) => data.map((item: { transaction: Transaction }) => item.transaction))\n }\n\n removeTag = async (guid: string) => {\n return this.fetchInstance.delete(`${ApiEndpoints.TAGS}/${guid}`).then((data) => data)\n }\n\n removeTagging = async (guid: string) => {\n return this.fetchInstance.delete(`${ApiEndpoints.TAGGINGS}/${guid}`).then((data) => data)\n }\n\n removeTransaction = async (guid: string) => {\n return this.fetchInstance.delete(`${ApiEndpoints.TRANSACTIONS}/${guid}`).then((data) => data)\n }\n\n removeTransactionSplit = async (guid: string) => {\n return this.fetchInstance\n .delete(`${ApiEndpoints.TRANSACTIONS}/${guid}/unsplit`)\n .then((data) => data)\n }\n\n updateTransactionRule = async (rule: TransactionRule) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.TRANSACTION_RULES}/${rule.guid}`, rule)\n .then((data) => data)\n }\n\n updateTag = async (tag: Tag) => {\n return this.fetchInstance.put(`${ApiEndpoints.TAGS}/${tag.guid}`, tag).then((data) => data.tag)\n }\n\n updateTransaction = async (transaction: Transaction) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.TRANSACTIONS}/${transaction.guid}`, transaction)\n .then((data) => data.transaction)\n }\n}\n","export const TABLE_CONST = {\n ASC: 'ASC',\n DESC: 'DESC',\n DIRECTION: {\n ASC: 'ascending',\n DESC: 'descending',\n },\n ALIGN: {\n center: 'center',\n left: 'flex-start',\n right: 'flex-end',\n },\n}\n","import { CategoryGuids, TransactionStatus } from '../../common'\n\nimport type { Account, Category, Tagging, Transaction } from '../../common'\n\ninterface AccountsMap {\n [key: string]: Account\n}\n\ninterface CategoriesMap {\n [key: string]: Category\n}\n\ninterface TaggingsMap {\n [key: string]: string[]\n}\n\nexport const buildDetailedTransactions = (\n transactions: Transaction[],\n accounts: Account[],\n categories: Category[],\n taggings: Tagging[] = [],\n) => {\n const accountsMap = accounts.reduce((acc: AccountsMap, account: Account) => {\n return { ...acc, [account.guid]: account }\n }, {})\n\n const categoriesMap = categories.reduce((acc: CategoriesMap, category: Category) => {\n return { ...acc, [category.guid]: category }\n }, {})\n\n const taggingsMap = taggings.reduce((acc: TaggingsMap, tagging: Tagging) => {\n const { transaction_guid, tag_guid } = tagging\n\n if (!acc[transaction_guid]) {\n return {\n ...acc,\n [transaction_guid]: [tag_guid],\n }\n }\n const tags = [...acc[transaction_guid], tag_guid] as string[]\n\n return {\n ...acc,\n [transaction_guid]: tags,\n }\n }, {})\n\n return transactions.map((transaction: Transaction) => {\n const account = accountsMap[transaction.account_guid]\n const category = transaction.category_guid ? categoriesMap[transaction.category_guid] : null\n const tags = taggingsMap[transaction.guid] ?? []\n\n return {\n ...transaction,\n account: account?.user_name || 'Unknown',\n accountIsClosed: account?.is_closed,\n accountIsHidden: account?.is_hidden,\n category: category?.name || 'Uncategorized',\n isIncome: transaction.top_level_category_guid === CategoryGuids.INCOME,\n isPending: transaction.feed_status === TransactionStatus.PENDING,\n number: account?.account_number || '',\n payee: transaction.description,\n tags,\n }\n })\n}\n","import { analyticsSession } from '../common'\nimport { AnalyticsEventsObjectType } from '../common/types/Analytics'\n\nimport { ANALYTICS_EVENTS } from './constants/Analytics'\n\nexport type AnalyticSession = Awaited<ReturnType<typeof analyticsSession>>\n\nexport const onAnalyticEvent = async (event: string, session: AnalyticSession | null) => {\n if (!session || !ANALYTICS_EVENTS[event]) return null\n\n return session.sendAnalyticEvent(ANALYTICS_EVENTS[event] as AnalyticsEventsObjectType)\n}\n","export const ROW_HEIGHT = 48\n\nconst FLAG_COLUMN_WIDTH = 24\nconst DATE_COLUMN_WIDTH = 64\nconst AMOUNT_COLUMN_WIDTH = 112\nconst VARIABLE_COLUMN_WIDTH = `calc((100% - ${\n FLAG_COLUMN_WIDTH + DATE_COLUMN_WIDTH + AMOUNT_COLUMN_WIDTH\n}px) / 3)`\n\nexport const COLUMN_WIDTH = {\n FLAG: FLAG_COLUMN_WIDTH, // Fixed width\n DATE: DATE_COLUMN_WIDTH, // Fixed width\n PAYEE: VARIABLE_COLUMN_WIDTH, // 1/3 of remaining width\n CATEGORY: VARIABLE_COLUMN_WIDTH, // 1/3 of remaining width\n ACCOUNT: VARIABLE_COLUMN_WIDTH, // 1/3 of remaining width\n AMOUNT: AMOUNT_COLUMN_WIDTH, // Fixed width\n}\n\nexport const COLUMN_NAMES = {\n FLAG: 'flag',\n DATE: 'date',\n PAYEE: 'payee',\n CATEGORY: 'category',\n ACCOUNT: 'account',\n AMOUNT: 'amount',\n}\n","import { endOfToday } from 'date-fns/endOfToday'\nimport { format } from 'date-fns/format'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\n\nimport { TABLE_CONST } from '../../common/constants/Table'\nimport { DATE_FORMATS_INTL, formatDate, ORDINAL_DATE_FORMAT, Tag, Transaction } from '../../common'\n\nimport { COLUMN_NAMES } from '../constants/TransactionsTable'\nimport { type TransactionFilter } from '../stores/TransactionStore'\n\nconst UNCATEGORIZED_TERM = 'uncategorized'\n\nexport const sortAndFilterTransactions = (\n filter: TransactionFilter,\n expandedSplits: string[],\n sortColumn: string,\n sortDirection: string,\n tags: Tag[],\n transactions: Transaction[],\n) => {\n const filteredTransactions = filterTransactions(filter, tags, transactions)\n\n const sortedTransactions = sortTransactions(filteredTransactions, sortColumn, sortDirection)\n\n expandedSplits.forEach((guid) => {\n const index = sortedTransactions.findIndex((t) => t.guid === guid)\n const children = transactions.filter((t) => t.parent_guid === guid)\n sortedTransactions.splice(index + 1, 0, ...children)\n })\n return sortedTransactions\n}\n\nconst filterTransactions = (\n filter: TransactionFilter,\n tags: Tag[],\n transactions: Transaction[],\n) => {\n const {\n accounts = [],\n dateRange = { start: startOfMonth(startOfToday()), end: endOfToday() },\n custom = () => true,\n searchTerm: searchFilter = '',\n } = filter\n\n return (\n transactions\n // Filters out Split transaction children\n .filter((t) => !t.parent_guid)\n // Filter for selected accounts\n .filter((t) => Boolean(accounts.find((guid) => guid === t.account_guid)))\n // Filter for Date Range\n .filter((t) => t.date > getUnixTime(dateRange.start) && t.date < getUnixTime(dateRange.end))\n // Custom filter\n .filter(custom)\n // Search filter\n .filter((transaction) => {\n // Don't return uncategorized split transactions\n if (searchFilter === UNCATEGORIZED_TERM && transaction.has_been_split) {\n return false\n }\n\n // Split check - When searching for \"Splits\" and transaction is a split or is a parent of a split(s)\n const splitPattern = /^spl/i\n if (\n splitPattern.test(searchFilter) &&\n (transaction.has_been_split || Boolean(transaction.parent_guid))\n ) {\n return true\n }\n\n // Check transactions tags\n const isTagIncludedInSearch = transaction.tags.some((guid) =>\n isIncludedInSearch(searchFilter, tags.find((tag) => tag.guid === guid)?.name),\n )\n\n const date = fromUnixTime(transaction.date)\n return (\n isIncludedInSearch(searchFilter, transaction.payee) ||\n isIncludedInSearch(searchFilter, transaction.feed_description) ||\n isIncludedInSearch(searchFilter, transaction.category) ||\n isIncludedInSearch(searchFilter, formatDate(date, DATE_FORMATS_INTL.MONTH)) ||\n isIncludedInSearch(searchFilter, formatDate(date, DATE_FORMATS_INTL.DAY)) ||\n isIncludedInSearch(searchFilter, formatDate(date, DATE_FORMATS_INTL.FULL_MONTH_DAY)) ||\n isIncludedInSearch(searchFilter, formatDate(date, DATE_FORMATS_INTL.MONTH_DAY_YEAR)) ||\n isIncludedInSearch(searchFilter, format(date, ORDINAL_DATE_FORMAT)) ||\n isIncludedInSearch(searchFilter, transaction.account) ||\n isIncludedInSearch(searchFilter, `${transaction.amount}`) ||\n isIncludedInSearch(searchFilter, transaction.memo) ||\n isTagIncludedInSearch\n )\n })\n )\n}\n\nconst sortTransactions = (\n transactions: Transaction[],\n sortColumn: string,\n sortDirection: string,\n) => {\n return [...transactions].sort((a: Transaction, b: Transaction) => {\n const column = sortColumn as keyof Transaction\n const sortCompare = (a[column] || '') > (b[column] || '')\n\n let sortASC = sortCompare ? -1 : 1\n let sortDESC = sortCompare ? 1 : -1\n\n if (sortColumn === COLUMN_NAMES.DATE || sortColumn === COLUMN_NAMES.AMOUNT) {\n sortASC = sortCompare ? 1 : -1\n sortDESC = sortCompare ? -1 : 1\n }\n\n return sortDirection === TABLE_CONST.ASC ? sortASC : sortDESC\n })\n}\n\n/**\n * Determines if a value is included within the terms set in the search bar\n */\nconst isIncludedInSearch = (searchFilter: string, value: string | null | undefined) => {\n const lowerCasedTerms = searchFilter.toLowerCase().split(' ')\n const lowerCasedValue = value?.toString().toLowerCase() ?? ''\n\n return lowerCasedTerms.every((filter) => lowerCasedValue.indexOf(filter) > -1)\n}\n","import { makeAutoObservable } from 'mobx'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { endOfMonth } from 'date-fns/endOfMonth'\n\nimport type { Transaction } from '../../common'\n\nimport { DEFAULT_TRANSACTION } from '../constants/Transaction'\n\nexport class UiStore {\n beginDate = startOfMonth(new Date())\n endDate = endOfMonth(new Date())\n\n expandedSplits = [] as string[]\n isInitialized = false\n height = 550\n width = 1000\n shouldDisableDrawerScroll = false\n\n searchValue = ''\n selectedAccountGuids = [] as string[]\n\n manualTransaction: Transaction = DEFAULT_TRANSACTION\n isAmountValid = false\n\n showInsights = false\n\n constructor() {\n makeAutoObservable(this)\n }\n\n setDateRange = (beginDate: Date, endDate: Date) => {\n this.beginDate = beginDate\n this.endDate = endDate\n }\n\n setIsInitialized = (isInitialized: boolean) => (this.isInitialized = isInitialized)\n\n setIsAmountValid = (valid: boolean) => (this.isAmountValid = valid)\n\n setSearchValue = (searchValue: string) => (this.searchValue = searchValue)\n\n setSelectedAccountGuids = (accountGuids: string[]) => (this.selectedAccountGuids = accountGuids)\n\n setShouldDisableDrawerScroll = (shouldDisable: boolean) =>\n (this.shouldDisableDrawerScroll = shouldDisable)\n\n setShowInsights = (showInsights: boolean) => {\n this.showInsights = showInsights\n }\n\n setSize = (height: number, width: number) => {\n this.height = height\n this.width = width\n }\n\n toggleSplit = (guid: string) => {\n const expandedSplits = [...this.expandedSplits]\n const index = this.expandedSplits.findIndex((splitGuid) => splitGuid === guid)\n\n if (index >= 0) {\n expandedSplits.splice(index, 1)\n } else {\n expandedSplits.push(guid)\n }\n\n this.expandedSplits = expandedSplits\n }\n\n updateManualTransaction = (manualTransaction: Transaction) => {\n this.manualTransaction = manualTransaction\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { endOfToday } from 'date-fns/endOfToday'\nimport { formatISO } from 'date-fns/formatISO'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { isBefore } from 'date-fns/isBefore'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { subDays } from 'date-fns/subDays'\n\nimport { TABLE_CONST } from '../../common/constants/Table'\n\nimport { BeatApi } from '../../common'\nimport type { Beat, GlobalStore, Tag, Tagging, Transaction, TransactionRule } from '../../common'\n\nimport { buildDetailedTransactions } from '../utils/buildDetailedTransactions'\nimport { onAnalyticEvent } from '../analytics'\nimport { TransactionApi } from '../api/TransactionApi'\nimport { COLUMN_NAMES } from '../constants/TransactionsTable'\nimport { sortAndFilterTransactions } from '../utils/sortAndFilterTransactions'\nimport { UiStore } from './UiStore'\n\nexport type TransactionFilter = {\n accounts?: string[]\n dateRange?: { start: Date; end: Date }\n custom?: (value: Transaction) => boolean\n searchTerm?: string\n}\n\nexport class TransactionStore {\n api = new TransactionApi('/', '')\n beatApi = new BeatApi('/', '')\n\n globalStore: GlobalStore\n uiStore: UiStore\n\n isLoading = true\n taggings: Tagging[] = []\n tags: Tag[] = []\n transactionRules: TransactionRule[] = []\n transactions: Transaction[] = []\n\n associatedBeats: Beat[] = []\n\n cachedStartDate: Date = subDays(startOfToday(), 90)\n\n onAnalyticEvent = onAnalyticEvent\n sortColumn = COLUMN_NAMES.DATE\n sortDirection = TABLE_CONST.DESC\n\n filter: TransactionFilter = {}\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.uiStore = new UiStore()\n\n makeAutoObservable(this)\n }\n\n initialize = async (endpoint: string, token: string) => {\n this.api = new TransactionApi(endpoint, token)\n this.beatApi = new BeatApi(endpoint, token)\n\n Promise.all([\n this.loadAssociatedBeats(startOfMonth(new Date())),\n this.loadTags(),\n this.loadTaggings(),\n this.loadTransactionRules(),\n // By default loads 90 days of transactions\n this.loadTransactions(),\n ]).then(() => this.uiStore.setIsInitialized(true))\n }\n\n get sortedTransactions(): Transaction[] {\n return sortAndFilterTransactions(\n this.filter,\n this.uiStore.expandedSplits,\n this.sortColumn,\n this.sortDirection,\n this.tags,\n this.transactions,\n )\n }\n\n addTag = async (name: string) => {\n await this.api.addTag({ name } as Tag)\n await this.loadTags()\n }\n\n addTagging = async (tagGuid: string, transactionGuid: string) => {\n await this.api.addTagging({\n tag_guid: tagGuid,\n transaction_guid: transactionGuid,\n } as Tagging)\n }\n\n addOrUpdateTransactionRule = async (categoryGuid: string, transaction: Transaction) => {\n const existingRule = this.transactionRules.find(\n (rule: TransactionRule) => rule.guid === transaction.user_transaction_rule_guid,\n ) as TransactionRule | undefined\n\n if (existingRule) {\n await this.api.updateTransactionRule({\n ...existingRule,\n category_guid: categoryGuid,\n description: transaction.description,\n } as TransactionRule)\n } else {\n await this.api.addTransactionRule({\n category_guid: categoryGuid,\n description: transaction.description,\n match_description: transaction.description,\n } as TransactionRule)\n }\n await this.loadTransactionRules()\n }\n\n addTransaction = async (transaction: Transaction) => {\n const newTransaction = await this.api.addTransaction(transaction)\n\n if (newTransaction) {\n runInAction(\n () =>\n (this.transactions = this.augmentTransactions([newTransaction, ...this.transactions])),\n )\n }\n }\n\n augmentTransactions = (transactions: Transaction[]) => {\n return buildDetailedTransactions(\n transactions,\n this.globalStore.accountStore.accounts,\n this.globalStore.categoryStore.categories,\n this.taggings,\n )\n }\n\n loadAssociatedBeats = async (fromDate?: Date) => {\n const fromDateISO = fromDate ? formatISO(fromDate, { representation: 'date' }) : undefined\n const beats = await this.beatApi.getBeatsWithAssociatedTransaction(fromDateISO)\n runInAction(() => (this.associatedBeats = beats))\n }\n\n loadTags = async () => {\n const tags = await this.api.getTags()\n runInAction(() => (this.tags = tags))\n }\n\n loadTaggings = async () => {\n const taggings = await this.api.getTaggings()\n runInAction(() => (this.taggings = taggings))\n }\n\n loadTransactionRules = async () => {\n const transactionRules = await this.api.getTransactionRules()\n runInAction(() => (this.transactionRules = transactionRules))\n }\n\n loadTransactions = async (\n startDate: Date = this.cachedStartDate,\n endDate: Date = endOfToday(),\n ) => {\n this.setIsLoading(true)\n this.transactions = []\n\n try {\n const transactions = await this.api.getTransactionsByDateRange(\n getUnixTime(startDate),\n getUnixTime(endDate),\n )\n runInAction(() => {\n this.transactions = this.augmentTransactions(transactions)\n })\n } catch (error) {\n console.error(`Error occurred while loading transactions: ${error}`)\n }\n this.setIsLoading(false)\n }\n\n // DEPRECATED\n loadTransactionsByDateRange = async (endDate: number, startDate: number) => {\n console.warn('DEPRECATED: loadTransactionsByDateRange will be removed')\n this.setFilter({\n ...this.filter,\n dateRange: { start: fromUnixTime(startDate), end: fromUnixTime(endDate) },\n })\n }\n\n removeTag = async (tagGuid: string) => {\n await this.api.removeTag(tagGuid)\n await this.loadTags()\n }\n\n removeTagging = async (taggingGuid: string) => {\n await this.api.removeTagging(taggingGuid)\n }\n\n removeTransaction = async (transactionGuid: string) => {\n await this.api.removeTransaction(transactionGuid)\n\n const index = this.transactions.findIndex((t: Transaction) => t.guid === transactionGuid)\n\n if (index >= 0) {\n const updatedTransactions = [...this.transactions]\n updatedTransactions.splice(index, 1)\n runInAction(() => (this.transactions = updatedTransactions))\n }\n }\n\n setFilter = (filter: TransactionFilter) => {\n this.filter = filter\n\n // Only reload transactions if new start date is prior to the current cached start date\n // Cached date range end date is always today\n if (filter.dateRange && isBefore(filter.dateRange.start, this.cachedStartDate)) {\n this.loadTransactions(filter.dateRange.start, endOfToday()).then(() => {\n if (filter.dateRange) {\n this.cachedStartDate = filter.dateRange.start\n }\n })\n }\n }\n\n setIsLoading = (isLoading: boolean) => (this.isLoading = isLoading)\n\n setSortData = (sortColumn: string, sortDirection: string) => {\n this.sortColumn = sortColumn\n this.sortDirection = sortDirection\n }\n\n splitTransaction = async (transaction: Transaction, splits: Transaction[]) => {\n const updatedTransaction = await this.api.updateTransaction(transaction)\n const children = [] as Transaction[]\n\n for (let i = 0; i < splits.length; i++) {\n const child = await this.api.addTransaction(splits[i])\n children.push(child)\n }\n\n const index = this.transactions.findIndex((t: Transaction) => t.guid === transaction.guid)\n\n if (index >= 0) {\n runInAction(\n () =>\n (this.transactions = this.augmentTransactions([\n ...this.transactions.slice(0, index),\n updatedTransaction,\n ...this.transactions.slice(index + 1),\n ...children,\n ])),\n )\n }\n }\n\n unSplitTransaction = async (guid: string) => {\n const children = this.transactions.filter((t) => t.parent_guid === guid)\n\n await this.api.removeTransactionSplit(guid)\n\n // Remove children\n const transactions = [...this.transactions]\n children.forEach((child) => {\n const index = transactions.findIndex((t) => t.guid === child.guid)\n\n if (index >= 0) {\n transactions.splice(index, 1)\n }\n })\n\n // Update parent\n const index = transactions.findIndex((t) => t.guid === guid)\n const transaction = transactions[index]\n transaction.has_been_split = false\n if (index >= 0) {\n runInAction(\n () =>\n (this.transactions = [\n ...transactions.slice(0, index),\n transaction,\n ...transactions.slice(index + 1),\n ]),\n )\n }\n }\n\n updateTaggings = async (tagGuids: string[], transactionGuid: string) => {\n // Add tags that don't current exist in taggings\n for (let i = 0; i < tagGuids.length; i++) {\n const tagGuid = tagGuids[i]\n if (!this.taggings.some((tagging: Tagging) => tagging.tag_guid === tagGuid)) {\n await this.addTagging(tagGuid, transactionGuid)\n }\n }\n\n // Remove tags that are in taggings but not in tagGuids\n for (let i = 0; i < this.taggings.length; i++) {\n const tagging = this.taggings[i]\n if (!tagGuids.includes(tagging.tag_guid)) {\n await this.removeTagging(tagging.guid)\n }\n }\n\n await this.loadTaggings()\n }\n\n updateTag = async (tag: Tag) => {\n await this.api.updateTag(tag)\n await this.loadTags()\n }\n\n updateTransaction = async (transaction: Transaction) => {\n const updatedTransaction = await this.api.updateTransaction(transaction)\n\n const index = this.transactions.findIndex((t: Transaction) => t.guid === transaction.guid)\n\n if (index >= 0) {\n runInAction(\n () =>\n (this.transactions = this.augmentTransactions([\n ...this.transactions.slice(0, index),\n updatedTransaction,\n ...this.transactions.slice(index + 1),\n ])),\n )\n }\n }\n}\n"],"names":["TransactionApi","endpoint","token","Fetch","tag","ApiEndpoints","data","tagging","transaction","rule","item","startDate","endDate","accountGuids","beginDate","accountsList","acc","guid","i","guids","categoryGuid","categoryGuids","url","TABLE_CONST","buildDetailedTransactions","transactions","accounts","categories","taggings","accountsMap","account","categoriesMap","category","taggingsMap","transaction_guid","tag_guid","tags","CategoryGuids","TransactionStatus","onAnalyticEvent","event","session","ANALYTICS_EVENTS","COLUMN_NAMES","UNCATEGORIZED_TERM","sortAndFilterTransactions","filter","expandedSplits","sortColumn","sortDirection","filteredTransactions","filterTransactions","sortedTransactions","sortTransactions","index","t","children","dateRange","startOfMonth","startOfToday","endOfToday","custom","searchFilter","getUnixTime","isTagIncludedInSearch","isIncludedInSearch","date","fromUnixTime","formatDate","DATE_FORMATS_INTL","format","ORDINAL_DATE_FORMAT","a","b","column","sortCompare","sortASC","sortDESC","value","lowerCasedTerms","lowerCasedValue","UiStore","endOfMonth","DEFAULT_TRANSACTION","makeAutoObservable","isInitialized","valid","searchValue","shouldDisable","showInsights","height","width","splitGuid","manualTransaction","TransactionStore","BeatApi","subDays","globalStore","name","tagGuid","transactionGuid","existingRule","newTransaction","runInAction","fromDate","fromDateISO","formatISO","beats","transactionRules","error","taggingGuid","updatedTransactions","isBefore","isLoading","splits","updatedTransaction","child","tagGuids"],"mappings":"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"}