@mx-cartographer/experiences 9.4.2 → 9.4.4
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 -1
- package/dist/core/constants/Investments.d.ts +3 -0
- package/dist/core/constants/Investments.es.js +34 -11
- package/dist/core/constants/Investments.es.js.map +1 -1
- package/dist/core/constants/repeatingTransactions.d.ts +6 -0
- package/dist/core/constants/repeatingTransactions.es.js +18 -3
- package/dist/core/constants/repeatingTransactions.es.js.map +1 -1
- package/dist/core/stores/HoldingStore.d.ts +3 -0
- package/dist/core/stores/HoldingStore.es.js +39 -29
- package/dist/core/stores/HoldingStore.es.js.map +1 -1
- package/dist/core/types/RepeatingTransaction.d.ts +2 -0
- package/dist/core/types/RepeatingTransaction.es.js.map +1 -1
- package/dist/core/types/Transaction.d.ts +1 -0
- package/dist/core/types/Transaction.es.js.map +1 -1
- package/dist/core/utils/InvestmentUtil.d.ts +4 -0
- package/dist/core/utils/InvestmentUtil.es.js +71 -58
- package/dist/core/utils/InvestmentUtil.es.js.map +1 -1
- package/dist/core/utils/RecurringTransactionsUtil.d.ts +1 -0
- package/dist/core/utils/RecurringTransactionsUtil.es.js +145 -143
- package/dist/core/utils/RecurringTransactionsUtil.es.js.map +1 -1
- package/dist/core/utils/TransactionUtils.d.ts +1 -0
- package/dist/investments/InvestmentsWidget.es.js +100 -66
- package/dist/investments/InvestmentsWidget.es.js.map +1 -1
- package/dist/investments/components/allocation/util/createInvestementsAllocationData.es.js +50 -59
- package/dist/investments/components/allocation/util/createInvestementsAllocationData.es.js.map +1 -1
- package/dist/recurringtransactions/components/shared/recurringsettings/AddRecurringTransaction.es.js +16 -14
- package/dist/recurringtransactions/components/shared/recurringsettings/AddRecurringTransaction.es.js.map +1 -1
- package/dist/recurringtransactions/components/shared/recurringsettings/SelectTransaction.es.js +19 -17
- package/dist/recurringtransactions/components/shared/recurringsettings/SelectTransaction.es.js.map +1 -1
- package/dist/transactions/components/shared/TransactionList.es.js +16 -12
- package/dist/transactions/components/shared/TransactionList.es.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,72 +1,106 @@
|
|
|
1
|
-
import { useAccountStore as
|
|
2
|
-
import { useScreenSize as
|
|
3
|
-
import { useWidgetLoadTimer as
|
|
4
|
-
import { ANALYTICS_EVENTS as
|
|
5
|
-
import { AccountType as
|
|
6
|
-
import
|
|
7
|
-
import { WidgetContainer as
|
|
8
|
-
import { EmptyState as
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
import { TabTitle as
|
|
14
|
-
import
|
|
15
|
-
import { observer as
|
|
16
|
-
import
|
|
17
|
-
import { Fragment as
|
|
18
|
-
import
|
|
19
|
-
import
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
1
|
+
import { useAccountStore as O, useEvent as k, useGlobalCopyStore as F, useGlobalUiStore as K, useHoldingStore as y } from "../common/context/hooks.es.js";
|
|
2
|
+
import { useScreenSize as V } from "../common/hooks/useScreenSize.es.js";
|
|
3
|
+
import { useWidgetLoadTimer as H } from "../common/hooks/useWidgetLoadTimer.es.js";
|
|
4
|
+
import { ANALYTICS_EVENTS as s } from "../common/constants/Analytics.es.js";
|
|
5
|
+
import { AccountType as U } from "../core/types/Account.es.js";
|
|
6
|
+
import j from "../common/components/Loader.es.js";
|
|
7
|
+
import { WidgetContainer as z } from "../common/components/WidgetContainer.es.js";
|
|
8
|
+
import { EmptyState as B } from "../common/components/EmptyState.es.js";
|
|
9
|
+
import R from "../accounts/components/ConnectionsDrawer.es.js";
|
|
10
|
+
import Y from "./components/Allocation.es.js";
|
|
11
|
+
import $ from "./components/Analysis.es.js";
|
|
12
|
+
import q from "./components/Overview.es.js";
|
|
13
|
+
import { TabTitle as J } from "./components/TabTitle.es.js";
|
|
14
|
+
import l from "react";
|
|
15
|
+
import { observer as P } from "mobx-react-lite";
|
|
16
|
+
import Q from "@mui/material/Stack";
|
|
17
|
+
import { Fragment as X, jsx as t, jsxs as T } from "react/jsx-runtime";
|
|
18
|
+
import Z from "@mui/material/Tab";
|
|
19
|
+
import tt from "@mui/material/Tabs";
|
|
20
|
+
import et from "@mui/material/Tooltip";
|
|
21
|
+
var It = P(({ onBackClick: I, onMenuClick: S, sx: g }) => {
|
|
22
|
+
const { onEvent: c } = k(), { isMobile: v } = V(), { isAccountDataLoaded: A, loadAccountData: N, visibleInvestmentAccounts: L } = O(), { visibleHoldings: x, hasAllocationData: m, hasAnalysisData: d, setShowConnectionsWidget: _, showConnectionsWidget: D } = y(), { investments: e, accounts: W } = F(), { isInitialized: p } = K(), [o, f] = l.useState(0), { loadHoldings: w, holdingsLoaded: n } = y();
|
|
23
|
+
H({
|
|
23
24
|
widgetName: "InvestmentsWidget",
|
|
24
|
-
isLoaded:
|
|
25
|
-
}),
|
|
26
|
-
|
|
27
|
-
}, []),
|
|
28
|
-
|
|
29
|
-
}, [
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
isLoaded: n
|
|
26
|
+
}), l.useEffect(() => {
|
|
27
|
+
A || N().finally();
|
|
28
|
+
}, []), l.useEffect(() => {
|
|
29
|
+
p && w().finally();
|
|
30
|
+
}, [p]), l.useEffect(() => {
|
|
31
|
+
n && (o === 1 && !m && f(0), o === 2 && !d && f(0));
|
|
32
|
+
}, [
|
|
33
|
+
o,
|
|
34
|
+
m,
|
|
35
|
+
d,
|
|
36
|
+
n
|
|
37
|
+
]);
|
|
38
|
+
const M = () => {
|
|
39
|
+
c(s.INVESTMENT_WIDGET_ACCOUNT_FILTER_CLICK);
|
|
32
40
|
};
|
|
33
|
-
if (!
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
],
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
41
|
+
if (!p || !n) return /* @__PURE__ */ t(j, {});
|
|
42
|
+
const G = [
|
|
43
|
+
s.INVESTMENT_WIDGET_DETAILS_CLICK,
|
|
44
|
+
s.INVESTMENT_WIDGET_ALLOCATION_CLICK,
|
|
45
|
+
s.INVESTMENT_WIDGET_ANALYSIS_CLICK
|
|
46
|
+
], i = L.length === 0 && x.length === 0, b = [
|
|
47
|
+
{
|
|
48
|
+
title: e.tab_overview_title,
|
|
49
|
+
disabled: !1,
|
|
50
|
+
tooltip: ""
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
title: e.tab_allocation_title,
|
|
54
|
+
disabled: !m,
|
|
55
|
+
tooltip: e.allocation.empty_data
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
title: e.tab_analysis_title,
|
|
59
|
+
disabled: !d,
|
|
60
|
+
tooltip: e.analysis.empty_data
|
|
61
|
+
}
|
|
42
62
|
];
|
|
43
|
-
return /* @__PURE__ */
|
|
44
|
-
allowedAccountTypes: [
|
|
45
|
-
onAccountsFilterClick:
|
|
46
|
-
onBackClick:
|
|
47
|
-
onMenuClick:
|
|
48
|
-
sx:
|
|
63
|
+
return /* @__PURE__ */ T(z, {
|
|
64
|
+
allowedAccountTypes: [U.INVESTMENT],
|
|
65
|
+
onAccountsFilterClick: M,
|
|
66
|
+
onBackClick: I,
|
|
67
|
+
onMenuClick: S,
|
|
68
|
+
sx: g,
|
|
49
69
|
title: e.title,
|
|
50
|
-
children: [/* @__PURE__ */
|
|
51
|
-
mx:
|
|
70
|
+
children: [/* @__PURE__ */ T(Q, {
|
|
71
|
+
mx: v ? 0 : 48,
|
|
52
72
|
my: 24,
|
|
53
|
-
children: [/* @__PURE__ */ t(
|
|
54
|
-
onChange: (
|
|
55
|
-
|
|
73
|
+
children: [/* @__PURE__ */ t(tt, {
|
|
74
|
+
onChange: (r, a) => {
|
|
75
|
+
i || b[a]?.disabled || (f(a), c(G[a]));
|
|
56
76
|
},
|
|
57
77
|
sx: { bgcolor: "background.paper" },
|
|
58
78
|
textColor: "primary",
|
|
59
|
-
value:
|
|
79
|
+
value: i ? !1 : o,
|
|
60
80
|
variant: "fullWidth",
|
|
61
|
-
children:
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
81
|
+
children: b.map(({ title: r, disabled: a, tooltip: C }) => {
|
|
82
|
+
const u = i || a, E = u && !i && !!C, h = /* @__PURE__ */ t(Z, {
|
|
83
|
+
"aria-disabled": u || void 0,
|
|
84
|
+
label: /* @__PURE__ */ t(J, { title: r }),
|
|
85
|
+
sx: {
|
|
86
|
+
...E && { flex: 1 },
|
|
87
|
+
...u && {
|
|
88
|
+
opacity: 0.38,
|
|
89
|
+
cursor: "default"
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}, r);
|
|
93
|
+
return E ? /* @__PURE__ */ t(et, {
|
|
94
|
+
describeChild: !0,
|
|
95
|
+
title: C,
|
|
96
|
+
children: h
|
|
97
|
+
}, r) : h;
|
|
98
|
+
})
|
|
99
|
+
}), i ? /* @__PURE__ */ t(B, {
|
|
66
100
|
header: e.empty_state_header,
|
|
67
101
|
icon: "bid_landscape",
|
|
68
102
|
onClick: () => {
|
|
69
|
-
|
|
103
|
+
_(!0), c(s.ACCOUNTS_CLICK_CONNECT);
|
|
70
104
|
},
|
|
71
105
|
primaryButton: e.overview.connect_accounts,
|
|
72
106
|
subText: e.empty_state_description,
|
|
@@ -79,20 +113,20 @@ var ut = R(({ onBackClick: u, onMenuClick: T, sx: _ }) => {
|
|
|
79
113
|
},
|
|
80
114
|
px: 16
|
|
81
115
|
}
|
|
82
|
-
}) : /* @__PURE__ */
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
116
|
+
}) : /* @__PURE__ */ T(X, { children: [
|
|
117
|
+
o === 0 && /* @__PURE__ */ t(q, {}),
|
|
118
|
+
o === 1 && /* @__PURE__ */ t(Y, {}),
|
|
119
|
+
o === 2 && /* @__PURE__ */ t($, {})
|
|
86
120
|
] })]
|
|
87
|
-
}), /* @__PURE__ */ t(
|
|
88
|
-
onClose: () =>
|
|
89
|
-
showConnectionsWidget:
|
|
90
|
-
title:
|
|
121
|
+
}), /* @__PURE__ */ t(R, {
|
|
122
|
+
onClose: () => _(!1),
|
|
123
|
+
showConnectionsWidget: D,
|
|
124
|
+
title: W.manage_connections
|
|
91
125
|
})]
|
|
92
126
|
});
|
|
93
127
|
});
|
|
94
128
|
export {
|
|
95
|
-
|
|
129
|
+
It as InvestmentsWidget
|
|
96
130
|
};
|
|
97
131
|
|
|
98
132
|
//# sourceMappingURL=InvestmentsWidget.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InvestmentsWidget.es.js","names":[],"sources":["../../src/investments/InvestmentsWidget.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Stack from '@mui/material/Stack'\nimport Tab from '@mui/material/Tab'\nimport Tabs from '@mui/material/Tabs'\n\nimport {\n ANALYTICS_EVENTS,\n EmptyState,\n Loader,\n useAccountStore,\n useEvent,\n useGlobalCopyStore,\n useGlobalUiStore,\n useHoldingStore,\n useScreenSize,\n useWidgetLoadTimer,\n WidgetContainer,\n} from '../common'\nimport { AccountType, WidgetProps } from '../core'\n\nimport ConnectionsDrawer from '../accounts/components/ConnectionsDrawer'\nimport Allocation from './components/Allocation'\nimport Analysis from './components/Analysis'\nimport Overview from './components/Overview'\nimport { TabTitle } from './components/TabTitle'\n\nexport const InvestmentsWidget = observer(({ onBackClick, onMenuClick, sx }: WidgetProps) => {\n const { onEvent } = useEvent()\n const { isMobile } = useScreenSize()\n const {\n isAccountDataLoaded,\n loadAccountData,\n visibleInvestmentAccounts: accounts,\n } = useAccountStore()\n const {\n visibleHoldings: holdings,\n setShowConnectionsWidget,\n showConnectionsWidget,\n } = useHoldingStore()\n const { investments: copy, accounts: accountsCopy } = useGlobalCopyStore()\n\n const { isInitialized } = useGlobalUiStore()\n\n const [selectedTab, setSelectedTab] = React.useState(0)\n\n const { loadHoldings, holdingsLoaded } = useHoldingStore()\n\n useWidgetLoadTimer({\n widgetName: 'InvestmentsWidget',\n isLoaded: holdingsLoaded,\n })\n\n React.useEffect(() => {\n if (!isAccountDataLoaded) {\n loadAccountData().finally()\n }\n }, [])\n\n React.useEffect(() => {\n if (isInitialized) {\n loadHoldings().finally()\n }\n }, [isInitialized])\n\n const handleAccountFilterClick = () => {\n onEvent(ANALYTICS_EVENTS.INVESTMENT_WIDGET_ACCOUNT_FILTER_CLICK)\n }\n\n if (!isInitialized || !holdingsLoaded) return <Loader />\n\n const events = [\n ANALYTICS_EVENTS.INVESTMENT_WIDGET_DETAILS_CLICK,\n ANALYTICS_EVENTS.INVESTMENT_WIDGET_ALLOCATION_CLICK,\n ANALYTICS_EVENTS.INVESTMENT_WIDGET_ANALYSIS_CLICK,\n ]\n const isEmptyState = accounts.length === 0 && holdings.length === 0\n const investmentTabs = [\n copy.tab_overview_title,\n copy.tab_allocation_title,\n copy.tab_analysis_title,\n ]\n return (\n <WidgetContainer\n allowedAccountTypes={[AccountType.INVESTMENT]}\n onAccountsFilterClick={handleAccountFilterClick}\n onBackClick={onBackClick}\n onMenuClick={onMenuClick}\n sx={sx}\n title={copy.title}\n >\n <Stack mx={isMobile ? 0 : 48} my={24}>\n <Tabs\n onChange={(_, newValue) => {\n setSelectedTab(newValue)\n onEvent(events[newValue])\n }}\n sx={{ bgcolor: 'background.paper' }}\n textColor=\"primary\"\n value={!isEmptyState ? selectedTab : false}\n variant=\"fullWidth\"\n >\n {investmentTabs.map((title) => (\n <Tab
|
|
1
|
+
{"version":3,"file":"InvestmentsWidget.es.js","names":[],"sources":["../../src/investments/InvestmentsWidget.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Stack from '@mui/material/Stack'\nimport Tab from '@mui/material/Tab'\nimport Tabs from '@mui/material/Tabs'\nimport Tooltip from '@mui/material/Tooltip'\n\nimport {\n ANALYTICS_EVENTS,\n EmptyState,\n Loader,\n useAccountStore,\n useEvent,\n useGlobalCopyStore,\n useGlobalUiStore,\n useHoldingStore,\n useScreenSize,\n useWidgetLoadTimer,\n WidgetContainer,\n} from '../common'\nimport { AccountType, WidgetProps } from '../core'\n\nimport ConnectionsDrawer from '../accounts/components/ConnectionsDrawer'\nimport Allocation from './components/Allocation'\nimport Analysis from './components/Analysis'\nimport Overview from './components/Overview'\nimport { TabTitle } from './components/TabTitle'\n\nexport const InvestmentsWidget = observer(({ onBackClick, onMenuClick, sx }: WidgetProps) => {\n const { onEvent } = useEvent()\n const { isMobile } = useScreenSize()\n const {\n isAccountDataLoaded,\n loadAccountData,\n visibleInvestmentAccounts: accounts,\n } = useAccountStore()\n const {\n visibleHoldings: holdings,\n hasAllocationData,\n hasAnalysisData,\n setShowConnectionsWidget,\n showConnectionsWidget,\n } = useHoldingStore()\n const { investments: copy, accounts: accountsCopy } = useGlobalCopyStore()\n\n const { isInitialized } = useGlobalUiStore()\n\n const [selectedTab, setSelectedTab] = React.useState(0)\n\n const { loadHoldings, holdingsLoaded } = useHoldingStore()\n\n useWidgetLoadTimer({\n widgetName: 'InvestmentsWidget',\n isLoaded: holdingsLoaded,\n })\n\n React.useEffect(() => {\n if (!isAccountDataLoaded) {\n loadAccountData().finally()\n }\n }, [])\n\n React.useEffect(() => {\n if (isInitialized) {\n loadHoldings().finally()\n }\n }, [isInitialized])\n\n // Reset to Overview if the active tab becomes disabled. Only act once holdings\n // are loaded so a mid-refetch (getters briefly false) doesn't eject the user.\n // Depend only on the boolean getters, never `visibleHoldings` (new array each\n // access → render loop).\n React.useEffect(() => {\n if (!holdingsLoaded) return\n if (selectedTab === 1 && !hasAllocationData) setSelectedTab(0)\n if (selectedTab === 2 && !hasAnalysisData) setSelectedTab(0)\n }, [selectedTab, hasAllocationData, hasAnalysisData, holdingsLoaded])\n\n const handleAccountFilterClick = () => {\n onEvent(ANALYTICS_EVENTS.INVESTMENT_WIDGET_ACCOUNT_FILTER_CLICK)\n }\n\n if (!isInitialized || !holdingsLoaded) return <Loader />\n\n const events = [\n ANALYTICS_EVENTS.INVESTMENT_WIDGET_DETAILS_CLICK,\n ANALYTICS_EVENTS.INVESTMENT_WIDGET_ALLOCATION_CLICK,\n ANALYTICS_EVENTS.INVESTMENT_WIDGET_ANALYSIS_CLICK,\n ]\n const isEmptyState = accounts.length === 0 && holdings.length === 0\n const investmentTabs = [\n { title: copy.tab_overview_title, disabled: false, tooltip: '' },\n {\n title: copy.tab_allocation_title,\n disabled: !hasAllocationData,\n tooltip: copy.allocation.empty_data,\n },\n {\n title: copy.tab_analysis_title,\n disabled: !hasAnalysisData,\n tooltip: copy.analysis.empty_data,\n },\n ]\n return (\n <WidgetContainer\n allowedAccountTypes={[AccountType.INVESTMENT]}\n onAccountsFilterClick={handleAccountFilterClick}\n onBackClick={onBackClick}\n onMenuClick={onMenuClick}\n sx={sx}\n title={copy.title}\n >\n <Stack mx={isMobile ? 0 : 48} my={24}>\n <Tabs\n onChange={(_, newValue) => {\n // aria-disabled tabs stay clickable; block their selection here.\n if (isEmptyState || investmentTabs[newValue]?.disabled) return\n setSelectedTab(newValue)\n onEvent(events[newValue])\n }}\n sx={{ bgcolor: 'background.paper' }}\n textColor=\"primary\"\n value={!isEmptyState ? selectedTab : false}\n variant=\"fullWidth\"\n >\n {investmentTabs.map(({ title, disabled, tooltip }) => {\n const isDisabled = isEmptyState || disabled\n const isTooltipTab = isDisabled && !isEmptyState && Boolean(tooltip)\n // aria-disabled (not native disabled) keeps the Tab focusable and in\n // the a11y tree; describeChild adds the reason without stealing the name.\n const tab = (\n <Tab\n aria-disabled={isDisabled || undefined}\n key={title}\n label={<TabTitle title={title} />}\n sx={{\n ...(isTooltipTab && { flex: 1 }),\n ...(isDisabled && {\n opacity: 0.38,\n cursor: 'default',\n }),\n }}\n />\n )\n\n return isTooltipTab ? (\n <Tooltip describeChild key={title} title={tooltip}>\n {tab}\n </Tooltip>\n ) : (\n tab\n )\n })}\n </Tabs>\n {isEmptyState ? (\n <EmptyState\n header={copy.empty_state_header}\n icon=\"bid_landscape\"\n onClick={() => {\n setShowConnectionsWidget(true)\n onEvent(ANALYTICS_EVENTS.ACCOUNTS_CLICK_CONNECT)\n }}\n primaryButton={copy.overview.connect_accounts}\n subText={copy.empty_state_description}\n sx={{\n width: { sm: 432 },\n '.buttons-footer': {\n width: 167,\n },\n '.MuiTypography-h2': {\n mt: 20,\n mb: 4,\n },\n px: 16,\n }}\n />\n ) : (\n <>\n {selectedTab === 0 && <Overview />}\n {selectedTab === 1 && <Allocation />}\n {selectedTab === 2 && <Analysis />}\n </>\n )}\n </Stack>\n <ConnectionsDrawer\n onClose={() => setShowConnectionsWidget(false)}\n showConnectionsWidget={showConnectionsWidget}\n title={accountsCopy.manage_connections}\n />\n </WidgetContainer>\n )\n})\n"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { formatCurrency as
|
|
2
|
-
|
|
1
|
+
import { formatCurrency as L, formatPercentage as k } from "../../../../core/utils/NumberFormatting.es.js";
|
|
2
|
+
import { ALLOCATION_KEYS as B } from "../../../../core/constants/Investments.es.js";
|
|
3
|
+
var C = {
|
|
3
4
|
allocations_cash: "#AEDCCC",
|
|
4
5
|
allocations_convertible: "#80CAD0",
|
|
5
6
|
allocations_foreign_bond: "#51B9D4",
|
|
@@ -9,95 +10,85 @@ var L = {
|
|
|
9
10
|
allocations_unknown: "#161D6A",
|
|
10
11
|
allocations_us_bond: "#254995",
|
|
11
12
|
allocations_us_stock: "#1E2D84"
|
|
12
|
-
}, y =
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
], C = (e, l, c) => {
|
|
23
|
-
const i = c === void 0 ? 0 : l, t = c === void 0 ? l : c;
|
|
24
|
-
return e >= Math.min(i, t) && e < Math.max(i, t);
|
|
25
|
-
}, h = (e, l, c) => {
|
|
26
|
-
const i = [...new Set(e.map((r) => r.name.toLowerCase()))];
|
|
27
|
-
let t;
|
|
28
|
-
return i.map((r) => {
|
|
29
|
-
const _ = e.reduce((m, o) => {
|
|
30
|
-
const p = o.name;
|
|
31
|
-
return p.toLowerCase() === r ? (t = p, v(o) * o[l] / 100 + m) : m;
|
|
13
|
+
}, y = B.map((t) => ({ name: t })), V = (t, l, r) => {
|
|
14
|
+
const i = r === void 0 ? 0 : l, e = r === void 0 ? l : r;
|
|
15
|
+
return t >= Math.min(i, e) && t < Math.max(i, e);
|
|
16
|
+
}, h = (t, l, r) => {
|
|
17
|
+
const i = [...new Set(t.map((c) => c.name.toLowerCase()))];
|
|
18
|
+
let e;
|
|
19
|
+
return i.map((c) => {
|
|
20
|
+
const _ = t.reduce((m, s) => {
|
|
21
|
+
const p = s.name;
|
|
22
|
+
return p.toLowerCase() === c ? (e = p, d(s) * s[l] / 100 + m) : m;
|
|
32
23
|
}, 0);
|
|
33
24
|
return {
|
|
34
|
-
displayName:
|
|
35
|
-
name:
|
|
25
|
+
displayName: e,
|
|
26
|
+
name: e,
|
|
36
27
|
value: _,
|
|
37
|
-
percentage: _ /
|
|
28
|
+
percentage: _ / r
|
|
38
29
|
};
|
|
39
30
|
});
|
|
40
|
-
},
|
|
41
|
-
const i = Object.values(l.allocations_list),
|
|
42
|
-
let
|
|
43
|
-
const _ =
|
|
31
|
+
}, d = (t) => t.calculated_market_value ? t.calculated_market_value : t.market_value, E = (t, l, r) => {
|
|
32
|
+
const i = Object.values(l.allocations_list), e = [];
|
|
33
|
+
let c = 0;
|
|
34
|
+
const _ = new Set(t.map(({ guid: a }) => a)), m = r.filter(({ account_guid: a }) => _.has(a)).map((a) => ({
|
|
44
35
|
...a,
|
|
45
36
|
name: a.symbol || a.description,
|
|
46
|
-
gainLoss: a.cost_basis || a.cost_basis === 0 ?
|
|
47
|
-
})), { cashBalance:
|
|
37
|
+
gainLoss: a.cost_basis || a.cost_basis === 0 ? d(a) - a.cost_basis : 0
|
|
38
|
+
})), { cashBalance: s, totalAccountBalance: p } = t.reduce((a, n) => ({
|
|
48
39
|
cashBalance: a.cashBalance + (n.cash_balance || 0),
|
|
49
40
|
totalAccountBalance: a.totalAccountBalance + (n.balance || 0)
|
|
50
41
|
}), {
|
|
51
42
|
cashBalance: 0,
|
|
52
43
|
totalAccountBalance: 0
|
|
53
|
-
}), { marketValue:
|
|
54
|
-
marketValue: a.marketValue +
|
|
44
|
+
}), { marketValue: b, totalGainLoss: A } = m.reduce((a, n) => ({
|
|
45
|
+
marketValue: a.marketValue + d(n),
|
|
55
46
|
totalGainLoss: a.totalGainLoss + n.gainLoss
|
|
56
47
|
}), {
|
|
57
48
|
marketValue: 0,
|
|
58
49
|
totalGainLoss: 0
|
|
59
|
-
}), f =
|
|
50
|
+
}), f = b + s;
|
|
60
51
|
return y.forEach((a, n) => {
|
|
61
|
-
const
|
|
62
|
-
let
|
|
63
|
-
const
|
|
64
|
-
if (a.name === "allocations_cash" &&
|
|
65
|
-
|
|
52
|
+
const v = m.filter((u) => !!u[a.name]);
|
|
53
|
+
let o = v.reduce((u, g) => u + d(g) * g[a.name] / 100, 0);
|
|
54
|
+
const D = h(v, a.name, o);
|
|
55
|
+
if (a.name === "allocations_cash" && s > 0) {
|
|
56
|
+
o += s;
|
|
66
57
|
const u = {
|
|
67
58
|
displayName: l.cash_balance_display_name,
|
|
68
59
|
name: "allocations_name",
|
|
69
|
-
value:
|
|
70
|
-
percentage:
|
|
60
|
+
value: s,
|
|
61
|
+
percentage: s / f
|
|
71
62
|
};
|
|
72
|
-
|
|
63
|
+
D.push(u);
|
|
73
64
|
}
|
|
74
|
-
|
|
65
|
+
o > 0 && (e.push({
|
|
75
66
|
name: a.name,
|
|
76
67
|
displayName: i[n],
|
|
77
68
|
guid: `${a.name}-${n}`,
|
|
78
|
-
holdings:
|
|
79
|
-
percentage:
|
|
80
|
-
value:
|
|
81
|
-
color:
|
|
82
|
-
}),
|
|
69
|
+
holdings: D,
|
|
70
|
+
percentage: o / f,
|
|
71
|
+
value: o,
|
|
72
|
+
color: C[a.name]
|
|
73
|
+
}), c += o);
|
|
83
74
|
}), {
|
|
84
|
-
investmentsData:
|
|
85
|
-
donutData:
|
|
75
|
+
investmentsData: e,
|
|
76
|
+
donutData: e.map(({ displayName: a, guid: n, color: v, value: o }) => ({
|
|
86
77
|
id: n,
|
|
87
|
-
color:
|
|
78
|
+
color: v,
|
|
88
79
|
label: a,
|
|
89
|
-
value:
|
|
80
|
+
value: o / c * 100
|
|
90
81
|
})),
|
|
91
|
-
totalAmount:
|
|
92
|
-
totalGainLoss:
|
|
82
|
+
totalAmount: c,
|
|
83
|
+
totalGainLoss: A,
|
|
93
84
|
totalMarketValue: f,
|
|
94
|
-
totalGainLossPercentage:
|
|
85
|
+
totalGainLossPercentage: A / p
|
|
95
86
|
};
|
|
96
|
-
},
|
|
87
|
+
}, N = (t) => t < 1e-3 ? "< 0.1%" : k(t), S = (t) => t === 0 ? L(t, "0,0.00") : V(t, -0.01, 0.01) ? "< $0.01" : L(t, "0,0.00");
|
|
97
88
|
export {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
89
|
+
E as createInvestmentsAllocationData,
|
|
90
|
+
S as currencyDisplay,
|
|
91
|
+
N as percentageDisplay
|
|
101
92
|
};
|
|
102
93
|
|
|
103
94
|
//# sourceMappingURL=createInvestementsAllocationData.es.js.map
|
package/dist/investments/components/allocation/util/createInvestementsAllocationData.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createInvestementsAllocationData.es.js","names":[],"sources":["../../../../../src/investments/components/allocation/util/createInvestementsAllocationData.tsx"],"sourcesContent":["import { Account, Holding } from '../../../../core'\nimport { InvestmentAllocationCopy } from '../../../../core/types/localization/InvestmentsCopy'\nimport type { DonutData } from '../InvestmentsAllocationChart'\nimport { formatCurrency, formatPercentage } from '../../../../core/utils/NumberFormatting'\n\nexport interface InvestmentsAllocationData {\n name: string\n displayName: string\n guid: string\n holdings: InvestmentAllocationTotals[]\n percentage: number\n value: number\n color: string\n}\nexport interface InvestmentAllocationTotals {\n displayName: string\n name: string\n value: number\n percentage: number\n}\n\nconst allocationColors = {\n allocations_cash: '#AEDCCC',\n allocations_convertible: '#80CAD0',\n allocations_foreign_bond: '#51B9D4',\n allocations_foreign_stock: '#3DA0C9',\n allocations_other: '#3583B8',\n allocations_preferred: '#2D66A7',\n allocations_unknown: '#161D6A',\n allocations_us_bond: '#254995',\n allocations_us_stock: '#1E2D84',\n}\nconst allocationsList = [\n {\n name: 'allocations_cash',\n },\n {\n name: 'allocations_convertible',\n },\n {\n name: 'allocations_foreign_bond',\n },\n {\n name: 'allocations_foreign_stock',\n },\n {\n name: 'allocations_other',\n },\n {\n name: 'allocations_preferred',\n },\n {\n name: 'allocations_us_bond',\n },\n {\n name: 'allocations_us_stock',\n },\n {\n name: 'allocations_unknown',\n },\n]\n\nconst inRange = (n: number, start: number, end?: number) => {\n const rangeStart = end === undefined ? 0 : start\n const rangeEnd = end === undefined ? start : end\n return n >= Math.min(rangeStart, rangeEnd) && n < Math.max(rangeStart, rangeEnd)\n}\n\nconst createHoldingsData = (\n holdings: Holding[],\n allocationName: string,\n allocationValue: number,\n) => {\n const uniqueHoldings = [\n ...new Set(holdings.map((holding: Holding) => holding.name.toLowerCase())),\n ]\n let displayName: string\n const investmentAllocationTotals = uniqueHoldings.map((holdingName) => {\n // sum all the holdings with the same \"name\"\n const holdingsTotalValue = holdings.reduce((acc, hold: Holding) => {\n const name = hold.name\n\n if (name.toLowerCase() === holdingName) {\n // Since we lose the capitalization with the unique names, we take it from the last match.\n displayName = name\n return (\n (getHoldingValue(hold) * hold[allocationName as keyof typeof allocationColors]) / 100 +\n acc\n )\n }\n\n return acc\n }, 0)\n\n return {\n displayName,\n name: displayName,\n value: holdingsTotalValue,\n percentage: holdingsTotalValue / allocationValue,\n }\n })\n return investmentAllocationTotals\n}\n\nconst getHoldingValue = (holding: Holding) =>\n holding.calculated_market_value ? holding.calculated_market_value : holding.market_value\n\nexport const createInvestmentsAllocationData = (\n accounts: Account[],\n copy: InvestmentAllocationCopy,\n holdings: Holding[],\n) => {\n const allocationListDisplayNames = Object.values(copy.allocations_list)\n const investementAllocationData: InvestmentsAllocationData[] = []\n\n let totalAmount = 0\n\n const accountGuids = accounts.map(({ guid }) => guid)\n const updatedHoldings: Holding[] = holdings\n .filter(({ account_guid }) => accountGuids.includes(account_guid))\n .map((eachHolding) => {\n return {\n ...eachHolding,\n name: eachHolding.symbol || eachHolding.description,\n gainLoss:\n eachHolding.cost_basis || eachHolding.cost_basis === 0\n ? getHoldingValue(eachHolding) - eachHolding.cost_basis\n : 0,\n }\n })\n\n const { cashBalance, totalAccountBalance } = accounts.reduce(\n (sum, account) => {\n return {\n cashBalance: sum.cashBalance + (account.cash_balance || 0),\n totalAccountBalance: sum.totalAccountBalance + (account.balance || 0),\n }\n },\n { cashBalance: 0, totalAccountBalance: 0 },\n )\n const { marketValue, totalGainLoss } = updatedHoldings.reduce(\n (acc, holding) => {\n return {\n marketValue: acc.marketValue + getHoldingValue(holding),\n totalGainLoss: acc.totalGainLoss + holding.gainLoss,\n }\n },\n { marketValue: 0, totalGainLoss: 0 },\n )\n const totalMarketValue = marketValue + cashBalance\n\n allocationsList.forEach((allocation, index) => {\n const filteredHoldings = updatedHoldings.filter(\n (eachHolding) => !!eachHolding[allocation.name as keyof typeof allocationColors],\n )\n let holdingsTotal = filteredHoldings.reduce(\n (sum, holding) =>\n sum +\n (getHoldingValue(holding) * holding[allocation.name as keyof typeof allocationColors]) /\n 100,\n 0,\n )\n const investmentAllocationTotals = createHoldingsData(\n filteredHoldings,\n allocation.name,\n holdingsTotal,\n )\n if (allocation.name === 'allocations_cash' && cashBalance > 0) {\n // Updating holdingsTotal to include cash balance\n // This affects the holdingsTotal and percentage for this allocation\n holdingsTotal += cashBalance\n\n // Creating a holding item for cash balance\n const cashBalanceHolding = {\n displayName: copy.cash_balance_display_name,\n name: 'allocations_name',\n value: cashBalance,\n percentage: cashBalance / totalMarketValue,\n }\n\n investmentAllocationTotals.push(cashBalanceHolding)\n }\n\n // Shows allocation if holdingsTotal is greater than zero\n if (holdingsTotal > 0) {\n investementAllocationData.push({\n name: allocation.name,\n displayName: allocationListDisplayNames[index],\n guid: `${allocation.name}-${index}`,\n holdings: investmentAllocationTotals,\n percentage: holdingsTotal / totalMarketValue,\n value: holdingsTotal,\n color: allocationColors[allocation.name as keyof typeof allocationColors],\n })\n totalAmount += holdingsTotal\n }\n })\n const donutData: DonutData[] = investementAllocationData.map(\n ({ displayName, guid, color, value }) => ({\n id: guid,\n color: color,\n label: displayName,\n value: (value / totalAmount) * 100,\n }),\n )\n\n return {\n investmentsData: investementAllocationData,\n donutData,\n totalAmount,\n totalGainLoss,\n totalMarketValue,\n totalGainLossPercentage: totalGainLoss / totalAccountBalance,\n }\n}\n\nexport const percentageDisplay = (value: number) =>\n value < 0.001 ? '< 0.1%' : formatPercentage(value)\n\nexport const currencyDisplay = (value: number) => {\n if (value === 0) return formatCurrency(value, '0,0.00')\n return inRange(value, -0.01, 0.01) ? '< $0.01' : formatCurrency(value, '0,0.00')\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"createInvestementsAllocationData.es.js","names":[],"sources":["../../../../../src/investments/components/allocation/util/createInvestementsAllocationData.tsx"],"sourcesContent":["import { Account, Holding } from '../../../../core'\nimport { ALLOCATION_KEYS, type AllocationKey } from '../../../../core/constants/Investments'\nimport { InvestmentAllocationCopy } from '../../../../core/types/localization/InvestmentsCopy'\nimport type { DonutData } from '../InvestmentsAllocationChart'\nimport { formatCurrency, formatPercentage } from '../../../../core/utils/NumberFormatting'\n\nexport interface InvestmentsAllocationData {\n name: string\n displayName: string\n guid: string\n holdings: InvestmentAllocationTotals[]\n percentage: number\n value: number\n color: string\n}\nexport interface InvestmentAllocationTotals {\n displayName: string\n name: string\n value: number\n percentage: number\n}\n\nconst allocationColors: Record<AllocationKey, string> = {\n allocations_cash: '#AEDCCC',\n allocations_convertible: '#80CAD0',\n allocations_foreign_bond: '#51B9D4',\n allocations_foreign_stock: '#3DA0C9',\n allocations_other: '#3583B8',\n allocations_preferred: '#2D66A7',\n allocations_unknown: '#161D6A',\n allocations_us_bond: '#254995',\n allocations_us_stock: '#1E2D84',\n}\nconst allocationsList = ALLOCATION_KEYS.map((name) => ({ name }))\n\nconst inRange = (n: number, start: number, end?: number) => {\n const rangeStart = end === undefined ? 0 : start\n const rangeEnd = end === undefined ? start : end\n return n >= Math.min(rangeStart, rangeEnd) && n < Math.max(rangeStart, rangeEnd)\n}\n\nconst createHoldingsData = (\n holdings: Holding[],\n allocationName: string,\n allocationValue: number,\n) => {\n const uniqueHoldings = [\n ...new Set(holdings.map((holding: Holding) => holding.name.toLowerCase())),\n ]\n let displayName: string\n const investmentAllocationTotals = uniqueHoldings.map((holdingName) => {\n // sum all the holdings with the same \"name\"\n const holdingsTotalValue = holdings.reduce((acc, hold: Holding) => {\n const name = hold.name\n\n if (name.toLowerCase() === holdingName) {\n // Since we lose the capitalization with the unique names, we take it from the last match.\n displayName = name\n return (\n (getHoldingValue(hold) * hold[allocationName as keyof typeof allocationColors]) / 100 +\n acc\n )\n }\n\n return acc\n }, 0)\n\n return {\n displayName,\n name: displayName,\n value: holdingsTotalValue,\n percentage: holdingsTotalValue / allocationValue,\n }\n })\n return investmentAllocationTotals\n}\n\nconst getHoldingValue = (holding: Holding) =>\n holding.calculated_market_value ? holding.calculated_market_value : holding.market_value\n\nexport const createInvestmentsAllocationData = (\n accounts: Account[],\n copy: InvestmentAllocationCopy,\n holdings: Holding[],\n) => {\n const allocationListDisplayNames = Object.values(copy.allocations_list)\n const investementAllocationData: InvestmentsAllocationData[] = []\n\n let totalAmount = 0\n\n const accountGuids = new Set(accounts.map(({ guid }) => guid))\n const updatedHoldings: Holding[] = holdings\n .filter(({ account_guid }) => accountGuids.has(account_guid))\n .map((eachHolding) => {\n return {\n ...eachHolding,\n name: eachHolding.symbol || eachHolding.description,\n gainLoss:\n eachHolding.cost_basis || eachHolding.cost_basis === 0\n ? getHoldingValue(eachHolding) - eachHolding.cost_basis\n : 0,\n }\n })\n\n const { cashBalance, totalAccountBalance } = accounts.reduce(\n (sum, account) => {\n return {\n cashBalance: sum.cashBalance + (account.cash_balance || 0),\n totalAccountBalance: sum.totalAccountBalance + (account.balance || 0),\n }\n },\n { cashBalance: 0, totalAccountBalance: 0 },\n )\n const { marketValue, totalGainLoss } = updatedHoldings.reduce(\n (acc, holding) => {\n return {\n marketValue: acc.marketValue + getHoldingValue(holding),\n totalGainLoss: acc.totalGainLoss + holding.gainLoss,\n }\n },\n { marketValue: 0, totalGainLoss: 0 },\n )\n const totalMarketValue = marketValue + cashBalance\n\n allocationsList.forEach((allocation, index) => {\n const filteredHoldings = updatedHoldings.filter(\n (eachHolding) => !!eachHolding[allocation.name as keyof typeof allocationColors],\n )\n let holdingsTotal = filteredHoldings.reduce(\n (sum, holding) =>\n sum +\n (getHoldingValue(holding) * holding[allocation.name as keyof typeof allocationColors]) /\n 100,\n 0,\n )\n const investmentAllocationTotals = createHoldingsData(\n filteredHoldings,\n allocation.name,\n holdingsTotal,\n )\n if (allocation.name === 'allocations_cash' && cashBalance > 0) {\n // Updating holdingsTotal to include cash balance\n // This affects the holdingsTotal and percentage for this allocation\n holdingsTotal += cashBalance\n\n // Creating a holding item for cash balance\n const cashBalanceHolding = {\n displayName: copy.cash_balance_display_name,\n name: 'allocations_name',\n value: cashBalance,\n percentage: cashBalance / totalMarketValue,\n }\n\n investmentAllocationTotals.push(cashBalanceHolding)\n }\n\n // Shows allocation if holdingsTotal is greater than zero\n if (holdingsTotal > 0) {\n investementAllocationData.push({\n name: allocation.name,\n displayName: allocationListDisplayNames[index],\n guid: `${allocation.name}-${index}`,\n holdings: investmentAllocationTotals,\n percentage: holdingsTotal / totalMarketValue,\n value: holdingsTotal,\n color: allocationColors[allocation.name as keyof typeof allocationColors],\n })\n totalAmount += holdingsTotal\n }\n })\n const donutData: DonutData[] = investementAllocationData.map(\n ({ displayName, guid, color, value }) => ({\n id: guid,\n color: color,\n label: displayName,\n value: (value / totalAmount) * 100,\n }),\n )\n\n return {\n investmentsData: investementAllocationData,\n donutData,\n totalAmount,\n totalGainLoss,\n totalMarketValue,\n totalGainLossPercentage: totalGainLoss / totalAccountBalance,\n }\n}\n\nexport const percentageDisplay = (value: number) =>\n value < 0.001 ? '< 0.1%' : formatPercentage(value)\n\nexport const currencyDisplay = (value: number) => {\n if (value === 0) return formatCurrency(value, '0,0.00')\n return inRange(value, -0.01, 0.01) ? '< $0.01' : formatCurrency(value, '0,0.00')\n}\n"],"mappings":"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"}
|
package/dist/recurringtransactions/components/shared/recurringsettings/AddRecurringTransaction.es.js
CHANGED
|
@@ -12,8 +12,8 @@ import { Add as $ } from "@mxenabled/mx-icons";
|
|
|
12
12
|
import { Fragment as H, jsx as a, jsxs as I } from "react/jsx-runtime";
|
|
13
13
|
import { fromUnixTime as J } from "date-fns/fromUnixTime";
|
|
14
14
|
import { formatISO as K } from "date-fns/formatISO";
|
|
15
|
-
var ce = E(({ isIncome: i = !1, label:
|
|
16
|
-
const { recurring: r } = w(), { filter: s, setFilter: c, transactions:
|
|
15
|
+
var ce = E(({ isIncome: i = !1, label: _, onAddRecurringTransaction: x = () => null }) => {
|
|
16
|
+
const { recurring: r } = w(), { filter: s, setFilter: c, transactions: f } = G(), { addRepeatingTransaction: D } = B(), { user: C } = j(), [O, d] = o.useState(!1), [u, m] = o.useState(""), [l, R] = o.useState(L.EveryMonth), [p, A] = o.useState(1), [g, b] = o.useState(15), e = o.useMemo(() => f.find((t) => t.guid === u), [u, f]), q = () => {
|
|
17
17
|
d(!0), c(i ? {
|
|
18
18
|
...s,
|
|
19
19
|
custom: F
|
|
@@ -23,26 +23,28 @@ var ce = E(({ isIncome: i = !1, label: f, onAddRecurringTransaction: x = () => n
|
|
|
23
23
|
});
|
|
24
24
|
}, v = async () => {
|
|
25
25
|
if (!e) {
|
|
26
|
-
|
|
26
|
+
y();
|
|
27
27
|
return;
|
|
28
28
|
}
|
|
29
29
|
x();
|
|
30
|
-
const t = M(
|
|
30
|
+
const t = M(l, J(e.date), p), n = {
|
|
31
31
|
account_guid: e.account_guid,
|
|
32
32
|
amount: e.amount,
|
|
33
|
+
category_guid: e.category_guid ?? null,
|
|
33
34
|
created_by: 0,
|
|
35
|
+
main_class_guid: e.main_class_guid ?? null,
|
|
34
36
|
merchant_guid: e.merchant_guid,
|
|
35
37
|
description: e.payee || e.description || e.feed_description,
|
|
36
38
|
predicted_occurs_on: K(t, { representation: "date" }),
|
|
37
|
-
recurrence_day:
|
|
38
|
-
recurrence_type:
|
|
39
|
+
recurrence_day: p,
|
|
40
|
+
recurrence_type: l,
|
|
39
41
|
repeating_transaction_type: i ? T.Income : T.Bill,
|
|
40
|
-
second_recurrence_day:
|
|
42
|
+
second_recurrence_day: g,
|
|
41
43
|
transaction_type: e.transaction_type,
|
|
42
44
|
user_guid: C.guid
|
|
43
45
|
};
|
|
44
|
-
await D(n, e),
|
|
45
|
-
},
|
|
46
|
+
await D(n, e), y();
|
|
47
|
+
}, y = () => {
|
|
46
48
|
m(""), d(!1);
|
|
47
49
|
};
|
|
48
50
|
return /* @__PURE__ */ I(H, { children: [
|
|
@@ -50,13 +52,13 @@ var ce = E(({ isIncome: i = !1, label: f, onAddRecurringTransaction: x = () => n
|
|
|
50
52
|
onClick: q,
|
|
51
53
|
startIcon: /* @__PURE__ */ a($, { size: 24 }),
|
|
52
54
|
variant: "contained",
|
|
53
|
-
children:
|
|
55
|
+
children: _
|
|
54
56
|
}),
|
|
55
57
|
/* @__PURE__ */ a(S, {
|
|
56
58
|
ariaLabelClose: r.close_drawer_aria,
|
|
57
59
|
isOpen: O,
|
|
58
60
|
onClose: () => d(!1),
|
|
59
|
-
title:
|
|
61
|
+
title: _,
|
|
60
62
|
children: /* @__PURE__ */ a(k, {
|
|
61
63
|
description: i ? r.add_income_description : r.add_expense_description,
|
|
62
64
|
onSearch: (t) => {
|
|
@@ -75,12 +77,12 @@ var ce = E(({ isIncome: i = !1, label: f, onAddRecurringTransaction: x = () => n
|
|
|
75
77
|
onPrimaryAction: v,
|
|
76
78
|
title: i ? r.income_details : r.expense_details,
|
|
77
79
|
children: e && /* @__PURE__ */ a(z, {
|
|
78
|
-
firstDay:
|
|
79
|
-
frequency:
|
|
80
|
+
firstDay: p,
|
|
81
|
+
frequency: l,
|
|
80
82
|
onFirstDayChange: A,
|
|
81
83
|
onFrequencyChange: R,
|
|
82
84
|
onSecondDayChange: b,
|
|
83
|
-
secondDay:
|
|
85
|
+
secondDay: g,
|
|
84
86
|
transaction: e
|
|
85
87
|
})
|
|
86
88
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddRecurringTransaction.es.js","names":[],"sources":["../../../../../src/recurringtransactions/components/shared/recurringsettings/AddRecurringTransaction.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { formatISO } from 'date-fns/formatISO'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\n\nimport Button from '@mui/material/Button'\n\nimport { Add } from '@mxenabled/mx-icons'\n\nimport {\n Drawer,\n useGlobalCopyStore,\n useRecurringTransactionsStore,\n useTransactionStore,\n useUserStore,\n} from '../../../../common'\nimport {\n type RepeatingTransaction,\n type Transaction,\n Frequency,\n RepeatingType,\n} from '../../../../core'\n\nimport { SelectTransaction } from './SelectTransaction'\nimport { AddRecurringTransactionDetails } from './AddRecurringTransactionDetails'\n\nimport {\n expenseFilter,\n expenseFilterSearch,\n incomeFilter,\n incomeFilterSearch,\n} from '../../../../transactions/utils/Filters'\n\nimport { getNextPaymentDate } from '../../../../core/utils/RecurringTransactionsUtil'\n\ninterface AddRecurringTransactionProps {\n isIncome?: boolean\n label: string\n onAddRecurringTransaction?: () => void\n}\n\nexport const AddRecurringTransaction = observer(\n ({\n isIncome = false,\n label,\n onAddRecurringTransaction = () => null,\n }: AddRecurringTransactionProps) => {\n const { recurring: copy } = useGlobalCopyStore()\n const { filter, setFilter, transactions } = useTransactionStore()\n const { addRepeatingTransaction } = useRecurringTransactionsStore()\n const { user } = useUserStore()\n\n const [isSelectTransactionOpen, setIsSelectTransactionOpen] = React.useState(false)\n const [transactionGuid, setTransactionGuid] = React.useState('')\n const [frequency, setFrequency] = React.useState(Frequency.EveryMonth)\n const [firstDay, setFirstDay] = React.useState(1)\n const [secondDay, setSecondDay] = React.useState(15)\n\n const transaction = React.useMemo(\n () => transactions.find((t) => t.guid === transactionGuid),\n [transactionGuid, transactions],\n )\n\n const handleOpen = () => {\n setIsSelectTransactionOpen(true)\n\n if (isIncome) {\n setFilter({ ...filter, custom: incomeFilter })\n } else {\n setFilter({ ...filter, custom: expenseFilter })\n }\n }\n\n const handleAddRecurringTransaction = async () => {\n if (!transaction) {\n closeOnAdd()\n return\n }\n onAddRecurringTransaction()\n\n const nextDate = getNextPaymentDate(frequency, fromUnixTime(transaction.date), firstDay)\n\n const repeatingTransaction = {\n account_guid: transaction.account_guid,\n amount: transaction.amount,\n created_by: 0, // User\n merchant_guid: transaction.merchant_guid,\n description: transaction.payee || transaction.description || transaction.feed_description,\n predicted_occurs_on: formatISO(nextDate, { representation: 'date' }),\n recurrence_day: firstDay,\n recurrence_type: frequency,\n repeating_transaction_type: isIncome ? RepeatingType.Income : RepeatingType.Bill,\n second_recurrence_day: secondDay,\n transaction_type: transaction.transaction_type,\n user_guid: user.guid,\n } as RepeatingTransaction\n\n await addRepeatingTransaction(repeatingTransaction, transaction)\n closeOnAdd()\n }\n\n const closeOnAdd = () => {\n setTransactionGuid('')\n setIsSelectTransactionOpen(false)\n }\n\n return (\n <>\n <Button onClick={handleOpen} startIcon={<Add size={24} />} variant=\"contained\">\n {label}\n </Button>\n\n <Drawer\n ariaLabelClose={copy.close_drawer_aria}\n isOpen={isSelectTransactionOpen}\n onClose={() => setIsSelectTransactionOpen(false)}\n title={label}\n >\n <SelectTransaction\n description={isIncome ? copy.add_income_description : copy.add_expense_description}\n onSearch={(searchValue) => {\n setFilter({\n ...filter,\n custom: (transaction: Transaction) => {\n if (isIncome) {\n return searchValue\n ? incomeFilterSearch(transaction, searchValue)\n : incomeFilter(transaction)\n } else {\n return searchValue\n ? expenseFilterSearch(transaction, searchValue)\n : expenseFilter(transaction)\n }\n },\n })\n }}\n onSelected={(guid) => setTransactionGuid(guid)}\n />\n </Drawer>\n\n <Drawer\n ariaLabelClose={copy.close_drawer_aria}\n isOpen={Boolean(transactionGuid)}\n onClose={() => setTransactionGuid('')}\n onPrimaryAction={handleAddRecurringTransaction}\n title={isIncome ? copy.income_details : copy.expense_details}\n >\n {transaction && (\n <AddRecurringTransactionDetails\n firstDay={firstDay}\n frequency={frequency}\n onFirstDayChange={setFirstDay}\n onFrequencyChange={setFrequency}\n onSecondDayChange={setSecondDay}\n secondDay={secondDay}\n transaction={transaction}\n />\n )}\n </Drawer>\n </>\n )\n },\n)\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AddRecurringTransaction.es.js","names":[],"sources":["../../../../../src/recurringtransactions/components/shared/recurringsettings/AddRecurringTransaction.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { formatISO } from 'date-fns/formatISO'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\n\nimport Button from '@mui/material/Button'\n\nimport { Add } from '@mxenabled/mx-icons'\n\nimport {\n Drawer,\n useGlobalCopyStore,\n useRecurringTransactionsStore,\n useTransactionStore,\n useUserStore,\n} from '../../../../common'\nimport {\n type RepeatingTransaction,\n type Transaction,\n Frequency,\n RepeatingType,\n} from '../../../../core'\n\nimport { SelectTransaction } from './SelectTransaction'\nimport { AddRecurringTransactionDetails } from './AddRecurringTransactionDetails'\n\nimport {\n expenseFilter,\n expenseFilterSearch,\n incomeFilter,\n incomeFilterSearch,\n} from '../../../../transactions/utils/Filters'\n\nimport { getNextPaymentDate } from '../../../../core/utils/RecurringTransactionsUtil'\n\ninterface AddRecurringTransactionProps {\n isIncome?: boolean\n label: string\n onAddRecurringTransaction?: () => void\n}\n\nexport const AddRecurringTransaction = observer(\n ({\n isIncome = false,\n label,\n onAddRecurringTransaction = () => null,\n }: AddRecurringTransactionProps) => {\n const { recurring: copy } = useGlobalCopyStore()\n const { filter, setFilter, transactions } = useTransactionStore()\n const { addRepeatingTransaction } = useRecurringTransactionsStore()\n const { user } = useUserStore()\n\n const [isSelectTransactionOpen, setIsSelectTransactionOpen] = React.useState(false)\n const [transactionGuid, setTransactionGuid] = React.useState('')\n const [frequency, setFrequency] = React.useState(Frequency.EveryMonth)\n const [firstDay, setFirstDay] = React.useState(1)\n const [secondDay, setSecondDay] = React.useState(15)\n\n const transaction = React.useMemo(\n () => transactions.find((t) => t.guid === transactionGuid),\n [transactionGuid, transactions],\n )\n\n const handleOpen = () => {\n setIsSelectTransactionOpen(true)\n\n if (isIncome) {\n setFilter({ ...filter, custom: incomeFilter })\n } else {\n setFilter({ ...filter, custom: expenseFilter })\n }\n }\n\n const handleAddRecurringTransaction = async () => {\n if (!transaction) {\n closeOnAdd()\n return\n }\n onAddRecurringTransaction()\n\n const nextDate = getNextPaymentDate(frequency, fromUnixTime(transaction.date), firstDay)\n\n const repeatingTransaction = {\n account_guid: transaction.account_guid,\n amount: transaction.amount,\n category_guid: transaction.category_guid ?? null,\n created_by: 0, // User\n main_class_guid: transaction.main_class_guid ?? null,\n merchant_guid: transaction.merchant_guid,\n description: transaction.payee || transaction.description || transaction.feed_description,\n predicted_occurs_on: formatISO(nextDate, { representation: 'date' }),\n recurrence_day: firstDay,\n recurrence_type: frequency,\n repeating_transaction_type: isIncome ? RepeatingType.Income : RepeatingType.Bill,\n second_recurrence_day: secondDay,\n transaction_type: transaction.transaction_type,\n user_guid: user.guid,\n } as RepeatingTransaction\n\n await addRepeatingTransaction(repeatingTransaction, transaction)\n closeOnAdd()\n }\n\n const closeOnAdd = () => {\n setTransactionGuid('')\n setIsSelectTransactionOpen(false)\n }\n\n return (\n <>\n <Button onClick={handleOpen} startIcon={<Add size={24} />} variant=\"contained\">\n {label}\n </Button>\n\n <Drawer\n ariaLabelClose={copy.close_drawer_aria}\n isOpen={isSelectTransactionOpen}\n onClose={() => setIsSelectTransactionOpen(false)}\n title={label}\n >\n <SelectTransaction\n description={isIncome ? copy.add_income_description : copy.add_expense_description}\n onSearch={(searchValue) => {\n setFilter({\n ...filter,\n custom: (transaction: Transaction) => {\n if (isIncome) {\n return searchValue\n ? incomeFilterSearch(transaction, searchValue)\n : incomeFilter(transaction)\n } else {\n return searchValue\n ? expenseFilterSearch(transaction, searchValue)\n : expenseFilter(transaction)\n }\n },\n })\n }}\n onSelected={(guid) => setTransactionGuid(guid)}\n />\n </Drawer>\n\n <Drawer\n ariaLabelClose={copy.close_drawer_aria}\n isOpen={Boolean(transactionGuid)}\n onClose={() => setTransactionGuid('')}\n onPrimaryAction={handleAddRecurringTransaction}\n title={isIncome ? copy.income_details : copy.expense_details}\n >\n {transaction && (\n <AddRecurringTransactionDetails\n firstDay={firstDay}\n frequency={frequency}\n onFirstDayChange={setFirstDay}\n onFrequencyChange={setFrequency}\n onSecondDayChange={setSecondDay}\n secondDay={secondDay}\n transaction={transaction}\n />\n )}\n </Drawer>\n </>\n )\n },\n)\n"],"mappings":"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"}
|
package/dist/recurringtransactions/components/shared/recurringsettings/SelectTransaction.es.js
CHANGED
|
@@ -1,44 +1,46 @@
|
|
|
1
1
|
import { useGlobalCopyStore as l } from "../../../../common/context/hooks.es.js";
|
|
2
|
-
import m from "../../../../
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import _ from "
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
2
|
+
import { isEligibleRepeatingTransaction as m } from "../../../../core/utils/RecurringTransactionsUtil.es.js";
|
|
3
|
+
import p from "../../../../common/components/SearchBox.es.js";
|
|
4
|
+
import { useTransactionsUiStore as f } from "../../../../transactions/context/hooks.es.js";
|
|
5
|
+
import h from "../../../../transactions/components/shared/TransactionList.es.js";
|
|
6
|
+
import { observer as _ } from "mobx-react-lite";
|
|
7
|
+
import u from "@mui/material/Stack";
|
|
8
|
+
import { P as d } from "@mxenabled/mxui";
|
|
9
|
+
import { jsx as a, jsxs as g } from "react/jsx-runtime";
|
|
10
|
+
var V = _(({ bgcolor: e = "background.default", description: o, onSearch: i, onSelected: c }) => {
|
|
11
|
+
const { recurring: r } = l(), { searchValue: s, setSearchValue: n } = f();
|
|
12
|
+
return /* @__PURE__ */ g(u, {
|
|
12
13
|
sx: {
|
|
13
14
|
bgcolor: e,
|
|
14
15
|
gap: 16,
|
|
15
16
|
pt: 8
|
|
16
17
|
},
|
|
17
18
|
children: [
|
|
18
|
-
o && /* @__PURE__ */ a(
|
|
19
|
+
o && /* @__PURE__ */ a(d, {
|
|
19
20
|
sx: { mx: 24 },
|
|
20
21
|
children: o
|
|
21
22
|
}),
|
|
22
|
-
/* @__PURE__ */ a(
|
|
23
|
+
/* @__PURE__ */ a(p, {
|
|
23
24
|
ariaLabel: r.select_transaction_search_aria,
|
|
24
25
|
cancelAriaLabel: r.select_transaction_search_cancel_aria,
|
|
25
26
|
onChange: (t) => {
|
|
26
|
-
n(t),
|
|
27
|
+
n(t), i(t);
|
|
27
28
|
},
|
|
28
29
|
placeholder: r.select_transaction_search_placeholder,
|
|
29
|
-
searchValue:
|
|
30
|
+
searchValue: s
|
|
30
31
|
}),
|
|
31
|
-
/* @__PURE__ */ a(
|
|
32
|
+
/* @__PURE__ */ a(h, {
|
|
32
33
|
bgcolor: e,
|
|
34
|
+
filter: m,
|
|
33
35
|
height: "auto",
|
|
34
|
-
onClick:
|
|
36
|
+
onClick: c,
|
|
35
37
|
showLoader: !1
|
|
36
38
|
})
|
|
37
39
|
]
|
|
38
40
|
});
|
|
39
41
|
});
|
|
40
42
|
export {
|
|
41
|
-
|
|
43
|
+
V as SelectTransaction
|
|
42
44
|
};
|
|
43
45
|
|
|
44
46
|
//# sourceMappingURL=SelectTransaction.es.js.map
|