@mx-cartographer/experiences 9.3.0-alpha.bb2 → 9.3.0

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 (612) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/accounts/AccountsMiniWidget.es.js.map +1 -1
  3. package/dist/accounts/AccountsWidget.es.js.map +1 -1
  4. package/dist/accounts/ConnectMiniWidget.es.js.map +1 -1
  5. package/dist/accounts/components/AccountListItem.es.js.map +1 -1
  6. package/dist/accounts/components/AccountsList.es.js.map +1 -1
  7. package/dist/accounts/components/AccountsListCompact.es.js.map +1 -1
  8. package/dist/accounts/components/ConnectImage.es.js.map +1 -1
  9. package/dist/accounts/components/ConnectMiniWidgetCard.es.js.map +1 -1
  10. package/dist/accounts/components/ConnectionStatusIcons.es.js.map +1 -1
  11. package/dist/accounts/components/ConnectionsDrawer.es.js.map +1 -1
  12. package/dist/accounts/components/detailsdrawer/Accounts/AccountActions.es.js +40 -37
  13. package/dist/accounts/components/detailsdrawer/Accounts/AccountActions.es.js.map +1 -1
  14. package/dist/accounts/components/detailsdrawer/Accounts/AccountActionsRow.es.js.map +1 -1
  15. package/dist/accounts/components/detailsdrawer/Accounts/AccountConnection.es.js.map +1 -1
  16. package/dist/accounts/components/detailsdrawer/Accounts/AccountDetailEdit.es.js.map +1 -1
  17. package/dist/accounts/components/detailsdrawer/Accounts/AccountDetails.es.js.map +1 -1
  18. package/dist/accounts/components/detailsdrawer/Accounts/AccountDetailsChart.es.js.map +1 -1
  19. package/dist/accounts/components/detailsdrawer/Accounts/AccountDetailsContent.es.js.map +1 -1
  20. package/dist/accounts/components/detailsdrawer/Accounts/AccountDetailsDrawer.es.js.map +1 -1
  21. package/dist/accounts/components/detailsdrawer/Accounts/AccountDetailsHeader.es.js.map +1 -1
  22. package/dist/accounts/components/detailsdrawer/Accounts/ConnectionErrorMessage.es.js.map +1 -1
  23. package/dist/accounts/components/detailsdrawer/Transactions/TransactionsTab.es.js.map +1 -1
  24. package/dist/accounts/utils/AccountFields.es.js +4 -1
  25. package/dist/accounts/utils/AccountFields.es.js.map +1 -1
  26. package/dist/analytics/SurveyMiniWidget.es.js.map +1 -1
  27. package/dist/analytics/components/RatingScale.es.js.map +1 -1
  28. package/dist/budgets/BubbleBudgetsMiniWidget.es.js +46 -44
  29. package/dist/budgets/BubbleBudgetsMiniWidget.es.js.map +1 -1
  30. package/dist/budgets/BubbleBudgetsWidget.es.js.map +1 -1
  31. package/dist/budgets/components/AddBudgets.es.js.map +1 -1
  32. package/dist/budgets/components/BubbleBudgets.es.js.map +1 -1
  33. package/dist/budgets/components/BubbleChart.es.js +12 -12
  34. package/dist/budgets/components/BubbleChart.es.js.map +1 -1
  35. package/dist/budgets/components/BudgetDetailsDrawer.es.js.map +1 -1
  36. package/dist/budgets/components/BudgetDetailsDrawerV2.es.js.map +1 -1
  37. package/dist/budgets/components/BudgetList.es.js.map +1 -1
  38. package/dist/budgets/components/MerchantBudgetDetailsDrawer.es.js.map +1 -1
  39. package/dist/budgets/components/Overview.es.js.map +1 -1
  40. package/dist/budgets/components/addbudget/Header.es.js.map +1 -1
  41. package/dist/budgets/components/addbudget/RecalculateBudgets.es.js.map +1 -1
  42. package/dist/budgets/components/addbudget/UnbudgetedRow.es.js.map +1 -1
  43. package/dist/budgets/components/bubblechart/Bubble.es.js.map +1 -1
  44. package/dist/budgets/components/bubblechart/Mercury.es.js +13 -11
  45. package/dist/budgets/components/bubblechart/Mercury.es.js.map +1 -1
  46. package/dist/budgets/components/budgetdetails/AddSubBudget.es.js.map +1 -1
  47. package/dist/budgets/components/budgetdetails/BudgetDetails.es.js.map +1 -1
  48. package/dist/budgets/components/budgetdetails/Header.es.js.map +1 -1
  49. package/dist/budgets/components/budgetdetails/SubBudgetList.es.js.map +1 -1
  50. package/dist/budgets/components/budgetlist/BudgetRow.es.js.map +1 -1
  51. package/dist/budgets/components/budgetlist/SubBudgetRow.es.js.map +1 -1
  52. package/dist/budgets/components/budgetlist/SubBudgetZeroState.es.js.map +1 -1
  53. package/dist/budgets/components/shared/BudgetAmount.es.js.map +1 -1
  54. package/dist/budgets/components/shared/BudgetDetailsTopSection.es.js.map +1 -1
  55. package/dist/budgets/utils/BubblesSVG.es.js +10 -10
  56. package/dist/budgets/utils/BubblesSVG.es.js.map +1 -1
  57. package/dist/cashflow/CashflowMiniWidget.es.js.map +1 -1
  58. package/dist/cashflow/CashflowOnboarding.es.js.map +1 -1
  59. package/dist/cashflow/CashflowWidget.es.js.map +1 -1
  60. package/dist/cashflow/components/CashflowAmountHeading.es.js.map +1 -1
  61. package/dist/cashflow/components/CashflowContent.es.js.map +1 -1
  62. package/dist/cashflow/components/CashflowHeading.es.js.map +1 -1
  63. package/dist/cashflow/components/CashflowWidgetContent.es.js.map +1 -1
  64. package/dist/cashflow/components/DetailsExpenseHeader.es.js.map +1 -1
  65. package/dist/cashflow/components/DetailsExpenseRow.es.js.map +1 -1
  66. package/dist/cashflow/components/DetailsFooter.es.js.map +1 -1
  67. package/dist/cashflow/components/DetailsTab.es.js.map +1 -1
  68. package/dist/cashflow/components/RemainingCash.es.js.map +1 -1
  69. package/dist/cashflow/components/SummaryTab.es.js.map +1 -1
  70. package/dist/cashflow/components/onboarding/StepOne.es.js.map +1 -1
  71. package/dist/cashflow/components/onboarding/StepTwo.es.js.map +1 -1
  72. package/dist/categories/components/CategoryList.es.js +24 -24
  73. package/dist/categories/components/CategoryList.es.js.map +1 -1
  74. package/dist/categories/components/CategoryRow.es.js +6 -6
  75. package/dist/categories/components/CategoryRow.es.js.map +1 -1
  76. package/dist/categories/components/CategorySelector.es.js +36 -32
  77. package/dist/categories/components/CategorySelector.es.js.map +1 -1
  78. package/dist/categories/components/CategorySelectorDrawer.es.js.map +1 -1
  79. package/dist/categories/components/CustomCategories/AddSubcategory.es.js.map +1 -1
  80. package/dist/categories/components/CustomCategories/CustomCategoryModal.es.js +0 -1
  81. package/dist/categories/components/CustomCategories/CustomCategoryModal.es.js.map +1 -1
  82. package/dist/categories/components/SubcategoryList.es.js.map +1 -1
  83. package/dist/categories/components/SubcategoryRow.es.js.map +1 -1
  84. package/dist/common/components/Banner.es.js.map +1 -1
  85. package/dist/common/components/ConnectCard.es.js.map +1 -1
  86. package/dist/common/components/ConnectDrawer.es.js.map +1 -1
  87. package/dist/common/components/ConnectStatus.es.js.map +1 -1
  88. package/dist/common/components/CurrencyDialog.es.js.map +1 -1
  89. package/dist/common/components/CurrencyInput.es.js +11 -11
  90. package/dist/common/components/CurrencyText.es.js.map +1 -1
  91. package/dist/common/components/DataRow.es.js +7 -7
  92. package/dist/common/components/DataRow.es.js.map +1 -1
  93. package/dist/common/components/EmptyState.es.js.map +1 -1
  94. package/dist/common/components/Error.es.js.map +1 -1
  95. package/dist/common/components/ErrorBoundary.es.js.map +1 -1
  96. package/dist/common/components/GlobalAccountFilter.es.js.map +1 -1
  97. package/dist/common/components/IconBacking.es.js.map +1 -1
  98. package/dist/common/components/InformationTooltip.es.js.map +1 -1
  99. package/dist/common/components/ListItemAction.es.js.map +1 -1
  100. package/dist/common/components/ListItemRow.es.js +1 -1
  101. package/dist/common/components/ListItemRow.es.js.map +1 -1
  102. package/dist/common/components/ListItemWrapper.es.js.map +1 -1
  103. package/dist/common/components/Loader.es.js.map +1 -1
  104. package/dist/common/components/MicroWidgetContainer.es.js.map +1 -1
  105. package/dist/common/components/MiniWidgetContainer.es.js.map +1 -1
  106. package/dist/common/components/ResponsiveButton.es.js.map +1 -1
  107. package/dist/common/components/SearchBox.es.js.map +1 -1
  108. package/dist/common/components/Select.es.js.map +1 -1
  109. package/dist/common/components/SelectionBox.es.js.map +1 -1
  110. package/dist/common/components/SkeletonLoader.es.js.map +1 -1
  111. package/dist/common/components/SubheaderRow.es.js.map +1 -1
  112. package/dist/common/components/TabContentContainer.es.js.map +1 -1
  113. package/dist/common/components/TinyBarChart.es.js.map +1 -1
  114. package/dist/common/components/WidgetContainer.es.js.map +1 -1
  115. package/dist/common/components/WidgetDateRangeSelector.es.js +28 -28
  116. package/dist/common/components/WidgetDateRangeSelector.es.js.map +1 -1
  117. package/dist/common/components/addaccounts/AddAccounts.es.js +13 -13
  118. package/dist/common/components/addaccounts/AddAccounts.es.js.map +1 -1
  119. package/dist/common/components/calendar/Calendar.es.js.map +1 -1
  120. package/dist/common/components/calendar/Day.es.js.map +1 -1
  121. package/dist/common/components/calendar/Header.es.js +26 -23
  122. package/dist/common/components/calendar/Header.es.js.map +1 -1
  123. package/dist/common/components/charts/Donut.es.js.map +1 -1
  124. package/dist/common/components/charts/LineChart.es.js.map +1 -1
  125. package/dist/common/components/charts/StackedLineChart.es.js.map +1 -1
  126. package/dist/common/components/charts/StatusBar.es.js.map +1 -1
  127. package/dist/common/components/charts/linechart/CustomLegend.es.js.map +1 -1
  128. package/dist/common/components/charts/linechart/CustomLine.es.js.map +1 -1
  129. package/dist/common/components/charts/linechart/CustomMark.es.js.map +1 -1
  130. package/dist/common/components/charts/linechart/CustomTooltip.es.js.map +1 -1
  131. package/dist/common/components/charts/stackedlinechart/CategoryIconLabel.es.js.map +1 -1
  132. package/dist/common/components/charts/stackedlinechart/CustomAreaTooltip.es.js.map +1 -1
  133. package/dist/common/components/charts/stackedlinechart/CustomLegend.es.js.map +1 -1
  134. package/dist/common/components/charts/stackedlinechart/CustomPointTooltip.es.js.map +1 -1
  135. package/dist/common/components/daterangeselector/DateRangeSelector.d.ts +14 -0
  136. package/dist/common/components/daterangeselector/DateRangeSelector.es.js +113 -101
  137. package/dist/common/components/daterangeselector/DateRangeSelector.es.js.map +1 -1
  138. package/dist/common/components/dialog/Dialog.es.js.map +1 -1
  139. package/dist/common/components/donuts/MultiSegmentDonut.es.js.map +1 -1
  140. package/dist/common/components/donuts/SingleSegmentDonut.es.js.map +1 -1
  141. package/dist/common/components/drawer/Drawer.es.js.map +1 -1
  142. package/dist/common/components/drawer/Footer.es.js.map +1 -1
  143. package/dist/common/components/drawer/Header.es.js.map +1 -1
  144. package/dist/common/components/globalaccountfilter/GlobalAccountFilterList.es.js +71 -87
  145. package/dist/common/components/globalaccountfilter/GlobalAccountFilterList.es.js.map +1 -1
  146. package/dist/common/components/listitems/CollapseExpandListItem.es.js +4 -4
  147. package/dist/common/components/listitems/CollapseExpandListItem.es.js.map +1 -1
  148. package/dist/common/components/listitems/ToggleButtonListItem.es.js +6 -6
  149. package/dist/common/components/listitems/ToggleButtonListItem.es.js.map +1 -1
  150. package/dist/common/components/listitems/ToggleListItem.es.js.map +1 -1
  151. package/dist/common/hooks/useAriaLive.es.js.map +1 -1
  152. package/dist/common/utils/AccountFilter.es.js.map +1 -1
  153. package/dist/core/constants/Category.es.js.map +1 -1
  154. package/dist/core/stores/CategoryStore.d.ts +2 -0
  155. package/dist/core/stores/CategoryStore.es.js +55 -47
  156. package/dist/core/stores/CategoryStore.es.js.map +1 -1
  157. package/dist/core/stores/DebtsStore.es.js +10 -10
  158. package/dist/core/stores/DebtsStore.es.js.map +1 -1
  159. package/dist/core/stores/FinstrongStore.es.js +4 -4
  160. package/dist/core/stores/FinstrongStore.es.js.map +1 -1
  161. package/dist/core/stores/TrendsStore.es.js +6 -6
  162. package/dist/core/types/Account.es.js.map +1 -1
  163. package/dist/core/utils/DateUtil.es.js +24 -23
  164. package/dist/core/utils/DateUtil.es.js.map +1 -1
  165. package/dist/core/utils/DebtUtils.es.js +28 -28
  166. package/dist/core/utils/DebtUtils.es.js.map +1 -1
  167. package/dist/core/utils/GoalsUtil.es.js +11 -8
  168. package/dist/core/utils/GoalsUtil.es.js.map +1 -1
  169. package/dist/core/utils/InvestmentUtil.es.js +26 -23
  170. package/dist/core/utils/InvestmentUtil.es.js.map +1 -1
  171. package/dist/core/utils/NotificationUtils.es.js +11 -8
  172. package/dist/core/utils/NotificationUtils.es.js.map +1 -1
  173. package/dist/core/utils/RecurringTransactionsUtil.es.js +5 -8
  174. package/dist/core/utils/RecurringTransactionsUtil.es.js.map +1 -1
  175. package/dist/core/utils/SettingsUtil.es.js.map +1 -1
  176. package/dist/core/utils/TransactionUtils.es.js.map +1 -1
  177. package/dist/dashboard/Dashboard.es.js.map +1 -1
  178. package/dist/dashboard/Greeting.es.js.map +1 -1
  179. package/dist/debts/DebtsWidget.es.js.map +1 -1
  180. package/dist/debts/components/DebtDrawer.es.js.map +1 -1
  181. package/dist/debts/components/DebtsChart.es.js +36 -36
  182. package/dist/debts/components/DebtsChart.es.js.map +1 -1
  183. package/dist/debts/components/DebtsTable.es.js +13 -13
  184. package/dist/debts/components/DebtsTable.es.js.map +1 -1
  185. package/dist/debts/components/PaydownDrawer.es.js.map +1 -1
  186. package/dist/debts/components/SnowballCard.es.js.map +1 -1
  187. package/dist/debts/components/SnowballDrawer.es.js.map +1 -1
  188. package/dist/debts/components/actions/DebtsPriorityAction.es.js +23 -23
  189. package/dist/debts/components/actions/DebtsPriorityAction.es.js.map +1 -1
  190. package/dist/debts/components/actions/ExtraPaymentAction.es.js.map +1 -1
  191. package/dist/debts/components/actions/InterestRateAction.es.js.map +1 -1
  192. package/dist/debts/components/actions/MonthlyPaymentAction.es.js.map +1 -1
  193. package/dist/debts/components/actions/OriginalBalanceAction.es.js.map +1 -1
  194. package/dist/debts/components/debtsdrawer/DebtDetailsChart.es.js.map +1 -1
  195. package/dist/debts/components/debtsdrawer/DebtDetailsContent.es.js.map +1 -1
  196. package/dist/debts/components/debtsdrawer/DebtDetailsTab.es.js.map +1 -1
  197. package/dist/debts/components/debtsdrawer/DebtScheduleTab.es.js.map +1 -1
  198. package/dist/debts/components/debtsdrawer/DebtStatusCard.es.js.map +1 -1
  199. package/dist/debts/components/debtspaydown/PaydownButton.es.js.map +1 -1
  200. package/dist/debts/components/debtspaydown/PaydownContent.es.js.map +1 -1
  201. package/dist/debts/components/debtspriority/DebtsPriorityButton.es.js.map +1 -1
  202. package/dist/debts/components/debtspriority/DebtsPrioriyPopover.es.js.map +1 -1
  203. package/dist/debts/components/debtstable/AccountCell.es.js.map +1 -1
  204. package/dist/debts/components/debtstable/PriorityCell.es.js.map +1 -1
  205. package/dist/finstrong/FinancialStrengthCard.es.js.map +1 -1
  206. package/dist/finstrong/FinstrongWidget.es.js.map +1 -1
  207. package/dist/finstrong/components/ConnectMoreAccountsCard.es.js.map +1 -1
  208. package/dist/finstrong/components/CreditScore/CreditScoreContent.es.js.map +1 -1
  209. package/dist/finstrong/components/CreditScore/CreditScoreHeader.es.js.map +1 -1
  210. package/dist/finstrong/components/HaveManageableDebt/DebtPaymentTabContent.es.js.map +1 -1
  211. package/dist/finstrong/components/HaveManageableDebt/HaveManageableDebtComponent.es.js.map +1 -1
  212. package/dist/finstrong/components/HaveManageableDebt/HaveManageableDebtProgressBar.es.js.map +1 -1
  213. package/dist/finstrong/components/HaveManageableDebt/IncomeTabContent.es.js.map +1 -1
  214. package/dist/finstrong/components/HealthChart.es.js.map +1 -1
  215. package/dist/finstrong/components/KeyIndicatorsBorrowTab.es.js.map +1 -1
  216. package/dist/finstrong/components/KeyIndicatorsDrawer.es.js.map +1 -1
  217. package/dist/finstrong/components/KeyIndicatorsSaveTab.es.js.map +1 -1
  218. package/dist/finstrong/components/KeyIndicatorsSpendTab.es.js.map +1 -1
  219. package/dist/finstrong/components/KeyIndicatorsTabItem.es.js.map +1 -1
  220. package/dist/finstrong/components/KeyIndicatorsTabItemDrawer.es.js.map +1 -1
  221. package/dist/finstrong/components/KeyIndicatorsTabsWidget.es.js.map +1 -1
  222. package/dist/finstrong/components/MaintainingEmergencySavings/EstimatedContributionCalculator.es.js.map +1 -1
  223. package/dist/finstrong/components/MaintainingEmergencySavings/MaintainingEmergencySavingsContent.es.js.map +1 -1
  224. package/dist/finstrong/components/MaintainingEmergencySavings/MaintainingEmergencySavingsSticky.es.js.map +1 -1
  225. package/dist/finstrong/components/ManageCreditScore.es.js.map +1 -1
  226. package/dist/finstrong/components/ManageDOB.es.js.map +1 -1
  227. package/dist/finstrong/components/MissingData.es.js.map +1 -1
  228. package/dist/finstrong/components/ProfileDrawer.es.js.map +1 -1
  229. package/dist/finstrong/components/ProfileList.es.js.map +1 -1
  230. package/dist/finstrong/components/ProfileProgressBar.es.js.map +1 -1
  231. package/dist/finstrong/components/ProgressBar.es.js.map +1 -1
  232. package/dist/finstrong/components/SaveEnoughToLiveOn/AvailableTabContent.es.js.map +1 -1
  233. package/dist/finstrong/components/SaveEnoughToLiveOn/SaveEnoughToLiveOnDrawerContent.es.js.map +1 -1
  234. package/dist/finstrong/components/SaveEnoughToLiveOn/SaveEnoughToLiveOnProgressBar.es.js.map +1 -1
  235. package/dist/finstrong/components/SaveEnoughToLiveOn/SpendingTabContent.es.js.map +1 -1
  236. package/dist/finstrong/components/ScoreHistoryDrawer.es.js.map +1 -1
  237. package/dist/finstrong/components/ScoreRubricDrawer.es.js.map +1 -1
  238. package/dist/finstrong/components/SpendLessThanYouMake/SpendLessThanYouMakeComponent.es.js.map +1 -1
  239. package/dist/finstrong/components/SpendLessThanYouMake/SpendLessThanYouMakeProgressBar.es.js.map +1 -1
  240. package/dist/finstrong/components/StatusChip.es.js.map +1 -1
  241. package/dist/finstrong/components/onboarding/Onboarding.es.js.map +1 -1
  242. package/dist/finstrong/components/onboarding/OnboardingAddMonthlyIncome.es.js.map +1 -1
  243. package/dist/finstrong/components/onboarding/OnboardingBirthday.es.js.map +1 -1
  244. package/dist/finstrong/components/onboarding/OnboardingCreditScore.es.js.map +1 -1
  245. package/dist/finstrong/components/onboarding/OnboardingStepsDrawer.es.js +15 -18
  246. package/dist/finstrong/components/onboarding/OnboardingStepsDrawer.es.js.map +1 -1
  247. package/dist/finstrong/components/onboarding/OnboardingStepsHeader.es.js.map +1 -1
  248. package/dist/finstrong/components/paybillsontime/PayBillsOnTimeDrawerComponent.es.js.map +1 -1
  249. package/dist/finstrong/components/paybillsontime/PayBillsOnTimeStickyComponent.es.js.map +1 -1
  250. package/dist/finstrong/components/shared/Accounts.es.js.map +1 -1
  251. package/dist/finstrong/components/shared/CustomDoubleBarPlot.es.js.map +1 -1
  252. package/dist/finstrong/components/shared/CustomPieArc.es.js.map +1 -1
  253. package/dist/finstrong/components/shared/DialScoreCard.es.js +27 -27
  254. package/dist/finstrong/components/shared/DialScoreCard.es.js.map +1 -1
  255. package/dist/finstrong/components/shared/DoubleBarChart.es.js.map +1 -1
  256. package/dist/finstrong/components/shared/LineGraph.es.js +20 -19
  257. package/dist/finstrong/components/shared/LineGraph.es.js.map +1 -1
  258. package/dist/finstrong/components/shared/ScoreHistoryTimeline.es.js +28 -28
  259. package/dist/finstrong/components/shared/ScoreHistoryTimeline.es.js.map +1 -1
  260. package/dist/finstrong/components/shared/ScoreHistoryTimelineItem.es.js.map +1 -1
  261. package/dist/finstrong/components/shared/TotalCard.es.js.map +1 -1
  262. package/dist/finstrong/components/shared/Transactions.es.js.map +1 -1
  263. package/dist/finstrong/util/finstrongUtils.es.js +4 -1
  264. package/dist/finstrong/util/finstrongUtils.es.js.map +1 -1
  265. package/dist/goals/GoalsMicroWidget.es.js.map +1 -1
  266. package/dist/goals/GoalsWidget.es.js.map +1 -1
  267. package/dist/goals/components/AccountSelectionDrawer.es.js.map +1 -1
  268. package/dist/goals/components/AddGoal.es.js.map +1 -1
  269. package/dist/goals/components/GoalDetails.es.js.map +1 -1
  270. package/dist/goals/components/GoalDetailsDrawer.es.js.map +1 -1
  271. package/dist/goals/components/GoalList.es.js.map +1 -1
  272. package/dist/goals/components/GoalStatusCard.es.js.map +1 -1
  273. package/dist/goals/components/ManageGoals.es.js.map +1 -1
  274. package/dist/goals/components/TabTitle.es.js.map +1 -1
  275. package/dist/goals/components/actions/AccountAction.es.js.map +1 -1
  276. package/dist/goals/components/actions/AddRetirementAccountAction.es.js.map +1 -1
  277. package/dist/goals/components/actions/AmountToSaveAction.es.js.map +1 -1
  278. package/dist/goals/components/actions/BirthdayAction.es.js.map +1 -1
  279. package/dist/goals/components/actions/ChangeAccountAction.es.js.map +1 -1
  280. package/dist/goals/components/actions/ContributionAction.es.js.map +1 -1
  281. package/dist/goals/components/actions/GoalNameAction.es.js.map +1 -1
  282. package/dist/goals/components/actions/InterestRateAction.es.js.map +1 -1
  283. package/dist/goals/components/actions/MonthlyPaymentAction.es.js.map +1 -1
  284. package/dist/goals/components/actions/OriginalBalanceAction.es.js.map +1 -1
  285. package/dist/goals/components/actions/RetirementAgeAction.es.js.map +1 -1
  286. package/dist/goals/components/addgoal/AddGoalListItem.es.js +5 -5
  287. package/dist/goals/components/addgoal/AddGoalListItem.es.js.map +1 -1
  288. package/dist/goals/components/managegoals/CompleteListItem.es.js.map +1 -1
  289. package/dist/goals/components/managegoals/OngoingListItem.es.js.map +1 -1
  290. package/dist/goals/components/micro/GoalMicroStatusCard.es.js.map +1 -1
  291. package/dist/goals/components/micro/GoalsMicroEmptyState.es.js.map +1 -1
  292. package/dist/help/HelpWidget.es.js.map +1 -1
  293. package/dist/help/components/Help.es.js.map +1 -1
  294. package/dist/help/components/HelpList.es.js +32 -32
  295. package/dist/help/components/HelpList.es.js.map +1 -1
  296. package/dist/help/components/content/BottomImageContent.es.js.map +1 -1
  297. package/dist/help/components/content/ContentItem.es.js.map +1 -1
  298. package/dist/help/components/content/Header.es.js.map +1 -1
  299. package/dist/help/components/content/LeftImageContent.es.js.map +1 -1
  300. package/dist/help/components/content/NoImageContent.es.js.map +1 -1
  301. package/dist/help/components/content/RightImageContent.es.js.map +1 -1
  302. package/dist/help/components/content/TopImageContent.es.js.map +1 -1
  303. package/dist/help/components/requestsupport/ContactSupport.es.js.map +1 -1
  304. package/dist/help/components/requestsupport/HelpByCategoryList.es.js.map +1 -1
  305. package/dist/help/components/requestsupport/MissingInstitution.es.js.map +1 -1
  306. package/dist/help/components/requestsupport/PopularTopicsDrawer.es.js.map +1 -1
  307. package/dist/help/components/requestsupport/PopularTopicsList.es.js.map +1 -1
  308. package/dist/help/components/requestsupport/PopularTopicsRow.es.js +6 -6
  309. package/dist/help/components/requestsupport/PopularTopicsRow.es.js.map +1 -1
  310. package/dist/help/components/requestsupport/RequestSupport.es.js.map +1 -1
  311. package/dist/help/components/requestsupport/RequestSupportFooter.es.js.map +1 -1
  312. package/dist/help/components/requestsupport/RequestSupportHeader.es.js.map +1 -1
  313. package/dist/help/components/requestsupport/RequestSupportInstitution.es.js.map +1 -1
  314. package/dist/help/components/requestsupport/SupportSuccessMessage.es.js.map +1 -1
  315. package/dist/insights/components/feed/Header.es.js.map +1 -1
  316. package/dist/insights/components/insights/AmericanUpcomingTaxDeadlineAlert/AmericanUpcomingTaxDeadlineAlert.es.js.map +1 -1
  317. package/dist/insights/components/insights/BillAmountNotStandard/BillAmountNotStandard.es.js.map +1 -1
  318. package/dist/insights/components/insights/BillAmountNotStandard/BillAmountNotStandardMUI.es.js.map +1 -1
  319. package/dist/insights/components/insights/CashBack/CashBack.es.js.map +1 -1
  320. package/dist/insights/components/insights/CategoryBudget/CategoryBudget.es.js +17 -17
  321. package/dist/insights/components/insights/CategoryBudget/CategoryBudget.es.js.map +1 -1
  322. package/dist/insights/components/insights/CategorySpendingV2/CategorySpendingV2.es.js.map +1 -1
  323. package/dist/insights/components/insights/CategorySpendingV2/CategorySpendingV2MUI.es.js.map +1 -1
  324. package/dist/insights/components/insights/CelebrateCreditCardPayoff/CelebrateCreditCardPayoff.es.js.map +1 -1
  325. package/dist/insights/components/insights/CustomTransaction/CustomTransaction.es.js.map +1 -1
  326. package/dist/insights/components/insights/DiscoveredAccounts/DiscoveredAccountsBody.es.js.map +1 -1
  327. package/dist/insights/components/insights/DiscoveredAccounts/DiscoveredAccountsLearnMoreDrawerContent.es.js +6 -6
  328. package/dist/insights/components/insights/DiscoveredAccounts/DiscoveredAccountsLearnMoreDrawerContent.es.js.map +1 -1
  329. package/dist/insights/components/insights/DiscoveredAccounts/DiscoveredAccountsMiniInsight.es.js.map +1 -1
  330. package/dist/insights/components/insights/FederalBankHoliday/FederalBankHoliday.es.js.map +1 -1
  331. package/dist/insights/components/insights/FederalBankHoliday/FederalBankHolidayMUI.es.js.map +1 -1
  332. package/dist/insights/components/insights/MarketingHub/Offer.es.js.map +1 -1
  333. package/dist/insights/components/insights/MonthlyDebtToIncomeComparisonV2/MonthlyDebtToIncomeComparisonV2.es.js.map +1 -1
  334. package/dist/insights/components/insights/MonthlyEmergencyFundReview/LastMonthsContributionSection.es.js.map +1 -1
  335. package/dist/insights/components/insights/MonthlyEmergencyFundReview/MonthlyEmergencyFundReviewBody.es.js +38 -35
  336. package/dist/insights/components/insights/MonthlyEmergencyFundReview/MonthlyEmergencyFundReviewBody.es.js.map +1 -1
  337. package/dist/insights/components/insights/MonthlyEmergencyFundReview/ProjectedCompletionSection.es.js.map +1 -1
  338. package/dist/insights/components/insights/MonthlyEmergencyFundReview/TotalSection.es.js.map +1 -1
  339. package/dist/insights/components/insights/MonthlySavingsToIncomeComparison/MonthlySavingsToIncomeComparison.es.js.map +1 -1
  340. package/dist/insights/components/insights/MonthlySpendToIncomeComparisonV2/MonthlySpendToIncomeComparisonV2.es.js.map +1 -1
  341. package/dist/insights/components/insights/MonthlySpendingComparisonV2/MonthlySpendingComparisonV2.es.js.map +1 -1
  342. package/dist/insights/components/insights/P2pCategorization/P2pCategorization.es.js.map +1 -1
  343. package/dist/insights/components/insights/P2pCategorization/shared/P2pCategorizationMultipleTransactions.es.js.map +1 -1
  344. package/dist/insights/components/insights/P2pCategorization/shared/P2pCategorizationSingleTransaction.es.js.map +1 -1
  345. package/dist/insights/components/insights/SavingsAccountBalancesSummary/SavingsAccountBalancesSummary.es.js.map +1 -1
  346. package/dist/insights/components/insights/SharedDeposit/SharedDeposit.es.js.map +1 -1
  347. package/dist/insights/components/insights/SwitchDirectDeposit/AccountBox.es.js.map +1 -1
  348. package/dist/insights/components/insights/SwitchDirectDeposit/SwitchDirectDepositMainContainer.es.js.map +1 -1
  349. package/dist/insights/components/insights/UnifiedDeposit/UnifiedDeposit.es.js.map +1 -1
  350. package/dist/insights/components/insights/UnifiedDeposit/UnifiedDepositBody.es.js.map +1 -1
  351. package/dist/insights/components/insights/UserFeedback/UserFeedback.es.js.map +1 -1
  352. package/dist/insights/components/insights/WeeklyNoSpendDays/BubbleWeek.es.js.map +1 -1
  353. package/dist/insights/components/insights/WeeklyNoSpendDays/WeeklyNoSpendDays.es.js.map +1 -1
  354. package/dist/insights/components/shared/ChartDrawerTemplate/ChartDrawerTemplate.es.js +22 -22
  355. package/dist/insights/components/shared/ChartDrawerTemplate/ChartDrawerTemplate.es.js.map +1 -1
  356. package/dist/insights/components/shared/ChartDrawerTemplate/TipSection.es.js.map +1 -1
  357. package/dist/insights/components/shared/ChartTransactionWithDrillDown.es.js.map +1 -1
  358. package/dist/insights/components/shared/Charts/BarChart/BarChart.es.js.map +1 -1
  359. package/dist/insights/components/shared/Charts/BarChart/BarChartV2.es.js.map +1 -1
  360. package/dist/insights/components/shared/Charts/BarChart/ChartLegend.es.js.map +1 -1
  361. package/dist/insights/components/shared/Charts/BarChart/ChartLegendV2.es.js.map +1 -1
  362. package/dist/insights/components/shared/Charts/BarChart/CustomBarPlot.es.js.map +1 -1
  363. package/dist/insights/components/shared/Charts/BarChart/CustomBarPlotV2.es.js.map +1 -1
  364. package/dist/insights/components/shared/Charts/BarChart/CustomDoubleBarPlot.es.js.map +1 -1
  365. package/dist/insights/components/shared/Charts/BarChart/CustomDoubleBarPlotMXUI.es.js.map +1 -1
  366. package/dist/insights/components/shared/Charts/BarChart/DoubleBarChart.es.js.map +1 -1
  367. package/dist/insights/components/shared/Charts/BarChart/DoubleBarChartLegend.es.js.map +1 -1
  368. package/dist/insights/components/shared/Charts/BarChart/DoubleBarChartLegendMXUI.es.js.map +1 -1
  369. package/dist/insights/components/shared/Charts/BarChart/DoubleBarChartMXUI.es.js.map +1 -1
  370. package/dist/insights/components/shared/ConnectionCard.es.js.map +1 -1
  371. package/dist/insights/components/shared/Coupon.es.js.map +1 -1
  372. package/dist/insights/components/shared/DeepLinks/DeepLinkDialog.es.js.map +1 -1
  373. package/dist/insights/components/shared/DeepLinks/DirectDeposit/DirectDepositDeepLink.es.js.map +1 -1
  374. package/dist/insights/components/shared/DeepLinks/DirectDeposit/Dot.es.js.map +1 -1
  375. package/dist/insights/components/shared/DirectDeposit/DirectDeposit.es.js.map +1 -1
  376. package/dist/insights/components/shared/DirectDeposit/DirectDepositSubHeader.es.js.map +1 -1
  377. package/dist/insights/components/shared/DirectDeposit/FullFeedBodyHeader.es.js.map +1 -1
  378. package/dist/insights/components/shared/DirectDeposit/LeftBox.es.js.map +1 -1
  379. package/dist/insights/components/shared/DirectDeposit/MiniBodyHeader.es.js.map +1 -1
  380. package/dist/insights/components/shared/DirectDeposit/RightBox.es.js.map +1 -1
  381. package/dist/insights/components/shared/DiscoveredAccountsConnect.es.js.map +1 -1
  382. package/dist/insights/components/shared/DrillDownCalculation/BalanceStepper.es.js.map +1 -1
  383. package/dist/insights/components/shared/DrillDownCalculation/DrillDownCalculation.es.js.map +1 -1
  384. package/dist/insights/components/shared/ErrorCard/ErrorCard.es.js.map +1 -1
  385. package/dist/insights/components/shared/GenericFeedback/FeedbackButtons.es.js.map +1 -1
  386. package/dist/insights/components/shared/GenericFeedback/FeedbackDescription.es.js.map +1 -1
  387. package/dist/insights/components/shared/GenericFeedback/FeedbackHeader.es.js.map +1 -1
  388. package/dist/insights/components/shared/GenericFeedback/FeedbackOptions.es.js.map +1 -1
  389. package/dist/insights/components/shared/GenericFeedback/FeedbackText.es.js.map +1 -1
  390. package/dist/insights/components/shared/GoalProgress.es.js.map +1 -1
  391. package/dist/insights/components/shared/GradientBox.es.js.map +1 -1
  392. package/dist/insights/components/shared/InsightsCard/BeatCard.es.js.map +1 -1
  393. package/dist/insights/components/shared/InsightsCard/BeatCardMUI.es.js.map +1 -1
  394. package/dist/insights/components/shared/InsightsCard/CardButtonSection.es.js.map +1 -1
  395. package/dist/insights/components/shared/InsightsCard/CardError.es.js.map +1 -1
  396. package/dist/insights/components/shared/InsightsCard/CardFooter.es.js.map +1 -1
  397. package/dist/insights/components/shared/InsightsCard/CardLoading.es.js.map +1 -1
  398. package/dist/insights/components/shared/InsightsCard/ClientConfigurableCta.es.js.map +1 -1
  399. package/dist/insights/components/shared/InsightsCard/ContentAndDescription.es.js.map +1 -1
  400. package/dist/insights/components/shared/InsightsCard/ContentAndDescriptionMUI.es.js.map +1 -1
  401. package/dist/insights/components/shared/InsightsCard/Description.es.js.map +1 -1
  402. package/dist/insights/components/shared/InsightsCard/DescriptionMUI.es.js.map +1 -1
  403. package/dist/insights/components/shared/InsightsCard/EmbeddedCard.es.js.map +1 -1
  404. package/dist/insights/components/shared/InsightsCard/FeedbackCard.es.js +4 -4
  405. package/dist/insights/components/shared/InsightsCard/FeedbackCard.es.js.map +1 -1
  406. package/dist/insights/components/shared/InsightsCard/InsightButton.es.js.map +1 -1
  407. package/dist/insights/components/shared/MenuAction.es.js +4 -4
  408. package/dist/insights/components/shared/MenuAction.es.js.map +1 -1
  409. package/dist/insights/components/shared/MiniInsightCard.es.js.map +1 -1
  410. package/dist/insights/components/shared/P2P/P2PMultipleCategorization.es.js +23 -23
  411. package/dist/insights/components/shared/P2P/P2PMultipleCategorization.es.js.map +1 -1
  412. package/dist/insights/components/shared/P2PCategorizationSingleAccount/P2PCategorizationSingleAccount.es.js +24 -24
  413. package/dist/insights/components/shared/P2PCategorizationSingleAccount/P2PCategorizationSingleAccount.es.js.map +1 -1
  414. package/dist/insights/components/shared/ProgressBar.es.js.map +1 -1
  415. package/dist/insights/components/shared/SaveAnExtra100/SaveAnExtra100.es.js.map +1 -1
  416. package/dist/insights/components/shared/SaveEnoughToLiveOnBottomSection.es.js.map +1 -1
  417. package/dist/insights/components/shared/StatusIndicator.es.js.map +1 -1
  418. package/dist/insights/components/shared/ThemedSVGImage.es.js.map +1 -1
  419. package/dist/insights/components/shared/TransactionCard.es.js.map +1 -1
  420. package/dist/insights/components/shared/ZeroState/LinedCardZeroState.es.js.map +1 -1
  421. package/dist/investments/InvestmentsWidget.es.js.map +1 -1
  422. package/dist/investments/components/Allocation.es.js.map +1 -1
  423. package/dist/investments/components/Analysis.es.js.map +1 -1
  424. package/dist/investments/components/AnalysisDetails.es.js.map +1 -1
  425. package/dist/investments/components/EmptyStateFooterComponent.es.js.map +1 -1
  426. package/dist/investments/components/HeaderCell.es.js.map +1 -1
  427. package/dist/investments/components/HoldingDrawer.es.js.map +1 -1
  428. package/dist/investments/components/HoldingTable.es.js +167 -164
  429. package/dist/investments/components/HoldingTable.es.js.map +1 -1
  430. package/dist/investments/components/InfoToolTip.es.js.map +1 -1
  431. package/dist/investments/components/Overview.es.js.map +1 -1
  432. package/dist/investments/components/TabTitle.es.js.map +1 -1
  433. package/dist/investments/components/allocation/InvestementAllocationList.es.js.map +1 -1
  434. package/dist/investments/components/allocation/InvestmentsAllocationChart.es.js.map +1 -1
  435. package/dist/merchants/components/MerchantLookup.es.js.map +1 -1
  436. package/dist/microinsights/InsightsMicroWidget.es.js.map +1 -1
  437. package/dist/microinsights/MicroCardTemplate.es.js.map +1 -1
  438. package/dist/microinsights/Spinner.es.js.map +1 -1
  439. package/dist/microinsights/beaticons/BeatCategoryIcon.es.js +8 -8
  440. package/dist/microinsights/beaticons/BeatCategoryIcon.es.js.map +1 -1
  441. package/dist/microinsights/beaticons/BeatMaterialIcon.es.js.map +1 -1
  442. package/dist/microinsights/beaticons/ChartFilledIcon.es.js.map +1 -1
  443. package/dist/microinsights/beaticons/ZeroStateIcon.es.js.map +1 -1
  444. package/dist/microinsights/cards/ViewMoreMicroCard.d.ts +1 -0
  445. package/dist/microinsights/cards/ViewMoreMicroCard.es.js.map +1 -1
  446. package/dist/microinsights/carousel/BeatList.es.js +17 -17
  447. package/dist/microinsights/carousel/BeatList.es.js.map +1 -1
  448. package/dist/microinsights/carousel/CarouselControls.es.js.map +1 -1
  449. package/dist/microinsights/carousel/CarouselHeader.es.js.map +1 -1
  450. package/dist/microinsights/carousel/MicroBeatCarousel.es.js.map +1 -1
  451. package/dist/microinsights/constants/Analytics.es.js.map +1 -1
  452. package/dist/networth/NetWorthMicroWidget.es.js.map +1 -1
  453. package/dist/networth/NetWorthWidget.es.js.map +1 -1
  454. package/dist/networth/components/AssetsLiabilitiesDetail.es.js +1 -1
  455. package/dist/networth/components/AssetsLiabilitiesDetail.es.js.map +1 -1
  456. package/dist/networth/components/GainsLossesDetail.es.js.map +1 -1
  457. package/dist/networth/components/NetWorthChange.es.js.map +1 -1
  458. package/dist/networth/components/NetWorthChart.es.js.map +1 -1
  459. package/dist/networth/components/NetWorthList.es.js.map +1 -1
  460. package/dist/networth/components/NetWorthListItem.es.js.map +1 -1
  461. package/dist/networth/components/NetWorthSummary.es.js.map +1 -1
  462. package/dist/networth/components/micro/NetworthData.es.js.map +1 -1
  463. package/dist/networth/components/micro/ZeroState.es.js.map +1 -1
  464. package/dist/notifications/components/DateRow.es.js.map +1 -1
  465. package/dist/notifications/components/NotificationBadge.es.js.map +1 -1
  466. package/dist/notifications/components/NotificationCard.es.js.map +1 -1
  467. package/dist/notifications/components/NotificationDrawer.es.js.map +1 -1
  468. package/dist/notifications/components/NotificationList.es.js +33 -30
  469. package/dist/notifications/components/NotificationList.es.js.map +1 -1
  470. package/dist/notifications/components/NotificationsEmptyState.es.js.map +1 -1
  471. package/dist/recurringtransactions/RecurringTransactionsMicroWidget.es.js.map +1 -1
  472. package/dist/recurringtransactions/RecurringTransactionsMiniWidget.es.js.map +1 -1
  473. package/dist/recurringtransactions/RecurringTransactionsWidget.es.js.map +1 -1
  474. package/dist/recurringtransactions/ZeroStateMicroWidget.es.js.map +1 -1
  475. package/dist/recurringtransactions/components/MicroWidgetContent.es.js.map +1 -1
  476. package/dist/recurringtransactions/components/MiniWidgetContent.es.js.map +1 -1
  477. package/dist/recurringtransactions/components/PaymentSchedule.es.js.map +1 -1
  478. package/dist/recurringtransactions/components/RecurrenceBadges.es.js.map +1 -1
  479. package/dist/recurringtransactions/components/RecurrenceList.es.js.map +1 -1
  480. package/dist/recurringtransactions/components/RecurrenceRow.es.js.map +1 -1
  481. package/dist/recurringtransactions/components/RecurringSettingsDrawer.es.js.map +1 -1
  482. package/dist/recurringtransactions/components/RecurringStatus.es.js.map +1 -1
  483. package/dist/recurringtransactions/components/RecurringTransactionDetails.es.js.map +1 -1
  484. package/dist/recurringtransactions/components/RecurringTransactionDetailsDrawer.es.js.map +1 -1
  485. package/dist/recurringtransactions/components/RecurringTransactionList.es.js.map +1 -1
  486. package/dist/recurringtransactions/components/RecurringTransactions.es.js.map +1 -1
  487. package/dist/recurringtransactions/components/UpcomingRecurrenceCard.es.js.map +1 -1
  488. package/dist/recurringtransactions/components/actions/LinkTransactionDrawer.es.js.map +1 -1
  489. package/dist/recurringtransactions/components/actions/MarkAsPaidDialog.es.js.map +1 -1
  490. package/dist/recurringtransactions/components/actions/MarkAsUnpaidDialog.es.js.map +1 -1
  491. package/dist/recurringtransactions/components/actions/PaymentScheduleAction.es.js.map +1 -1
  492. package/dist/recurringtransactions/components/micro/MerchantLogosRow.es.js.map +1 -1
  493. package/dist/recurringtransactions/components/micro/OverlappingMerchantLogos.es.js.map +1 -1
  494. package/dist/recurringtransactions/components/micro/RecurrenceLegend.es.js.map +1 -1
  495. package/dist/recurringtransactions/components/recurrencecalendar/Legend.es.js.map +1 -1
  496. package/dist/recurringtransactions/components/recurrencecalendar/RecurrenceCalendar.es.js.map +1 -1
  497. package/dist/recurringtransactions/components/recurrencecalendar/RecurrenceDay.es.js.map +1 -1
  498. package/dist/recurringtransactions/components/shared/RecurringSettings.es.js.map +1 -1
  499. package/dist/recurringtransactions/components/shared/recurringsettings/AddRecurringTransaction.es.js.map +1 -1
  500. package/dist/recurringtransactions/components/shared/recurringsettings/AddRecurringTransactionDetails.es.js.map +1 -1
  501. package/dist/recurringtransactions/components/shared/recurringsettings/ManageExpenses.es.js.map +1 -1
  502. package/dist/recurringtransactions/components/shared/recurringsettings/ManageIncome.es.js.map +1 -1
  503. package/dist/recurringtransactions/components/shared/recurringsettings/RecurringRow.es.js.map +1 -1
  504. package/dist/recurringtransactions/components/shared/recurringsettings/RecurringSettingsZeroState.es.js.map +1 -1
  505. package/dist/recurringtransactions/components/shared/recurringsettings/SelectTransaction.es.js.map +1 -1
  506. package/dist/settings/NotificationSettingsWidget.es.js.map +1 -1
  507. package/dist/settings/SettingsWidget.es.js.map +1 -1
  508. package/dist/settings/TransactionRulesWidget.es.js.map +1 -1
  509. package/dist/settings/components/SettingsWidgetContents.es.js.map +1 -1
  510. package/dist/settings/components/devices/DeviceDialog.es.js.map +1 -1
  511. package/dist/settings/components/devices/DeviceList.es.js.map +1 -1
  512. package/dist/settings/components/devices/DeviceTab.es.js.map +1 -1
  513. package/dist/settings/components/devices/DeviceTable.es.js +82 -82
  514. package/dist/settings/components/devices/DeviceTable.es.js.map +1 -1
  515. package/dist/settings/components/notifications/AccountNotificationProfile.es.js.map +1 -1
  516. package/dist/settings/components/notifications/AccountNotificationProfiles.es.js.map +1 -1
  517. package/dist/settings/components/notifications/AccountProfileListItem.es.js.map +1 -1
  518. package/dist/settings/components/notifications/DeliveryMethods.es.js.map +1 -1
  519. package/dist/settings/components/notifications/NotificationProfile.es.js.map +1 -1
  520. package/dist/settings/components/notifications/NotificationSettings.es.js.map +1 -1
  521. package/dist/settings/components/notifications/PersonalDetails.es.js.map +1 -1
  522. package/dist/settings/components/profile/ProfileTab.es.js.map +1 -1
  523. package/dist/settings/components/profile/actions/VerifyEmailAction.es.js.map +1 -1
  524. package/dist/settings/components/profile/actions/VerifyPhoneAction.es.js.map +1 -1
  525. package/dist/settings/components/profile/actions/VerifyTokenAction.es.js.map +1 -1
  526. package/dist/settings/components/transactionrules/TransactionRulesTab.es.js.map +1 -1
  527. package/dist/settings/components/transactionrules/actions/DeleteRuleAction.es.js.map +1 -1
  528. package/dist/settings/components/transactionrules/actions/EditPayeeAction.es.js.map +1 -1
  529. package/dist/settings/components/transactionrules/components/EditRuleDetails.es.js.map +1 -1
  530. package/dist/settings/components/transactionrules/components/RuleListItem.es.js +24 -21
  531. package/dist/settings/components/transactionrules/components/RuleListItem.es.js.map +1 -1
  532. package/dist/spending/SpendingMiniWidget.es.js.map +1 -1
  533. package/dist/spending/SpendingWidget.es.js +48 -39
  534. package/dist/spending/SpendingWidget.es.js.map +1 -1
  535. package/dist/spending/components/MiniSpendingChart.es.js.map +1 -1
  536. package/dist/spending/components/Spending.es.js.map +1 -1
  537. package/dist/spending/components/SpendingChart.es.js.map +1 -1
  538. package/dist/spending/components/SpendingDonut.es.js.map +1 -1
  539. package/dist/spending/components/SpendingLegend.es.js.map +1 -1
  540. package/dist/spending/components/SpendingList.es.js.map +1 -1
  541. package/dist/spending/components/SpendingTabLabel.es.js.map +1 -1
  542. package/dist/transactions/TransactionWidget.es.js.map +1 -1
  543. package/dist/transactions/components/shared/TransactionDetails.es.js.map +1 -1
  544. package/dist/transactions/components/shared/TransactionList.es.js.map +1 -1
  545. package/dist/transactions/components/shared/TransactionTable.es.js.map +1 -1
  546. package/dist/transactions/components/shared/transactiondetails/Description.es.js.map +1 -1
  547. package/dist/transactions/components/shared/transactiondetails/FlagTransaction.es.js.map +1 -1
  548. package/dist/transactions/components/shared/transactiondetails/ManualTransactionDetails.es.js.map +1 -1
  549. package/dist/transactions/components/shared/transactiondetails/TransactionAmountHeader.es.js.map +1 -1
  550. package/dist/transactions/components/shared/transactiondetails/TransactionDetailsView.es.js.map +1 -1
  551. package/dist/transactions/components/shared/transactiondetails/actions/AddMerchantBudgetAction.es.js +7 -7
  552. package/dist/transactions/components/shared/transactiondetails/actions/AddMerchantBudgetAction.es.js.map +1 -1
  553. package/dist/transactions/components/shared/transactiondetails/actions/CategoryAction.es.js +29 -29
  554. package/dist/transactions/components/shared/transactiondetails/actions/CategoryAction.es.js.map +1 -1
  555. package/dist/transactions/components/shared/transactiondetails/actions/DateAction.es.js +36 -36
  556. package/dist/transactions/components/shared/transactiondetails/actions/DateAction.es.js.map +1 -1
  557. package/dist/transactions/components/shared/transactiondetails/actions/DeleteAction.es.js +7 -7
  558. package/dist/transactions/components/shared/transactiondetails/actions/DeleteAction.es.js.map +1 -1
  559. package/dist/transactions/components/shared/transactiondetails/actions/DeleteLogoAction.es.js +7 -7
  560. package/dist/transactions/components/shared/transactiondetails/actions/DeleteLogoAction.es.js.map +1 -1
  561. package/dist/transactions/components/shared/transactiondetails/actions/ExcludeAction.es.js +7 -7
  562. package/dist/transactions/components/shared/transactiondetails/actions/ExcludeAction.es.js.map +1 -1
  563. package/dist/transactions/components/shared/transactiondetails/actions/MemoAction.es.js +24 -24
  564. package/dist/transactions/components/shared/transactiondetails/actions/MemoAction.es.js.map +1 -1
  565. package/dist/transactions/components/shared/transactiondetails/actions/SplitAction.es.js +40 -40
  566. package/dist/transactions/components/shared/transactiondetails/actions/SplitAction.es.js.map +1 -1
  567. package/dist/transactions/components/shared/transactiondetails/actions/TagsAction.es.js +34 -34
  568. package/dist/transactions/components/shared/transactiondetails/actions/TagsAction.es.js.map +1 -1
  569. package/dist/transactions/components/shared/transactionlist/TransactionRow.es.js.map +1 -1
  570. package/dist/transactions/components/shared/transactionlist/ZeroState.es.js.map +1 -1
  571. package/dist/transactions/components/shared/transactiontable/cells/AccountCell.es.js.map +1 -1
  572. package/dist/transactions/components/shared/transactiontable/cells/AmountCell.es.js.map +1 -1
  573. package/dist/transactions/components/shared/transactiontable/cells/CategoryCell.es.js.map +1 -1
  574. package/dist/transactions/components/shared/transactiontable/cells/DateCell.es.js.map +1 -1
  575. package/dist/transactions/components/shared/transactiontable/cells/FlagCell.es.js.map +1 -1
  576. package/dist/transactions/components/shared/transactiontable/cells/HeaderCell.es.js.map +1 -1
  577. package/dist/transactions/components/shared/transactiontable/cells/PayeeCell.es.js.map +1 -1
  578. package/dist/transactions/components/splitmanager/SplitManager.es.js.map +1 -1
  579. package/dist/transactions/components/splitmanager/SplitRow.es.js.map +1 -1
  580. package/dist/transactions/components/tagmanager/Header.es.js.map +1 -1
  581. package/dist/transactions/components/tagmanager/SearchBox.es.js.map +1 -1
  582. package/dist/transactions/components/tagmanager/TagManager.es.js.map +1 -1
  583. package/dist/transactions/components/tagmanager/TagRow.es.js +4 -4
  584. package/dist/transactions/components/tagmanager/TagRow.es.js.map +1 -1
  585. package/dist/transactions/components/transactionwidget/AddAccountModal.es.js.map +1 -1
  586. package/dist/transactions/components/transactionwidget/actions/EditCategoryAction.es.js.map +1 -1
  587. package/dist/transactions/components/transactionwidget/actions/ExportCsvAction.es.js.map +1 -1
  588. package/dist/transactions/utils/Transactions.es.js +20 -12
  589. package/dist/transactions/utils/Transactions.es.js.map +1 -1
  590. package/dist/trends/TrendsFullWidget.es.js +47 -47
  591. package/dist/trends/TrendsFullWidget.es.js.map +1 -1
  592. package/dist/trends/TrendsMicroWidget.es.js.map +1 -1
  593. package/dist/trends/TrendsMiniWidget.es.js.map +1 -1
  594. package/dist/trends/TrendsWidget.es.js +88 -89
  595. package/dist/trends/TrendsWidget.es.js.map +1 -1
  596. package/dist/trends/ZeroStateMicroWidget.es.js.map +1 -1
  597. package/dist/trends/components/CategoriesList.es.js.map +1 -1
  598. package/dist/trends/components/CategoryDetailChart.es.js.map +1 -1
  599. package/dist/trends/components/CategoryDetails.es.js.map +1 -1
  600. package/dist/trends/components/DateRangeText.es.js.map +1 -1
  601. package/dist/trends/components/TrendsChart.es.js.map +1 -1
  602. package/dist/trends/components/TrendsDrawer.es.js.map +1 -1
  603. package/dist/trends/components/TrendsInsights.es.js +21 -21
  604. package/dist/trends/components/TrendsInsights.es.js.map +1 -1
  605. package/dist/trends/components/TrendsMicroSpendingIncomeBox.es.js.map +1 -1
  606. package/dist/trends/components/TrendsTableContainer.es.js.map +1 -1
  607. package/dist/trends/components/TrendsViewToggle.es.js.map +1 -1
  608. package/dist/trends/components/trendstable/AccessibleSortIcon.es.js.map +1 -1
  609. package/dist/trends/components/trendstable/AmountCell.es.js.map +1 -1
  610. package/dist/trends/components/trendstable/CategoryCell.es.js.map +1 -1
  611. package/dist/trends/components/trendstable/HeaderCell.es.js.map +1 -1
  612. package/package.json +36 -35
@@ -1 +1 @@
1
- {"version":3,"file":"RecurringTransactionsUtil.es.js","names":[],"sources":["../../../src/core/utils/RecurringTransactionsUtil.ts"],"sourcesContent":["import { addDays } from 'date-fns/addDays'\nimport { addMonths } from 'date-fns/addMonths'\nimport { addQuarters } from 'date-fns/addQuarters'\nimport { addWeeks } from 'date-fns/addWeeks'\nimport { addYears } from 'date-fns/addYears'\nimport { differenceInDays } from 'date-fns/differenceInDays'\nimport { formatISO } from 'date-fns/formatISO'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { isAfter } from 'date-fns/isAfter'\nimport { isBefore } from 'date-fns/isBefore'\nimport { isSameDay } from 'date-fns/isSameDay'\nimport { lastDayOfMonth } from 'date-fns/lastDayOfMonth'\nimport { nextDay } from 'date-fns/nextDay'\nimport { parseISO } from 'date-fns/parseISO'\nimport { setDate } from 'date-fns/setDate'\nimport { setDay } from 'date-fns/setDay'\nimport { setDayOfYear } from 'date-fns/setDayOfYear'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { subDays } from 'date-fns/subDays'\nimport { subMonths } from 'date-fns/subMonths'\nimport { subQuarters } from 'date-fns/subQuarters'\nimport { subWeeks } from 'date-fns/subWeeks'\nimport { subYears } from 'date-fns/subYears'\n\nimport type { Day } from 'date-fns'\n\nimport { DATE_FORMATS_INTL, formatDate } from '../constants'\nimport {\n type Account,\n type DateRange,\n type Recurrence,\n type RecurringCopy,\n type RepeatingTransaction,\n type Transaction,\n RecurrenceType,\n RecurrenceStatus,\n RepeatingType,\n Frequency,\n} from '../types'\n\nimport {\n getNextBiMonthlyDate,\n getNextBiQuarterlyDate,\n getNextBiWeeklyDate,\n getNextMonthlyDate,\n getNextQuarterlyDate,\n getNextTwiceMonthlyDate,\n getNextWeeklyDate,\n getNextYearlyDate,\n getTwiceMonthlyDates,\n} from './DateUtil'\nimport { formatOrdinal } from './NumberFormatting'\nimport { buildDynamicCopy } from './Localization'\n\nexport type GroupedRecurrence = {\n recurrences: Recurrence[]\n id: string\n date: Date\n}\n\nexport const buildInstitutionName = (account?: Account) => {\n if (!account) return ''\n\n let name = account.user_name || account.feed_name || ''\n if (account.account_number) {\n name = `${name} *${account.account_number}`\n }\n return name\n}\n\nconst buildRepeatingRecurrences = (\n repeatingTransaction: RepeatingTransaction,\n dateRange: DateRange,\n) => {\n const recurrences: Recurrence[] = []\n\n const isYearly = repeatingTransaction.recurrence_type === Frequency.EveryYear\n\n const pastTransaction = repeatingTransaction.transactions.find(\n (t) => t.repeating_transaction_guid === repeatingTransaction.guid,\n )\n\n /*\n Since past transactions for yearly recurrences can be outside the 90 day data range, we need to display them\n even if there is no past transaction to match to. This will display it without a category, but that's the\n tradeoff until we impove our transactions service to return past transactions for all recurring transactions.\n */\n if (!isYearly && !pastTransaction) return []\n\n const occursOn = parseISO(repeatingTransaction.predicted_occurs_on)\n const baseRecurrence: Recurrence = {\n accountGuid: repeatingTransaction.account?.guid || '',\n amount: repeatingTransaction.amount,\n categoryGuid: pastTransaction?.category_guid || '',\n expectedDate: occursOn,\n frequency: repeatingTransaction.recurrence_type,\n institutionGuid: repeatingTransaction.account?.institution_guid || '',\n institutionName: buildInstitutionName(repeatingTransaction.account),\n merchantGuid: repeatingTransaction.merchant_guid,\n name: repeatingTransaction.description,\n recurrenceDay: repeatingTransaction.recurrence_day,\n repeatingTransactionGuid: repeatingTransaction.guid,\n secondRecurrenceDay: repeatingTransaction.second_recurrence_day,\n status: RecurrenceStatus.Upcoming,\n type:\n repeatingTransaction.repeating_transaction_type === RepeatingType.Income\n ? RecurrenceType.Income\n : RecurrenceType.Expense,\n transaction: undefined,\n }\n\n const startDate = dateRange.start\n const endDate = dateRange.end\n\n switch (repeatingTransaction.recurrence_type) {\n case Frequency.EveryWeek:\n recurrences.push(...getWeeklyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryOtherWeek:\n recurrences.push(...getBiWeeklyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.TwiceAMonth:\n recurrences.push(...getTwiceMonthlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryMonth:\n recurrences.push(...getMonthlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryOtherMonth:\n recurrences.push(...getBiMonthlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryQuarter:\n recurrences.push(...getQuarterlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryOtherQuarter:\n recurrences.push(...getBiQuarterlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryYear:\n recurrences.push(...getYearlyRecurrences(baseRecurrence, startDate, endDate))\n break\n }\n\n // Track which transactions have already been matched to avoid double-counting\n const matchedTransactionGuids = new Set<string>()\n\n for (const recurrence of recurrences) {\n // First, try to find a manually linked transaction (any date)\n const linkedTransactions = repeatingTransaction.transactions.filter(\n (t) =>\n t.repeating_transaction_guid === repeatingTransaction.guid &&\n !matchedTransactionGuids.has(t.guid),\n )\n\n const transaction =\n linkedTransactions.find(\n (t) =>\n t.date > getUnixTime(subDays(recurrence.expectedDate, 5)) &&\n t.date < getUnixTime(addDays(recurrence.expectedDate, 5)),\n ) ||\n (isBefore(recurrence.expectedDate, startOfToday())\n ? linkedTransactions.reduce<Transaction | undefined>((closest, t) => {\n const dist = Math.abs(t.date - getUnixTime(recurrence.expectedDate))\n const closestDist = closest\n ? Math.abs(closest.date - getUnixTime(recurrence.expectedDate))\n : Infinity\n return dist < closestDist ? t : closest\n }, undefined)\n : undefined)\n\n if (transaction) {\n matchedTransactionGuids.add(transaction.guid)\n recurrence.transaction = transaction\n recurrence.status = RecurrenceStatus.Paid\n recurrence.occurredOnDate = fromUnixTime(transaction.date)\n } else if (isBefore(recurrence.expectedDate, subDays(startOfToday(), 3))) {\n recurrence.status = RecurrenceStatus.Missed\n }\n }\n\n return recurrences\n}\n\nconst getWeeklyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const activities: Recurrence[] = []\n\n // Add recurrence for each week for the current month and next month\n let nextDate = nextDay(startDate, baseRecurrence.recurrenceDay as Day)\n while (isBefore(nextDate, endDate)) {\n activities.push({ ...baseRecurrence, expectedDate: nextDate })\n nextDate = nextDay(nextDate, baseRecurrence.recurrenceDay as Day)\n }\n\n return activities\n}\n\nconst getBiWeeklyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n // Determine the first occurrence of the bi-weekly recurrence within the date range\n let nextDate = baseRecurrence.expectedDate\n if (isBefore(nextDate, startDate)) {\n while (isBefore(nextDate, startDate)) {\n nextDate = addWeeks(nextDate, 2)\n }\n } else {\n while (isAfter(nextDate, startDate) || isSameDay(nextDate, startDate)) {\n nextDate = subWeeks(nextDate, 2)\n }\n nextDate = addWeeks(nextDate, 2)\n }\n\n while (isBefore(nextDate, endDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n nextDate = addDays(nextDate, 14)\n }\n\n return recurrences\n}\n\nconst getTwiceMonthlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n let firstOccurrence = setDate(startDate, baseRecurrence.recurrenceDay)\n\n while (isBefore(firstOccurrence, endDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: firstOccurrence })\n firstOccurrence = addMonths(firstOccurrence, 1)\n }\n\n let secondOccurrence =\n baseRecurrence.secondRecurrenceDay && baseRecurrence.secondRecurrenceDay < 28\n ? setDate(startDate, baseRecurrence.secondRecurrenceDay)\n : lastDayOfMonth(startDate)\n\n while (isBefore(secondOccurrence, endDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: secondOccurrence })\n secondOccurrence = addMonths(secondOccurrence, 1)\n }\n\n return recurrences\n}\n\nconst getMonthlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n let expectedDate = setDate(startDate, baseRecurrence.recurrenceDay)\n\n // Add current month's repeating transaction recurrence\n recurrences.push({ ...baseRecurrence, expectedDate })\n\n expectedDate = addMonths(expectedDate, 1)\n while (isBefore(expectedDate, endDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate })\n expectedDate = addMonths(expectedDate, 1)\n }\n\n return recurrences\n}\n\nconst getBiMonthlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n const occursOn = baseRecurrence.expectedDate\n let nextDate = isBefore(occursOn, endDate) ? occursOn : subMonths(occursOn, 2)\n while (isBefore(nextDate, endDate)) {\n if (isAfter(nextDate, startDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n }\n nextDate = addMonths(nextDate, 2)\n }\n\n return recurrences\n}\n\nconst getQuarterlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n const occursOn = baseRecurrence.expectedDate\n let nextDate = isBefore(occursOn, endDate) ? occursOn : subQuarters(occursOn, 1)\n while (isBefore(nextDate, endDate)) {\n if (isAfter(nextDate, startDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n }\n nextDate = addQuarters(nextDate, 1)\n }\n\n return recurrences\n}\n\nconst getBiQuarterlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n const occursOn = baseRecurrence.expectedDate\n let nextDate = isBefore(occursOn, endDate) ? occursOn : subQuarters(occursOn, 2)\n while (isBefore(nextDate, endDate)) {\n if (isAfter(nextDate, startDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n }\n nextDate = addQuarters(nextDate, 2)\n }\n\n return recurrences\n}\n\nconst getYearlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n const occursOn = baseRecurrence.expectedDate\n let nextDate = isBefore(occursOn, endDate) ? occursOn : subYears(occursOn, 1)\n while (isBefore(nextDate, endDate)) {\n if (isAfter(nextDate, startDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n }\n nextDate = addYears(nextDate, 1)\n }\n\n return recurrences\n}\n\nexport const buildAllRecurrences = (\n repeatingTransactions: RepeatingTransaction[],\n dateRange: DateRange,\n) => {\n const recurrences: Recurrence[] = []\n\n for (const repeatingTransaction of repeatingTransactions) {\n const activity = buildRepeatingRecurrences(repeatingTransaction, dateRange)\n recurrences.push(...activity)\n }\n\n return recurrences.sort(\n (a, b) =>\n getUnixTime(a.occurredOnDate || a.expectedDate) -\n getUnixTime(b.occurredOnDate || b.expectedDate),\n )\n}\n\nexport const augmentRepeatingTransactions = (\n accounts: Account[],\n repeatingTransactions: RepeatingTransaction[],\n transactions: Transaction[],\n) => {\n const augmentedRepeatingTransactions: RepeatingTransaction[] = []\n\n for (const repeatingTransaction of repeatingTransactions) {\n const relatedTransactions = transactions.filter(\n (t) => t.repeating_transaction_guid === repeatingTransaction.guid,\n )\n\n if (transactions.length > 0) {\n augmentedRepeatingTransactions.push({\n ...repeatingTransaction,\n account: accounts.find((account) => account.guid === repeatingTransaction.account_guid),\n transactions: relatedTransactions,\n })\n }\n }\n\n return augmentedRepeatingTransactions\n}\n\nexport const groupRecurrencesByDate = (recurrences: Recurrence[]): GroupedRecurrence[] => {\n return recurrences.reduce((groupedRecurrences: GroupedRecurrence[], recurrence) => {\n const dateString = formatISO(recurrence.expectedDate, { representation: 'date' })\n const existingGroup = groupedRecurrences.find(\n (group) => group.date.toString() === recurrence.expectedDate.toString(),\n )\n\n if (existingGroup) {\n existingGroup.recurrences.push(recurrence)\n } else {\n groupedRecurrences.push({\n date: recurrence.expectedDate,\n id: `date-${dateString}`,\n recurrences: [recurrence],\n })\n }\n\n return groupedRecurrences\n }, [])\n}\n\nexport const getFrequencyLabel = (\n copy: RecurringCopy,\n repeatingTransaction: RepeatingTransaction,\n showOrdinal: boolean,\n) => {\n const nextWeekday = nextDay(startOfToday(), repeatingTransaction.recurrence_day as Day)\n const nextAnnualDate = setDayOfYear(startOfToday(), repeatingTransaction.recurrence_day)\n const firstDateOrdinal = formatOrdinal(repeatingTransaction.recurrence_day)\n const secondDateOrdinal = repeatingTransaction.second_recurrence_day\n ? formatOrdinal(repeatingTransaction.second_recurrence_day)\n : ''\n\n let frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.monthly_ordinal, firstDateOrdinal)\n : copy.monthly\n\n switch (repeatingTransaction.recurrence_type) {\n case Frequency.EveryQuarter:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.quarterly_ordinal, firstDateOrdinal)\n : copy.quarterly\n break\n case Frequency.EveryWeek:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(\n copy.weekly_ordinal,\n formatDate(nextWeekday, DATE_FORMATS_INTL.DAY_OF_WEEK),\n )\n : copy.weekly\n break\n case Frequency.EveryYear:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(\n copy.anually_ordinal,\n formatDate(nextAnnualDate, DATE_FORMATS_INTL.MONTH_DAY),\n )\n : copy.anually\n break\n case Frequency.EveryOtherWeek:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(\n copy.every_other_week_ordinal,\n formatDate(nextWeekday, DATE_FORMATS_INTL.DAY_OF_WEEK),\n )\n : copy.every_other_week\n break\n case Frequency.EveryOtherMonth:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.every_other_month_ordinal, firstDateOrdinal)\n : copy.every_other_month\n break\n case Frequency.EveryOtherQuarter:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.every_other_quarter_ordinal, firstDateOrdinal)\n : copy.every_other_quarter\n break\n case Frequency.TwiceAMonth:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.twice_a_month_ordinal, firstDateOrdinal, secondDateOrdinal)\n : copy.twice_a_month\n break\n }\n\n return frequencyLabel as string\n}\n\nexport const getNextPaymentDate = (\n frequency: Frequency,\n date: Date,\n recurrenceDay?: number,\n secondRecurrenceDay?: number,\n) => {\n let baseDate = date\n\n // Apply user selected recurrenceDay based on frequency type\n if (recurrenceDay !== undefined) {\n if (frequency === Frequency.EveryWeek || frequency === Frequency.EveryOtherWeek) {\n baseDate = setDay(date, recurrenceDay)\n } else if (frequency === Frequency.EveryYear) {\n baseDate = setDayOfYear(date, recurrenceDay)\n } else {\n baseDate = setDate(date, recurrenceDay)\n }\n }\n\n let nextDate = baseDate\n\n switch (frequency) {\n case Frequency.EveryWeek:\n nextDate = getNextWeeklyDate(baseDate)\n break\n case Frequency.EveryOtherWeek:\n nextDate = getNextBiWeeklyDate(baseDate)\n break\n case Frequency.TwiceAMonth:\n nextDate = getNextTwiceMonthlyDate(\n recurrenceDay ?? baseDate.getDate(),\n secondRecurrenceDay ?? 28,\n )\n break\n case Frequency.EveryMonth:\n nextDate = getNextMonthlyDate(baseDate)\n break\n case Frequency.EveryOtherMonth:\n nextDate = getNextBiMonthlyDate(baseDate)\n break\n case Frequency.EveryQuarter:\n nextDate = getNextQuarterlyDate(baseDate)\n break\n case Frequency.EveryOtherQuarter:\n nextDate = getNextBiQuarterlyDate(baseDate)\n break\n case Frequency.EveryYear:\n nextDate = getNextYearlyDate(baseDate)\n break\n }\n\n return nextDate\n}\n\nexport const getNextUpcomingDate = (\n recurringTransaction: RepeatingTransaction,\n recurrences: Recurrence[],\n): Date => {\n const nextUpcoming = recurrences.find(\n (r) =>\n r.repeatingTransactionGuid === recurringTransaction.guid &&\n r.status === RecurrenceStatus.Upcoming,\n )\n if (nextUpcoming) return nextUpcoming.expectedDate\n\n const isPaidNearDate = (date: Date) =>\n recurrences.some(\n (r) =>\n r.repeatingTransactionGuid === recurringTransaction.guid &&\n r.status === RecurrenceStatus.Paid &&\n Math.abs(differenceInDays(r.expectedDate, date)) <= 5,\n )\n\n const frequencyAdvancers: Partial<Record<Frequency, (d: Date) => Date>> = {\n [Frequency.EveryWeek]: (d) => addWeeks(d, 1),\n [Frequency.EveryOtherWeek]: (d) => addWeeks(d, 2),\n [Frequency.TwiceAMonth]: (d) => {\n const candidates = getTwiceMonthlyDates(\n recurringTransaction.recurrence_day,\n recurringTransaction.second_recurrence_day ?? 28,\n )\n return candidates.find((c) => isAfter(c, d)) ?? candidates[candidates.length - 1]\n },\n [Frequency.EveryMonth]: (d) => addMonths(d, 1),\n [Frequency.EveryOtherMonth]: (d) => addMonths(d, 2),\n [Frequency.EveryQuarter]: (d) => addMonths(d, 3),\n [Frequency.EveryOtherQuarter]: (d) => addMonths(d, 6),\n [Frequency.EveryYear]: (d) => addYears(d, 1),\n }\n\n const baseNext = getNextPaymentDate(\n recurringTransaction.recurrence_type,\n parseISO(recurringTransaction.predicted_occurs_on),\n recurringTransaction.recurrence_day,\n recurringTransaction.second_recurrence_day,\n )\n\n if (!isPaidNearDate(baseNext)) return baseNext\n\n const advance = frequencyAdvancers[recurringTransaction.recurrence_type]\n return advance ? advance(baseNext) : baseNext\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"RecurringTransactionsUtil.es.js","names":[],"sources":["../../../src/core/utils/RecurringTransactionsUtil.ts"],"sourcesContent":["import { addDays } from 'date-fns/addDays'\nimport { addMonths } from 'date-fns/addMonths'\nimport { addQuarters } from 'date-fns/addQuarters'\nimport { addWeeks } from 'date-fns/addWeeks'\nimport { addYears } from 'date-fns/addYears'\nimport { differenceInDays } from 'date-fns/differenceInDays'\nimport { formatISO } from 'date-fns/formatISO'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { isAfter } from 'date-fns/isAfter'\nimport { isBefore } from 'date-fns/isBefore'\nimport { isSameDay } from 'date-fns/isSameDay'\nimport { lastDayOfMonth } from 'date-fns/lastDayOfMonth'\nimport { nextDay } from 'date-fns/nextDay'\nimport { parseISO } from 'date-fns/parseISO'\nimport { setDate } from 'date-fns/setDate'\nimport { setDay } from 'date-fns/setDay'\nimport { setDayOfYear } from 'date-fns/setDayOfYear'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { subDays } from 'date-fns/subDays'\nimport { subMonths } from 'date-fns/subMonths'\nimport { subQuarters } from 'date-fns/subQuarters'\nimport { subWeeks } from 'date-fns/subWeeks'\nimport { subYears } from 'date-fns/subYears'\n\nimport type { Day } from 'date-fns'\n\nimport { DATE_FORMATS_INTL, formatDate } from '../constants'\nimport {\n type Account,\n type DateRange,\n type Recurrence,\n type RecurringCopy,\n type RepeatingTransaction,\n type Transaction,\n RecurrenceType,\n RecurrenceStatus,\n RepeatingType,\n Frequency,\n} from '../types'\n\nimport {\n getNextBiMonthlyDate,\n getNextBiQuarterlyDate,\n getNextBiWeeklyDate,\n getNextMonthlyDate,\n getNextQuarterlyDate,\n getNextTwiceMonthlyDate,\n getNextWeeklyDate,\n getNextYearlyDate,\n getTwiceMonthlyDates,\n} from './DateUtil'\nimport { formatOrdinal } from './NumberFormatting'\nimport { buildDynamicCopy } from './Localization'\n\nexport type GroupedRecurrence = {\n recurrences: Recurrence[]\n id: string\n date: Date\n}\n\nexport const buildInstitutionName = (account?: Account) => {\n if (!account) return ''\n\n let name = account.user_name || account.feed_name || ''\n if (account.account_number) {\n name = `${name} *${account.account_number}`\n }\n return name\n}\n\nconst buildRepeatingRecurrences = (\n repeatingTransaction: RepeatingTransaction,\n dateRange: DateRange,\n) => {\n const recurrences: Recurrence[] = []\n\n const isYearly = repeatingTransaction.recurrence_type === Frequency.EveryYear\n\n const pastTransaction = repeatingTransaction.transactions.find(\n (t) => t.repeating_transaction_guid === repeatingTransaction.guid,\n )\n\n /*\n Since past transactions for yearly recurrences can be outside the 90 day data range, we need to display them\n even if there is no past transaction to match to. This will display it without a category, but that's the\n tradeoff until we impove our transactions service to return past transactions for all recurring transactions.\n */\n if (!isYearly && !pastTransaction) return []\n\n const occursOn = parseISO(repeatingTransaction.predicted_occurs_on)\n const baseRecurrence: Recurrence = {\n accountGuid: repeatingTransaction.account?.guid || '',\n amount: repeatingTransaction.amount,\n categoryGuid: pastTransaction?.category_guid || '',\n expectedDate: occursOn,\n frequency: repeatingTransaction.recurrence_type,\n institutionGuid: repeatingTransaction.account?.institution_guid || '',\n institutionName: buildInstitutionName(repeatingTransaction.account),\n merchantGuid: repeatingTransaction.merchant_guid,\n name: repeatingTransaction.description,\n recurrenceDay: repeatingTransaction.recurrence_day,\n repeatingTransactionGuid: repeatingTransaction.guid,\n secondRecurrenceDay: repeatingTransaction.second_recurrence_day,\n status: RecurrenceStatus.Upcoming,\n type:\n repeatingTransaction.repeating_transaction_type === RepeatingType.Income\n ? RecurrenceType.Income\n : RecurrenceType.Expense,\n transaction: undefined,\n }\n\n const startDate = dateRange.start\n const endDate = dateRange.end\n\n switch (repeatingTransaction.recurrence_type) {\n case Frequency.EveryWeek:\n recurrences.push(...getWeeklyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryOtherWeek:\n recurrences.push(...getBiWeeklyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.TwiceAMonth:\n recurrences.push(...getTwiceMonthlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryMonth:\n recurrences.push(...getMonthlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryOtherMonth:\n recurrences.push(...getBiMonthlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryQuarter:\n recurrences.push(...getQuarterlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryOtherQuarter:\n recurrences.push(...getBiQuarterlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryYear:\n recurrences.push(...getYearlyRecurrences(baseRecurrence, startDate, endDate))\n break\n }\n\n // Track which transactions have already been matched to avoid double-counting\n const matchedTransactionGuids = new Set<string>()\n\n for (const recurrence of recurrences) {\n // First, try to find a manually linked transaction (any date)\n const linkedTransactions = repeatingTransaction.transactions.filter(\n (t) =>\n t.repeating_transaction_guid === repeatingTransaction.guid &&\n !matchedTransactionGuids.has(t.guid),\n )\n\n const transaction =\n linkedTransactions.find(\n (t) =>\n t.date > getUnixTime(subDays(recurrence.expectedDate, 5)) &&\n t.date < getUnixTime(addDays(recurrence.expectedDate, 5)),\n ) ||\n (isBefore(recurrence.expectedDate, startOfToday())\n ? linkedTransactions.reduce<Transaction | undefined>((closest, t) => {\n const dist = Math.abs(t.date - getUnixTime(recurrence.expectedDate))\n const closestDist = closest\n ? Math.abs(closest.date - getUnixTime(recurrence.expectedDate))\n : Infinity\n return dist < closestDist ? t : closest\n }, undefined)\n : undefined)\n\n if (transaction) {\n matchedTransactionGuids.add(transaction.guid)\n recurrence.transaction = transaction\n recurrence.status = RecurrenceStatus.Paid\n recurrence.occurredOnDate = fromUnixTime(transaction.date)\n } else if (isBefore(recurrence.expectedDate, subDays(startOfToday(), 3))) {\n recurrence.status = RecurrenceStatus.Missed\n }\n }\n\n return recurrences\n}\n\nconst getWeeklyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const activities: Recurrence[] = []\n\n // Add recurrence for each week for the current month and next month\n let nextDate = nextDay(startDate, baseRecurrence.recurrenceDay as Day)\n while (isBefore(nextDate, endDate)) {\n activities.push({ ...baseRecurrence, expectedDate: nextDate })\n nextDate = nextDay(nextDate, baseRecurrence.recurrenceDay as Day)\n }\n\n return activities\n}\n\nconst getBiWeeklyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n // Determine the first occurrence of the bi-weekly recurrence within the date range\n let nextDate = baseRecurrence.expectedDate\n if (isBefore(nextDate, startDate)) {\n while (isBefore(nextDate, startDate)) {\n nextDate = addWeeks(nextDate, 2)\n }\n } else {\n while (isAfter(nextDate, startDate) || isSameDay(nextDate, startDate)) {\n nextDate = subWeeks(nextDate, 2)\n }\n nextDate = addWeeks(nextDate, 2)\n }\n\n while (isBefore(nextDate, endDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n nextDate = addDays(nextDate, 14)\n }\n\n return recurrences\n}\n\nconst getTwiceMonthlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n let firstOccurrence = setDate(startDate, baseRecurrence.recurrenceDay)\n\n while (isBefore(firstOccurrence, endDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: firstOccurrence })\n firstOccurrence = addMonths(firstOccurrence, 1)\n }\n\n let secondOccurrence =\n baseRecurrence.secondRecurrenceDay && baseRecurrence.secondRecurrenceDay < 28\n ? setDate(startDate, baseRecurrence.secondRecurrenceDay)\n : lastDayOfMonth(startDate)\n\n while (isBefore(secondOccurrence, endDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: secondOccurrence })\n secondOccurrence = addMonths(secondOccurrence, 1)\n }\n\n return recurrences\n}\n\nconst getMonthlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n let expectedDate = setDate(startDate, baseRecurrence.recurrenceDay)\n\n // Add current month's repeating transaction recurrence\n recurrences.push({ ...baseRecurrence, expectedDate })\n\n expectedDate = addMonths(expectedDate, 1)\n while (isBefore(expectedDate, endDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate })\n expectedDate = addMonths(expectedDate, 1)\n }\n\n return recurrences\n}\n\nconst getBiMonthlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n const occursOn = baseRecurrence.expectedDate\n let nextDate = isBefore(occursOn, endDate) ? occursOn : subMonths(occursOn, 2)\n while (isBefore(nextDate, endDate)) {\n if (isAfter(nextDate, startDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n }\n nextDate = addMonths(nextDate, 2)\n }\n\n return recurrences\n}\n\nconst getQuarterlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n const occursOn = baseRecurrence.expectedDate\n let nextDate = isBefore(occursOn, endDate) ? occursOn : subQuarters(occursOn, 1)\n while (isBefore(nextDate, endDate)) {\n if (isAfter(nextDate, startDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n }\n nextDate = addQuarters(nextDate, 1)\n }\n\n return recurrences\n}\n\nconst getBiQuarterlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n const occursOn = baseRecurrence.expectedDate\n let nextDate = isBefore(occursOn, endDate) ? occursOn : subQuarters(occursOn, 2)\n while (isBefore(nextDate, endDate)) {\n if (isAfter(nextDate, startDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n }\n nextDate = addQuarters(nextDate, 2)\n }\n\n return recurrences\n}\n\nconst getYearlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n const occursOn = baseRecurrence.expectedDate\n let nextDate = isBefore(occursOn, endDate) ? occursOn : subYears(occursOn, 1)\n while (isBefore(nextDate, endDate)) {\n if (isAfter(nextDate, startDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n }\n nextDate = addYears(nextDate, 1)\n }\n\n return recurrences\n}\n\nexport const buildAllRecurrences = (\n repeatingTransactions: RepeatingTransaction[],\n dateRange: DateRange,\n) => {\n const recurrences: Recurrence[] = []\n\n for (const repeatingTransaction of repeatingTransactions) {\n const activity = buildRepeatingRecurrences(repeatingTransaction, dateRange)\n recurrences.push(...activity)\n }\n\n return recurrences.sort(\n (a, b) =>\n getUnixTime(a.occurredOnDate || a.expectedDate) -\n getUnixTime(b.occurredOnDate || b.expectedDate),\n )\n}\n\nexport const augmentRepeatingTransactions = (\n accounts: Account[],\n repeatingTransactions: RepeatingTransaction[],\n transactions: Transaction[],\n) => {\n const augmentedRepeatingTransactions: RepeatingTransaction[] = []\n\n for (const repeatingTransaction of repeatingTransactions) {\n const relatedTransactions = transactions.filter(\n (t) => t.repeating_transaction_guid === repeatingTransaction.guid,\n )\n\n if (transactions.length > 0) {\n augmentedRepeatingTransactions.push({\n ...repeatingTransaction,\n account: accounts.find((account) => account.guid === repeatingTransaction.account_guid),\n transactions: relatedTransactions,\n })\n }\n }\n\n return augmentedRepeatingTransactions\n}\n\nexport const groupRecurrencesByDate = (recurrences: Recurrence[]): GroupedRecurrence[] => {\n return recurrences.reduce((groupedRecurrences: GroupedRecurrence[], recurrence) => {\n const dateString = formatISO(recurrence.expectedDate, { representation: 'date' })\n const existingGroup = groupedRecurrences.find(\n (group) => group.date.toString() === recurrence.expectedDate.toString(),\n )\n\n if (existingGroup) {\n existingGroup.recurrences.push(recurrence)\n } else {\n groupedRecurrences.push({\n date: recurrence.expectedDate,\n id: `date-${dateString}`,\n recurrences: [recurrence],\n })\n }\n\n return groupedRecurrences\n }, [])\n}\n\nexport const getFrequencyLabel = (\n copy: RecurringCopy,\n repeatingTransaction: RepeatingTransaction,\n showOrdinal: boolean,\n) => {\n const nextWeekday = nextDay(startOfToday(), repeatingTransaction.recurrence_day as Day)\n const nextAnnualDate = setDayOfYear(startOfToday(), repeatingTransaction.recurrence_day)\n const firstDateOrdinal = formatOrdinal(repeatingTransaction.recurrence_day)\n const secondDateOrdinal = repeatingTransaction.second_recurrence_day\n ? formatOrdinal(repeatingTransaction.second_recurrence_day)\n : ''\n\n let frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.monthly_ordinal, firstDateOrdinal)\n : copy.monthly\n\n switch (repeatingTransaction.recurrence_type) {\n case Frequency.EveryQuarter:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.quarterly_ordinal, firstDateOrdinal)\n : copy.quarterly\n break\n case Frequency.EveryWeek:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(\n copy.weekly_ordinal,\n formatDate(nextWeekday, DATE_FORMATS_INTL.DAY_OF_WEEK),\n )\n : copy.weekly\n break\n case Frequency.EveryYear:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(\n copy.anually_ordinal,\n formatDate(nextAnnualDate, DATE_FORMATS_INTL.MONTH_DAY),\n )\n : copy.anually\n break\n case Frequency.EveryOtherWeek:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(\n copy.every_other_week_ordinal,\n formatDate(nextWeekday, DATE_FORMATS_INTL.DAY_OF_WEEK),\n )\n : copy.every_other_week\n break\n case Frequency.EveryOtherMonth:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.every_other_month_ordinal, firstDateOrdinal)\n : copy.every_other_month\n break\n case Frequency.EveryOtherQuarter:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.every_other_quarter_ordinal, firstDateOrdinal)\n : copy.every_other_quarter\n break\n case Frequency.TwiceAMonth:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.twice_a_month_ordinal, firstDateOrdinal, secondDateOrdinal)\n : copy.twice_a_month\n break\n }\n\n return frequencyLabel as string\n}\n\nexport const getNextPaymentDate = (\n frequency: Frequency,\n date: Date,\n recurrenceDay?: number,\n secondRecurrenceDay?: number,\n) => {\n let baseDate = date\n\n // Apply user selected recurrenceDay based on frequency type\n if (recurrenceDay !== undefined) {\n if (frequency === Frequency.EveryWeek || frequency === Frequency.EveryOtherWeek) {\n baseDate = setDay(date, recurrenceDay)\n } else if (frequency === Frequency.EveryYear) {\n baseDate = setDayOfYear(date, recurrenceDay)\n } else {\n baseDate = setDate(date, recurrenceDay)\n }\n }\n\n let nextDate = baseDate\n\n switch (frequency) {\n case Frequency.EveryWeek:\n nextDate = getNextWeeklyDate(baseDate)\n break\n case Frequency.EveryOtherWeek:\n nextDate = getNextBiWeeklyDate(baseDate)\n break\n case Frequency.TwiceAMonth:\n nextDate = getNextTwiceMonthlyDate(\n recurrenceDay ?? baseDate.getDate(),\n secondRecurrenceDay ?? 28,\n )\n break\n case Frequency.EveryMonth:\n nextDate = getNextMonthlyDate(baseDate)\n break\n case Frequency.EveryOtherMonth:\n nextDate = getNextBiMonthlyDate(baseDate)\n break\n case Frequency.EveryQuarter:\n nextDate = getNextQuarterlyDate(baseDate)\n break\n case Frequency.EveryOtherQuarter:\n nextDate = getNextBiQuarterlyDate(baseDate)\n break\n case Frequency.EveryYear:\n nextDate = getNextYearlyDate(baseDate)\n break\n }\n\n return nextDate\n}\n\nexport const getNextUpcomingDate = (\n recurringTransaction: RepeatingTransaction,\n recurrences: Recurrence[],\n): Date => {\n const nextUpcoming = recurrences.find(\n (r) =>\n r.repeatingTransactionGuid === recurringTransaction.guid &&\n r.status === RecurrenceStatus.Upcoming,\n )\n if (nextUpcoming) return nextUpcoming.expectedDate\n\n const isPaidNearDate = (date: Date) =>\n recurrences.some(\n (r) =>\n r.repeatingTransactionGuid === recurringTransaction.guid &&\n r.status === RecurrenceStatus.Paid &&\n Math.abs(differenceInDays(r.expectedDate, date)) <= 5,\n )\n\n const frequencyAdvancers: Partial<Record<Frequency, (d: Date) => Date>> = {\n [Frequency.EveryWeek]: (d) => addWeeks(d, 1),\n [Frequency.EveryOtherWeek]: (d) => addWeeks(d, 2),\n [Frequency.TwiceAMonth]: (d) => {\n const candidates = getTwiceMonthlyDates(\n recurringTransaction.recurrence_day,\n recurringTransaction.second_recurrence_day ?? 28,\n )\n return candidates.find((c) => isAfter(c, d)) ?? candidates[candidates.length - 1]\n },\n [Frequency.EveryMonth]: (d) => addMonths(d, 1),\n [Frequency.EveryOtherMonth]: (d) => addMonths(d, 2),\n [Frequency.EveryQuarter]: (d) => addMonths(d, 3),\n [Frequency.EveryOtherQuarter]: (d) => addMonths(d, 6),\n [Frequency.EveryYear]: (d) => addYears(d, 1),\n }\n\n const baseNext = getNextPaymentDate(\n recurringTransaction.recurrence_type,\n parseISO(recurringTransaction.predicted_occurs_on),\n recurringTransaction.recurrence_day,\n recurringTransaction.second_recurrence_day,\n )\n\n if (!isPaidNearDate(baseNext)) return baseNext\n\n const advance = frequencyAdvancers[recurringTransaction.recurrence_type]\n return advance ? advance(baseNext) : baseNext\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsUtil.es.js","names":[],"sources":["../../../src/core/utils/SettingsUtil.ts"],"sourcesContent":["import {\n type Account,\n type ClientCommunicationProfile,\n type DetailedNotificationProfile,\n type NotificationProfile,\n type SettingsCopy,\n type User,\n type UserCommunicationProfile,\n AccountNotificationTypes,\n BudgetNotificationTypes,\n InsightNotificationTypes,\n} from '../types'\n\nconst PARENT_ENTITY = 'PARENT-ENTITY'\n\nconst getProfileLabel = (notificationType: number, copy: SettingsCopy) => {\n const labelMap: Record<number, string> = {\n [BudgetNotificationTypes.BudgetExceeded]: copy.notification_budget_exceeded,\n [BudgetNotificationTypes.BudgetOffTarget]: copy.notification_budget_off_target,\n [AccountNotificationTypes.DebtPaymentReminder]: copy.notification_debt_payment_reminder,\n [AccountNotificationTypes.AccountBalanceLow]: copy.notification_low_balance,\n [AccountNotificationTypes.AccountDepositLargePosted]: copy.notification_large_deposit,\n [AccountNotificationTypes.AccountDepositLarge]: copy.notification_large_deposit,\n [AccountNotificationTypes.TransactionExpenseLarge]: copy.notification_large_expense,\n [AccountNotificationTypes.TransactionFeeCharge]: copy.notification_transaction_fee,\n [AccountNotificationTypes.InternationalTransaction]:\n copy.notification_transaction_is_international,\n [InsightNotificationTypes.AccountBalanceLow]: copy.account_balance_low,\n [InsightNotificationTypes.BillAmountNotStandard]: copy.bill_amount_not_standard,\n [InsightNotificationTypes.CategorySpending]: copy.category_spending,\n [InsightNotificationTypes.CreditCardCloseToLimit]: copy.credit_card_close_to_limit,\n [InsightNotificationTypes.DebtPaymentReminder]: copy.debt_payment_reminder,\n [InsightNotificationTypes.DuplicatePayment]: copy.duplicate_payment,\n [InsightNotificationTypes.MonthlySpendComparison]: copy.monthly_spend_comparison,\n [InsightNotificationTypes.MonthlySpendToIncomeComparison]:\n copy.monthly_spend_to_income_comparison,\n [InsightNotificationTypes.MonthlySubscriptionAggregate]: copy.monthly_subscription_aggregate,\n [InsightNotificationTypes.MonthlyTopMerchantSpending]: copy.monthly_top_merchant_spending,\n [InsightNotificationTypes.SaveAnExtra100Dollars]: copy.save_an_extra_100_dollars,\n [InsightNotificationTypes.SavingsOpportunity]: copy.savings_opportunity,\n [InsightNotificationTypes.SetUpDirectDeposit]: copy.set_up_direct_deposit,\n [InsightNotificationTypes.SwitchDirectDeposit]: copy.switch_direct_deposit,\n [InsightNotificationTypes.UncategorizedTransactions]: copy.uncategorized_transactions,\n [InsightNotificationTypes.UnifiedDeposit]: copy.unified_deposit,\n [InsightNotificationTypes.UpcomingBill]: copy.upcoming_bill,\n [InsightNotificationTypes.WeekendSpendingSummary]: copy.weekend_spending_summary,\n [InsightNotificationTypes.WeeklyNewMerchants]: copy.weekly_new_merchants,\n [InsightNotificationTypes.DiscoveredAccounts]: copy.discovered_account,\n [InsightNotificationTypes.TransactionExpenseLarge]: copy.large_transaction,\n [InsightNotificationTypes.PromotionalCampaignMessages]: copy.promotional_campaign_messages,\n [InsightNotificationTypes.TransparentOverdraft]: copy.transparent_overdraft,\n }\n\n return labelMap[notificationType] || ''\n}\n\nexport const augmentNotificationProfiles = (\n accounts: Account[],\n clientCommunicationsProfile: ClientCommunicationProfile,\n copy: SettingsCopy,\n profiles: NotificationProfile[],\n userCommunicationsProfile: UserCommunicationProfile,\n user: User,\n) => {\n const detailedProfiles = [] as DetailedNotificationProfile[]\n const {\n email_notifications_enabled: clientEmailEnabled,\n sms_notifications_enabled: clientSmsEnabled,\n push_notifications_enabled: clientPushEnabled,\n } = clientCommunicationsProfile\n\n const {\n opted_out_of_email_notifications: userEmailOptedOut,\n opted_out_of_sms_notifications: userSmsOptedOut,\n opted_out_of_push_notifications: userPushOptedOut,\n } = userCommunicationsProfile\n\n for (const profile of profiles.filter((profile) => profile.entity_guid === PARENT_ENTITY)) {\n const label = getProfileLabel(profile.notification_type, copy)\n const children = profiles.filter(\n (child) =>\n child.entity_guid !== PARENT_ENTITY &&\n child.notification_type === profile.notification_type &&\n accounts.some((account) => account.guid === child.entity_guid),\n )\n\n const deliveryMethods = [] as string[]\n if (clientEmailEnabled && !userEmailOptedOut && profile.email_channel && user.email) {\n deliveryMethods.push(copy.delivery_method_email_label)\n }\n if (clientSmsEnabled && !userSmsOptedOut && profile.sms_channel && user.phone) {\n deliveryMethods.push(copy.delivery_method_sms_label)\n }\n if (clientPushEnabled && !userPushOptedOut && profile.push_channel) {\n deliveryMethods.push(copy.delivery_method_push_label)\n }\n\n detailedProfiles.push({\n ...profile,\n children: children.map((child) => ({\n ...child,\n account: accounts.find((a) => a.guid === child.entity_guid),\n label,\n })),\n deliveryMethodsLabel: deliveryMethods.join(', '),\n label,\n })\n }\n\n return detailedProfiles\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SettingsUtil.es.js","names":[],"sources":["../../../src/core/utils/SettingsUtil.ts"],"sourcesContent":["import {\n type Account,\n type ClientCommunicationProfile,\n type DetailedNotificationProfile,\n type NotificationProfile,\n type SettingsCopy,\n type User,\n type UserCommunicationProfile,\n AccountNotificationTypes,\n BudgetNotificationTypes,\n InsightNotificationTypes,\n} from '../types'\n\nconst PARENT_ENTITY = 'PARENT-ENTITY'\n\nconst getProfileLabel = (notificationType: number, copy: SettingsCopy) => {\n const labelMap: Record<number, string> = {\n [BudgetNotificationTypes.BudgetExceeded]: copy.notification_budget_exceeded,\n [BudgetNotificationTypes.BudgetOffTarget]: copy.notification_budget_off_target,\n [AccountNotificationTypes.DebtPaymentReminder]: copy.notification_debt_payment_reminder,\n [AccountNotificationTypes.AccountBalanceLow]: copy.notification_low_balance,\n [AccountNotificationTypes.AccountDepositLargePosted]: copy.notification_large_deposit,\n [AccountNotificationTypes.AccountDepositLarge]: copy.notification_large_deposit,\n [AccountNotificationTypes.TransactionExpenseLarge]: copy.notification_large_expense,\n [AccountNotificationTypes.TransactionFeeCharge]: copy.notification_transaction_fee,\n [AccountNotificationTypes.InternationalTransaction]:\n copy.notification_transaction_is_international,\n [InsightNotificationTypes.AccountBalanceLow]: copy.account_balance_low,\n [InsightNotificationTypes.BillAmountNotStandard]: copy.bill_amount_not_standard,\n [InsightNotificationTypes.CategorySpending]: copy.category_spending,\n [InsightNotificationTypes.CreditCardCloseToLimit]: copy.credit_card_close_to_limit,\n [InsightNotificationTypes.DebtPaymentReminder]: copy.debt_payment_reminder,\n [InsightNotificationTypes.DuplicatePayment]: copy.duplicate_payment,\n [InsightNotificationTypes.MonthlySpendComparison]: copy.monthly_spend_comparison,\n [InsightNotificationTypes.MonthlySpendToIncomeComparison]:\n copy.monthly_spend_to_income_comparison,\n [InsightNotificationTypes.MonthlySubscriptionAggregate]: copy.monthly_subscription_aggregate,\n [InsightNotificationTypes.MonthlyTopMerchantSpending]: copy.monthly_top_merchant_spending,\n [InsightNotificationTypes.SaveAnExtra100Dollars]: copy.save_an_extra_100_dollars,\n [InsightNotificationTypes.SavingsOpportunity]: copy.savings_opportunity,\n [InsightNotificationTypes.SetUpDirectDeposit]: copy.set_up_direct_deposit,\n [InsightNotificationTypes.SwitchDirectDeposit]: copy.switch_direct_deposit,\n [InsightNotificationTypes.UncategorizedTransactions]: copy.uncategorized_transactions,\n [InsightNotificationTypes.UnifiedDeposit]: copy.unified_deposit,\n [InsightNotificationTypes.UpcomingBill]: copy.upcoming_bill,\n [InsightNotificationTypes.WeekendSpendingSummary]: copy.weekend_spending_summary,\n [InsightNotificationTypes.WeeklyNewMerchants]: copy.weekly_new_merchants,\n [InsightNotificationTypes.DiscoveredAccounts]: copy.discovered_account,\n [InsightNotificationTypes.TransactionExpenseLarge]: copy.large_transaction,\n [InsightNotificationTypes.PromotionalCampaignMessages]: copy.promotional_campaign_messages,\n [InsightNotificationTypes.TransparentOverdraft]: copy.transparent_overdraft,\n }\n\n return labelMap[notificationType] || ''\n}\n\nexport const augmentNotificationProfiles = (\n accounts: Account[],\n clientCommunicationsProfile: ClientCommunicationProfile,\n copy: SettingsCopy,\n profiles: NotificationProfile[],\n userCommunicationsProfile: UserCommunicationProfile,\n user: User,\n) => {\n const detailedProfiles = [] as DetailedNotificationProfile[]\n const {\n email_notifications_enabled: clientEmailEnabled,\n sms_notifications_enabled: clientSmsEnabled,\n push_notifications_enabled: clientPushEnabled,\n } = clientCommunicationsProfile\n\n const {\n opted_out_of_email_notifications: userEmailOptedOut,\n opted_out_of_sms_notifications: userSmsOptedOut,\n opted_out_of_push_notifications: userPushOptedOut,\n } = userCommunicationsProfile\n\n for (const profile of profiles.filter((profile) => profile.entity_guid === PARENT_ENTITY)) {\n const label = getProfileLabel(profile.notification_type, copy)\n const children = profiles.filter(\n (child) =>\n child.entity_guid !== PARENT_ENTITY &&\n child.notification_type === profile.notification_type &&\n accounts.some((account) => account.guid === child.entity_guid),\n )\n\n const deliveryMethods = [] as string[]\n if (clientEmailEnabled && !userEmailOptedOut && profile.email_channel && user.email) {\n deliveryMethods.push(copy.delivery_method_email_label)\n }\n if (clientSmsEnabled && !userSmsOptedOut && profile.sms_channel && user.phone) {\n deliveryMethods.push(copy.delivery_method_sms_label)\n }\n if (clientPushEnabled && !userPushOptedOut && profile.push_channel) {\n deliveryMethods.push(copy.delivery_method_push_label)\n }\n\n detailedProfiles.push({\n ...profile,\n children: children.map((child) => ({\n ...child,\n account: accounts.find((a) => a.guid === child.entity_guid),\n label,\n })),\n deliveryMethodsLabel: deliveryMethods.join(', '),\n label,\n })\n }\n\n return detailedProfiles\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionUtils.es.js","names":[],"sources":["../../../src/core/utils/TransactionUtils.ts"],"sourcesContent":["import { endOfToday } from 'date-fns/endOfToday'\nimport { format } from 'date-fns/format'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\n\nimport { TABLE_CONST } from '../constants/Table'\nimport {\n CategoryGuids,\n CategoryGuidToName,\n DATE_FORMATS_INTL,\n formatDate,\n ORDINAL_DATE_FORMAT,\n} from '../constants'\nimport { COLUMN_NAMES } from '../constants/Transaction'\nimport { TransactionStatus, TransactionType } from '../types'\nimport type { Account, Category, Tag, Tagging, Transaction } from '../types'\n\nimport { type TransactionFilter } from '../stores/TransactionStore'\n\nimport { formatCurrency } from './NumberFormatting'\n\ninterface AccountsMap {\n [key: string]: Account\n}\n\ninterface CategoriesMap {\n [key: string]: Category\n}\n\ninterface TaggingsMap {\n [key: string]: string[]\n}\n\nexport const buildDetailedTransactions = (\n transactions: Transaction[],\n accounts: Account[],\n categories: Category[],\n taggings: Tagging[] = [],\n) => {\n const accountsMap = accounts.reduce((acc: AccountsMap, account: Account) => {\n return { ...acc, [account.guid]: account }\n }, {})\n\n const categoriesMap = categories.reduce((acc: CategoriesMap, category: Category) => {\n return { ...acc, [category.guid]: category }\n }, {})\n\n const taggingsMap = taggings.reduce((acc: TaggingsMap, tagging: Tagging) => {\n const { transaction_guid, tag_guid } = tagging\n\n if (!acc[transaction_guid]) {\n return {\n ...acc,\n [transaction_guid]: [tag_guid],\n }\n }\n const tags = [...acc[transaction_guid], tag_guid] as string[]\n\n return {\n ...acc,\n [transaction_guid]: tags,\n }\n }, {})\n\n return transactions.map((transaction: Transaction) => {\n const account = accountsMap[transaction.account_guid]\n const category = transaction.category_guid ? categoriesMap[transaction.category_guid] : null\n const tags = taggingsMap[transaction.guid] ?? []\n\n return {\n ...transaction,\n account: account?.user_name || 'Unknown',\n accountIsClosed: account?.is_closed,\n accountIsHidden: account?.is_hidden,\n category: category?.name || 'Uncategorized',\n isIncome: transaction.top_level_category_guid === CategoryGuids.INCOME,\n isPending: transaction.feed_status === TransactionStatus.PENDING,\n number: account?.account_number || '',\n payee: transaction.description,\n tags,\n }\n })\n}\n\nconst UNCATEGORIZED_TERM = 'uncategorized'\n\nexport const sortAndFilterTransactions = (\n filter: TransactionFilter,\n expandedSplits: string[],\n sortColumn: string,\n sortDirection: string,\n tags: Tag[],\n transactions: Transaction[],\n) => {\n const filteredTransactions = filterTransactions(filter, tags, transactions)\n\n const sortedTransactions = sortTransactions(filteredTransactions, sortColumn, sortDirection)\n\n expandedSplits.forEach((guid) => {\n const index = sortedTransactions.findIndex((t) => t.guid === guid)\n const children = transactions.filter((t) => t.parent_guid === guid)\n sortedTransactions.splice(index + 1, 0, ...children)\n })\n return sortedTransactions\n}\n\nconst filterTransactions = (\n filter: TransactionFilter,\n tags: Tag[],\n transactions: Transaction[],\n) => {\n const {\n accounts = [],\n dateRange = { start: startOfMonth(startOfToday()), end: endOfToday() },\n custom = () => true,\n searchTerm: searchFilter = '',\n showSplits = false,\n } = filter\n\n return (\n transactions\n // Filters out parent of split transactions when showSplits is true and filters out split\n // transaction children when showSplits is false\n .filter((t) => (showSplits ? !t.has_been_split : !t.parent_guid))\n // Filter for selected accounts\n .filter((t) => Boolean(accounts.find((guid) => guid === t.account_guid)))\n // Filter for Date Range\n .filter((t) => t.date >= getUnixTime(dateRange.start) && t.date <= getUnixTime(dateRange.end))\n // Custom filter\n .filter(custom)\n // Search filter\n .filter((transaction) => {\n // Don't return uncategorized split transactions\n if (searchFilter === UNCATEGORIZED_TERM && transaction.has_been_split) {\n return false\n }\n\n // Split check - When searching for \"Splits\" and transaction is a split or is a parent of a split(s)\n const splitPattern = /^spl/i\n if (\n splitPattern.test(searchFilter) &&\n (transaction.has_been_split || Boolean(transaction.parent_guid))\n ) {\n return true\n }\n\n // Check transactions tags\n const isTagIncludedInSearch = transaction.tags.some((guid) =>\n isIncludedInSearch(searchFilter, tags.find((tag) => tag.guid === guid)?.name),\n )\n const date = fromUnixTime(transaction.date)\n return (\n isIncludedInSearch(searchFilter, transaction.payee) ||\n isIncludedInSearch(searchFilter, transaction.feed_description) ||\n isIncludedInSearch(searchFilter, transaction.category) ||\n isIncludedInSearch(searchFilter, formatDate(date, DATE_FORMATS_INTL.MONTH)) ||\n isIncludedInSearch(searchFilter, formatDate(date, DATE_FORMATS_INTL.DAY)) ||\n isIncludedInSearch(searchFilter, formatDate(date, DATE_FORMATS_INTL.FULL_MONTH_DAY)) ||\n isIncludedInSearch(searchFilter, formatDate(date, DATE_FORMATS_INTL.MONTH_DAY_YEAR)) ||\n isIncludedInSearch(searchFilter, format(date, ORDINAL_DATE_FORMAT)) ||\n isIncludedInSearch(searchFilter, transaction.account) ||\n isIncludedInSearch(searchFilter, formatCurrency(transaction.amount, '0,0.00')) ||\n isIncludedInSearch(searchFilter, transaction.memo) ||\n isTagIncludedInSearch\n )\n })\n )\n}\n\nconst sortTransactions = (\n transactions: Transaction[],\n sortColumn: string,\n sortDirection: string,\n) => {\n return [...transactions].sort((a: Transaction, b: Transaction) => {\n const column = sortColumn as keyof Transaction\n const sortCompare = (a[column] || '') > (b[column] || '')\n\n let sortASC = sortCompare ? -1 : 1\n let sortDESC = sortCompare ? 1 : -1\n\n if (sortColumn === COLUMN_NAMES.DATE || sortColumn === COLUMN_NAMES.AMOUNT) {\n sortASC = sortCompare ? 1 : -1\n sortDESC = sortCompare ? -1 : 1\n }\n\n return sortDirection === TABLE_CONST.ASC ? sortASC : sortDESC\n })\n}\n\n/**\n * Determines if a value is included within the terms set in the search bar\n */\nconst isIncludedInSearch = (searchFilter: string, value: string | null | undefined) => {\n const lowerCasedTerms = searchFilter.toLowerCase().split(' ')\n const lowerCasedValue = value?.toString().toLowerCase() ?? ''\n\n return lowerCasedTerms.every((filter) => lowerCasedValue.indexOf(filter) > -1)\n}\n\n// TODO: Change the way formatting data is exported in order to handle localization\ntype FormattedTransaction = {\n Date: string\n Description: string\n 'Original Description': string\n Amount: string\n Type: string\n 'Parent Category': string\n Category: string\n Account: string\n Tags: string\n Memo: string\n Pending: string\n}\n\n/**\n * Collects the GUIDs of all transactions that act as parents\n * to one or more split (child) transactions.\n */\nfunction extractParentTransactionGuids(transactions: Transaction[]): Set<string> {\n return new Set(\n transactions.filter((tx) => tx.parent_guid !== undefined).map((tx) => tx.parent_guid!),\n )\n}\n\n/**\n * Organizes child transactions by their parent transaction GUID.\n * Returns a map from parent GUID to an array of its child transactions.\n */\nfunction mapChildTransactionsByParent(transactions: Transaction[]): Record<string, Transaction[]> {\n return transactions.reduce<Record<string, Transaction[]>>((accumulator, tx) => {\n if (tx.parent_guid) {\n if (!accumulator[tx.parent_guid]) accumulator[tx.parent_guid] = []\n accumulator[tx.parent_guid].push(tx)\n }\n return accumulator\n }, {})\n}\n\n/**\n * Produces a list of transactions based on the given sorted transactions,\n * where parent transactions that have split children are replaced by those\n * children sorted by descending absolute amount. All other transactions\n * are included as-is, with duplicates removed.\n */\nexport function flattenTransactionsWithSplits(\n sortedTransactions: Transaction[],\n allTransactions: Transaction[],\n): Transaction[] {\n // Set of parent transaction GUIDs that have split child transactions\n const parentTransactionGuidsWithSplits = extractParentTransactionGuids(allTransactions)\n\n // Map from parent GUID to array of its child split transactions\n const childTransactionsGroupedByParent = mapChildTransactionsByParent(allTransactions)\n\n // Track GUIDs of transactions already included in the result to avoid duplicates\n const processedTransactionGuids = new Set<string>()\n\n // Resulting list of transactions with parents replaced by their split children\n const flattenedTransactionList: Transaction[] = []\n\n for (const transaction of sortedTransactions) {\n if (parentTransactionGuidsWithSplits.has(transaction.guid)) {\n // This transaction is a parent with splits, so replace it with its children\n const splitChildTransactions = childTransactionsGroupedByParent[transaction.guid] ?? []\n\n splitChildTransactions\n .slice()\n .sort((a, b) => Math.abs(b.amount) - Math.abs(a.amount))\n .forEach((childTransaction) => {\n if (!processedTransactionGuids.has(childTransaction.guid)) {\n flattenedTransactionList.push(childTransaction)\n processedTransactionGuids.add(childTransaction.guid)\n }\n })\n } else if (!processedTransactionGuids.has(transaction.guid)) {\n // Normal transaction (no splits), add as-is if not already added\n flattenedTransactionList.push(transaction)\n processedTransactionGuids.add(transaction.guid)\n }\n }\n\n return flattenedTransactionList\n}\n\nexport const exportTransactionsToCSV = (transactions: Transaction[], tags: Tag[]) => {\n const csvContent = structureCSVData(formatTransactions(transactions, tags))\n\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' })\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute('download', 'transactions.csv')\n\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n\n URL.revokeObjectURL(link.href)\n}\n\n/**\n * Formats a list of transactions into a list that will be used when\n * downloaded to a CSV file.\n */\nconst formatTransactions = (transactions: Transaction[], tags: Tag[]) => {\n return transactions.map((transaction) => ({\n Date: formatDate(fromUnixTime(transaction.date), DATE_FORMATS_INTL.YEAR_MONTH_DAY),\n Description: getDescription(transaction),\n 'Original Description': transaction.feed_description,\n Amount: `${transaction.amount}`,\n Type: transaction.transaction_type === TransactionType.CREDIT ? 'Credit' : 'Debit',\n 'Parent Category': CategoryGuidToName[transaction.top_level_category_guid || ''],\n Category: transaction.category,\n Account: transaction.account,\n Tags: getTags(transaction, tags),\n Memo: transaction.memo,\n Pending: transaction.isPending ? 'TRUE' : 'FALSE',\n })) as FormattedTransaction[]\n}\n\n/**\n * Escapes a value for safe CSV output\n */\nconst escapeCsvField = (field?: string | null): string => {\n if (!field) return ''\n return /[,\"\\n\\r]/.test(field) ? `\"${field.replace(/\"/g, '\"\"')}\"` : field\n}\n\n/**\n * Structures the CSV file data using the formatted transactions\n */\nconst structureCSVData = (formattedTransactions: FormattedTransaction[]) => {\n const csvHeader = Object.keys(formattedTransactions[0]).join(',').concat('\\r\\n')\n const csvRows = formattedTransactions\n .map((transaction) => Object.values(transaction).map(escapeCsvField).join(','))\n .join('\\r\\n')\n\n return csvHeader + csvRows\n}\n\n/**\n * Get the description for a transaction that will be used within the CSV copy.\n * We want to highlight that split transactions are a split as well as\n * hidden transactions are hidden.\n */\nconst getDescription = (transaction: Transaction) => {\n let description = transaction.parent_guid ? 'Split: ' : ''\n description += transaction.is_hidden ? '(Excluded) ' : ''\n description += transaction.description\n\n return description\n}\n\nconst getTags = (transaction: Transaction, tags: Tag[]) => {\n return transaction.tags\n .map((tagGuid) => {\n const tag = tags.filter((t) => t.guid === tagGuid)[0]\n\n return tag?.name ?? ''\n })\n .join(' ')\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TransactionUtils.es.js","names":[],"sources":["../../../src/core/utils/TransactionUtils.ts"],"sourcesContent":["import { endOfToday } from 'date-fns/endOfToday'\nimport { format } from 'date-fns/format'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\n\nimport { TABLE_CONST } from '../constants/Table'\nimport {\n CategoryGuids,\n CategoryGuidToName,\n DATE_FORMATS_INTL,\n formatDate,\n ORDINAL_DATE_FORMAT,\n} from '../constants'\nimport { COLUMN_NAMES } from '../constants/Transaction'\nimport { TransactionStatus, TransactionType } from '../types'\nimport type { Account, Category, Tag, Tagging, Transaction } from '../types'\n\nimport { type TransactionFilter } from '../stores/TransactionStore'\n\nimport { formatCurrency } from './NumberFormatting'\n\ninterface AccountsMap {\n [key: string]: Account\n}\n\ninterface CategoriesMap {\n [key: string]: Category\n}\n\ninterface TaggingsMap {\n [key: string]: string[]\n}\n\nexport const buildDetailedTransactions = (\n transactions: Transaction[],\n accounts: Account[],\n categories: Category[],\n taggings: Tagging[] = [],\n) => {\n const accountsMap = accounts.reduce((acc: AccountsMap, account: Account) => {\n return { ...acc, [account.guid]: account }\n }, {})\n\n const categoriesMap = categories.reduce((acc: CategoriesMap, category: Category) => {\n return { ...acc, [category.guid]: category }\n }, {})\n\n const taggingsMap = taggings.reduce((acc: TaggingsMap, tagging: Tagging) => {\n const { transaction_guid, tag_guid } = tagging\n\n if (!acc[transaction_guid]) {\n return {\n ...acc,\n [transaction_guid]: [tag_guid],\n }\n }\n const tags = [...acc[transaction_guid], tag_guid] as string[]\n\n return {\n ...acc,\n [transaction_guid]: tags,\n }\n }, {})\n\n return transactions.map((transaction: Transaction) => {\n const account = accountsMap[transaction.account_guid]\n const category = transaction.category_guid ? categoriesMap[transaction.category_guid] : null\n const tags = taggingsMap[transaction.guid] ?? []\n\n return {\n ...transaction,\n account: account?.user_name || 'Unknown',\n accountIsClosed: account?.is_closed,\n accountIsHidden: account?.is_hidden,\n category: category?.name || 'Uncategorized',\n isIncome: transaction.top_level_category_guid === CategoryGuids.INCOME,\n isPending: transaction.feed_status === TransactionStatus.PENDING,\n number: account?.account_number || '',\n payee: transaction.description,\n tags,\n }\n })\n}\n\nconst UNCATEGORIZED_TERM = 'uncategorized'\n\nexport const sortAndFilterTransactions = (\n filter: TransactionFilter,\n expandedSplits: string[],\n sortColumn: string,\n sortDirection: string,\n tags: Tag[],\n transactions: Transaction[],\n) => {\n const filteredTransactions = filterTransactions(filter, tags, transactions)\n\n const sortedTransactions = sortTransactions(filteredTransactions, sortColumn, sortDirection)\n\n expandedSplits.forEach((guid) => {\n const index = sortedTransactions.findIndex((t) => t.guid === guid)\n const children = transactions.filter((t) => t.parent_guid === guid)\n sortedTransactions.splice(index + 1, 0, ...children)\n })\n return sortedTransactions\n}\n\nconst filterTransactions = (\n filter: TransactionFilter,\n tags: Tag[],\n transactions: Transaction[],\n) => {\n const {\n accounts = [],\n dateRange = { start: startOfMonth(startOfToday()), end: endOfToday() },\n custom = () => true,\n searchTerm: searchFilter = '',\n showSplits = false,\n } = filter\n\n return (\n transactions\n // Filters out parent of split transactions when showSplits is true and filters out split\n // transaction children when showSplits is false\n .filter((t) => (showSplits ? !t.has_been_split : !t.parent_guid))\n // Filter for selected accounts\n .filter((t) => Boolean(accounts.find((guid) => guid === t.account_guid)))\n // Filter for Date Range\n .filter((t) => t.date >= getUnixTime(dateRange.start) && t.date <= getUnixTime(dateRange.end))\n // Custom filter\n .filter(custom)\n // Search filter\n .filter((transaction) => {\n // Don't return uncategorized split transactions\n if (searchFilter === UNCATEGORIZED_TERM && transaction.has_been_split) {\n return false\n }\n\n // Split check - When searching for \"Splits\" and transaction is a split or is a parent of a split(s)\n const splitPattern = /^spl/i\n if (\n splitPattern.test(searchFilter) &&\n (transaction.has_been_split || Boolean(transaction.parent_guid))\n ) {\n return true\n }\n\n // Check transactions tags\n const isTagIncludedInSearch = transaction.tags.some((guid) =>\n isIncludedInSearch(searchFilter, tags.find((tag) => tag.guid === guid)?.name),\n )\n const date = fromUnixTime(transaction.date)\n return (\n isIncludedInSearch(searchFilter, transaction.payee) ||\n isIncludedInSearch(searchFilter, transaction.feed_description) ||\n isIncludedInSearch(searchFilter, transaction.category) ||\n isIncludedInSearch(searchFilter, formatDate(date, DATE_FORMATS_INTL.MONTH)) ||\n isIncludedInSearch(searchFilter, formatDate(date, DATE_FORMATS_INTL.DAY)) ||\n isIncludedInSearch(searchFilter, formatDate(date, DATE_FORMATS_INTL.FULL_MONTH_DAY)) ||\n isIncludedInSearch(searchFilter, formatDate(date, DATE_FORMATS_INTL.MONTH_DAY_YEAR)) ||\n isIncludedInSearch(searchFilter, format(date, ORDINAL_DATE_FORMAT)) ||\n isIncludedInSearch(searchFilter, transaction.account) ||\n isIncludedInSearch(searchFilter, formatCurrency(transaction.amount, '0,0.00')) ||\n isIncludedInSearch(searchFilter, transaction.memo) ||\n isTagIncludedInSearch\n )\n })\n )\n}\n\nconst sortTransactions = (\n transactions: Transaction[],\n sortColumn: string,\n sortDirection: string,\n) => {\n return [...transactions].sort((a: Transaction, b: Transaction) => {\n const column = sortColumn as keyof Transaction\n const sortCompare = (a[column] || '') > (b[column] || '')\n\n let sortASC = sortCompare ? -1 : 1\n let sortDESC = sortCompare ? 1 : -1\n\n if (sortColumn === COLUMN_NAMES.DATE || sortColumn === COLUMN_NAMES.AMOUNT) {\n sortASC = sortCompare ? 1 : -1\n sortDESC = sortCompare ? -1 : 1\n }\n\n return sortDirection === TABLE_CONST.ASC ? sortASC : sortDESC\n })\n}\n\n/**\n * Determines if a value is included within the terms set in the search bar\n */\nconst isIncludedInSearch = (searchFilter: string, value: string | null | undefined) => {\n const lowerCasedTerms = searchFilter.toLowerCase().split(' ')\n const lowerCasedValue = value?.toString().toLowerCase() ?? ''\n\n return lowerCasedTerms.every((filter) => lowerCasedValue.indexOf(filter) > -1)\n}\n\n// TODO: Change the way formatting data is exported in order to handle localization\ntype FormattedTransaction = {\n Date: string\n Description: string\n 'Original Description': string\n Amount: string\n Type: string\n 'Parent Category': string\n Category: string\n Account: string\n Tags: string\n Memo: string\n Pending: string\n}\n\n/**\n * Collects the GUIDs of all transactions that act as parents\n * to one or more split (child) transactions.\n */\nfunction extractParentTransactionGuids(transactions: Transaction[]): Set<string> {\n return new Set(\n transactions.filter((tx) => tx.parent_guid !== undefined).map((tx) => tx.parent_guid!),\n )\n}\n\n/**\n * Organizes child transactions by their parent transaction GUID.\n * Returns a map from parent GUID to an array of its child transactions.\n */\nfunction mapChildTransactionsByParent(transactions: Transaction[]): Record<string, Transaction[]> {\n return transactions.reduce<Record<string, Transaction[]>>((accumulator, tx) => {\n if (tx.parent_guid) {\n if (!accumulator[tx.parent_guid]) accumulator[tx.parent_guid] = []\n accumulator[tx.parent_guid].push(tx)\n }\n return accumulator\n }, {})\n}\n\n/**\n * Produces a list of transactions based on the given sorted transactions,\n * where parent transactions that have split children are replaced by those\n * children sorted by descending absolute amount. All other transactions\n * are included as-is, with duplicates removed.\n */\nexport function flattenTransactionsWithSplits(\n sortedTransactions: Transaction[],\n allTransactions: Transaction[],\n): Transaction[] {\n // Set of parent transaction GUIDs that have split child transactions\n const parentTransactionGuidsWithSplits = extractParentTransactionGuids(allTransactions)\n\n // Map from parent GUID to array of its child split transactions\n const childTransactionsGroupedByParent = mapChildTransactionsByParent(allTransactions)\n\n // Track GUIDs of transactions already included in the result to avoid duplicates\n const processedTransactionGuids = new Set<string>()\n\n // Resulting list of transactions with parents replaced by their split children\n const flattenedTransactionList: Transaction[] = []\n\n for (const transaction of sortedTransactions) {\n if (parentTransactionGuidsWithSplits.has(transaction.guid)) {\n // This transaction is a parent with splits, so replace it with its children\n const splitChildTransactions = childTransactionsGroupedByParent[transaction.guid] ?? []\n\n splitChildTransactions\n .slice()\n .sort((a, b) => Math.abs(b.amount) - Math.abs(a.amount))\n .forEach((childTransaction) => {\n if (!processedTransactionGuids.has(childTransaction.guid)) {\n flattenedTransactionList.push(childTransaction)\n processedTransactionGuids.add(childTransaction.guid)\n }\n })\n } else if (!processedTransactionGuids.has(transaction.guid)) {\n // Normal transaction (no splits), add as-is if not already added\n flattenedTransactionList.push(transaction)\n processedTransactionGuids.add(transaction.guid)\n }\n }\n\n return flattenedTransactionList\n}\n\nexport const exportTransactionsToCSV = (transactions: Transaction[], tags: Tag[]) => {\n const csvContent = structureCSVData(formatTransactions(transactions, tags))\n\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' })\n const link = document.createElement('a')\n link.href = URL.createObjectURL(blob)\n link.setAttribute('download', 'transactions.csv')\n\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n\n URL.revokeObjectURL(link.href)\n}\n\n/**\n * Formats a list of transactions into a list that will be used when\n * downloaded to a CSV file.\n */\nconst formatTransactions = (transactions: Transaction[], tags: Tag[]) => {\n return transactions.map((transaction) => ({\n Date: formatDate(fromUnixTime(transaction.date), DATE_FORMATS_INTL.YEAR_MONTH_DAY),\n Description: getDescription(transaction),\n 'Original Description': transaction.feed_description,\n Amount: `${transaction.amount}`,\n Type: transaction.transaction_type === TransactionType.CREDIT ? 'Credit' : 'Debit',\n 'Parent Category': CategoryGuidToName[transaction.top_level_category_guid || ''],\n Category: transaction.category,\n Account: transaction.account,\n Tags: getTags(transaction, tags),\n Memo: transaction.memo,\n Pending: transaction.isPending ? 'TRUE' : 'FALSE',\n })) as FormattedTransaction[]\n}\n\n/**\n * Escapes a value for safe CSV output\n */\nconst escapeCsvField = (field?: string | null): string => {\n if (!field) return ''\n return /[,\"\\n\\r]/.test(field) ? `\"${field.replace(/\"/g, '\"\"')}\"` : field\n}\n\n/**\n * Structures the CSV file data using the formatted transactions\n */\nconst structureCSVData = (formattedTransactions: FormattedTransaction[]) => {\n const csvHeader = Object.keys(formattedTransactions[0]).join(',').concat('\\r\\n')\n const csvRows = formattedTransactions\n .map((transaction) => Object.values(transaction).map(escapeCsvField).join(','))\n .join('\\r\\n')\n\n return csvHeader + csvRows\n}\n\n/**\n * Get the description for a transaction that will be used within the CSV copy.\n * We want to highlight that split transactions are a split as well as\n * hidden transactions are hidden.\n */\nconst getDescription = (transaction: Transaction) => {\n let description = transaction.parent_guid ? 'Split: ' : ''\n description += transaction.is_hidden ? '(Excluded) ' : ''\n description += transaction.description\n\n return description\n}\n\nconst getTags = (transaction: Transaction, tags: Tag[]) => {\n return transaction.tags\n .map((tagGuid) => {\n const tag = tags.filter((t) => t.guid === tagGuid)[0]\n\n return tag?.name ?? ''\n })\n .join(' ')\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Dashboard.es.js","names":[],"sources":["../../src/dashboard/Dashboard.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Grid from '@mui/material/Grid'\nimport Skeleton from '@mui/material/Skeleton'\nimport Stack from '@mui/material/Stack'\n\nimport { useGlobalStore, useScreenSize, useWidgetLoadTimer } from '../common'\n\nimport { Banner } from '../common/components/Banner'\n\nimport Greeting from './Greeting'\nimport { DashboardLocation } from './constants/Dashboard'\nimport type { DashboardWidget } from './types/DashboardTypes'\n\nexport interface DashboardProps {\n widgets: DashboardWidget[]\n isLoading: boolean\n}\n\nconst Dashboard: React.FC<DashboardProps> = ({ widgets, isLoading }) => {\n const { isDesktop, isMobile } = useScreenSize()\n const { copyStore } = useGlobalStore()\n\n useWidgetLoadTimer({\n widgetName: 'Dashboard',\n isLoaded: !isLoading,\n })\n\n const sortedWidgets = React.useMemo(\n () =>\n widgets\n .filter((widget) => widget.location !== DashboardLocation.Disabled)\n .sort((w1, w2) => w1.index - w2.index),\n [widgets],\n )\n\n const mainWidgets = React.useMemo(\n () => sortedWidgets.filter((widget) => widget.location === DashboardLocation.Main),\n [sortedWidgets],\n )\n\n const sideWidgets = React.useMemo(\n () => sortedWidgets.filter((widget) => widget.location === DashboardLocation.RightSide),\n [sortedWidgets],\n )\n\n return (\n <Grid container={true} spacing={isMobile ? 0 : 24}>\n <Grid size={12} sx={{ pt: 16 }}>\n {copyStore.isInitialized && <Greeting />}\n </Grid>\n\n {/* Main Column */}\n <Grid size={{ xs: 12, lg: 8 }}>\n <Banner />\n {isLoading && (\n <Stack direction=\"column\" spacing={24}>\n <Skeleton height={100} variant=\"rounded\" width=\"100%\" />\n <Skeleton height={300} variant=\"rounded\" width=\"100%\" />\n <Skeleton height={300} variant=\"rounded\" width=\"100%\" />\n </Stack>\n )}\n {!isLoading && (\n <Stack direction=\"column\" spacing={24}>\n {isDesktop\n ? mainWidgets.map((widget) => (\n <React.Fragment key={widget.index}>{widget.component}</React.Fragment>\n ))\n : sortedWidgets.map((widget) => (\n <React.Fragment key={widget.index}>{widget.component}</React.Fragment>\n ))}\n </Stack>\n )}\n </Grid>\n\n {/* Right Column */}\n {isDesktop && (\n <Grid size={{ lg: 4 }}>\n {isLoading ? (\n <Stack direction=\"column\" spacing={24}>\n <Skeleton height={200} variant=\"rounded\" width=\"100%\" />\n <Skeleton height={100} variant=\"rounded\" width=\"100%\" />\n <Skeleton height={300} variant=\"rounded\" width=\"100%\" />\n </Stack>\n ) : (\n <Stack direction=\"column\" spacing={24}>\n {sideWidgets.map((widget) => (\n <React.Fragment key={widget.index}>{widget.component}</React.Fragment>\n ))}\n </Stack>\n )}\n </Grid>\n )}\n </Grid>\n )\n}\n\nexport default observer(Dashboard)\n"],"mappings":"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"}
1
+ {"version":3,"file":"Dashboard.es.js","names":[],"sources":["../../src/dashboard/Dashboard.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Grid from '@mui/material/Grid'\nimport Skeleton from '@mui/material/Skeleton'\nimport Stack from '@mui/material/Stack'\n\nimport { useGlobalStore, useScreenSize, useWidgetLoadTimer } from '../common'\n\nimport { Banner } from '../common/components/Banner'\n\nimport Greeting from './Greeting'\nimport { DashboardLocation } from './constants/Dashboard'\nimport type { DashboardWidget } from './types/DashboardTypes'\n\nexport interface DashboardProps {\n widgets: DashboardWidget[]\n isLoading: boolean\n}\n\nconst Dashboard: React.FC<DashboardProps> = ({ widgets, isLoading }) => {\n const { isDesktop, isMobile } = useScreenSize()\n const { copyStore } = useGlobalStore()\n\n useWidgetLoadTimer({\n widgetName: 'Dashboard',\n isLoaded: !isLoading,\n })\n\n const sortedWidgets = React.useMemo(\n () =>\n widgets\n .filter((widget) => widget.location !== DashboardLocation.Disabled)\n .sort((w1, w2) => w1.index - w2.index),\n [widgets],\n )\n\n const mainWidgets = React.useMemo(\n () => sortedWidgets.filter((widget) => widget.location === DashboardLocation.Main),\n [sortedWidgets],\n )\n\n const sideWidgets = React.useMemo(\n () => sortedWidgets.filter((widget) => widget.location === DashboardLocation.RightSide),\n [sortedWidgets],\n )\n\n return (\n <Grid container={true} spacing={isMobile ? 0 : 24}>\n <Grid size={12} sx={{ pt: 16 }}>\n {copyStore.isInitialized && <Greeting />}\n </Grid>\n\n {/* Main Column */}\n <Grid size={{ xs: 12, lg: 8 }}>\n <Banner />\n {isLoading && (\n <Stack direction=\"column\" spacing={24}>\n <Skeleton height={100} variant=\"rounded\" width=\"100%\" />\n <Skeleton height={300} variant=\"rounded\" width=\"100%\" />\n <Skeleton height={300} variant=\"rounded\" width=\"100%\" />\n </Stack>\n )}\n {!isLoading && (\n <Stack direction=\"column\" spacing={24}>\n {isDesktop\n ? mainWidgets.map((widget) => (\n <React.Fragment key={widget.index}>{widget.component}</React.Fragment>\n ))\n : sortedWidgets.map((widget) => (\n <React.Fragment key={widget.index}>{widget.component}</React.Fragment>\n ))}\n </Stack>\n )}\n </Grid>\n\n {/* Right Column */}\n {isDesktop && (\n <Grid size={{ lg: 4 }}>\n {isLoading ? (\n <Stack direction=\"column\" spacing={24}>\n <Skeleton height={200} variant=\"rounded\" width=\"100%\" />\n <Skeleton height={100} variant=\"rounded\" width=\"100%\" />\n <Skeleton height={300} variant=\"rounded\" width=\"100%\" />\n </Stack>\n ) : (\n <Stack direction=\"column\" spacing={24}>\n {sideWidgets.map((widget) => (\n <React.Fragment key={widget.index}>{widget.component}</React.Fragment>\n ))}\n </Stack>\n )}\n </Grid>\n )}\n </Grid>\n )\n}\n\nexport default observer(Dashboard)\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Greeting.es.js","names":[],"sources":["../../src/dashboard/Greeting.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Stack from '@mui/material/Stack'\nimport Paper from '@mui/material/Paper'\n\nimport { H2, P } from '@mxenabled/mxui'\nimport { useMediaQuery } from '@mui/system'\n\nimport { ConnectDrawer, useAppConfig, useGlobalCopyStore, useScreenSize } from '../common'\n\nimport AddAccounts from '../common/components/addaccounts/AddAccounts'\nimport { GlobalAccountFilter } from '../common/components/GlobalAccountFilter'\n\nconst Greeting = () => {\n const [showConnectWidget, setShowConnectWidget] = React.useState(false)\n\n const isSmallMobileDevice = useMediaQuery('(max-width:320px)')\n\n const { common: commonCopy, connect: connectCopy } = useGlobalCopyStore()\n const { config } = useAppConfig()\n const { isMobile } = useScreenSize()\n\n const getGreeting = () => {\n const now = new Date()\n const hour = now.getHours()\n\n if (hour > 1 && hour < 12) {\n return commonCopy.good_morning\n } else if (hour >= 12 && hour < 18) {\n return commonCopy.good_afternoon\n } else {\n return commonCopy.good_evening\n }\n }\n\n return (\n <React.Fragment>\n <Paper sx={{ gap: 12, mb: isMobile ? 24 : 0, p: 24 }}>\n <Stack alignItems=\"center\" flexDirection=\"row\" justifyContent=\"space-between\">\n <Stack>\n <H2 variant={isSmallMobileDevice ? 'h2' : 'h1'}>{getGreeting()}</H2>\n <P color=\"text.secondary\">{commonCopy.heres_your_spending_overview}</P>\n </Stack>\n <Stack flexDirection=\"row\">\n {config.show_connections_widget_in_master && (\n <AddAccounts handleConnectClick={() => setShowConnectWidget(true)} />\n )}\n <GlobalAccountFilter />\n </Stack>\n </Stack>\n </Paper>\n {showConnectWidget && (\n <ConnectDrawer\n onClose={() => setShowConnectWidget(false)}\n showConnectWidget={showConnectWidget}\n title={connectCopy.mini_title}\n />\n )}\n </React.Fragment>\n )\n}\n\nexport default observer(Greeting)\n"],"mappings":";;;;;;;;;;;;AAcA,IAAM,IAAA,MAAiB;AACrB,QAAM,CAAC,GAAmB,CAAA,IAAwB,EAAM,SAAS,EAAK,GAEhE,IAAsB,EAAc,mBAAmB,GAEvD,EAAE,QAAQ,GAAY,SAAS,EAAA,IAAgB,EAAmB,GAClE,EAAE,QAAA,EAAA,IAAW,EAAa,GAC1B,EAAE,UAAA,EAAA,IAAa,EAAc,GAE7B,IAAA,MAAoB;AAExB,UAAM,KAAO,oBADG,KACH,GAAI,SAAS;AAE1B,WAAI,IAAO,KAAK,IAAO,KACd,EAAW,eACT,KAAQ,MAAM,IAAO,KACvB,EAAW,iBAEX,EAAW;AAAA,EAEtB;AAEA,SACE,gBAAA,EAAC,EAAM,UAAP,EAAA,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,IAAO,IAAI;AAAA,MAAE,KAAK;AAAA,MAAI,IAAI,IAAW,KAAK;AAAA,MAAG,GAAG;AAAA,IAAG;AAAA,cACjD,gBAAA,EAAC,GAAD;AAAA,MAAO,YAAW;AAAA,MAAS,eAAc;AAAA,MAAM,gBAAe;AAAA,gBAA9D,CACE,gBAAA,EAAC,GAAD,EAAA,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,QAAI,SAAS,IAAsB,OAAO;AAAA,kBAAO,EAAY;AAAA,MAAM,CAAA,GACnE,gBAAA,EAAC,GAAD;AAAA,QAAG,OAAM;AAAA,kBAAkB,EAAW;AAAA,MAAgC,CAAA,CACjE,EAAA,CAAA,GACP,gBAAA,EAAC,GAAD;AAAA,QAAO,eAAc;AAAA,kBAArB,CACG,EAAO,qCACN,gBAAA,EAAC,GAAD,EAAa,oBAAA,MAA0B,EAAqB,EAAI,EAAI,CAAA,GAEtE,gBAAA,EAAC,GAAD,CAAsB,CAAA,CACjB;AAAA,QACF;AAAA;EACF,CAAA,GACN,KACC,gBAAA,EAAC,GAAD;AAAA,IACE,SAAA,MAAe,EAAqB,EAAK;AAAA,IACtB,mBAAA;AAAA,IACnB,OAAO,EAAY;AAAA,EACpB,CAAA,CAEW,EAAA,CAAA;AAEpB,GAEA,IAAe,EAAS,CAAQ"}
1
+ {"version":3,"file":"Greeting.es.js","names":[],"sources":["../../src/dashboard/Greeting.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Stack from '@mui/material/Stack'\nimport Paper from '@mui/material/Paper'\n\nimport { H2, P } from '@mxenabled/mxui'\nimport { useMediaQuery } from '@mui/system'\n\nimport { ConnectDrawer, useAppConfig, useGlobalCopyStore, useScreenSize } from '../common'\n\nimport AddAccounts from '../common/components/addaccounts/AddAccounts'\nimport { GlobalAccountFilter } from '../common/components/GlobalAccountFilter'\n\nconst Greeting = () => {\n const [showConnectWidget, setShowConnectWidget] = React.useState(false)\n\n const isSmallMobileDevice = useMediaQuery('(max-width:320px)')\n\n const { common: commonCopy, connect: connectCopy } = useGlobalCopyStore()\n const { config } = useAppConfig()\n const { isMobile } = useScreenSize()\n\n const getGreeting = () => {\n const now = new Date()\n const hour = now.getHours()\n\n if (hour > 1 && hour < 12) {\n return commonCopy.good_morning\n } else if (hour >= 12 && hour < 18) {\n return commonCopy.good_afternoon\n } else {\n return commonCopy.good_evening\n }\n }\n\n return (\n <React.Fragment>\n <Paper sx={{ gap: 12, mb: isMobile ? 24 : 0, p: 24 }}>\n <Stack alignItems=\"center\" flexDirection=\"row\" justifyContent=\"space-between\">\n <Stack>\n <H2 variant={isSmallMobileDevice ? 'h2' : 'h1'}>{getGreeting()}</H2>\n <P color=\"text.secondary\">{commonCopy.heres_your_spending_overview}</P>\n </Stack>\n <Stack flexDirection=\"row\">\n {config.show_connections_widget_in_master && (\n <AddAccounts handleConnectClick={() => setShowConnectWidget(true)} />\n )}\n <GlobalAccountFilter />\n </Stack>\n </Stack>\n </Paper>\n {showConnectWidget && (\n <ConnectDrawer\n onClose={() => setShowConnectWidget(false)}\n showConnectWidget={showConnectWidget}\n title={connectCopy.mini_title}\n />\n )}\n </React.Fragment>\n )\n}\n\nexport default observer(Greeting)\n"],"mappings":";;;;;;;;;;;;AAcA,IAAM,IAAA,MAAiB;AACrB,QAAM,CAAC,GAAmB,CAAA,IAAwB,EAAM,SAAS,EAAK,GAEhE,IAAsB,EAAc,mBAAmB,GAEvD,EAAE,QAAQ,GAAY,SAAS,EAAA,IAAgB,EAAmB,GAClE,EAAE,QAAA,EAAA,IAAW,EAAa,GAC1B,EAAE,UAAA,EAAA,IAAa,EAAc,GAE7B,IAAA,MAAoB;AAExB,UAAM,KAAO,oBADG,KACH,GAAI,SAAS;AAE1B,WAAI,IAAO,KAAK,IAAO,KACd,EAAW,eACT,KAAQ,MAAM,IAAO,KACvB,EAAW,iBAEX,EAAW;AAAA,EAEtB;AAEA,SACE,gBAAA,EAAC,EAAM,UAAP,EAAA,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,IAAO,IAAI;AAAA,MAAE,KAAK;AAAA,MAAI,IAAI,IAAW,KAAK;AAAA,MAAG,GAAG;AAAA,IAAG;AAAA,IACjD,UAAA,gBAAA,EAAC,GAAD;AAAA,MAAO,YAAW;AAAA,MAAS,eAAc;AAAA,MAAM,gBAAe;AAAA,MAA9D,UAAA,CACE,gBAAA,EAAC,GAAD,EAAA,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,QAAI,SAAS,IAAsB,OAAO;AAAA,QAAO,UAAA,EAAY;AAAA,MAAM,CAAA,GACnE,gBAAA,EAAC,GAAD;AAAA,QAAG,OAAM;AAAA,QAAkB,UAAA,EAAW;AAAA,MAAgC,CAAA,CACjE,EAAA,CAAA,GACP,gBAAA,EAAC,GAAD;AAAA,QAAO,eAAc;AAAA,QAArB,UAAA,CACG,EAAO,qCACN,gBAAA,EAAC,GAAD,EAAa,oBAAA,MAA0B,EAAqB,EAAI,EAAI,CAAA,GAEtE,gBAAA,EAAC,GAAD,CAAsB,CAAA,CACjB;AAAA,MACF,CAAA,CAAA;AAAA;EACF,CAAA,GACN,KACC,gBAAA,EAAC,GAAD;AAAA,IACE,SAAA,MAAe,EAAqB,EAAK;AAAA,IACtB,mBAAA;AAAA,IACnB,OAAO,EAAY;AAAA,EACpB,CAAA,CAEW,EAAA,CAAA;AAEpB,GAEA,IAAe,EAAS,CAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"DebtsWidget.es.js","names":[],"sources":["../../src/debts/DebtsWidget.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport Stack from '@mui/material/Stack'\n\nimport {\n ANALYTICS_EVENTS,\n ConnectDrawer,\n EmptyState,\n Loader,\n useAccountStore,\n useAppConfig,\n useDebtStore,\n useEvent,\n useGlobalCopyStore,\n useGlobalUiStore,\n useGoalStore,\n useScreenSize,\n useWidgetLoadTimer,\n WidgetContainer,\n} from '../common'\nimport { AccountType, WidgetProps } from '../core'\n\nimport SnowballCard from './components/SnowballCard'\nimport SnowballDrawer from './components/SnowballDrawer'\nimport DebtDrawer from './components/DebtDrawer'\nimport PaydownDrawer from './components/PaydownDrawer'\nimport { DebtsChart } from './components/DebtsChart'\nimport { DebtsTable } from './components/DebtsTable'\nimport { DebtsPriorityAction } from './components/actions/DebtsPriorityAction'\nimport { buildEmptyStateProps, transformDebtsChartData } from '../core/utils/DebtUtils'\nimport { useAccountUiStore } from '../accounts'\nimport { useDebtsUiStore } from './hooks/useDebtsUiStore'\nimport { PaydownButton } from './components/debtspaydown/PaydownButton'\n\nconst DebtsWidget: React.FC<WidgetProps> = ({ onBackClick, onMenuClick, sx }) => {\n const { isDesktop, isMobile } = useScreenSize()\n const { connect: connectCopy, debts: copy } = useGlobalCopyStore()\n const { onEvent } = useEvent()\n const {\n config: { show_connections_widget_in_master },\n } = useAppConfig()\n const { isInitialized } = useGlobalUiStore()\n const { setSelectedAccount } = useAccountUiStore()\n const { selectedDebtPriority, setSelectedDebtChartData } = useDebtsUiStore()\n\n const {\n isAccountDataLoaded,\n loadAccountData,\n detailedAccounts,\n visibleDebtAccounts: accounts,\n } = useAccountStore()\n const { isAllGoalDataLoaded, loadGoalData, monthlyCashFlowProfile } = useGoalStore()\n const { debts } = useDebtStore()\n\n const [isDebtDrawerOpen, setIsDebtDrawerOpen] = React.useState(false)\n const [isPaydownDrawerOpen, setIsPaydownDrawerOpen] = React.useState(false)\n const [isSnowballDrawerOpen, setIsSnowballDrawerOpen] = React.useState(false)\n const [hoveredDebtGuid, setHoveredDebtGuid] = React.useState('')\n const [showConnectWidget, setShowConnectWidget] = React.useState(false)\n\n useWidgetLoadTimer({\n widgetName: 'DebtsWidget',\n isLoaded: isAccountDataLoaded && isAllGoalDataLoaded,\n })\n\n const debtsChartData = React.useMemo(() => {\n const extraPaydown = monthlyCashFlowProfile?.extra_payment ?? 0\n return transformDebtsChartData(debts, selectedDebtPriority, extraPaydown)\n }, [debts, selectedDebtPriority, monthlyCashFlowProfile])\n\n React.useEffect(() => {\n if (!isAccountDataLoaded) {\n loadAccountData().finally()\n }\n onEvent(ANALYTICS_EVENTS.DEBTS_VIEW)\n }, [])\n\n React.useEffect(() => {\n if (isInitialized) {\n loadGoalData().finally()\n }\n }, [isInitialized])\n\n const onHoverDebt = (guid: string) => setHoveredDebtGuid(guid)\n\n const onClickDebt = () => {\n const account = accounts.find((a) => a.guid === hoveredDebtGuid)\n const chartData = debtsChartData.find((d) => d.guid === hoveredDebtGuid)\n if (account) setSelectedAccount(account)\n if (chartData) setSelectedDebtChartData(chartData)\n setIsDebtDrawerOpen(true)\n }\n\n const onClickAccountFilter = () => onEvent(ANALYTICS_EVENTS.DEBTS_CLICK_FILTER)\n\n const onClickSnowballCta = () => {\n setIsSnowballDrawerOpen(true)\n onEvent(ANALYTICS_EVENTS.DEBTS_CLICK_SNOWBALL_CTA)\n }\n\n const onClickPaydown = () => {\n setIsPaydownDrawerOpen(true)\n onEvent(ANALYTICS_EVENTS.DEBTS_CLICK_PAYDOWN)\n }\n\n if (!isInitialized || !isAccountDataLoaded || !isAllGoalDataLoaded) {\n return <Loader />\n }\n\n const hasNoAccounts = detailedAccounts.length === 0\n const hasNoDebtAccounts = accounts.length === 0\n const hasNoDebts = debts.length === 0\n const showEmptyState = hasNoAccounts || hasNoDebtAccounts || hasNoDebts\n\n const emptyStateProps = buildEmptyStateProps(copy, show_connections_widget_in_master, () =>\n setShowConnectWidget(true),\n )\n\n return (\n <WidgetContainer\n actions={[<DebtsPriorityAction disabled={showEmptyState} key=\"prioritize-debts\" />]}\n allowedAccountTypes={[\n AccountType.CREDIT_CARD,\n AccountType.LOAN,\n AccountType.MORTGAGE,\n AccountType.LINE_OF_CREDIT,\n AccountType.CHECKING_LINE_OF_CREDIT,\n ]}\n hasDivider={true}\n onAccountsFilterClick={onClickAccountFilter}\n onBackClick={onBackClick}\n onMenuClick={onMenuClick}\n slotComponent={\n <PaydownButton disabled={showEmptyState} key=\"extra-paydown\" onClick={onClickPaydown} />\n }\n sx={sx}\n title={copy.title}\n >\n <Stack sx={{ pt: 48, px: isDesktop ? '48px' : '24px' }}>\n {showEmptyState && (\n <EmptyState\n header={emptyStateProps.header}\n icon=\"note_stack\"\n onClick={emptyStateProps.onClickHandler}\n primaryButton={emptyStateProps.primaryButton}\n subText={emptyStateProps.description}\n sx={{ maxWidth: 400 }}\n />\n )}\n {!showEmptyState && (\n <>\n <Stack\n sx={{\n alignItems: isMobile ? 'flex-start' : 'flex-end',\n flexDirection: isMobile ? 'column' : 'row',\n mx: isMobile ? '-12px' : 0,\n }}\n >\n <DebtsChart\n debts={debtsChartData}\n height={isMobile ? 250 : undefined}\n hoveredDebtGuid={hoveredDebtGuid}\n onClickArea={onClickDebt}\n onHoverArea={onHoverDebt}\n sx={{ mr: isMobile ? '4px' : '-48px' }}\n />\n <SnowballCard\n debts={debtsChartData}\n onClickCta={onClickSnowballCta}\n sx={{ mb: isMobile ? '0px' : '64px' }}\n />\n </Stack>\n <Stack sx={{ mx: isMobile ? '-24px' : 0 }}>\n <DebtsTable\n debts={debtsChartData}\n hoveredDebtGuid={hoveredDebtGuid}\n onClickRow={onClickDebt}\n onHoverRow={onHoverDebt}\n />\n </Stack>\n </>\n )}\n </Stack>\n <SnowballDrawer\n isOpen={isSnowballDrawerOpen}\n onClose={() => setIsSnowballDrawerOpen(false)}\n />\n <DebtDrawer isOpen={isDebtDrawerOpen} onClose={() => setIsDebtDrawerOpen(false)} />\n <PaydownDrawer isOpen={isPaydownDrawerOpen} onClose={() => setIsPaydownDrawerOpen(false)} />\n <ConnectDrawer\n onClose={() => setShowConnectWidget(false)}\n showConnectWidget={showConnectWidget}\n title={connectCopy.mini_title}\n />\n </WidgetContainer>\n )\n}\n\nexport default observer(DebtsWidget)\n"],"mappings":"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"}
1
+ {"version":3,"file":"DebtsWidget.es.js","names":[],"sources":["../../src/debts/DebtsWidget.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport Stack from '@mui/material/Stack'\n\nimport {\n ANALYTICS_EVENTS,\n ConnectDrawer,\n EmptyState,\n Loader,\n useAccountStore,\n useAppConfig,\n useDebtStore,\n useEvent,\n useGlobalCopyStore,\n useGlobalUiStore,\n useGoalStore,\n useScreenSize,\n useWidgetLoadTimer,\n WidgetContainer,\n} from '../common'\nimport { AccountType, WidgetProps } from '../core'\n\nimport SnowballCard from './components/SnowballCard'\nimport SnowballDrawer from './components/SnowballDrawer'\nimport DebtDrawer from './components/DebtDrawer'\nimport PaydownDrawer from './components/PaydownDrawer'\nimport { DebtsChart } from './components/DebtsChart'\nimport { DebtsTable } from './components/DebtsTable'\nimport { DebtsPriorityAction } from './components/actions/DebtsPriorityAction'\nimport { buildEmptyStateProps, transformDebtsChartData } from '../core/utils/DebtUtils'\nimport { useAccountUiStore } from '../accounts'\nimport { useDebtsUiStore } from './hooks/useDebtsUiStore'\nimport { PaydownButton } from './components/debtspaydown/PaydownButton'\n\nconst DebtsWidget: React.FC<WidgetProps> = ({ onBackClick, onMenuClick, sx }) => {\n const { isDesktop, isMobile } = useScreenSize()\n const { connect: connectCopy, debts: copy } = useGlobalCopyStore()\n const { onEvent } = useEvent()\n const {\n config: { show_connections_widget_in_master },\n } = useAppConfig()\n const { isInitialized } = useGlobalUiStore()\n const { setSelectedAccount } = useAccountUiStore()\n const { selectedDebtPriority, setSelectedDebtChartData } = useDebtsUiStore()\n\n const {\n isAccountDataLoaded,\n loadAccountData,\n detailedAccounts,\n visibleDebtAccounts: accounts,\n } = useAccountStore()\n const { isAllGoalDataLoaded, loadGoalData, monthlyCashFlowProfile } = useGoalStore()\n const { debts } = useDebtStore()\n\n const [isDebtDrawerOpen, setIsDebtDrawerOpen] = React.useState(false)\n const [isPaydownDrawerOpen, setIsPaydownDrawerOpen] = React.useState(false)\n const [isSnowballDrawerOpen, setIsSnowballDrawerOpen] = React.useState(false)\n const [hoveredDebtGuid, setHoveredDebtGuid] = React.useState('')\n const [showConnectWidget, setShowConnectWidget] = React.useState(false)\n\n useWidgetLoadTimer({\n widgetName: 'DebtsWidget',\n isLoaded: isAccountDataLoaded && isAllGoalDataLoaded,\n })\n\n const debtsChartData = React.useMemo(() => {\n const extraPaydown = monthlyCashFlowProfile?.extra_payment ?? 0\n return transformDebtsChartData(debts, selectedDebtPriority, extraPaydown)\n }, [debts, selectedDebtPriority, monthlyCashFlowProfile])\n\n React.useEffect(() => {\n if (!isAccountDataLoaded) {\n loadAccountData().finally()\n }\n onEvent(ANALYTICS_EVENTS.DEBTS_VIEW)\n }, [])\n\n React.useEffect(() => {\n if (isInitialized) {\n loadGoalData().finally()\n }\n }, [isInitialized])\n\n const onHoverDebt = (guid: string) => setHoveredDebtGuid(guid)\n\n const onClickDebt = () => {\n const account = accounts.find((a) => a.guid === hoveredDebtGuid)\n const chartData = debtsChartData.find((d) => d.guid === hoveredDebtGuid)\n if (account) setSelectedAccount(account)\n if (chartData) setSelectedDebtChartData(chartData)\n setIsDebtDrawerOpen(true)\n }\n\n const onClickAccountFilter = () => onEvent(ANALYTICS_EVENTS.DEBTS_CLICK_FILTER)\n\n const onClickSnowballCta = () => {\n setIsSnowballDrawerOpen(true)\n onEvent(ANALYTICS_EVENTS.DEBTS_CLICK_SNOWBALL_CTA)\n }\n\n const onClickPaydown = () => {\n setIsPaydownDrawerOpen(true)\n onEvent(ANALYTICS_EVENTS.DEBTS_CLICK_PAYDOWN)\n }\n\n if (!isInitialized || !isAccountDataLoaded || !isAllGoalDataLoaded) {\n return <Loader />\n }\n\n const hasNoAccounts = detailedAccounts.length === 0\n const hasNoDebtAccounts = accounts.length === 0\n const hasNoDebts = debts.length === 0\n const showEmptyState = hasNoAccounts || hasNoDebtAccounts || hasNoDebts\n\n const emptyStateProps = buildEmptyStateProps(copy, show_connections_widget_in_master, () =>\n setShowConnectWidget(true),\n )\n\n return (\n <WidgetContainer\n actions={[<DebtsPriorityAction disabled={showEmptyState} key=\"prioritize-debts\" />]}\n allowedAccountTypes={[\n AccountType.CREDIT_CARD,\n AccountType.LOAN,\n AccountType.MORTGAGE,\n AccountType.LINE_OF_CREDIT,\n AccountType.CHECKING_LINE_OF_CREDIT,\n ]}\n hasDivider={true}\n onAccountsFilterClick={onClickAccountFilter}\n onBackClick={onBackClick}\n onMenuClick={onMenuClick}\n slotComponent={\n <PaydownButton disabled={showEmptyState} key=\"extra-paydown\" onClick={onClickPaydown} />\n }\n sx={sx}\n title={copy.title}\n >\n <Stack sx={{ pt: 48, px: isDesktop ? '48px' : '24px' }}>\n {showEmptyState && (\n <EmptyState\n header={emptyStateProps.header}\n icon=\"note_stack\"\n onClick={emptyStateProps.onClickHandler}\n primaryButton={emptyStateProps.primaryButton}\n subText={emptyStateProps.description}\n sx={{ maxWidth: 400 }}\n />\n )}\n {!showEmptyState && (\n <>\n <Stack\n sx={{\n alignItems: isMobile ? 'flex-start' : 'flex-end',\n flexDirection: isMobile ? 'column' : 'row',\n mx: isMobile ? '-12px' : 0,\n }}\n >\n <DebtsChart\n debts={debtsChartData}\n height={isMobile ? 250 : undefined}\n hoveredDebtGuid={hoveredDebtGuid}\n onClickArea={onClickDebt}\n onHoverArea={onHoverDebt}\n sx={{ mr: isMobile ? '4px' : '-48px' }}\n />\n <SnowballCard\n debts={debtsChartData}\n onClickCta={onClickSnowballCta}\n sx={{ mb: isMobile ? '0px' : '64px' }}\n />\n </Stack>\n <Stack sx={{ mx: isMobile ? '-24px' : 0 }}>\n <DebtsTable\n debts={debtsChartData}\n hoveredDebtGuid={hoveredDebtGuid}\n onClickRow={onClickDebt}\n onHoverRow={onHoverDebt}\n />\n </Stack>\n </>\n )}\n </Stack>\n <SnowballDrawer\n isOpen={isSnowballDrawerOpen}\n onClose={() => setIsSnowballDrawerOpen(false)}\n />\n <DebtDrawer isOpen={isDebtDrawerOpen} onClose={() => setIsDebtDrawerOpen(false)} />\n <PaydownDrawer isOpen={isPaydownDrawerOpen} onClose={() => setIsPaydownDrawerOpen(false)} />\n <ConnectDrawer\n onClose={() => setShowConnectWidget(false)}\n showConnectWidget={showConnectWidget}\n title={connectCopy.mini_title}\n />\n </WidgetContainer>\n )\n}\n\nexport default observer(DebtsWidget)\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DebtDrawer.es.js","names":[],"sources":["../../../src/debts/components/DebtDrawer.tsx"],"sourcesContent":["import Stack from '@mui/material/Stack'\n\nimport { Drawer, useGlobalCopyStore } from '../../common'\nimport { useDebtsUiStore } from '../hooks/useDebtsUiStore'\n\nimport AccountDetailsHeader from '../../accounts/components/detailsdrawer/Accounts/AccountDetailsHeader'\nimport DebtDetailsChart from './debtsdrawer/DebtDetailsChart'\nimport DebtDetailsContent from './debtsdrawer/DebtDetailsContent'\n\ninterface DebtDrawerProps {\n isOpen: boolean\n onClose: () => void\n}\n\nconst DebtDrawer = ({ isOpen, onClose }: DebtDrawerProps) => {\n const { debts: copy } = useGlobalCopyStore()\n const { showError, showCompleted } = useDebtsUiStore()\n const headerChart = showError || showCompleted ? <></> : <DebtDetailsChart />\n\n return (\n <Drawer\n ariaLabelClose={copy.details_close_aria}\n isOpen={isOpen}\n onClose={onClose}\n title={copy.details_title}\n >\n <Stack bgcolor=\"background.default\">\n <AccountDetailsHeader customDetailsChart={headerChart} />\n <DebtDetailsContent />\n </Stack>\n </Drawer>\n )\n}\n\nexport default DebtDrawer\n"],"mappings":";;;;;;;;AAcA,IAAM,IAAA,CAAc,EAAE,QAAA,GAAQ,SAAA,EAAA,MAA+B;AAC3D,QAAM,EAAE,OAAO,EAAA,IAAS,EAAmB,GACrC,EAAE,WAAA,GAAW,eAAA,EAAA,IAAkB,EAAgB,GAC/C,IAAc,KAAa,IAAgB,gBAAA,EAAA,GAAA,CAAI,CAAA,IAAI,gBAAA,EAAC,GAAD,CAAmB,CAAA;AAE5E,SACE,gBAAA,EAAC,GAAD;AAAA,IACE,gBAAgB,EAAK;AAAA,IACb,QAAA;AAAA,IACC,SAAA;AAAA,IACT,OAAO,EAAK;AAAA,cAEZ,gBAAA,EAAC,GAAD;AAAA,MAAO,SAAQ;AAAA,gBAAf,CACE,gBAAA,EAAC,GAAD,EAAsB,oBAAoB,EAAc,CAAA,GACxD,gBAAA,EAAC,GAAD,CAAqB,CAAA,CAChB;AAAA;EACD,CAAA;AAEZ"}
1
+ {"version":3,"file":"DebtDrawer.es.js","names":[],"sources":["../../../src/debts/components/DebtDrawer.tsx"],"sourcesContent":["import Stack from '@mui/material/Stack'\n\nimport { Drawer, useGlobalCopyStore } from '../../common'\nimport { useDebtsUiStore } from '../hooks/useDebtsUiStore'\n\nimport AccountDetailsHeader from '../../accounts/components/detailsdrawer/Accounts/AccountDetailsHeader'\nimport DebtDetailsChart from './debtsdrawer/DebtDetailsChart'\nimport DebtDetailsContent from './debtsdrawer/DebtDetailsContent'\n\ninterface DebtDrawerProps {\n isOpen: boolean\n onClose: () => void\n}\n\nconst DebtDrawer = ({ isOpen, onClose }: DebtDrawerProps) => {\n const { debts: copy } = useGlobalCopyStore()\n const { showError, showCompleted } = useDebtsUiStore()\n const headerChart = showError || showCompleted ? <></> : <DebtDetailsChart />\n\n return (\n <Drawer\n ariaLabelClose={copy.details_close_aria}\n isOpen={isOpen}\n onClose={onClose}\n title={copy.details_title}\n >\n <Stack bgcolor=\"background.default\">\n <AccountDetailsHeader customDetailsChart={headerChart} />\n <DebtDetailsContent />\n </Stack>\n </Drawer>\n )\n}\n\nexport default DebtDrawer\n"],"mappings":";;;;;;;;AAcA,IAAM,IAAA,CAAc,EAAE,QAAA,GAAQ,SAAA,EAAA,MAA+B;AAC3D,QAAM,EAAE,OAAO,EAAA,IAAS,EAAmB,GACrC,EAAE,WAAA,GAAW,eAAA,EAAA,IAAkB,EAAgB,GAC/C,IAAc,KAAa,IAAgB,gBAAA,EAAA,GAAA,CAAI,CAAA,IAAI,gBAAA,EAAC,GAAD,CAAmB,CAAA;AAE5E,SACE,gBAAA,EAAC,GAAD;AAAA,IACE,gBAAgB,EAAK;AAAA,IACb,QAAA;AAAA,IACC,SAAA;AAAA,IACT,OAAO,EAAK;AAAA,IAEZ,UAAA,gBAAA,EAAC,GAAD;AAAA,MAAO,SAAQ;AAAA,MAAf,UAAA,CACE,gBAAA,EAAC,GAAD,EAAsB,oBAAoB,EAAc,CAAA,GACxD,gBAAA,EAAC,GAAD,CAAqB,CAAA,CAChB;AAAA;EACD,CAAA;AAEZ"}
@@ -4,39 +4,39 @@ import { ANALYTICS_EVENTS as D } from "../../common/constants/Analytics.es.js";
4
4
  import { formatCurrency as v } from "../../core/utils/NumberFormatting.es.js";
5
5
  import { BASE_LINE_COLOR as S, adjustBrightness as w } from "../utils/DebtsChart.es.js";
6
6
  import "react";
7
- import { jsx as h } from "react/jsx-runtime";
7
+ import { jsx as d } from "react/jsx-runtime";
8
8
  import { useTheme as I } from "@mui/material/styles";
9
9
  import H from "@mui/material/Box";
10
10
  import { LineChart as R } from "@mui/x-charts/LineChart";
11
11
  var K = ({ sx: g, height: f = 500, width: y, debts: A, hoveredDebtGuid: l, onClickArea: T, onHoverArea: M }) => {
12
- const m = I(), { onEvent: x } = _(), c = A.filter((e) => !e.is_impossible), i = [...new Set(c.flatMap((e) => e.dataset.map((t) => new Date(t.x).getTime())))].sort((e, t) => e - t).map((e) => new Date(e)), s = c.map((e) => {
13
- const t = new Map(e.dataset.map((n) => [new Date(n.x).getTime(), n.y]));
14
- let a = t.get(i[0].getTime()) ?? 0;
15
- const r = i.map((n) => {
16
- const d = t.get(n.getTime()) ?? a;
17
- return a = d, {
18
- x: n,
19
- y: d
12
+ const m = I(), { onEvent: b } = _(), c = A.filter((t) => !t.is_impossible), o = [...new Set(c.flatMap((t) => t.dataset.map((e) => new Date(e.x).getTime())))].sort((t, e) => t - e).map((t) => new Date(t)), s = c.map((t) => {
13
+ const e = new Map(t.dataset.map((i) => [new Date(i.x).getTime(), i.y]));
14
+ let a = e.get(o[0].getTime()) ?? 0;
15
+ const n = o.map((i) => {
16
+ const h = e.get(i.getTime()) ?? a;
17
+ return a = h, {
18
+ x: i,
19
+ y: h
20
20
  };
21
21
  });
22
22
  return {
23
- ...e,
24
- dataset: r
23
+ ...t,
24
+ dataset: n
25
25
  };
26
- }), p = s.reduce((e, t) => e + (t.dataset[0]?.y ?? 0), 0), b = i.map((e, t) => {
27
- const a = t / (i.length - 1);
26
+ }), p = s.reduce((t, e) => t + (e.dataset[0]?.y ?? 0), 0), x = o.map((t, e) => {
27
+ const a = e / (o.length - 1);
28
28
  return {
29
- x: e,
29
+ x: t,
30
30
  y: p * (1 - a)
31
31
  };
32
- }), E = Math.ceil(p / 100) * 100, L = i, o = s.map((e, t) => {
33
- const a = w(S, 1 - t / s.length * 0.5);
32
+ }), E = Math.ceil(p / 100) * 100, L = o, r = s.map((t, e) => {
33
+ const a = 1 - e / s.length * 0.5, n = w(S, a);
34
34
  return {
35
- id: `debt-${t}`,
36
- guid: e.guid,
37
- label: e.name,
38
- data: e.dataset.map((r) => r.y),
39
- color: a,
35
+ id: `debt-${e}`,
36
+ guid: t.guid,
37
+ label: t.name,
38
+ data: t.dataset.map((i) => i.y),
39
+ color: n,
40
40
  curve: "linear",
41
41
  type: "line",
42
42
  area: !0,
@@ -44,10 +44,10 @@ var K = ({ sx: g, height: f = 500, width: y, debts: A, hoveredDebtGuid: l, onCli
44
44
  showMark: !1
45
45
  };
46
46
  });
47
- o.push({
47
+ r.push({
48
48
  id: "payoff-line",
49
49
  label: "Payoff Line",
50
- data: b.map((e) => e.y),
50
+ data: x.map((t) => t.y),
51
51
  color: m.palette.grey[700],
52
52
  curve: "linear",
53
53
  type: "line",
@@ -55,8 +55,8 @@ var K = ({ sx: g, height: f = 500, width: y, debts: A, hoveredDebtGuid: l, onCli
55
55
  showMark: !1,
56
56
  disableHighlight: !0
57
57
  });
58
- const u = (e) => o.findIndex((t) => t?.guid === e);
59
- return /* @__PURE__ */ h(H, {
58
+ const u = (t) => r.findIndex((e) => e?.guid === t);
59
+ return /* @__PURE__ */ d(H, {
60
60
  sx: {
61
61
  width: "100%",
62
62
  height: "100%",
@@ -67,7 +67,7 @@ var K = ({ sx: g, height: f = 500, width: y, debts: A, hoveredDebtGuid: l, onCli
67
67
  },
68
68
  "& .recharts-wrapper": { touchAction: "pan-y" }
69
69
  },
70
- children: /* @__PURE__ */ h(R, {
70
+ children: /* @__PURE__ */ d(R, {
71
71
  axisHighlight: { x: "none" },
72
72
  disableLineItemHighlight: !0,
73
73
  height: f,
@@ -78,16 +78,16 @@ var K = ({ sx: g, height: f = 500, width: y, debts: A, hoveredDebtGuid: l, onCli
78
78
  right: 72,
79
79
  top: 48
80
80
  },
81
- onAreaClick: (e, t) => {
81
+ onAreaClick: (t, e) => {
82
82
  T?.();
83
- const a = o.find((r) => r.id === t.seriesId);
84
- x(D.DEBTS_CLICK_CHART_AREA, { account_guid: a?.guid });
83
+ const a = r.find((n) => n.id === e.seriesId);
84
+ b(D.DEBTS_CLICK_CHART_AREA, { account_guid: a?.guid });
85
85
  },
86
- onHighlightChange: (e) => {
87
- const t = o.find((a) => a.id === e?.seriesId)?.guid;
88
- M?.(t ?? "");
86
+ onHighlightChange: (t) => {
87
+ const e = r.find((a) => a.id === t?.seriesId)?.guid;
88
+ M?.(e ?? "");
89
89
  },
90
- series: o,
90
+ series: r,
91
91
  skipAnimation: !0,
92
92
  slotProps: { tooltip: { trigger: "none" } },
93
93
  sx: {
@@ -114,16 +114,16 @@ var K = ({ sx: g, height: f = 500, width: y, debts: A, hoveredDebtGuid: l, onCli
114
114
  xAxis: [{
115
115
  data: L,
116
116
  disableTicks: !0,
117
- min: i[0],
117
+ min: o[0],
118
118
  scaleType: "time",
119
119
  tickLabelMinGap: 24,
120
- valueFormatter: (e) => k(e, C.MONTH_SHORT_YEAR)
120
+ valueFormatter: (t) => k(t, C.MONTH_SHORT_YEAR)
121
121
  }],
122
122
  yAxis: [{
123
123
  min: 0,
124
124
  max: E,
125
125
  disableTicks: !0,
126
- valueFormatter: (e) => v(e, "0a")
126
+ valueFormatter: (t) => v(t, "0a")
127
127
  }]
128
128
  })
129
129
  });
@@ -1 +1 @@
1
- {"version":3,"file":"DebtsChart.es.js","names":[],"sources":["../../../src/debts/components/DebtsChart.tsx"],"sourcesContent":["import React from 'react'\n\nimport Box from '@mui/material/Box'\nimport { useTheme } from '@mui/material/styles'\n\nimport type { LineSeriesType, HighlightItemData, LineItemIdentifier } from '@mui/x-charts'\nimport { LineChart } from '@mui/x-charts/LineChart'\n\nimport { useEvent, ANALYTICS_EVENTS } from '../../common'\nimport { DATE_FORMATS_INTL, formatDate } from '../../core/constants'\nimport { DebtChartData } from '../../core/utils/DebtUtils'\nimport { adjustBrightness, BASE_LINE_COLOR } from '../utils/DebtsChart'\nimport { formatCurrency } from '../../core/utils/NumberFormatting'\n\ninterface DebtsChartProps {\n sx?: any\n height?: number\n width?: number\n debts: DebtChartData[]\n hoveredDebtGuid?: string\n onClickArea?: () => void\n onHoverArea?: (debtGuid: string) => void\n}\n\ninterface DebtsChartSeries extends LineSeriesType {\n guid?: string | null\n}\n\nexport const DebtsChart: React.FC<DebtsChartProps> = ({\n sx,\n height = 500,\n width,\n debts,\n hoveredDebtGuid,\n onClickArea,\n onHoverArea,\n}) => {\n const theme = useTheme()\n const { onEvent } = useEvent()\n\n const possibleDebts = debts.filter((d) => !d.is_impossible)\n\n // Generate sorted array of unique dates\n const uniqueXValues = [\n ...new Set(\n possibleDebts.flatMap((debt) => debt.dataset.map((point) => new Date(point.x).getTime())),\n ),\n ]\n .sort((a, b) => a - b)\n .map((timestamp) => new Date(timestamp))\n\n // Normalize datasets with missing dates\n const normalizedDatasets = possibleDebts.map((debt) => {\n const datasetMap = new Map(debt.dataset.map((point) => [new Date(point.x).getTime(), point.y]))\n\n let lastY = datasetMap.get(uniqueXValues[0].getTime()) ?? 0\n const normalizedDataset = uniqueXValues.map((x) => {\n const y = datasetMap.get(x.getTime()) ?? lastY // Use last known value for missing points\n lastY = y\n return { x, y }\n })\n\n return { ...debt, dataset: normalizedDataset }\n })\n\n const initialTotalDebt = normalizedDatasets.reduce(\n (sum, debt) => sum + (debt.dataset[0]?.y ?? 0),\n 0,\n )\n\n const payoffLine = uniqueXValues.map((x, index) => {\n const linearRate = index / (uniqueXValues.length - 1)\n const y = initialTotalDebt * (1 - linearRate)\n return { x, y }\n })\n\n const yMax = Math.ceil(initialTotalDebt / 100) * 100\n const xData = uniqueXValues\n\n const series: DebtsChartSeries[] = normalizedDatasets.map((debt, index) => {\n const brightnessFactor = 1 - (index / normalizedDatasets.length) * 0.5\n const seriesColor = adjustBrightness(BASE_LINE_COLOR, brightnessFactor)\n\n return {\n id: `debt-${index}`,\n guid: debt.guid,\n label: debt.name,\n data: debt.dataset.map((point) => point.y),\n color: seriesColor,\n curve: 'linear',\n type: 'line',\n area: true,\n stack: 'total',\n showMark: false,\n }\n })\n\n series.push({\n id: 'payoff-line',\n label: 'Payoff Line',\n data: payoffLine.map((point) => point.y),\n color: theme.palette.grey[700],\n curve: 'linear',\n type: 'line',\n stack: undefined,\n showMark: false,\n disableHighlight: true,\n })\n\n const getIndexByGuid = (guid: string) => {\n return series.findIndex((s) => s?.guid === guid)\n }\n\n const onHighlightChange = (line: HighlightItemData | null) => {\n const highlightedGuid = series.find((s) => s.id === line?.seriesId)?.guid\n onHoverArea?.(highlightedGuid ?? '')\n }\n\n const onAreaClick = (\n _event: React.MouseEvent<SVGElement, MouseEvent>,\n lineItemIdentifier: LineItemIdentifier,\n ) => {\n onClickArea?.()\n const areaSeries = series.find((s) => s.id === lineItemIdentifier.seriesId)\n onEvent(ANALYTICS_EVENTS.DEBTS_CLICK_CHART_AREA, { account_guid: areaSeries?.guid })\n }\n\n return (\n <Box\n sx={{\n width: '100%',\n height: '100%',\n touchAction: 'pan-y',\n '& svg': {\n touchAction: 'pan-y',\n userSelect: 'none',\n },\n '& .recharts-wrapper': {\n touchAction: 'pan-y',\n },\n }}\n >\n <LineChart\n axisHighlight={{ x: 'none' }}\n disableLineItemHighlight={true}\n height={height}\n hideLegend={true}\n margin={{ bottom: 24, left: 32, right: 72, top: 48 }}\n onAreaClick={onAreaClick}\n onHighlightChange={onHighlightChange}\n series={series}\n skipAnimation={true}\n slotProps={{ tooltip: { trigger: 'none' } }}\n sx={{\n p: 4,\n '& .MuiBarLabel-root': {\n fontSize: 10,\n fontWeight: 600,\n },\n '& .MuiAreaElement-root': {\n opacity: 0.4,\n transition: 'opacity 0.3s ease',\n },\n '& .MuiAreaElement-root:hover': {\n opacity: 1,\n },\n '& .MuiLineElement-series-payoff-line': {\n strokeDasharray: '10 5',\n strokeWidth: 1,\n },\n [`& .MuiLineElement-series-debt-${getIndexByGuid(hoveredDebtGuid ?? '0')}`]: {\n opacity: 1,\n },\n [`& .MuiAreaElement-series-debt-${getIndexByGuid(hoveredDebtGuid ?? '0')}`]: {\n opacity: 1,\n },\n '& .MuiChartsAxis-tickLabel > tspan': {\n fontFamily: theme.typography.body2.fontFamily,\n },\n ...sx,\n }}\n width={width}\n xAxis={[\n {\n data: xData,\n disableTicks: true,\n min: uniqueXValues[0],\n scaleType: 'time',\n tickLabelMinGap: 24,\n valueFormatter: (value: Date) => formatDate(value, DATE_FORMATS_INTL.MONTH_SHORT_YEAR),\n },\n ]}\n yAxis={[\n {\n min: 0,\n max: yMax,\n disableTicks: true,\n valueFormatter: (value: number) => formatCurrency(value, '0a'),\n },\n ]}\n />\n </Box>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DebtsChart.es.js","names":[],"sources":["../../../src/debts/components/DebtsChart.tsx"],"sourcesContent":["import React from 'react'\n\nimport Box from '@mui/material/Box'\nimport { useTheme } from '@mui/material/styles'\n\nimport type { LineSeriesType, HighlightItemData, LineItemIdentifier } from '@mui/x-charts'\nimport { LineChart } from '@mui/x-charts/LineChart'\n\nimport { useEvent, ANALYTICS_EVENTS } from '../../common'\nimport { DATE_FORMATS_INTL, formatDate } from '../../core/constants'\nimport { DebtChartData } from '../../core/utils/DebtUtils'\nimport { adjustBrightness, BASE_LINE_COLOR } from '../utils/DebtsChart'\nimport { formatCurrency } from '../../core/utils/NumberFormatting'\n\ninterface DebtsChartProps {\n sx?: any\n height?: number\n width?: number\n debts: DebtChartData[]\n hoveredDebtGuid?: string\n onClickArea?: () => void\n onHoverArea?: (debtGuid: string) => void\n}\n\ninterface DebtsChartSeries extends LineSeriesType {\n guid?: string | null\n}\n\nexport const DebtsChart: React.FC<DebtsChartProps> = ({\n sx,\n height = 500,\n width,\n debts,\n hoveredDebtGuid,\n onClickArea,\n onHoverArea,\n}) => {\n const theme = useTheme()\n const { onEvent } = useEvent()\n\n const possibleDebts = debts.filter((d) => !d.is_impossible)\n\n // Generate sorted array of unique dates\n const uniqueXValues = [\n ...new Set(\n possibleDebts.flatMap((debt) => debt.dataset.map((point) => new Date(point.x).getTime())),\n ),\n ]\n .sort((a, b) => a - b)\n .map((timestamp) => new Date(timestamp))\n\n // Normalize datasets with missing dates\n const normalizedDatasets = possibleDebts.map((debt) => {\n const datasetMap = new Map(debt.dataset.map((point) => [new Date(point.x).getTime(), point.y]))\n\n let lastY = datasetMap.get(uniqueXValues[0].getTime()) ?? 0\n const normalizedDataset = uniqueXValues.map((x) => {\n const y = datasetMap.get(x.getTime()) ?? lastY // Use last known value for missing points\n lastY = y\n return { x, y }\n })\n\n return { ...debt, dataset: normalizedDataset }\n })\n\n const initialTotalDebt = normalizedDatasets.reduce(\n (sum, debt) => sum + (debt.dataset[0]?.y ?? 0),\n 0,\n )\n\n const payoffLine = uniqueXValues.map((x, index) => {\n const linearRate = index / (uniqueXValues.length - 1)\n const y = initialTotalDebt * (1 - linearRate)\n return { x, y }\n })\n\n const yMax = Math.ceil(initialTotalDebt / 100) * 100\n const xData = uniqueXValues\n\n const series: DebtsChartSeries[] = normalizedDatasets.map((debt, index) => {\n const brightnessFactor = 1 - (index / normalizedDatasets.length) * 0.5\n const seriesColor = adjustBrightness(BASE_LINE_COLOR, brightnessFactor)\n\n return {\n id: `debt-${index}`,\n guid: debt.guid,\n label: debt.name,\n data: debt.dataset.map((point) => point.y),\n color: seriesColor,\n curve: 'linear',\n type: 'line',\n area: true,\n stack: 'total',\n showMark: false,\n }\n })\n\n series.push({\n id: 'payoff-line',\n label: 'Payoff Line',\n data: payoffLine.map((point) => point.y),\n color: theme.palette.grey[700],\n curve: 'linear',\n type: 'line',\n stack: undefined,\n showMark: false,\n disableHighlight: true,\n })\n\n const getIndexByGuid = (guid: string) => {\n return series.findIndex((s) => s?.guid === guid)\n }\n\n const onHighlightChange = (line: HighlightItemData | null) => {\n const highlightedGuid = series.find((s) => s.id === line?.seriesId)?.guid\n onHoverArea?.(highlightedGuid ?? '')\n }\n\n const onAreaClick = (\n _event: React.MouseEvent<SVGElement, MouseEvent>,\n lineItemIdentifier: LineItemIdentifier,\n ) => {\n onClickArea?.()\n const areaSeries = series.find((s) => s.id === lineItemIdentifier.seriesId)\n onEvent(ANALYTICS_EVENTS.DEBTS_CLICK_CHART_AREA, { account_guid: areaSeries?.guid })\n }\n\n return (\n <Box\n sx={{\n width: '100%',\n height: '100%',\n touchAction: 'pan-y',\n '& svg': {\n touchAction: 'pan-y',\n userSelect: 'none',\n },\n '& .recharts-wrapper': {\n touchAction: 'pan-y',\n },\n }}\n >\n <LineChart\n axisHighlight={{ x: 'none' }}\n disableLineItemHighlight={true}\n height={height}\n hideLegend={true}\n margin={{ bottom: 24, left: 32, right: 72, top: 48 }}\n onAreaClick={onAreaClick}\n onHighlightChange={onHighlightChange}\n series={series}\n skipAnimation={true}\n slotProps={{ tooltip: { trigger: 'none' } }}\n sx={{\n p: 4,\n '& .MuiBarLabel-root': {\n fontSize: 10,\n fontWeight: 600,\n },\n '& .MuiAreaElement-root': {\n opacity: 0.4,\n transition: 'opacity 0.3s ease',\n },\n '& .MuiAreaElement-root:hover': {\n opacity: 1,\n },\n '& .MuiLineElement-series-payoff-line': {\n strokeDasharray: '10 5',\n strokeWidth: 1,\n },\n [`& .MuiLineElement-series-debt-${getIndexByGuid(hoveredDebtGuid ?? '0')}`]: {\n opacity: 1,\n },\n [`& .MuiAreaElement-series-debt-${getIndexByGuid(hoveredDebtGuid ?? '0')}`]: {\n opacity: 1,\n },\n '& .MuiChartsAxis-tickLabel > tspan': {\n fontFamily: theme.typography.body2.fontFamily,\n },\n ...sx,\n }}\n width={width}\n xAxis={[\n {\n data: xData,\n disableTicks: true,\n min: uniqueXValues[0],\n scaleType: 'time',\n tickLabelMinGap: 24,\n valueFormatter: (value: Date) => formatDate(value, DATE_FORMATS_INTL.MONTH_SHORT_YEAR),\n },\n ]}\n yAxis={[\n {\n min: 0,\n max: yMax,\n disableTicks: true,\n valueFormatter: (value: number) => formatCurrency(value, '0a'),\n },\n ]}\n />\n </Box>\n )\n}\n"],"mappings":"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"}