@mx-cartographer/experiences 9.1.0-alpha.bb1 → 9.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +10 -10
  3. package/dist/Account-DR7Plrqy.mjs +119 -0
  4. package/dist/Account-DR7Plrqy.mjs.map +1 -0
  5. package/dist/AccountDetailsDrawer-C1hhmlmI.mjs +922 -0
  6. package/dist/AccountDetailsDrawer-C1hhmlmI.mjs.map +1 -0
  7. package/dist/AccountDetailsHeader-BliEZhz7.mjs +230 -0
  8. package/dist/AccountDetailsHeader-BliEZhz7.mjs.map +1 -0
  9. package/dist/AccountUtils-Cbh8r9cP.mjs +29 -0
  10. package/dist/AccountUtils-Cbh8r9cP.mjs.map +1 -0
  11. package/dist/Analytics-CkYXKvco.mjs +54 -0
  12. package/dist/Analytics-CkYXKvco.mjs.map +1 -0
  13. package/dist/Analytics-WeZYytR0.mjs +140 -0
  14. package/dist/Analytics-WeZYytR0.mjs.map +1 -0
  15. package/dist/ApiEndpoints-DXwIYNUV.mjs +50 -0
  16. package/dist/ApiEndpoints-DXwIYNUV.mjs.map +1 -0
  17. package/dist/BeatMaterialIcon-1KOfRZrA.mjs +27 -0
  18. package/dist/BeatMaterialIcon-1KOfRZrA.mjs.map +1 -0
  19. package/dist/BudgetUtil-Bg2AQJpQ.mjs +75 -0
  20. package/dist/BudgetUtil-Bg2AQJpQ.mjs.map +1 -0
  21. package/dist/Category-DEKZGLYe.mjs +302 -0
  22. package/dist/Category-DEKZGLYe.mjs.map +1 -0
  23. package/dist/CategorySelectorDrawer-NJsFsKP1.mjs +431 -0
  24. package/dist/CategorySelectorDrawer-NJsFsKP1.mjs.map +1 -0
  25. package/dist/Connect-BH0Pt6zc.mjs +43 -0
  26. package/dist/Connect-BH0Pt6zc.mjs.map +1 -0
  27. package/dist/ConnectCard-D7uxoH5Y.mjs +55 -0
  28. package/dist/ConnectCard-D7uxoH5Y.mjs.map +1 -0
  29. package/dist/ConnectDrawer-CW4LA3H3.mjs +58 -0
  30. package/dist/ConnectDrawer-CW4LA3H3.mjs.map +1 -0
  31. package/dist/ConnectionsDrawer-CZU9ku-k.mjs +54 -0
  32. package/dist/ConnectionsDrawer-CZU9ku-k.mjs.map +1 -0
  33. package/dist/CurrencyDialog-DumQCTPO.mjs +374 -0
  34. package/dist/CurrencyDialog-DumQCTPO.mjs.map +1 -0
  35. package/dist/CurrencyInput-DaGEQaLW.mjs +88 -0
  36. package/dist/CurrencyInput-DaGEQaLW.mjs.map +1 -0
  37. package/dist/CurrencyText-CCbE6MmF.mjs +21 -0
  38. package/dist/CurrencyText-CCbE6MmF.mjs.map +1 -0
  39. package/dist/DateFormats-HudZ3Bjs.mjs +65 -0
  40. package/dist/DateFormats-HudZ3Bjs.mjs.map +1 -0
  41. package/dist/DateUtil-CzBmbjmA.mjs +75 -0
  42. package/dist/DateUtil-CzBmbjmA.mjs.map +1 -0
  43. package/dist/DebtUtils-i4pI2Uoe.mjs +154 -0
  44. package/dist/DebtUtils-i4pI2Uoe.mjs.map +1 -0
  45. package/dist/Dialog-Bvd2n8hz.mjs +67 -0
  46. package/dist/Dialog-Bvd2n8hz.mjs.map +1 -0
  47. package/dist/Donut-SzzfZDHF.mjs +89 -0
  48. package/dist/Donut-SzzfZDHF.mjs.map +1 -0
  49. package/dist/Drawer-DsnW2o0v.mjs +175 -0
  50. package/dist/Drawer-DsnW2o0v.mjs.map +1 -0
  51. package/dist/EmbeddedCard-DH8vQ3qN.mjs +859 -0
  52. package/dist/EmbeddedCard-DH8vQ3qN.mjs.map +1 -0
  53. package/dist/EmptyState-CJUDc3kD.mjs +85 -0
  54. package/dist/EmptyState-CJUDc3kD.mjs.map +1 -0
  55. package/dist/Error-Dtw6yxkf.mjs +85 -0
  56. package/dist/Error-Dtw6yxkf.mjs.map +1 -0
  57. package/dist/ErrorBoundary-CsdOcnJ9.mjs +24 -0
  58. package/dist/ErrorBoundary-CsdOcnJ9.mjs.map +1 -0
  59. package/dist/ExportCsvAction-C9KWH3Az.mjs +25 -0
  60. package/dist/ExportCsvAction-C9KWH3Az.mjs.map +1 -0
  61. package/dist/GlobalAccountFilter-BhzR5Vb1.mjs +230 -0
  62. package/dist/GlobalAccountFilter-BhzR5Vb1.mjs.map +1 -0
  63. package/dist/GlobalCopyApi-wcnDUzMV.mjs +129 -0
  64. package/dist/GlobalCopyApi-wcnDUzMV.mjs.map +1 -0
  65. package/dist/GoalsUtil-C9EnLWvC.mjs +108 -0
  66. package/dist/GoalsUtil-C9EnLWvC.mjs.map +1 -0
  67. package/dist/HeaderCell-P8w6CmfO.mjs +7 -0
  68. package/dist/HeaderCell-P8w6CmfO.mjs.map +1 -0
  69. package/dist/Help-CkQTjORd.mjs +300 -0
  70. package/dist/Help-CkQTjORd.mjs.map +1 -0
  71. package/dist/Help-aERwhajy.mjs +3210 -0
  72. package/dist/Help-aERwhajy.mjs.map +1 -0
  73. package/dist/IconBacking-DgT8DCeh.mjs +40 -0
  74. package/dist/IconBacking-DgT8DCeh.mjs.map +1 -0
  75. package/dist/InformationTooltip-4su8bn1e.mjs +42 -0
  76. package/dist/InformationTooltip-4su8bn1e.mjs.map +1 -0
  77. package/dist/InvestmentUtil-BItV7uEs.mjs +135 -0
  78. package/dist/InvestmentUtil-BItV7uEs.mjs.map +1 -0
  79. package/dist/LineChart-CUfiH86G.mjs +613 -0
  80. package/dist/LineChart-CUfiH86G.mjs.map +1 -0
  81. package/dist/ListItemAction-BqUCLj_w.mjs +70 -0
  82. package/dist/ListItemAction-BqUCLj_w.mjs.map +1 -0
  83. package/dist/ListItemRow-kH1rn8Xu.mjs +68 -0
  84. package/dist/ListItemRow-kH1rn8Xu.mjs.map +1 -0
  85. package/dist/ListItemWrapper-DRse79Iu.mjs +44 -0
  86. package/dist/ListItemWrapper-DRse79Iu.mjs.map +1 -0
  87. package/dist/Loader-CxeBwuPG.mjs +22 -0
  88. package/dist/Loader-CxeBwuPG.mjs.map +1 -0
  89. package/dist/Localization-DnoVyBNK.mjs +39 -0
  90. package/dist/Localization-DnoVyBNK.mjs.map +1 -0
  91. package/dist/ManageIncome-Be9WHv-s.mjs +906 -0
  92. package/dist/ManageIncome-Be9WHv-s.mjs.map +1 -0
  93. package/dist/MicroWidgetContainer-B2NnKBgW.mjs +46 -0
  94. package/dist/MicroWidgetContainer-B2NnKBgW.mjs.map +1 -0
  95. package/dist/MiniWidgetContainer-Bmv_WeUd.mjs +67 -0
  96. package/dist/MiniWidgetContainer-Bmv_WeUd.mjs.map +1 -0
  97. package/dist/NetWorthUtils-Dj7CgAg2.mjs +96 -0
  98. package/dist/NetWorthUtils-Dj7CgAg2.mjs.map +1 -0
  99. package/dist/Notification-DTNYSd8P.mjs +8 -0
  100. package/dist/Notification-DTNYSd8P.mjs.map +1 -0
  101. package/dist/NotificationSettings-CW7okUrk.mjs +678 -0
  102. package/dist/NotificationSettings-CW7okUrk.mjs.map +1 -0
  103. package/dist/NotificationUtils-BRGFTePr.mjs +24 -0
  104. package/dist/NotificationUtils-BRGFTePr.mjs.map +1 -0
  105. package/dist/NumberFormatting--XMeeBfr.mjs +50 -0
  106. package/dist/NumberFormatting--XMeeBfr.mjs.map +1 -0
  107. package/dist/OriginalBalanceAction-YrvxBYAl.mjs +115 -0
  108. package/dist/OriginalBalanceAction-YrvxBYAl.mjs.map +1 -0
  109. package/dist/RecurringSettings-kRqAViNn.mjs +89 -0
  110. package/dist/RecurringSettings-kRqAViNn.mjs.map +1 -0
  111. package/dist/RecurringTransactionsUtil-CHWmqvW5.mjs +299 -0
  112. package/dist/RecurringTransactionsUtil-CHWmqvW5.mjs.map +1 -0
  113. package/dist/ResponsiveButton-CC9F_Ezk.mjs +46 -0
  114. package/dist/ResponsiveButton-CC9F_Ezk.mjs.map +1 -0
  115. package/dist/SearchBox-Cpgu_gdO.mjs +51 -0
  116. package/dist/SearchBox-Cpgu_gdO.mjs.map +1 -0
  117. package/dist/Select-CSpkK5cR.mjs +62 -0
  118. package/dist/Select-CSpkK5cR.mjs.map +1 -0
  119. package/dist/SelectionBox-B4xELRgp.mjs +49 -0
  120. package/dist/SelectionBox-B4xELRgp.mjs.map +1 -0
  121. package/dist/SingleSegmentDonut-7Uy6VEld.mjs +70 -0
  122. package/dist/SingleSegmentDonut-7Uy6VEld.mjs.map +1 -0
  123. package/dist/Sizes-DISGrlUg.mjs +7 -0
  124. package/dist/Sizes-DISGrlUg.mjs.map +1 -0
  125. package/dist/SkeletonLoader-BaNboJjD.mjs +39 -0
  126. package/dist/SkeletonLoader-BaNboJjD.mjs.map +1 -0
  127. package/dist/SpendingData-Fii_xATx.mjs +54 -0
  128. package/dist/SpendingData-Fii_xATx.mjs.map +1 -0
  129. package/dist/SpendingLegend-CxvNOg3c.mjs +204 -0
  130. package/dist/SpendingLegend-CxvNOg3c.mjs.map +1 -0
  131. package/dist/StatusBar-CPfSXe80.mjs +31 -0
  132. package/dist/StatusBar-CPfSXe80.mjs.map +1 -0
  133. package/dist/TabContentContainer-B0eYJP5p.mjs +49 -0
  134. package/dist/TabContentContainer-B0eYJP5p.mjs.map +1 -0
  135. package/dist/ToggleListItem-Dl1lXNwj.mjs +92 -0
  136. package/dist/ToggleListItem-Dl1lXNwj.mjs.map +1 -0
  137. package/dist/TransactionDetails-roZ5xLq8.mjs +1708 -0
  138. package/dist/TransactionDetails-roZ5xLq8.mjs.map +1 -0
  139. package/dist/TransactionUtils-BphBJBbU.mjs +235 -0
  140. package/dist/TransactionUtils-BphBJBbU.mjs.map +1 -0
  141. package/dist/TrendsUtil-D9z3kIj_.mjs +70 -0
  142. package/dist/TrendsUtil-D9z3kIj_.mjs.map +1 -0
  143. package/dist/UserStore-BjnNCO5a.mjs +3121 -0
  144. package/dist/UserStore-BjnNCO5a.mjs.map +1 -0
  145. package/dist/ViewMoreMicroCard-fnwE0hqd.mjs +1280 -0
  146. package/dist/ViewMoreMicroCard-fnwE0hqd.mjs.map +1 -0
  147. package/dist/WidgetContainer-DJnp6t6c.mjs +483 -0
  148. package/dist/WidgetContainer-DJnp6t6c.mjs.map +1 -0
  149. package/dist/accounts/components/detailsdrawer/Accounts/AccountDetailsDrawer.d.ts +6 -0
  150. package/dist/accounts/index.d.ts +1 -0
  151. package/dist/accounts/index.es.js +784 -12
  152. package/dist/accounts/index.es.js.map +1 -0
  153. package/dist/analytics/index.es.js +140 -155
  154. package/dist/analytics/index.es.js.map +1 -0
  155. package/dist/budgets/index.es.js +1267 -1317
  156. package/dist/budgets/index.es.js.map +1 -0
  157. package/dist/cashflow/context/hooks.d.ts +7 -6
  158. package/dist/cashflow/index.es.js +944 -1076
  159. package/dist/cashflow/index.es.js.map +1 -0
  160. package/dist/categories/index.es.js +5 -4
  161. package/dist/categories/index.es.js.map +1 -0
  162. package/dist/common/components/DataRow.d.ts +1 -0
  163. package/dist/common/components/ListItemWrapper.d.ts +2 -1
  164. package/dist/common/constants/Analytics.d.ts +3 -0
  165. package/dist/common/index.es.js +310 -101
  166. package/dist/common/index.es.js.map +1 -0
  167. package/dist/core/index.es.js +105 -80
  168. package/dist/core/index.es.js.map +1 -0
  169. package/dist/core/stores/CashflowStore.d.ts +8 -7
  170. package/dist/core/stores/RecurringTransactionsStore.d.ts +53 -1
  171. package/dist/core/stores/TransactionStore.d.ts +1 -0
  172. package/dist/core/types/localization/RecurringCopy.d.ts +14 -1
  173. package/dist/core/types/localization/SpendingCopy.d.ts +1 -0
  174. package/dist/core/utils/AccountUtils.d.ts +8 -0
  175. package/dist/core/utils/DateUtil.d.ts +2 -0
  176. package/dist/core/utils/RecurringTransactionsUtil.d.ts +2 -1
  177. package/dist/dashboard/index.es.js +142 -185
  178. package/dist/dashboard/index.es.js.map +1 -0
  179. package/dist/debts/index.es.js +1273 -1384
  180. package/dist/debts/index.es.js.map +1 -0
  181. package/dist/finstrong/index.es.js +3473 -3367
  182. package/dist/finstrong/index.es.js.map +1 -0
  183. package/dist/goals/index.es.js +984 -1103
  184. package/dist/goals/index.es.js.map +1 -0
  185. package/dist/help/index.es.js +26 -3
  186. package/dist/help/index.es.js.map +1 -0
  187. package/dist/hooks-97sNJ_lf.mjs +78 -0
  188. package/dist/hooks-97sNJ_lf.mjs.map +1 -0
  189. package/dist/insights/components/insights/WeeklyNoSpendDays/BubbleWeek.d.ts +4 -1
  190. package/dist/insights/components/insights/WeeklyNoSpendDays/WeeklyNoSpendDays.d.ts +4 -2
  191. package/dist/insights/index.es.js +4871 -93
  192. package/dist/insights/index.es.js.map +1 -0
  193. package/dist/investments/index.es.js +1523 -1533
  194. package/dist/investments/index.es.js.map +1 -0
  195. package/dist/merchants/index.es.js +65 -75
  196. package/dist/merchants/index.es.js.map +1 -0
  197. package/dist/microinsights/index.es.js +826 -15
  198. package/dist/microinsights/index.es.js.map +1 -0
  199. package/dist/networth/index.es.js +504 -550
  200. package/dist/networth/index.es.js.map +1 -0
  201. package/dist/notifications/index.es.js +162 -169
  202. package/dist/notifications/index.es.js.map +1 -0
  203. package/dist/recurringtransactions/components/RecurringTransactionDetails.d.ts +3 -2
  204. package/dist/recurringtransactions/components/RecurringTransactionDetailsDrawer.d.ts +3 -0
  205. package/dist/recurringtransactions/components/RecurringTransactionList.d.ts +11 -0
  206. package/dist/recurringtransactions/components/UpcomingRecurrenceCard.d.ts +8 -0
  207. package/dist/recurringtransactions/components/actions/LinkTransactionDrawer.d.ts +10 -0
  208. package/dist/recurringtransactions/components/actions/MarkAsPaidDialog.d.ts +7 -0
  209. package/dist/recurringtransactions/components/actions/MarkAsUnpaidDialog.d.ts +7 -0
  210. package/dist/recurringtransactions/index.es.js +1012 -10
  211. package/dist/recurringtransactions/index.es.js.map +1 -0
  212. package/dist/settings/index.es.js +892 -13
  213. package/dist/settings/index.es.js.map +1 -0
  214. package/dist/spending/index.es.js +457 -400
  215. package/dist/spending/index.es.js.map +1 -0
  216. package/dist/transactions/components/shared/transactionlist/TransactionRow.d.ts +1 -0
  217. package/dist/transactions/index.es.js +604 -10
  218. package/dist/transactions/index.es.js.map +1 -0
  219. package/dist/trends/index.es.js +1408 -1268
  220. package/dist/trends/index.es.js.map +1 -0
  221. package/dist/useAccountDisplayName-BsiXA0qf.mjs +24 -0
  222. package/dist/useAccountDisplayName-BsiXA0qf.mjs.map +1 -0
  223. package/dist/useAriaLive-MkYebyUR.mjs +36 -0
  224. package/dist/useAriaLive-MkYebyUR.mjs.map +1 -0
  225. package/dist/useDimensions-CeDR9V8N.mjs +37 -0
  226. package/dist/useDimensions-CeDR9V8N.mjs.map +1 -0
  227. package/dist/useInsightsEnabled-D5Sdm0TJ.mjs +12 -0
  228. package/dist/useInsightsEnabled-D5Sdm0TJ.mjs.map +1 -0
  229. package/dist/useScreenSize-mWpmnh5w.mjs +37 -0
  230. package/dist/useScreenSize-mWpmnh5w.mjs.map +1 -0
  231. package/dist/useWidgetLoadTimer-B0tB-yzL.mjs +20 -0
  232. package/dist/useWidgetLoadTimer-B0tB-yzL.mjs.map +1 -0
  233. package/package.json +30 -30
  234. package/dist/Analytics-BKzTPees.mjs +0 -61
  235. package/dist/GlobalCopyApi-BeXzaDH9.mjs +0 -487
  236. package/dist/HeaderCell-EhCUSjvj.mjs +0 -10
  237. package/dist/Loader-BlVzRtUd.mjs +0 -73
  238. package/dist/MiniWidgetContainer-COwnjfy7.mjs +0 -110
  239. package/dist/OriginalBalanceAction-sbiqaxok.mjs +0 -110
  240. package/dist/SpendingLegend-D15ixlQ1.mjs +0 -222
  241. package/dist/accounts-DkyAiLpg.mjs +0 -15632
  242. package/dist/core-BexP5oiV.mjs +0 -4047
  243. package/dist/help-CctDYrAH.mjs +0 -2308
  244. package/dist/insights/components/insights/P2pCategorization/_tests_/P2pCategorizationMultipleTransaction.test.d.ts +0 -0
  245. package/dist/insights/components/insights/P2pCategorization/_tests_/P2pCategorizationSingleTransaction.test.d.ts +0 -0
  246. package/dist/microinsights-CRf3ChsJ.mjs +0 -1814
  247. package/dist/recurringtransactions-gbJ_NA8u.mjs +0 -1564
  248. package/dist/settings-ZMHe439l.mjs +0 -1526
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.es.js","sources":["../../src/budgets/components/addbudget/Header.tsx","../../src/budgets/components/addbudget/RecalculateBudgetRow.tsx","../../src/budgets/components/addbudget/RecalculateBudgets.tsx","../../src/budgets/components/shared/BudgetAmount.tsx","../../src/budgets/components/addbudget/UnbudgetedRow.tsx","../../src/budgets/components/AddBudgets.tsx","../../src/budgets/utils/BubblesSVG.ts","../../src/budgets/components/bubblechart/Mercury.tsx","../../src/budgets/components/bubblechart/Bubble.tsx","../../src/budgets/components/BubbleChart.tsx","../../src/budgets/components/BudgetsEmptyState.tsx","../../src/budgets/components/BubbleBudgets.tsx","../../src/budgets/components/budgetdetails/Header.tsx","../../src/budgets/components/budgetlist/SubBudgetZeroState.tsx","../../src/budgets/components/budgetlist/SubBudgetRow.tsx","../../src/budgets/components/budgetdetails/AddSubBudget.tsx","../../src/budgets/components/budgetdetails/SubBudgetList.tsx","../../src/budgets/components/budgetdetails/BudgetDetails.tsx","../../src/budgets/components/BudgetDetailsDrawer.tsx","../../src/budgets/components/budgetlist/BudgetRow.tsx","../../src/budgets/components/BudgetList.tsx","../../src/budgets/components/Overview.tsx","../../src/budgets/BubbleBudgetsWidget.tsx","../../src/budgets/BubbleBudgetsMiniWidget.tsx","../../src/budgets/components/BudgetDetailsDrawerV2.tsx"],"sourcesContent":["import { observer } from 'mobx-react-lite'\n\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@mxenabled/mxui'\n\nimport { useBudgetsStore, useGlobalCopyStore, useRecurringTransactionsStore } from '../../../common'\nimport { formatCurrency } from '../../../core/utils/NumberFormatting'\n\nexport const Header = observer(() => {\n const { budgets: copy } = useGlobalCopyStore()\n const { totalBudgeted } = useBudgetsStore()\n const { incomeTotal } = useRecurringTransactionsStore()\n\n const remaining = incomeTotal - totalBudgeted\n\n return (\n <Stack direction=\"row\" justifyContent=\"center\" my={16} spacing={20}>\n <Stack alignItems=\"center\">\n <Text bold={true} variant=\"body1\">\n {formatCurrency(incomeTotal, '0,0')}\n </Text>\n <Text color=\"secondary\" variant=\"body2\">\n {copy.projected_income}\n </Text>\n </Stack>\n\n <Text bold={true} justifyContent=\"center\" variant=\"body1\">\n {'-'}\n </Text>\n\n <Stack alignItems=\"center\">\n <Text bold={true} variant=\"body1\">\n {formatCurrency(totalBudgeted, '0,0')}\n </Text>\n <Text color=\"secondary\" variant=\"body2\">\n {copy.budgeted}\n </Text>\n </Stack>\n\n <Text bold={true} justifyContent=\"center\" variant=\"body1\">\n {'='}\n </Text>\n\n <Stack alignItems=\"center\">\n <Text bold={true} variant=\"body1\">\n {formatCurrency(remaining, '0,0')}\n </Text>\n <Text color=\"secondary\" variant=\"body2\">\n {copy.remaining}\n </Text>\n </Stack>\n </Stack>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Divider from '@mui/material/Divider'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\n\nimport { CategoryIcon } from '@mxenabled/mxui'\n\nimport { useBudgetsStore, useGlobalCopyStore } from '../../../common'\nimport { type DetailedCategory } from '../../../core'\nimport { formatCurrency } from '../../../core/utils/NumberFormatting'\nimport { buildDynamicCopy } from '../../../core/utils/Localization'\n\ninterface RecalculateBudgetRowProps {\n category: DetailedCategory\n}\n\nexport const RecalculateBudgetRow: React.FC<RecalculateBudgetRowProps> = observer(\n ({ category }) => {\n const { budgets: copy } = useGlobalCopyStore()\n const { budgets } = useBudgetsStore()\n\n const secondaryText = React.useMemo(() => {\n const budget = budgets.find((b) => b.category_guid === category.guid)\n const part1 = formatCurrency(category.totalAverageAmount, '0,0')\n const part2 = budget\n ? buildDynamicCopy(copy.recalculate_previous_budget, formatCurrency(budget.amount, '0,0'))\n : copy.recalculate_new_budget\n\n return `${part1} - ${part2}`\n }, [copy, budgets])\n\n return (\n <React.Fragment key={category.guid}>\n <ListItem>\n <ListItemButton>\n <ListItemAvatar>\n <CategoryIcon categoryGuid={category.guid} variant=\"filled\" />\n </ListItemAvatar>\n <ListItemText primary={category.name} secondary={secondaryText} />\n </ListItemButton>\n </ListItem>\n <Divider />\n </React.Fragment>\n )\n },\n)\n","import React from 'react'\n\nimport Button from '@mui/material/Button'\nimport List from '@mui/material/List'\nimport Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@mxenabled/mxui'\n\nimport { Drawer, useBudgetsStore, useCategoryStore, useGlobalCopyStore } from '../../../common'\n\nimport { RecalculateBudgetRow } from './RecalculateBudgetRow'\n\ninterface RecalculateBudgetsProps {\n onRecalculateBudgets?: () => void\n}\n\nexport const RecalculateBudgets = ({ onRecalculateBudgets }: RecalculateBudgetsProps) => {\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n const { spendCategories } = useCategoryStore()\n const { recalculateBudgets, setAlert } = useBudgetsStore()\n\n const [isOpen, setIsOpen] = React.useState(false)\n\n const newBudgetCategories = spendCategories.filter((category) => category.totalAverageAmount > 0)\n\n const handlePrimaryClick = async () => {\n await recalculateBudgets(newBudgetCategories)\n\n setIsOpen(false)\n setAlert(copy.alert_recalculated_budgets)\n onRecalculateBudgets?.()\n }\n\n return (\n <React.Fragment>\n <Button onClick={() => setIsOpen(true)} sx={{ mt: 24, mx: 24 }} variant=\"text\">\n {copy.recalculate_button}\n </Button>\n\n <Text sx={{ mx: 24, my: 16, textAlign: 'center' }} variant=\"subtitle1\">\n {copy.recalculate_help}\n </Text>\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n onPrimaryAction={handlePrimaryClick}\n title={copy.recalculate_title}\n >\n <Stack>\n <Stack mx={24} my={16}>\n <Text bold={true} variant=\"body1\">\n {copy.recalculate_description_top}\n </Text>\n <Text variant=\"subtitle2\">{copy.recalculate_description_bottom}</Text>\n </Stack>\n <Box bgcolor=\"background.paper\">\n <List>\n {newBudgetCategories.map((category) => (\n <RecalculateBudgetRow category={category} key={category.guid} />\n ))}\n </List>\n </Box>\n </Stack>\n </Drawer>\n </React.Fragment>\n )\n}\n","import React from 'react'\n\nimport Stack from '@mui/material/Stack'\nimport { Text } from '@mxenabled/mxui'\nimport {\n CurrencyInput,\n useBudgetsStore,\n useGlobalCopyStore,\n useRecurringTransactionsStore,\n} from '../../../common'\nimport { formatCurrency } from '../../../core/utils/NumberFormatting'\nimport { buildDynamicCopy } from '../../../core/utils/Localization'\n\ninterface BudgetAmountProps {\n amount: string\n categoryName: string\n onAmountChanged: (amount: string) => void\n}\n\nexport const BudgetAmount: React.FC<BudgetAmountProps> = ({\n amount,\n categoryName,\n onAmountChanged,\n}) => {\n const { budgets: copy } = useGlobalCopyStore()\n const { totalBudgeted } = useBudgetsStore()\n const { incomeTotal } = useRecurringTransactionsStore()\n\n const unbudgetedIncome = incomeTotal - totalBudgeted\n\n return (\n <Stack gap={16}>\n <Stack>\n <Text>\n {\n buildDynamicCopy(\n copy.add_description_top,\n formatCurrency(unbudgetedIncome, '0,0'),\n ) as string\n }\n </Text>\n <Text>{buildDynamicCopy(copy.add_description_bottom, categoryName) as string}</Text>\n </Stack>\n <CurrencyInput\n amount={amount}\n autoFocus={true}\n label={copy.add_label}\n minAmount={0}\n setAmount={onAmountChanged}\n sx={{ '.MuiTypography-body1': { p: 0 } }}\n />\n </Stack>\n )\n}\n","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 ListItemSecondaryAction from '@mui/material/ListItemSecondaryAction'\nimport ListItemText from '@mui/material/ListItemText'\n\nimport { CategoryIcon, Icon } from '@mxenabled/mxui'\n\nimport { Dialog, useGlobalCopyStore } from '../../../common'\nimport { type DetailedCategory } from '../../../core'\n\nimport { BudgetAmount } from '../shared/BudgetAmount'\nimport { formatCurrency } from '../../../core/utils/NumberFormatting'\n\ninterface UnbudgetedRowProps {\n category: DetailedCategory\n onAddBudget: (category: DetailedCategory, amount: number) => void\n}\n\nexport const UnbudgetedRow: React.FC<UnbudgetedRowProps> = observer(({ category, onAddBudget }) => {\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n\n const [isAddBudgetOpen, setIsAddBudgetOpen] = React.useState(false)\n const [amount, setAmount] = React.useState(\n `${category.totalAmount === 0 ? '' : category.totalAmount}`,\n )\n\n return (\n <React.Fragment>\n <ListItem key={category.guid}>\n <ListItemButton onClick={() => setIsAddBudgetOpen(true)}>\n <ListItemAvatar>\n <CategoryIcon categoryGuid={category.guid} />\n </ListItemAvatar>\n <ListItemText\n primary={category.name}\n secondary={formatCurrency(category.totalAmount, '0,0')}\n />\n <ListItemSecondaryAction>\n <Icon name=\"add\" size={20} />\n </ListItemSecondaryAction>\n </ListItemButton>\n </ListItem>\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.add_title }}\n disablePrimaryButton={Number(amount) <= 0}\n isOpen={isAddBudgetOpen}\n onClose={() => setIsAddBudgetOpen(false)}\n onPrimaryAction={() => onAddBudget(category, Number(amount))}\n primaryText={copy.add_save_button}\n >\n <BudgetAmount amount={amount} categoryName={category.name} onAmountChanged={setAmount} />\n </Dialog>\n </React.Fragment>\n )\n})\n","import { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport List from '@mui/material/List'\nimport Stack from '@mui/material/Stack'\n\nimport { useBudgetsStore, useGlobalCopyStore } from '../../common'\nimport { type DetailedCategory } from '../../core'\n\nimport { Header } from './addbudget/Header'\nimport { RecalculateBudgets } from './addbudget/RecalculateBudgets'\nimport { UnbudgetedRow } from './addbudget/UnbudgetedRow'\nimport { buildDynamicCopy } from '../../core/utils/Localization'\n\ninterface AddBudgetsProps {\n onAddBudget?: () => void\n onRecalculateBudgets?: () => void\n}\n\nexport const AddBudgets = observer(({ onAddBudget, onRecalculateBudgets }: AddBudgetsProps) => {\n const { budgets: copy } = useGlobalCopyStore()\n const { addBudget, setAlert, unbudgetedCategories } = useBudgetsStore()\n\n const handleOnAddBudget = async (category: DetailedCategory, amount: number) => {\n await addBudget(category, amount)\n onAddBudget?.()\n setAlert(buildDynamicCopy(copy.alert_budget_created, category.name) as string)\n }\n\n return (\n <Stack>\n <Header />\n\n <Box bgcolor=\"background.paper\">\n <List>\n {unbudgetedCategories.map((category) => (\n <UnbudgetedRow\n category={category}\n key={category.guid}\n onAddBudget={handleOnAddBudget}\n />\n ))}\n </List>\n </Box>\n\n <RecalculateBudgets onRecalculateBudgets={onRecalculateBudgets} />\n </Stack>\n )\n})\n","import * as d3 from 'd3'\n\nimport type { Simulation } from 'd3'\n\nimport { type BubbleData } from '../components/BubbleChart'\nimport { DetailedBudget } from '../../core'\n\n// D3 SVG Types\nexport type SimulationType = Simulation<BubbleData, undefined>\n\nconst PROGRESS_INDICATOR_SIZE = 5\nconst MAX_BUBBLE_RADIUS = 100\nconst MIN_BUBBLE_RADIUS = 25\n\n/**\n * Enables dragging of bubbles\n * @param simulation D3 Simulation\n */\nexport const drag = (simulation: SimulationType) => {\n const dragStarted = (event: any) => {\n if (!event.active) simulation.alphaTarget(0.3).restart()\n event.subject.fx = event.subject.x\n event.subject.fy = event.subject.y\n }\n\n const dragged = (event: any) => {\n event.subject.fx = event.x\n event.subject.fy = event.y\n }\n\n const dragEnded = (event: any) => {\n if (!event.active) simulation.alphaTarget(0)\n event.subject.fx = null\n event.subject.fy = null\n }\n return d3.drag().on('start', dragStarted).on('drag', dragged).on('end', dragEnded)\n}\n\n/**\n * Provide d values for the arc between the start and end radius based on time\n * @param bubble Bubble data\n */\nexport const arcTween = (bubble: BubbleData) => {\n // Percentage of the budget\n let p = bubble.transaction_total / bubble.amount\n if (p < 0) p = 0\n else if (p > 1) p = 1\n\n // End angle for the progress status\n const angle = p * 2 * Math.PI\n // Interpolate values between 0 and the end angle\n const interpolate = d3.interpolate(0, angle)\n // Progress arc starting at 0\n const arc = d3\n .arc<BubbleData>()\n .cornerRadius(5)\n .innerRadius(bubble.radius - PROGRESS_INDICATOR_SIZE * 2)\n .outerRadius(bubble.radius - PROGRESS_INDICATOR_SIZE)\n .startAngle(0)\n .endAngle(0)\n\n return (t: number) => {\n // assign end angle to interpolated value for t\n arc.endAngle(interpolate(t))\n // call arc and return intermediate `d` value\n return arc(bubble) || ''\n }\n}\n\n/**\n * Enable drag\n * @param simulation D3 Simulation\n */\nexport const enableDrag = (simulation: SimulationType) => {\n d3.selectAll('.bubble').call(drag(simulation) as any)\n}\n\n/**\n * Clamps a number between a minimum and maximum value.\n *\n * @param value - The number to be clamped.\n * @param min - The minimum allowable value.\n * @param max - The maximum allowable value.\n * @returns The clamped value within the range [min, max].\n */\nconst clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), max)\n\n/**\n * Update location after a resize\n * @param simulation D3 Simulation\n * @param height New height\n * @param width New width\n */\nexport const resize = (simulation: SimulationType, height: number, width: number) => {\n simulation\n .alpha(1)\n .restart()\n .force(\n 'x',\n d3\n .forceX()\n .x(width / 2)\n .strength(0.01),\n )\n .force(\n 'y',\n d3\n .forceY()\n .y(height / 2)\n .strength(0.02),\n )\n .on('tick', () => {\n const nodes = simulation.nodes()\n\n nodes.forEach((node: BubbleData) => {\n const radius = node.radius ?? MIN_BUBBLE_RADIUS\n\n node.x = clamp(node.x ?? 0, radius, width - radius)\n node.y = clamp(node.y ?? 0, radius, height - radius)\n })\n\n d3.selectAll('.bubble')\n .data(nodes)\n .attr('transform', (d: BubbleData) => `translate(${d.x},${d.y})`)\n })\n}\n\nexport const getScale = (min: number, max: number) => {\n return d3.scaleLinear().domain([min, max]).range([MIN_BUBBLE_RADIUS, MAX_BUBBLE_RADIUS])\n}\n\n/**\n * Simulates the chart\n * @param budgets Budget data\n */\nexport const simulate = (budgets: DetailedBudget[]) => {\n const maxValue = budgets.reduce((acc, budget) => {\n const max = Math.max(budget.transaction_total, budget.amount)\n return max > acc ? max : acc\n }, 0)\n\n const minValue = budgets.reduce((acc, budget) => {\n const max = Math.max(budget.transaction_total, budget.amount)\n return max < acc ? max : acc\n }, maxValue)\n\n const scale = getScale(minValue, maxValue)\n\n const bubbles = budgets.map((budget) => {\n const radius = scale(Math.max(budget.transaction_total, budget.amount)) || 25\n\n return {\n ...budget,\n radius,\n } as BubbleData\n })\n\n return d3\n .forceSimulation<BubbleData>(bubbles)\n .velocityDecay(0.05)\n .force('collide', d3.forceCollide<BubbleData>((d) => d.radius + 2).strength(0.7))\n}\n\n/**\n * Calculate the target radius based on the number of bubbles and container size\n * @param count Number of bubbles\n * @param height Height of the container\n * @param width Width of the container\n * @returns An object containing the target minimum and maximum radius\n */\nconst getTargetRadius = (bubbleCount: number, containerHeight: number, containerWidth: number) => {\n const minBubbleArea = Math.PI * MIN_BUBBLE_RADIUS ** 2\n const totalMinBubbleArea = minBubbleArea * bubbleCount\n\n const isSmallContainer = containerWidth < 400 || containerHeight < 300\n const padding = isSmallContainer ? 40 : 20\n const usableWidth = Math.max(100, containerWidth - padding)\n const usableHeight = Math.max(100, containerHeight - padding)\n const usableArea = usableWidth * usableHeight\n\n let maxRadius = MIN_BUBBLE_RADIUS\n\n if (totalMinBubbleArea < usableArea) {\n const radiusFromArea = Math.sqrt(usableArea / (bubbleCount * Math.PI))\n const radiusFromDimensions = Math.min(usableWidth, usableHeight) / 4\n\n maxRadius = Math.min(MAX_BUBBLE_RADIUS, radiusFromArea, radiusFromDimensions)\n }\n\n if (isSmallContainer && bubbleCount <= 3) {\n maxRadius = Math.min(maxRadius, 45)\n }\n\n const minRadius = Math.max(20, maxRadius * 0.6)\n\n return { minRadius, maxRadius }\n}\n\n/* @param count Number of bubbles\n * @param height Height of the container\n * @param maxValue Maximum value for the scale\n * @param minValue Minimum value for the scale\n * @param width Width of the container\n * @returns A D3 linear scale for bubble radius\n */\nexport const getSmartScale = (\n count: number,\n height: number,\n maxValue: number,\n minValue: number,\n width: number,\n) => {\n const { maxRadius, minRadius } = getTargetRadius(count, height, width)\n\n return d3.scaleLinear().domain([minValue, maxValue]).range([minRadius, maxRadius])\n}\n\nexport const computeScaledNodes = (\n nodes: BubbleData[],\n budgets: DetailedBudget[],\n isCompact: boolean = false,\n height: number,\n width: number,\n) => {\n const values = budgets.map((b) => Math.max(b.transaction_total, b.amount))\n const min = Math.min(...values)\n const max = Math.max(...values)\n\n const scale = isCompact\n ? getSmartScale(nodes.length, height, max, min, width)\n : getScale(min, max)\n\n return nodes.map((node) => ({\n ...node,\n radius: scale(Math.max(node.transaction_total, node.amount)),\n }))\n}\n","import React from 'react'\nimport * as d3 from 'd3'\n\nimport { useTheme } from '@mui/material/styles'\n\nimport { arcTween } from '../../utils/BubblesSVG'\n\nimport type { BubbleData } from '../BubbleChart'\n\nconst PROGRESS_INDICATOR_SIZE = 5\nconst PROGRESS_DURATION = 2000\n\ninterface MercuryProps {\n bubble: BubbleData\n}\n\nconst Mercury = ({ bubble }: MercuryProps) => {\n const theme = useTheme()\n const {\n amount,\n guid,\n budgetColors: { mercury },\n radius,\n transaction_total,\n } = bubble\n\n const bubbleId = `mercury-${guid}`\n\n React.useEffect(() => {\n // Remove previous status arc\n d3.select(`.${bubbleId}`).selectAll('.status').remove()\n\n // Append updated status arc\n d3.select(`.${bubbleId}`)\n .append('path')\n .transition()\n .duration(PROGRESS_DURATION)\n .delay(0)\n .attr('class', 'status')\n .attr('style', `fill: ${mercury}; fill-opacity: 1;`)\n .attrTween('d', () => arcTween(bubble))\n }, [amount, radius, transaction_total])\n\n const trackArc = d3\n .arc<number>()\n .innerRadius((radius: number) => radius - 2 * PROGRESS_INDICATOR_SIZE)\n .outerRadius((radius: number) => radius - PROGRESS_INDICATOR_SIZE)\n .startAngle(0)\n .endAngle(2 * Math.PI)\n\n return (\n <g className={bubbleId}>\n <path\n d={trackArc(radius) || ''}\n style={{ fill: theme.palette.common.white, fillOpacity: 0.35 }}\n />\n </g>\n )\n}\n\nexport default React.memo(Mercury)\n","import React from 'react'\n\nimport Tooltip from '@mui/material/Tooltip'\nimport { useTheme } from '@mui/material/styles'\n\nimport { Icon, Text } from '@mxenabled/mxui'\n\nimport Mercury from './Mercury'\n\nimport { useWidgetContainerProvider } from '../../../common'\nimport { type DetailedBudget } from '../../../core'\nimport type { BubbleData } from '../BubbleChart'\n\nconst LARGE_THRESHOLD = 75\nconst MEDIUM_THRESHOLD = 50\n\ninterface BubbleProps {\n bubble: BubbleData\n isDraggable: boolean\n onClick?: (budget: DetailedBudget) => void\n}\n\nexport function Bubble({ bubble, isDraggable, onClick = () => {} }: BubbleProps) {\n const [showTooltip, setShowTooltip] = React.useState(false)\n const theme = useTheme()\n\n const { availableWidth } = useWidgetContainerProvider()\n\n const budgetBubble = React.useMemo(() => {\n if (!bubble) return undefined\n return {\n amount: bubble.amount,\n budgetColors: bubble.budgetColors,\n guid: bubble.guid,\n radius: bubble.radius,\n transaction_total: bubble.transaction_total,\n }\n }, [bubble.amount, bubble.budgetColors, bubble.guid, bubble.radius, bubble.transaction_total])\n\n if (!bubble) return undefined\n\n const {\n budgetColors: { background, text: textColor },\n category: { icon, name },\n guid,\n description,\n radius,\n x,\n y,\n } = bubble\n\n const defaultSvgOffset = availableWidth < 400 ? -8 : -12\n\n let iconX = defaultSvgOffset\n let iconY = defaultSvgOffset\n\n if (radius > LARGE_THRESHOLD) {\n iconX = -14\n iconY = -45\n } else if (radius > MEDIUM_THRESHOLD) {\n iconY = -32\n }\n\n let iconDimension = 32\n\n if (radius <= LARGE_THRESHOLD) {\n iconDimension = availableWidth < 400 ? 16 : 24\n }\n\n const tooltipText = `${bubble.category.name}: ${description}`\n const tooltipPopperSlot = {\n modifiers: [\n {\n name: 'offset',\n options: { offset: [0, 15] },\n },\n ],\n }\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n onClick(bubble)\n }\n }\n\n const handleFocus = () => {\n setShowTooltip(true)\n }\n\n const handleBlur = () => {\n setShowTooltip(false)\n }\n\n return (\n <g\n aria-label={`${name} - ${description}`}\n className=\"bubble\"\n id={`bubble-${guid}`}\n key={guid}\n onBlur={handleBlur}\n onClick={() => onClick(bubble)}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n onMouseEnter={() => setShowTooltip(true)}\n onMouseLeave={() => setShowTooltip(false)}\n role=\"button\"\n style={{ cursor: isDraggable ? 'pointer' : 'default', touchAction: 'manipulation' }}\n tabIndex={0}\n textAnchor=\"middle\"\n x={x}\n y={y}\n >\n <style>\n {`\n .bubble:focus,\n .bubble:focus-visible {\n outline: none;\n }\n .bubble:focus circle,\n .bubble:focus-visible circle {\n stroke: ${theme.palette.primary.main};\n stroke-width: 3;\n stroke-opacity: 0.8;\n }\n `}\n </style>\n <Tooltip open={showTooltip} slotProps={{ popper: tooltipPopperSlot }} title={tooltipText}>\n <circle fill={background} id={`circle-${guid}`} r={radius} />\n </Tooltip>\n\n <svg x={iconX} y={iconY}>\n <Icon name={icon} size={iconDimension} sx={{ fill: textColor }} />\n </svg>\n\n {radius > LARGE_THRESHOLD && (\n <Text\n bold={true}\n component=\"text\"\n id={`budget-category-${guid}`}\n sx={{ fill: textColor }}\n variant=\"body2\"\n /* @ts-expect-error Property doesn't exist on type */\n y={4}\n >\n {name}\n </Text>\n )}\n\n {radius > MEDIUM_THRESHOLD && (\n <Text\n bold={true}\n component=\"text\"\n id={`budget-description-${guid}-1`}\n sx={{ fill: textColor }}\n variant=\"body1\"\n /* @ts-expect-error Property doesn't exist on type */\n y={radius <= LARGE_THRESHOLD ? 12 : 24}\n >\n {radius <= LARGE_THRESHOLD ? description.split(' ')[0] : description}\n </Text>\n )}\n\n {radius <= LARGE_THRESHOLD && radius > MEDIUM_THRESHOLD && (\n <Text\n component=\"text\"\n id={`budget-description-${guid}-2`}\n sx={{ fill: textColor }}\n variant=\"caption\"\n /* @ts-expect-error Property doesn't exist on type */\n y={28}\n >\n {description.split(' ')[1]}\n </Text>\n )}\n\n <Mercury bubble={budgetBubble as BubbleData} />\n </g>\n )\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { SimulationNodeDatum } from 'd3-force'\n\nimport { useBudgetsStore } from '../../common'\nimport { type DetailedBudget } from '../../core'\n\nimport {\n computeScaledNodes,\n enableDrag,\n resize,\n simulate,\n type SimulationType,\n} from '../utils/BubblesSVG'\n\nimport { Bubble } from './bubblechart/Bubble'\n\nexport interface BubbleData extends DetailedBudget, SimulationNodeDatum {\n radius: number\n}\n\ninterface BubbleChartProps {\n height: number\n width: number\n isDraggable?: boolean\n onClick?: (budget: DetailedBudget) => void\n}\n\nconst BubbleChart: React.FC<BubbleChartProps> = ({\n height,\n width,\n isDraggable = false,\n onClick = () => {},\n}) => {\n const [simulationNodes, setSimulationNodes] = React.useState<BubbleData[]>([])\n\n const simulationRef = React.useRef<SimulationType | null>(null)\n const dragEnabledRef = React.useRef<boolean>(false)\n\n const { detailedBudgets: budgets } = useBudgetsStore()\n\n const updateSimulation = React.useCallback(() => {\n const previousSimulation = simulationRef.current\n const currentSimulation = simulate(budgets)\n const currentNodes = currentSimulation.nodes()\n\n if (previousSimulation) {\n const previousNodes = previousSimulation.nodes()\n const previousNodesMap = new Map(previousNodes.map((node) => [node.guid, node]))\n\n currentNodes.forEach((node) => {\n const previousNode = previousNodesMap.get(node.guid)\n if (previousNode) {\n Object.assign(node, {\n vx: previousNode.vx,\n vy: previousNode.vy,\n x: previousNode.x,\n y: previousNode.y,\n })\n }\n })\n }\n\n simulationRef.current = currentSimulation\n dragEnabledRef.current = false\n setSimulationNodes(currentNodes)\n }, [budgets])\n\n React.useEffect(() => {\n updateSimulation()\n }, [updateSimulation])\n\n React.useEffect(() => {\n return () => {\n if (simulationRef.current) {\n simulationRef.current.stop()\n simulationRef.current = null\n }\n }\n }, [])\n\n React.useEffect(() => {\n const simulation = simulationRef.current\n if (!simulation) return\n\n const nodes = simulation.nodes()\n const isCompact = (width > 0 && width < 450) || (height > 0 && height < 300)\n\n const updatedNodes = computeScaledNodes(nodes, budgets, isCompact, height, width)\n simulation.nodes(updatedNodes)\n resize(simulation, height, width)\n\n if (isDraggable) {\n setTimeout(() => {\n enableDrag(simulation)\n }, 0)\n }\n\n setSimulationNodes([...updatedNodes])\n }, [height, width, isDraggable, budgets])\n\n return (\n <svg\n height={height}\n style={{ overflow: 'visible', touchAction: 'manipulation' }}\n width={Math.abs(width)}\n >\n {simulationNodes.map((bubble) => (\n <Bubble bubble={bubble} isDraggable={isDraggable} key={bubble.guid} onClick={onClick} />\n ))}\n </svg>\n )\n}\n\nexport default observer(BubbleChart)\n","import React from 'react'\n\nimport {\n useAppConfig,\n EmptyState,\n Loader,\n useBudgetsStore,\n useCategoryStore,\n useGlobalCopyStore,\n useScreenSize,\n useWidgetContainerProvider,\n} from '../../common'\n\ninterface BudgetsEmptyStateProps {\n isMiniWidget?: boolean\n onConnectAccountsClick: () => void\n createBudgetOnClick: () => void\n}\nexport const BudgetsEmptyState: React.FC<BudgetsEmptyStateProps> = ({\n isMiniWidget = false,\n onConnectAccountsClick,\n createBudgetOnClick,\n}) => {\n const { config } = useAppConfig()\n const { recalculateBudgets } = useBudgetsStore()\n const { spendCategories } = useCategoryStore()\n const { budgets: copy } = useGlobalCopyStore()\n const { availableWidth } = useWidgetContainerProvider()\n const { isMobile } = useScreenSize(availableWidth)\n\n const isCompact = isMiniWidget && isMobile\n\n const [isError, setError] = React.useState(false)\n const [shouldShowEmptyGeneratedBudgets, setShouldShowEmptyGeneratedBudgets] =\n React.useState(false)\n const [recalculateBudgetsLoading, setRecalculateBudgetsLoading] = React.useState(false)\n\n const newBudgetCategories = React.useMemo(() => {\n return [...spendCategories.filter((category) => category.totalAverageAmount > 0)]\n }, [spendCategories])\n\n const autoGenerateBudgets = async () => {\n setRecalculateBudgetsLoading(true)\n const { data, isSuccess } = await recalculateBudgets(newBudgetCategories)\n setRecalculateBudgetsLoading(false)\n if (isSuccess) {\n if (data.length === 0) {\n setShouldShowEmptyGeneratedBudgets(true)\n }\n setError(false)\n } else {\n setError(true)\n }\n }\n\n if (recalculateBudgetsLoading) {\n return <Loader />\n }\n if (isError) {\n return (\n <EmptyState\n header={copy.autogenerate_budgets_error_header}\n icon={'error'}\n iconColor=\"#4D4D4D\"\n onClick={(buttonType) => {\n if (buttonType === 'primary') {\n autoGenerateBudgets()\n } else {\n createBudgetOnClick()\n }\n }}\n primaryButton={copy.autogenerate_budgets_error_primary_button}\n secondaryButton={copy.zero_state_generate_budgets_secondary_button}\n subText={copy.autogenerate_budgets_error_subheader}\n sx={{\n width: { sm: 468 },\n '.buttons-footer': {\n width: 208,\n ...(isCompact && { mt: 16, button: { height: 'max-content' } }),\n },\n ...(isCompact && { justifyContent: 'center', mt: 0, svg: { height: 32, width: 32 } }),\n }}\n />\n )\n }\n\n return (\n <>\n {shouldShowEmptyGeneratedBudgets ? (\n <EmptyState\n header={copy.zero_state_generate_budgets_header}\n icon=\"error\"\n iconColor=\"#4D4D4D\"\n onClick={(buttonType: string) => {\n if (buttonType === 'primary') {\n onConnectAccountsClick()\n } else {\n createBudgetOnClick()\n }\n }}\n primaryButton={\n config.show_connections_widget_in_master\n ? copy.zero_state_generate_budgets_primary_button\n : undefined\n }\n secondaryButton={copy.zero_state_generate_budgets_secondary_button}\n subText={copy.zero_state_generate_budgets_subheader}\n sx={{\n width: isMiniWidget ? '100%' : { sm: 500 },\n height: isMiniWidget ? '100%' : { sm: 468 },\n mt: isCompact ? 0 : 50,\n '.buttons-footer': {\n width: 208,\n height: 100,\n ...(isCompact && { mt: 16, button: { height: 'max-content' } }),\n },\n padding: isMiniWidget ? 5 : 0,\n ...(isCompact && { justifyContent: 'center', svg: { height: 32, width: 32 } }),\n }}\n />\n ) : (\n <EmptyState\n header={copy.create_budgets_title}\n icon=\"bubble_chart\"\n iconColor=\"#1A1A1A\"\n onClick={(buttonType: string) => {\n if (buttonType === 'primary') {\n autoGenerateBudgets()\n } else {\n createBudgetOnClick()\n }\n }}\n primaryButton={copy.empty_state_primary_button}\n secondaryButton={!isMiniWidget ? copy.empty_state_secondary_button : undefined}\n subText={copy.empty_state_subheader}\n sx={{\n width: isMiniWidget ? '100%' : { sm: 432 },\n height: isMiniWidget ? '100%' : { sm: 468 },\n mt: isCompact ? 0 : 50,\n '.buttons-footer': {\n width: 208,\n height: 100,\n ...(isCompact && { mt: 24, button: { height: 'max-content' } }),\n },\n padding: isMiniWidget ? 4 : 0,\n ...(isCompact && { justifyContent: 'center', svg: { height: 32, width: 32 } }),\n }}\n />\n )}\n </>\n )\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\n\nimport ConnectionsDrawer from '../../accounts/components/ConnectionsDrawer'\nimport BubbleChart from './BubbleChart'\n\nimport {\n ANALYTICS_EVENTS,\n useBudgetsStore,\n useEvent,\n useGlobalUiStore,\n useWidgetContainerProvider,\n useScreenSize,\n useGlobalCopyStore,\n} from '../../common'\nimport { type DetailedBudget } from '../../core'\n\nimport { BudgetsEmptyState } from './BudgetsEmptyState'\n\ninterface BubbleBudgetsProps {\n createBudgetOnClick?: () => void\n height: number\n isDraggable?: boolean\n isMiniWidget?: boolean\n shouldShowZeroState: boolean\n unavailableWidth?: number\n}\n\nexport const BubbleBudgets: React.FC<BubbleBudgetsProps> = observer(\n ({\n createBudgetOnClick = () => {},\n height,\n isDraggable = false,\n isMiniWidget = false,\n shouldShowZeroState,\n unavailableWidth = 24,\n }) => {\n const { onEvent } = useEvent()\n const { setSelectedBudget } = useBudgetsStore()\n const { isInitialized } = useGlobalUiStore()\n const { accounts: accountsCopy } = useGlobalCopyStore()\n const { availableWidth } = useWidgetContainerProvider()\n const { isMobile } = useScreenSize()\n\n const [showConnectionsWidget, setShowConnectionsWidget] = React.useState(false)\n\n const width = React.useMemo(() => {\n return availableWidth - unavailableWidth\n }, [availableWidth])\n\n const handleBubbleClick = (budget: DetailedBudget) => {\n setSelectedBudget(budget)\n onEvent(ANALYTICS_EVENTS.BUDGETS_CLICK_BUDGET_CATEGORY, {\n budget_category: budget.category.name,\n click_type: 'bubble',\n })\n }\n\n const handleManageConnections = () => {\n setShowConnectionsWidget(true)\n onEvent(ANALYTICS_EVENTS.ACCOUNTS_CLICK_CONNECT)\n }\n\n return (\n <Box\n ml={shouldShowZeroState || isMobile ? 0 : 24}\n sx={{ alignSelf: 'center', ...(isMiniWidget && { height: '100%' }) }}\n >\n {shouldShowZeroState || !isInitialized ? (\n <BudgetsEmptyState\n createBudgetOnClick={createBudgetOnClick}\n isMiniWidget={isMiniWidget}\n onConnectAccountsClick={handleManageConnections}\n />\n ) : (\n <BubbleChart\n height={height}\n isDraggable={isDraggable}\n onClick={handleBubbleClick}\n width={width}\n />\n )}\n\n <ConnectionsDrawer\n onClose={() => setShowConnectionsWidget(false)}\n showConnectionsWidget={showConnectionsWidget}\n title={accountsCopy.manage_connections}\n />\n </Box>\n )\n },\n)\n","import React from 'react'\n\nimport Card from '@mui/material/Card'\nimport CardContent from '@mui/material/CardContent'\nimport Stack from '@mui/material/Stack'\n\nimport { CategoryIcon, Text } from '@mxenabled/mxui'\n\nimport { StatusBar } from '../../../common'\nimport { DetailedBudget } from '../../../core'\nimport { formatCurrency } from '../../../core/utils/NumberFormatting'\n\ninterface HeaderProps {\n budget: DetailedBudget\n}\n\nexport const Header: React.FC<HeaderProps> = ({ budget }) => {\n const {\n amount,\n budgetColors: { background },\n category: { name: categoryName },\n category_guid,\n percentage,\n transaction_total,\n } = budget\n\n const status = [\n {\n color: background,\n percentage: `${percentage}%`,\n },\n ]\n\n return (\n <Card sx={{ mt: 24, mx: 24 }}>\n <CardContent>\n <Stack alignItems=\"center\" gap={16}>\n <CategoryIcon categoryGuid={category_guid} size={56} />\n <Text variant=\"h1\">\n {`${formatCurrency(transaction_total, '0,0')} / ${formatCurrency(amount, '0,0')}`}\n </Text>\n <Text bold={true} variant=\"caption\">\n {categoryName}\n </Text>\n <StatusBar data={status} height={10} />\n </Stack>\n </CardContent>\n </Card>\n )\n}\n","import Stack from '@mui/material/Stack'\nimport { observer } from 'mobx-react-lite'\n\nimport { Icon, Text } from '@mxenabled/mxui'\n\nimport { useGlobalCopyStore } from '../../../common'\n\nexport const SubBudgetZeroState = observer(() => {\n const { budgets: copy } = useGlobalCopyStore()\n\n return (\n <Stack alignItems=\"center\" gap={12} height=\"auto\" mb={24} mt={24}>\n <Icon color=\"action\" name=\"bubble_chart\" sx={{ fontSize: 32 }} />\n <Text bold={true} color=\"text.secondary\" variant=\"body2\">\n {copy.zero_state_no_sub_budgets}\n </Text>\n <Text color=\"text.secondary\" variant=\"caption\">\n {copy.zero_state_no_sub_budgets_description}\n </Text>\n </Stack>\n )\n})\n","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 { CategoryIcon, Text } from '@mxenabled/mxui'\n\nimport { SingleSegmentDonut, useBudgetsStore } from '../../../common'\nimport { type DetailedBudget } from '../../../core'\nimport { formatCurrency } from '../../../core/utils/NumberFormatting'\n\ninterface SubBudgetRowProps {\n budget: DetailedBudget\n}\n\nexport const SubBudgetRow: React.FC<SubBudgetRowProps> = observer(({ budget }) => {\n const {\n amount,\n budgetColors: { background },\n category,\n percentage,\n transaction_total,\n } = budget\n\n const { setSelectedSubBudget } = useBudgetsStore()\n\n return (\n <ListItem>\n <ListItemButton onClick={() => setSelectedSubBudget(budget)}>\n <ListItemAvatar sx={{ mb: -8, mr: 16 }}>\n <SingleSegmentDonut color={background} percent={percentage} size={40}>\n <CategoryIcon categoryGuid={category.parent_guid} variant=\"basic\" />\n </SingleSegmentDonut>\n </ListItemAvatar>\n <ListItemText\n primary={\n <Stack component=\"span\" direction=\"row\" justifyContent=\"space-between\">\n <Text bold={true} variant=\"body1\">\n {budget.category.name}\n </Text>\n </Stack>\n }\n secondary={\n <Stack component=\"span\" direction=\"row\" justifyContent=\"space-between\">\n <Text fontWeight={400} variant=\"body1\">\n {`\n ${formatCurrency(transaction_total, '0,0')} / \n ${formatCurrency(amount, '0,0')}\n `}\n </Text>\n </Stack>\n }\n />\n </ListItemButton>\n </ListItem>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport Stack from '@mui/material/Stack'\n\nimport { Icon, Text } from '@mxenabled/mxui'\n\nimport { Dialog, Drawer, useBudgetsStore, useGlobalCopyStore } from '../../../common'\nimport { type DetailedBudget, type DetailedCategory } from '../../../core'\nimport { CategoryRow, useCategoryUiStore } from '../../../categories'\nimport { BudgetAmount } from '../shared/BudgetAmount'\n\ninterface AddSubBudgetProps {\n category: DetailedCategory\n parentBudget: DetailedBudget\n}\n\nexport const AddSubBudget: React.FC<AddSubBudgetProps> = observer(({ category, parentBudget }) => {\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n const { setExpandedGuid, setOnSelect } = useCategoryUiStore()\n const { addBudget } = useBudgetsStore()\n\n const [isOpen, setIsOpen] = React.useState(false)\n const [isAddBudgetOpen, setIsAddBudgetOpen] = React.useState(false)\n const [amount, setAmount] = React.useState('')\n const [subCategory, setSubCategory] = React.useState<DetailedCategory | undefined>(undefined)\n\n React.useEffect(() => {\n setOnSelect((guid: string) => {\n const subCategory = category.subCategories.find((sc) => sc.guid === guid)\n if (subCategory) {\n setSubCategory(subCategory)\n setAmount(`${subCategory.currentAmount === 0 ? '' : subCategory.currentAmount}`)\n setIsAddBudgetOpen(true)\n }\n })\n }, [])\n\n const handleOpen = () => {\n setExpandedGuid(category.guid)\n setIsOpen(true)\n }\n\n const handleAddSubBudget = async () => {\n if (subCategory && Number(amount) > 0) {\n await addBudget(subCategory, Number(amount), parentBudget.guid)\n setIsAddBudgetOpen(false)\n setIsOpen(false)\n setSubCategory(undefined)\n }\n }\n\n return (\n <Box>\n <ListItem disableGutters={true} disablePadding={true} sx={{ bgcolor: 'background.paper' }}>\n <ListItemButton onClick={handleOpen}>\n <ListItemText>\n <Stack alignItems=\"center\" direction=\"row\" justifyContent=\"space-between\">\n <Stack alignItems=\"center\" direction=\"row\" gap={8}>\n <Icon fill={true} name=\"add_box\" size={24} sx={{ color: 'primary.light' }} />\n <Text bold={true} sx={{ color: 'primary.light' }} variant=\"body1\">\n {copy.add_sub_budget_button}\n </Text>\n </Stack>\n <Icon name=\"chevron_right\" size={24} sx={{ color: 'primary.light' }} />\n </Stack>\n </ListItemText>\n </ListItemButton>\n </ListItem>\n <Divider />\n\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n title={copy.add_sub_budget_title}\n >\n <List>\n <CategoryRow category={category} subCategories={category.subCategories} />\n </List>\n </Drawer>\n\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.add_title }}\n disablePrimaryButton={Number(amount) <= 0}\n isOpen={isAddBudgetOpen}\n onClose={() => setIsAddBudgetOpen(false)}\n onPrimaryAction={handleAddSubBudget}\n primaryText={copy.add_save_button}\n >\n <BudgetAmount\n amount={amount}\n categoryName={subCategory?.name || ''}\n onAmountChanged={setAmount}\n />\n </Dialog>\n </Box>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@mxenabled/mxui'\n\nimport {\n Dialog,\n Drawer,\n useBudgetsStore,\n useGlobalCopyStore,\n useTransactionStore,\n} from '../../../common'\nimport { type Budget, type DetailedBudget, type Transaction } from '../../../core'\n\nimport { TransactionList } from '../../../transactions'\n\nimport { SubBudgetZeroState } from '../budgetlist/SubBudgetZeroState'\nimport { SubBudgetRow } from '../budgetlist/SubBudgetRow'\nimport { BudgetAmount } from '../shared/BudgetAmount'\nimport { AddSubBudget } from './AddSubBudget'\nimport { Header } from './Header'\nimport { buildDynamicCopy } from '../../../core/utils/Localization'\n\ninterface SubBudgetListProps {\n budget: DetailedBudget\n}\n\nexport const SubBudgetList: React.FC<SubBudgetListProps> = observer(({ budget }) => {\n const { category, subBudgets } = budget\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n const { deleteBudget, selectedSubBudget, setSelectedSubBudget, updateBudget } = useBudgetsStore()\n const { filter, setFilter } = useTransactionStore()\n\n const [isEditOpen, setIsEditOpen] = React.useState(false)\n const [isDeleteOpen, setIsDeleteOpen] = React.useState(false)\n const [amount, setAmount] = React.useState(``)\n\n React.useEffect(() => {\n if (selectedSubBudget) {\n setAmount(`${selectedSubBudget.amount}`)\n setFilter({\n ...filter,\n custom: (t: Transaction) => t.category_guid === selectedSubBudget.category_guid,\n })\n }\n }, [selectedSubBudget])\n\n const handleUpdateBudget = async () => {\n if (selectedSubBudget) {\n await updateBudget({\n ...selectedSubBudget,\n amount: Number(amount),\n } as Budget)\n }\n }\n\n const handleDeleteBudget = async () => {\n if (selectedSubBudget) {\n await deleteBudget(selectedSubBudget.guid)\n }\n setIsDeleteOpen(false)\n handleClose()\n }\n\n const handleClose = () => {\n setFilter({\n ...filter,\n custom: (t: Transaction) =>\n t.category_guid === budget.category_guid ||\n t.top_level_category_guid === budget.category_guid,\n })\n setSelectedSubBudget(undefined)\n }\n\n return (\n <React.Fragment>\n <List sx={{ bgcolor: 'background.paper' }}>\n {subBudgets.length === 0 ? (\n <SubBudgetZeroState />\n ) : (\n subBudgets.map((subBudget) => (\n <React.Fragment key={subBudget.guid}>\n <SubBudgetRow budget={subBudget} />\n <Divider />\n </React.Fragment>\n ))\n )}\n <AddSubBudget category={category} parentBudget={budget} />\n </List>\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={Boolean(selectedSubBudget)}\n onClose={handleClose}\n onPrimaryAction={() => setIsEditOpen(true)}\n onSecondaryAction={() => setIsDeleteOpen(true)}\n primaryText={copy.details_edit_button}\n secondaryText={copy.details_delete_button}\n title={copy.details_title}\n >\n {selectedSubBudget && (\n <Stack gap={24}>\n <Header budget={selectedSubBudget} />\n <TransactionList height=\"100%\" />\n </Stack>\n )}\n </Drawer>\n\n {selectedSubBudget && (\n <React.Fragment>\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.details_edit_title }}\n disablePrimaryButton={Number(amount) <= 0}\n isOpen={isEditOpen}\n onClose={() => setIsEditOpen(false)}\n onPrimaryAction={handleUpdateBudget}\n primaryText={copy.edit_save_button}\n >\n <BudgetAmount\n amount={amount}\n categoryName={selectedSubBudget.category.name}\n onAmountChanged={setAmount}\n />\n </Dialog>\n\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.delete_title }}\n isOpen={isDeleteOpen}\n onClose={() => setIsDeleteOpen(false)}\n onPrimaryAction={handleDeleteBudget}\n primaryColor=\"error\"\n primaryText=\"Delete\"\n secondaryColor=\"secondary\"\n >\n <Text variant=\"subtitle1\">\n {buildDynamicCopy(copy.delete_description, selectedSubBudget.category.name) as string}\n </Text>\n </Dialog>\n </React.Fragment>\n )}\n </React.Fragment>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Button from '@mui/material/Button'\nimport Stack from '@mui/material/Stack'\nimport Tab from '@mui/material/Tab'\nimport Tabs from '@mui/material/Tabs'\n\nimport { Icon } from '@mxenabled/mxui'\n\nimport {\n Drawer,\n useAppConfig,\n useBudgetsStore,\n useGlobalCopyStore,\n useScreenSize,\n useTransactionStore,\n} from '../../../common'\nimport { type DetailedBudget } from '../../../core'\nimport { exportTransactionsToCSV } from '../../../core/utils/TransactionUtils'\n\nimport { TransactionDetails, TransactionList } from '../../../transactions'\n\nimport { Header } from './Header'\nimport { SubBudgetList } from './SubBudgetList'\n\ninterface BudgetDetailsProps {\n budget: DetailedBudget\n}\n\nexport const BudgetDetails: React.FC<BudgetDetailsProps> = observer(({ budget }) => {\n const { is_mobile_webview } = useAppConfig()\n const { setAlert } = useBudgetsStore()\n const { budgets: copy, common: commonCopy, transactions: transactionCopy } = useGlobalCopyStore()\n const { isDesktop, isSmallTablet, isTablet } = useScreenSize()\n const {\n sortedTransactions: transactions,\n sortedTransactionsWithSplits,\n tags,\n } = useTransactionStore()\n\n const [selectedTab, setSelectedTab] = React.useState(0)\n const [transactionGuid, setTransactionGuid] = React.useState('')\n\n const transaction = React.useMemo(\n () => transactions.find((t) => t.guid === transactionGuid),\n [transactionGuid, transactions],\n )\n\n const handleTabChange = (_event: React.SyntheticEvent, newValue: number) => {\n setSelectedTab(newValue)\n }\n\n const handleExportToCsv = () => {\n exportTransactionsToCSV(sortedTransactionsWithSplits, tags)\n setAlert(copy.alert_csv_downloaded)\n }\n\n const shouldShowExportButton =\n transactions.length > 0 && !is_mobile_webview && (isDesktop || (isTablet && !isSmallTablet))\n\n return (\n <Stack gap={24}>\n <Header budget={budget} />\n\n <Stack>\n <Tabs\n onChange={handleTabChange}\n sx={{ width: '100%' }}\n textColor=\"primary\"\n value={selectedTab}\n variant=\"fullWidth\"\n >\n <Tab label={copy.details_transactions_tab} />\n <Tab label={copy.details_subbudgets_tab} />\n </Tabs>\n {selectedTab === 0 && (\n <Stack>\n {shouldShowExportButton && (\n <Stack direction=\"row\" justifyContent=\"right\" mb={-24} mr={8} mt={8} zIndex={1}>\n <Button\n onClick={handleExportToCsv}\n startIcon={<Icon name=\"ios_share\" />}\n variant=\"text\"\n >\n {transactionCopy.export_csv_btn}\n </Button>\n </Stack>\n )}\n <TransactionList height=\"100%\" onClick={setTransactionGuid} />\n </Stack>\n )}\n {selectedTab === 1 && <SubBudgetList budget={budget} />}\n\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={Boolean(transaction)}\n onClose={() => setTransactionGuid('')}\n title={copy.details_transaction_drawer}\n >\n {transaction && <TransactionDetails transaction={transaction} />}\n </Drawer>\n </Stack>\n </Stack>\n )\n})\n","import React from 'react'\n\nimport { observer } from 'mobx-react-lite'\n\nimport Alert from '@mui/material/Alert'\nimport Snackbar from '@mui/material/Snackbar'\n\nimport { Text } from '@mxenabled/mxui'\n\nimport {\n Dialog,\n Drawer,\n useBudgetsStore,\n useGlobalCopyStore,\n useGlobalUiStore,\n useTransactionStore,\n} from '../../common'\nimport { type Budget, type Transaction } from '../../core'\n\nimport { BudgetDetails } from './budgetdetails/BudgetDetails'\nimport { BudgetAmount } from './shared/BudgetAmount'\nimport { buildDynamicCopy } from '../../core/utils/Localization'\n\nexport const BudgetDetailsDrawer = observer(() => {\n const { selectedAccountGuids } = useGlobalUiStore()\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n const {\n alert,\n dateRange,\n deleteBudget,\n selectedBudget,\n selectedSubBudget,\n setAlert,\n setSelectedBudget,\n updateBudget,\n } = useBudgetsStore()\n const { setFilter } = useTransactionStore()\n\n const [isOpen, setIsOpen] = React.useState(false)\n const [isEditOpen, setIsEditOpen] = React.useState(false)\n const [isDeleteOpen, setIsDeleteOpen] = React.useState(false)\n const [amount, setAmount] = React.useState(``)\n\n React.useEffect(() => {\n if (selectedBudget && !selectedSubBudget) {\n setAmount(`${selectedBudget.amount}`)\n setIsOpen(true)\n setFilter({\n accounts: selectedAccountGuids,\n dateRange: dateRange,\n custom: (t: Transaction) =>\n t.category_guid === selectedBudget.category_guid ||\n t.top_level_category_guid === selectedBudget.category_guid,\n showSplits: true,\n })\n }\n }, [selectedBudget])\n\n const handleUpdateBudget = async () => {\n if (selectedBudget) {\n await updateBudget({\n ...selectedBudget,\n amount: Number(amount),\n percentage: (selectedBudget.category.totalAmount / Number(amount)) * 100,\n } as Budget)\n setIsEditOpen(false)\n setAlert(buildDynamicCopy(copy.alert_budget_updated, selectedBudget.category.name) as string)\n }\n }\n\n const handleDeleteBudget = async () => {\n if (selectedBudget) {\n await deleteBudget(selectedBudget.guid)\n setAlert(buildDynamicCopy(copy.alert_budget_deleted, selectedBudget.category.name) as string)\n }\n handleClose()\n }\n\n const handleClose = () => {\n setIsOpen(false)\n // Wait for the close animation before set the selected budget\n setTimeout(() => {\n setSelectedBudget(undefined)\n }, 250)\n }\n\n const handleEditClose = () => {\n setIsEditOpen(false)\n setAmount(`${selectedBudget?.amount}`)\n }\n\n if (!selectedBudget) {\n return undefined\n }\n\n return (\n <React.Fragment>\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isOpen}\n onClose={handleClose}\n onPrimaryAction={() => setIsEditOpen(true)}\n onSecondaryAction={() => setIsDeleteOpen(true)}\n primaryText={copy.details_edit_button}\n secondaryColor=\"error\"\n secondaryText={copy.details_delete_button}\n title={copy.details_title}\n >\n <BudgetDetails budget={selectedBudget} />\n <Snackbar\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n autoHideDuration={3500}\n onClose={() => setAlert('')}\n open={Boolean(alert)}\n >\n <Alert closeText=\"\" onClose={() => setAlert('')} severity={'success'} variant=\"filled\">\n {alert}\n </Alert>\n </Snackbar>\n </Drawer>\n\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.details_edit_title }}\n disablePrimaryButton={Number(amount) <= 0}\n isOpen={isEditOpen}\n onClose={handleEditClose}\n onPrimaryAction={handleUpdateBudget}\n onSecondaryAction={handleEditClose}\n primaryText={copy.edit_save_button}\n >\n <BudgetAmount\n amount={amount}\n categoryName={selectedBudget.category.name}\n onAmountChanged={setAmount}\n />\n </Dialog>\n\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.delete_title }}\n isOpen={isDeleteOpen}\n onClose={() => setIsDeleteOpen(false)}\n onPrimaryAction={handleDeleteBudget}\n primaryColor=\"error\"\n primaryText={copy.details_delete_button}\n secondaryColor=\"secondary\"\n >\n <Text variant=\"subtitle1\">\n {buildDynamicCopy(copy.delete_description, selectedBudget.category.name) as string}\n </Text>\n </Dialog>\n </React.Fragment>\n )\n})\n","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 { CategoryIcon, Text } from '@mxenabled/mxui'\n\nimport { SingleSegmentDonut } from '../../../common'\nimport { type DetailedBudget } from '../../../core'\nimport { formatCurrency } from '../../../core/utils/NumberFormatting'\n\ninterface BudgetRowProps {\n budget: DetailedBudget\n onClick?: (budget: DetailedBudget) => void\n}\n\nexport const BudgetRow: React.FC<BudgetRowProps> = ({ budget, onClick }) => {\n const {\n amount,\n budgetColors: { background, description: descriptionColor },\n category_guid,\n description,\n percentage,\n subBudgets,\n transaction_total,\n } = budget\n\n const overBudget = percentage > 100\n\n return (\n <ListItem>\n <ListItemButton onClick={() => onClick?.(budget)}>\n <ListItemAvatar sx={{ mb: -8, mr: 16 }}>\n <SingleSegmentDonut color={background} percent={percentage} size={40}>\n <CategoryIcon categoryGuid={category_guid} variant=\"basic\" />\n </SingleSegmentDonut>\n </ListItemAvatar>\n <ListItemText\n primary={\n <Stack component=\"span\" direction=\"row\" justifyContent=\"space-between\">\n <Text bold={true} variant=\"body1\">\n {budget.category.name}\n </Text>\n <Text fontWeight={400} variant=\"body1\">\n {`\n ${formatCurrency(transaction_total, '0,0')} /\n ${formatCurrency(amount, '0,0')}\n `}\n </Text>\n </Stack>\n }\n secondary={\n <Stack component=\"span\" direction=\"row\" justifyContent=\"space-between\">\n <Text variant=\"caption\">{`${subBudgets.length} Sub-budgets`}</Text>\n <Text\n bold={overBudget}\n sx={{\n color: descriptionColor,\n ...(overBudget && {\n '.MuiListItemButton-root:hover &, .MuiListItemButton-root:active &': {\n color: 'error.dark',\n },\n }),\n }}\n variant=\"caption\"\n >\n {description}\n </Text>\n </Stack>\n }\n />\n </ListItemButton>\n </ListItem>\n )\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Card from '@mui/material/Card'\nimport CardContent from '@mui/material/CardContent'\nimport CardHeader from '@mui/material/CardHeader'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\n\nimport { H3 } from '@mxenabled/mxui'\n\nimport { ANALYTICS_EVENTS, useBudgetsStore, useEvent, useGlobalCopyStore } from '../../common'\nimport { type DetailedBudget } from '../../core'\n\nimport { BudgetRow } from './budgetlist/BudgetRow'\n\nexport const BudgetList = observer(() => {\n const { onEvent } = useEvent()\n const { budgets: copy } = useGlobalCopyStore()\n const { detailedBudgets: budgets, setSelectedBudget } = useBudgetsStore()\n\n const handleBudgetClick = (budget: DetailedBudget) => {\n setSelectedBudget(budget)\n onEvent(ANALYTICS_EVENTS.BUDGETS_CLICK_BUDGET_CATEGORY, {\n budget_category: budget.category.name,\n click_type: 'list',\n })\n }\n\n return (\n <Card elevation={2}>\n <CardHeader sx={{ pb: 8, pl: 24 }} title={<H3>{copy.budget_categories_title}</H3>} />\n <CardContent sx={{ p: 0, ':last-child': { p: 0 } }}>\n <List>\n {budgets.map((budget) => (\n <React.Fragment key={budget.guid}>\n <BudgetRow budget={budget} onClick={handleBudgetClick} />\n <Divider />\n </React.Fragment>\n ))}\n </List>\n </CardContent>\n </Card>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { subDays } from 'date-fns/subDays'\n\nimport Card from '@mui/material/Card'\nimport CardContent from '@mui/material/CardContent'\nimport CardHeader from '@mui/material/CardHeader'\nimport IconButton from '@mui/material/IconButton'\nimport Stack from '@mui/material/Stack'\nimport { useTheme } from '@mui/material/styles'\n\nimport { H3, Icon, Text } from '@mxenabled/mxui'\n\nimport {\n type StatusBarData,\n ANALYTICS_EVENTS,\n Drawer,\n StatusBar,\n useBudgetsStore,\n useCategoryStore,\n useGlobalCopyStore,\n useRecurringTransactionsStore,\n useTransactionStore,\n useAccountStore,\n useEvent,\n} from '../../common'\nimport { ManageIncome } from '../../recurringtransactions'\nimport { formatCurrency } from '../../core/utils/NumberFormatting'\nimport { buildDynamicCopy } from '../../core/utils/Localization'\n\nexport const Overview = observer(() => {\n const theme = useTheme()\n\n const { onEvent } = useEvent()\n const { visibleAccounts: accounts } = useAccountStore()\n const { budgets: copy, common: commonCopy, recurring: recurringCopy } = useGlobalCopyStore()\n const { incomeCategories, spendCategories } = useCategoryStore()\n const { detailedBudgets: budgets, totalBudgeted } = useBudgetsStore()\n const { incomeTotal } = useRecurringTransactionsStore()\n const { setFilter } = useTransactionStore()\n\n const [isIncomeOpen, setIsIncomeOpen] = React.useState(false)\n\n const [spentTotal, spendingStatus] = React.useMemo(() => {\n const spentTotal = spendCategories.reduce((total, current) => total + current.totalAmount, 0)\n let spendingPercentage = spentTotal / totalBudgeted\n if (spendingPercentage > 1) spendingPercentage = 1\n let color = theme.palette.success.main\n if (spendingPercentage > 0.8 && spendingPercentage < 1) {\n color = theme.palette.warning.main\n } else if (spendingPercentage >= 1) {\n color = theme.palette.error.main\n }\n\n const spendingStatus = [\n {\n color,\n percentage: `${spendingPercentage}`,\n },\n ] as StatusBarData[]\n return [spentTotal, spendingStatus]\n }, [budgets, spendCategories])\n\n const [incomePaid, incomeStatus] = React.useMemo(() => {\n const incomePaid = Math.abs(\n incomeCategories.reduce((total, current) => total + current.totalAmount, 0),\n )\n let incomePercentage = incomePaid / incomeTotal\n if (incomePercentage > 1) incomePercentage = 1\n\n const incomeStatus = [\n {\n color: theme.palette.secondary.main,\n percentage: `${incomePercentage}`,\n },\n ]\n return [incomePaid, incomeStatus]\n }, [incomeCategories, incomeTotal])\n\n const handleOpenIncome = () => {\n setFilter({\n accounts: accounts.map((account) => account.guid),\n dateRange: {\n start: subDays(new Date(), 90),\n end: new Date(),\n },\n })\n setIsIncomeOpen(true)\n onEvent(ANALYTICS_EVENTS.BUDGETS_CLICK_EDIT_INCOME)\n }\n\n return (\n <Card elevation={2} sx={{ overflow: 'visible' }}>\n <CardHeader sx={{ pb: 8, pl: 24 }} title={<H3>{copy.overview_title}</H3>} />\n <CardContent sx={{ pt: 12, px: 24 }}>\n <Stack gap={24}>\n <Stack gap={8}>\n <Text bold={true} sx={{ mb: 8 }} variant=\"body1\">\n {copy.spending_title}\n </Text>\n <StatusBar data={spendingStatus} height={16} />\n <Text variant=\"body2\">\n {\n buildDynamicCopy(\n copy.spending_description,\n formatCurrency(spentTotal, '0,0'),\n formatCurrency(totalBudgeted, '0,0'),\n ) as string\n }\n </Text>\n </Stack>\n\n <Stack gap={8}>\n <Stack alignItems=\"center\" direction=\"row\" gap={4} mb={-4}>\n <Text bold={true} variant=\"body1\">\n {copy.income_title}\n </Text>\n <IconButton\n aria-label={recurringCopy.manage_income}\n onClick={handleOpenIncome}\n sx={{ p: 0 }}\n >\n <Icon color=\"primary\" name=\"edit\" />\n </IconButton>\n </Stack>\n <StatusBar data={incomeStatus} height={16} />\n <Text variant=\"body2\">\n {\n buildDynamicCopy(\n copy.income_description,\n formatCurrency(incomePaid, '0,0'),\n formatCurrency(incomeTotal, '0,0'),\n ) as string\n }\n </Text>\n </Stack>\n </Stack>\n </CardContent>\n\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isIncomeOpen}\n onClose={() => setIsIncomeOpen(false)}\n title={recurringCopy.manage_income}\n >\n <ManageIncome forOverview={true} />\n </Drawer>\n </Card>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { isAfter } from 'date-fns/isAfter'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\n\nimport Alert from '@mui/material/Alert'\nimport Snackbar from '@mui/material/Snackbar'\nimport Stack from '@mui/material/Stack'\nimport { useTheme } from '@mui/material/styles'\nimport { DateRange } from '@mui/x-date-pickers-pro'\n\nimport {\n ANALYTICS_EVENTS,\n Drawer,\n Loader,\n useAccountStore,\n useBudgetsStore,\n useCategoryStore,\n useEvent,\n useGlobalCopyStore,\n useGlobalUiStore,\n useRecurringTransactionsStore,\n useScreenSize,\n useWidgetLoadTimer,\n WidgetContainer,\n} from '../common'\nimport { WidgetProps } from '../core'\n\nimport { AddBudgets } from './components/AddBudgets'\nimport { BubbleBudgets } from './components/BubbleBudgets'\nimport { BudgetDetailsDrawer } from './components/BudgetDetailsDrawer'\nimport { BudgetList } from './components/BudgetList'\nimport { Overview } from './components/Overview'\n\nconst BUDGET_LIST_WIDTH = 480\n\nexport const BubbleBudgetsWidget: React.FC<WidgetProps> = observer(\n ({ onBackClick, onMenuClick, sx }) => {\n const theme = useTheme()\n const { onEvent } = useEvent()\n const { visibleAccounts: accounts } = useAccountStore()\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n const { isInitialized, selectedAccounts, setDisplayedDate } = useGlobalUiStore()\n const {\n alert,\n dateRange,\n isDataLoaded,\n loadBudgetData,\n setDateRange,\n setAlert,\n setTheme,\n detailedBudgets: budgets,\n } = useBudgetsStore()\n const { setDateRange: setRecurringDateRange } = useRecurringTransactionsStore()\n const { loadDateRangeCategoryTotals, loadMonthlyCategoryTotals } = useCategoryStore()\n const { isSmallTablet, isMobile, isSmallMobile } = useScreenSize()\n const isColumnWidths = isSmallTablet || isMobile || isSmallMobile\n\n const [isAddOpen, setIsAddOpen] = React.useState(false)\n\n useWidgetLoadTimer({\n widgetName: 'BubbleBudgetsWidget',\n isLoaded: isDataLoaded,\n })\n\n React.useEffect(() => {\n setTheme(theme)\n if (!isDataLoaded) {\n loadBudgetData().finally(() => {\n onEvent(ANALYTICS_EVENTS.BUDGETS_VIEW)\n })\n }\n }, [])\n\n React.useEffect(() => {\n setDateRange({ start: startOfMonth(startOfToday()), end: endOfMonth(startOfToday()) })\n\n return () => {\n setDateRange({ start: startOfMonth(startOfToday()), end: endOfMonth(startOfToday()) })\n }\n }, [accounts])\n\n React.useEffect(() => {\n if (isInitialized) {\n setDisplayedDate(dateRange.start, dateRange.end)\n loadDateRangeCategoryTotals(selectedAccounts, dateRange.start, dateRange.end).finally()\n loadMonthlyCategoryTotals(selectedAccounts).finally()\n setRecurringDateRange(dateRange)\n }\n }, [isInitialized, selectedAccounts, dateRange])\n\n const onMonthChanged = (dateRange: DateRange<Date>) => {\n setDateRange({ start: dateRange[0] || new Date(), end: dateRange[1] || new Date() })\n }\n\n const handleAccountFilterClick = () => {\n onEvent(ANALYTICS_EVENTS.BUDGETS_CLICK_FILTER)\n }\n\n const handleAddClick = () => {\n setIsAddOpen(true)\n onEvent(ANALYTICS_EVENTS.BUDGETS_CLICK_ADD)\n }\n\n const handleBudgetAdded = () => {\n setIsAddOpen(false)\n }\n\n const handleBudgetsRecalculated = () => {\n setIsAddOpen(false)\n }\n\n const shouldDisableNext = isAfter(dateRange.end, startOfMonth(new Date()))\n\n if (!isInitialized || !isDataLoaded) return <Loader />\n\n return (\n <WidgetContainer\n actions={[\n {\n iconName: 'add',\n label: copy.add_title,\n onClick: handleAddClick,\n },\n ]}\n calendarActions={{\n onRangeChanged: onMonthChanged,\n shouldDisableNext,\n shouldDisablePicker: true,\n }}\n hasDivider={true}\n onAccountsFilterClick={handleAccountFilterClick}\n onBackClick={onBackClick}\n onMenuClick={onMenuClick}\n sx={sx}\n title={copy.budgets_title}\n >\n <Stack\n direction={!isColumnWidths ? 'row' : 'column'}\n height=\"100%\"\n sx={{ justifyContent: 'center' }}\n width=\"100%\"\n >\n <Stack height={!isColumnWidths ? 'calc(100dvh - 150px)' : 450}>\n <BubbleBudgets\n createBudgetOnClick={handleAddClick}\n height={!isColumnWidths ? 800 : 450}\n isDraggable={true}\n shouldShowZeroState={budgets.length === 0}\n unavailableWidth={!isColumnWidths ? BUDGET_LIST_WIDTH : 0}\n />\n </Stack>\n {budgets.length !== 0 && (\n <Stack\n gap={24}\n height=\"100%\"\n sx={{ mr: 24, mt: 48 }}\n width={!isColumnWidths ? BUDGET_LIST_WIDTH : '100%'}\n >\n <Overview />\n <BudgetList />\n </Stack>\n )}\n </Stack>\n\n <BudgetDetailsDrawer />\n\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isAddOpen}\n onClose={() => setIsAddOpen(false)}\n title={copy.add_new_title}\n >\n <AddBudgets\n onAddBudget={handleBudgetAdded}\n onRecalculateBudgets={handleBudgetsRecalculated}\n />\n </Drawer>\n\n <Snackbar\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n autoHideDuration={3500}\n onClose={() => {\n setAlert('')\n }}\n open={Boolean(alert)}\n >\n <Alert\n closeText=\"\"\n onClose={() => {\n setAlert('')\n }}\n severity={'success'}\n variant=\"filled\"\n >\n {alert}\n </Alert>\n </Snackbar>\n </WidgetContainer>\n )\n },\n)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { startOfMonth } from 'date-fns/startOfMonth'\n\nimport Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\nimport { useTheme } from '@mui/material/styles'\n\nimport { Text } from '@mxenabled/mxui'\n\nimport {\n ANALYTICS_EVENTS,\n Drawer,\n Loader,\n MiniWidgetContainer,\n useBudgetsStore,\n useCategoryStore,\n useEvent,\n useGlobalCopyStore,\n useGlobalUiStore,\n useWidgetContainerProvider,\n useWidgetLoadTimer,\n} from '../common'\nimport { type BudgetsCopy, type MiniWidgetProps } from '../core'\n\nimport { AddBudgets } from './components/AddBudgets'\nimport { BubbleBudgets } from './components/BubbleBudgets'\nimport { getBudgetDifference } from '../core/utils/BudgetUtil'\nimport { formatCurrency } from '../core/utils/NumberFormatting'\n\ninterface BubbleBudgetsContentProps {\n budgetsCopy: BudgetsCopy\n difference: number\n handleAddClick: () => void\n shouldShowZeroState: boolean\n}\n\nconst BubbleBudgetsContent: React.FC<BubbleBudgetsContentProps> = ({\n budgetsCopy,\n difference,\n handleAddClick,\n shouldShowZeroState,\n}) => {\n const { availableHeight = 0 } = useWidgetContainerProvider()\n const initialHeightRef = React.useRef<number | null>(null)\n\n React.useEffect(() => {\n if (availableHeight > 0 && initialHeightRef.current === null) {\n initialHeightRef.current = availableHeight\n }\n }, [availableHeight])\n\n const bubbleHeight = React.useMemo(() => {\n const baseHeight = initialHeightRef.current ?? availableHeight\n\n if (baseHeight > 0) return Math.round(Math.max(120, Math.min(450, baseHeight * 0.8))) - 40\n\n return 450\n }, [availableHeight])\n\n return (\n <Stack sx={{ height: '100%', justifyContent: 'space-between' }}>\n <BubbleBudgets\n createBudgetOnClick={handleAddClick}\n height={bubbleHeight}\n isMiniWidget={true}\n shouldShowZeroState={shouldShowZeroState}\n />\n\n {!shouldShowZeroState && (\n <Box ml={16}>\n <Text bold={true} color={difference < 0 ? 'error.main' : 'success.main'}>\n {formatCurrency(Math.abs(difference), '0,0')}\n </Text>\n <Text>\n {difference < 0 ? budgetsCopy.overspent_in_budgets : budgetsCopy.left_in_budgets}\n </Text>\n </Box>\n )}\n </Stack>\n )\n}\n\nconst BubbleBudgetsMiniWidget = (props: MiniWidgetProps) => {\n const theme = useTheme()\n\n const { onEvent } = useEvent()\n const { detailedBudgets: budgets, isDataLoaded, loadBudgetData, setTheme } = useBudgetsStore()\n const { budgets: budgetsCopy, common: commonCopy } = useGlobalCopyStore()\n const { isInitialized, selectedAccounts } = useGlobalUiStore()\n const { loadDateRangeCategoryTotals, loadMonthlyCategoryTotals } = useCategoryStore()\n const difference = getBudgetDifference(budgets)\n\n const [isAddOpen, setIsAddOpen] = React.useState(false)\n\n React.useEffect(() => {\n if (!isDataLoaded) {\n loadBudgetData().finally()\n }\n }, [])\n\n React.useEffect(() => {\n setTheme(theme)\n }, [theme])\n\n React.useEffect(() => {\n if (isInitialized && !isDataLoaded) {\n loadDateRangeCategoryTotals(\n selectedAccounts,\n startOfMonth(new Date()),\n endOfMonth(new Date()),\n ).finally()\n loadMonthlyCategoryTotals(selectedAccounts).finally()\n }\n }, [isInitialized, selectedAccounts, isDataLoaded])\n\n const handleAddClick = () => {\n setIsAddOpen(true)\n onEvent(ANALYTICS_EVENTS.BUDGETS_CLICK_ADD)\n }\n\n const handleBudgetAdded = () => {\n setIsAddOpen(false)\n }\n\n const handleBudgetsRecalculated = () => setIsAddOpen(false)\n\n useWidgetLoadTimer({\n widgetName: 'BubbleBudgetsMiniWidget',\n isLoaded: isDataLoaded,\n })\n\n if (!isInitialized || !isDataLoaded) return <Loader />\n\n const shouldShowZeroState = budgets.length === 0\n\n return (\n <MiniWidgetContainer\n contentStyles={{ height: 'calc(100% - 66px)', ':last-child': { pb: 0 } }}\n primaryCtaLabel={shouldShowZeroState ? budgetsCopy.get_started_cta : budgetsCopy.details_cta}\n primaryCtaLabelAria={budgetsCopy.details_cta_aria}\n sx={{ height: '100%' }}\n title={budgetsCopy.budgets_title}\n {...props}\n >\n <BubbleBudgetsContent\n budgetsCopy={budgetsCopy}\n difference={difference}\n handleAddClick={handleAddClick}\n shouldShowZeroState={shouldShowZeroState}\n />\n\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isAddOpen}\n onClose={() => setIsAddOpen(false)}\n title={budgetsCopy.add_new_title}\n >\n <AddBudgets\n onAddBudget={handleBudgetAdded}\n onRecalculateBudgets={handleBudgetsRecalculated}\n />\n </Drawer>\n </MiniWidgetContainer>\n )\n}\n\nexport default observer(BubbleBudgetsMiniWidget)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Alert from '@mui/material/Alert'\n\nimport Snackbar from '@mui/material/Snackbar'\nimport { alpha, useTheme } from '@mui/material/styles'\n\nimport { CategoryIcon } from '@mxenabled/mxui'\n\nimport { getCategoryColor } from '../../core/utils/CategoryUtil'\nimport {\n useBudgetsStore,\n useGlobalCopyStore,\n useGlobalUiStore,\n useTransactionStore,\n} from '../../common'\nimport { type Budget, type Transaction } from '../../core'\nimport { CurrencyDialog, Drawer, Loader } from '../../common/components'\nimport { TransactionList } from '../../transactions'\nimport { type TransactionListProps } from '../../transactions/components/shared/TransactionList'\n\nimport { getRemainingAmountSpentPercentage } from '../../core/utils/BudgetUtil'\n\nimport { BudgetDetailsTopSection } from './shared/BudgetDetailsTopSection'\nimport { buildDynamicCopy } from '../../core/utils/Localization'\n\nenum Action {\n DELETE = 'delete',\n EDIT = 'edit',\n}\n\ninterface BudgetDetailsDrawerV2Props {\n onClose?: () => void\n onEvent?: (event: string, amount: string) => void\n onViewHistory?: () => void\n transactionListProps?: TransactionListProps\n}\n\nconst EVENT_MESSAGES = {\n CANCEL_DELETE: 'Cancel - Delete',\n END_SAVE: 'End - Save',\n END_DELETE: 'End - Delete',\n START_DELETE: 'Start - Delete',\n}\n\n// V2 implementation of Budget Details Drawer.\n// This will replace BudgetDetailsDrawer\n// after the PFM design is finalized\n// and aligned with Insights.\n\nconst BudgetDetailsDrawerV2 = ({\n onClose,\n onEvent,\n onViewHistory,\n transactionListProps,\n}: BudgetDetailsDrawerV2Props) => {\n const {\n alert,\n dateRange,\n deleteBudget,\n selectedBudget,\n selectedSubBudget,\n setAlert,\n setSelectedBudget,\n updateBudget,\n } = useBudgetsStore()\n const { budgets: budgetsCopy, common: commonCopy } = useGlobalCopyStore()\n const { isCopyLoaded, selectedAccountGuids } = useGlobalUiStore()\n const theme = useTheme()\n const { setFilter } = useTransactionStore()\n\n const [amount, setAmount] = React.useState('')\n const [formAction, setFormAction] = React.useState<Action | null>(null)\n const [isOpen, setIsOpen] = React.useState(false)\n\n const inProgress = React.useRef(false)\n\n React.useEffect(() => {\n if (!selectedBudget || selectedSubBudget) return\n\n setAmount(`${selectedBudget.amount}`)\n setFilter({\n accounts: selectedAccountGuids,\n dateRange,\n custom: ({ category_guid, top_level_category_guid }: Transaction) => {\n const { category_guid: budgetCategoryGuid } = selectedBudget\n return (\n category_guid === budgetCategoryGuid || top_level_category_guid === budgetCategoryGuid\n )\n },\n })\n setIsOpen(true)\n }, [selectedBudget])\n\n if (!isCopyLoaded) return <Loader />\n if (!selectedBudget) return null\n\n const handleClose = () => {\n setAmount('')\n setFormAction(null)\n setIsOpen(false)\n\n setTimeout(() => {\n setSelectedBudget(undefined)\n onClose?.()\n }, 250)\n }\n\n const handleFormDialogClose = () => {\n if (formAction === Action.DELETE) onEvent?.(EVENT_MESSAGES.CANCEL_DELETE, amount)\n\n setAmount(selectedBudget.amount ? `${selectedBudget.amount}` : '')\n setFormAction(null)\n }\n\n const handlePrimaryAction = async () => {\n if (formAction === Action.EDIT) {\n if (inProgress.current) return\n inProgress.current = true\n\n await updateBudget({\n ...selectedBudget,\n amount: Number(amount),\n } as Budget)\n onEvent?.(EVENT_MESSAGES.END_SAVE, amount)\n\n setAlert(\n buildDynamicCopy(budgetsCopy.alert_budget_updated, selectedBudget.category.name) as string,\n )\n setFormAction(null)\n\n inProgress.current = false\n }\n\n if (formAction === Action.DELETE) {\n await deleteBudget(selectedBudget.guid)\n onEvent?.(EVENT_MESSAGES.END_DELETE, amount)\n\n handleClose()\n }\n }\n\n const { remainingAmount, spentPercentage, iconColor } = getRemainingAmountSpentPercentage(\n selectedBudget.transaction_total ?? 0,\n selectedBudget.amount ?? 0,\n )\n\n const buildCopyWithBold = (copyKey: string, content: React.ReactNode): string => {\n return buildDynamicCopy(copyKey, <b>{content}</b>) as string\n }\n\n return (\n <React.Fragment>\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n footerStyles={{\n px: 24,\n py: 16,\n }}\n isOpen={isOpen}\n onClose={handleClose}\n onPrimaryAction={() => setFormAction(Action.EDIT)}\n onSecondaryAction={() => {\n onEvent?.(EVENT_MESSAGES.START_DELETE, amount)\n setFormAction(Action.DELETE)\n }}\n primaryText={budgetsCopy.details_edit_button}\n secondaryColor=\"error\"\n secondaryText={budgetsCopy.details_delete_button}\n sx={{\n '& .list-wrapper': {\n pr: 24,\n },\n }}\n title={\n buildDynamicCopy(budgetsCopy.details_type_title, selectedBudget.category.name) as string\n }\n >\n <BudgetDetailsTopSection\n amount={selectedBudget.amount}\n icon={\n <CategoryIcon\n categoryGuid={selectedBudget.category.guid}\n size={44}\n sx={{\n bgcolor: alpha(getCategoryColor(selectedBudget.category.guid, theme), 0.15),\n border: `1px solid ${getCategoryColor(selectedBudget.category.guid, theme)}`,\n color: 'text.primary',\n }}\n />\n }\n iconColor={iconColor}\n onViewHistory={onViewHistory}\n remainingAmount={remainingAmount}\n spentPercentage={spentPercentage}\n startDate={(dateRange.start.getTime() ?? 0) / 1000}\n totalTransaction={selectedBudget.transaction_total}\n />\n <TransactionList {...transactionListProps} />\n {alert && (\n <Snackbar\n anchorOrigin={{ horizontal: 'right', vertical: 'bottom' }}\n autoHideDuration={3500}\n onClose={() => setAlert('')}\n open={Boolean(alert)}\n >\n <Alert closeText=\"\" onClose={() => setAlert('')} severity=\"success\" variant=\"filled\">\n {alert}\n </Alert>\n </Snackbar>\n )}\n </Drawer>\n {formAction && (\n <CurrencyDialog\n closeAriaLabel={commonCopy.close_aria}\n content={buildCopyWithBold(\n budgetsCopy[formAction === Action.EDIT ? 'edit_budget_content' : 'delete_description'],\n selectedBudget.category.name,\n )}\n handleInputChange={(value) => setAmount(value.toString())}\n handleModalClose={handleFormDialogClose}\n handlePrimaryAction={handlePrimaryAction}\n handleSecondaryAction={handleFormDialogClose}\n inputLabel={formAction === Action.EDIT ? budgetsCopy.details_edit_title : ''}\n inputValue={amount}\n isOpen={true}\n primaryColor={formAction === Action.EDIT ? 'primary' : 'error'}\n primaryText={\n budgetsCopy[formAction === Action.EDIT ? 'add_save_button' : 'details_delete_button']\n }\n secondaryColor={formAction === Action.EDIT ? 'primary' : 'inherit'}\n secondaryText={commonCopy.cancel_button}\n title={budgetsCopy[formAction === Action.EDIT ? 'details_edit_title' : 'delete_title']}\n />\n )}\n </React.Fragment>\n )\n}\n\nexport default observer(BudgetDetailsDrawerV2)\n"],"names":["Header","observer","copy","useGlobalCopyStore","totalBudgeted","useBudgetsStore","incomeTotal","useRecurringTransactionsStore","remaining","jsxs","Stack","jsx","Text","formatCurrency","RecalculateBudgetRow","category","budgets","secondaryText","React","budget","b","part1","part2","buildDynamicCopy","ListItem","ListItemButton","ListItemAvatar","CategoryIcon","ListItemText","Divider","RecalculateBudgets","onRecalculateBudgets","commonCopy","spendCategories","useCategoryStore","recalculateBudgets","setAlert","isOpen","setIsOpen","newBudgetCategories","handlePrimaryClick","Button","Drawer","Box","List","BudgetAmount","amount","categoryName","onAmountChanged","unbudgetedIncome","CurrencyInput","UnbudgetedRow","onAddBudget","isAddBudgetOpen","setIsAddBudgetOpen","setAmount","ListItemSecondaryAction","Icon","Dialog","AddBudgets","addBudget","unbudgetedCategories","handleOnAddBudget","PROGRESS_INDICATOR_SIZE","MAX_BUBBLE_RADIUS","MIN_BUBBLE_RADIUS","drag","simulation","dragStarted","event","dragged","dragEnded","d3","arcTween","bubble","p","angle","interpolate","arc","t","enableDrag","clamp","value","min","max","resize","height","width","nodes","node","radius","d","getScale","simulate","maxValue","acc","minValue","scale","bubbles","getTargetRadius","bubbleCount","containerHeight","containerWidth","totalMinBubbleArea","isSmallContainer","padding","usableWidth","usableHeight","usableArea","maxRadius","radiusFromArea","radiusFromDimensions","getSmartScale","count","minRadius","computeScaledNodes","isCompact","values","PROGRESS_DURATION","Mercury","theme","useTheme","guid","mercury","transaction_total","bubbleId","trackArc","Mercury$1","LARGE_THRESHOLD","MEDIUM_THRESHOLD","Bubble","isDraggable","onClick","showTooltip","setShowTooltip","availableWidth","useWidgetContainerProvider","budgetBubble","background","textColor","icon","name","description","x","y","defaultSvgOffset","iconX","iconY","iconDimension","tooltipText","tooltipPopperSlot","handleKeyDown","handleFocus","handleBlur","Tooltip","BubbleChart","simulationNodes","setSimulationNodes","simulationRef","dragEnabledRef","updateSimulation","previousSimulation","currentSimulation","currentNodes","previousNodes","previousNodesMap","previousNode","updatedNodes","BubbleChart$1","BudgetsEmptyState","isMiniWidget","onConnectAccountsClick","createBudgetOnClick","config","useAppConfig","isMobile","useScreenSize","isError","setError","shouldShowEmptyGeneratedBudgets","setShouldShowEmptyGeneratedBudgets","recalculateBudgetsLoading","setRecalculateBudgetsLoading","autoGenerateBudgets","data","isSuccess","Loader","EmptyState","buttonType","BubbleBudgets","shouldShowZeroState","unavailableWidth","onEvent","useEvent","setSelectedBudget","isInitialized","useGlobalUiStore","accountsCopy","showConnectionsWidget","setShowConnectionsWidget","handleBubbleClick","ANALYTICS_EVENTS","handleManageConnections","ConnectionsDrawer","category_guid","percentage","status","Card","CardContent","StatusBar","SubBudgetZeroState","SubBudgetRow","setSelectedSubBudget","SingleSegmentDonut","AddSubBudget","parentBudget","setExpandedGuid","setOnSelect","useCategoryUiStore","subCategory","setSubCategory","sc","handleOpen","handleAddSubBudget","CategoryRow","SubBudgetList","subBudgets","deleteBudget","selectedSubBudget","updateBudget","filter","setFilter","useTransactionStore","isEditOpen","setIsEditOpen","isDeleteOpen","setIsDeleteOpen","handleUpdateBudget","handleDeleteBudget","handleClose","subBudget","TransactionList","BudgetDetails","is_mobile_webview","transactionCopy","isDesktop","isSmallTablet","isTablet","transactions","sortedTransactionsWithSplits","tags","selectedTab","setSelectedTab","transactionGuid","setTransactionGuid","transaction","handleTabChange","_event","newValue","handleExportToCsv","exportTransactionsToCSV","shouldShowExportButton","Tabs","Tab","TransactionDetails","BudgetDetailsDrawer","selectedAccountGuids","alert","dateRange","selectedBudget","handleEditClose","Snackbar","Alert","BudgetRow","descriptionColor","overBudget","BudgetList","handleBudgetClick","CardHeader","H3","Overview","accounts","useAccountStore","recurringCopy","incomeCategories","isIncomeOpen","setIsIncomeOpen","spentTotal","spendingStatus","total","current","spendingPercentage","color","incomePaid","incomeStatus","incomePercentage","handleOpenIncome","account","subDays","IconButton","ManageIncome","BUDGET_LIST_WIDTH","BubbleBudgetsWidget","onBackClick","onMenuClick","sx","selectedAccounts","setDisplayedDate","isDataLoaded","loadBudgetData","setDateRange","setTheme","setRecurringDateRange","loadDateRangeCategoryTotals","loadMonthlyCategoryTotals","isSmallMobile","isColumnWidths","isAddOpen","setIsAddOpen","useWidgetLoadTimer","startOfMonth","startOfToday","endOfMonth","onMonthChanged","handleAccountFilterClick","handleAddClick","handleBudgetAdded","handleBudgetsRecalculated","shouldDisableNext","isAfter","WidgetContainer","BubbleBudgetsContent","budgetsCopy","difference","availableHeight","initialHeightRef","bubbleHeight","baseHeight","BubbleBudgetsMiniWidget","props","getBudgetDifference","MiniWidgetContainer","BubbleBudgetsMiniWidget_default","EVENT_MESSAGES","BudgetDetailsDrawerV2","onClose","onViewHistory","transactionListProps","isCopyLoaded","formAction","setFormAction","inProgress","top_level_category_guid","budgetCategoryGuid","handleFormDialogClose","handlePrimaryAction","remainingAmount","spentPercentage","iconColor","getRemainingAmountSpentPercentage","buildCopyWithBold","copyKey","content","BudgetDetailsTopSection","alpha","getCategoryColor","CurrencyDialog","BudgetDetailsDrawerV2_default"],"mappings":"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"}
@@ -1,15 +1,16 @@
1
1
  export declare const useCashflowUiStore: () => {
2
+ globalStore: import('../../common').GlobalStore;
2
3
  dateRange: {
3
4
  start: Date;
4
5
  end: Date;
5
6
  };
6
7
  isDirty: boolean;
7
- nextIncome: import('../../core').Recurrence | undefined;
8
- upcomingExpenses: import('../../core').Recurrence[];
9
- selectedCashAccounts: import('../../core').Account[];
8
+ get income(): import('../../core').Recurrence[];
9
+ get upcomingIncome(): import('../../core').Recurrence[];
10
+ get upcomingExpenses(): import('../../core').Recurrence[];
11
+ get nextIncome(): import('../../core').Recurrence | undefined;
12
+ get selectedCashAccounts(): import('../../core').Account[];
13
+ get selectedCashBalance(): number;
10
14
  get daysUntilNextIncome(): number;
11
15
  get expensesTilNextIncome(): import('../../core').Recurrence[];
12
- setNextIncome: (nextIncome: import('../../core').Recurrence) => void;
13
- setUpcomingExpenses: (expenses: import('../../core').Recurrence[]) => void;
14
- setSelectedCashAccounts: (accounts: import('../../core').Account[]) => import('../../core').Account[];
15
16
  };