@mx-cartographer/experiences 9.4.0 → 9.4.1-alpha.al0

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 (29) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/budgets/components/BudgetDetailsDrawer.es.js +133 -95
  3. package/dist/budgets/components/BudgetDetailsDrawer.es.js.map +1 -1
  4. package/dist/budgets/components/budgetdetails/AddSubBudget.es.js +64 -63
  5. package/dist/budgets/components/budgetdetails/AddSubBudget.es.js.map +1 -1
  6. package/dist/budgets/components/budgetdetails/SubBudgetAmounts.d.ts +10 -0
  7. package/dist/budgets/components/budgetdetails/SubBudgetAmounts.es.js +58 -0
  8. package/dist/budgets/components/budgetdetails/SubBudgetAmounts.es.js.map +1 -0
  9. package/dist/budgets/components/budgetdetails/SubBudgetList.es.js +42 -41
  10. package/dist/budgets/components/budgetdetails/SubBudgetList.es.js.map +1 -1
  11. package/dist/budgets/components/budgetlist/BudgetRow.es.js +15 -26
  12. package/dist/budgets/components/budgetlist/BudgetRow.es.js.map +1 -1
  13. package/dist/budgets/components/budgetlist/SubBudgetRow.es.js +12 -55
  14. package/dist/budgets/components/budgetlist/SubBudgetRow.es.js.map +1 -1
  15. package/dist/budgets/components/shared/BudgetAmount.es.js +14 -15
  16. package/dist/budgets/components/shared/BudgetAmount.es.js.map +1 -1
  17. package/dist/budgets/components/shared/BudgetDonut.d.ts +8 -0
  18. package/dist/budgets/components/shared/BudgetDonut.es.js +25 -0
  19. package/dist/budgets/components/shared/BudgetDonut.es.js.map +1 -0
  20. package/dist/budgets/components/shared/SubBudgetCategory.d.ts +7 -0
  21. package/dist/budgets/components/shared/SubBudgetCategory.es.js +45 -0
  22. package/dist/budgets/components/shared/SubBudgetCategory.es.js.map +1 -0
  23. package/dist/core/stores/BudgetsStore.d.ts +3 -1
  24. package/dist/core/stores/BudgetsStore.es.js +40 -32
  25. package/dist/core/stores/BudgetsStore.es.js.map +1 -1
  26. package/dist/core/types/localization/BudgetsCopy.d.ts +3 -0
  27. package/dist/core/utils/BudgetUtil.es.js +56 -50
  28. package/dist/core/utils/BudgetUtil.es.js.map +1 -1
  29. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+
2
+ ## [9.4.1] - 08-25-2026
3
+
4
+ - **UPDATED** - Sub budget totals now roll up to parent budget total
5
+
1
6
  ## [9.4.0] - 08-25-2026
2
7
 
3
8
  - **ADDED** - insights-v2.0 module: comprehensive reusable component library for insights UI
@@ -1,106 +1,144 @@
1
- import { buildDynamicCopy as c } from "../../core/utils/Localization.es.js";
2
- import { useBudgetsStore as E, useGlobalCopyStore as N, useGlobalUiStore as P, useTransactionStore as G } from "../../common/context/hooks.es.js";
3
- import _ from "../../common/components/dialog/Dialog.es.js";
4
- import I from "../../common/components/drawer/Drawer.es.js";
5
- import { BudgetAmount as $ } from "./shared/BudgetAmount.es.js";
6
- import { BudgetDetails as j } from "./budgetdetails/BudgetDetails.es.js";
7
- import r from "react";
8
- import { observer as F } from "mobx-react-lite";
9
- import { Text as R } from "@mxenabled/mxui";
10
- import { jsx as o, jsxs as f } from "react/jsx-runtime";
11
- import U from "@mui/material/Alert";
12
- import k from "@mui/material/Snackbar";
13
- var Z = F(() => {
14
- const { selectedAccountGuids: b } = P(), { budgets: t, common: n } = N(), { alert: d, dateRange: h, deleteBudget: C, selectedBudget: e, selectedSubBudget: S, setAlert: a, setSelectedBudget: B, updateBudget: A } = E(), { setFilter: D } = G(), [v, u] = r.useState(!1), [x, s] = r.useState(!1), [O, m] = r.useState(!1), [i, l] = r.useState("");
15
- r.useEffect(() => {
16
- e && !S && (l(`${e.amount}`), u(!0), D({
17
- accounts: b,
18
- dateRange: h,
19
- custom: (y) => y.category_guid === e.category_guid || y.top_level_category_guid === e.category_guid,
20
- showSplits: !0
21
- }));
1
+ import { buildDynamicCopy as b } from "../../core/utils/Localization.es.js";
2
+ import { useBudgetsStore as H, useGlobalCopyStore as L, useGlobalUiStore as M, useTransactionStore as q } from "../../common/context/hooks.es.js";
3
+ import C from "../../common/components/dialog/Dialog.es.js";
4
+ import J from "../../common/components/drawer/Drawer.es.js";
5
+ import { BudgetAmount as K } from "./shared/BudgetAmount.es.js";
6
+ import { BudgetDetails as Q } from "./budgetdetails/BudgetDetails.es.js";
7
+ import { SubBudgetAmounts as V } from "./budgetdetails/SubBudgetAmounts.es.js";
8
+ import s from "react";
9
+ import { observer as W } from "mobx-react-lite";
10
+ import { Text as X } from "@mxenabled/mxui";
11
+ import { jsx as n, jsxs as y } from "react/jsx-runtime";
12
+ import Y from "@mui/material/Alert";
13
+ import Z from "@mui/material/Snackbar";
14
+ var ge = W(() => {
15
+ const { selectedAccountGuids: v } = M(), { budgets: r, common: m } = L(), { alert: f, dateRange: N, deleteBudget: x, selectedBudget: e, selectedSubBudget: D, setAlert: u, setSelectedBudget: O, updateBudget: _ } = H(), { setFilter: T } = q(), [w, S] = s.useState(!1), [E, g] = s.useState(!1), [P, B] = s.useState(!1), [a, d] = s.useState(""), [c, p] = s.useState({});
16
+ s.useEffect(() => {
17
+ if (e && !D) {
18
+ d(`${e.amount}`);
19
+ const o = {};
20
+ e.subBudgets.forEach((t) => {
21
+ o[t.guid] = `${t.amount}`;
22
+ }), p(o), S(!0), T({
23
+ accounts: v,
24
+ dateRange: N,
25
+ custom: (t) => t.category_guid === e.category_guid || t.top_level_category_guid === e.category_guid,
26
+ showSplits: !0
27
+ });
28
+ }
22
29
  }, [e]);
23
- const T = async () => {
24
- e && (await A({
25
- ...e,
26
- amount: Number(i),
27
- percentage: e.category.totalAmount / Number(i) * 100
28
- }), s(!1), a(c(t.alert_budget_updated, e.category.name)));
29
- }, w = async () => {
30
- e && (await C(e.guid), a(c(t.alert_budget_deleted, e.category.name))), p();
31
- }, p = () => {
32
- u(!1), setTimeout(() => {
33
- B(void 0);
30
+ const $ = (o, t) => {
31
+ const i = {
32
+ ...c,
33
+ [o]: t
34
+ }, R = e?.subBudgets.reduce((U, z) => U + (Number(i[z.guid]) || 0), 0);
35
+ p(i), d(`${R ?? 0}`);
36
+ }, I = async () => {
37
+ if (e) {
38
+ let o = !0;
39
+ e.subBudgets.length > 0 ? o = (await Promise.all(e.subBudgets.map((t) => {
40
+ const i = Number(c[t.guid] ?? t.amount);
41
+ return _({
42
+ ...t,
43
+ amount: i,
44
+ percentage: t.category.currentAmount / (i || 1) * 100
45
+ });
46
+ }))).every((t) => t.isSuccess) : o = (await _({
47
+ ...e,
48
+ amount: Number(a),
49
+ percentage: e.category.totalAmount / (Number(a) || 1) * 100
50
+ })).isSuccess, o && (g(!1), u(b(r.alert_budget_updated, e.category.name)));
51
+ }
52
+ }, G = async () => {
53
+ e && (await x(e.guid), u(b(r.alert_budget_deleted, e.category.name))), h();
54
+ }, h = () => {
55
+ S(!1), setTimeout(() => {
56
+ O(void 0);
34
57
  }, 250);
35
- }, g = () => {
36
- s(!1), l(`${e?.amount}`);
58
+ }, A = () => {
59
+ g(!1), d(`${e?.amount}`);
60
+ const o = {};
61
+ e?.subBudgets.forEach((t) => {
62
+ o[t.guid] = `${t.amount}`;
63
+ }), p(o);
37
64
  };
38
- if (e)
39
- return /* @__PURE__ */ f(r.Fragment, { children: [
40
- /* @__PURE__ */ f(I, {
41
- ariaLabelClose: n.close_aria,
42
- isOpen: v,
43
- onClose: p,
44
- onPrimaryAction: () => s(!0),
45
- onSecondaryAction: () => m(!0),
46
- primaryText: t.details_edit_button,
47
- secondaryColor: "error",
48
- secondaryText: t.details_delete_button,
49
- title: t.details_title,
50
- children: [/* @__PURE__ */ o(j, { budget: e }), /* @__PURE__ */ o(k, {
51
- anchorOrigin: {
52
- vertical: "bottom",
53
- horizontal: "right"
54
- },
55
- autoHideDuration: 3500,
56
- onClose: () => a(""),
57
- open: !!d,
58
- children: /* @__PURE__ */ o(U, {
59
- closeText: "",
60
- onClose: () => a(""),
61
- severity: "success",
62
- variant: "filled",
63
- children: d
64
- })
65
- })]
66
- }),
67
- /* @__PURE__ */ o(_, {
68
- copy: {
69
- close_aria: n.close_aria,
70
- title: t.details_edit_title
71
- },
72
- disablePrimaryButton: Number(i) <= 0,
73
- isOpen: x,
74
- onClose: g,
75
- onPrimaryAction: T,
76
- onSecondaryAction: g,
77
- primaryText: t.edit_save_button,
78
- children: /* @__PURE__ */ o($, {
79
- amount: i,
80
- categoryName: e.category.name,
81
- onAmountChanged: l
82
- })
83
- }),
84
- /* @__PURE__ */ o(_, {
85
- copy: {
86
- close_aria: n.close_aria,
87
- title: t.delete_title
65
+ if (!e) return;
66
+ const l = e.subBudgets.length > 0, j = a === "" || Number(a) < 0 || isNaN(Number(a)), k = l && e.subBudgets.some((o) => {
67
+ const t = c[o.guid];
68
+ return t === void 0 || t === "" || Number(t) < 0 || isNaN(Number(t));
69
+ }), F = l ? k : j;
70
+ return /* @__PURE__ */ y(s.Fragment, { children: [
71
+ /* @__PURE__ */ y(J, {
72
+ ariaLabelClose: m.close_aria,
73
+ isOpen: w,
74
+ onClose: h,
75
+ onPrimaryAction: () => g(!0),
76
+ onSecondaryAction: () => B(!0),
77
+ primaryText: r.details_edit_button,
78
+ secondaryColor: "error",
79
+ secondaryText: r.details_delete_button,
80
+ title: r.details_title,
81
+ children: [/* @__PURE__ */ n(Q, { budget: e }), /* @__PURE__ */ n(Z, {
82
+ anchorOrigin: {
83
+ vertical: "bottom",
84
+ horizontal: "right"
88
85
  },
89
- isOpen: O,
90
- onClose: () => m(!1),
91
- onPrimaryAction: w,
92
- primaryColor: "error",
93
- primaryText: t.details_delete_button,
94
- secondaryColor: "secondary",
95
- children: /* @__PURE__ */ o(R, {
96
- variant: "subtitle1",
97
- children: c(t.delete_description, e.category.name)
86
+ autoHideDuration: 3500,
87
+ onClose: () => u(""),
88
+ open: !!f,
89
+ children: /* @__PURE__ */ n(Y, {
90
+ closeText: "",
91
+ onClose: () => u(""),
92
+ severity: "success",
93
+ variant: "filled",
94
+ children: f
98
95
  })
96
+ })]
97
+ }),
98
+ /* @__PURE__ */ y(C, {
99
+ copy: {
100
+ close_aria: m.close_aria,
101
+ title: r.details_edit_title
102
+ },
103
+ disablePrimaryButton: F,
104
+ isOpen: E,
105
+ onClose: A,
106
+ onPrimaryAction: I,
107
+ onSecondaryAction: A,
108
+ primaryText: r.edit_save_button,
109
+ sx: { "& .MuiStack-root:first-child": { pb: 8 } },
110
+ children: [!l && /* @__PURE__ */ n(K, {
111
+ amount: a,
112
+ categoryName: e.category.name,
113
+ onAmountChanged: d
114
+ }), l && /* @__PURE__ */ n(V, {
115
+ amount: a,
116
+ categoryName: e.category.name,
117
+ onSubBudgetAmountChanged: $,
118
+ subBudgetAmounts: c,
119
+ subBudgets: e.subBudgets
120
+ })]
121
+ }),
122
+ /* @__PURE__ */ n(C, {
123
+ copy: {
124
+ close_aria: m.close_aria,
125
+ title: r.delete_title
126
+ },
127
+ isOpen: P,
128
+ onClose: () => B(!1),
129
+ onPrimaryAction: G,
130
+ primaryColor: "error",
131
+ primaryText: r.details_delete_button,
132
+ secondaryColor: "secondary",
133
+ children: /* @__PURE__ */ n(X, {
134
+ variant: "subtitle1",
135
+ children: b(r.delete_description, e.category.name)
99
136
  })
100
- ] });
137
+ })
138
+ ] });
101
139
  });
102
140
  export {
103
- Z as BudgetDetailsDrawer
141
+ ge as BudgetDetailsDrawer
104
142
  };
105
143
 
106
144
  //# sourceMappingURL=BudgetDetailsDrawer.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BudgetDetailsDrawer.es.js","names":[],"sources":["../../../src/budgets/components/BudgetDetailsDrawer.tsx"],"sourcesContent":["import React from 'react'\n\nimport { observer } from 'mobx-react-lite'\n\nimport Alert from '@mui/material/Alert'\nimport Snackbar from '@mui/material/Snackbar'\n\nimport { Text } from '@mxenabled/mxui'\n\nimport {\n Dialog,\n Drawer,\n useBudgetsStore,\n useGlobalCopyStore,\n useGlobalUiStore,\n useTransactionStore,\n} from '../../common'\nimport { type Budget, type Transaction } from '../../core'\n\nimport { BudgetDetails } from './budgetdetails/BudgetDetails'\nimport { BudgetAmount } from './shared/BudgetAmount'\nimport { buildDynamicCopy } from '../../core/utils/Localization'\n\nexport const BudgetDetailsDrawer = observer(() => {\n const { selectedAccountGuids } = useGlobalUiStore()\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n const {\n alert,\n dateRange,\n deleteBudget,\n selectedBudget,\n selectedSubBudget,\n setAlert,\n setSelectedBudget,\n updateBudget,\n } = useBudgetsStore()\n const { setFilter } = useTransactionStore()\n\n const [isOpen, setIsOpen] = React.useState(false)\n const [isEditOpen, setIsEditOpen] = React.useState(false)\n const [isDeleteOpen, setIsDeleteOpen] = React.useState(false)\n const [amount, setAmount] = React.useState(``)\n\n React.useEffect(() => {\n if (selectedBudget && !selectedSubBudget) {\n setAmount(`${selectedBudget.amount}`)\n setIsOpen(true)\n setFilter({\n accounts: selectedAccountGuids,\n dateRange: dateRange,\n custom: (t: Transaction) =>\n t.category_guid === selectedBudget.category_guid ||\n t.top_level_category_guid === selectedBudget.category_guid,\n showSplits: true,\n })\n }\n }, [selectedBudget])\n\n const handleUpdateBudget = async () => {\n if (selectedBudget) {\n await updateBudget({\n ...selectedBudget,\n amount: Number(amount),\n percentage: (selectedBudget.category.totalAmount / Number(amount)) * 100,\n } as Budget)\n setIsEditOpen(false)\n setAlert(buildDynamicCopy(copy.alert_budget_updated, selectedBudget.category.name) as string)\n }\n }\n\n const handleDeleteBudget = async () => {\n if (selectedBudget) {\n await deleteBudget(selectedBudget.guid)\n setAlert(buildDynamicCopy(copy.alert_budget_deleted, selectedBudget.category.name) as string)\n }\n handleClose()\n }\n\n const handleClose = () => {\n setIsOpen(false)\n // Wait for the close animation before set the selected budget\n setTimeout(() => {\n setSelectedBudget(undefined)\n }, 250)\n }\n\n const handleEditClose = () => {\n setIsEditOpen(false)\n setAmount(`${selectedBudget?.amount}`)\n }\n\n if (!selectedBudget) {\n return undefined\n }\n\n return (\n <React.Fragment>\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isOpen}\n onClose={handleClose}\n onPrimaryAction={() => setIsEditOpen(true)}\n onSecondaryAction={() => setIsDeleteOpen(true)}\n primaryText={copy.details_edit_button}\n secondaryColor=\"error\"\n secondaryText={copy.details_delete_button}\n title={copy.details_title}\n >\n <BudgetDetails budget={selectedBudget} />\n <Snackbar\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n autoHideDuration={3500}\n onClose={() => setAlert('')}\n open={Boolean(alert)}\n >\n <Alert closeText=\"\" onClose={() => setAlert('')} severity={'success'} variant=\"filled\">\n {alert}\n </Alert>\n </Snackbar>\n </Drawer>\n\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.details_edit_title }}\n disablePrimaryButton={Number(amount) <= 0}\n isOpen={isEditOpen}\n onClose={handleEditClose}\n onPrimaryAction={handleUpdateBudget}\n onSecondaryAction={handleEditClose}\n primaryText={copy.edit_save_button}\n >\n <BudgetAmount\n amount={amount}\n categoryName={selectedBudget.category.name}\n onAmountChanged={setAmount}\n />\n </Dialog>\n\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.delete_title }}\n isOpen={isDeleteOpen}\n onClose={() => setIsDeleteOpen(false)}\n onPrimaryAction={handleDeleteBudget}\n primaryColor=\"error\"\n primaryText={copy.details_delete_button}\n secondaryColor=\"secondary\"\n >\n <Text variant=\"subtitle1\">\n {buildDynamicCopy(copy.delete_description, selectedBudget.category.name) as string}\n </Text>\n </Dialog>\n </React.Fragment>\n )\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"BudgetDetailsDrawer.es.js","names":[],"sources":["../../../src/budgets/components/BudgetDetailsDrawer.tsx"],"sourcesContent":["import React from 'react'\n\nimport { observer } from 'mobx-react-lite'\n\nimport Alert from '@mui/material/Alert'\nimport Snackbar from '@mui/material/Snackbar'\n\nimport { Text } from '@mxenabled/mxui'\n\nimport {\n Dialog,\n Drawer,\n useBudgetsStore,\n useGlobalCopyStore,\n useGlobalUiStore,\n useTransactionStore,\n} from '../../common'\nimport { type Budget, type Transaction } from '../../core'\n\nimport { BudgetDetails } from './budgetdetails/BudgetDetails'\nimport { BudgetAmount } from './shared/BudgetAmount'\nimport { buildDynamicCopy } from '../../core/utils/Localization'\nimport { SubBudgetAmounts } from './budgetdetails/SubBudgetAmounts'\n\nexport const BudgetDetailsDrawer = observer(() => {\n const { selectedAccountGuids } = useGlobalUiStore()\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n const {\n alert,\n dateRange,\n deleteBudget,\n selectedBudget,\n selectedSubBudget,\n setAlert,\n setSelectedBudget,\n updateBudget,\n } = useBudgetsStore()\n const { setFilter } = useTransactionStore()\n\n const [isOpen, setIsOpen] = React.useState(false)\n const [isEditOpen, setIsEditOpen] = React.useState(false)\n const [isDeleteOpen, setIsDeleteOpen] = React.useState(false)\n const [amount, setAmount] = React.useState(``)\n const [subBudgetAmounts, setSubBudgetAmounts] = React.useState<Record<string, string>>({})\n\n React.useEffect(() => {\n if (selectedBudget && !selectedSubBudget) {\n setAmount(`${selectedBudget.amount}`)\n const initialSubAmounts: Record<string, string> = {}\n selectedBudget.subBudgets.forEach((sb) => {\n initialSubAmounts[sb.guid] = `${sb.amount}`\n })\n setSubBudgetAmounts(initialSubAmounts)\n setIsOpen(true)\n setFilter({\n accounts: selectedAccountGuids,\n dateRange: dateRange,\n custom: (t: Transaction) =>\n t.category_guid === selectedBudget.category_guid ||\n t.top_level_category_guid === selectedBudget.category_guid,\n showSplits: true,\n })\n }\n }, [selectedBudget])\n\n const handleSubBudgetAmountChanged = (guid: string, newAmount: string) => {\n const updated = { ...subBudgetAmounts, [guid]: newAmount }\n const newTotal = selectedBudget?.subBudgets.reduce(\n (sum, sb) => sum + (Number(updated[sb.guid]) || 0),\n 0,\n )\n setSubBudgetAmounts(updated)\n setAmount(`${newTotal ?? 0}`)\n }\n\n const handleUpdateBudget = async () => {\n if (selectedBudget) {\n let allSucceeded = true\n\n if (selectedBudget.subBudgets.length > 0) {\n const results = await Promise.all(\n selectedBudget.subBudgets.map((subBudget) => {\n const newAmount = Number(subBudgetAmounts[subBudget.guid] ?? subBudget.amount)\n return updateBudget({\n ...subBudget,\n amount: newAmount,\n percentage: (subBudget.category.currentAmount / (newAmount || 1)) * 100,\n } as Budget)\n }),\n )\n allSucceeded = results.every((r) => r.isSuccess)\n } else {\n const result = await updateBudget({\n ...selectedBudget,\n amount: Number(amount),\n percentage: (selectedBudget.category.totalAmount / (Number(amount) || 1)) * 100,\n } as Budget)\n allSucceeded = result.isSuccess\n }\n\n if (allSucceeded) {\n setIsEditOpen(false)\n setAlert(\n buildDynamicCopy(copy.alert_budget_updated, selectedBudget.category.name) as string,\n )\n }\n }\n }\n\n const handleDeleteBudget = async () => {\n if (selectedBudget) {\n await deleteBudget(selectedBudget.guid)\n setAlert(buildDynamicCopy(copy.alert_budget_deleted, selectedBudget.category.name) as string)\n }\n handleClose()\n }\n\n const handleClose = () => {\n setIsOpen(false)\n // Wait for the close animation before set the selected budget\n setTimeout(() => {\n setSelectedBudget(undefined)\n }, 250)\n }\n\n const handleEditClose = () => {\n setIsEditOpen(false)\n setAmount(`${selectedBudget?.amount}`)\n const initialSubAmounts: Record<string, string> = {}\n selectedBudget?.subBudgets.forEach((sb) => {\n initialSubAmounts[sb.guid] = `${sb.amount}`\n })\n setSubBudgetAmounts(initialSubAmounts)\n }\n\n if (!selectedBudget) {\n return undefined\n }\n\n const hasSubBudgets = selectedBudget.subBudgets.length > 0\n const isParentInvalid = amount === '' || Number(amount) < 0 || isNaN(Number(amount))\n const isSubBudgetInvalid =\n hasSubBudgets &&\n selectedBudget.subBudgets.some((sb) => {\n const val = subBudgetAmounts[sb.guid]\n return val === undefined || val === '' || Number(val) < 0 || isNaN(Number(val))\n })\n const disablePrimaryButton = hasSubBudgets ? isSubBudgetInvalid : isParentInvalid\n\n return (\n <React.Fragment>\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isOpen}\n onClose={handleClose}\n onPrimaryAction={() => setIsEditOpen(true)}\n onSecondaryAction={() => setIsDeleteOpen(true)}\n primaryText={copy.details_edit_button}\n secondaryColor=\"error\"\n secondaryText={copy.details_delete_button}\n title={copy.details_title}\n >\n <BudgetDetails budget={selectedBudget} />\n <Snackbar\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n autoHideDuration={3500}\n onClose={() => setAlert('')}\n open={Boolean(alert)}\n >\n <Alert closeText=\"\" onClose={() => setAlert('')} severity={'success'} variant=\"filled\">\n {alert}\n </Alert>\n </Snackbar>\n </Drawer>\n\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.details_edit_title }}\n disablePrimaryButton={disablePrimaryButton}\n isOpen={isEditOpen}\n onClose={handleEditClose}\n onPrimaryAction={handleUpdateBudget}\n onSecondaryAction={handleEditClose}\n primaryText={copy.edit_save_button}\n sx={{\n '& .MuiStack-root:first-child': {\n pb: 8,\n },\n }}\n >\n {!hasSubBudgets && (\n <BudgetAmount\n amount={amount}\n categoryName={selectedBudget.category.name}\n onAmountChanged={setAmount}\n />\n )}\n {hasSubBudgets && (\n <SubBudgetAmounts\n amount={amount}\n categoryName={selectedBudget.category.name}\n onSubBudgetAmountChanged={handleSubBudgetAmountChanged}\n subBudgetAmounts={subBudgetAmounts}\n subBudgets={selectedBudget.subBudgets}\n />\n )}\n </Dialog>\n\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.delete_title }}\n isOpen={isDeleteOpen}\n onClose={() => setIsDeleteOpen(false)}\n onPrimaryAction={handleDeleteBudget}\n primaryColor=\"error\"\n primaryText={copy.details_delete_button}\n secondaryColor=\"secondary\"\n >\n <Text variant=\"subtitle1\">\n {buildDynamicCopy(copy.delete_description, selectedBudget.category.name) as string}\n </Text>\n </Dialog>\n </React.Fragment>\n )\n})\n"],"mappings":"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"}
@@ -1,98 +1,99 @@
1
- import { useBudgetsStore as v, useGlobalCopyStore as I } from "../../../common/context/hooks.es.js";
2
- import O from "../../../common/components/dialog/Dialog.es.js";
3
- import w from "../../../common/components/drawer/Drawer.es.js";
4
- import { useCategoryUiStore as L } from "../../../categories/context/hooks.es.js";
5
- import N from "../../../categories/components/CategoryRow.es.js";
6
- import { BudgetAmount as j } from "../shared/BudgetAmount.es.js";
7
- import t from "react";
8
- import { observer as k } from "mobx-react-lite";
9
- import p from "@mui/material/Stack";
10
- import { Icon as f, Text as D } from "@mxenabled/mxui";
11
- import { jsx as e, jsxs as m } from "react/jsx-runtime";
12
- import G from "@mui/material/Box";
13
- import P from "@mui/material/Divider";
14
- import T from "@mui/material/List";
15
- import z from "@mui/material/ListItem";
16
- import E from "@mui/material/ListItemButton";
17
- import R from "@mui/material/ListItemText";
18
- var re = k(({ category: o, parentBudget: g }) => {
19
- const { budgets: r, common: u } = I(), { setExpandedGuid: b, setOnSelect: h } = L(), { addBudget: y } = v(), [C, n] = t.useState(!1), [_, a] = t.useState(!1), [i, l] = t.useState(""), [d, c] = t.useState(void 0);
20
- t.useEffect(() => {
21
- h((A) => {
22
- const s = o.subCategories.find((B) => B.guid === A);
23
- s && (c(s), l(`${s.currentAmount === 0 ? "" : s.currentAmount}`), a(!0));
1
+ import { useBudgetsStore as w, useCategoryStore as j, useGlobalCopyStore as D } from "../../../common/context/hooks.es.js";
2
+ import L from "../../../common/components/dialog/Dialog.es.js";
3
+ import N from "../../../common/components/drawer/Drawer.es.js";
4
+ import { findDetailedCategory as $, findDetailedSubCategory as k } from "../../../core/utils/CategoryUtil.es.js";
5
+ import { useCategoryUiStore as G } from "../../../categories/context/hooks.es.js";
6
+ import P from "../../../categories/components/CategoryRow.es.js";
7
+ import { BudgetAmount as T } from "../shared/BudgetAmount.es.js";
8
+ import r from "react";
9
+ import { observer as z } from "mobx-react-lite";
10
+ import b from "@mui/material/Stack";
11
+ import { Icon as y, Text as E } from "@mxenabled/mxui";
12
+ import { jsx as e, jsxs as l } from "react/jsx-runtime";
13
+ import R from "@mui/material/Box";
14
+ import K from "@mui/material/Divider";
15
+ import U from "@mui/material/List";
16
+ import q from "@mui/material/ListItem";
17
+ import F from "@mui/material/ListItemButton";
18
+ import H from "@mui/material/ListItemText";
19
+ var ue = z(({ category: n, parentBudget: C }) => {
20
+ const { budgets: i, common: p } = D(), { setExpandedGuid: h, setOnSelect: _ } = G(), { addBudget: S } = w(), { detailedCategories: d } = j(), [x, m] = r.useState(!1), [A, u] = r.useState(!1), [a, g] = r.useState(""), [c, f] = r.useState(void 0), s = $(d, n.guid) || n, B = d.map((o) => `${o.guid}:${o.subCategories.map((t) => t.guid).join(",")}`).join(";");
21
+ r.useEffect(() => {
22
+ _((o) => {
23
+ const t = s.subCategories.find((O) => O.guid === o) || k(d, o);
24
+ t && (f(t), g(`${t.currentAmount === 0 ? "" : t.currentAmount}`), u(!0));
24
25
  });
25
- }, []);
26
- const x = () => {
27
- b(o.guid), n(!0);
28
- }, S = async () => {
29
- d && Number(i) > 0 && (await y(d, Number(i), g.guid), a(!1), n(!1), c(void 0));
26
+ }, [B, n.guid]);
27
+ const v = () => {
28
+ h(s.guid), m(!0);
29
+ }, I = async () => {
30
+ c && Number(a) > 0 && (await S(c, Number(a), C.guid), u(!1), m(!1), f(void 0));
30
31
  };
31
- return /* @__PURE__ */ m(G, { children: [
32
- /* @__PURE__ */ e(z, {
32
+ return /* @__PURE__ */ l(R, { children: [
33
+ /* @__PURE__ */ e(q, {
33
34
  disableGutters: !0,
34
35
  disablePadding: !0,
35
36
  sx: { bgcolor: "background.paper" },
36
- children: /* @__PURE__ */ e(E, {
37
- onClick: x,
38
- children: /* @__PURE__ */ e(R, { children: /* @__PURE__ */ m(p, {
37
+ children: /* @__PURE__ */ e(F, {
38
+ onClick: v,
39
+ children: /* @__PURE__ */ e(H, { children: /* @__PURE__ */ l(b, {
39
40
  alignItems: "center",
40
41
  direction: "row",
41
42
  justifyContent: "space-between",
42
- children: [/* @__PURE__ */ m(p, {
43
+ children: [/* @__PURE__ */ l(b, {
43
44
  alignItems: "center",
44
45
  direction: "row",
45
46
  gap: 8,
46
- children: [/* @__PURE__ */ e(f, {
47
+ children: [/* @__PURE__ */ e(y, {
47
48
  fill: !0,
48
49
  name: "add_box",
49
50
  size: 24,
50
- sx: { color: "primary.light" }
51
- }), /* @__PURE__ */ e(D, {
51
+ sx: { color: "primary.main" }
52
+ }), /* @__PURE__ */ e(E, {
52
53
  bold: !0,
53
- sx: { color: "primary.light" },
54
+ sx: { color: "primary.main" },
54
55
  variant: "body1",
55
- children: r.add_sub_budget_button
56
+ children: i.add_sub_budget_button
56
57
  })]
57
- }), /* @__PURE__ */ e(f, {
58
+ }), /* @__PURE__ */ e(y, {
58
59
  name: "chevron_right",
59
60
  size: 24,
60
- sx: { color: "primary.light" }
61
+ sx: { color: "primary.main" }
61
62
  })]
62
63
  }) })
63
64
  })
64
65
  }),
65
- /* @__PURE__ */ e(P, {}),
66
- /* @__PURE__ */ e(w, {
67
- ariaLabelClose: u.close_aria,
68
- isOpen: C,
69
- onClose: () => n(!1),
70
- title: r.add_sub_budget_title,
71
- children: /* @__PURE__ */ e(T, { children: /* @__PURE__ */ e(N, {
72
- category: o,
73
- subCategories: o.subCategories
66
+ /* @__PURE__ */ e(K, {}),
67
+ /* @__PURE__ */ e(N, {
68
+ ariaLabelClose: p.close_aria,
69
+ isOpen: x,
70
+ onClose: () => m(!1),
71
+ title: i.add_sub_budget_title,
72
+ children: /* @__PURE__ */ e(U, { children: /* @__PURE__ */ e(P, {
73
+ category: s,
74
+ subCategories: s.subCategories
74
75
  }) })
75
76
  }),
76
- /* @__PURE__ */ e(O, {
77
+ /* @__PURE__ */ e(L, {
77
78
  copy: {
78
- close_aria: u.close_aria,
79
- title: r.add_title
79
+ close_aria: p.close_aria,
80
+ title: i.add_title
80
81
  },
81
- disablePrimaryButton: Number(i) <= 0,
82
- isOpen: _,
83
- onClose: () => a(!1),
84
- onPrimaryAction: S,
85
- primaryText: r.add_save_button,
86
- children: /* @__PURE__ */ e(j, {
87
- amount: i,
88
- categoryName: d?.name || "",
89
- onAmountChanged: l
82
+ disablePrimaryButton: Number(a) <= 0,
83
+ isOpen: A,
84
+ onClose: () => u(!1),
85
+ onPrimaryAction: I,
86
+ primaryText: i.add_save_button,
87
+ children: /* @__PURE__ */ e(T, {
88
+ amount: a,
89
+ categoryName: c?.name || "",
90
+ onAmountChanged: g
90
91
  })
91
92
  })
92
93
  ] });
93
94
  });
94
95
  export {
95
- re as AddSubBudget
96
+ ue as AddSubBudget
96
97
  };
97
98
 
98
99
  //# sourceMappingURL=AddSubBudget.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AddSubBudget.es.js","names":[],"sources":["../../../../src/budgets/components/budgetdetails/AddSubBudget.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport Stack from '@mui/material/Stack'\n\nimport { Icon, Text } from '@mxenabled/mxui'\n\nimport { Dialog, Drawer, useBudgetsStore, useGlobalCopyStore } from '../../../common'\nimport { type DetailedBudget, type DetailedCategory } from '../../../core'\nimport { CategoryRow, useCategoryUiStore } from '../../../categories'\nimport { BudgetAmount } from '../shared/BudgetAmount'\n\ninterface AddSubBudgetProps {\n category: DetailedCategory\n parentBudget: DetailedBudget\n}\n\nexport const AddSubBudget: React.FC<AddSubBudgetProps> = observer(({ category, parentBudget }) => {\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n const { setExpandedGuid, setOnSelect } = useCategoryUiStore()\n const { addBudget } = useBudgetsStore()\n\n const [isOpen, setIsOpen] = React.useState(false)\n const [isAddBudgetOpen, setIsAddBudgetOpen] = React.useState(false)\n const [amount, setAmount] = React.useState('')\n const [subCategory, setSubCategory] = React.useState<DetailedCategory | undefined>(undefined)\n\n React.useEffect(() => {\n setOnSelect((guid: string) => {\n const subCategory = category.subCategories.find((sc) => sc.guid === guid)\n if (subCategory) {\n setSubCategory(subCategory)\n setAmount(`${subCategory.currentAmount === 0 ? '' : subCategory.currentAmount}`)\n setIsAddBudgetOpen(true)\n }\n })\n }, [])\n\n const handleOpen = () => {\n setExpandedGuid(category.guid)\n setIsOpen(true)\n }\n\n const handleAddSubBudget = async () => {\n if (subCategory && Number(amount) > 0) {\n await addBudget(subCategory, Number(amount), parentBudget.guid)\n setIsAddBudgetOpen(false)\n setIsOpen(false)\n setSubCategory(undefined)\n }\n }\n\n return (\n <Box>\n <ListItem disableGutters={true} disablePadding={true} sx={{ bgcolor: 'background.paper' }}>\n <ListItemButton onClick={handleOpen}>\n <ListItemText>\n <Stack alignItems=\"center\" direction=\"row\" justifyContent=\"space-between\">\n <Stack alignItems=\"center\" direction=\"row\" gap={8}>\n <Icon fill={true} name=\"add_box\" size={24} sx={{ color: 'primary.light' }} />\n <Text bold={true} sx={{ color: 'primary.light' }} variant=\"body1\">\n {copy.add_sub_budget_button}\n </Text>\n </Stack>\n <Icon name=\"chevron_right\" size={24} sx={{ color: 'primary.light' }} />\n </Stack>\n </ListItemText>\n </ListItemButton>\n </ListItem>\n <Divider />\n\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n title={copy.add_sub_budget_title}\n >\n <List>\n <CategoryRow category={category} subCategories={category.subCategories} />\n </List>\n </Drawer>\n\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.add_title }}\n disablePrimaryButton={Number(amount) <= 0}\n isOpen={isAddBudgetOpen}\n onClose={() => setIsAddBudgetOpen(false)}\n onPrimaryAction={handleAddSubBudget}\n primaryText={copy.add_save_button}\n >\n <BudgetAmount\n amount={amount}\n categoryName={subCategory?.name || ''}\n onAmountChanged={setAmount}\n />\n </Dialog>\n </Box>\n )\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"AddSubBudget.es.js","names":[],"sources":["../../../../src/budgets/components/budgetdetails/AddSubBudget.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport Stack from '@mui/material/Stack'\n\nimport { Icon, Text } from '@mxenabled/mxui'\n\nimport {\n Dialog,\n Drawer,\n useBudgetsStore,\n useCategoryStore,\n useGlobalCopyStore,\n} from '../../../common'\nimport { type DetailedBudget, type DetailedCategory } from '../../../core'\nimport { CategoryRow, useCategoryUiStore } from '../../../categories'\nimport { BudgetAmount } from '../shared/BudgetAmount'\nimport { findDetailedCategory, findDetailedSubCategory } from '../../../core/utils/CategoryUtil'\n\ninterface AddSubBudgetProps {\n category: DetailedCategory\n parentBudget: DetailedBudget\n}\n\nexport const AddSubBudget: React.FC<AddSubBudgetProps> = observer(({ category, parentBudget }) => {\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n const { setExpandedGuid, setOnSelect } = useCategoryUiStore()\n const { addBudget } = useBudgetsStore()\n const { detailedCategories } = useCategoryStore()\n\n const [isOpen, setIsOpen] = React.useState(false)\n const [isAddBudgetOpen, setIsAddBudgetOpen] = React.useState(false)\n const [amount, setAmount] = React.useState('')\n const [subCategory, setSubCategory] = React.useState<DetailedCategory | undefined>(undefined)\n\n const currentCategory = findDetailedCategory(detailedCategories, category.guid) || category\n const categoryKey = detailedCategories\n .map((c) => `${c.guid}:${c.subCategories.map((sc) => sc.guid).join(',')}`)\n .join(';')\n\n React.useEffect(() => {\n setOnSelect((guid: string) => {\n const selected =\n currentCategory.subCategories.find((sc) => sc.guid === guid) ||\n findDetailedSubCategory(detailedCategories, guid)\n if (selected) {\n setSubCategory(selected)\n setAmount(`${selected.currentAmount === 0 ? '' : selected.currentAmount}`)\n setIsAddBudgetOpen(true)\n }\n })\n }, [categoryKey, category.guid])\n\n const handleOpen = () => {\n setExpandedGuid(currentCategory.guid)\n setIsOpen(true)\n }\n\n const handleAddSubBudget = async () => {\n if (subCategory && Number(amount) > 0) {\n await addBudget(subCategory, Number(amount), parentBudget.guid)\n setIsAddBudgetOpen(false)\n setIsOpen(false)\n setSubCategory(undefined)\n }\n }\n\n return (\n <Box>\n <ListItem disableGutters={true} disablePadding={true} sx={{ bgcolor: 'background.paper' }}>\n <ListItemButton onClick={handleOpen}>\n <ListItemText>\n <Stack alignItems=\"center\" direction=\"row\" justifyContent=\"space-between\">\n <Stack alignItems=\"center\" direction=\"row\" gap={8}>\n <Icon fill={true} name=\"add_box\" size={24} sx={{ color: 'primary.main' }} />\n <Text bold={true} sx={{ color: 'primary.main' }} variant=\"body1\">\n {copy.add_sub_budget_button}\n </Text>\n </Stack>\n <Icon name=\"chevron_right\" size={24} sx={{ color: 'primary.main' }} />\n </Stack>\n </ListItemText>\n </ListItemButton>\n </ListItem>\n <Divider />\n\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n title={copy.add_sub_budget_title}\n >\n <List>\n <CategoryRow category={currentCategory} subCategories={currentCategory.subCategories} />\n </List>\n </Drawer>\n\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.add_title }}\n disablePrimaryButton={Number(amount) <= 0}\n isOpen={isAddBudgetOpen}\n onClose={() => setIsAddBudgetOpen(false)}\n onPrimaryAction={handleAddSubBudget}\n primaryText={copy.add_save_button}\n >\n <BudgetAmount\n amount={amount}\n categoryName={subCategory?.name || ''}\n onAmountChanged={setAmount}\n />\n </Dialog>\n </Box>\n )\n})\n"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { default as React } from 'react';
2
+ import { DetailedBudget } from '../../../core';
3
+ export interface SubBudgetAmountsProps {
4
+ amount: string;
5
+ categoryName: string;
6
+ subBudgets?: DetailedBudget[];
7
+ subBudgetAmounts?: Record<string, string>;
8
+ onSubBudgetAmountChanged?: (guid: string, amount: string) => void;
9
+ }
10
+ export declare const SubBudgetAmounts: React.FC<SubBudgetAmountsProps>;
@@ -0,0 +1,58 @@
1
+ import { buildDynamicCopy as f } from "../../../core/utils/Localization.es.js";
2
+ import { useGlobalCopyStore as s } from "../../../common/context/hooks.es.js";
3
+ import { formatCurrency as y } from "../../../core/utils/NumberFormatting.es.js";
4
+ import x from "../../../common/components/CurrencyInput.es.js";
5
+ import { SubBudgetCategory as b } from "../shared/SubBudgetCategory.es.js";
6
+ import a from "react";
7
+ import l from "@mui/material/Stack";
8
+ import { Text as i } from "@mxenabled/mxui";
9
+ import { jsx as r, jsxs as o } from "react/jsx-runtime";
10
+ import { Divider as g } from "@mui/material";
11
+ import C from "@mui/material/List";
12
+ import S from "@mui/material/ListItem";
13
+ var G = ({ amount: p, categoryName: c, subBudgets: e = [], subBudgetAmounts: d = {}, onSubBudgetAmountChanged: u }) => {
14
+ const { budgets: m } = s();
15
+ return /* @__PURE__ */ o(a.Fragment, { children: [/* @__PURE__ */ o(l, { children: [/* @__PURE__ */ r(i, {
16
+ sx: { pb: 12 },
17
+ children: f(m.your_budget_summary, c, /* @__PURE__ */ r(i, {
18
+ bold: !0,
19
+ component: "span",
20
+ children: y(Number(p), "0,0")
21
+ }))
22
+ }), /* @__PURE__ */ o(l, {
23
+ sx: {
24
+ flexDirection: "row",
25
+ mt: 12
26
+ },
27
+ children: [/* @__PURE__ */ r(i, {
28
+ bold: !0,
29
+ sx: { width: "50%" },
30
+ variant: "caption",
31
+ children: m.details_subbudgets_tab
32
+ }), /* @__PURE__ */ r(i, {
33
+ bold: !0,
34
+ sx: {
35
+ textAlign: "right",
36
+ width: "50%"
37
+ },
38
+ variant: "caption",
39
+ children: m.monthly_total
40
+ })]
41
+ })] }), /* @__PURE__ */ r(C, { children: e.map((t, n) => /* @__PURE__ */ o(a.Fragment, { children: [/* @__PURE__ */ o(S, { children: [/* @__PURE__ */ r(b, { budget: t }), /* @__PURE__ */ r(x, {
42
+ amount: d[t.guid] ?? `${t.amount}`,
43
+ autoFocus: n === 0,
44
+ label: t.category.name,
45
+ minAmount: 0,
46
+ setAmount: (h) => u?.(t.guid, h),
47
+ sx: {
48
+ ".MuiTypography-body1": { p: 0 },
49
+ width: "25%",
50
+ flexShrink: 0
51
+ }
52
+ })] }), /* @__PURE__ */ r(g, { sx: { ml: n === e.length - 1 ? 0 : 48 } })] }, t.guid)) })] });
53
+ };
54
+ export {
55
+ G as SubBudgetAmounts
56
+ };
57
+
58
+ //# sourceMappingURL=SubBudgetAmounts.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubBudgetAmounts.es.js","names":[],"sources":["../../../../src/budgets/components/budgetdetails/SubBudgetAmounts.tsx"],"sourcesContent":["import React from 'react'\n\nimport List from '@mui/material/List'\nimport ListItem from '@mui/material/ListItem'\nimport Stack from '@mui/material/Stack'\nimport { Text } from '@mxenabled/mxui'\nimport { CurrencyInput, formatCurrency, useGlobalCopyStore } from '../../../common'\nimport { buildDynamicCopy } from '../../../core/utils/Localization'\nimport { DetailedBudget } from '../../../core'\n\nimport { SubBudgetCategory } from '../shared/SubBudgetCategory'\nimport { Divider } from '@mui/material'\n\nexport interface SubBudgetAmountsProps {\n amount: string\n categoryName: string\n subBudgets?: DetailedBudget[]\n subBudgetAmounts?: Record<string, string>\n onSubBudgetAmountChanged?: (guid: string, amount: string) => void\n}\n\nexport const SubBudgetAmounts: React.FC<SubBudgetAmountsProps> = ({\n amount,\n categoryName,\n subBudgets = [],\n subBudgetAmounts = {},\n onSubBudgetAmountChanged,\n}) => {\n const { budgets: copy } = useGlobalCopyStore()\n\n return (\n <React.Fragment>\n <Stack>\n <Text sx={{ pb: 12 }}>\n {\n buildDynamicCopy(\n copy.your_budget_summary,\n categoryName,\n <Text bold={true} component=\"span\">\n {formatCurrency(Number(amount), '0,0')}\n </Text>,\n ) as string\n }\n </Text>\n <Stack sx={{ flexDirection: 'row', mt: 12 }}>\n <Text bold={true} sx={{ width: '50%' }} variant=\"caption\">\n {copy.details_subbudgets_tab}\n </Text>\n <Text bold={true} sx={{ textAlign: 'right', width: '50%' }} variant=\"caption\">\n {copy.monthly_total}\n </Text>\n </Stack>\n </Stack>\n <List>\n {subBudgets.map((subBudget, index) => (\n <React.Fragment key={subBudget.guid}>\n <ListItem>\n <SubBudgetCategory budget={subBudget} />\n <CurrencyInput\n amount={subBudgetAmounts[subBudget.guid] ?? `${subBudget.amount}`}\n autoFocus={index === 0}\n label={subBudget.category.name}\n minAmount={0}\n setAmount={(newVal) => onSubBudgetAmountChanged?.(subBudget.guid, newVal)}\n sx={{ '.MuiTypography-body1': { p: 0 }, width: '25%', flexShrink: 0 }}\n />\n </ListItem>\n <Divider sx={{ ml: index === subBudgets.length - 1 ? 0 : 48 }} />\n </React.Fragment>\n ))}\n </List>\n </React.Fragment>\n )\n}\n"],"mappings":";;;;;;;;;;;;AAqBA,IAAa,IAAA,CAAqD,EAChE,QAAA,GACA,cAAA,GACA,YAAA,IAAa,CAAC,GACd,kBAAA,IAAmB,CAAC,GACpB,0BAAA,EAAA,MACI;AACJ,QAAM,EAAE,SAAS,EAAA,IAAS,EAAmB;AAE7C,SACE,gBAAA,EAAC,EAAM,UAAP,EAAA,UAAA,CACE,gBAAA,EAAC,GAAD,EAAA,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,IAAM,IAAI,EAAE,IAAI,GAAG;AAAA,IAEf,UAAA,EACE,EAAK,qBACL,GACA,gBAAA,EAAC,GAAD;AAAA,MAAM,MAAM;AAAA,MAAM,WAAU;AAAA,MACzB,UAAA,EAAe,OAAO,CAAM,GAAG,KAAK;AAAA,IACjC,CAAA,CACR;AAAA,EAEE,CAAA,GACN,gBAAA,EAAC,GAAD;AAAA,IAAO,IAAI;AAAA,MAAE,eAAe;AAAA,MAAO,IAAI;AAAA,IAAG;AAAA,IAA1C,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,MAAM,MAAM;AAAA,MAAM,IAAI,EAAE,OAAO,MAAM;AAAA,MAAG,SAAQ;AAAA,MAC7C,UAAA,EAAK;AAAA,IACF,CAAA,GACN,gBAAA,EAAC,GAAD;AAAA,MAAM,MAAM;AAAA,MAAM,IAAI;AAAA,QAAE,WAAW;AAAA,QAAS,OAAO;AAAA,MAAM;AAAA,MAAG,SAAQ;AAAA,MACjE,UAAA,EAAK;AAAA,IACF,CAAA,CACD;AAAA,EACF,CAAA,CAAA,EAAA,CAAA,GACP,gBAAA,EAAC,GAAD,EAAA,UACG,EAAW,IAAA,CAAK,GAAW,MAC1B,gBAAA,EAAC,EAAM,UAAP,EAAA,UAAA,CACE,gBAAA,EAAC,GAAD,EAAA,UAAA,CACE,gBAAA,EAAC,GAAD,EAAmB,QAAQ,EAAY,CAAA,GACvC,gBAAA,EAAC,GAAD;AAAA,IACE,QAAQ,EAAiB,EAAU,IAAA,KAAS,GAAG,EAAU,MAAA;AAAA,IACzD,WAAW,MAAU;AAAA,IACrB,OAAO,EAAU,SAAS;AAAA,IAC1B,WAAW;AAAA,IACX,WAAA,CAAY,MAAW,IAA2B,EAAU,MAAM,CAAM;AAAA,IACxE,IAAI;AAAA,MAAE,wBAAwB,EAAE,GAAG,EAAE;AAAA,MAAG,OAAO;AAAA,MAAO,YAAY;AAAA,IAAE;AAAA,EACrE,CAAA,CACO,EAAA,CAAA,GACV,gBAAA,EAAC,GAAD,EAAS,IAAI,EAAE,IAAI,MAAU,EAAW,SAAS,IAAI,IAAI,GAAG,EAAI,CAAA,CAClD,EAAA,GAbK,EAAU,IAaf,CACjB,EACG,CAAA,CACQ,EAAA,CAAA;AAEpB"}