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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/CHANGELOG.md +8 -2
  2. package/dist/budgets/BubbleBudgetsWidget.es.js +29 -29
  3. package/dist/budgets/BubbleBudgetsWidget.es.js.map +1 -1
  4. package/dist/budgets/components/AddBudgets.es.js +16 -13
  5. package/dist/budgets/components/AddBudgets.es.js.map +1 -1
  6. package/dist/budgets/components/BudgetDetailsDrawer.es.js +95 -95
  7. package/dist/budgets/components/BudgetDetailsDrawer.es.js.map +1 -1
  8. package/dist/budgets/components/BudgetDetailsDrawerV2.es.js +16 -13
  9. package/dist/budgets/components/BudgetDetailsDrawerV2.es.js.map +1 -1
  10. package/dist/budgets/components/addbudget/RecalculateBudgets.es.js +14 -11
  11. package/dist/budgets/components/addbudget/RecalculateBudgets.es.js.map +1 -1
  12. package/dist/budgets/components/budgetdetails/AddSubBudget.es.js +63 -61
  13. package/dist/budgets/components/budgetdetails/AddSubBudget.es.js.map +1 -1
  14. package/dist/budgets/components/budgetdetails/BudgetDetails.es.js +8 -5
  15. package/dist/budgets/components/budgetdetails/BudgetDetails.es.js.map +1 -1
  16. package/dist/budgets/components/budgetdetails/SubBudgetAmounts.d.ts +3 -4
  17. package/dist/budgets/components/budgetdetails/SubBudgetAmounts.es.js +42 -31
  18. package/dist/budgets/components/budgetdetails/SubBudgetAmounts.es.js.map +1 -1
  19. package/dist/budgets/components/budgetdetails/SubBudgetList.es.js +71 -59
  20. package/dist/budgets/components/budgetdetails/SubBudgetList.es.js.map +1 -1
  21. package/dist/budgets/components/shared/SubBudgetCategory.d.ts +2 -2
  22. package/dist/budgets/components/shared/SubBudgetCategory.es.js.map +1 -1
  23. package/dist/core/stores/BudgetsStore.d.ts +13 -6
  24. package/dist/core/stores/BudgetsStore.es.js +36 -42
  25. package/dist/core/stores/BudgetsStore.es.js.map +1 -1
  26. package/dist/core/types/RepeatingTransaction.d.ts +2 -2
  27. package/dist/core/types/RepeatingTransaction.es.js.map +1 -1
  28. package/dist/core/utils/BudgetUtil.d.ts +1 -0
  29. package/dist/core/utils/BudgetUtil.es.js +55 -57
  30. package/dist/core/utils/BudgetUtil.es.js.map +1 -1
  31. package/dist/recurringtransactions/components/RecurrenceRow.es.js +1 -1
  32. package/dist/recurringtransactions/components/RecurrenceRow.es.js.map +1 -1
  33. package/dist/recurringtransactions/components/RecurringTransactionDetails.es.js +1 -1
  34. package/dist/recurringtransactions/components/RecurringTransactionDetails.es.js.map +1 -1
  35. package/dist/recurringtransactions/components/RecurringTransactionList.es.js +1 -1
  36. package/dist/recurringtransactions/components/RecurringTransactionList.es.js.map +1 -1
  37. package/dist/recurringtransactions/components/shared/recurringsettings/RecurringRow.es.js +1 -1
  38. package/dist/recurringtransactions/components/shared/recurringsettings/RecurringRow.es.js.map +1 -1
  39. package/dist/recurringtransactions/components/shared/recurringsettings/SelectTransaction.es.js +14 -15
  40. package/dist/recurringtransactions/components/shared/recurringsettings/SelectTransaction.es.js.map +1 -1
  41. package/dist/transactions/components/shared/transactiondetails/actions/AddMerchantBudgetAction.es.js +85 -82
  42. package/dist/transactions/components/shared/transactiondetails/actions/AddMerchantBudgetAction.es.js.map +1 -1
  43. package/package.json +1 -1
@@ -1,77 +1,75 @@
1
1
  import { buildDynamicCopy as f } from "./Localization.es.js";
2
- import { findDetailedCategory as _, findDetailedSubCategory as B } from "./CategoryUtil.es.js";
3
- import { formatCurrency as l } from "./NumberFormatting.es.js";
4
- var p = (n, t) => !n && !t ? 0 : !n && t ? 101 : t / n * 100, m = (n, t) => {
5
- const e = {
2
+ import { findDetailedCategory as B, findDetailedSubCategory as y } from "./CategoryUtil.es.js";
3
+ import { formatCurrency as p } from "./NumberFormatting.es.js";
4
+ var x = (e) => e === void 0 || e === "" || Number(e) < 0 || isNaN(Number(e)), l = (e, t) => !e && !t ? 0 : !e && t ? 101 : t / e * 100, m = (e, t) => {
5
+ const r = {
6
6
  background: t.palette.success.main,
7
- description: n <= 100 ? t.palette.text.secondary : t.palette.error.main,
7
+ description: e <= 100 ? t.palette.text.secondary : t.palette.error.main,
8
8
  text: t.palette.common.white,
9
9
  mercury: t.palette.success.lighter
10
10
  };
11
- return n > 100 ? (e.background = t.palette.error.main, e.mercury = t.palette.error.lighter) : n > 80 && (e.background = t.palette.warning.main, e.text = t.palette.grey[900], e.mercury = t.palette.warning.lighter), e;
12
- }, x = (n) => n.map((t) => {
13
- const e = t.transaction_total;
14
- return t.amount - e;
15
- }).reduce((t, e) => t + e, 0), M = (n, t, e, a) => {
16
- const s = [];
17
- for (const r of n) {
18
- const o = _(t, r.category_guid);
19
- if (!o) continue;
20
- const i = o.totalAmount, u = p(r.amount, i), g = r.amount - i;
21
- s.push({
22
- ...r,
23
- budgetColors: m(u, a),
24
- category: o,
25
- description: f(g < 0 ? e.budget_remaining_over : e.budget_remaining_left, l(Math.abs(g), "0,0")),
26
- percentage: u,
11
+ return e > 100 ? (r.background = t.palette.error.main, r.mercury = t.palette.error.lighter) : e > 80 && (r.background = t.palette.warning.main, r.text = t.palette.grey[900], r.mercury = t.palette.warning.lighter), r;
12
+ }, M = (e) => e.map((t) => {
13
+ const r = t.transaction_total;
14
+ return t.amount - r;
15
+ }).reduce((t, r) => t + r, 0), D = (e, t, r, i) => {
16
+ const o = [], d = /* @__PURE__ */ new Map();
17
+ for (const n of e) n.parent_guid && d.set(n.parent_guid, (d.get(n.parent_guid) ?? 0) + n.amount);
18
+ for (const n of e) {
19
+ const a = B(t, n.category_guid);
20
+ if (!a) continue;
21
+ const s = d.get(n.guid) ?? n.amount, u = a.totalAmount, g = l(s, u), c = s - u;
22
+ o.push({
23
+ ...n,
24
+ amount: s,
25
+ budgetColors: m(g, i),
26
+ category: a,
27
+ description: f(c < 0 ? r.budget_remaining_over : r.budget_remaining_left, p(Math.abs(c), "0,0")),
28
+ percentage: g,
27
29
  subBudgets: [],
28
- transaction_total: i
30
+ transaction_total: u
29
31
  });
30
32
  }
31
- for (const r of n) {
32
- const o = B(t, r.category_guid);
33
- if (!o) continue;
34
- const i = o.currentAmount, u = s.find((d) => d.category_guid === o.parent_guid);
35
- if (!u) continue;
36
- const g = r.amount - i, c = p(r.amount, i);
37
- u && u.subBudgets.push({
38
- ...r,
39
- budgetColors: m(c, a),
40
- category: o,
41
- description: f(g < 0 ? e.budget_remaining_over : e.budget_remaining_left, l(Math.abs(g), "0,0")),
33
+ for (const n of e) {
34
+ if (!n.parent_guid) continue;
35
+ const a = y(t, n.category_guid);
36
+ if (!a) continue;
37
+ const s = o.find((_) => _.guid === n.parent_guid);
38
+ if (!s) continue;
39
+ const u = a.currentAmount, g = n.amount - u, c = l(n.amount, u);
40
+ s.subBudgets.push({
41
+ ...n,
42
+ budgetColors: m(c, i),
43
+ category: a,
44
+ description: f(g < 0 ? r.budget_remaining_over : r.budget_remaining_left, p(Math.abs(g), "0,0")),
42
45
  percentage: c,
43
46
  subBudgets: [],
44
- transaction_total: i
47
+ transaction_total: u
45
48
  });
46
49
  }
47
- for (const r of s) if (r.subBudgets.length > 0) {
48
- const o = r.subBudgets.reduce((c, d) => c + d.amount, 0);
49
- r.amount = o;
50
- const i = r.transaction_total, u = p(o, i), g = o - i;
51
- r.percentage = u, r.budgetColors = m(u, a), r.description = f(g < 0 ? e.budget_remaining_over : e.budget_remaining_left, l(Math.abs(g), "0,0"));
52
- }
53
- return s;
54
- }, b = (n, t) => n.find((e) => e.guid === t), w = (n, t, e) => {
55
- const a = b(n, e);
56
- if (a)
57
- return b(a.subBudgets, t);
58
- }, D = (n, t) => {
59
- const e = Math.max(0, t - n), a = t > 0 ? Math.min(100, n / t * 100) : 0;
60
- let s = "success";
61
- return a >= 100 ? s = "error" : a >= 50 && (s = "warning"), {
62
- remainingAmount: e,
63
- spentPercentage: a,
64
- iconColor: s
50
+ return o;
51
+ }, b = (e, t) => e.find((r) => r.guid === t), N = (e, t, r) => {
52
+ const i = b(e, r);
53
+ if (i)
54
+ return b(i.subBudgets, t);
55
+ }, k = (e, t) => {
56
+ const r = Math.max(0, t - e), i = t > 0 ? Math.min(100, e / t * 100) : 0;
57
+ let o = "success";
58
+ return i >= 100 ? o = "error" : i >= 50 && (o = "warning"), {
59
+ remainingAmount: r,
60
+ spentPercentage: i,
61
+ iconColor: o
65
62
  };
66
63
  };
67
64
  export {
68
- M as augmentBudgets,
65
+ D as augmentBudgets,
69
66
  b as findBudget,
70
- w as findSubBudget,
67
+ N as findSubBudget,
71
68
  m as getBudgetColors,
72
- x as getBudgetDifference,
73
- p as getBudgetPercentage,
74
- D as getRemainingAmountSpentPercentage
69
+ M as getBudgetDifference,
70
+ l as getBudgetPercentage,
71
+ k as getRemainingAmountSpentPercentage,
72
+ x as isInvalidAmount
75
73
  };
76
74
 
77
75
  //# sourceMappingURL=BudgetUtil.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BudgetUtil.es.js","names":[],"sources":["../../../src/core/utils/BudgetUtil.ts"],"sourcesContent":["import type { Theme } from '@mui/system'\n\nimport type { Budget, BudgetColors, BudgetsCopy, DetailedCategory, DetailedBudget } from '../types'\n\nimport { findDetailedCategory, findDetailedSubCategory } from './CategoryUtil'\nimport { formatCurrency } from './NumberFormatting'\nimport { buildDynamicCopy } from './Localization'\n\nexport const getBudgetPercentage = (budgetAmount: number, totalAmount: number) => {\n // No budget amount and nothing spent results in zero percent and green bubble\n if (!budgetAmount && !totalAmount) {\n return 0\n }\n\n // No budget amount and money spent results in 101 percent and red bubble\n if (!budgetAmount && totalAmount) {\n return 101\n }\n\n // Budget amount and money spent results in calculating percentage for color\n return (totalAmount / budgetAmount) * 100\n}\n\nexport const getBudgetColors = (percentage: number, theme: Theme) => {\n const budgetColors: BudgetColors = {\n background: theme.palette.success.main,\n description: percentage <= 100 ? theme.palette.text.secondary : theme.palette.error.main,\n text: theme.palette.common.white,\n mercury: theme.palette.success.lighter,\n }\n\n if (percentage > 100) {\n budgetColors.background = theme.palette.error.main\n budgetColors.mercury = theme.palette.error.lighter\n } else if (percentage > 80) {\n budgetColors.background = theme.palette.warning.main\n budgetColors.text = theme.palette.grey['900']\n budgetColors.mercury = theme.palette.warning.lighter\n }\n\n return budgetColors\n}\n\nexport const getBudgetDifference = (budgets: DetailedBudget[]) => {\n const differences = budgets.map((budget) => {\n const currentAmount = budget.transaction_total\n const totalAmount = budget.amount\n return totalAmount - currentAmount\n })\n\n return differences.reduce((total, difference) => total + difference, 0)\n}\n\nexport const augmentBudgets = (\n budgets: Budget[],\n categories: DetailedCategory[],\n copy: BudgetsCopy,\n theme: Theme,\n): DetailedBudget[] => {\n const detailedBudgets = [] as DetailedBudget[]\n\n // Top-level Categories\n for (const budget of budgets) {\n const category = findDetailedCategory(categories, budget.category_guid)\n if (!category) continue\n\n const spent = category.totalAmount\n\n const percentage = getBudgetPercentage(budget.amount, spent)\n const difference = budget.amount - spent\n\n detailedBudgets.push({\n ...budget,\n budgetColors: getBudgetColors(percentage, theme),\n category,\n description: buildDynamicCopy(\n difference < 0 ? copy.budget_remaining_over : copy.budget_remaining_left,\n formatCurrency(Math.abs(difference), '0,0'),\n ) as string,\n percentage,\n subBudgets: [],\n transaction_total: spent,\n })\n }\n\n // Sub categories\n for (const budget of budgets) {\n const category = findDetailedSubCategory(categories, budget.category_guid)\n if (!category) continue\n\n const spent = category.currentAmount\n\n const parentBudget = detailedBudgets.find((b) => b.category_guid === category.parent_guid)\n if (!parentBudget) continue\n\n const difference = budget.amount - spent\n const percentage = getBudgetPercentage(budget.amount, spent)\n\n if (parentBudget) {\n parentBudget.subBudgets.push({\n ...budget,\n budgetColors: getBudgetColors(percentage, theme),\n category,\n description: buildDynamicCopy(\n difference < 0 ? copy.budget_remaining_over : copy.budget_remaining_left,\n formatCurrency(Math.abs(difference), '0,0'),\n ) as string,\n percentage,\n subBudgets: [],\n transaction_total: spent,\n })\n }\n }\n\n for (const parentBudget of detailedBudgets) {\n if (parentBudget.subBudgets.length > 0) {\n const totalSubBudgetAmount = parentBudget.subBudgets.reduce(\n (total, subBudget) => total + subBudget.amount,\n 0,\n )\n parentBudget.amount = totalSubBudgetAmount\n\n const spent = parentBudget.transaction_total\n const percentage = getBudgetPercentage(totalSubBudgetAmount, spent)\n const difference = totalSubBudgetAmount - spent\n\n parentBudget.percentage = percentage\n parentBudget.budgetColors = getBudgetColors(percentage, theme)\n parentBudget.description = buildDynamicCopy(\n difference < 0 ? copy.budget_remaining_over : copy.budget_remaining_left,\n formatCurrency(Math.abs(difference), '0,0'),\n ) as string\n }\n }\n\n return detailedBudgets\n}\n\nexport const findBudget = (budgets: DetailedBudget[], guid: string): DetailedBudget | undefined => {\n return budgets.find((budget) => budget.guid === guid)\n}\n\nexport const findSubBudget = (\n budgets: DetailedBudget[],\n guid: string,\n parentGuid: string,\n): DetailedBudget | undefined => {\n const parent = findBudget(budgets, parentGuid)\n if (!parent) return undefined\n\n return findBudget(parent.subBudgets, guid)\n}\n\nexport const getRemainingAmountSpentPercentage = (totalTransaction: number, amount: number) => {\n const remainingAmount = Math.max(0, amount - totalTransaction)\n const spentPercentage = amount > 0 ? Math.min(100, (totalTransaction / amount) * 100) : 0\n\n let iconColor = 'success'\n if (spentPercentage >= 100) iconColor = 'error'\n else if (spentPercentage >= 50) iconColor = 'warning'\n\n return {\n remainingAmount,\n spentPercentage,\n iconColor,\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"BudgetUtil.es.js","names":[],"sources":["../../../src/core/utils/BudgetUtil.ts"],"sourcesContent":["import type { Theme } from '@mui/system'\n\nimport type { Budget, BudgetColors, BudgetsCopy, DetailedCategory, DetailedBudget } from '../types'\n\nimport { findDetailedCategory, findDetailedSubCategory } from './CategoryUtil'\nimport { formatCurrency } from './NumberFormatting'\nimport { buildDynamicCopy } from './Localization'\n\nexport const isInvalidAmount = (val: string | undefined) =>\n val === undefined || val === '' || Number(val) < 0 || isNaN(Number(val))\n\nexport const getBudgetPercentage = (budgetAmount: number, totalAmount: number) => {\n // No budget amount and nothing spent results in zero percent and green bubble\n if (!budgetAmount && !totalAmount) {\n return 0\n }\n\n // No budget amount and money spent results in 101 percent and red bubble\n if (!budgetAmount && totalAmount) {\n return 101\n }\n\n // Budget amount and money spent results in calculating percentage for color\n return (totalAmount / budgetAmount) * 100\n}\n\nexport const getBudgetColors = (percentage: number, theme: Theme) => {\n const budgetColors: BudgetColors = {\n background: theme.palette.success.main,\n description: percentage <= 100 ? theme.palette.text.secondary : theme.palette.error.main,\n text: theme.palette.common.white,\n mercury: theme.palette.success.lighter,\n }\n\n if (percentage > 100) {\n budgetColors.background = theme.palette.error.main\n budgetColors.mercury = theme.palette.error.lighter\n } else if (percentage > 80) {\n budgetColors.background = theme.palette.warning.main\n budgetColors.text = theme.palette.grey['900']\n budgetColors.mercury = theme.palette.warning.lighter\n }\n\n return budgetColors\n}\n\nexport const getBudgetDifference = (budgets: DetailedBudget[]) => {\n const differences = budgets.map((budget) => {\n const currentAmount = budget.transaction_total\n const totalAmount = budget.amount\n return totalAmount - currentAmount\n })\n\n return differences.reduce((total, difference) => total + difference, 0)\n}\n\nexport const augmentBudgets = (\n budgets: Budget[],\n categories: DetailedCategory[],\n copy: BudgetsCopy,\n theme: Theme,\n): DetailedBudget[] => {\n const detailedBudgets = [] as DetailedBudget[]\n\n const childTotals = new Map<string, number>()\n for (const b of budgets) {\n if (b.parent_guid) {\n childTotals.set(b.parent_guid, (childTotals.get(b.parent_guid) ?? 0) + b.amount)\n }\n }\n\n // Top-level Categories\n for (const budget of budgets) {\n const category = findDetailedCategory(categories, budget.category_guid)\n if (!category) continue\n\n const amount = childTotals.get(budget.guid) ?? budget.amount\n const spent = category.totalAmount\n const percentage = getBudgetPercentage(amount, spent)\n const difference = amount - spent\n\n detailedBudgets.push({\n ...budget,\n amount,\n budgetColors: getBudgetColors(percentage, theme),\n category,\n description: buildDynamicCopy(\n difference < 0 ? copy.budget_remaining_over : copy.budget_remaining_left,\n formatCurrency(Math.abs(difference), '0,0'),\n ) as string,\n percentage,\n subBudgets: [],\n transaction_total: spent,\n })\n }\n\n // Sub categories\n for (const budget of budgets) {\n if (!budget.parent_guid) continue\n\n const category = findDetailedSubCategory(categories, budget.category_guid)\n if (!category) continue\n\n const parentBudget = detailedBudgets.find((b) => b.guid === budget.parent_guid)\n if (!parentBudget) continue\n\n const spent = category.currentAmount\n const difference = budget.amount - spent\n const percentage = getBudgetPercentage(budget.amount, spent)\n\n parentBudget.subBudgets.push({\n ...budget,\n budgetColors: getBudgetColors(percentage, theme),\n category,\n description: buildDynamicCopy(\n difference < 0 ? copy.budget_remaining_over : copy.budget_remaining_left,\n formatCurrency(Math.abs(difference), '0,0'),\n ) as string,\n percentage,\n subBudgets: [],\n transaction_total: spent,\n })\n }\n\n return detailedBudgets\n}\n\nexport const findBudget = (budgets: DetailedBudget[], guid: string): DetailedBudget | undefined => {\n return budgets.find((budget) => budget.guid === guid)\n}\n\nexport const findSubBudget = (\n budgets: DetailedBudget[],\n guid: string,\n parentGuid: string,\n): DetailedBudget | undefined => {\n const parent = findBudget(budgets, parentGuid)\n if (!parent) return undefined\n\n return findBudget(parent.subBudgets, guid)\n}\n\nexport const getRemainingAmountSpentPercentage = (totalTransaction: number, amount: number) => {\n const remainingAmount = Math.max(0, amount - totalTransaction)\n const spentPercentage = amount > 0 ? Math.min(100, (totalTransaction / amount) * 100) : 0\n\n let iconColor = 'success'\n if (spentPercentage >= 100) iconColor = 'error'\n else if (spentPercentage >= 50) iconColor = 'warning'\n\n return {\n remainingAmount,\n spentPercentage,\n iconColor,\n }\n}\n"],"mappings":"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"}
@@ -48,7 +48,7 @@ var U = (t) => {
48
48
  },
49
49
  children: [/* @__PURE__ */ i(F, { children: /* @__PURE__ */ i(k, {
50
50
  categoryGuid: t.categoryGuid,
51
- merchantGuid: t.merchantGuid
51
+ merchantGuid: t.merchantGuid || ""
52
52
  }) }), /* @__PURE__ */ i(j, { children: /* @__PURE__ */ o(s, {
53
53
  direction: "row",
54
54
  gap: 4,
@@ -1 +1 @@
1
- {"version":3,"file":"RecurrenceRow.es.js","names":[],"sources":["../../../src/recurringtransactions/components/RecurrenceRow.tsx"],"sourcesContent":["import React from 'react'\n\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport Stack from '@mui/material/Stack'\n\nimport { CheckCircle, Cancel } from '@mxenabled/mx-icons'\nimport { InstitutionLogo, MerchantLogo, Text } from '@mxenabled/mxui'\n\nimport { useGlobalCopyStore, useRecurringTransactionsStore } from '../../common'\nimport { DATE_FORMATS_INTL, formatDate } from '../../core/constants'\nimport {\n type Recurrence,\n type RecurringCopy,\n RecurrenceStatus,\n RecurrenceType,\n RepeatingTransaction,\n} from '../../core'\n\nimport { getFrequencyLabel } from '../../core/utils/RecurringTransactionsUtil'\n\nimport { IncomeBadge, MissedBadge, PaidBadge, UpcomingExpenseBadge } from './RecurrenceBadges'\nimport { formatCurrency } from '../../core/utils/NumberFormatting'\nimport { buildDynamicCopy } from '../../core/utils/Localization'\n\nconst getStatusIcon = (recurrence: Recurrence): React.ReactNode => {\n if (recurrence.type === RecurrenceType.Income) {\n return <IncomeBadge />\n }\n\n switch (recurrence.status) {\n case RecurrenceStatus.Missed:\n return <MissedBadge />\n case RecurrenceStatus.Paid:\n return <PaidBadge />\n default:\n return <UpcomingExpenseBadge />\n }\n}\n\nconst getStatus = (recurrence: Recurrence, copy: RecurringCopy): string => {\n switch (recurrence.status) {\n case RecurrenceStatus.Paid:\n return recurrence.expectedDate\n ? (buildDynamicCopy(\n copy.paid_on,\n formatDate(\n recurrence.occurredOnDate || recurrence.expectedDate,\n DATE_FORMATS_INTL.MONTH_DAY,\n ),\n ) as string)\n : copy.paid\n case RecurrenceStatus.Missed:\n return buildDynamicCopy(\n copy.missed_on,\n formatDate(recurrence.expectedDate, DATE_FORMATS_INTL.MONTH_DAY),\n ) as string\n case RecurrenceStatus.Upcoming:\n return buildDynamicCopy(\n copy.upcoming_on,\n formatDate(recurrence.expectedDate, DATE_FORMATS_INTL.MONTH_DAY),\n ) as string\n default:\n return copy.unknown\n }\n}\n\ninterface RecurrenceRowProps {\n recurrence: Recurrence\n isMini?: boolean\n onRecurrenceClick?: (recurrence: Recurrence) => void\n showOrdinal?: boolean\n}\n\nexport const RecurrenceRow = ({\n recurrence,\n isMini = false,\n onRecurrenceClick = () => {},\n showOrdinal = false,\n}: RecurrenceRowProps) => {\n const { recurring: copy } = useGlobalCopyStore()\n const { detailedRepeatingTransactions } = useRecurringTransactionsStore()\n\n const repeatingTransaction = React.useMemo(\n () =>\n detailedRepeatingTransactions.find((rt) => rt.guid === recurrence.repeatingTransactionGuid),\n [recurrence, detailedRepeatingTransactions],\n )\n\n const isCredit = recurrence.type === RecurrenceType.Income\n const isPaid = recurrence.status === RecurrenceStatus.Paid\n const isMissed = recurrence.status === RecurrenceStatus.Missed\n const isUpcoming = recurrence.status === RecurrenceStatus.Upcoming\n\n let statusLabel = copy.paid?.toLowerCase()\n if (isMissed) {\n statusLabel = copy.missed?.toLowerCase()\n } else if (isUpcoming) {\n statusLabel = showOrdinal\n ? getFrequencyLabel(copy, repeatingTransaction || ({} as RepeatingTransaction), true)\n : getFrequencyLabel(copy, repeatingTransaction || ({} as RepeatingTransaction), false)\n }\n\n const onItemClick = () => {\n onRecurrenceClick(recurrence)\n }\n\n return (\n //TODO: implement common/components/ListItemRow.tsx\n <ListItem disableGutters={true} disablePadding={true}>\n <ListItemButton onClick={onItemClick}>\n <ListItemAvatar>\n <MerchantLogo\n categoryGuid={recurrence.categoryGuid}\n merchantGuid={recurrence.merchantGuid}\n />\n </ListItemAvatar>\n <ListItemText>\n <Stack\n direction=\"row\"\n gap={4}\n sx={{ justifyContent: 'space-between', textOverflow: 'ellipsis', textWrap: 'nowrap' }}\n >\n <Stack direction=\"column\" width=\"50%\">\n <Text bold={true} variant=\"body1\">\n {recurrence.name}\n </Text>\n <Stack alignItems=\"center\" direction=\"row\" gap={6}>\n {isMini ? (\n <Stack direction=\"row\" gap={4}>\n {getStatusIcon(recurrence)}\n <Text variant=\"caption\">{getStatus(recurrence, copy)}</Text>\n </Stack>\n ) : (\n <>\n {recurrence.institutionGuid && (\n <InstitutionLogo\n alt=\"\"\n institutionGuid={recurrence.institutionGuid}\n size={12}\n />\n )}\n <Text sx={{ maxWidth: 250 }} variant=\"caption\">\n {recurrence.institutionName}\n </Text>\n </>\n )}\n </Stack>\n </Stack>\n\n <Stack alignItems=\"flex-end\" width=\"100%\">\n <Text bold={true} color={isCredit ? 'success.main' : 'text.primary'} variant=\"body1\">\n {isCredit ? '+' : ''}\n {formatCurrency(recurrence.amount, '0,0.00')}\n </Text>\n {!isMini && (\n <Stack\n direction=\"row\"\n sx={{\n alignItems: 'center',\n gap: 6,\n justifyContent: 'flex-end',\n textTransform: 'uppercase',\n width: '100%',\n }}\n >\n {isPaid && <CheckCircle color=\"success\" filled={true} size={12} />}\n {isMissed && <Cancel color=\"error\" filled={true} size={12} />}\n <Text bold={true} color=\"text.secondary\" variant=\"caption\">\n {statusLabel}\n </Text>\n </Stack>\n )}\n </Stack>\n </Stack>\n </ListItemText>\n </ListItemButton>\n </ListItem>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"RecurrenceRow.es.js","names":[],"sources":["../../../src/recurringtransactions/components/RecurrenceRow.tsx"],"sourcesContent":["import React from 'react'\n\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport Stack from '@mui/material/Stack'\n\nimport { CheckCircle, Cancel } from '@mxenabled/mx-icons'\nimport { InstitutionLogo, MerchantLogo, Text } from '@mxenabled/mxui'\n\nimport { useGlobalCopyStore, useRecurringTransactionsStore } from '../../common'\nimport { DATE_FORMATS_INTL, formatDate } from '../../core/constants'\nimport {\n type Recurrence,\n type RecurringCopy,\n RecurrenceStatus,\n RecurrenceType,\n RepeatingTransaction,\n} from '../../core'\n\nimport { getFrequencyLabel } from '../../core/utils/RecurringTransactionsUtil'\n\nimport { IncomeBadge, MissedBadge, PaidBadge, UpcomingExpenseBadge } from './RecurrenceBadges'\nimport { formatCurrency } from '../../core/utils/NumberFormatting'\nimport { buildDynamicCopy } from '../../core/utils/Localization'\n\nconst getStatusIcon = (recurrence: Recurrence): React.ReactNode => {\n if (recurrence.type === RecurrenceType.Income) {\n return <IncomeBadge />\n }\n\n switch (recurrence.status) {\n case RecurrenceStatus.Missed:\n return <MissedBadge />\n case RecurrenceStatus.Paid:\n return <PaidBadge />\n default:\n return <UpcomingExpenseBadge />\n }\n}\n\nconst getStatus = (recurrence: Recurrence, copy: RecurringCopy): string => {\n switch (recurrence.status) {\n case RecurrenceStatus.Paid:\n return recurrence.expectedDate\n ? (buildDynamicCopy(\n copy.paid_on,\n formatDate(\n recurrence.occurredOnDate || recurrence.expectedDate,\n DATE_FORMATS_INTL.MONTH_DAY,\n ),\n ) as string)\n : copy.paid\n case RecurrenceStatus.Missed:\n return buildDynamicCopy(\n copy.missed_on,\n formatDate(recurrence.expectedDate, DATE_FORMATS_INTL.MONTH_DAY),\n ) as string\n case RecurrenceStatus.Upcoming:\n return buildDynamicCopy(\n copy.upcoming_on,\n formatDate(recurrence.expectedDate, DATE_FORMATS_INTL.MONTH_DAY),\n ) as string\n default:\n return copy.unknown\n }\n}\n\ninterface RecurrenceRowProps {\n recurrence: Recurrence\n isMini?: boolean\n onRecurrenceClick?: (recurrence: Recurrence) => void\n showOrdinal?: boolean\n}\n\nexport const RecurrenceRow = ({\n recurrence,\n isMini = false,\n onRecurrenceClick = () => {},\n showOrdinal = false,\n}: RecurrenceRowProps) => {\n const { recurring: copy } = useGlobalCopyStore()\n const { detailedRepeatingTransactions } = useRecurringTransactionsStore()\n\n const repeatingTransaction = React.useMemo(\n () =>\n detailedRepeatingTransactions.find((rt) => rt.guid === recurrence.repeatingTransactionGuid),\n [recurrence, detailedRepeatingTransactions],\n )\n\n const isCredit = recurrence.type === RecurrenceType.Income\n const isPaid = recurrence.status === RecurrenceStatus.Paid\n const isMissed = recurrence.status === RecurrenceStatus.Missed\n const isUpcoming = recurrence.status === RecurrenceStatus.Upcoming\n\n let statusLabel = copy.paid?.toLowerCase()\n if (isMissed) {\n statusLabel = copy.missed?.toLowerCase()\n } else if (isUpcoming) {\n statusLabel = showOrdinal\n ? getFrequencyLabel(copy, repeatingTransaction || ({} as RepeatingTransaction), true)\n : getFrequencyLabel(copy, repeatingTransaction || ({} as RepeatingTransaction), false)\n }\n\n const onItemClick = () => {\n onRecurrenceClick(recurrence)\n }\n\n return (\n //TODO: implement common/components/ListItemRow.tsx\n <ListItem disableGutters={true} disablePadding={true}>\n <ListItemButton onClick={onItemClick}>\n <ListItemAvatar>\n <MerchantLogo\n categoryGuid={recurrence.categoryGuid}\n merchantGuid={recurrence.merchantGuid || ''}\n />\n </ListItemAvatar>\n <ListItemText>\n <Stack\n direction=\"row\"\n gap={4}\n sx={{ justifyContent: 'space-between', textOverflow: 'ellipsis', textWrap: 'nowrap' }}\n >\n <Stack direction=\"column\" width=\"50%\">\n <Text bold={true} variant=\"body1\">\n {recurrence.name}\n </Text>\n <Stack alignItems=\"center\" direction=\"row\" gap={6}>\n {isMini ? (\n <Stack direction=\"row\" gap={4}>\n {getStatusIcon(recurrence)}\n <Text variant=\"caption\">{getStatus(recurrence, copy)}</Text>\n </Stack>\n ) : (\n <>\n {recurrence.institutionGuid && (\n <InstitutionLogo\n alt=\"\"\n institutionGuid={recurrence.institutionGuid}\n size={12}\n />\n )}\n <Text sx={{ maxWidth: 250 }} variant=\"caption\">\n {recurrence.institutionName}\n </Text>\n </>\n )}\n </Stack>\n </Stack>\n\n <Stack alignItems=\"flex-end\" width=\"100%\">\n <Text bold={true} color={isCredit ? 'success.main' : 'text.primary'} variant=\"body1\">\n {isCredit ? '+' : ''}\n {formatCurrency(recurrence.amount, '0,0.00')}\n </Text>\n {!isMini && (\n <Stack\n direction=\"row\"\n sx={{\n alignItems: 'center',\n gap: 6,\n justifyContent: 'flex-end',\n textTransform: 'uppercase',\n width: '100%',\n }}\n >\n {isPaid && <CheckCircle color=\"success\" filled={true} size={12} />}\n {isMissed && <Cancel color=\"error\" filled={true} size={12} />}\n <Text bold={true} color=\"text.secondary\" variant=\"caption\">\n {statusLabel}\n </Text>\n </Stack>\n )}\n </Stack>\n </Stack>\n </ListItemText>\n </ListItemButton>\n </ListItem>\n )\n}\n"],"mappings":"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"}
@@ -70,7 +70,7 @@ var ie = Dt(({ onDeleted: M, recurringTransaction: e, selectedRecurrence: i }) =
70
70
  children: [
71
71
  /* @__PURE__ */ t(yt, {
72
72
  categoryGuid: s?.category_guid || "",
73
- merchantGuid: F,
73
+ merchantGuid: F || "",
74
74
  size: 64,
75
75
  sx: { mb: 12 }
76
76
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"RecurringTransactionDetails.es.js","names":[],"sources":["../../../src/recurringtransactions/components/RecurringTransactionDetails.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { subDays } from 'date-fns/subDays'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { endOfMonth } from 'date-fns/endOfMonth'\n\nimport Button from '@mui/material/Button'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport Stack from '@mui/material/Stack'\n\nimport { Delete } from '@mxenabled/mx-icons'\n\nimport { MerchantLogo, P, Text } from '@mxenabled/mxui'\n\nimport {\n ANALYTICS_EVENTS,\n DataRow,\n Dialog,\n Drawer,\n useAccountStore,\n useEvent,\n useGlobalCopyStore,\n useGlobalUiStore,\n useRecurringTransactionsStore,\n useTransactionStore,\n} from '../../common'\nimport {\n type Member,\n type Recurrence,\n type RepeatingTransaction,\n type Transaction,\n RecurrenceStatus,\n RepeatingType,\n} from '../../core'\n\nimport { TransactionDetails } from '../../transactions'\nimport { AccountDetailsDrawer, useAccountUiStore } from '../../accounts'\n\nimport { formatCurrency } from '../../core/utils/NumberFormatting'\nimport { getNextUpcomingDate } from '../../core/utils/RecurringTransactionsUtil'\nimport { LinkTransactionDrawer } from './actions/LinkTransactionDrawer'\nimport { MarkAsPaidDialog } from './actions/MarkAsPaidDialog'\nimport { MarkAsUnpaidDialog } from './actions/MarkAsUnpaidDialog'\nimport { PaymentScheduleAction } from './actions/PaymentScheduleAction'\nimport { RecurringTransactionList } from './RecurringTransactionList'\nimport { UpcomingRecurrenceCard } from './UpcomingRecurrenceCard'\n\ninterface RecurringTransactionDetailsProps {\n onDeleted: () => void\n recurringTransaction: RepeatingTransaction\n selectedRecurrence: Recurrence | null\n}\n\nexport const RecurringTransactionDetails = observer(\n ({ onDeleted, recurringTransaction, selectedRecurrence }: RecurringTransactionDetailsProps) => {\n const { recurring: copy } = useGlobalCopyStore()\n const { selectedAccountGuids } = useGlobalUiStore()\n const { onEvent } = useEvent()\n const { deleteRepeatingTransaction, markRecurrenceAsUnpaid, recurrences } =\n useRecurringTransactionsStore()\n const { detailedTransactions, setFilter, transactions } = useTransactionStore()\n const { setSelectedAccount, setSelectedMember } = useAccountUiStore()\n const { members } = useAccountStore()\n const { amount, description, merchant_guid } = recurringTransaction\n\n const [showAccountDetails, setShowAccountDetails] = React.useState(false)\n const [showDeleteConfirm, setShowDeleteConfirm] = React.useState(false)\n const [showMarkAsPaid, setShowMarkAsPaid] = React.useState(false)\n const [showMarkAsUnpaid, setShowMarkAsUnpaid] = React.useState(false)\n const [unlinkTransactionGuid, setUnlinkTransactionGuid] = React.useState('')\n const [showLinkTransaction, setShowLinkTransaction] = React.useState(false)\n const [transactionGuid, setTransactionGuid] = React.useState('')\n\n React.useEffect(() => {\n setFilter({\n accounts: selectedAccountGuids,\n dateRange: { start: subDays(startOfToday(), 90), end: endOfMonth(startOfToday()) },\n custom: (t: Transaction) => t.repeating_transaction_guid === recurringTransaction.guid,\n })\n }, [recurringTransaction.guid])\n\n const transaction = React.useMemo(\n () => detailedTransactions.find((t) => t.guid === transactionGuid),\n [transactionGuid, detailedTransactions],\n )\n\n const isIncome = recurringTransaction.repeating_transaction_type === RepeatingType.Income\n\n const filteredTransactions = React.useMemo(\n () => transactions.filter((t) => t.repeating_transaction_guid === recurringTransaction.guid),\n [transactions, recurringTransaction.guid],\n )\n\n const nextUpcomingDate = getNextUpcomingDate(recurringTransaction, recurrences)\n\n const handleAccountClick = () => {\n if (recurringTransaction.account) {\n setSelectedAccount(recurringTransaction.account)\n const member =\n members.find((m: Member) => m.guid === recurringTransaction.account?.member_guid) ||\n ({} as Member)\n if (member) {\n setSelectedMember(member)\n }\n setShowAccountDetails(true)\n }\n }\n\n const handleDeleteRecurringTransaction = async () => {\n await deleteRepeatingTransaction(recurringTransaction.guid)\n onDeleted()\n }\n\n const handleDeleteButtonClick = () => {\n setShowDeleteConfirm(true)\n\n onEvent(ANALYTICS_EVENTS.RECURRING_TRANSACTIONS_DETAILS_CLICK_DELETE)\n }\n\n const handleMarkAsPaidClick = () => {\n setShowMarkAsPaid(true)\n onEvent(ANALYTICS_EVENTS.RECURRING_TRANSACTIONS_LIST_CLICK_MARK_AS_PAID)\n }\n\n const handleLinkTransaction = () => {\n setShowMarkAsPaid(false)\n setShowLinkTransaction(true)\n }\n\n const handleMarkAsUnpaidClick = (transactionGuid: string) => {\n setUnlinkTransactionGuid(transactionGuid)\n setShowMarkAsUnpaid(true)\n onEvent(ANALYTICS_EVENTS.RECURRING_TRANSACTIONS_LIST_CLICK_MARK_AS_UNPAID)\n }\n\n const handleUnlinkTransaction = async () => {\n const txn = transactions.find((t) => t.guid === unlinkTransactionGuid)\n if (txn) await markRecurrenceAsUnpaid(txn)\n\n setShowMarkAsUnpaid(false)\n setUnlinkTransactionGuid('')\n }\n\n return (\n <Stack bgcolor=\"background.default\" direction=\"column\" height=\"100%\">\n <Stack direction=\"column\" m={24}>\n <MerchantLogo\n categoryGuid={transaction?.category_guid || ''}\n merchantGuid={merchant_guid}\n size={64}\n sx={{ mb: 12 }}\n />\n <Text bold={true} variant=\"body1\">\n {description}\n </Text>\n <P color={isIncome ? 'success.main' : 'text.primary'} sx={{ mt: 4, mb: 16 }} variant=\"h1\">\n {isIncome ? '+' : ''}\n {formatCurrency(amount, '0,0.00')}\n </P>\n <UpcomingRecurrenceCard\n expectedDate={\n selectedRecurrence?.occurredOnDate ||\n selectedRecurrence?.expectedDate ||\n nextUpcomingDate\n }\n onMarkAsPaidClick={\n selectedRecurrence?.status === RecurrenceStatus.Paid &&\n selectedRecurrence.transaction?.guid\n ? () => handleMarkAsUnpaidClick(selectedRecurrence.transaction!.guid)\n : handleMarkAsPaidClick\n }\n status={selectedRecurrence?.status}\n />\n </Stack>\n <List sx={{ bgcolor: 'background.paper' }}>\n {recurringTransaction.account && (\n <>\n <DataRow\n iconName=\"checkbook\"\n label={copy.account}\n onClick={handleAccountClick}\n showChevron={false}\n value={recurringTransaction.account.displayName || ''}\n />\n <Divider variant=\"inset\" />\n </>\n )}\n\n {transaction?.category && (\n <>\n <DataRow\n iconName=\"monetization_on\"\n label={copy.category}\n value={transaction.category}\n />\n <Divider variant=\"inset\" />\n </>\n )}\n\n <PaymentScheduleAction repeatingTransaction={recurringTransaction} />\n <Divider />\n </List>\n\n <Button\n color=\"error\"\n onClick={handleDeleteButtonClick}\n startIcon={<Delete />}\n sx={{ mx: 24, my: 16 }}\n variant=\"text\"\n >\n {isIncome ? copy.delete_income_title : copy.delete_expense_title}\n </Button>\n\n <RecurringTransactionList\n isIncome={isIncome}\n onMarkAsPaidClick={handleMarkAsPaidClick}\n onMarkAsUnpaidClick={handleMarkAsUnpaidClick}\n onTransactionClick={setTransactionGuid}\n recurringTransaction={recurringTransaction}\n transactions={filteredTransactions}\n />\n\n <Drawer\n ariaLabelClose={copy.close_drawer_aria}\n isOpen={!!transactionGuid && Boolean(transaction)}\n onClose={() => setTransactionGuid('')}\n title={copy.transaction_details_drawer_title}\n >\n {transaction && <TransactionDetails transaction={transaction} />}\n </Drawer>\n\n <Dialog\n copy={{\n title: isIncome ? copy.delete_income_title : copy.delete_expense_title,\n close_aria: copy.close_drawer_aria,\n }}\n isOpen={showDeleteConfirm}\n onClose={() => setShowDeleteConfirm(false)}\n onPrimaryAction={handleDeleteRecurringTransaction}\n >\n <Text>{isIncome ? copy.delete_income_description : copy.delete_expense_description}</Text>\n </Dialog>\n\n <MarkAsPaidDialog\n isOpen={showMarkAsPaid}\n onClose={() => setShowMarkAsPaid(false)}\n onLinkTransaction={handleLinkTransaction}\n />\n\n <MarkAsUnpaidDialog\n isOpen={showMarkAsUnpaid}\n onClose={() => {\n setShowMarkAsUnpaid(false)\n setUnlinkTransactionGuid('')\n }}\n onUnlinkTransaction={handleUnlinkTransaction}\n />\n\n <LinkTransactionDrawer\n isOpen={showLinkTransaction}\n onClose={() => setShowLinkTransaction(false)}\n recurringTransaction={recurringTransaction}\n />\n\n <AccountDetailsDrawer\n isOpen={showAccountDetails}\n onClose={() => setShowAccountDetails(false)}\n />\n </Stack>\n )\n },\n)\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsDA,IAAa,KAA8B,GAAA,CACxC,EAAE,WAAA,GAAW,sBAAA,GAAsB,oBAAA,EAAA,MAA2D;AAC7F,QAAM,EAAE,WAAW,EAAA,IAAS,GAAmB,GACzC,EAAE,sBAAA,EAAA,IAAyB,GAAiB,GAC5C,EAAE,SAAA,EAAA,IAAY,GAAS,GACvB,EAAE,4BAAA,GAA4B,wBAAA,GAAwB,aAAA,EAAA,IAC1D,GAA8B,GAC1B,EAAE,sBAAA,GAAsB,WAAA,GAAW,cAAA,EAAA,IAAiB,GAAoB,GACxE,EAAE,oBAAA,GAAoB,mBAAA,EAAA,IAAsB,GAAkB,GAC9D,EAAE,SAAA,EAAA,IAAY,GAAgB,GAC9B,EAAE,QAAA,GAAQ,aAAA,GAAa,eAAA,EAAA,IAAkB,GAEzC,CAAC,GAAoB,CAAA,IAAyB,EAAM,SAAS,EAAK,GAClE,CAAC,GAAmB,CAAA,IAAwB,EAAM,SAAS,EAAK,GAChE,CAAC,GAAgB,CAAA,IAAqB,EAAM,SAAS,EAAK,GAC1D,CAAC,GAAkB,CAAA,IAAuB,EAAM,SAAS,EAAK,GAC9D,CAAC,GAAuB,CAAA,IAA4B,EAAM,SAAS,EAAE,GACrE,CAAC,GAAqB,CAAA,IAA0B,EAAM,SAAS,EAAK,GACpE,CAAC,GAAiB,CAAA,IAAsB,EAAM,SAAS,EAAE;AAE/D,EAAA,EAAM,UAAA,MAAgB;AACpB,IAAA,EAAU;AAAA,MACR,UAAU;AAAA,MACV,WAAW;AAAA,QAAE,OAAO,GAAQ,EAAa,GAAG,EAAE;AAAA,QAAG,KAAK,GAAW,EAAa,CAAC;AAAA,MAAE;AAAA,MACjF,QAAA,CAAS,MAAmB,EAAE,+BAA+B,EAAqB;AAAA,IACpF,CAAC;AAAA,EACH,GAAG,CAAC,EAAqB,IAAI,CAAC;AAE9B,QAAM,IAAc,EAAM,QAAA,MAClB,EAAqB,KAAA,CAAM,MAAM,EAAE,SAAS,CAAe,GACjE,CAAC,GAAiB,CAAoB,CACxC,GAEM,IAAW,EAAqB,+BAA+B,GAAc,QAE7E,IAAuB,EAAM,QAAA,MAC3B,EAAa,OAAA,CAAQ,MAAM,EAAE,+BAA+B,EAAqB,IAAI,GAC3F,CAAC,GAAc,EAAqB,IAAI,CAC1C,GAEM,IAAmB,GAAoB,GAAsB,CAAW,GAExE,IAAA,MAA2B;AAC/B,QAAI,EAAqB,SAAS;AAChC,MAAA,EAAmB,EAAqB,OAAO;AAC/C,YAAM,IACJ,EAAQ,KAAA,CAAM,MAAc,EAAE,SAAS,EAAqB,SAAS,WAAW,KAC/E,CAAC;AACJ,MAAI,KACF,EAAkB,CAAM,GAE1B,EAAsB,EAAI;AAAA,IAC5B;AAAA,EACF,GAEM,IAAmC,YAAY;AACnD,UAAM,EAA2B,EAAqB,IAAI,GAC1D,EAAU;AAAA,EACZ,GAEM,IAAA,MAAgC;AACpC,IAAA,EAAqB,EAAI,GAEzB,EAAQ,EAAiB,2CAA2C;AAAA,EACtE,GAEM,IAAA,MAA8B;AAClC,IAAA,EAAkB,EAAI,GACtB,EAAQ,EAAiB,8CAA8C;AAAA,EACzE,GAEM,IAAA,MAA8B;AAClC,IAAA,EAAkB,EAAK,GACvB,EAAuB,EAAI;AAAA,EAC7B,GAEM,IAAA,CAA2B,MAA4B;AAC3D,IAAA,EAAyB,CAAe,GACxC,EAAoB,EAAI,GACxB,EAAQ,EAAiB,gDAAgD;AAAA,EAC3E,GAEM,KAA0B,YAAY;AAC1C,UAAM,IAAM,EAAa,KAAA,CAAM,MAAM,EAAE,SAAS,CAAqB;AACrE,IAAI,KAAK,MAAM,EAAuB,CAAG,GAEzC,EAAoB,EAAK,GACzB,EAAyB,EAAE;AAAA,EAC7B;AAEA,SACE,gBAAA,EAAC,GAAD;AAAA,IAAO,SAAQ;AAAA,IAAqB,WAAU;AAAA,IAAS,QAAO;AAAA,IAA9D,UAAA;AAAA,MACE,gBAAA,EAAC,GAAD;AAAA,QAAO,WAAU;AAAA,QAAS,GAAG;AAAA,QAA7B,UAAA;AAAA,UACE,gBAAA,EAAC,IAAD;AAAA,YACE,cAAc,GAAa,iBAAiB;AAAA,YAC5C,cAAc;AAAA,YACd,MAAM;AAAA,YACN,IAAI,EAAE,IAAI,GAAG;AAAA,UACd,CAAA;AAAA,UACD,gBAAA,EAAC,GAAD;AAAA,YAAM,MAAM;AAAA,YAAM,SAAQ;AAAA,YACvB,UAAA;AAAA,UACG,CAAA;AAAA,UACN,gBAAA,EAAC,IAAD;AAAA,YAAG,OAAO,IAAW,iBAAiB;AAAA,YAAgB,IAAI;AAAA,cAAE,IAAI;AAAA,cAAG,IAAI;AAAA,YAAG;AAAA,YAAG,SAAQ;AAAA,YAArF,UAAA,CACG,IAAW,MAAM,IACjB,GAAe,GAAQ,QAAQ,CAC/B;AAAA;UACH,gBAAA,EAAC,IAAD;AAAA,YACE,cACE,GAAoB,kBACpB,GAAoB,gBACpB;AAAA,YAEF,mBACE,GAAoB,WAAW,GAAiB,QAChD,EAAmB,aAAa,OAAA,MACtB,EAAwB,EAAmB,YAAa,IAAI,IAClE;AAAA,YAEN,QAAQ,GAAoB;AAAA,UAC7B,CAAA;AAAA,QACI;AAAA;MACP,gBAAA,EAAC,IAAD;AAAA,QAAM,IAAI,EAAE,SAAS,mBAAmB;AAAA,QAAxC,UAAA;AAAA,UACG,EAAqB,WACpB,gBAAA,EAAA,GAAA,EAAA,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,YACE,UAAS;AAAA,YACT,OAAO,EAAK;AAAA,YACZ,SAAS;AAAA,YACT,aAAa;AAAA,YACb,OAAO,EAAqB,QAAQ,eAAe;AAAA,UACpD,CAAA,GACD,gBAAA,EAAC,GAAD,EAAS,SAAQ,QAAS,CAAA,CAC1B,EAAA,CAAA;AAAA,UAGH,GAAa,YACZ,gBAAA,EAAA,GAAA,EAAA,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,YACE,UAAS;AAAA,YACT,OAAO,EAAK;AAAA,YACZ,OAAO,EAAY;AAAA,UACpB,CAAA,GACD,gBAAA,EAAC,GAAD,EAAS,SAAQ,QAAS,CAAA,CAC1B,EAAA,CAAA;AAAA,UAGJ,gBAAA,EAAC,IAAD,EAAuB,sBAAsB,EAAuB,CAAA;AAAA,UACpE,gBAAA,EAAC,GAAD,CAAU,CAAA;AAAA,QACN;AAAA;MAEN,gBAAA,EAAC,IAAD;AAAA,QACE,OAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW,gBAAA,EAAC,IAAD,CAAS,CAAA;AAAA,QACpB,IAAI;AAAA,UAAE,IAAI;AAAA,UAAI,IAAI;AAAA,QAAG;AAAA,QACrB,SAAQ;AAAA,QAEP,UAAA,IAAW,EAAK,sBAAsB,EAAK;AAAA,MACtC,CAAA;AAAA,MAER,gBAAA,EAAC,IAAD;AAAA,QACY,UAAA;AAAA,QACV,mBAAmB;AAAA,QACnB,qBAAqB;AAAA,QACrB,oBAAoB;AAAA,QACE,sBAAA;AAAA,QACtB,cAAc;AAAA,MACf,CAAA;AAAA,MAED,gBAAA,EAAC,IAAD;AAAA,QACE,gBAAgB,EAAK;AAAA,QACrB,QAAQ,CAAC,CAAC,KAAmB,EAAQ;AAAA,QACrC,SAAA,MAAe,EAAmB,EAAE;AAAA,QACpC,OAAO,EAAK;AAAA,QAEX,UAAA,KAAe,gBAAA,EAAC,IAAD,EAAiC,aAAA,EAAc,CAAA;AAAA,MACzD,CAAA;AAAA,MAER,gBAAA,EAAC,IAAD;AAAA,QACE,MAAM;AAAA,UACJ,OAAO,IAAW,EAAK,sBAAsB,EAAK;AAAA,UAClD,YAAY,EAAK;AAAA,QACnB;AAAA,QACA,QAAQ;AAAA,QACR,SAAA,MAAe,EAAqB,EAAK;AAAA,QACzC,iBAAiB;AAAA,QAEjB,UAAA,gBAAA,EAAC,GAAD,EAAA,UAAO,IAAW,EAAK,4BAA4B,EAAK,2BAAiC,CAAA;AAAA,MACnF,CAAA;AAAA,MAER,gBAAA,EAAC,IAAD;AAAA,QACE,QAAQ;AAAA,QACR,SAAA,MAAe,EAAkB,EAAK;AAAA,QACtC,mBAAmB;AAAA,MACpB,CAAA;AAAA,MAED,gBAAA,EAAC,IAAD;AAAA,QACE,QAAQ;AAAA,QACR,SAAA,MAAe;AACb,UAAA,EAAoB,EAAK,GACzB,EAAyB,EAAE;AAAA,QAC7B;AAAA,QACA,qBAAqB;AAAA,MACtB,CAAA;AAAA,MAED,gBAAA,EAAC,IAAD;AAAA,QACE,QAAQ;AAAA,QACR,SAAA,MAAe,EAAuB,EAAK;AAAA,QACrB,sBAAA;AAAA,MACvB,CAAA;AAAA,MAED,gBAAA,EAAC,IAAD;AAAA,QACE,QAAQ;AAAA,QACR,SAAA,MAAe,EAAsB,EAAK;AAAA,MAC3C,CAAA;AAAA,IACI;AAAA;AAEX,CACF"}
1
+ {"version":3,"file":"RecurringTransactionDetails.es.js","names":[],"sources":["../../../src/recurringtransactions/components/RecurringTransactionDetails.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { subDays } from 'date-fns/subDays'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { endOfMonth } from 'date-fns/endOfMonth'\n\nimport Button from '@mui/material/Button'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport Stack from '@mui/material/Stack'\n\nimport { Delete } from '@mxenabled/mx-icons'\n\nimport { MerchantLogo, P, Text } from '@mxenabled/mxui'\n\nimport {\n ANALYTICS_EVENTS,\n DataRow,\n Dialog,\n Drawer,\n useAccountStore,\n useEvent,\n useGlobalCopyStore,\n useGlobalUiStore,\n useRecurringTransactionsStore,\n useTransactionStore,\n} from '../../common'\nimport {\n type Member,\n type Recurrence,\n type RepeatingTransaction,\n type Transaction,\n RecurrenceStatus,\n RepeatingType,\n} from '../../core'\n\nimport { TransactionDetails } from '../../transactions'\nimport { AccountDetailsDrawer, useAccountUiStore } from '../../accounts'\n\nimport { formatCurrency } from '../../core/utils/NumberFormatting'\nimport { getNextUpcomingDate } from '../../core/utils/RecurringTransactionsUtil'\nimport { LinkTransactionDrawer } from './actions/LinkTransactionDrawer'\nimport { MarkAsPaidDialog } from './actions/MarkAsPaidDialog'\nimport { MarkAsUnpaidDialog } from './actions/MarkAsUnpaidDialog'\nimport { PaymentScheduleAction } from './actions/PaymentScheduleAction'\nimport { RecurringTransactionList } from './RecurringTransactionList'\nimport { UpcomingRecurrenceCard } from './UpcomingRecurrenceCard'\n\ninterface RecurringTransactionDetailsProps {\n onDeleted: () => void\n recurringTransaction: RepeatingTransaction\n selectedRecurrence: Recurrence | null\n}\n\nexport const RecurringTransactionDetails = observer(\n ({ onDeleted, recurringTransaction, selectedRecurrence }: RecurringTransactionDetailsProps) => {\n const { recurring: copy } = useGlobalCopyStore()\n const { selectedAccountGuids } = useGlobalUiStore()\n const { onEvent } = useEvent()\n const { deleteRepeatingTransaction, markRecurrenceAsUnpaid, recurrences } =\n useRecurringTransactionsStore()\n const { detailedTransactions, setFilter, transactions } = useTransactionStore()\n const { setSelectedAccount, setSelectedMember } = useAccountUiStore()\n const { members } = useAccountStore()\n const { amount, description, merchant_guid } = recurringTransaction\n\n const [showAccountDetails, setShowAccountDetails] = React.useState(false)\n const [showDeleteConfirm, setShowDeleteConfirm] = React.useState(false)\n const [showMarkAsPaid, setShowMarkAsPaid] = React.useState(false)\n const [showMarkAsUnpaid, setShowMarkAsUnpaid] = React.useState(false)\n const [unlinkTransactionGuid, setUnlinkTransactionGuid] = React.useState('')\n const [showLinkTransaction, setShowLinkTransaction] = React.useState(false)\n const [transactionGuid, setTransactionGuid] = React.useState('')\n\n React.useEffect(() => {\n setFilter({\n accounts: selectedAccountGuids,\n dateRange: { start: subDays(startOfToday(), 90), end: endOfMonth(startOfToday()) },\n custom: (t: Transaction) => t.repeating_transaction_guid === recurringTransaction.guid,\n })\n }, [recurringTransaction.guid])\n\n const transaction = React.useMemo(\n () => detailedTransactions.find((t) => t.guid === transactionGuid),\n [transactionGuid, detailedTransactions],\n )\n\n const isIncome = recurringTransaction.repeating_transaction_type === RepeatingType.Income\n\n const filteredTransactions = React.useMemo(\n () => transactions.filter((t) => t.repeating_transaction_guid === recurringTransaction.guid),\n [transactions, recurringTransaction.guid],\n )\n\n const nextUpcomingDate = getNextUpcomingDate(recurringTransaction, recurrences)\n\n const handleAccountClick = () => {\n if (recurringTransaction.account) {\n setSelectedAccount(recurringTransaction.account)\n const member =\n members.find((m: Member) => m.guid === recurringTransaction.account?.member_guid) ||\n ({} as Member)\n if (member) {\n setSelectedMember(member)\n }\n setShowAccountDetails(true)\n }\n }\n\n const handleDeleteRecurringTransaction = async () => {\n await deleteRepeatingTransaction(recurringTransaction.guid)\n onDeleted()\n }\n\n const handleDeleteButtonClick = () => {\n setShowDeleteConfirm(true)\n\n onEvent(ANALYTICS_EVENTS.RECURRING_TRANSACTIONS_DETAILS_CLICK_DELETE)\n }\n\n const handleMarkAsPaidClick = () => {\n setShowMarkAsPaid(true)\n onEvent(ANALYTICS_EVENTS.RECURRING_TRANSACTIONS_LIST_CLICK_MARK_AS_PAID)\n }\n\n const handleLinkTransaction = () => {\n setShowMarkAsPaid(false)\n setShowLinkTransaction(true)\n }\n\n const handleMarkAsUnpaidClick = (transactionGuid: string) => {\n setUnlinkTransactionGuid(transactionGuid)\n setShowMarkAsUnpaid(true)\n onEvent(ANALYTICS_EVENTS.RECURRING_TRANSACTIONS_LIST_CLICK_MARK_AS_UNPAID)\n }\n\n const handleUnlinkTransaction = async () => {\n const txn = transactions.find((t) => t.guid === unlinkTransactionGuid)\n if (txn) await markRecurrenceAsUnpaid(txn)\n\n setShowMarkAsUnpaid(false)\n setUnlinkTransactionGuid('')\n }\n\n return (\n <Stack bgcolor=\"background.default\" direction=\"column\" height=\"100%\">\n <Stack direction=\"column\" m={24}>\n <MerchantLogo\n categoryGuid={transaction?.category_guid || ''}\n merchantGuid={merchant_guid || ''}\n size={64}\n sx={{ mb: 12 }}\n />\n <Text bold={true} variant=\"body1\">\n {description}\n </Text>\n <P color={isIncome ? 'success.main' : 'text.primary'} sx={{ mt: 4, mb: 16 }} variant=\"h1\">\n {isIncome ? '+' : ''}\n {formatCurrency(amount, '0,0.00')}\n </P>\n <UpcomingRecurrenceCard\n expectedDate={\n selectedRecurrence?.occurredOnDate ||\n selectedRecurrence?.expectedDate ||\n nextUpcomingDate\n }\n onMarkAsPaidClick={\n selectedRecurrence?.status === RecurrenceStatus.Paid &&\n selectedRecurrence.transaction?.guid\n ? () => handleMarkAsUnpaidClick(selectedRecurrence.transaction!.guid)\n : handleMarkAsPaidClick\n }\n status={selectedRecurrence?.status}\n />\n </Stack>\n <List sx={{ bgcolor: 'background.paper' }}>\n {recurringTransaction.account && (\n <>\n <DataRow\n iconName=\"checkbook\"\n label={copy.account}\n onClick={handleAccountClick}\n showChevron={false}\n value={recurringTransaction.account.displayName || ''}\n />\n <Divider variant=\"inset\" />\n </>\n )}\n\n {transaction?.category && (\n <>\n <DataRow\n iconName=\"monetization_on\"\n label={copy.category}\n value={transaction.category}\n />\n <Divider variant=\"inset\" />\n </>\n )}\n\n <PaymentScheduleAction repeatingTransaction={recurringTransaction} />\n <Divider />\n </List>\n\n <Button\n color=\"error\"\n onClick={handleDeleteButtonClick}\n startIcon={<Delete />}\n sx={{ mx: 24, my: 16 }}\n variant=\"text\"\n >\n {isIncome ? copy.delete_income_title : copy.delete_expense_title}\n </Button>\n\n <RecurringTransactionList\n isIncome={isIncome}\n onMarkAsPaidClick={handleMarkAsPaidClick}\n onMarkAsUnpaidClick={handleMarkAsUnpaidClick}\n onTransactionClick={setTransactionGuid}\n recurringTransaction={recurringTransaction}\n transactions={filteredTransactions}\n />\n\n <Drawer\n ariaLabelClose={copy.close_drawer_aria}\n isOpen={!!transactionGuid && Boolean(transaction)}\n onClose={() => setTransactionGuid('')}\n title={copy.transaction_details_drawer_title}\n >\n {transaction && <TransactionDetails transaction={transaction} />}\n </Drawer>\n\n <Dialog\n copy={{\n title: isIncome ? copy.delete_income_title : copy.delete_expense_title,\n close_aria: copy.close_drawer_aria,\n }}\n isOpen={showDeleteConfirm}\n onClose={() => setShowDeleteConfirm(false)}\n onPrimaryAction={handleDeleteRecurringTransaction}\n >\n <Text>{isIncome ? copy.delete_income_description : copy.delete_expense_description}</Text>\n </Dialog>\n\n <MarkAsPaidDialog\n isOpen={showMarkAsPaid}\n onClose={() => setShowMarkAsPaid(false)}\n onLinkTransaction={handleLinkTransaction}\n />\n\n <MarkAsUnpaidDialog\n isOpen={showMarkAsUnpaid}\n onClose={() => {\n setShowMarkAsUnpaid(false)\n setUnlinkTransactionGuid('')\n }}\n onUnlinkTransaction={handleUnlinkTransaction}\n />\n\n <LinkTransactionDrawer\n isOpen={showLinkTransaction}\n onClose={() => setShowLinkTransaction(false)}\n recurringTransaction={recurringTransaction}\n />\n\n <AccountDetailsDrawer\n isOpen={showAccountDetails}\n onClose={() => setShowAccountDetails(false)}\n />\n </Stack>\n )\n },\n)\n"],"mappings":"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"}
@@ -34,7 +34,7 @@ var X = (d, u) => {
34
34
  name: e.name,
35
35
  amount: e.amount,
36
36
  date: W(e.expectedDate),
37
- merchantGuid: e.merchantGuid,
37
+ merchantGuid: e.merchantGuid || "",
38
38
  categoryGuid: e.categoryGuid,
39
39
  category: "",
40
40
  status: o.Missed
@@ -1 +1 @@
1
- {"version":3,"file":"RecurringTransactionList.es.js","names":[],"sources":["../../../src/recurringtransactions/components/RecurringTransactionList.tsx"],"sourcesContent":["import React from 'react'\n\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { getUnixTime } from 'date-fns/getUnixTime'\n\nimport Divider from '@mui/material/Divider'\nimport IconButton from '@mui/material/IconButton'\nimport List from '@mui/material/List'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemText from '@mui/material/ListItemText'\nimport Menu from '@mui/material/Menu'\nimport MenuItem from '@mui/material/MenuItem'\nimport Stack from '@mui/material/Stack'\n\nimport { Cancel, CheckCircle, Icon } from '@mxenabled/mx-icons'\nimport { MerchantLogo, Text } from '@mxenabled/mxui'\n\nimport {\n ANALYTICS_EVENTS,\n formatCurrency,\n ListItemWrapper,\n useEvent,\n useGlobalCopyStore,\n useRecurringTransactionsStore,\n} from '../../common'\nimport { DATE_FORMATS_INTL, formatDate } from '../../core/constants'\n\nimport {\n type Recurrence,\n type Transaction,\n RecurrenceStatus,\n RepeatingTransaction,\n} from '../../core'\n\ntype RecurringTransactionRow = {\n key: string\n name: string\n amount: number\n date: number\n merchantGuid: string\n categoryGuid: string\n category: string\n status: RecurrenceStatus.Paid | RecurrenceStatus.Missed\n transactionGuid?: string\n}\n\nconst buildRows = (\n transactions: Transaction[],\n missedRecurrences: Recurrence[],\n): RecurringTransactionRow[] => {\n const paidRows: RecurringTransactionRow[] = transactions.map((t) => ({\n key: t.guid,\n name: t.payee || t.description || t.feed_description,\n amount: t.amount,\n date: t.date,\n merchantGuid: t.merchant_guid || '',\n categoryGuid: t.top_level_category_guid || '',\n category: t.category || '',\n status: RecurrenceStatus.Paid,\n transactionGuid: t.guid,\n }))\n\n const missedRows: RecurringTransactionRow[] = missedRecurrences.map((r) => ({\n key: `missed-${r.expectedDate.getTime()}`,\n name: r.name,\n amount: r.amount,\n date: getUnixTime(r.expectedDate),\n merchantGuid: r.merchantGuid,\n categoryGuid: r.categoryGuid,\n category: '',\n status: RecurrenceStatus.Missed,\n }))\n\n return [...paidRows, ...missedRows].sort((a, b) => b.date - a.date)\n}\n\ninterface RecurringTransactionListProps {\n isIncome?: boolean\n onMarkAsPaidClick: () => void\n onMarkAsUnpaidClick: (transactionGuid: string) => void\n onTransactionClick: (guid: string) => void\n recurringTransaction: RepeatingTransaction\n transactions: Transaction[]\n}\n\nexport const RecurringTransactionList = ({\n isIncome = false,\n onMarkAsUnpaidClick,\n onMarkAsPaidClick,\n onTransactionClick,\n recurringTransaction,\n transactions,\n}: RecurringTransactionListProps) => {\n const { recurring: copy } = useGlobalCopyStore()\n const { onEvent } = useEvent()\n const { recurrences } = useRecurringTransactionsStore()\n\n const [menuAnchorEl, setMenuAnchorEl] = React.useState<HTMLElement | null>(null)\n const [menuRow, setMenuRow] = React.useState<RecurringTransactionRow | null>(null)\n\n const missedRecurrences = React.useMemo(\n () =>\n recurrences.filter(\n (r) =>\n r.repeatingTransactionGuid === recurringTransaction.guid &&\n r.status === RecurrenceStatus.Missed,\n ),\n [recurrences, recurringTransaction.guid],\n )\n\n const rows = React.useMemo(\n () => buildRows(transactions, missedRecurrences),\n [transactions, missedRecurrences],\n )\n\n const handleClick = (row: RecurringTransactionRow) => {\n if (row.transactionGuid) {\n onTransactionClick(row.transactionGuid)\n }\n }\n\n const handleMenuOpen = (e: React.MouseEvent<HTMLElement>, row: RecurringTransactionRow) => {\n e.stopPropagation()\n setMenuAnchorEl(e.currentTarget)\n setMenuRow(row)\n onEvent(ANALYTICS_EVENTS.RECURRING_TRANSACTIONS_LIST_CLICK_MORE_MENU)\n }\n\n const handleMenuClose = () => {\n setMenuAnchorEl(null)\n setMenuRow(null)\n }\n\n const handleMenuAction = () => {\n if (!menuRow) return\n\n if (menuRow.status === RecurrenceStatus.Missed) {\n onMarkAsPaidClick()\n } else if (menuRow.transactionGuid) {\n onMarkAsUnpaidClick(menuRow.transactionGuid)\n }\n handleMenuClose()\n }\n\n return (\n <Stack direction=\"column\" sx={{ minHeight: '30dvh' }}>\n <Text bold={true} id=\"past-activity\" sx={{ ml: 24, mt: 16, mb: 8 }} variant=\"body1\">\n {copy.past_activity}\n </Text>\n <List aria-labelledby=\"past-activity\" sx={{ flex: 1, overflow: 'auto' }}>\n {rows.map((row, index) => {\n const isPaid = row.status === RecurrenceStatus.Paid\n const isMissed = row.status === RecurrenceStatus.Missed\n const isLast = index === rows.length - 1\n\n return (\n <React.Fragment key={row.key}>\n <ListItemWrapper\n onClick={isPaid ? () => handleClick(row) : undefined}\n sx={{ '& .MuiListItemButton-root': { pr: 10 } }}\n >\n <ListItemAvatar>\n <MerchantLogo categoryGuid={row.categoryGuid} merchantGuid={row.merchantGuid} />\n </ListItemAvatar>\n <ListItemText\n disableTypography={true}\n secondary={\n <Stack direction=\"row\" justifyContent=\"space-between\">\n <Text variant=\"caption\">\n {formatDate(fromUnixTime(row.date), DATE_FORMATS_INTL.MONTH_DAY_YEAR)}\n </Text>\n <Stack\n alignItems=\"center\"\n direction=\"row\"\n gap={6}\n sx={{ textTransform: 'uppercase' }}\n >\n {isPaid && <CheckCircle color=\"success\" filled={true} size={12} />}\n {isMissed && <Cancel color=\"error\" filled={true} size={12} />}\n <Text bold={true} color=\"text.secondary\" variant=\"caption\">\n {isPaid ? copy.paid?.toLowerCase() : copy.missed?.toLowerCase()}\n </Text>\n </Stack>\n </Stack>\n }\n >\n <Stack direction=\"row\" justifyContent=\"space-between\" sx={{ gap: 8 }}>\n <Text bold={true} variant=\"body1\">\n {row.name}\n </Text>\n <Text\n bold={true}\n color={isIncome ? 'success.main' : 'text.primary'}\n sx={{ flexShrink: 0 }}\n variant=\"body1\"\n >\n {isIncome ? '+' : ''}\n {formatCurrency(row.amount, '0,0.00')}\n </Text>\n </Stack>\n </ListItemText>\n <IconButton\n aria-label={copy.more_menu_aria}\n onClick={(e) => handleMenuOpen(e, row)}\n size=\"small\"\n sx={{ alignSelf: 'center', ml: 4 }}\n >\n <Icon name=\"more_vert\" size={20} sx={{ color: 'text.secondary' }} />\n </IconButton>\n </ListItemWrapper>\n <Divider variant={isLast ? 'fullWidth' : 'inset'} />\n </React.Fragment>\n )\n })}\n </List>\n\n <Menu\n anchorEl={menuAnchorEl}\n anchorOrigin={{ horizontal: 'right', vertical: 'bottom' }}\n disableScrollLock={true}\n onClose={handleMenuClose}\n open={Boolean(menuAnchorEl)}\n transformOrigin={{ horizontal: 'right', vertical: 'top' }}\n >\n <MenuItem onClick={handleMenuAction} sx={{ p: 12 }}>\n <Text variant=\"body1\">\n {menuRow?.status === RecurrenceStatus.Missed\n ? copy.mark_as_paid_cta\n : copy.mark_as_unpaid_cta}\n </Text>\n </MenuItem>\n </Menu>\n </Stack>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA8CA,IAAM,IAAA,CACJ,GACA,MAC8B;AAC9B,QAAM,IAAsC,EAAa,IAAA,CAAK,OAAO;AAAA,IACnE,KAAK,EAAE;AAAA,IACP,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE;AAAA,IACpC,QAAQ,EAAE;AAAA,IACV,MAAM,EAAE;AAAA,IACR,cAAc,EAAE,iBAAiB;AAAA,IACjC,cAAc,EAAE,2BAA2B;AAAA,IAC3C,UAAU,EAAE,YAAY;AAAA,IACxB,QAAQ,EAAiB;AAAA,IACzB,iBAAiB,EAAE;AAAA,EACrB,EAAE,GAEI,IAAwC,EAAkB,IAAA,CAAK,OAAO;AAAA,IAC1E,KAAK,UAAU,EAAE,aAAa,QAAQ,CAAA;AAAA,IACtC,MAAM,EAAE;AAAA,IACR,QAAQ,EAAE;AAAA,IACV,MAAM,EAAY,EAAE,YAAY;AAAA,IAChC,cAAc,EAAE;AAAA,IAChB,cAAc,EAAE;AAAA,IAChB,UAAU;AAAA,IACV,QAAQ,EAAiB;AAAA,EAC3B,EAAE;AAEF,SAAO,CAAC,GAAG,GAAU,GAAG,CAAU,EAAE,KAAA,CAAM,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AACpE,GAWa,KAAA,CAA4B,EACvC,UAAA,IAAW,IACX,qBAAA,GACA,mBAAA,GACA,oBAAA,GACA,sBAAA,GACA,cAAA,EAAA,MACmC;AACnC,QAAM,EAAE,WAAW,EAAA,IAAS,EAAmB,GACzC,EAAE,SAAA,EAAA,IAAY,EAAS,GACvB,EAAE,aAAA,EAAA,IAAgB,EAA8B,GAEhD,CAAC,GAAc,CAAA,IAAmB,EAAM,SAA6B,IAAI,GACzE,CAAC,GAAS,CAAA,IAAc,EAAM,SAAyC,IAAI,GAE3E,IAAoB,EAAM,QAAA,MAE5B,EAAY,OAAA,CACT,MACC,EAAE,6BAA6B,EAAqB,QACpD,EAAE,WAAW,EAAiB,MAClC,GACF,CAAC,GAAa,EAAqB,IAAI,CACzC,GAEM,IAAO,EAAM,QAAA,MACX,EAAU,GAAc,CAAiB,GAC/C,CAAC,GAAc,CAAiB,CAClC,GAEM,IAAA,CAAe,MAAiC;AACpD,IAAI,EAAI,mBACN,EAAmB,EAAI,eAAe;AAAA,EAE1C,GAEM,IAAA,CAAkB,GAAkC,MAAiC;AACzF,IAAA,EAAE,gBAAgB,GAClB,EAAgB,EAAE,aAAa,GAC/B,EAAW,CAAG,GACd,EAAQ,EAAiB,2CAA2C;AAAA,EACtE,GAEM,IAAA,MAAwB;AAC5B,IAAA,EAAgB,IAAI,GACpB,EAAW,IAAI;AAAA,EACjB,GAEM,IAAA,MAAyB;AAC7B,IAAK,MAED,EAAQ,WAAW,EAAiB,SACtC,EAAkB,IACT,EAAQ,mBACjB,EAAoB,EAAQ,eAAe,GAE7C,EAAgB;AAAA,EAClB;AAEA,SACE,gBAAA,EAAC,GAAD;AAAA,IAAO,WAAU;AAAA,IAAS,IAAI,EAAE,WAAW,QAAQ;AAAA,IAAnD,UAAA;AAAA,MACE,gBAAA,EAAC,GAAD;AAAA,QAAM,MAAM;AAAA,QAAM,IAAG;AAAA,QAAgB,IAAI;AAAA,UAAE,IAAI;AAAA,UAAI,IAAI;AAAA,UAAI,IAAI;AAAA,QAAE;AAAA,QAAG,SAAQ;AAAA,QACzE,UAAA,EAAK;AAAA,MACF,CAAA;AAAA,MACN,gBAAA,EAAC,GAAD;AAAA,QAAM,mBAAgB;AAAA,QAAgB,IAAI;AAAA,UAAE,MAAM;AAAA,UAAG,UAAU;AAAA,QAAO;AAAA,QACnE,UAAA,EAAK,IAAA,CAAK,GAAK,MAAU;AACxB,gBAAM,IAAS,EAAI,WAAW,EAAiB,MACzC,IAAW,EAAI,WAAW,EAAiB,QAC3C,IAAS,MAAU,EAAK,SAAS;AAEvC,iBACE,gBAAA,EAAC,EAAM,UAAP,EAAA,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,YACE,SAAS,IAAA,MAAe,EAAY,CAAG,IAAI;AAAA,YAC3C,IAAI,EAAE,6BAA6B,EAAE,IAAI,GAAG,EAAE;AAAA,YAFhD,UAAA;AAAA,cAIE,gBAAA,EAAC,GAAD,EAAA,UACE,gBAAA,EAAC,GAAD;AAAA,gBAAc,cAAc,EAAI;AAAA,gBAAc,cAAc,EAAI;AAAA,cAAe,CAAA,EACjE,CAAA;AAAA,cAChB,gBAAA,EAAC,GAAD;AAAA,gBACE,mBAAmB;AAAA,gBACnB,WACE,gBAAA,EAAC,GAAD;AAAA,kBAAO,WAAU;AAAA,kBAAM,gBAAe;AAAA,kBAAtC,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,oBAAM,SAAQ;AAAA,oBACX,UAAA,EAAW,EAAa,EAAI,IAAI,GAAG,EAAkB,cAAc;AAAA,kBAChE,CAAA,GACN,gBAAA,EAAC,GAAD;AAAA,oBACE,YAAW;AAAA,oBACX,WAAU;AAAA,oBACV,KAAK;AAAA,oBACL,IAAI,EAAE,eAAe,YAAY;AAAA,oBAJnC,UAAA;AAAA,sBAMG,KAAU,gBAAA,EAAC,GAAD;AAAA,wBAAa,OAAM;AAAA,wBAAU,QAAQ;AAAA,wBAAM,MAAM;AAAA,sBAAK,CAAA;AAAA,sBAChE,KAAY,gBAAA,EAAC,GAAD;AAAA,wBAAQ,OAAM;AAAA,wBAAQ,QAAQ;AAAA,wBAAM,MAAM;AAAA,sBAAK,CAAA;AAAA,sBAC5D,gBAAA,EAAC,GAAD;AAAA,wBAAM,MAAM;AAAA,wBAAM,OAAM;AAAA,wBAAiB,SAAQ;AAAA,wBAC9C,UAAA,IAAS,EAAK,MAAM,YAAY,IAAI,EAAK,QAAQ,YAAY;AAAA,sBAC1D,CAAA;AAAA,oBACD;AAAA,kBACF,CAAA,CAAA;AAAA;gBAGT,UAAA,gBAAA,EAAC,GAAD;AAAA,kBAAO,WAAU;AAAA,kBAAM,gBAAe;AAAA,kBAAgB,IAAI,EAAE,KAAK,EAAE;AAAA,kBAAnE,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,oBAAM,MAAM;AAAA,oBAAM,SAAQ;AAAA,oBACvB,UAAA,EAAI;AAAA,kBACD,CAAA,GACN,gBAAA,EAAC,GAAD;AAAA,oBACE,MAAM;AAAA,oBACN,OAAO,IAAW,iBAAiB;AAAA,oBACnC,IAAI,EAAE,YAAY,EAAE;AAAA,oBACpB,SAAQ;AAAA,oBAJV,UAAA,CAMG,IAAW,MAAM,IACjB,EAAe,EAAI,QAAQ,QAAQ,CAChC;AAAA,kBACD,CAAA,CAAA;AAAA;cACK,CAAA;AAAA,cACd,gBAAA,EAAC,GAAD;AAAA,gBACE,cAAY,EAAK;AAAA,gBACjB,SAAA,CAAU,MAAM,EAAe,GAAG,CAAG;AAAA,gBACrC,MAAK;AAAA,gBACL,IAAI;AAAA,kBAAE,WAAW;AAAA,kBAAU,IAAI;AAAA,gBAAE;AAAA,gBAEjC,UAAA,gBAAA,EAAC,GAAD;AAAA,kBAAM,MAAK;AAAA,kBAAY,MAAM;AAAA,kBAAI,IAAI,EAAE,OAAO,iBAAiB;AAAA,gBAAI,CAAA;AAAA,cACzD,CAAA;AAAA,YACG;AAAA,UACjB,CAAA,GAAA,gBAAA,EAAC,GAAD,EAAS,SAAS,IAAS,cAAc,QAAU,CAAA,CACrC,EAAA,GAvDK,EAAI,GAuDT;AAAA,QAEpB,CAAC;AAAA,MACG,CAAA;AAAA,MAEN,gBAAA,EAAC,GAAD;AAAA,QACE,UAAU;AAAA,QACV,cAAc;AAAA,UAAE,YAAY;AAAA,UAAS,UAAU;AAAA,QAAS;AAAA,QACxD,mBAAmB;AAAA,QACnB,SAAS;AAAA,QACT,MAAM,EAAQ;AAAA,QACd,iBAAiB;AAAA,UAAE,YAAY;AAAA,UAAS,UAAU;AAAA,QAAM;AAAA,QAExD,UAAA,gBAAA,EAAC,GAAD;AAAA,UAAU,SAAS;AAAA,UAAkB,IAAI,EAAE,GAAG,GAAG;AAAA,UAC/C,UAAA,gBAAA,EAAC,GAAD;AAAA,YAAM,SAAQ;AAAA,YACX,UAAA,GAAS,WAAW,EAAiB,SAClC,EAAK,mBACL,EAAK;AAAA,UACL,CAAA;AAAA,QACE,CAAA;AAAA,MACN,CAAA;AAAA,IACD;AAAA;AAEX"}
1
+ {"version":3,"file":"RecurringTransactionList.es.js","names":[],"sources":["../../../src/recurringtransactions/components/RecurringTransactionList.tsx"],"sourcesContent":["import React from 'react'\n\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { getUnixTime } from 'date-fns/getUnixTime'\n\nimport Divider from '@mui/material/Divider'\nimport IconButton from '@mui/material/IconButton'\nimport List from '@mui/material/List'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemText from '@mui/material/ListItemText'\nimport Menu from '@mui/material/Menu'\nimport MenuItem from '@mui/material/MenuItem'\nimport Stack from '@mui/material/Stack'\n\nimport { Cancel, CheckCircle, Icon } from '@mxenabled/mx-icons'\nimport { MerchantLogo, Text } from '@mxenabled/mxui'\n\nimport {\n ANALYTICS_EVENTS,\n formatCurrency,\n ListItemWrapper,\n useEvent,\n useGlobalCopyStore,\n useRecurringTransactionsStore,\n} from '../../common'\nimport { DATE_FORMATS_INTL, formatDate } from '../../core/constants'\n\nimport {\n type Recurrence,\n type Transaction,\n RecurrenceStatus,\n RepeatingTransaction,\n} from '../../core'\n\ntype RecurringTransactionRow = {\n key: string\n name: string\n amount: number\n date: number\n merchantGuid: string\n categoryGuid: string\n category: string\n status: RecurrenceStatus.Paid | RecurrenceStatus.Missed\n transactionGuid?: string\n}\n\nconst buildRows = (\n transactions: Transaction[],\n missedRecurrences: Recurrence[],\n): RecurringTransactionRow[] => {\n const paidRows: RecurringTransactionRow[] = transactions.map((t) => ({\n key: t.guid,\n name: t.payee || t.description || t.feed_description,\n amount: t.amount,\n date: t.date,\n merchantGuid: t.merchant_guid || '',\n categoryGuid: t.top_level_category_guid || '',\n category: t.category || '',\n status: RecurrenceStatus.Paid,\n transactionGuid: t.guid,\n }))\n\n const missedRows: RecurringTransactionRow[] = missedRecurrences.map((r) => ({\n key: `missed-${r.expectedDate.getTime()}`,\n name: r.name,\n amount: r.amount,\n date: getUnixTime(r.expectedDate),\n merchantGuid: r.merchantGuid || '',\n categoryGuid: r.categoryGuid,\n category: '',\n status: RecurrenceStatus.Missed,\n }))\n\n return [...paidRows, ...missedRows].sort((a, b) => b.date - a.date)\n}\n\ninterface RecurringTransactionListProps {\n isIncome?: boolean\n onMarkAsPaidClick: () => void\n onMarkAsUnpaidClick: (transactionGuid: string) => void\n onTransactionClick: (guid: string) => void\n recurringTransaction: RepeatingTransaction\n transactions: Transaction[]\n}\n\nexport const RecurringTransactionList = ({\n isIncome = false,\n onMarkAsUnpaidClick,\n onMarkAsPaidClick,\n onTransactionClick,\n recurringTransaction,\n transactions,\n}: RecurringTransactionListProps) => {\n const { recurring: copy } = useGlobalCopyStore()\n const { onEvent } = useEvent()\n const { recurrences } = useRecurringTransactionsStore()\n\n const [menuAnchorEl, setMenuAnchorEl] = React.useState<HTMLElement | null>(null)\n const [menuRow, setMenuRow] = React.useState<RecurringTransactionRow | null>(null)\n\n const missedRecurrences = React.useMemo(\n () =>\n recurrences.filter(\n (r) =>\n r.repeatingTransactionGuid === recurringTransaction.guid &&\n r.status === RecurrenceStatus.Missed,\n ),\n [recurrences, recurringTransaction.guid],\n )\n\n const rows = React.useMemo(\n () => buildRows(transactions, missedRecurrences),\n [transactions, missedRecurrences],\n )\n\n const handleClick = (row: RecurringTransactionRow) => {\n if (row.transactionGuid) {\n onTransactionClick(row.transactionGuid)\n }\n }\n\n const handleMenuOpen = (e: React.MouseEvent<HTMLElement>, row: RecurringTransactionRow) => {\n e.stopPropagation()\n setMenuAnchorEl(e.currentTarget)\n setMenuRow(row)\n onEvent(ANALYTICS_EVENTS.RECURRING_TRANSACTIONS_LIST_CLICK_MORE_MENU)\n }\n\n const handleMenuClose = () => {\n setMenuAnchorEl(null)\n setMenuRow(null)\n }\n\n const handleMenuAction = () => {\n if (!menuRow) return\n\n if (menuRow.status === RecurrenceStatus.Missed) {\n onMarkAsPaidClick()\n } else if (menuRow.transactionGuid) {\n onMarkAsUnpaidClick(menuRow.transactionGuid)\n }\n handleMenuClose()\n }\n\n return (\n <Stack direction=\"column\" sx={{ minHeight: '30dvh' }}>\n <Text bold={true} id=\"past-activity\" sx={{ ml: 24, mt: 16, mb: 8 }} variant=\"body1\">\n {copy.past_activity}\n </Text>\n <List aria-labelledby=\"past-activity\" sx={{ flex: 1, overflow: 'auto' }}>\n {rows.map((row, index) => {\n const isPaid = row.status === RecurrenceStatus.Paid\n const isMissed = row.status === RecurrenceStatus.Missed\n const isLast = index === rows.length - 1\n\n return (\n <React.Fragment key={row.key}>\n <ListItemWrapper\n onClick={isPaid ? () => handleClick(row) : undefined}\n sx={{ '& .MuiListItemButton-root': { pr: 10 } }}\n >\n <ListItemAvatar>\n <MerchantLogo categoryGuid={row.categoryGuid} merchantGuid={row.merchantGuid} />\n </ListItemAvatar>\n <ListItemText\n disableTypography={true}\n secondary={\n <Stack direction=\"row\" justifyContent=\"space-between\">\n <Text variant=\"caption\">\n {formatDate(fromUnixTime(row.date), DATE_FORMATS_INTL.MONTH_DAY_YEAR)}\n </Text>\n <Stack\n alignItems=\"center\"\n direction=\"row\"\n gap={6}\n sx={{ textTransform: 'uppercase' }}\n >\n {isPaid && <CheckCircle color=\"success\" filled={true} size={12} />}\n {isMissed && <Cancel color=\"error\" filled={true} size={12} />}\n <Text bold={true} color=\"text.secondary\" variant=\"caption\">\n {isPaid ? copy.paid?.toLowerCase() : copy.missed?.toLowerCase()}\n </Text>\n </Stack>\n </Stack>\n }\n >\n <Stack direction=\"row\" justifyContent=\"space-between\" sx={{ gap: 8 }}>\n <Text bold={true} variant=\"body1\">\n {row.name}\n </Text>\n <Text\n bold={true}\n color={isIncome ? 'success.main' : 'text.primary'}\n sx={{ flexShrink: 0 }}\n variant=\"body1\"\n >\n {isIncome ? '+' : ''}\n {formatCurrency(row.amount, '0,0.00')}\n </Text>\n </Stack>\n </ListItemText>\n <IconButton\n aria-label={copy.more_menu_aria}\n onClick={(e) => handleMenuOpen(e, row)}\n size=\"small\"\n sx={{ alignSelf: 'center', ml: 4 }}\n >\n <Icon name=\"more_vert\" size={20} sx={{ color: 'text.secondary' }} />\n </IconButton>\n </ListItemWrapper>\n <Divider variant={isLast ? 'fullWidth' : 'inset'} />\n </React.Fragment>\n )\n })}\n </List>\n\n <Menu\n anchorEl={menuAnchorEl}\n anchorOrigin={{ horizontal: 'right', vertical: 'bottom' }}\n disableScrollLock={true}\n onClose={handleMenuClose}\n open={Boolean(menuAnchorEl)}\n transformOrigin={{ horizontal: 'right', vertical: 'top' }}\n >\n <MenuItem onClick={handleMenuAction} sx={{ p: 12 }}>\n <Text variant=\"body1\">\n {menuRow?.status === RecurrenceStatus.Missed\n ? copy.mark_as_paid_cta\n : copy.mark_as_unpaid_cta}\n </Text>\n </MenuItem>\n </Menu>\n </Stack>\n )\n}\n"],"mappings":"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"}
@@ -25,7 +25,7 @@ var H = _(({ onClick: u = () => {
25
25
  },
26
26
  children: [/* @__PURE__ */ e(R, { children: /* @__PURE__ */ e(w, {
27
27
  categoryGuid: p,
28
- merchantGuid: t.merchant_guid
28
+ merchantGuid: t.merchant_guid || ""
29
29
  }) }), /* @__PURE__ */ e(v, { children: /* @__PURE__ */ r(o, {
30
30
  direction: "row",
31
31
  gap: 4,
@@ -1 +1 @@
1
- {"version":3,"file":"RecurringRow.es.js","names":[],"sources":["../../../../../src/recurringtransactions/components/shared/recurringsettings/RecurringRow.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport Stack from '@mui/material/Stack'\n\nimport { InstitutionLogo, MerchantLogo, Text } from '@mxenabled/mxui'\n\nimport { Drawer, useGlobalCopyStore } from '../../../../common'\nimport { type RepeatingTransaction, RepeatingType } from '../../../../core'\n\nimport { getFrequencyLabel } from '../../../../core/utils/RecurringTransactionsUtil'\nimport { RecurringTransactionDetails } from '../../RecurringTransactionDetails'\nimport { formatCurrency } from '../../../../core/utils/NumberFormatting'\n\ninterface RecurringRowProps {\n onClick?: (repeatingTransaction: RepeatingTransaction) => void\n repeatingTransaction: RepeatingTransaction\n}\n\nexport const RecurringRow = observer(\n ({ onClick = () => {}, repeatingTransaction }: RecurringRowProps) => {\n const { recurring: copy } = useGlobalCopyStore()\n\n const [isDetialsOpen, setIsDetailsOpen] = React.useState(false)\n\n const categoryGuid = React.useMemo(\n () =>\n repeatingTransaction.transactions.length === 0\n ? ''\n : repeatingTransaction.transactions[0].category_guid || '',\n [repeatingTransaction],\n )\n\n const institutionName = repeatingTransaction.account?.displayName || ''\n\n const isCredit = repeatingTransaction.repeating_transaction_type === RepeatingType.Income\n const statusLabel = getFrequencyLabel(copy, repeatingTransaction, true)\n\n const onItemClick = () => {\n onClick(repeatingTransaction)\n setIsDetailsOpen(true)\n }\n\n return (\n <ListItem disableGutters={true} disablePadding={true}>\n <ListItemButton onClick={onItemClick}>\n <ListItemAvatar>\n <MerchantLogo\n categoryGuid={categoryGuid}\n merchantGuid={repeatingTransaction.merchant_guid}\n />\n </ListItemAvatar>\n <ListItemText>\n <Stack direction=\"row\" gap={4} sx={{ justifyContent: 'space-between' }}>\n <Stack direction=\"column\" sx={{ width: '50%' }}>\n <Text bold={true} variant=\"body1\">\n {repeatingTransaction.description}\n </Text>\n <Stack alignItems=\"center\" direction=\"row\" gap={6}>\n {repeatingTransaction.account?.institution_guid && (\n <InstitutionLogo\n alt={institutionName}\n institutionGuid={repeatingTransaction.account?.institution_guid}\n size={12}\n />\n )}\n <Text variant=\"caption\">{institutionName}</Text>\n </Stack>\n </Stack>\n\n <Stack alignItems=\"flex-end\" sx={{ width: '50%' }}>\n <Text\n bold={true}\n color={isCredit ? 'success.main' : 'text.primary'}\n variant=\"body1\"\n >\n {isCredit ? '+' : ''}\n {formatCurrency(repeatingTransaction.amount, '0,0.00')}\n </Text>\n <Stack\n direction=\"row\"\n sx={{\n alignItems: 'center',\n gap: 6,\n justifyContent: 'flex-end',\n textTransform: 'uppercase',\n width: '100%',\n }}\n >\n <Text bold={true} color=\"text.secondary\" variant=\"caption\">\n {statusLabel}\n </Text>\n </Stack>\n </Stack>\n </Stack>\n </ListItemText>\n </ListItemButton>\n\n <Drawer\n ariaLabelClose={copy.close_drawer_aria}\n isOpen={isDetialsOpen}\n onClose={() => setIsDetailsOpen(false)}\n title={\n repeatingTransaction.repeating_transaction_type === RepeatingType.Income\n ? copy.income_details\n : copy.expense_details\n }\n >\n <RecurringTransactionDetails\n onDeleted={() => setIsDetailsOpen(false)}\n recurringTransaction={repeatingTransaction}\n selectedRecurrence={null}\n />\n </Drawer>\n </ListItem>\n )\n },\n)\n"],"mappings":"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"}
1
+ {"version":3,"file":"RecurringRow.es.js","names":[],"sources":["../../../../../src/recurringtransactions/components/shared/recurringsettings/RecurringRow.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport Stack from '@mui/material/Stack'\n\nimport { InstitutionLogo, MerchantLogo, Text } from '@mxenabled/mxui'\n\nimport { Drawer, useGlobalCopyStore } from '../../../../common'\nimport { type RepeatingTransaction, RepeatingType } from '../../../../core'\n\nimport { getFrequencyLabel } from '../../../../core/utils/RecurringTransactionsUtil'\nimport { RecurringTransactionDetails } from '../../RecurringTransactionDetails'\nimport { formatCurrency } from '../../../../core/utils/NumberFormatting'\n\ninterface RecurringRowProps {\n onClick?: (repeatingTransaction: RepeatingTransaction) => void\n repeatingTransaction: RepeatingTransaction\n}\n\nexport const RecurringRow = observer(\n ({ onClick = () => {}, repeatingTransaction }: RecurringRowProps) => {\n const { recurring: copy } = useGlobalCopyStore()\n\n const [isDetialsOpen, setIsDetailsOpen] = React.useState(false)\n\n const categoryGuid = React.useMemo(\n () =>\n repeatingTransaction.transactions.length === 0\n ? ''\n : repeatingTransaction.transactions[0].category_guid || '',\n [repeatingTransaction],\n )\n\n const institutionName = repeatingTransaction.account?.displayName || ''\n\n const isCredit = repeatingTransaction.repeating_transaction_type === RepeatingType.Income\n const statusLabel = getFrequencyLabel(copy, repeatingTransaction, true)\n\n const onItemClick = () => {\n onClick(repeatingTransaction)\n setIsDetailsOpen(true)\n }\n\n return (\n <ListItem disableGutters={true} disablePadding={true}>\n <ListItemButton onClick={onItemClick}>\n <ListItemAvatar>\n <MerchantLogo\n categoryGuid={categoryGuid}\n merchantGuid={repeatingTransaction.merchant_guid || ''}\n />\n </ListItemAvatar>\n <ListItemText>\n <Stack direction=\"row\" gap={4} sx={{ justifyContent: 'space-between' }}>\n <Stack direction=\"column\" sx={{ width: '50%' }}>\n <Text bold={true} variant=\"body1\">\n {repeatingTransaction.description}\n </Text>\n <Stack alignItems=\"center\" direction=\"row\" gap={6}>\n {repeatingTransaction.account?.institution_guid && (\n <InstitutionLogo\n alt={institutionName}\n institutionGuid={repeatingTransaction.account?.institution_guid}\n size={12}\n />\n )}\n <Text variant=\"caption\">{institutionName}</Text>\n </Stack>\n </Stack>\n\n <Stack alignItems=\"flex-end\" sx={{ width: '50%' }}>\n <Text\n bold={true}\n color={isCredit ? 'success.main' : 'text.primary'}\n variant=\"body1\"\n >\n {isCredit ? '+' : ''}\n {formatCurrency(repeatingTransaction.amount, '0,0.00')}\n </Text>\n <Stack\n direction=\"row\"\n sx={{\n alignItems: 'center',\n gap: 6,\n justifyContent: 'flex-end',\n textTransform: 'uppercase',\n width: '100%',\n }}\n >\n <Text bold={true} color=\"text.secondary\" variant=\"caption\">\n {statusLabel}\n </Text>\n </Stack>\n </Stack>\n </Stack>\n </ListItemText>\n </ListItemButton>\n\n <Drawer\n ariaLabelClose={copy.close_drawer_aria}\n isOpen={isDetialsOpen}\n onClose={() => setIsDetailsOpen(false)}\n title={\n repeatingTransaction.repeating_transaction_type === RepeatingType.Income\n ? copy.income_details\n : copy.expense_details\n }\n >\n <RecurringTransactionDetails\n onDeleted={() => setIsDetailsOpen(false)}\n recurringTransaction={repeatingTransaction}\n selectedRecurrence={null}\n />\n </Drawer>\n </ListItem>\n )\n },\n)\n"],"mappings":"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"}
@@ -5,32 +5,31 @@ import p from "../../../../transactions/components/shared/TransactionList.es.js"
5
5
  import { observer as f } from "mobx-react-lite";
6
6
  import _ from "@mui/material/Stack";
7
7
  import { P as u } from "@mxenabled/mxui";
8
- import { jsx as e, jsxs as d } from "react/jsx-runtime";
9
- var j = f(({ bgcolor: o = "background.default", description: t, onSearch: c, onSelected: s }) => {
10
- const { recurring: a } = l(), { searchValue: i, setSearchValue: n } = h();
8
+ import { jsx as a, jsxs as d } from "react/jsx-runtime";
9
+ var j = f(({ bgcolor: e = "background.default", description: o, onSearch: c, onSelected: s }) => {
10
+ const { recurring: r } = l(), { searchValue: i, setSearchValue: n } = h();
11
11
  return /* @__PURE__ */ d(_, {
12
12
  sx: {
13
- bgcolor: o,
13
+ bgcolor: e,
14
14
  gap: 16,
15
15
  pt: 8
16
16
  },
17
17
  children: [
18
- t && /* @__PURE__ */ e(u, {
18
+ o && /* @__PURE__ */ a(u, {
19
19
  sx: { mx: 24 },
20
- children: t
20
+ children: o
21
21
  }),
22
- /* @__PURE__ */ e(m, {
23
- ariaLabel: a.select_transaction_search_aria,
24
- cancelAriaLabel: a.select_transaction_search_cancel_aria,
25
- onChange: (r) => {
26
- n(r), c(r);
22
+ /* @__PURE__ */ a(m, {
23
+ ariaLabel: r.select_transaction_search_aria,
24
+ cancelAriaLabel: r.select_transaction_search_cancel_aria,
25
+ onChange: (t) => {
26
+ n(t), c(t);
27
27
  },
28
- placeholder: a.select_transaction_search_placeholder,
28
+ placeholder: r.select_transaction_search_placeholder,
29
29
  searchValue: i
30
30
  }),
31
- /* @__PURE__ */ e(p, {
32
- bgcolor: o,
33
- filter: (r) => !!r.merchant_guid,
31
+ /* @__PURE__ */ a(p, {
32
+ bgcolor: e,
34
33
  height: "auto",
35
34
  onClick: s,
36
35
  showLoader: !1
@@ -1 +1 @@
1
- {"version":3,"file":"SelectTransaction.es.js","names":[],"sources":["../../../../../src/recurringtransactions/components/shared/recurringsettings/SelectTransaction.tsx"],"sourcesContent":["import { observer } from 'mobx-react-lite'\n\nimport Stack from '@mui/material/Stack'\n\nimport { P } from '@mxenabled/mxui'\n\nimport { SearchBox, useGlobalCopyStore } from '../../../../common'\nimport { TransactionList, useTransactionsUiStore } from '../../../../transactions'\n\ninterface SelectTransactionProps {\n bgcolor?: string\n description?: string\n onSearch: (value: string) => void\n onSelected: (guid: string) => void\n}\n\nexport const SelectTransaction = observer(\n ({\n bgcolor = 'background.default',\n description,\n onSearch,\n onSelected,\n }: SelectTransactionProps) => {\n const { recurring: recurringCopy } = useGlobalCopyStore()\n const { searchValue, setSearchValue } = useTransactionsUiStore()\n\n return (\n <Stack sx={{ bgcolor, gap: 16, pt: 8 }}>\n {description && <P sx={{ mx: 24 }}>{description}</P>}\n <SearchBox\n ariaLabel={recurringCopy.select_transaction_search_aria}\n cancelAriaLabel={recurringCopy.select_transaction_search_cancel_aria}\n onChange={(value) => {\n setSearchValue(value)\n onSearch(value)\n }}\n placeholder={recurringCopy.select_transaction_search_placeholder}\n searchValue={searchValue}\n />\n <TransactionList\n bgcolor={bgcolor}\n filter={(t) => !!t.merchant_guid}\n height=\"auto\"\n onClick={onSelected}\n showLoader={false}\n />\n </Stack>\n )\n },\n)\n"],"mappings":";;;;;;;;AAgBA,IAAa,IAAoB,EAAA,CAC9B,EACC,SAAA,IAAU,sBACV,aAAA,GACA,UAAA,GACA,YAAA,EAAA,MAC4B;AAC5B,QAAM,EAAE,WAAW,EAAA,IAAkB,EAAmB,GAClD,EAAE,aAAA,GAAa,gBAAA,EAAA,IAAmB,EAAuB;AAE/D,SACE,gBAAA,EAAC,GAAD;AAAA,IAAO,IAAI;AAAA,MAAE,SAAA;AAAA,MAAS,KAAK;AAAA,MAAI,IAAI;AAAA,IAAE;AAAA,IAArC,UAAA;AAAA,MACG,KAAe,gBAAA,EAAC,GAAD;AAAA,QAAG,IAAI,EAAE,IAAI,GAAG;AAAA,QAAI,UAAA;AAAA,MAAe,CAAA;AAAA,MACnD,gBAAA,EAAC,GAAD;AAAA,QACE,WAAW,EAAc;AAAA,QACzB,iBAAiB,EAAc;AAAA,QAC/B,UAAA,CAAW,MAAU;AACnB,UAAA,EAAe,CAAK,GACpB,EAAS,CAAK;AAAA,QAChB;AAAA,QACA,aAAa,EAAc;AAAA,QACd,aAAA;AAAA,MACd,CAAA;AAAA,MACD,gBAAA,EAAC,GAAD;AAAA,QACW,SAAA;AAAA,QACT,QAAA,CAAS,MAAM,CAAC,CAAC,EAAE;AAAA,QACnB,QAAO;AAAA,QACP,SAAS;AAAA,QACT,YAAY;AAAA,MACb,CAAA;AAAA,IACI;AAAA;AAEX,CACF"}
1
+ {"version":3,"file":"SelectTransaction.es.js","names":[],"sources":["../../../../../src/recurringtransactions/components/shared/recurringsettings/SelectTransaction.tsx"],"sourcesContent":["import { observer } from 'mobx-react-lite'\n\nimport Stack from '@mui/material/Stack'\n\nimport { P } from '@mxenabled/mxui'\n\nimport { SearchBox, useGlobalCopyStore } from '../../../../common'\nimport { TransactionList, useTransactionsUiStore } from '../../../../transactions'\n\ninterface SelectTransactionProps {\n bgcolor?: string\n description?: string\n onSearch: (value: string) => void\n onSelected: (guid: string) => void\n}\n\nexport const SelectTransaction = observer(\n ({\n bgcolor = 'background.default',\n description,\n onSearch,\n onSelected,\n }: SelectTransactionProps) => {\n const { recurring: recurringCopy } = useGlobalCopyStore()\n const { searchValue, setSearchValue } = useTransactionsUiStore()\n\n return (\n <Stack sx={{ bgcolor, gap: 16, pt: 8 }}>\n {description && <P sx={{ mx: 24 }}>{description}</P>}\n <SearchBox\n ariaLabel={recurringCopy.select_transaction_search_aria}\n cancelAriaLabel={recurringCopy.select_transaction_search_cancel_aria}\n onChange={(value) => {\n setSearchValue(value)\n onSearch(value)\n }}\n placeholder={recurringCopy.select_transaction_search_placeholder}\n searchValue={searchValue}\n />\n <TransactionList bgcolor={bgcolor} height=\"auto\" onClick={onSelected} showLoader={false} />\n </Stack>\n )\n },\n)\n"],"mappings":";;;;;;;;AAgBA,IAAa,IAAoB,EAAA,CAC9B,EACC,SAAA,IAAU,sBACV,aAAA,GACA,UAAA,GACA,YAAA,EAAA,MAC4B;AAC5B,QAAM,EAAE,WAAW,EAAA,IAAkB,EAAmB,GAClD,EAAE,aAAA,GAAa,gBAAA,EAAA,IAAmB,EAAuB;AAE/D,SACE,gBAAA,EAAC,GAAD;AAAA,IAAO,IAAI;AAAA,MAAE,SAAA;AAAA,MAAS,KAAK;AAAA,MAAI,IAAI;AAAA,IAAE;AAAA,IAArC,UAAA;AAAA,MACG,KAAe,gBAAA,EAAC,GAAD;AAAA,QAAG,IAAI,EAAE,IAAI,GAAG;AAAA,QAAI,UAAA;AAAA,MAAe,CAAA;AAAA,MACnD,gBAAA,EAAC,GAAD;AAAA,QACE,WAAW,EAAc;AAAA,QACzB,iBAAiB,EAAc;AAAA,QAC/B,UAAA,CAAW,MAAU;AACnB,UAAA,EAAe,CAAK,GACpB,EAAS,CAAK;AAAA,QAChB;AAAA,QACA,aAAa,EAAc;AAAA,QACd,aAAA;AAAA,MACd,CAAA;AAAA,MACD,gBAAA,EAAC,GAAD;AAAA,QAA0B,SAAA;AAAA,QAAS,QAAO;AAAA,QAAO,SAAS;AAAA,QAAY,YAAY;AAAA,MAAQ,CAAA;AAAA,IACrF;AAAA;AAEX,CACF"}