@mx-cartographer/experiences 6.26.1-alpha.mega1 → 6.26.1
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/CHANGELOG.md +9 -5
- package/dist/categories/util/CategoryUtil.d.ts +2 -3
- package/dist/common/context/hooks.d.ts +13 -13
- package/dist/common/types/Category.d.ts +8 -2
- package/dist/common/types/index.d.ts +1 -1
- package/dist/help/components/content/section/index.d.ts +15 -15
- package/dist/index.d.ts +22 -0
- package/dist/index.es.js +29896 -0
- package/dist/index.es.js.map +1 -0
- package/dist/trends/components/CategoriesList.d.ts +5 -5
- package/dist/trends/components/CategoriesListItem.d.ts +4 -7
- package/dist/trends/components/CategoryDetailChart.d.ts +1 -5
- package/dist/trends/stores/TrendsStore.d.ts +16 -11
- package/package.json +3 -91
- package/dist/AccountStore-DkL93tXL.mjs +0 -317
- package/dist/AccountStore-DkL93tXL.mjs.map +0 -1
- package/dist/BudgetUtil-CVqAdv-j.mjs +0 -187
- package/dist/BudgetUtil-CVqAdv-j.mjs.map +0 -1
- package/dist/CashflowStore-gPEEBiXo.mjs +0 -53
- package/dist/CashflowStore-gPEEBiXo.mjs.map +0 -1
- package/dist/CategoryStore-m7oieLzP.mjs +0 -260
- package/dist/CategoryStore-m7oieLzP.mjs.map +0 -1
- package/dist/ConnectMiniWidget-CQWafYtQ.mjs +0 -22966
- package/dist/ConnectMiniWidget-CQWafYtQ.mjs.map +0 -1
- package/dist/DebtsStore-cUhIgJx6.mjs +0 -145
- package/dist/DebtsStore-cUhIgJx6.mjs.map +0 -1
- package/dist/Donut-CGNFni9y.mjs +0 -58
- package/dist/Donut-CGNFni9y.mjs.map +0 -1
- package/dist/FinstrongStore-BDG7l0nI.mjs +0 -183
- package/dist/FinstrongStore-BDG7l0nI.mjs.map +0 -1
- package/dist/GoalStore-o2waGeyf.mjs +0 -293
- package/dist/GoalStore-o2waGeyf.mjs.map +0 -1
- package/dist/Loader-CwdK8lfx.mjs +0 -147
- package/dist/Loader-CwdK8lfx.mjs.map +0 -1
- package/dist/MerchantStore-Cck9IGIH.mjs +0 -125
- package/dist/MerchantStore-Cck9IGIH.mjs.map +0 -1
- package/dist/NetWorthStore-D5eUfGQt.mjs +0 -66
- package/dist/NetWorthStore-D5eUfGQt.mjs.map +0 -1
- package/dist/NotificationStore-DCxw8W7u.mjs +0 -141
- package/dist/NotificationStore-DCxw8W7u.mjs.map +0 -1
- package/dist/RecurringTransactionsStore-Bijrgllq.mjs +0 -337
- package/dist/RecurringTransactionsStore-Bijrgllq.mjs.map +0 -1
- package/dist/SettingsStore-BhOYgUOa.mjs +0 -352
- package/dist/SettingsStore-BhOYgUOa.mjs.map +0 -1
- package/dist/TransactionApi-Dnbyi1JL.mjs +0 -175
- package/dist/TransactionApi-Dnbyi1JL.mjs.map +0 -1
- package/dist/TransactionStore-CiEtt5XJ.mjs +0 -417
- package/dist/TransactionStore-CiEtt5XJ.mjs.map +0 -1
- package/dist/TrendsStore-Idq3QfoA.mjs +0 -131
- package/dist/TrendsStore-Idq3QfoA.mjs.map +0 -1
- package/dist/accounts/index.es.js +0 -18
- package/dist/accounts/index.es.js.map +0 -1
- package/dist/analytics/index.es.js +0 -170
- package/dist/analytics/index.es.js.map +0 -1
- package/dist/budgets/index.es.js +0 -1116
- package/dist/budgets/index.es.js.map +0 -1
- package/dist/cashflow/index.es.js +0 -118
- package/dist/cashflow/index.es.js.map +0 -1
- package/dist/categories/index.es.js +0 -10
- package/dist/categories/index.es.js.map +0 -1
- package/dist/common/index.es.js +0 -1549
- package/dist/common/index.es.js.map +0 -1
- package/dist/dashboard/index.es.js +0 -257
- package/dist/dashboard/index.es.js.map +0 -1
- package/dist/debts/index.es.js +0 -9
- package/dist/debts/index.es.js.map +0 -1
- package/dist/finstrong/index.es.js +0 -11
- package/dist/finstrong/index.es.js.map +0 -1
- package/dist/goals/index.es.js +0 -9
- package/dist/goals/index.es.js.map +0 -1
- package/dist/help/index.es.js +0 -6
- package/dist/help/index.es.js.map +0 -1
- package/dist/investments/index.es.js +0 -1694
- package/dist/investments/index.es.js.map +0 -1
- package/dist/merchants/index.es.js +0 -7
- package/dist/merchants/index.es.js.map +0 -1
- package/dist/microinsights/index.es.js +0 -21
- package/dist/microinsights/index.es.js.map +0 -1
- package/dist/networth/index.es.js +0 -11
- package/dist/networth/index.es.js.map +0 -1
- package/dist/notifications/index.es.js +0 -116
- package/dist/notifications/index.es.js.map +0 -1
- package/dist/recurringtransactions/index.es.js +0 -14
- package/dist/recurringtransactions/index.es.js.map +0 -1
- package/dist/settings/index.es.js +0 -112
- package/dist/settings/index.es.js.map +0 -1
- package/dist/spending/index.es.js +0 -632
- package/dist/spending/index.es.js.map +0 -1
- package/dist/transactions/index.es.js +0 -19
- package/dist/transactions/index.es.js.map +0 -1
- package/dist/trends/index.es.js +0 -10
- package/dist/trends/index.es.js.map +0 -1
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
import "bowser";
|
|
2
|
-
import "date-fns/getUnixTime";
|
|
3
|
-
import "date-fns/intlFormat";
|
|
4
|
-
import "react";
|
|
5
|
-
import "react/jsx-runtime";
|
|
6
|
-
import "@mui/material/Button";
|
|
7
|
-
import "@mxenabled/mxui";
|
|
8
|
-
import "@mui/material/Tooltip";
|
|
9
|
-
import "@mui/material/Box";
|
|
10
|
-
import "@mui/material/IconButton";
|
|
11
|
-
import { aK as g, aL as c, aM as d } from "./ConnectMiniWidget-CQWafYtQ.mjs";
|
|
12
|
-
import { u as _ } from "./Loader-CwdK8lfx.mjs";
|
|
13
|
-
import "@mui/material/styles/useTheme";
|
|
14
|
-
import "@mui/material/useMediaQuery";
|
|
15
|
-
import "@mxenabled/cssinjs";
|
|
16
|
-
import "date-fns/addDays";
|
|
17
|
-
import "date-fns/addMonths";
|
|
18
|
-
import "date-fns/eachDayOfInterval";
|
|
19
|
-
import "date-fns/eachWeekOfInterval";
|
|
20
|
-
import "date-fns/endOfMonth";
|
|
21
|
-
import "date-fns/format";
|
|
22
|
-
import "date-fns/isBefore";
|
|
23
|
-
import "date-fns/isSameMonth";
|
|
24
|
-
import "date-fns/startOfMonth";
|
|
25
|
-
import "date-fns/startOfToday";
|
|
26
|
-
import "date-fns/subMonths";
|
|
27
|
-
import "@mui/material/Paper";
|
|
28
|
-
import "@mxenabled/mx-icons";
|
|
29
|
-
import "date-fns/isSameDay";
|
|
30
|
-
import "date-fns/isWithinInterval";
|
|
31
|
-
import "d3";
|
|
32
|
-
import "@mui/material/styles";
|
|
33
|
-
import "@mui/x-charts";
|
|
34
|
-
import "@mui/material";
|
|
35
|
-
import "@mui/x-charts/ChartsTooltip";
|
|
36
|
-
import "@mui/material/Stack";
|
|
37
|
-
import "date-fns/addYears";
|
|
38
|
-
import "date-fns/differenceInCalendarDays";
|
|
39
|
-
import "date-fns/endOfToday";
|
|
40
|
-
import "date-fns/endOfYear";
|
|
41
|
-
import "date-fns/startOfYear";
|
|
42
|
-
import "date-fns/subDays";
|
|
43
|
-
import "date-fns/subYears";
|
|
44
|
-
import "@mui/material/ButtonGroup";
|
|
45
|
-
import "@mui/material/Tab";
|
|
46
|
-
import "@mui/material/Tabs";
|
|
47
|
-
import "@mui/material/ToggleButton";
|
|
48
|
-
import "@mui/material/ToggleButtonGroup";
|
|
49
|
-
import "@mui/material/Dialog";
|
|
50
|
-
import "@mui/material/DialogContent";
|
|
51
|
-
import "@mui/material/Card";
|
|
52
|
-
import "@mui/material/CardContent";
|
|
53
|
-
import "@mui/material/CardHeader";
|
|
54
|
-
import "uuid";
|
|
55
|
-
import "numeral";
|
|
56
|
-
import "@mui/material/CircularProgress";
|
|
57
|
-
import "@mui/material/FormControlLabel";
|
|
58
|
-
import "@mui/material/Radio";
|
|
59
|
-
import "@mui/material/Avatar";
|
|
60
|
-
import "@mui/material/ListItem";
|
|
61
|
-
import "@mui/material/ListItemAvatar";
|
|
62
|
-
import "@mui/material/ListItemButton";
|
|
63
|
-
import "@mui/material/ListItemText";
|
|
64
|
-
import "@mui/material/ListItemIcon";
|
|
65
|
-
import "@mui/material/MenuItem";
|
|
66
|
-
import "@mui/material/TextField";
|
|
67
|
-
import "@mui/material/Switch";
|
|
68
|
-
import "mobx";
|
|
69
|
-
import "posthog-js";
|
|
70
|
-
import "date-fns/differenceInDays";
|
|
71
|
-
import "@mui/x-data-grid-pro";
|
|
72
|
-
import "date-fns";
|
|
73
|
-
import "@mui/material/Divider";
|
|
74
|
-
import "@mui/material/List";
|
|
75
|
-
import "date-fns/fromUnixTime";
|
|
76
|
-
import "date-fns/formatISO";
|
|
77
|
-
import "date-fns/isAfter";
|
|
78
|
-
import "date-fns/addQuarters";
|
|
79
|
-
import "date-fns/nextDay";
|
|
80
|
-
import "date-fns/parseISO";
|
|
81
|
-
import "date-fns/setDate";
|
|
82
|
-
import "date-fns/subQuarters";
|
|
83
|
-
import "date-fns/lastDayOfMonth";
|
|
84
|
-
import "date-fns/setDayOfYear";
|
|
85
|
-
import "date-fns/addWeeks";
|
|
86
|
-
import "date-fns/getDay";
|
|
87
|
-
import "date-fns/addSeconds";
|
|
88
|
-
import "date-fns/differenceInCalendarMonths";
|
|
89
|
-
import "date-fns/getMonth";
|
|
90
|
-
const f = (o, r) => o.find((t) => t.guid === r), B = (o, r) => o.find((t) => t.guid === r), T = (o, r) => {
|
|
91
|
-
const t = o.find((i) => i.subCategories.find((n) => n.guid === r));
|
|
92
|
-
if (t)
|
|
93
|
-
return t.subCategories.find((i) => i.guid === r);
|
|
94
|
-
}, ir = (o, r) => {
|
|
95
|
-
const t = [];
|
|
96
|
-
for (const i of r) {
|
|
97
|
-
const n = f(o, i.category_guid);
|
|
98
|
-
if (!n) continue;
|
|
99
|
-
const e = n.parent_guid ?? n.guid, a = f(o, e);
|
|
100
|
-
if (!a) continue;
|
|
101
|
-
const p = {
|
|
102
|
-
amount: i.total,
|
|
103
|
-
category: n,
|
|
104
|
-
guid: n.guid,
|
|
105
|
-
subCategoryTotals: []
|
|
106
|
-
}, m = t.find((s) => s.guid === e);
|
|
107
|
-
m ? (m.amount += i.total, m.subCategoryTotals.push(p)) : t.push({
|
|
108
|
-
amount: i.total,
|
|
109
|
-
category: a,
|
|
110
|
-
guid: e,
|
|
111
|
-
subCategoryTotals: [p]
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
return t;
|
|
115
|
-
}, er = (o, r) => {
|
|
116
|
-
const t = o.find((i) => i.guid === r);
|
|
117
|
-
return t ? t.guid === g.INCOME || t.parent_guid === g.INCOME : !1;
|
|
118
|
-
}, l = (o, r) => !o && !r ? 0 : !o && r ? 101 : r / o * 100, y = (o, r) => {
|
|
119
|
-
const t = {
|
|
120
|
-
background: r.palette.success.main,
|
|
121
|
-
description: o <= 100 ? r.palette.text.secondary : r.palette.error.main,
|
|
122
|
-
text: r.palette.common.white,
|
|
123
|
-
mercury: r.palette.success.lighter
|
|
124
|
-
};
|
|
125
|
-
return o > 100 ? (t.background = r.palette.error.main, t.mercury = r.palette.error.lighter) : o > 80 && (t.background = r.palette.warning.main, t.text = r.palette.grey[900], t.mercury = r.palette.warning.lighter), t;
|
|
126
|
-
}, nr = () => {
|
|
127
|
-
const { detailedBudgets: o } = _();
|
|
128
|
-
return o.map((t) => {
|
|
129
|
-
const i = t.transaction_total;
|
|
130
|
-
return t.amount - i;
|
|
131
|
-
}).reduce((t, i) => t + i, 0);
|
|
132
|
-
}, ar = (o, r, t, i) => {
|
|
133
|
-
const n = [];
|
|
134
|
-
for (const e of o) {
|
|
135
|
-
const a = B(r, e.category_guid);
|
|
136
|
-
if (!a) continue;
|
|
137
|
-
const p = a.totalAmount, m = l(e.amount, p), s = e.amount - p;
|
|
138
|
-
n.push({
|
|
139
|
-
...e,
|
|
140
|
-
budgetColors: y(m, i),
|
|
141
|
-
category: a,
|
|
142
|
-
description: c(
|
|
143
|
-
s < 0 ? t.budget_remaining_over : t.budget_remaining_left,
|
|
144
|
-
d(Math.abs(s), "0,0")
|
|
145
|
-
),
|
|
146
|
-
percentage: m,
|
|
147
|
-
subBudgets: [],
|
|
148
|
-
transaction_total: p
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
for (const e of o) {
|
|
152
|
-
const a = T(r, e.category_guid);
|
|
153
|
-
if (!a) continue;
|
|
154
|
-
const p = a.currentAmount, m = n.find((C) => C.category_guid === a.parent_guid);
|
|
155
|
-
if (!m) continue;
|
|
156
|
-
const s = e.amount - p, u = l(e.amount, p);
|
|
157
|
-
m && m.subBudgets.push({
|
|
158
|
-
...e,
|
|
159
|
-
budgetColors: y(u, i),
|
|
160
|
-
category: a,
|
|
161
|
-
description: c(
|
|
162
|
-
s < 0 ? t.budget_remaining_over : t.budget_remaining_left,
|
|
163
|
-
d(Math.abs(s), "0,0")
|
|
164
|
-
),
|
|
165
|
-
percentage: u,
|
|
166
|
-
subBudgets: [],
|
|
167
|
-
transaction_total: p
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
return n;
|
|
171
|
-
}, b = (o, r) => o.find((t) => t.guid === r), pr = (o, r, t) => {
|
|
172
|
-
const i = b(o, t);
|
|
173
|
-
if (i)
|
|
174
|
-
return b(i.subBudgets, r);
|
|
175
|
-
};
|
|
176
|
-
export {
|
|
177
|
-
pr as a,
|
|
178
|
-
ar as b,
|
|
179
|
-
B as c,
|
|
180
|
-
T as d,
|
|
181
|
-
ir as e,
|
|
182
|
-
b as f,
|
|
183
|
-
f as g,
|
|
184
|
-
er as i,
|
|
185
|
-
nr as u
|
|
186
|
-
};
|
|
187
|
-
//# sourceMappingURL=BudgetUtil-CVqAdv-j.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BudgetUtil-CVqAdv-j.mjs","sources":["../src/common/utils/Categories.ts","../src/budgets/utils/BudgetUtil.ts"],"sourcesContent":["import type { Category, CategoryTotal, DateRangeCategoryTotals, DetailedCategory } from '../types'\nimport { CategoryGuids } from '../constants'\n\nexport const getCategory = (\n categories: Category[],\n categoryGuid: string | undefined,\n): Category | undefined => {\n return categories.find((c) => c.guid === categoryGuid)\n}\n\nexport const getDetailedCategory = (\n detailedCategories: DetailedCategory[],\n guid: string | undefined,\n): DetailedCategory | undefined => {\n return detailedCategories.find((dc) => dc.guid === guid)\n}\n\nexport const getDetailedSubCategory = (\n detailedCategories: DetailedCategory[],\n guid: string | undefined,\n): DetailedCategory | undefined => {\n const parent = detailedCategories.find((dc) => dc.subCategories.find((sc) => sc.guid === guid))\n if (!parent) return undefined\n\n return parent.subCategories.find((sc) => sc.guid === guid)\n}\n\nexport const getCategoryTotalsByParent = (\n categories: Category[],\n dateRangeTotals: DateRangeCategoryTotals[],\n): CategoryTotal[] => {\n const categoryTotals = [] as CategoryTotal[]\n\n // Iterate over the category data from BE and roll up all categories into parent categories\n // acc is the accumulated category totals of type CategoryTotal that is initialized as an empty []\n // curr is the current DateRangeCategoryTotal\n\n for (const dateRangeTotal of dateRangeTotals) {\n const category = getCategory(categories, dateRangeTotal.category_guid)\n if (!category) continue\n\n const parentGuid = category.parent_guid ?? category.guid\n const parentCategory = getCategory(categories, parentGuid)\n if (!parentCategory) continue\n\n const categoryTotal = {\n amount: dateRangeTotal.total,\n category,\n guid: category.guid,\n subCategoryTotals: [],\n }\n\n const parentCategoryTotal = categoryTotals.find((ct) => ct.guid === parentGuid)\n if (parentCategoryTotal) {\n parentCategoryTotal.amount += dateRangeTotal.total\n parentCategoryTotal.subCategoryTotals.push(categoryTotal)\n } else {\n categoryTotals.push({\n amount: dateRangeTotal.total,\n category: parentCategory,\n guid: parentGuid,\n subCategoryTotals: [categoryTotal],\n })\n }\n }\n\n return categoryTotals\n}\n\nexport const isIncome = (categories: Category[], guid: string) => {\n const category = categories.find((c) => c.guid === guid)\n if (!category) return false\n\n return category.guid === CategoryGuids.INCOME || category.parent_guid === CategoryGuids.INCOME\n}\n","import type { Theme } from '@mui/system'\n\nimport {\n type Budget,\n type BudgetColors,\n type BudgetsCopy,\n type DetailedCategory,\n type DetailedBudget,\n buildDynamicCopy,\n formatCurrency,\n getDetailedCategory,\n getDetailedSubCategory,\n useBudgetsStore,\n} from '../../common'\n\nexport const getBudgetPercentage = (budgetAmount: number, totalAmount: number) => {\n // No budget amount and nothing spent results in zero percent and green bubble\n if (!budgetAmount && !totalAmount) {\n return 0\n }\n\n // No budget amount and money spent results in 101 percent and red bubble\n if (!budgetAmount && totalAmount) {\n return 101\n }\n\n // Budget amount and money spent results in calculating percentage for color\n return (totalAmount / budgetAmount) * 100\n}\n\nexport const getBudgetColors = (percentage: number, theme: Theme) => {\n const budgetColors: BudgetColors = {\n background: theme.palette.success.main,\n description: percentage <= 100 ? theme.palette.text.secondary : theme.palette.error.main,\n text: theme.palette.common.white,\n mercury: theme.palette.success.lighter,\n }\n\n if (percentage > 100) {\n budgetColors.background = theme.palette.error.main\n budgetColors.mercury = theme.palette.error.lighter\n } else if (percentage > 80) {\n budgetColors.background = theme.palette.warning.main\n budgetColors.text = theme.palette.grey['900']\n budgetColors.mercury = theme.palette.warning.lighter\n }\n\n return budgetColors\n}\n\nexport const useGetBudgetDifference = () => {\n const { detailedBudgets: budgets } = useBudgetsStore()\n\n const differences = budgets.map((budget) => {\n const currentAmount = budget.transaction_total\n const totalAmount = budget.amount\n return totalAmount - currentAmount\n })\n\n return differences.reduce((total, difference) => total + difference, 0)\n}\n\nexport const augmentBudgets = (\n budgets: Budget[],\n categories: DetailedCategory[],\n copy: BudgetsCopy,\n theme: Theme,\n): DetailedBudget[] => {\n const detailedBudgets = [] as DetailedBudget[]\n\n // Top-level Categories\n for (const budget of budgets) {\n const category = getDetailedCategory(categories, budget.category_guid)\n if (!category) continue\n\n const spent = category.totalAmount\n\n const percentage = getBudgetPercentage(budget.amount, spent)\n const difference = budget.amount - spent\n\n detailedBudgets.push({\n ...budget,\n budgetColors: getBudgetColors(percentage, theme),\n category,\n description: buildDynamicCopy(\n difference < 0 ? copy.budget_remaining_over : copy.budget_remaining_left,\n formatCurrency(Math.abs(difference), '0,0'),\n ) as string,\n percentage,\n subBudgets: [],\n transaction_total: spent,\n })\n }\n\n // Sub categories\n for (const budget of budgets) {\n const category = getDetailedSubCategory(categories, budget.category_guid)\n if (!category) continue\n\n const spent = category.currentAmount\n\n const parentBudget = detailedBudgets.find((b) => b.category_guid === category.parent_guid)\n if (!parentBudget) continue\n\n const difference = budget.amount - spent\n const percentage = getBudgetPercentage(budget.amount, spent)\n\n if (parentBudget) {\n parentBudget.subBudgets.push({\n ...budget,\n budgetColors: getBudgetColors(percentage, theme),\n category,\n description: buildDynamicCopy(\n difference < 0 ? copy.budget_remaining_over : copy.budget_remaining_left,\n formatCurrency(Math.abs(difference), '0,0'),\n ) as string,\n percentage,\n subBudgets: [],\n transaction_total: spent,\n })\n }\n }\n\n return detailedBudgets\n}\n\nexport const findBudget = (budgets: DetailedBudget[], guid: string): DetailedBudget | undefined => {\n return budgets.find((budget) => budget.guid === guid)\n}\n\nexport const findSubBudget = (\n budgets: DetailedBudget[],\n guid: string,\n parentGuid: string,\n): DetailedBudget | undefined => {\n const parent = findBudget(budgets, parentGuid)\n if (!parent) return undefined\n\n return findBudget(parent.subBudgets, guid)\n}\n"],"names":["getCategory","categories","categoryGuid","c","getDetailedCategory","detailedCategories","guid","dc","getDetailedSubCategory","parent","sc","getCategoryTotalsByParent","dateRangeTotals","categoryTotals","dateRangeTotal","category","parentGuid","parentCategory","categoryTotal","parentCategoryTotal","ct","isIncome","CategoryGuids","getBudgetPercentage","budgetAmount","totalAmount","getBudgetColors","percentage","theme","budgetColors","useGetBudgetDifference","budgets","useBudgetsStore","budget","currentAmount","total","difference","augmentBudgets","copy","detailedBudgets","spent","buildDynamicCopy","formatCurrency","parentBudget","b","findBudget","findSubBudget"],"mappings":"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"}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { makeAutoObservable as o } from "mobx";
|
|
2
|
-
import { addDays as r } from "date-fns/addDays";
|
|
3
|
-
import { differenceInDays as n } from "date-fns/differenceInDays";
|
|
4
|
-
import { endOfMonth as i } from "date-fns/endOfMonth";
|
|
5
|
-
import { isBefore as a } from "date-fns/isBefore";
|
|
6
|
-
import { startOfToday as t } from "date-fns/startOfToday";
|
|
7
|
-
class c {
|
|
8
|
-
// Cashflow is hard-coded to display 30 days starting from today
|
|
9
|
-
dateRange = { start: t(), end: r(t(), 30) };
|
|
10
|
-
isDirty = !1;
|
|
11
|
-
nextIncome = void 0;
|
|
12
|
-
upcomingExpenses = [];
|
|
13
|
-
selectedCashAccounts = [];
|
|
14
|
-
constructor() {
|
|
15
|
-
o(this);
|
|
16
|
-
}
|
|
17
|
-
// Returns the number of days until the next income activity or 0 if there is no income activity
|
|
18
|
-
get daysUntilNextIncome() {
|
|
19
|
-
return this.nextIncome ? Math.abs(n(t(), this.nextIncome.expectedDate)) : 0;
|
|
20
|
-
}
|
|
21
|
-
// Returns the expenses (Activities) until the next income activity or the end of the month
|
|
22
|
-
// if there is no income activity
|
|
23
|
-
get expensesTilNextIncome() {
|
|
24
|
-
return this.upcomingExpenses.filter(
|
|
25
|
-
(e) => a(e.expectedDate, this.nextIncome?.expectedDate || i(/* @__PURE__ */ new Date()))
|
|
26
|
-
);
|
|
27
|
-
}
|
|
28
|
-
setNextIncome = (e) => {
|
|
29
|
-
this.nextIncome = e;
|
|
30
|
-
};
|
|
31
|
-
setUpcomingExpenses = (e) => {
|
|
32
|
-
this.upcomingExpenses = e;
|
|
33
|
-
};
|
|
34
|
-
setSelectedCashAccounts = (e) => this.selectedCashAccounts = e;
|
|
35
|
-
}
|
|
36
|
-
class f {
|
|
37
|
-
globalStore;
|
|
38
|
-
uiStore;
|
|
39
|
-
constructor(e) {
|
|
40
|
-
this.globalStore = e, this.uiStore = new c(), o(this);
|
|
41
|
-
}
|
|
42
|
-
completeOnboarding = async () => {
|
|
43
|
-
const e = {
|
|
44
|
-
...this.globalStore.userStore.userProfile,
|
|
45
|
-
has_completed_cash_flow_onboarding: !0
|
|
46
|
-
};
|
|
47
|
-
await this.globalStore.userStore.updateUserProfile(e);
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
export {
|
|
51
|
-
f as C
|
|
52
|
-
};
|
|
53
|
-
//# sourceMappingURL=CashflowStore-gPEEBiXo.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CashflowStore-gPEEBiXo.mjs","sources":["../src/cashflow/stores/UiStore.ts","../src/cashflow/stores/CashflowStore.ts"],"sourcesContent":["import { makeAutoObservable } from 'mobx'\nimport { addDays } from 'date-fns/addDays'\nimport { differenceInDays } from 'date-fns/differenceInDays'\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { isBefore } from 'date-fns/isBefore'\nimport { startOfToday } from 'date-fns/startOfToday'\n\nimport { type Account, type Recurrence } from '../../common'\n\nexport class UiStore {\n // Cashflow is hard-coded to display 30 days starting from today\n dateRange = { start: startOfToday(), end: addDays(startOfToday(), 30) }\n isDirty = false\n\n nextIncome: Recurrence | undefined = undefined\n upcomingExpenses: Recurrence[] = []\n\n selectedCashAccounts: Account[] = []\n\n constructor() {\n makeAutoObservable(this)\n }\n\n // Returns the number of days until the next income activity or 0 if there is no income activity\n get daysUntilNextIncome() {\n return this.nextIncome\n ? Math.abs(differenceInDays(startOfToday(), this.nextIncome.expectedDate))\n : 0\n }\n\n // Returns the expenses (Activities) until the next income activity or the end of the month\n // if there is no income activity\n get expensesTilNextIncome() {\n return this.upcomingExpenses.filter((a) =>\n isBefore(a.expectedDate, this.nextIncome?.expectedDate || endOfMonth(new Date())),\n )\n }\n\n setNextIncome = (nextIncome: Recurrence) => {\n this.nextIncome = nextIncome\n }\n\n setUpcomingExpenses = (expenses: Recurrence[]) => {\n this.upcomingExpenses = expenses\n }\n\n setSelectedCashAccounts = (accounts: Account[]) => (this.selectedCashAccounts = accounts)\n}\n","import { makeAutoObservable } from 'mobx'\n\nimport { GlobalStore, type UserProfile } from '../../common'\n\nimport { UiStore } from './UiStore'\n\nexport class CashflowStore {\n globalStore: GlobalStore\n uiStore: UiStore\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.uiStore = new UiStore()\n\n makeAutoObservable(this)\n }\n\n completeOnboarding = async () => {\n const updatedUserProfile = {\n ...this.globalStore.userStore.userProfile,\n has_completed_cash_flow_onboarding: true,\n } as UserProfile\n\n await this.globalStore.userStore.updateUserProfile(updatedUserProfile)\n }\n}\n"],"names":["UiStore","startOfToday","addDays","makeAutoObservable","differenceInDays","a","isBefore","endOfMonth","nextIncome","expenses","accounts","CashflowStore","globalStore","updatedUserProfile"],"mappings":";;;;;;AASO,MAAMA,EAAQ;AAAA;AAAA,EAEnB,YAAY,EAAE,OAAOC,KAAgB,KAAKC,EAAQD,EAAA,GAAgB,EAAE;EACpE,UAAU;AAAA,EAEV,aAAqC;AAAA,EACrC,mBAAiC,CAAA;AAAA,EAEjC,uBAAkC,CAAA;AAAA,EAElC,cAAc;AACZ,IAAAE,EAAmB,IAAI;AAAA,EACzB;AAAA;AAAA,EAGA,IAAI,sBAAsB;AACjB,WAAA,KAAK,aACR,KAAK,IAAIC,EAAiBH,EAAa,GAAG,KAAK,WAAW,YAAY,CAAC,IACvE;AAAA,EACN;AAAA;AAAA;AAAA,EAIA,IAAI,wBAAwB;AAC1B,WAAO,KAAK,iBAAiB;AAAA,MAAO,CAACI,MACnCC,EAASD,EAAE,cAAc,KAAK,YAAY,gBAAgBE,EAAW,oBAAI,KAAM,CAAA,CAAC;AAAA,IAAA;AAAA,EAEpF;AAAA,EAEA,gBAAgB,CAACC,MAA2B;AAC1C,SAAK,aAAaA;AAAA,EAAA;AAAA,EAGpB,sBAAsB,CAACC,MAA2B;AAChD,SAAK,mBAAmBA;AAAA,EAAA;AAAA,EAG1B,0BAA0B,CAACC,MAAyB,KAAK,uBAAuBA;AAClF;ACzCO,MAAMC,EAAc;AAAA,EACzB;AAAA,EACA;AAAA,EAEA,YAAYC,GAA0B;AACpC,SAAK,cAAcA,GACd,KAAA,UAAU,IAAIZ,KAEnBG,EAAmB,IAAI;AAAA,EACzB;AAAA,EAEA,qBAAqB,YAAY;AAC/B,UAAMU,IAAqB;AAAA,MACzB,GAAG,KAAK,YAAY,UAAU;AAAA,MAC9B,oCAAoC;AAAA,IAAA;AAGtC,UAAM,KAAK,YAAY,UAAU,kBAAkBA,CAAkB;AAAA,EAAA;AAEzE;"}
|
|
@@ -1,260 +0,0 @@
|
|
|
1
|
-
import { makeAutoObservable as d, runInAction as l } from "mobx";
|
|
2
|
-
import { getUnixTime as a } from "date-fns/getUnixTime";
|
|
3
|
-
import { subMonths as g } from "date-fns/subMonths";
|
|
4
|
-
import { startOfMonth as m } from "date-fns/startOfMonth";
|
|
5
|
-
import { endOfMonth as p } from "date-fns/endOfMonth";
|
|
6
|
-
import "bowser";
|
|
7
|
-
import "date-fns/intlFormat";
|
|
8
|
-
import { ae as u, af as s, aX as C, aK as T, aY as f } from "./ConnectMiniWidget-CQWafYtQ.mjs";
|
|
9
|
-
import "date-fns/addMonths";
|
|
10
|
-
import "date-fns/addQuarters";
|
|
11
|
-
import "date-fns/addWeeks";
|
|
12
|
-
import "date-fns/addYears";
|
|
13
|
-
import "date-fns/getDay";
|
|
14
|
-
import "date-fns/isBefore";
|
|
15
|
-
import "date-fns/nextDay";
|
|
16
|
-
import "date-fns/setDate";
|
|
17
|
-
import "date-fns/startOfToday";
|
|
18
|
-
import "date-fns/fromUnixTime";
|
|
19
|
-
import "react";
|
|
20
|
-
import "numeral";
|
|
21
|
-
import "@mui/material";
|
|
22
|
-
import "react/jsx-runtime";
|
|
23
|
-
import "@mui/material/Button";
|
|
24
|
-
import "@mxenabled/mxui";
|
|
25
|
-
import "@mui/material/Tooltip";
|
|
26
|
-
import "@mui/material/Box";
|
|
27
|
-
import "@mui/material/IconButton";
|
|
28
|
-
import "./Loader-CwdK8lfx.mjs";
|
|
29
|
-
import "@mui/material/styles/useTheme";
|
|
30
|
-
import "@mui/material/useMediaQuery";
|
|
31
|
-
import "@mxenabled/cssinjs";
|
|
32
|
-
import "date-fns/addDays";
|
|
33
|
-
import "date-fns/eachDayOfInterval";
|
|
34
|
-
import "date-fns/eachWeekOfInterval";
|
|
35
|
-
import "date-fns/format";
|
|
36
|
-
import "date-fns/isSameMonth";
|
|
37
|
-
import "@mui/material/Paper";
|
|
38
|
-
import "@mxenabled/mx-icons";
|
|
39
|
-
import "date-fns/isSameDay";
|
|
40
|
-
import "date-fns/isWithinInterval";
|
|
41
|
-
import "d3";
|
|
42
|
-
import "@mui/material/styles";
|
|
43
|
-
import "@mui/x-charts";
|
|
44
|
-
import "@mui/x-charts/ChartsTooltip";
|
|
45
|
-
import "@mui/material/Stack";
|
|
46
|
-
import "date-fns/differenceInCalendarDays";
|
|
47
|
-
import "date-fns/endOfToday";
|
|
48
|
-
import "date-fns/endOfYear";
|
|
49
|
-
import "date-fns/startOfYear";
|
|
50
|
-
import "date-fns/subDays";
|
|
51
|
-
import "date-fns/subYears";
|
|
52
|
-
import "@mui/material/ButtonGroup";
|
|
53
|
-
import "@mui/material/Tab";
|
|
54
|
-
import "@mui/material/Tabs";
|
|
55
|
-
import "@mui/material/ToggleButton";
|
|
56
|
-
import "@mui/material/ToggleButtonGroup";
|
|
57
|
-
import "@mui/material/Dialog";
|
|
58
|
-
import "@mui/material/DialogContent";
|
|
59
|
-
import "@mui/material/Card";
|
|
60
|
-
import "@mui/material/CardContent";
|
|
61
|
-
import "@mui/material/CardHeader";
|
|
62
|
-
import "uuid";
|
|
63
|
-
import "@mui/material/CircularProgress";
|
|
64
|
-
import "@mui/material/FormControlLabel";
|
|
65
|
-
import "@mui/material/Radio";
|
|
66
|
-
import "@mui/material/Avatar";
|
|
67
|
-
import "@mui/material/ListItem";
|
|
68
|
-
import "@mui/material/ListItemAvatar";
|
|
69
|
-
import "@mui/material/ListItemButton";
|
|
70
|
-
import "@mui/material/ListItemText";
|
|
71
|
-
import "@mui/material/ListItemIcon";
|
|
72
|
-
import "@mui/material/MenuItem";
|
|
73
|
-
import "@mui/material/TextField";
|
|
74
|
-
import "@mui/material/Switch";
|
|
75
|
-
import "posthog-js";
|
|
76
|
-
import "date-fns/differenceInDays";
|
|
77
|
-
import "@mui/x-data-grid-pro";
|
|
78
|
-
import "date-fns";
|
|
79
|
-
import "@mui/material/Divider";
|
|
80
|
-
import "@mui/material/List";
|
|
81
|
-
import "date-fns/formatISO";
|
|
82
|
-
import "date-fns/isAfter";
|
|
83
|
-
import "date-fns/parseISO";
|
|
84
|
-
import "date-fns/subQuarters";
|
|
85
|
-
import "date-fns/lastDayOfMonth";
|
|
86
|
-
import "date-fns/setDayOfYear";
|
|
87
|
-
import "date-fns/addSeconds";
|
|
88
|
-
import "date-fns/differenceInCalendarMonths";
|
|
89
|
-
import "date-fns/getMonth";
|
|
90
|
-
class h {
|
|
91
|
-
fetchInstance;
|
|
92
|
-
constructor(t, e) {
|
|
93
|
-
this.fetchInstance = new u(t, e);
|
|
94
|
-
}
|
|
95
|
-
addCategory = async (t) => this.fetchInstance.post(s.CATEGORIES, t).then((e) => e.category);
|
|
96
|
-
getCategories = async () => this.fetchInstance.get(s.CATEGORIES).then((t) => t.categories);
|
|
97
|
-
getDateRangeCategoryTotals = async (t, e, r) => r.length === 0 ? [] : this.fetchInstance.post(`${s.DATE_RANGE_CATEGORY_TOTALS}/from/${t}/to/${e}`, {
|
|
98
|
-
account_guid: r.map((o) => o.guid)
|
|
99
|
-
}).then((o) => o.date_range_category_totals);
|
|
100
|
-
getMonthlyCategoryTotals = async (t, e, r) => {
|
|
101
|
-
try {
|
|
102
|
-
const o = `${s.MONTHLY_CATEGORY_TOTALS}/from/${t}/to/${e}`;
|
|
103
|
-
if (r) {
|
|
104
|
-
const i = r.length === 0 ? [""] : r.map((y) => y.guid);
|
|
105
|
-
return (await this.fetchInstance.post(o, { account_guid: i })).monthly_category_totals;
|
|
106
|
-
} else
|
|
107
|
-
return (await this.fetchInstance.get(o)).monthly_category_totals;
|
|
108
|
-
} catch (o) {
|
|
109
|
-
throw console.error("Error fetching monthly category totals:", o), o;
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
removeCategory = async (t) => this.fetchInstance.delete(`${s.CATEGORIES}/${t}`);
|
|
113
|
-
updateCategory = async (t) => this.fetchInstance.put(`${s.CATEGORIES}/${t.guid}`, t).then((e) => e.category);
|
|
114
|
-
}
|
|
115
|
-
class w {
|
|
116
|
-
expandedGuid = null;
|
|
117
|
-
selectedGuid = null;
|
|
118
|
-
searchValue = "";
|
|
119
|
-
showSelected = !0;
|
|
120
|
-
shouldDisableDrawerScroll = !1;
|
|
121
|
-
unselectable = [];
|
|
122
|
-
unselectableText = "";
|
|
123
|
-
savedOnSelect;
|
|
124
|
-
// todo
|
|
125
|
-
constructor() {
|
|
126
|
-
d(this);
|
|
127
|
-
}
|
|
128
|
-
setExpandedGuid = (t) => this.expandedGuid = t;
|
|
129
|
-
setSelectedGuid = (t) => this.selectedGuid = t;
|
|
130
|
-
setSearchValue = (t) => this.searchValue = t;
|
|
131
|
-
setShouldDisableDrawerScroll = (t) => this.shouldDisableDrawerScroll = t;
|
|
132
|
-
setShowSelected = (t) => this.showSelected = t;
|
|
133
|
-
setUnselectable = (t) => this.unselectable = t;
|
|
134
|
-
setUnselectableText = (t) => this.unselectableText = t;
|
|
135
|
-
onSelect = (t) => this.savedOnSelect(t);
|
|
136
|
-
setOnSelect = (t) => this.savedOnSelect = t;
|
|
137
|
-
}
|
|
138
|
-
class oe {
|
|
139
|
-
globalStore;
|
|
140
|
-
uiStore;
|
|
141
|
-
api = new h("/", "");
|
|
142
|
-
categories = [];
|
|
143
|
-
dateRangeCategoryTotals = [];
|
|
144
|
-
monthlyCategoryTotals = [];
|
|
145
|
-
dataRangeTotalsLoaded = !1;
|
|
146
|
-
isLoadingCategoryTotals = !1;
|
|
147
|
-
monthlyTotalsLoaded = !1;
|
|
148
|
-
constructor(t) {
|
|
149
|
-
this.globalStore = t, this.uiStore = new w(), this.api = new h(t.endpoint, t.sessionToken), d(this);
|
|
150
|
-
}
|
|
151
|
-
get detailedCategories() {
|
|
152
|
-
return C(
|
|
153
|
-
this.categories,
|
|
154
|
-
this.dateRangeCategoryTotals,
|
|
155
|
-
this.monthlyCategoryTotals,
|
|
156
|
-
this.globalStore.transactionStore.sortedTransactions
|
|
157
|
-
);
|
|
158
|
-
}
|
|
159
|
-
get incomeCategories() {
|
|
160
|
-
return this.detailedCategories.filter((t) => t.is_income);
|
|
161
|
-
}
|
|
162
|
-
get spendCategories() {
|
|
163
|
-
return this.detailedCategories.filter(
|
|
164
|
-
(t) => !t.is_income && !t.isTransfer && t.guid !== T.INVESTMENTS
|
|
165
|
-
);
|
|
166
|
-
}
|
|
167
|
-
get transferCategories() {
|
|
168
|
-
return this.detailedCategories.filter((t) => t.isTransfer);
|
|
169
|
-
}
|
|
170
|
-
addCategory = async (t, e) => {
|
|
171
|
-
const r = { name: t, parent_guid: e };
|
|
172
|
-
try {
|
|
173
|
-
await this.api.addCategory(r), await this.loadCategories();
|
|
174
|
-
} catch (o) {
|
|
175
|
-
console.error(`Error occurred while adding category: ${o}`);
|
|
176
|
-
}
|
|
177
|
-
};
|
|
178
|
-
loadCategories = async (t) => {
|
|
179
|
-
try {
|
|
180
|
-
const e = t || await this.api.getCategories(), { default_categories: r } = this.globalStore.copyStore.copy.categories;
|
|
181
|
-
l(() => {
|
|
182
|
-
this.categories = e.map((o) => ({
|
|
183
|
-
...o,
|
|
184
|
-
name: r[o.guid] ? r[o.guid].replace(/&/g, "&") : o.name
|
|
185
|
-
}));
|
|
186
|
-
});
|
|
187
|
-
} catch (e) {
|
|
188
|
-
console.error(`Error occurred while getting categories: ${e}`);
|
|
189
|
-
}
|
|
190
|
-
};
|
|
191
|
-
loadDateRangeCategoryTotals = async (t, e, r) => {
|
|
192
|
-
this.setIsLoadingCategoryTotals(!0);
|
|
193
|
-
try {
|
|
194
|
-
const o = await this.api.getDateRangeCategoryTotals(
|
|
195
|
-
a(e),
|
|
196
|
-
a(r),
|
|
197
|
-
t
|
|
198
|
-
);
|
|
199
|
-
l(() => {
|
|
200
|
-
this.dateRangeCategoryTotals = o, this.setIsLoadingCategoryTotals(!1), this.dataRangeTotalsLoaded = !0;
|
|
201
|
-
});
|
|
202
|
-
} catch (o) {
|
|
203
|
-
this.setIsLoadingCategoryTotals(!1), console.error(`Error occurred while getting date range category totals: ${o}`);
|
|
204
|
-
}
|
|
205
|
-
};
|
|
206
|
-
loadMonthlyCategoryTotals = async (t = this.globalStore.globalUiStore.selectedAccounts, e, r) => {
|
|
207
|
-
const o = a(m(e ?? g(/* @__PURE__ */ new Date(), 11))), i = a(p(r ?? /* @__PURE__ */ new Date()));
|
|
208
|
-
try {
|
|
209
|
-
const n = await this.api.getMonthlyCategoryTotals(o, i, t);
|
|
210
|
-
l(() => {
|
|
211
|
-
this.monthlyCategoryTotals = n, this.monthlyTotalsLoaded = !0;
|
|
212
|
-
});
|
|
213
|
-
} catch (n) {
|
|
214
|
-
console.error(`Error occurred while getting monthly category totals: ${n}`);
|
|
215
|
-
}
|
|
216
|
-
};
|
|
217
|
-
reloadCategoryTotals = async (t, e, r) => {
|
|
218
|
-
this.setIsLoadingCategoryTotals(!0);
|
|
219
|
-
try {
|
|
220
|
-
const o = await this.api.getDateRangeCategoryTotals(
|
|
221
|
-
a(e),
|
|
222
|
-
a(r),
|
|
223
|
-
t
|
|
224
|
-
), i = await this.api.getMonthlyCategoryTotals(
|
|
225
|
-
a(m(g(r, 11))),
|
|
226
|
-
a(p(r)),
|
|
227
|
-
t
|
|
228
|
-
);
|
|
229
|
-
l(() => {
|
|
230
|
-
this.dateRangeCategoryTotals = o, this.monthlyCategoryTotals = i, this.dataRangeTotalsLoaded = !0, this.monthlyTotalsLoaded = !0, this.setIsLoadingCategoryTotals(!1);
|
|
231
|
-
});
|
|
232
|
-
} catch (o) {
|
|
233
|
-
console.error(`Error occurred while getting category totals: ${o}`);
|
|
234
|
-
}
|
|
235
|
-
};
|
|
236
|
-
removeCategory = async (t) => {
|
|
237
|
-
try {
|
|
238
|
-
await this.api.removeCategory(t), await this.loadCategories();
|
|
239
|
-
} catch (e) {
|
|
240
|
-
console.error(`Error occurred while removing category: ${e}`);
|
|
241
|
-
}
|
|
242
|
-
};
|
|
243
|
-
setIsLoadingCategoryTotals = (t) => {
|
|
244
|
-
this.isLoadingCategoryTotals = t;
|
|
245
|
-
};
|
|
246
|
-
updateCategory = async (t) => {
|
|
247
|
-
try {
|
|
248
|
-
await this.api.updateCategory(t), await this.loadCategories();
|
|
249
|
-
} catch (e) {
|
|
250
|
-
console.error(`Error occurred while updating category: ${e}`);
|
|
251
|
-
}
|
|
252
|
-
};
|
|
253
|
-
// TODO: Remove this after refactoring Trends components to use detailedCategories
|
|
254
|
-
getCategoryName = (t) => this.categories.find((r) => r.guid === t)?.name ?? f[t];
|
|
255
|
-
}
|
|
256
|
-
export {
|
|
257
|
-
oe as C,
|
|
258
|
-
h as a
|
|
259
|
-
};
|
|
260
|
-
//# sourceMappingURL=CategoryStore-m7oieLzP.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CategoryStore-m7oieLzP.mjs","sources":["../src/common/api/CategoryApi.ts","../src/categories/stores/UiStore.ts","../src/categories/stores/CategoryStore.ts"],"sourcesContent":["import Fetch from '../utils/Fetch'\n\nimport { ApiEndpoints } from '../constants/ApiEndpoints'\n\nimport type { Account } from '../types/Account'\nimport type { Category } from '../types/Category'\n\nexport class CategoryApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string) {\n this.fetchInstance = new Fetch(endpoint, token)\n }\n\n addCategory = async (category: Category) => {\n return this.fetchInstance.post(ApiEndpoints.CATEGORIES, category).then((data) => data.category)\n }\n\n getCategories = async () => {\n return this.fetchInstance.get(ApiEndpoints.CATEGORIES).then((data) => data.categories)\n }\n\n getDateRangeCategoryTotals = async (startDate: number, endDate: number, accounts: Account[]) => {\n // If no accounts are selected, return an empty array\n if (accounts.length === 0) return []\n return this.fetchInstance\n .post(`${ApiEndpoints.DATE_RANGE_CATEGORY_TOTALS}/from/${startDate}/to/${endDate}`, {\n account_guid: accounts.map((account) => account.guid),\n })\n .then((data) => data.date_range_category_totals)\n }\n\n getMonthlyCategoryTotals = async (startDate: number, endDate: number, accounts?: Account[]) => {\n try {\n const url = `${ApiEndpoints.MONTHLY_CATEGORY_TOTALS}/from/${startDate}/to/${endDate}`\n if (accounts) {\n const accountGuids = accounts.length === 0 ? [''] : accounts.map((account) => account.guid)\n const response = await this.fetchInstance.post(url, { account_guid: accountGuids })\n return response.monthly_category_totals\n } else {\n const response = await this.fetchInstance.get(url)\n return response.monthly_category_totals\n }\n } catch (error) {\n console.error('Error fetching monthly category totals:', error)\n throw error // Re-throw the error for the caller to handle\n }\n }\n removeCategory = async (guid: string) => {\n return this.fetchInstance.delete(`${ApiEndpoints.CATEGORIES}/${guid}`)\n }\n\n updateCategory = async (category: Category) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.CATEGORIES}/${category.guid}`, category)\n .then((data) => data.category)\n }\n}\n","import { makeAutoObservable } from 'mobx'\n\nexport class UiStore {\n expandedGuid: string | null = null\n selectedGuid: string | null = null\n searchValue = ''\n showSelected = true\n shouldDisableDrawerScroll = false\n unselectable: string[] = []\n unselectableText = ''\n\n savedOnSelect: any // todo\n\n constructor() {\n makeAutoObservable(this)\n }\n\n setExpandedGuid = (guid: string | null) => (this.expandedGuid = guid)\n\n setSelectedGuid = (guid: string | null) => (this.selectedGuid = guid)\n\n setSearchValue = (value: string) => (this.searchValue = value)\n\n setShouldDisableDrawerScroll = (shouldDisable: boolean) =>\n (this.shouldDisableDrawerScroll = shouldDisable)\n\n setShowSelected = (showSelected: boolean) => (this.showSelected = showSelected)\n\n setUnselectable = (unselectable: string[]) => (this.unselectable = unselectable)\n\n setUnselectableText = (text: string) => (this.unselectableText = text)\n\n onSelect = (guid: string) => this.savedOnSelect(guid)\n\n setOnSelect = (callback: any) => (this.savedOnSelect = callback)\n}\n","import { makeAutoObservable, runInAction } from 'mobx'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { subMonths } from 'date-fns/subMonths'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { endOfMonth } from 'date-fns/endOfMonth'\n\nimport { Account, CategoryApi, CategoryGuids, CategoryGuidToName } from '../../common'\n\nimport type {\n Category,\n DetailedCategory,\n DateRangeCategoryTotals,\n GlobalStore,\n MonthlyCategoryTotals,\n} from '../../common'\n\nimport { augmentCategories } from '../util/CategoryUtil'\nimport { UiStore } from './UiStore'\n\nexport class CategoryStore {\n globalStore: GlobalStore\n uiStore: UiStore\n api = new CategoryApi('/', '')\n\n categories: Category[] = []\n dateRangeCategoryTotals: DateRangeCategoryTotals[] = []\n monthlyCategoryTotals: MonthlyCategoryTotals[] = []\n\n dataRangeTotalsLoaded = false\n isLoadingCategoryTotals = false\n monthlyTotalsLoaded = false\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.uiStore = new UiStore()\n this.api = new CategoryApi(globalStore.endpoint, globalStore.sessionToken)\n\n makeAutoObservable(this)\n }\n\n get detailedCategories(): DetailedCategory[] {\n return augmentCategories(\n this.categories,\n this.dateRangeCategoryTotals,\n this.monthlyCategoryTotals,\n this.globalStore.transactionStore.sortedTransactions,\n )\n }\n\n get incomeCategories(): DetailedCategory[] {\n return this.detailedCategories.filter((c) => c.is_income)\n }\n\n get spendCategories(): DetailedCategory[] {\n return this.detailedCategories.filter(\n (c) => !c.is_income && !c.isTransfer && c.guid !== CategoryGuids.INVESTMENTS,\n )\n }\n\n get transferCategories(): DetailedCategory[] {\n return this.detailedCategories.filter((c) => c.isTransfer)\n }\n\n addCategory = async (name: string, parentGuid: string) => {\n const category = { name, parent_guid: parentGuid } as Category\n\n try {\n await this.api.addCategory(category)\n await this.loadCategories()\n } catch (error) {\n console.error(`Error occurred while adding category: ${error}`)\n }\n }\n\n loadCategories = async (categoriesOverride?: Category[]) => {\n try {\n const categories = categoriesOverride || (await this.api.getCategories())\n const { default_categories } = this.globalStore.copyStore.copy.categories\n\n runInAction(() => {\n this.categories = categories.map((category: Category) => ({\n ...category,\n name: default_categories[category.guid]\n ? default_categories[category.guid].replace(/&/g, '&')\n : category.name,\n }))\n })\n } catch (error) {\n console.error(`Error occurred while getting categories: ${error}`)\n }\n }\n\n loadDateRangeCategoryTotals = async (accounts: Account[], startDate: Date, endDate: Date) => {\n this.setIsLoadingCategoryTotals(true)\n try {\n const totals = await this.api.getDateRangeCategoryTotals(\n getUnixTime(startDate),\n getUnixTime(endDate),\n accounts,\n )\n runInAction(() => {\n this.dateRangeCategoryTotals = totals\n this.setIsLoadingCategoryTotals(false)\n this.dataRangeTotalsLoaded = true\n })\n } catch (error) {\n this.setIsLoadingCategoryTotals(false)\n console.error(`Error occurred while getting date range category totals: ${error}`)\n }\n }\n\n loadMonthlyCategoryTotals = async (\n accounts: Account[] = this.globalStore.globalUiStore.selectedAccounts,\n startDate?: Date,\n endDate?: Date,\n ) => {\n const start = getUnixTime(startOfMonth(startDate ?? subMonths(new Date(), 11)))\n const end = getUnixTime(endOfMonth(endDate ?? new Date()))\n\n try {\n const totals = await this.api.getMonthlyCategoryTotals(start, end, accounts)\n\n runInAction(() => {\n this.monthlyCategoryTotals = totals\n this.monthlyTotalsLoaded = true\n })\n } catch (error) {\n console.error(`Error occurred while getting monthly category totals: ${error}`)\n }\n }\n\n reloadCategoryTotals = async (accounts: Account[], startDate: Date, endDate: Date) => {\n this.setIsLoadingCategoryTotals(true)\n try {\n const dateRangeTotals = await this.api.getDateRangeCategoryTotals(\n getUnixTime(startDate),\n getUnixTime(endDate),\n accounts,\n )\n\n const monthlyTotals = await this.api.getMonthlyCategoryTotals(\n getUnixTime(startOfMonth(subMonths(endDate, 11))),\n getUnixTime(endOfMonth(endDate)),\n accounts,\n )\n\n runInAction(() => {\n this.dateRangeCategoryTotals = dateRangeTotals\n this.monthlyCategoryTotals = monthlyTotals\n this.dataRangeTotalsLoaded = true\n this.monthlyTotalsLoaded = true\n this.setIsLoadingCategoryTotals(false)\n })\n } catch (error) {\n console.error(`Error occurred while getting category totals: ${error}`)\n }\n }\n\n removeCategory = async (guid: string) => {\n try {\n await this.api.removeCategory(guid)\n await this.loadCategories()\n } catch (error) {\n console.error(`Error occurred while removing category: ${error}`)\n }\n }\n\n setIsLoadingCategoryTotals = (isLoading: boolean) => {\n this.isLoadingCategoryTotals = isLoading\n }\n\n updateCategory = async (category: Category) => {\n try {\n await this.api.updateCategory(category)\n await this.loadCategories()\n } catch (error) {\n console.error(`Error occurred while updating category: ${error}`)\n }\n }\n\n // TODO: Remove this after refactoring Trends components to use detailedCategories\n getCategoryName = (guid: string) => {\n const category = this.categories.find((c) => c.guid === guid)\n return category?.name ?? CategoryGuidToName[guid]\n }\n}\n"],"names":["CategoryApi","endpoint","token","Fetch","category","ApiEndpoints","data","startDate","endDate","accounts","account","url","accountGuids","error","guid","UiStore","makeAutoObservable","value","shouldDisable","showSelected","unselectable","text","callback","CategoryStore","globalStore","augmentCategories","c","CategoryGuids","name","parentGuid","categoriesOverride","categories","default_categories","runInAction","totals","getUnixTime","start","startOfMonth","subMonths","end","endOfMonth","dateRangeTotals","monthlyTotals","isLoading","CategoryGuidToName"],"mappings":"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"}
|