@mx-cartographer/experiences 9.4.54 → 9.4.56
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 +10 -0
- package/dist/budgets/components/BudgetDetailsDrawer.es.js +14 -14
- package/dist/budgets/components/BudgetDetailsDrawer.es.js.map +1 -1
- package/dist/budgets/components/budgetdetails/BudgetDetails.es.js +14 -11
- package/dist/budgets/components/budgetdetails/BudgetDetails.es.js.map +1 -1
- package/dist/budgets/components/budgetdetails/SubBudgetList.d.ts +4 -2
- package/dist/budgets/components/budgetdetails/SubBudgetList.es.js +38 -35
- package/dist/budgets/components/budgetdetails/SubBudgetList.es.js.map +1 -1
- package/dist/cashflow/CashflowOnboarding.es.js +20 -20
- package/dist/cashflow/CashflowOnboarding.es.js.map +1 -1
- package/dist/cashflow/components/onboarding/StepOne.es.js +5 -5
- package/dist/cashflow/components/onboarding/StepOne.es.js.map +1 -1
- package/dist/common/components/calendar/Calendar.d.ts +1 -0
- package/dist/common/components/calendar/Calendar.es.js.map +1 -1
- package/dist/common/components/drawer/Drawer.es.js +9 -9
- package/dist/common/components/drawer/Drawer.es.js.map +1 -1
- package/dist/common/components/drawer/Footer.es.js +6 -6
- package/dist/common/components/drawer/Footer.es.js.map +1 -1
- package/dist/finstrong/components/ManageDOB.es.js +16 -16
- package/dist/goals/components/actions/BirthdayAction.es.js +11 -11
- package/dist/recurringtransactions/components/PaymentSchedule.es.js +11 -11
- package/dist/settings/components/profile/ProfileTab.es.js +28 -28
- package/dist/settings/components/transactionrules/actions/DeleteRuleAction.es.js +7 -7
- package/dist/settings/components/transactionrules/actions/DeleteRuleAction.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiondetails/actions/DateAction.es.js +59 -53
- package/dist/transactions/components/shared/transactiondetails/actions/DateAction.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiondetails/actions/ExcludeAction.es.js +0 -1
- package/dist/transactions/components/shared/transactiondetails/actions/ExcludeAction.es.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
## [9.4.56] - 10-06-2026
|
|
2
|
+
|
|
3
|
+
- **FIXED** - Transactions in the Sub Budget drawer now open the Transaction Details drawer when clicked MEW-4015
|
|
4
|
+
|
|
5
|
+
## [9.4.55] - 10-05-2026
|
|
6
|
+
|
|
7
|
+
- **FIXED** - Color contrast in the Transaction Details calendar and Cancel buttons MEW-4123
|
|
8
|
+
- **CHANGED** - Secondary buttons next to a main button use the text style
|
|
9
|
+
- **CHANGED** - Bumped `@mxenabled/mxui` to `^2.11.1`
|
|
10
|
+
|
|
1
11
|
## [9.4.54] - 10-05-2026
|
|
2
12
|
|
|
3
13
|
- **FIXED** - Searching in the Add Expense drawer in Recurring Transactions no longer crashes when an expense has no description MEW-3671
|
|
@@ -9,13 +9,13 @@ import { SubBudgetAmounts as q } from "./budgetdetails/SubBudgetAmounts.es.js";
|
|
|
9
9
|
import r from "react";
|
|
10
10
|
import { observer as J } from "mobx-react-lite";
|
|
11
11
|
import { Text as K } from "@mxenabled/mxui";
|
|
12
|
-
import { jsx as a, jsxs as
|
|
12
|
+
import { jsx as a, jsxs as h } from "react/jsx-runtime";
|
|
13
13
|
import Q from "@mui/material/Alert";
|
|
14
14
|
import V from "@mui/material/Snackbar";
|
|
15
15
|
var D = (d) => Object.fromEntries((d?.subBudgets ?? []).map((t) => [t.guid, `${t.amount}`])), ce = J(() => {
|
|
16
|
-
const { selectedAccountGuids: d } = U(), { budgets: t, common: m } = R(), { alert: l, dateRange: O, deleteBudget: T, selectedBudget: e, selectedSubBudget: w, setAlert: c, setSelectedBudget: N, updateBudget:
|
|
16
|
+
const { selectedAccountGuids: d } = U(), { budgets: t, common: m } = R(), { alert: l, dateRange: O, deleteBudget: T, selectedBudget: e, selectedSubBudget: w, setAlert: c, setSelectedBudget: N, updateBudget: B } = F(), { setFilter: E } = z(), [P, S] = r.useState(!1), [$, g] = r.useState(!1), [I, p] = r.useState(!1), [n, y] = r.useState(""), [_, b] = r.useState({});
|
|
17
17
|
r.useEffect(() => {
|
|
18
|
-
e && !w && (
|
|
18
|
+
e && !w && (y(`${e.amount}`), b(D(e)), S(!0), E({
|
|
19
19
|
accounts: d,
|
|
20
20
|
dateRange: O,
|
|
21
21
|
custom: (o) => o.category_guid === e.category_guid || o.top_level_category_guid === e.category_guid,
|
|
@@ -27,12 +27,12 @@ var D = (d) => Object.fromEntries((d?.subBudgets ?? []).map((t) => [t.guid, `${t
|
|
|
27
27
|
let o = !0;
|
|
28
28
|
e.subBudgets.length > 0 ? o = (await Promise.all(e.subBudgets.map((s) => {
|
|
29
29
|
const i = Number(_[s.guid] ?? s.amount);
|
|
30
|
-
return
|
|
30
|
+
return B({
|
|
31
31
|
...s,
|
|
32
32
|
amount: i,
|
|
33
33
|
percentage: i ? s.category.currentAmount / i * 100 : 0
|
|
34
34
|
});
|
|
35
|
-
}))).every(Boolean) : o = await
|
|
35
|
+
}))).every(Boolean) : o = await B({
|
|
36
36
|
...e,
|
|
37
37
|
amount: Number(n),
|
|
38
38
|
percentage: Number(n) ? e.category.totalAmount / Number(n) * 100 : 0
|
|
@@ -47,7 +47,7 @@ var D = (d) => Object.fromEntries((d?.subBudgets ?? []).map((t) => [t.guid, `${t
|
|
|
47
47
|
}, G = async () => {
|
|
48
48
|
if (e) {
|
|
49
49
|
const o = await T(e.guid);
|
|
50
|
-
|
|
50
|
+
p(!1), c(o ? {
|
|
51
51
|
msg: u(t.alert_budget_deleted, e.category.name),
|
|
52
52
|
severity: "success"
|
|
53
53
|
} : {
|
|
@@ -60,17 +60,17 @@ var D = (d) => Object.fromEntries((d?.subBudgets ?? []).map((t) => [t.guid, `${t
|
|
|
60
60
|
N(void 0);
|
|
61
61
|
}, 250);
|
|
62
62
|
}, v = () => {
|
|
63
|
-
g(!1),
|
|
63
|
+
g(!1), y(`${e?.amount}`), b(D(e));
|
|
64
64
|
};
|
|
65
65
|
if (!e) return;
|
|
66
66
|
const f = e.subBudgets.length > 0, k = f ? e.subBudgets.some((o) => x(_[o.guid] ?? `${o.amount}`)) : x(n);
|
|
67
|
-
return /* @__PURE__ */
|
|
68
|
-
/* @__PURE__ */
|
|
67
|
+
return /* @__PURE__ */ h(r.Fragment, { children: [
|
|
68
|
+
/* @__PURE__ */ h(H, {
|
|
69
69
|
ariaLabelClose: m.close_aria,
|
|
70
70
|
isOpen: P,
|
|
71
71
|
onClose: A,
|
|
72
72
|
onPrimaryAction: () => g(!0),
|
|
73
|
-
onSecondaryAction: () =>
|
|
73
|
+
onSecondaryAction: () => p(!0),
|
|
74
74
|
primaryText: t.details_edit_button,
|
|
75
75
|
secondaryColor: "error",
|
|
76
76
|
secondaryText: t.details_delete_button,
|
|
@@ -93,7 +93,7 @@ var D = (d) => Object.fromEntries((d?.subBudgets ?? []).map((t) => [t.guid, `${t
|
|
|
93
93
|
})
|
|
94
94
|
})]
|
|
95
95
|
}),
|
|
96
|
-
/* @__PURE__ */
|
|
96
|
+
/* @__PURE__ */ h(C, {
|
|
97
97
|
copy: {
|
|
98
98
|
close_aria: m.close_aria,
|
|
99
99
|
title: t.details_edit_title
|
|
@@ -108,7 +108,7 @@ var D = (d) => Object.fromEntries((d?.subBudgets ?? []).map((t) => [t.guid, `${t
|
|
|
108
108
|
children: [!f && /* @__PURE__ */ a(L, {
|
|
109
109
|
amount: n,
|
|
110
110
|
categoryName: e.category.name,
|
|
111
|
-
onAmountChanged:
|
|
111
|
+
onAmountChanged: y
|
|
112
112
|
}), f && /* @__PURE__ */ a(q, {
|
|
113
113
|
categoryName: e.category.name,
|
|
114
114
|
onSubBudgetAmountChanged: (o, s) => b((i) => ({
|
|
@@ -125,11 +125,11 @@ var D = (d) => Object.fromEntries((d?.subBudgets ?? []).map((t) => [t.guid, `${t
|
|
|
125
125
|
title: t.delete_title
|
|
126
126
|
},
|
|
127
127
|
isOpen: I,
|
|
128
|
-
onClose: () =>
|
|
128
|
+
onClose: () => p(!1),
|
|
129
129
|
onPrimaryAction: G,
|
|
130
130
|
primaryColor: "error",
|
|
131
131
|
primaryText: t.details_delete_button,
|
|
132
|
-
secondaryColor: "
|
|
132
|
+
secondaryColor: "inherit",
|
|
133
133
|
children: /* @__PURE__ */ a(K, {
|
|
134
134
|
variant: "subtitle1",
|
|
135
135
|
children: u(t.delete_description, e.category.name)
|
|
@@ -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 DetailedBudget, type Transaction } from '../../core'\n\nimport { BudgetDetails } from './budgetdetails/BudgetDetails'\nimport { BudgetAmount } from './shared/BudgetAmount'\nimport { buildDynamicCopy } from '../../core/utils/Localization'\nimport { isInvalidAmount } from '../../core/utils/BudgetUtil'\nimport { SubBudgetAmounts } from './budgetdetails/SubBudgetAmounts'\n\nconst seedSubAmounts = (b?: DetailedBudget) =>\n Object.fromEntries((b?.subBudgets ?? []).map((sb) => [sb.guid, `${sb.amount}`]))\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 setSubBudgetAmounts(seedSubAmounts(selectedBudget))\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 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: newAmount ? (subBudget.category.currentAmount / newAmount) * 100 : 0,\n } as Budget)\n }),\n )\n allSucceeded = results.every(Boolean)\n } else {\n const result = await updateBudget({\n ...selectedBudget,\n amount: Number(amount),\n percentage: Number(amount)\n ? (selectedBudget.category.totalAmount / Number(amount)) * 100\n : 0,\n } as Budget)\n allSucceeded = result\n }\n\n setAlert(\n allSucceeded\n ? {\n msg: buildDynamicCopy(\n copy.alert_budget_updated,\n selectedBudget.category.name,\n ) as string,\n severity: 'success',\n }\n : {\n msg: buildDynamicCopy(\n copy.error_alert_edit_merchant_budget,\n selectedBudget.category.name,\n ) as string,\n severity: 'error',\n },\n )\n setIsEditOpen(false)\n }\n }\n\n const handleDeleteBudget = async () => {\n if (selectedBudget) {\n const succeeded = await deleteBudget(selectedBudget.guid)\n setIsDeleteOpen(false)\n setAlert(\n succeeded\n ? {\n msg: buildDynamicCopy(\n copy.alert_budget_deleted,\n selectedBudget.category.name,\n ) as string,\n severity: 'success',\n }\n : {\n msg: buildDynamicCopy(\n copy.error_alert_delete_merchant_budget,\n selectedBudget.category.name,\n ) as string,\n severity: 'error',\n },\n )\n if (succeeded) {\n handleClose()\n }\n }\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 setSubBudgetAmounts(seedSubAmounts(selectedBudget))\n }\n\n if (!selectedBudget) {\n return undefined\n }\n\n const hasSubBudgets = selectedBudget.subBudgets.length > 0\n const disablePrimaryButton = hasSubBudgets\n ? selectedBudget.subBudgets.some((sb) =>\n isInvalidAmount(subBudgetAmounts[sb.guid] ?? `${sb.amount}`),\n )\n : isInvalidAmount(amount)\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(null)}\n open={Boolean(alert)}\n >\n <Alert\n closeText=\"\"\n onClose={() => setAlert(null)}\n role={alert?.severity === 'error' ? 'alert' : undefined}\n severity={alert?.severity ?? 'success'}\n variant=\"filled\"\n >\n {alert?.msg}\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-of-type': {\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 categoryName={selectedBudget.category.name}\n onSubBudgetAmountChanged={(guid, v) =>\n setSubBudgetAmounts((p) => ({ ...p, [guid]: v }))\n }\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
|
+
{"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 DetailedBudget, type Transaction } from '../../core'\n\nimport { BudgetDetails } from './budgetdetails/BudgetDetails'\nimport { BudgetAmount } from './shared/BudgetAmount'\nimport { buildDynamicCopy } from '../../core/utils/Localization'\nimport { isInvalidAmount } from '../../core/utils/BudgetUtil'\nimport { SubBudgetAmounts } from './budgetdetails/SubBudgetAmounts'\n\nconst seedSubAmounts = (b?: DetailedBudget) =>\n Object.fromEntries((b?.subBudgets ?? []).map((sb) => [sb.guid, `${sb.amount}`]))\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 setSubBudgetAmounts(seedSubAmounts(selectedBudget))\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 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: newAmount ? (subBudget.category.currentAmount / newAmount) * 100 : 0,\n } as Budget)\n }),\n )\n allSucceeded = results.every(Boolean)\n } else {\n const result = await updateBudget({\n ...selectedBudget,\n amount: Number(amount),\n percentage: Number(amount)\n ? (selectedBudget.category.totalAmount / Number(amount)) * 100\n : 0,\n } as Budget)\n allSucceeded = result\n }\n\n setAlert(\n allSucceeded\n ? {\n msg: buildDynamicCopy(\n copy.alert_budget_updated,\n selectedBudget.category.name,\n ) as string,\n severity: 'success',\n }\n : {\n msg: buildDynamicCopy(\n copy.error_alert_edit_merchant_budget,\n selectedBudget.category.name,\n ) as string,\n severity: 'error',\n },\n )\n setIsEditOpen(false)\n }\n }\n\n const handleDeleteBudget = async () => {\n if (selectedBudget) {\n const succeeded = await deleteBudget(selectedBudget.guid)\n setIsDeleteOpen(false)\n setAlert(\n succeeded\n ? {\n msg: buildDynamicCopy(\n copy.alert_budget_deleted,\n selectedBudget.category.name,\n ) as string,\n severity: 'success',\n }\n : {\n msg: buildDynamicCopy(\n copy.error_alert_delete_merchant_budget,\n selectedBudget.category.name,\n ) as string,\n severity: 'error',\n },\n )\n if (succeeded) {\n handleClose()\n }\n }\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 setSubBudgetAmounts(seedSubAmounts(selectedBudget))\n }\n\n if (!selectedBudget) {\n return undefined\n }\n\n const hasSubBudgets = selectedBudget.subBudgets.length > 0\n const disablePrimaryButton = hasSubBudgets\n ? selectedBudget.subBudgets.some((sb) =>\n isInvalidAmount(subBudgetAmounts[sb.guid] ?? `${sb.amount}`),\n )\n : isInvalidAmount(amount)\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(null)}\n open={Boolean(alert)}\n >\n <Alert\n closeText=\"\"\n onClose={() => setAlert(null)}\n role={alert?.severity === 'error' ? 'alert' : undefined}\n severity={alert?.severity ?? 'success'}\n variant=\"filled\"\n >\n {alert?.msg}\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-of-type': {\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 categoryName={selectedBudget.category.name}\n onSubBudgetAmountChanged={(guid, v) =>\n setSubBudgetAmounts((p) => ({ ...p, [guid]: v }))\n }\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=\"inherit\"\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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"}
|
|
@@ -6,7 +6,7 @@ import A from "../../../transactions/components/shared/TransactionList.es.js";
|
|
|
6
6
|
import E from "../../../transactions/components/shared/TransactionDetails.es.js";
|
|
7
7
|
import { Header as W } from "./Header.es.js";
|
|
8
8
|
import { SubBudgetList as H } from "./SubBudgetList.es.js";
|
|
9
|
-
import
|
|
9
|
+
import c from "react";
|
|
10
10
|
import { observer as M } from "mobx-react-lite";
|
|
11
11
|
import e from "@mui/material/Stack";
|
|
12
12
|
import { Icon as O } from "@mxenabled/mxui";
|
|
@@ -14,18 +14,18 @@ import R from "@mui/material/Button";
|
|
|
14
14
|
import { jsx as t, jsxs as r } from "react/jsx-runtime";
|
|
15
15
|
import p from "@mui/material/Tab";
|
|
16
16
|
import V from "@mui/material/Tabs";
|
|
17
|
-
var st = M(({ budget:
|
|
18
|
-
const { is_mobile_webview: u } = k(), { setAlert: f } = D(), { budgets: o, common: b, transactions: h } = j(), { isDesktop:
|
|
17
|
+
var st = M(({ budget: l }) => {
|
|
18
|
+
const { is_mobile_webview: u } = k(), { setAlert: f } = D(), { budgets: o, common: b, transactions: h } = j(), { isDesktop: T, isSmallTablet: _, isTablet: C } = I(), { sortedTransactions: s, sortedTransactionsWithSplits: g, tags: S } = G(), [a, v] = c.useState(0), [m, n] = c.useState(""), i = c.useMemo(() => s.find((d) => d.guid === m), [m, s]), x = (d, B) => {
|
|
19
19
|
v(B);
|
|
20
20
|
}, w = () => {
|
|
21
|
-
z(
|
|
21
|
+
z(g, S), f({
|
|
22
22
|
msg: o.alert_csv_downloaded,
|
|
23
23
|
severity: "success"
|
|
24
24
|
});
|
|
25
|
-
}, y = s.length > 0 && !u && (
|
|
25
|
+
}, y = s.length > 0 && !u && (T || C && !_);
|
|
26
26
|
return /* @__PURE__ */ r(e, {
|
|
27
27
|
gap: 24,
|
|
28
|
-
children: [/* @__PURE__ */ t(W, { budget:
|
|
28
|
+
children: [/* @__PURE__ */ t(W, { budget: l }), /* @__PURE__ */ r(e, { children: [
|
|
29
29
|
/* @__PURE__ */ r(V, {
|
|
30
30
|
onChange: x,
|
|
31
31
|
sx: { width: "100%" },
|
|
@@ -49,15 +49,18 @@ var st = M(({ budget: c }) => {
|
|
|
49
49
|
})
|
|
50
50
|
}), /* @__PURE__ */ t(A, {
|
|
51
51
|
height: "100%",
|
|
52
|
-
onClick:
|
|
52
|
+
onClick: n
|
|
53
53
|
})] }),
|
|
54
|
-
a === 1 && /* @__PURE__ */ t(H, {
|
|
54
|
+
a === 1 && /* @__PURE__ */ t(H, {
|
|
55
|
+
budget: l,
|
|
56
|
+
onTransactionClick: n
|
|
57
|
+
}),
|
|
55
58
|
/* @__PURE__ */ t(L, {
|
|
56
59
|
ariaLabelClose: b.close_aria,
|
|
57
|
-
isOpen: !!
|
|
58
|
-
onClose: () =>
|
|
60
|
+
isOpen: !!i,
|
|
61
|
+
onClose: () => n(""),
|
|
59
62
|
title: o.details_transaction_drawer,
|
|
60
|
-
children:
|
|
63
|
+
children: i && /* @__PURE__ */ t(E, { transaction: i })
|
|
61
64
|
})
|
|
62
65
|
] })]
|
|
63
66
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BudgetDetails.es.js","names":[],"sources":["../../../../src/budgets/components/budgetdetails/BudgetDetails.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Button from '@mui/material/Button'\nimport Stack from '@mui/material/Stack'\nimport Tab from '@mui/material/Tab'\nimport Tabs from '@mui/material/Tabs'\n\nimport { Icon } from '@mxenabled/mxui'\n\nimport {\n Drawer,\n useAppConfig,\n useBudgetsStore,\n useGlobalCopyStore,\n useScreenSize,\n useTransactionStore,\n} from '../../../common'\nimport { type DetailedBudget } from '../../../core'\nimport { exportTransactionsToCSV } from '../../../core/utils/TransactionUtils'\n\nimport { TransactionDetails, TransactionList } from '../../../transactions'\n\nimport { Header } from './Header'\nimport { SubBudgetList } from './SubBudgetList'\n\ninterface BudgetDetailsProps {\n budget: DetailedBudget\n}\n\nexport const BudgetDetails: React.FC<BudgetDetailsProps> = observer(({ budget }) => {\n const { is_mobile_webview } = useAppConfig()\n const { setAlert } = useBudgetsStore()\n const { budgets: copy, common: commonCopy, transactions: transactionCopy } = useGlobalCopyStore()\n const { isDesktop, isSmallTablet, isTablet } = useScreenSize()\n const {\n sortedTransactions: transactions,\n sortedTransactionsWithSplits,\n tags,\n } = useTransactionStore()\n\n const [selectedTab, setSelectedTab] = React.useState(0)\n const [transactionGuid, setTransactionGuid] = React.useState('')\n\n const transaction = React.useMemo(\n () => transactions.find((t) => t.guid === transactionGuid),\n [transactionGuid, transactions],\n )\n\n const handleTabChange = (_event: React.SyntheticEvent, newValue: number) => {\n setSelectedTab(newValue)\n }\n\n const handleExportToCsv = () => {\n exportTransactionsToCSV(sortedTransactionsWithSplits, tags)\n setAlert({ msg: copy.alert_csv_downloaded, severity: 'success' })\n }\n\n const shouldShowExportButton =\n transactions.length > 0 && !is_mobile_webview && (isDesktop || (isTablet && !isSmallTablet))\n\n return (\n <Stack gap={24}>\n <Header budget={budget} />\n\n <Stack>\n <Tabs\n onChange={handleTabChange}\n sx={{ width: '100%' }}\n textColor=\"primary\"\n value={selectedTab}\n variant=\"fullWidth\"\n >\n <Tab label={copy.details_transactions_tab} />\n <Tab label={copy.details_subbudgets_tab} />\n </Tabs>\n {selectedTab === 0 && (\n <Stack>\n {shouldShowExportButton && (\n <Stack direction=\"row\" justifyContent=\"right\" mb={-24} mr={8} mt={8} zIndex={1}>\n <Button\n onClick={handleExportToCsv}\n startIcon={<Icon name=\"ios_share\" />}\n variant=\"text\"\n >\n {transactionCopy.export_csv_btn}\n </Button>\n </Stack>\n )}\n <TransactionList height=\"100%\" onClick={setTransactionGuid} />\n </Stack>\n )}\n {selectedTab === 1 && <SubBudgetList budget={budget}
|
|
1
|
+
{"version":3,"file":"BudgetDetails.es.js","names":[],"sources":["../../../../src/budgets/components/budgetdetails/BudgetDetails.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Button from '@mui/material/Button'\nimport Stack from '@mui/material/Stack'\nimport Tab from '@mui/material/Tab'\nimport Tabs from '@mui/material/Tabs'\n\nimport { Icon } from '@mxenabled/mxui'\n\nimport {\n Drawer,\n useAppConfig,\n useBudgetsStore,\n useGlobalCopyStore,\n useScreenSize,\n useTransactionStore,\n} from '../../../common'\nimport { type DetailedBudget } from '../../../core'\nimport { exportTransactionsToCSV } from '../../../core/utils/TransactionUtils'\n\nimport { TransactionDetails, TransactionList } from '../../../transactions'\n\nimport { Header } from './Header'\nimport { SubBudgetList } from './SubBudgetList'\n\ninterface BudgetDetailsProps {\n budget: DetailedBudget\n}\n\nexport const BudgetDetails: React.FC<BudgetDetailsProps> = observer(({ budget }) => {\n const { is_mobile_webview } = useAppConfig()\n const { setAlert } = useBudgetsStore()\n const { budgets: copy, common: commonCopy, transactions: transactionCopy } = useGlobalCopyStore()\n const { isDesktop, isSmallTablet, isTablet } = useScreenSize()\n const {\n sortedTransactions: transactions,\n sortedTransactionsWithSplits,\n tags,\n } = useTransactionStore()\n\n const [selectedTab, setSelectedTab] = React.useState(0)\n const [transactionGuid, setTransactionGuid] = React.useState('')\n\n const transaction = React.useMemo(\n () => transactions.find((t) => t.guid === transactionGuid),\n [transactionGuid, transactions],\n )\n\n const handleTabChange = (_event: React.SyntheticEvent, newValue: number) => {\n setSelectedTab(newValue)\n }\n\n const handleExportToCsv = () => {\n exportTransactionsToCSV(sortedTransactionsWithSplits, tags)\n setAlert({ msg: copy.alert_csv_downloaded, severity: 'success' })\n }\n\n const shouldShowExportButton =\n transactions.length > 0 && !is_mobile_webview && (isDesktop || (isTablet && !isSmallTablet))\n\n return (\n <Stack gap={24}>\n <Header budget={budget} />\n\n <Stack>\n <Tabs\n onChange={handleTabChange}\n sx={{ width: '100%' }}\n textColor=\"primary\"\n value={selectedTab}\n variant=\"fullWidth\"\n >\n <Tab label={copy.details_transactions_tab} />\n <Tab label={copy.details_subbudgets_tab} />\n </Tabs>\n {selectedTab === 0 && (\n <Stack>\n {shouldShowExportButton && (\n <Stack direction=\"row\" justifyContent=\"right\" mb={-24} mr={8} mt={8} zIndex={1}>\n <Button\n onClick={handleExportToCsv}\n startIcon={<Icon name=\"ios_share\" />}\n variant=\"text\"\n >\n {transactionCopy.export_csv_btn}\n </Button>\n </Stack>\n )}\n <TransactionList height=\"100%\" onClick={setTransactionGuid} />\n </Stack>\n )}\n {selectedTab === 1 && (\n <SubBudgetList budget={budget} onTransactionClick={setTransactionGuid} />\n )}\n\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={Boolean(transaction)}\n onClose={() => setTransactionGuid('')}\n title={copy.details_transaction_drawer}\n >\n {transaction && <TransactionDetails transaction={transaction} />}\n </Drawer>\n </Stack>\n </Stack>\n )\n})\n"],"mappings":";;;;;;;;;;;;;;;;AA8BA,IAAa,KAA8C,EAAA,CAAU,EAAE,QAAA,EAAA,MAAa;AAClF,QAAM,EAAE,mBAAA,EAAA,IAAsB,EAAa,GACrC,EAAE,UAAA,EAAA,IAAa,EAAgB,GAC/B,EAAE,SAAS,GAAM,QAAQ,GAAY,cAAc,EAAA,IAAoB,EAAmB,GAC1F,EAAE,WAAA,GAAW,eAAA,GAAe,UAAA,EAAA,IAAa,EAAc,GACvD,EACJ,oBAAoB,GACpB,8BAAA,GACA,MAAA,EAAA,IACE,EAAoB,GAElB,CAAC,GAAa,CAAA,IAAkB,EAAM,SAAS,CAAC,GAChD,CAAC,GAAiB,CAAA,IAAsB,EAAM,SAAS,EAAE,GAEzD,IAAc,EAAM,QAAA,MAClB,EAAa,KAAA,CAAM,MAAM,EAAE,SAAS,CAAe,GACzD,CAAC,GAAiB,CAAY,CAChC,GAEM,IAAA,CAAmB,GAA8B,MAAqB;AAC1E,IAAA,EAAe,CAAQ;AAAA,EACzB,GAEM,IAAA,MAA0B;AAC9B,IAAA,EAAwB,GAA8B,CAAI,GAC1D,EAAS;AAAA,MAAE,KAAK,EAAK;AAAA,MAAsB,UAAU;AAAA,IAAU,CAAC;AAAA,EAClE,GAEM,IACJ,EAAa,SAAS,KAAK,CAAC,MAAsB,KAAc,KAAY,CAAC;AAE/E,SACE,gBAAA,EAAC,GAAD;AAAA,IAAO,KAAK;AAAA,IAAZ,UAAA,CACE,gBAAA,EAAC,GAAD,EAAgB,QAAA,EAAS,CAAA,GAEzB,gBAAA,EAAC,GAAD,EAAA,UAAA;AAAA,MACE,gBAAA,EAAC,GAAD;AAAA,QACE,UAAU;AAAA,QACV,IAAI,EAAE,OAAO,OAAO;AAAA,QACpB,WAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAQ;AAAA,QALV,UAAA,CAOE,gBAAA,EAAC,GAAD,EAAK,OAAO,EAAK,yBAA2B,CAAA,GAC5C,gBAAA,EAAC,GAAD,EAAK,OAAO,EAAK,uBAAyB,CAAA,CACtC;AAAA;MACL,MAAgB,KACf,gBAAA,EAAC,GAAD,EAAA,UAAA,CACG,KACC,gBAAA,EAAC,GAAD;AAAA,QAAO,WAAU;AAAA,QAAM,gBAAe;AAAA,QAAQ,IAAI;AAAA,QAAK,IAAI;AAAA,QAAG,IAAI;AAAA,QAAG,QAAQ;AAAA,QAC3E,UAAA,gBAAA,EAAC,GAAD;AAAA,UACE,SAAS;AAAA,UACT,WAAW,gBAAA,EAAC,GAAD,EAAM,MAAK,YAAa,CAAA;AAAA,UACnC,SAAQ;AAAA,UAEP,UAAA,EAAgB;AAAA,QACX,CAAA;AAAA,MACH,CAAA,GAET,gBAAA,EAAC,GAAD;AAAA,QAAiB,QAAO;AAAA,QAAO,SAAS;AAAA,MAAqB,CAAA,CACxD,EAAA,CAAA;AAAA,MAER,MAAgB,KACf,gBAAA,EAAC,GAAD;AAAA,QAAuB,QAAA;AAAA,QAAQ,oBAAoB;AAAA,MAAqB,CAAA;AAAA,MAG1E,gBAAA,EAAC,GAAD;AAAA,QACE,gBAAgB,EAAW;AAAA,QAC3B,QAAQ,EAAQ;AAAA,QAChB,SAAA,MAAe,EAAmB,EAAE;AAAA,QACpC,OAAO,EAAK;AAAA,QAEX,UAAA,KAAe,gBAAA,EAAC,GAAD,EAAiC,aAAA,EAAc,CAAA;AAAA,MACzD,CAAA;AAAA,IACH,EAAA,CAAA,CACF;AAAA;AAEX,CAAC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { default as React } from 'react';
|
|
2
1
|
import { DetailedBudget } from '../../../core';
|
|
3
2
|
interface SubBudgetListProps {
|
|
4
3
|
budget: DetailedBudget;
|
|
4
|
+
onTransactionClick: (guid: string) => void;
|
|
5
5
|
}
|
|
6
|
-
export declare const SubBudgetList:
|
|
6
|
+
export declare const SubBudgetList: (({ budget, onTransactionClick }: SubBudgetListProps) => import("react/jsx-runtime").JSX.Element) & {
|
|
7
|
+
displayName: string;
|
|
8
|
+
};
|
|
7
9
|
export {};
|
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
import { buildDynamicCopy as
|
|
2
|
-
import { useBudgetsStore as
|
|
1
|
+
import { buildDynamicCopy as d } from "../../../core/utils/Localization.es.js";
|
|
2
|
+
import { useBudgetsStore as T, useGlobalCopyStore as N, useTransactionStore as k } from "../../../common/context/hooks.es.js";
|
|
3
3
|
import b from "../../../common/components/dialog/Dialog.es.js";
|
|
4
4
|
import w from "../../../common/components/drawer/Drawer.es.js";
|
|
5
5
|
import F from "../../../transactions/components/shared/TransactionList.es.js";
|
|
6
6
|
import { BudgetAmount as L } from "../shared/BudgetAmount.es.js";
|
|
7
7
|
import { Header as P } from "./Header.es.js";
|
|
8
|
-
import { SubBudgetZeroState as
|
|
9
|
-
import { SubBudgetRow as
|
|
10
|
-
import { AddSubBudget as
|
|
8
|
+
import { SubBudgetZeroState as E } from "../budgetlist/SubBudgetZeroState.es.js";
|
|
9
|
+
import { SubBudgetRow as j } from "../budgetlist/SubBudgetRow.es.js";
|
|
10
|
+
import { AddSubBudget as I } from "./AddSubBudget.es.js";
|
|
11
11
|
import i from "react";
|
|
12
|
-
import { observer as
|
|
13
|
-
import
|
|
14
|
-
import { Text as
|
|
12
|
+
import { observer as R } from "mobx-react-lite";
|
|
13
|
+
import $ from "@mui/material/Stack";
|
|
14
|
+
import { Text as G } from "@mxenabled/mxui";
|
|
15
15
|
import { jsx as r, jsxs as s } from "react/jsx-runtime";
|
|
16
|
-
import
|
|
17
|
-
import
|
|
18
|
-
var
|
|
19
|
-
const { category:
|
|
16
|
+
import H from "@mui/material/Divider";
|
|
17
|
+
import M from "@mui/material/List";
|
|
18
|
+
var se = R(({ budget: n, onTransactionClick: h }) => {
|
|
19
|
+
const { category: S, subBudgets: u } = n, { budgets: o, common: l } = N(), { deleteBudget: B, selectedSubBudget: e, setAlert: g, setSelectedSubBudget: C, updateBudget: x } = T(), { filter: p, setFilter: y } = k(), [v, m] = i.useState(!1), [A, c] = i.useState(!1), [a, f] = i.useState("");
|
|
20
20
|
i.useEffect(() => {
|
|
21
21
|
e && (f(`${e.amount}`), y({
|
|
22
22
|
...p,
|
|
23
23
|
custom: (t) => t.category_guid === e.category_guid
|
|
24
24
|
}));
|
|
25
25
|
}, [e]);
|
|
26
|
-
const
|
|
26
|
+
const D = async () => {
|
|
27
27
|
if (e) {
|
|
28
|
-
const t = await
|
|
28
|
+
const t = await x({
|
|
29
29
|
...e,
|
|
30
30
|
amount: Number(a)
|
|
31
31
|
});
|
|
32
32
|
m(!1), t || g({
|
|
33
|
-
msg:
|
|
33
|
+
msg: d(o.error_alert_edit_merchant_budget, e.category.name),
|
|
34
34
|
severity: "error"
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
|
-
},
|
|
37
|
+
}, O = async () => {
|
|
38
38
|
if (e) {
|
|
39
|
-
const t = await
|
|
40
|
-
|
|
41
|
-
msg:
|
|
39
|
+
const t = await B(e.guid);
|
|
40
|
+
c(!1), t ? _() : g({
|
|
41
|
+
msg: d(o.error_alert_delete_merchant_budget, e.category.name),
|
|
42
42
|
severity: "error"
|
|
43
43
|
});
|
|
44
44
|
}
|
|
@@ -46,13 +46,13 @@ var ae = I(({ budget: n }) => {
|
|
|
46
46
|
y({
|
|
47
47
|
...p,
|
|
48
48
|
custom: (t) => t.category_guid === n.category_guid || t.top_level_category_guid === n.category_guid
|
|
49
|
-
}),
|
|
49
|
+
}), C(void 0);
|
|
50
50
|
};
|
|
51
51
|
return /* @__PURE__ */ s(i.Fragment, { children: [
|
|
52
|
-
/* @__PURE__ */ s(
|
|
52
|
+
/* @__PURE__ */ s(M, {
|
|
53
53
|
sx: { bgcolor: "background.paper" },
|
|
54
|
-
children: [u.length === 0 ? /* @__PURE__ */ r(
|
|
55
|
-
category:
|
|
54
|
+
children: [u.length === 0 ? /* @__PURE__ */ r(E, {}) : u.map((t) => /* @__PURE__ */ s(i.Fragment, { children: [/* @__PURE__ */ r(j, { budget: t }), /* @__PURE__ */ r(H, {})] }, t.guid)), /* @__PURE__ */ r(I, {
|
|
55
|
+
category: S,
|
|
56
56
|
parentBudget: n
|
|
57
57
|
})]
|
|
58
58
|
}),
|
|
@@ -61,13 +61,16 @@ var ae = I(({ budget: n }) => {
|
|
|
61
61
|
isOpen: !!e,
|
|
62
62
|
onClose: _,
|
|
63
63
|
onPrimaryAction: () => m(!0),
|
|
64
|
-
onSecondaryAction: () =>
|
|
64
|
+
onSecondaryAction: () => c(!0),
|
|
65
65
|
primaryText: o.details_edit_button,
|
|
66
66
|
secondaryText: o.details_delete_button,
|
|
67
67
|
title: o.details_title,
|
|
68
|
-
children: e && /* @__PURE__ */ s(
|
|
68
|
+
children: e && /* @__PURE__ */ s($, {
|
|
69
69
|
gap: 24,
|
|
70
|
-
children: [/* @__PURE__ */ r(P, { budget: e }), /* @__PURE__ */ r(F, {
|
|
70
|
+
children: [/* @__PURE__ */ r(P, { budget: e }), /* @__PURE__ */ r(F, {
|
|
71
|
+
height: "100%",
|
|
72
|
+
onClick: h
|
|
73
|
+
})]
|
|
71
74
|
})
|
|
72
75
|
}),
|
|
73
76
|
e && /* @__PURE__ */ s(i.Fragment, { children: [/* @__PURE__ */ r(b, {
|
|
@@ -76,9 +79,9 @@ var ae = I(({ budget: n }) => {
|
|
|
76
79
|
title: o.details_edit_title_subbudget
|
|
77
80
|
},
|
|
78
81
|
disablePrimaryButton: a === "" || Number(a) < 0 || isNaN(Number(a)),
|
|
79
|
-
isOpen:
|
|
82
|
+
isOpen: v,
|
|
80
83
|
onClose: () => m(!1),
|
|
81
|
-
onPrimaryAction:
|
|
84
|
+
onPrimaryAction: D,
|
|
82
85
|
primaryText: o.edit_save_button,
|
|
83
86
|
sx: { "& .MuiStack-root:first-of-type": { pb: 8 } },
|
|
84
87
|
children: /* @__PURE__ */ r(L, {
|
|
@@ -91,21 +94,21 @@ var ae = I(({ budget: n }) => {
|
|
|
91
94
|
close_aria: l.close_aria,
|
|
92
95
|
title: o.delete_title
|
|
93
96
|
},
|
|
94
|
-
isOpen:
|
|
95
|
-
onClose: () =>
|
|
96
|
-
onPrimaryAction:
|
|
97
|
+
isOpen: A,
|
|
98
|
+
onClose: () => c(!1),
|
|
99
|
+
onPrimaryAction: O,
|
|
97
100
|
primaryColor: "error",
|
|
98
101
|
primaryText: "Delete",
|
|
99
|
-
secondaryColor: "
|
|
100
|
-
children: /* @__PURE__ */ r(
|
|
102
|
+
secondaryColor: "inherit",
|
|
103
|
+
children: /* @__PURE__ */ r(G, {
|
|
101
104
|
variant: "subtitle1",
|
|
102
|
-
children:
|
|
105
|
+
children: d(o.delete_description, e.category.name)
|
|
103
106
|
})
|
|
104
107
|
})] })
|
|
105
108
|
] });
|
|
106
109
|
});
|
|
107
110
|
export {
|
|
108
|
-
|
|
111
|
+
se as SubBudgetList
|
|
109
112
|
};
|
|
110
113
|
|
|
111
114
|
//# sourceMappingURL=SubBudgetList.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubBudgetList.es.js","names":[],"sources":["../../../../src/budgets/components/budgetdetails/SubBudgetList.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@mxenabled/mxui'\n\nimport {\n Dialog,\n Drawer,\n useBudgetsStore,\n useGlobalCopyStore,\n useTransactionStore,\n} from '../../../common'\nimport { type Budget, type DetailedBudget, type Transaction } from '../../../core'\n\nimport { TransactionList } from '../../../transactions'\n\nimport { SubBudgetZeroState } from '../budgetlist/SubBudgetZeroState'\nimport { SubBudgetRow } from '../budgetlist/SubBudgetRow'\nimport { BudgetAmount } from '../shared/BudgetAmount'\nimport { AddSubBudget } from './AddSubBudget'\nimport { Header } from './Header'\nimport { buildDynamicCopy } from '../../../core/utils/Localization'\n\ninterface SubBudgetListProps {\n budget: DetailedBudget\n}\n\nexport const SubBudgetList
|
|
1
|
+
{"version":3,"file":"SubBudgetList.es.js","names":[],"sources":["../../../../src/budgets/components/budgetdetails/SubBudgetList.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@mxenabled/mxui'\n\nimport {\n Dialog,\n Drawer,\n useBudgetsStore,\n useGlobalCopyStore,\n useTransactionStore,\n} from '../../../common'\nimport { type Budget, type DetailedBudget, type Transaction } from '../../../core'\n\nimport { TransactionList } from '../../../transactions'\n\nimport { SubBudgetZeroState } from '../budgetlist/SubBudgetZeroState'\nimport { SubBudgetRow } from '../budgetlist/SubBudgetRow'\nimport { BudgetAmount } from '../shared/BudgetAmount'\nimport { AddSubBudget } from './AddSubBudget'\nimport { Header } from './Header'\nimport { buildDynamicCopy } from '../../../core/utils/Localization'\n\ninterface SubBudgetListProps {\n budget: DetailedBudget\n onTransactionClick: (guid: string) => void\n}\n\nexport const SubBudgetList = observer(({ budget, onTransactionClick }: SubBudgetListProps) => {\n const { category, subBudgets } = budget\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n const { deleteBudget, selectedSubBudget, setAlert, setSelectedSubBudget, updateBudget } =\n useBudgetsStore()\n const { filter, setFilter } = useTransactionStore()\n\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 (selectedSubBudget) {\n setAmount(`${selectedSubBudget.amount}`)\n setFilter({\n ...filter,\n custom: (t: Transaction) => t.category_guid === selectedSubBudget.category_guid,\n })\n }\n }, [selectedSubBudget])\n\n const handleUpdateBudget = async () => {\n if (selectedSubBudget) {\n const result = await updateBudget({\n ...selectedSubBudget,\n amount: Number(amount),\n } as Budget)\n setIsEditOpen(false)\n if (!result) {\n setAlert({\n msg: buildDynamicCopy(\n copy.error_alert_edit_merchant_budget,\n selectedSubBudget.category.name,\n ) as string,\n severity: 'error',\n })\n }\n }\n }\n\n const handleDeleteBudget = async () => {\n if (selectedSubBudget) {\n const result = await deleteBudget(selectedSubBudget.guid)\n setIsDeleteOpen(false)\n if (result) {\n handleClose()\n } else {\n setAlert({\n msg: buildDynamicCopy(\n copy.error_alert_delete_merchant_budget,\n selectedSubBudget.category.name,\n ) as string,\n severity: 'error',\n })\n }\n }\n }\n\n const handleClose = () => {\n setFilter({\n ...filter,\n custom: (t: Transaction) =>\n t.category_guid === budget.category_guid ||\n t.top_level_category_guid === budget.category_guid,\n })\n setSelectedSubBudget(undefined)\n }\n\n return (\n <React.Fragment>\n <List sx={{ bgcolor: 'background.paper' }}>\n {subBudgets.length === 0 ? (\n <SubBudgetZeroState />\n ) : (\n subBudgets.map((subBudget) => (\n <React.Fragment key={subBudget.guid}>\n <SubBudgetRow budget={subBudget} />\n <Divider />\n </React.Fragment>\n ))\n )}\n <AddSubBudget category={category} parentBudget={budget} />\n </List>\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={Boolean(selectedSubBudget)}\n onClose={handleClose}\n onPrimaryAction={() => setIsEditOpen(true)}\n onSecondaryAction={() => setIsDeleteOpen(true)}\n primaryText={copy.details_edit_button}\n secondaryText={copy.details_delete_button}\n title={copy.details_title}\n >\n {selectedSubBudget && (\n <Stack gap={24}>\n <Header budget={selectedSubBudget} />\n <TransactionList height=\"100%\" onClick={onTransactionClick} />\n </Stack>\n )}\n </Drawer>\n\n {selectedSubBudget && (\n <React.Fragment>\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.details_edit_title_subbudget }}\n disablePrimaryButton={amount === '' || Number(amount) < 0 || isNaN(Number(amount))}\n isOpen={isEditOpen}\n onClose={() => setIsEditOpen(false)}\n onPrimaryAction={handleUpdateBudget}\n primaryText={copy.edit_save_button}\n sx={{\n '& .MuiStack-root:first-of-type': {\n pb: 8,\n },\n }}\n >\n <BudgetAmount\n amount={amount}\n categoryName={selectedSubBudget.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=\"Delete\"\n secondaryColor=\"inherit\"\n >\n <Text variant=\"subtitle1\">\n {buildDynamicCopy(copy.delete_description, selectedSubBudget.category.name) as string}\n </Text>\n </Dialog>\n </React.Fragment>\n )}\n </React.Fragment>\n )\n})\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useCashflowStore as te, useGlobalCopyStore as
|
|
1
|
+
import { useCashflowStore as te, useGlobalCopyStore as re, useGlobalUiStore as oe, useRecurringTransactionsStore as ne, useTransactionStore as ie, useUserStore as ae } from "../common/context/hooks.es.js";
|
|
2
2
|
import { useScreenSize as ce } from "../common/hooks/useScreenSize.es.js";
|
|
3
3
|
import { Frequency as se, RepeatingType as F } from "../core/types/RepeatingTransaction.es.js";
|
|
4
4
|
import { fromUnixToDayOfWeekAndDate as me } from "../core/utils/DateUtil.es.js";
|
|
@@ -37,34 +37,34 @@ var ve = Te`
|
|
|
37
37
|
transform: rotate(360deg);
|
|
38
38
|
}
|
|
39
39
|
`, Oe = () => {
|
|
40
|
-
const { addRepeatingTransaction: M, repeatingTransactions: q } = ne(), { cashflow: a, common: y } =
|
|
40
|
+
const { addRepeatingTransaction: M, repeatingTransactions: q } = ne(), { cashflow: a, common: y } = re(), { user: N } = ae(), { completeOnboarding: x } = te(), { isDirty: z } = he(), { isMobile: c } = ce(), { isCopyLoaded: B, setDisplayedDate: H } = oe(), { filter: _, setFilter: S, transactions: b } = ie(), P = Ce(), [$, u] = d(!0), [s, j] = m.useState(se.EveryMonth), [E, J] = m.useState(1), [D, K] = m.useState(15), [T, Q] = d(!1), [f, C] = d(1), [o, X] = d([]), [k, g] = d(""), n = m.useMemo(() => b.find((t) => t.guid === k), [k, b]), Y = !!q.filter((t) => t.repeating_transaction_type === F.Income).length, I = async () => {
|
|
41
41
|
C(2), H(De(ke(A(), 90)), A()), S({
|
|
42
42
|
..._,
|
|
43
43
|
custom: O
|
|
44
44
|
}), C(3);
|
|
45
45
|
}, Z = async () => {
|
|
46
|
-
if (!(
|
|
46
|
+
if (!(o.length < 1)) {
|
|
47
47
|
Q(!0);
|
|
48
|
-
for (let t = 0; t <
|
|
49
|
-
const
|
|
50
|
-
account_guid:
|
|
51
|
-
amount:
|
|
48
|
+
for (let t = 0; t < o.length; t++) {
|
|
49
|
+
const r = o[t], w = v(s, U(r.date)), ee = {
|
|
50
|
+
account_guid: r.account_guid,
|
|
51
|
+
amount: r.amount,
|
|
52
52
|
created_by: 0,
|
|
53
|
-
merchant_guid:
|
|
54
|
-
description:
|
|
53
|
+
merchant_guid: r.merchant_guid,
|
|
54
|
+
description: r.feed_description || r.description,
|
|
55
55
|
predicted_occurs_on: we(w, { representation: "date" }),
|
|
56
56
|
recurrence_day: w.getDay(),
|
|
57
57
|
recurrence_type: s,
|
|
58
58
|
repeating_transaction_type: F.Income,
|
|
59
59
|
second_recurrence_day: D,
|
|
60
|
-
transaction_type:
|
|
60
|
+
transaction_type: r.transaction_type,
|
|
61
61
|
user_guid: N.guid
|
|
62
62
|
};
|
|
63
|
-
await M(ee,
|
|
63
|
+
await M(ee, r);
|
|
64
64
|
}
|
|
65
65
|
await x();
|
|
66
66
|
}
|
|
67
|
-
}, V = !n && $ || !n &&
|
|
67
|
+
}, V = !n && $ || !n && o.length < 1;
|
|
68
68
|
return B ? /* @__PURE__ */ i(p, {
|
|
69
69
|
sx: {
|
|
70
70
|
display: "flex",
|
|
@@ -124,13 +124,13 @@ var ve = Te`
|
|
|
124
124
|
mb: 24,
|
|
125
125
|
children: a.add_income_description
|
|
126
126
|
}),
|
|
127
|
-
|
|
127
|
+
o.length > 0 && !n && /* @__PURE__ */ i(G, { children: [/* @__PURE__ */ e(Fe, { children: o.map((t, r) => /* @__PURE__ */ i(m.Fragment, { children: [
|
|
128
128
|
/* @__PURE__ */ e(pe, {
|
|
129
129
|
bgcolor: "background.paper",
|
|
130
130
|
children: me(Ie(t.nextDate || t.date))
|
|
131
131
|
}),
|
|
132
132
|
/* @__PURE__ */ e(le, { transaction: t }),
|
|
133
|
-
|
|
133
|
+
r !== o.length - 1 && /* @__PURE__ */ e(L, {})
|
|
134
134
|
] }, t.guid)) }), /* @__PURE__ */ i(h, {
|
|
135
135
|
alignItems: "center",
|
|
136
136
|
direction: "row",
|
|
@@ -147,7 +147,7 @@ var ve = Te`
|
|
|
147
147
|
bgcolor: "background.paper",
|
|
148
148
|
onSearch: (t) => S({
|
|
149
149
|
..._,
|
|
150
|
-
custom: (
|
|
150
|
+
custom: (r) => t ? ue(r, t) : O(r)
|
|
151
151
|
}),
|
|
152
152
|
onSelected: (t) => {
|
|
153
153
|
g(t), u(!1);
|
|
@@ -175,7 +175,7 @@ var ve = Te`
|
|
|
175
175
|
children: [/* @__PURE__ */ e(l, {
|
|
176
176
|
"aria-disabled": !n,
|
|
177
177
|
onClick: () => {
|
|
178
|
-
const t = [...
|
|
178
|
+
const t = [...o];
|
|
179
179
|
t.push({
|
|
180
180
|
...n,
|
|
181
181
|
nextDate: v(s, U(n.date)),
|
|
@@ -188,17 +188,17 @@ var ve = Te`
|
|
|
188
188
|
onClick: () => {
|
|
189
189
|
g(""), u(!0), I().finally();
|
|
190
190
|
},
|
|
191
|
-
variant: "
|
|
191
|
+
variant: "text",
|
|
192
192
|
children: y.cancel_button
|
|
193
193
|
})]
|
|
194
194
|
})] }),
|
|
195
|
-
|
|
195
|
+
o.length > 0 && !n && /* @__PURE__ */ i(h, {
|
|
196
196
|
direction: "row",
|
|
197
197
|
gap: 16,
|
|
198
198
|
ml: 24,
|
|
199
199
|
mt: 32,
|
|
200
200
|
children: [/* @__PURE__ */ e(l, {
|
|
201
|
-
"aria-disabled":
|
|
201
|
+
"aria-disabled": o.length < 1 || T,
|
|
202
202
|
onClick: Z,
|
|
203
203
|
startIcon: T ? /* @__PURE__ */ e(R, {
|
|
204
204
|
name: "progress_activity",
|
|
@@ -208,7 +208,7 @@ var ve = Te`
|
|
|
208
208
|
children: a.confirm_income_button
|
|
209
209
|
}), /* @__PURE__ */ e(l, {
|
|
210
210
|
onClick: x,
|
|
211
|
-
variant: "
|
|
211
|
+
variant: "text",
|
|
212
212
|
children: a.skip_button
|
|
213
213
|
})]
|
|
214
214
|
})
|