@mx-cartographer/experiences 4.0.13 → 4.0.14-alpha.JB1

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 (513) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/debts/components/SnowballCard.d.ts +3 -1
  3. package/dist/debts/components/SnowballDrawer.d.ts +9 -0
  4. package/dist/index.es.js +3905 -3522
  5. package/dist/index.es.js.map +1 -1
  6. package/package.json +23 -3
  7. package/src/accounts/AccountsMiniWidget.tsx +62 -0
  8. package/src/accounts/AccountsWidget.tsx +93 -0
  9. package/src/accounts/ConnectMiniWidget.tsx +36 -0
  10. package/src/accounts/__tests__/Accounts.test.tsx +561 -0
  11. package/src/accounts/api/AccountApi.ts +74 -0
  12. package/src/accounts/api/__mocks__/AccountApi.ts +46 -0
  13. package/src/accounts/components/AccountListItem.tsx +102 -0
  14. package/src/accounts/components/AccountsList.tsx +133 -0
  15. package/src/accounts/components/ConnectImage.tsx +314 -0
  16. package/src/accounts/components/ConnectMiniWidgetCard.tsx +41 -0
  17. package/src/accounts/components/ConnectStatus.tsx +44 -0
  18. package/src/accounts/components/ConnectionStatusIcons.tsx +26 -0
  19. package/src/accounts/components/ConnectionsDrawer.tsx +84 -0
  20. package/src/accounts/components/detailsdrawer/Accounts/AccountActions.tsx +177 -0
  21. package/src/accounts/components/detailsdrawer/Accounts/AccountActionsRow.tsx +33 -0
  22. package/src/accounts/components/detailsdrawer/Accounts/AccountConnection.tsx +139 -0
  23. package/src/accounts/components/detailsdrawer/Accounts/AccountDetailEdit.tsx +162 -0
  24. package/src/accounts/components/detailsdrawer/Accounts/AccountDetails.tsx +98 -0
  25. package/src/accounts/components/detailsdrawer/Accounts/AccountDetailsChart.tsx +63 -0
  26. package/src/accounts/components/detailsdrawer/Accounts/AccountDetailsContent.tsx +52 -0
  27. package/src/accounts/components/detailsdrawer/Accounts/AccountDetailsHeader.tsx +71 -0
  28. package/src/accounts/components/detailsdrawer/Accounts/AccountDetailsTab.tsx +25 -0
  29. package/src/accounts/components/detailsdrawer/Accounts/ConnectionErrorMessage.tsx +99 -0
  30. package/src/accounts/components/detailsdrawer/Transactions/TransactionsTab.tsx +51 -0
  31. package/src/accounts/constants/Accounts.ts +11 -0
  32. package/src/accounts/hooks/useGetMergeableAccounts.tsx +13 -0
  33. package/src/accounts/hooks/useUiStore.ts +12 -0
  34. package/src/accounts/index.ts +8 -0
  35. package/src/accounts/stores/AccountStore.ts +220 -0
  36. package/src/accounts/stores/UiStore.ts +18 -0
  37. package/src/accounts/stores/__tests__/AccountStore.test.ts +204 -0
  38. package/src/accounts/utils/AccountFields.tsx +248 -0
  39. package/src/accounts/utils/Accounts.ts +28 -0
  40. package/src/accounts/utils/__tests__/AccountFieldsUtils.test.tsx +215 -0
  41. package/src/accounts/utils/__tests__/AccountsUtils.test.tsx +104 -0
  42. package/src/accounts/utils/getConnectionMessages.tsx +198 -0
  43. package/src/accounts/utils/index.ts +1 -0
  44. package/src/budgets/BubbleBudgetsMiniWidget.tsx +57 -0
  45. package/src/budgets/BubbleBudgetsWidget.tsx +154 -0
  46. package/src/budgets/__tests__/BubbleBudgetsWidget.test.tsx +40 -0
  47. package/src/budgets/__tests__/BudgetList.test.tsx +38 -0
  48. package/src/budgets/__tests__/BudgetsStore.test.tsx +48 -0
  49. package/src/budgets/__tests__/Overview.test.tsx +38 -0
  50. package/src/budgets/api/BudgetsApi.ts +43 -0
  51. package/src/budgets/api/__mocks__/BudgetsApi.ts +7 -0
  52. package/src/budgets/components/AddBudgets.tsx +50 -0
  53. package/src/budgets/components/BubbleBudgets.tsx +73 -0
  54. package/src/budgets/components/BubbleChart.tsx +50 -0
  55. package/src/budgets/components/BudgetDetailsDrawer.tsx +134 -0
  56. package/src/budgets/components/BudgetList.tsx +50 -0
  57. package/src/budgets/components/Overview.tsx +156 -0
  58. package/src/budgets/components/ZeroState.tsx +23 -0
  59. package/src/budgets/components/addbudget/Header.tsx +59 -0
  60. package/src/budgets/components/addbudget/RecalculateBudgetRow.tsx +53 -0
  61. package/src/budgets/components/addbudget/RecalculateBudgets.tsx +69 -0
  62. package/src/budgets/components/addbudget/UnbudgetedRow.tsx +57 -0
  63. package/src/budgets/components/bubblechart/Bubble.tsx +148 -0
  64. package/src/budgets/components/bubblechart/Mercury.tsx +57 -0
  65. package/src/budgets/components/budgetdetails/AddSubBudget.tsx +111 -0
  66. package/src/budgets/components/budgetdetails/BudgetDetails.tsx +93 -0
  67. package/src/budgets/components/budgetdetails/Header.tsx +48 -0
  68. package/src/budgets/components/budgetdetails/SubBudgetList.tsx +148 -0
  69. package/src/budgets/components/budgetlist/BudgetRow.tsx +63 -0
  70. package/src/budgets/components/budgetlist/SubBudgetRow.tsx +64 -0
  71. package/src/budgets/components/budgetlist/SubBudgetZeroState.tsx +22 -0
  72. package/src/budgets/components/shared/BudgetAmount.tsx +54 -0
  73. package/src/budgets/index.ts +2 -0
  74. package/src/budgets/store/BudgetsStore.ts +183 -0
  75. package/src/budgets/utils/BubblesSVG.ts +142 -0
  76. package/src/budgets/utils/BudgetUtil.ts +140 -0
  77. package/src/cashflow/CashflowMiniWidget.tsx +25 -0
  78. package/src/cashflow/CashflowOnboarding.tsx +298 -0
  79. package/src/cashflow/CashflowWidget.tsx +111 -0
  80. package/src/cashflow/api/CashflowApi.ts +62 -0
  81. package/src/cashflow/api/__mocks__/CashflowApi.ts +15 -0
  82. package/src/cashflow/components/CashflowAmountHeading.tsx +46 -0
  83. package/src/cashflow/components/CashflowContent.tsx +63 -0
  84. package/src/cashflow/components/CashflowHeading.tsx +172 -0
  85. package/src/cashflow/components/CashflowWidgetContent.tsx +225 -0
  86. package/src/cashflow/components/DetailsExpenseHeader.tsx +47 -0
  87. package/src/cashflow/components/DetailsExpenseRow.tsx +46 -0
  88. package/src/cashflow/components/DetailsFooter.tsx +28 -0
  89. package/src/cashflow/components/DetailsTab.tsx +128 -0
  90. package/src/cashflow/components/RemainingCash.tsx +44 -0
  91. package/src/cashflow/components/SummaryTab.tsx +247 -0
  92. package/src/cashflow/components/onboarding/StepOne.tsx +90 -0
  93. package/src/cashflow/components/onboarding/StepTwo.tsx +23 -0
  94. package/src/cashflow/context/hooks.tsx +12 -0
  95. package/src/cashflow/images/cashflow-onboarding.png +0 -0
  96. package/src/cashflow/images/loading-animation.gif +0 -0
  97. package/src/cashflow/index.ts +5 -0
  98. package/src/cashflow/stores/CashflowStore.ts +26 -0
  99. package/src/cashflow/stores/UiStore.ts +48 -0
  100. package/src/cashflow/stores/__tests__/CashflowStore.test.ts +16 -0
  101. package/src/cashflow/util/Filters.ts +15 -0
  102. package/src/categories/components/CategoryList.tsx +64 -0
  103. package/src/categories/components/CategoryRow.tsx +68 -0
  104. package/src/categories/components/CategorySelector.tsx +80 -0
  105. package/src/categories/components/CategorySelectorDrawer.tsx +41 -0
  106. package/src/categories/components/CustomCategories/AddSubcategory.tsx +65 -0
  107. package/src/categories/components/CustomCategories/CustomCategoryModal.tsx +99 -0
  108. package/src/categories/components/CustomCategories/DeleteSubcategory.tsx +49 -0
  109. package/src/categories/components/CustomCategories/RenameSubcategory.tsx +48 -0
  110. package/src/categories/components/CustomCategories/index.ts +4 -0
  111. package/src/categories/components/SubcategoryList.tsx +47 -0
  112. package/src/categories/components/SubcategoryRow.tsx +123 -0
  113. package/src/categories/constants/Analytics.ts +89 -0
  114. package/src/categories/constants/OnClickEvents.ts +13 -0
  115. package/src/categories/context/hooks.ts +12 -0
  116. package/src/categories/index.ts +5 -0
  117. package/src/categories/stores/CategoryStore.ts +184 -0
  118. package/src/categories/stores/UiStore.ts +36 -0
  119. package/src/categories/stores/__tests__/CategoryStore.test.ts +54 -0
  120. package/src/categories/util/CategoryUtil.ts +136 -0
  121. package/src/common/api/AnalyticsApi.ts +49 -0
  122. package/src/common/api/BeatApi.ts +32 -0
  123. package/src/common/api/CategoryApi.ts +52 -0
  124. package/src/common/api/GlobalCopyApi.ts +17 -0
  125. package/src/common/api/LocalizedCopyApi.ts +21 -0
  126. package/src/common/api/NotificationApi.ts +40 -0
  127. package/src/common/api/ScheduledPaymentsApi.ts +37 -0
  128. package/src/common/api/UserApi.ts +23 -0
  129. package/src/common/api/WidgetApi.ts +15 -0
  130. package/src/common/api/__mocks__/BeatApi.ts +8 -0
  131. package/src/common/api/__mocks__/CategoryApi.ts +15 -0
  132. package/src/common/api/__mocks__/GlobalCopyApi.ts +7 -0
  133. package/src/common/api/__mocks__/NotificationApi.ts +11 -0
  134. package/src/common/api/__mocks__/ScheduledPaymentsApi.ts +7 -0
  135. package/src/common/api/__mocks__/UserApi.ts +9 -0
  136. package/src/common/api/__mocks__/WidgetApi.ts +11 -0
  137. package/src/common/api/index.ts +9 -0
  138. package/src/common/components/ConnectDrawer.tsx +87 -0
  139. package/src/common/components/CurrencyInput.tsx +147 -0
  140. package/src/common/components/CurrencyText.tsx +44 -0
  141. package/src/common/components/DataRow.tsx +52 -0
  142. package/src/common/components/IconBacking.tsx +41 -0
  143. package/src/common/components/InformationTooltip.tsx +52 -0
  144. package/src/common/components/ListItemWrapper.tsx +49 -0
  145. package/src/common/components/Loader.tsx +24 -0
  146. package/src/common/components/MiniWidgetContainer.tsx +64 -0
  147. package/src/common/components/ResponsiveButton.tsx +65 -0
  148. package/src/common/components/SearchBox.tsx +64 -0
  149. package/src/common/components/SelectionBox.tsx +64 -0
  150. package/src/common/components/SubheaderRow.tsx +22 -0
  151. package/src/common/components/TabContentContainer.tsx +28 -0
  152. package/src/common/components/WidgetContainer.tsx +239 -0
  153. package/src/common/components/accountfilter/AccountFilter.tsx +133 -0
  154. package/src/common/components/accountfilter/AccountFilterOptions.tsx +263 -0
  155. package/src/common/components/accountfilter/index.ts +1 -0
  156. package/src/common/components/barchart/Bar.tsx +123 -0
  157. package/src/common/components/barchart/BarChart.tsx +136 -0
  158. package/src/common/components/barchart/BarColumn.tsx +150 -0
  159. package/src/common/components/barchart/Legend.tsx +60 -0
  160. package/src/common/components/barchart/Util.ts +54 -0
  161. package/src/common/components/barchart/__tests__/BarChart.test.tsx +46 -0
  162. package/src/common/components/barchart/index.ts +1 -0
  163. package/src/common/components/calendar/Calendar.tsx +223 -0
  164. package/src/common/components/calendar/Day.tsx +127 -0
  165. package/src/common/components/calendar/Header.tsx +58 -0
  166. package/src/common/components/calendar/__tests__/Calendar.test.tsx +50 -0
  167. package/src/common/components/calendar/index.ts +1 -0
  168. package/src/common/components/calendar/upcomingActivity/CalendarIcons.tsx +40 -0
  169. package/src/common/components/charts/Donut.tsx +82 -0
  170. package/src/common/components/charts/LineChart.tsx +204 -0
  171. package/src/common/components/charts/StackedLineChart.tsx +292 -0
  172. package/src/common/components/charts/StatusBar.tsx +41 -0
  173. package/src/common/components/charts/index.ts +4 -0
  174. package/src/common/components/charts/linechart/CustomLegend.tsx +49 -0
  175. package/src/common/components/charts/linechart/CustomLine.tsx +31 -0
  176. package/src/common/components/charts/linechart/CustomMark.tsx +68 -0
  177. package/src/common/components/charts/stackedlinechart/CategoryIconLabel.tsx +29 -0
  178. package/src/common/components/charts/stackedlinechart/CustomAreaTooltip.tsx +115 -0
  179. package/src/common/components/charts/stackedlinechart/CustomLegend.tsx +73 -0
  180. package/src/common/components/charts/stackedlinechart/CustomPointTooltip.tsx +41 -0
  181. package/src/common/components/charts/stackedlinechart/utils.ts +13 -0
  182. package/src/common/components/daterangeselector/DateRangeSelector.tsx +383 -0
  183. package/src/common/components/daterangeselector/index.ts +1 -0
  184. package/src/common/components/dialog/Dialog.tsx +92 -0
  185. package/src/common/components/dialog/index.ts +1 -0
  186. package/src/common/components/donuts/MultiSegmentDonut.tsx +89 -0
  187. package/src/common/components/donuts/SingleSegmentDonut.tsx +75 -0
  188. package/src/common/components/donuts/index.ts +2 -0
  189. package/src/common/components/drawer/Drawer.tsx +97 -0
  190. package/src/common/components/drawer/Header.tsx +64 -0
  191. package/src/common/components/drawer/index.ts +1 -0
  192. package/src/common/components/index.ts +22 -0
  193. package/src/common/constants/Account.ts +30 -0
  194. package/src/common/constants/Analytics.ts +70 -0
  195. package/src/common/constants/ApiEndpoints.ts +30 -0
  196. package/src/common/constants/Category.ts +302 -0
  197. package/src/common/constants/Connect.ts +2 -0
  198. package/src/common/constants/DateFormats.ts +122 -0
  199. package/src/common/constants/Donut.ts +2 -0
  200. package/src/common/constants/Numbers.ts +6 -0
  201. package/src/common/constants/ScheduledPayment.ts +21 -0
  202. package/src/common/constants/Sizes.ts +7 -0
  203. package/src/common/constants/SpendingPlan.ts +17 -0
  204. package/src/common/constants/Table.ts +13 -0
  205. package/src/common/constants/index.ts +21 -0
  206. package/src/common/context/GlobalDataProvider.tsx +31 -0
  207. package/src/common/context/WidgetContainerProvider.tsx +24 -0
  208. package/src/common/context/__mocks__/GlobalDataProvider.tsx +25 -0
  209. package/src/common/context/hooks.tsx +57 -0
  210. package/src/common/context/index.ts +22 -0
  211. package/src/common/hooks/__tests__/useDimensions.test.tsx +190 -0
  212. package/src/common/hooks/index.ts +3 -0
  213. package/src/common/hooks/useCombineEvents.tsx +53 -0
  214. package/src/common/hooks/useDimensions.tsx +78 -0
  215. package/src/common/hooks/usePrevious.tsx +10 -0
  216. package/src/common/hooks/useScreenSize.tsx +15 -0
  217. package/src/common/index.ts +23 -0
  218. package/src/common/stores/ConnectStore.ts +26 -0
  219. package/src/common/stores/GlobalCopyStore.ts +36 -0
  220. package/src/common/stores/GlobalStore.ts +83 -0
  221. package/src/common/stores/GlobalUiStore.ts +66 -0
  222. package/src/common/stores/UserStore.ts +45 -0
  223. package/src/common/stores/__tests__/GlobalCopyStore.test.ts +23 -0
  224. package/src/common/stores/__tests__/GlobalStore.test.ts +24 -0
  225. package/src/common/stores/index.ts +3 -0
  226. package/src/common/types/Account.ts +406 -0
  227. package/src/common/types/Activity.ts +31 -0
  228. package/src/common/types/Analytics.ts +70 -0
  229. package/src/common/types/Beat.ts +71 -0
  230. package/src/common/types/Budget.ts +29 -0
  231. package/src/common/types/Cashflow.ts +110 -0
  232. package/src/common/types/Category.ts +68 -0
  233. package/src/common/types/Date.ts +2 -0
  234. package/src/common/types/Debt.ts +19 -0
  235. package/src/common/types/Expense.ts +20 -0
  236. package/src/common/types/Global.ts +13 -0
  237. package/src/common/types/GlobalCopy.ts +37 -0
  238. package/src/common/types/Goal.ts +59 -0
  239. package/src/common/types/Institution.ts +11 -0
  240. package/src/common/types/LocalizedContent.ts +9 -0
  241. package/src/common/types/Merchant.ts +6 -0
  242. package/src/common/types/Notification.ts +15 -0
  243. package/src/common/types/ScheduledPayment.ts +15 -0
  244. package/src/common/types/ScreenSize.tsx +4 -0
  245. package/src/common/types/SpendingPlan.ts +48 -0
  246. package/src/common/types/Transaction.ts +91 -0
  247. package/src/common/types/User.ts +20 -0
  248. package/src/common/types/Widgets.ts +11 -0
  249. package/src/common/types/index.ts +93 -0
  250. package/src/common/types/localization/AccountFilterCopy.ts +12 -0
  251. package/src/common/types/localization/AccountTypeCopy.ts +16 -0
  252. package/src/common/types/localization/AccountsCopy.ts +113 -0
  253. package/src/common/types/localization/BudgetsCopy.ts +52 -0
  254. package/src/common/types/localization/CashflowCopy.ts +77 -0
  255. package/src/common/types/localization/CategoryCopy.ts +18 -0
  256. package/src/common/types/localization/CommonCopy.ts +30 -0
  257. package/src/common/types/localization/ConnectCopy.ts +74 -0
  258. package/src/common/types/localization/CurrencyInputCopy.ts +6 -0
  259. package/src/common/types/localization/DateRangePickerCopy.ts +23 -0
  260. package/src/common/types/localization/GoalsCopy.ts +37 -0
  261. package/src/common/types/localization/InsightsFeedCopy.ts +26 -0
  262. package/src/common/types/localization/MicroInsightsCopy.ts +28 -0
  263. package/src/common/types/localization/NetWorthCopy.ts +14 -0
  264. package/src/common/types/localization/NotificationsCopy.ts +7 -0
  265. package/src/common/types/localization/RecurringCopy.ts +76 -0
  266. package/src/common/types/localization/SpendingCopy.ts +16 -0
  267. package/src/common/types/localization/TransactionsCopy.ts +81 -0
  268. package/src/common/types/localization/TrendsCopy.ts +10 -0
  269. package/src/common/types/localization/index.ts +19 -0
  270. package/src/common/utils/AccountFilter.ts +45 -0
  271. package/src/common/utils/Analytics.ts +51 -0
  272. package/src/common/utils/Categories.ts +75 -0
  273. package/src/common/utils/DateUtil.ts +67 -0
  274. package/src/common/utils/Fetch.ts +115 -0
  275. package/src/common/utils/Localization.ts +67 -0
  276. package/src/common/utils/NumberFormatting.ts +65 -0
  277. package/src/common/utils/__tests__/Fetch.test.tsx +34 -0
  278. package/src/common/utils/index.ts +18 -0
  279. package/src/dashboard/Dashboard.tsx +92 -0
  280. package/src/dashboard/Greeting.tsx +75 -0
  281. package/src/dashboard/__tests__/Dashboard.test.tsx +84 -0
  282. package/src/dashboard/constants/Dashboard.ts +4 -0
  283. package/src/dashboard/index.ts +3 -0
  284. package/src/dashboard/types/DashboardTypes.ts +9 -0
  285. package/src/debts/DebtsWidget.tsx +90 -0
  286. package/src/debts/components/DebtsChart.tsx +190 -0
  287. package/src/debts/components/DebtsTable.tsx +209 -0
  288. package/src/debts/components/SnowballCard.tsx +70 -0
  289. package/src/debts/components/SnowballDrawer.tsx +384 -0
  290. package/src/debts/components/debtstable/AccountCell.tsx +25 -0
  291. package/src/debts/components/debtstable/PriorityCell.tsx +46 -0
  292. package/src/debts/index.ts +4 -0
  293. package/src/debts/store/DebtsStore.ts +20 -0
  294. package/src/debts/utils/DebtStore.ts +75 -0
  295. package/src/debts/utils/DebtsWidget.ts +32 -0
  296. package/src/debts/utils/SnowballCard.tsx +48 -0
  297. package/src/goals/GoalsWidget.tsx +128 -0
  298. package/src/goals/api/GoalApi.ts +29 -0
  299. package/src/goals/components/GoalDetails.tsx +240 -0
  300. package/src/goals/components/GoalList.tsx +101 -0
  301. package/src/goals/components/GoalStatusCard.tsx +87 -0
  302. package/src/goals/components/TabTitle.tsx +21 -0
  303. package/src/goals/constants/CopyKeys.ts +29 -0
  304. package/src/goals/index.ts +2 -0
  305. package/src/goals/stores/GoalStore.ts +47 -0
  306. package/src/goals/util/GoalsUtil.ts +61 -0
  307. package/src/index.ts +17 -0
  308. package/src/insights/README.md +16 -0
  309. package/src/insights/contexts/ToastContext.tsx +62 -0
  310. package/src/insights/index.ts +5 -0
  311. package/src/insights/settings/SettingsDrawer.tsx +40 -0
  312. package/src/insights/settings/__tests__/SettingsDrawer.test.tsx +50 -0
  313. package/src/insights/settings/components/PulseSubheaderRow.tsx +34 -0
  314. package/src/insights/settings/components/SettingsItem.tsx +55 -0
  315. package/src/insights/settings/components/Toast.tsx +69 -0
  316. package/src/insights/settings/hiddeninsights/__tests__/HiddenInsightsDrawer.test.tsx +108 -0
  317. package/src/insights/settings/hiddeninsights/__tests__/SubCategoryDrawer.test.tsx +150 -0
  318. package/src/insights/settings/hiddeninsights/components/CategoryEmptyState.tsx +50 -0
  319. package/src/insights/settings/hiddeninsights/components/HiddenInsightsDrawer.tsx +222 -0
  320. package/src/insights/settings/hiddeninsights/components/HiddenInsightsDrawerWrapper.tsx +24 -0
  321. package/src/insights/settings/hiddeninsights/components/SubCategoryDrawer.tsx +256 -0
  322. package/src/insights/settings/hiddeninsights/images/no-insights.png +0 -0
  323. package/src/insights/settings/hiddeninsights/types/index.ts +74 -0
  324. package/src/insights/settings/manageaccounts/__tests__/AccountGroup.test.tsx +92 -0
  325. package/src/insights/settings/manageaccounts/__tests__/ManageAccountsDrawer.test.tsx +83 -0
  326. package/src/insights/settings/manageaccounts/components/AccountGroup.tsx +109 -0
  327. package/src/insights/settings/manageaccounts/components/ManageAccountsDrawer.tsx +63 -0
  328. package/src/insights/settings/manageaccounts/types/index.ts +13 -0
  329. package/src/insights/settings/types/index.ts +4 -0
  330. package/src/insights/store/BeatStore.ts +25 -0
  331. package/src/insights/utils/beatTemplateCategories.ts +103 -0
  332. package/src/merchants/api/MerchantApi.ts +33 -0
  333. package/src/merchants/components/MerchantLookup.tsx +117 -0
  334. package/src/merchants/index.ts +2 -0
  335. package/src/merchants/stores/MerchantStore.ts +42 -0
  336. package/src/microinsights/analytics.ts +31 -0
  337. package/src/microinsights/components/beatCard/BeatCard.tsx +124 -0
  338. package/src/microinsights/components/beaticons/BeatCategoryIcon.tsx +20 -0
  339. package/src/microinsights/components/beaticons/BeatIcon.tsx +45 -0
  340. package/src/microinsights/components/beaticons/BeatMerchantLogo.tsx +33 -0
  341. package/src/microinsights/components/beaticons/ChartFilledIcon.tsx +37 -0
  342. package/src/microinsights/components/beaticons/MonthlySpendComparisonIcon.tsx +30 -0
  343. package/src/microinsights/components/beaticons/ZeroStateIcon.tsx +558 -0
  344. package/src/microinsights/components/beaticons/index.tsx +7 -0
  345. package/src/microinsights/components/carouselheader/CarouselHeader.tsx +111 -0
  346. package/src/microinsights/components/insightsmicrowidget/InsightsMicroWidget.tsx +163 -0
  347. package/src/microinsights/components/microBeatCarousel/CarouselControls.tsx +99 -0
  348. package/src/microinsights/components/microBeatCarousel/MicroBeatCarousel.tsx +207 -0
  349. package/src/microinsights/components/microInsightCard/MicroInsightCard.tsx +173 -0
  350. package/src/microinsights/components/noRelevantInsightsCard/NoRelevantInsightsCard.tsx +89 -0
  351. package/src/microinsights/components/spinner/Spinner.tsx +21 -0
  352. package/src/microinsights/components/viewMoreMicroCard/ViewMoreMicroCard.tsx +101 -0
  353. package/src/microinsights/components/zeroStateCard/ZeroStateCard.tsx +62 -0
  354. package/src/microinsights/constants/Analytics.ts +192 -0
  355. package/src/microinsights/constants/App.ts +53 -0
  356. package/src/microinsights/constants/Insights.tsx +3 -0
  357. package/src/microinsights/constants/OnClickEvents.ts +3 -0
  358. package/src/microinsights/context/InsightsMicroWidgetDataProvider.tsx +24 -0
  359. package/src/microinsights/context/hooks.tsx +65 -0
  360. package/src/microinsights/index.ts +16 -0
  361. package/src/microinsights/interfaces.ts +28 -0
  362. package/src/microinsights/stores/AppStore.ts +34 -0
  363. package/src/microinsights/stores/CopyStore.ts +38 -0
  364. package/src/microinsights/stores/InsightsMicroWidgetStore.ts +61 -0
  365. package/src/microinsights/types/BeatUIComponent.ts +5 -0
  366. package/src/microinsights/utils/DataSeries.ts +20 -0
  367. package/src/networth/NetWorthWidget.tsx +171 -0
  368. package/src/networth/__tests__/AssetsLiabilitiesDetail.test.tsx +94 -0
  369. package/src/networth/__tests__/NetWorthChart.test.tsx +31 -0
  370. package/src/networth/__tests__/NetWorthList.test.tsx +33 -0
  371. package/src/networth/components/AssetsLiabilitiesDetail.tsx +146 -0
  372. package/src/networth/components/GainsLossesDetail.tsx +110 -0
  373. package/src/networth/components/NetWorthChange.tsx +51 -0
  374. package/src/networth/components/NetWorthChart.tsx +71 -0
  375. package/src/networth/components/NetWorthList.tsx +91 -0
  376. package/src/networth/components/NetWorthListItem.tsx +72 -0
  377. package/src/networth/components/NetWorthSummary.tsx +36 -0
  378. package/src/networth/index.ts +5 -0
  379. package/src/networth/stores/NetWorthStore.ts +99 -0
  380. package/src/networth/stores/__tests__/NetWorthStore.test.ts +32 -0
  381. package/src/networth/types/NetWorth.ts +59 -0
  382. package/src/networth/utils/NetWorthUtils.ts +177 -0
  383. package/src/networth/utils/__tests__/NetWorthUtils.test.ts +198 -0
  384. package/src/notifications/__tests__/NotificationList.test.tsx +67 -0
  385. package/src/notifications/components/DateRow.tsx +21 -0
  386. package/src/notifications/components/NotificationBadge.tsx +51 -0
  387. package/src/notifications/components/NotificationCard.tsx +63 -0
  388. package/src/notifications/components/NotificationList.tsx +65 -0
  389. package/src/notifications/constants/NotificationConstants.ts +104 -0
  390. package/src/notifications/index.ts +3 -0
  391. package/src/notifications/stores/NotificationStore.ts +62 -0
  392. package/src/notifications/utils/NotificationUtils.ts +21 -0
  393. package/src/recurringactivity/RecurringActivityMiniWidget.tsx +45 -0
  394. package/src/recurringactivity/RecurringActivityWidget.tsx +89 -0
  395. package/src/recurringactivity/__tests__/BuildActivities.test.ts +30 -0
  396. package/src/recurringactivity/__tests__/BuildNewActivity.test.ts +59 -0
  397. package/src/recurringactivity/__tests__/RecurringActivityWidget.test.tsx +33 -0
  398. package/src/recurringactivity/components/ActivityBadges.tsx +40 -0
  399. package/src/recurringactivity/components/ActivityDetails.tsx +196 -0
  400. package/src/recurringactivity/components/ActivityList.tsx +141 -0
  401. package/src/recurringactivity/components/ActivityRow.tsx +161 -0
  402. package/src/recurringactivity/components/ActivityStatus.tsx +82 -0
  403. package/src/recurringactivity/components/MiniWidgetContent.tsx +61 -0
  404. package/src/recurringactivity/components/RecurringActivity.tsx +165 -0
  405. package/src/recurringactivity/components/actions/FrequencyAction.tsx +130 -0
  406. package/src/recurringactivity/components/actions/PaymentDateAction.tsx +99 -0
  407. package/src/recurringactivity/components/activitycalendar/ActivityCalendar.tsx +100 -0
  408. package/src/recurringactivity/components/activitycalendar/ActivityDay.tsx +88 -0
  409. package/src/recurringactivity/components/activitycalendar/Legend.tsx +42 -0
  410. package/src/recurringactivity/components/shared/ActivitySettings.tsx +43 -0
  411. package/src/recurringactivity/components/shared/activitysettings/AddActivity.tsx +175 -0
  412. package/src/recurringactivity/components/shared/activitysettings/AddActivityDetails.tsx +148 -0
  413. package/src/recurringactivity/components/shared/activitysettings/ManageExpenses.tsx +84 -0
  414. package/src/recurringactivity/components/shared/activitysettings/ManageIncome.tsx +102 -0
  415. package/src/recurringactivity/components/shared/activitysettings/SelectTransaction.tsx +45 -0
  416. package/src/recurringactivity/index.ts +5 -0
  417. package/src/recurringactivity/stores/RecurringActivityStore.ts +312 -0
  418. package/src/recurringactivity/util/RecurringActivityUtils.ts +40 -0
  419. package/src/recurringactivity/util/buildActivities.ts +334 -0
  420. package/src/recurringactivity/util/buildNewActivity.ts +111 -0
  421. package/src/recurringactivity/util/getRecurrence.ts +50 -0
  422. package/src/recurringactivity/util/getStatus.ts +32 -0
  423. package/src/recurringactivity/util/updateActivity.ts +66 -0
  424. package/src/spending/SpendingMiniWidget.tsx +23 -0
  425. package/src/spending/SpendingWidget.tsx +71 -0
  426. package/src/spending/__tests__/MiniSpendingChart.test.tsx +43 -0
  427. package/src/spending/__tests__/SpendingData.test.ts +38 -0
  428. package/src/spending/__tests__/SpendingMiniWidget.test.tsx +49 -0
  429. package/src/spending/__tests__/SpendingWidget.test.tsx +49 -0
  430. package/src/spending/components/MiniSpendingChart.tsx +125 -0
  431. package/src/spending/components/Spending.tsx +175 -0
  432. package/src/spending/components/SpendingChart.tsx +74 -0
  433. package/src/spending/components/SpendingDonut.tsx +125 -0
  434. package/src/spending/components/SpendingLegend.tsx +41 -0
  435. package/src/spending/components/SpendingList.tsx +112 -0
  436. package/src/spending/components/SpendingTabLabel.tsx +25 -0
  437. package/src/spending/index.ts +2 -0
  438. package/src/spending/utils/SpendingData.ts +196 -0
  439. package/src/transactions/TransactionWidget.tsx +319 -0
  440. package/src/transactions/analytics.ts +12 -0
  441. package/src/transactions/api/TransactionApi.ts +204 -0
  442. package/src/transactions/api/__mocks__/TransactionApi.ts +20 -0
  443. package/src/transactions/components/shared/TransactionDetails.tsx +140 -0
  444. package/src/transactions/components/shared/TransactionList.tsx +124 -0
  445. package/src/transactions/components/shared/TransactionTable.tsx +123 -0
  446. package/src/transactions/components/shared/transactiondetails/Description.tsx +97 -0
  447. package/src/transactions/components/shared/transactiondetails/FlagTransaction.tsx +63 -0
  448. package/src/transactions/components/shared/transactiondetails/ManualTransactionDetails.tsx +148 -0
  449. package/src/transactions/components/shared/transactiondetails/TransactionAmountHeader.tsx +39 -0
  450. package/src/transactions/components/shared/transactiondetails/actions/CategoryAction.tsx +149 -0
  451. package/src/transactions/components/shared/transactiondetails/actions/DateAction.tsx +119 -0
  452. package/src/transactions/components/shared/transactiondetails/actions/DeleteAction.tsx +85 -0
  453. package/src/transactions/components/shared/transactiondetails/actions/DeleteLogoAction.tsx +88 -0
  454. package/src/transactions/components/shared/transactiondetails/actions/HideAction.tsx +126 -0
  455. package/src/transactions/components/shared/transactiondetails/actions/MemoAction.tsx +112 -0
  456. package/src/transactions/components/shared/transactiondetails/actions/SplitAction.tsx +234 -0
  457. package/src/transactions/components/shared/transactiondetails/actions/TagsAction.tsx +119 -0
  458. package/src/transactions/components/shared/transactiondetails/actions/index.ts +8 -0
  459. package/src/transactions/components/shared/transactionlist/DateRow.tsx +33 -0
  460. package/src/transactions/components/shared/transactionlist/TransactionRow.tsx +92 -0
  461. package/src/transactions/components/shared/transactionlist/ZeroState.tsx +36 -0
  462. package/src/transactions/components/shared/transactiontable/cells/AccountCell.tsx +12 -0
  463. package/src/transactions/components/shared/transactiontable/cells/AmountCell.tsx +35 -0
  464. package/src/transactions/components/shared/transactiontable/cells/CategoryCell.tsx +37 -0
  465. package/src/transactions/components/shared/transactiontable/cells/DateCell.tsx +17 -0
  466. package/src/transactions/components/shared/transactiontable/cells/FlagCell.tsx +43 -0
  467. package/src/transactions/components/shared/transactiontable/cells/HeaderCell.tsx +11 -0
  468. package/src/transactions/components/shared/transactiontable/cells/PayeeCell.tsx +21 -0
  469. package/src/transactions/components/shared/transactiontable/cells/index.ts +7 -0
  470. package/src/transactions/components/splitmanager/SplitManager.tsx +93 -0
  471. package/src/transactions/components/splitmanager/SplitRow.tsx +149 -0
  472. package/src/transactions/components/splitmanager/index.ts +1 -0
  473. package/src/transactions/components/tagmanager/Header.tsx +100 -0
  474. package/src/transactions/components/tagmanager/SearchBox.tsx +60 -0
  475. package/src/transactions/components/tagmanager/TagManager.tsx +51 -0
  476. package/src/transactions/components/tagmanager/TagRow.tsx +145 -0
  477. package/src/transactions/components/tagmanager/index.ts +1 -0
  478. package/src/transactions/components/transactionwidget/AddAccountModal.tsx +30 -0
  479. package/src/transactions/components/transactionwidget/actions/AddTransactionAction.tsx +74 -0
  480. package/src/transactions/components/transactionwidget/actions/EditCategoryAction.tsx +80 -0
  481. package/src/transactions/components/transactionwidget/actions/ExportCsvAction.tsx +32 -0
  482. package/src/transactions/constants/Actions.ts +28 -0
  483. package/src/transactions/constants/Analytics.ts +272 -0
  484. package/src/transactions/constants/OnClickEvents.ts +45 -0
  485. package/src/transactions/constants/Transaction.ts +32 -0
  486. package/src/transactions/constants/TransactionsTable.ts +26 -0
  487. package/src/transactions/context/hooks.tsx +12 -0
  488. package/src/transactions/index.ts +12 -0
  489. package/src/transactions/stores/TransactionStore.ts +327 -0
  490. package/src/transactions/stores/UiStore.ts +72 -0
  491. package/src/transactions/stores/__tests__/TransactionStore.test.ts +80 -0
  492. package/src/transactions/utils/Filters.ts +35 -0
  493. package/src/transactions/utils/Transactions.ts +22 -0
  494. package/src/transactions/utils/buildDetailedTransactions.ts +66 -0
  495. package/src/transactions/utils/exportTransactionsToCSV.ts +85 -0
  496. package/src/transactions/utils/sortAndFilterTransactions.ts +127 -0
  497. package/src/trends/TrendsFullWidget.tsx +286 -0
  498. package/src/trends/TrendsMiniWidget.tsx +49 -0
  499. package/src/trends/__tests__/TrendsFullWidget.test.tsx +45 -0
  500. package/src/trends/__tests__/TrendsMiniWidget.test.tsx +35 -0
  501. package/src/trends/components/SpendingChart.tsx +29 -0
  502. package/src/trends/components/TrendsChart.tsx +75 -0
  503. package/src/trends/components/TrendsDrawer.tsx +74 -0
  504. package/src/trends/components/TrendsTable.tsx +161 -0
  505. package/src/trends/components/__tests__/SpendingChart.test.tsx +37 -0
  506. package/src/trends/components/trendstable/AmountCell.tsx +14 -0
  507. package/src/trends/components/trendstable/CategoryCell.tsx +39 -0
  508. package/src/trends/components/trendstable/HeaderCell.tsx +8 -0
  509. package/src/trends/index.ts +2 -0
  510. package/src/trends/mocks.ts +423 -0
  511. package/src/trends/utils/SpendingData.ts +76 -0
  512. package/src/trends/utils/TrendsData.ts +127 -0
  513. package/src/trends/utils/shared.ts +39 -0
@@ -0,0 +1,423 @@
1
+ export const mockStackedDatasetsSequential = [
2
+ {
3
+ top_level_category_guid: 'category1',
4
+ category_guid: 'category1-sub1',
5
+ category_name: 'Category 1',
6
+ category_color: '#FF0000',
7
+ dataset: [
8
+ { x: new Date(2024, 0, 1), y: 100 },
9
+ { x: new Date(2024, 1, 1), y: 150 },
10
+ { x: new Date(2024, 2, 1), y: 200 },
11
+ { x: new Date(2024, 3, 1), y: 250 },
12
+ { x: new Date(2024, 4, 1), y: 300 },
13
+ { x: new Date(2024, 5, 1), y: 350 },
14
+ { x: new Date(2024, 6, 1), y: 400 },
15
+ { x: new Date(2024, 7, 1), y: 450 },
16
+ { x: new Date(2024, 8, 1), y: 500 },
17
+ { x: new Date(2024, 9, 1), y: 550 },
18
+ { x: new Date(2024, 10, 1), y: 600 },
19
+ { x: new Date(2024, 11, 1), y: 650 },
20
+ ],
21
+ },
22
+ {
23
+ top_level_category_guid: 'category2',
24
+ category_guid: 'category2-sub1',
25
+ category_name: 'Category 2',
26
+ category_color: '#00FF00',
27
+ dataset: [
28
+ { x: new Date(2024, 0, 1), y: 200 },
29
+ { x: new Date(2024, 1, 1), y: 250 },
30
+ { x: new Date(2024, 2, 1), y: 300 },
31
+ { x: new Date(2024, 3, 1), y: 350 },
32
+ { x: new Date(2024, 4, 1), y: 400 },
33
+ { x: new Date(2024, 5, 1), y: 450 },
34
+ { x: new Date(2024, 6, 1), y: 500 },
35
+ { x: new Date(2024, 7, 1), y: 550 },
36
+ { x: new Date(2024, 8, 1), y: 600 },
37
+ { x: new Date(2024, 9, 1), y: 650 },
38
+ { x: new Date(2024, 10, 1), y: 700 },
39
+ { x: new Date(2024, 11, 1), y: 750 },
40
+ ],
41
+ },
42
+ {
43
+ top_level_category_guid: 'category3',
44
+ category_guid: 'category3-sub1',
45
+ category_name: 'Category 3',
46
+ category_color: '#0000FF',
47
+ dataset: [
48
+ { x: new Date(2024, 0, 1), y: 300 },
49
+ { x: new Date(2024, 1, 1), y: 350 },
50
+ { x: new Date(2024, 2, 1), y: 400 },
51
+ { x: new Date(2024, 3, 1), y: 450 },
52
+ { x: new Date(2024, 4, 1), y: 500 },
53
+ { x: new Date(2024, 5, 1), y: 550 },
54
+ { x: new Date(2024, 6, 1), y: 600 },
55
+ { x: new Date(2024, 7, 1), y: 650 },
56
+ { x: new Date(2024, 8, 1), y: 700 },
57
+ { x: new Date(2024, 9, 1), y: 750 },
58
+ { x: new Date(2024, 10, 1), y: 800 },
59
+ { x: new Date(2024, 11, 1), y: 850 },
60
+ ],
61
+ },
62
+ ]
63
+
64
+ export const mockStackedDatasetsVarying = [
65
+ {
66
+ top_level_category_guid: 'category1',
67
+ category_guid: 'category1-sub1',
68
+ category_name: 'Category 1',
69
+ category_color: '#FF0000',
70
+ dataset: [
71
+ { x: new Date(2024, 0, 1), y: 100 },
72
+ { x: new Date(2024, 1, 1), y: 150 },
73
+ { x: new Date(2024, 2, 1), y: 200 },
74
+ { x: new Date(2024, 3, 1), y: 0 }, // Zero filled missing April
75
+ { x: new Date(2024, 4, 1), y: 300 },
76
+ { x: new Date(2024, 5, 1), y: 350 },
77
+ { x: new Date(2024, 6, 1), y: 0 }, // Zero filled missing July
78
+ { x: new Date(2024, 7, 1), y: 450 },
79
+ { x: new Date(2024, 8, 1), y: 0 }, // Zero filled missing September
80
+ { x: new Date(2024, 9, 1), y: 550 },
81
+ { x: new Date(2024, 10, 1), y: 0 }, // Zero filled missing November
82
+ { x: new Date(2024, 11, 1), y: 650 },
83
+ ],
84
+ },
85
+ {
86
+ top_level_category_guid: 'category2',
87
+ category_guid: 'category2-sub1',
88
+ category_name: 'Category 2',
89
+ category_color: '#00FF00',
90
+ dataset: [
91
+ { x: new Date(2024, 0, 1), y: 0 }, // Zero filled missing January
92
+ { x: new Date(2024, 1, 1), y: 250 },
93
+ { x: new Date(2024, 2, 1), y: 300 },
94
+ { x: new Date(2024, 3, 1), y: 350 },
95
+ { x: new Date(2024, 4, 1), y: 0 }, // Zero filled missing May
96
+ { x: new Date(2024, 5, 1), y: 450 },
97
+ { x: new Date(2024, 6, 1), y: 500 },
98
+ { x: new Date(2024, 7, 1), y: 0 }, // Zero filled missing August
99
+ { x: new Date(2024, 8, 1), y: 600 },
100
+ { x: new Date(2024, 9, 1), y: 0 }, // Zero filled missing October
101
+ { x: new Date(2024, 10, 1), y: 700 },
102
+ { x: new Date(2024, 11, 1), y: 0 }, // Zero filled missing December
103
+ ],
104
+ },
105
+ {
106
+ top_level_category_guid: 'category3',
107
+ category_guid: 'category3-sub1',
108
+ category_name: 'Category 3',
109
+ category_color: '#0000FF',
110
+ dataset: [
111
+ { x: new Date(2024, 0, 1), y: 300 },
112
+ { x: new Date(2024, 1, 1), y: 0 }, // Zero filled missing February
113
+ { x: new Date(2024, 2, 1), y: 400 },
114
+ { x: new Date(2024, 3, 1), y: 0 }, // Zero filled missing April
115
+ { x: new Date(2024, 4, 1), y: 500 },
116
+ { x: new Date(2024, 5, 1), y: 0 }, // Zero filled missing July
117
+ { x: new Date(2024, 6, 1), y: 600 },
118
+ { x: new Date(2024, 7, 1), y: 0 }, // Zero filled missing September
119
+ { x: new Date(2024, 8, 1), y: 700 },
120
+ { x: new Date(2024, 9, 1), y: 0 }, // Zero filled missing November
121
+ { x: new Date(2024, 10, 1), y: 800 },
122
+ { x: new Date(2024, 11, 1), y: 0 }, // Zero filled missing December
123
+ ],
124
+ },
125
+ ]
126
+
127
+ export const mockStackedDatasetsOverlapping = [
128
+ {
129
+ top_level_category_guid: 'category1',
130
+ category_guid: 'category1-sub1',
131
+ category_name: 'Category 1',
132
+ category_color: '#FF0000',
133
+ dataset: [
134
+ { x: new Date(2024, 0, 1), y: 300 },
135
+ { x: new Date(2024, 1, 1), y: 350 },
136
+ { x: new Date(2024, 2, 1), y: 400 },
137
+ { x: new Date(2024, 3, 1), y: 200 }, // Overlapping
138
+ { x: new Date(2024, 4, 1), y: 250 },
139
+ { x: new Date(2024, 5, 1), y: 500 }, // Overlapping
140
+ { x: new Date(2024, 6, 1), y: 550 },
141
+ { x: new Date(2024, 7, 1), y: 600 },
142
+ { x: new Date(2024, 8, 1), y: 700 },
143
+ { x: new Date(2024, 9, 1), y: 750 },
144
+ { x: new Date(2024, 10, 1), y: 800 },
145
+ { x: new Date(2024, 11, 1), y: 850 },
146
+ ],
147
+ },
148
+ {
149
+ top_level_category_guid: 'category2',
150
+ category_guid: 'category2-sub1',
151
+ category_name: 'Category 2',
152
+ category_color: '#00FF00',
153
+ dataset: [
154
+ { x: new Date(2024, 0, 1), y: 200 },
155
+ { x: new Date(2024, 1, 1), y: 250 },
156
+ { x: new Date(2024, 2, 1), y: 450 }, // Overlapping
157
+ { x: new Date(2024, 3, 1), y: 400 },
158
+ { x: new Date(2024, 4, 1), y: 500 },
159
+ { x: new Date(2024, 5, 1), y: 300 }, // Overlapping
160
+ { x: new Date(2024, 6, 1), y: 650 },
161
+ { x: new Date(2024, 7, 1), y: 700 },
162
+ { x: new Date(2024, 8, 1), y: 750 },
163
+ { x: new Date(2024, 9, 1), y: 800 },
164
+ { x: new Date(2024, 10, 1), y: 850 },
165
+ { x: new Date(2024, 11, 1), y: 900 },
166
+ ],
167
+ },
168
+ {
169
+ top_level_category_guid: 'category3',
170
+ category_guid: 'category3-sub1',
171
+ category_name: 'Category 3',
172
+ category_color: '#0000FF',
173
+ dataset: [
174
+ { x: new Date(2024, 0, 1), y: 100 },
175
+ { x: new Date(2024, 1, 1), y: 150 },
176
+ { x: new Date(2024, 2, 1), y: 200 },
177
+ { x: new Date(2024, 3, 1), y: 450 }, // Overlapping
178
+ { x: new Date(2024, 4, 1), y: 600 },
179
+ { x: new Date(2024, 5, 1), y: 700 },
180
+ { x: new Date(2024, 6, 1), y: 250 }, // Overlapping
181
+ { x: new Date(2024, 7, 1), y: 800 },
182
+ { x: new Date(2024, 8, 1), y: 850 },
183
+ { x: new Date(2024, 9, 1), y: 900 },
184
+ { x: new Date(2024, 10, 1), y: 950 },
185
+ { x: new Date(2024, 11, 1), y: 1000 },
186
+ ],
187
+ },
188
+ ]
189
+
190
+ export const mockStackedDatasetsRepeatValues = [
191
+ {
192
+ top_level_category_guid: 'category1',
193
+ category_guid: 'category1-sub1',
194
+ category_name: 'Category 1',
195
+ category_color: '#FF0000',
196
+ dataset: [
197
+ { x: new Date(2024, 0, 1), y: 300 },
198
+ { x: new Date(2024, 1, 1), y: 300 }, // Consecutive same y-value (January/February)
199
+ { x: new Date(2024, 2, 1), y: 350 },
200
+ { x: new Date(2024, 3, 1), y: 400 },
201
+ { x: new Date(2024, 4, 1), y: 350 }, // Non-consecutive same y-value (March/May)
202
+ { x: new Date(2024, 5, 1), y: 450 },
203
+ { x: new Date(2024, 6, 1), y: 500 },
204
+ { x: new Date(2024, 7, 1), y: 500 }, // Consecutive same y-value (July/August)
205
+ { x: new Date(2024, 8, 1), y: 550 },
206
+ { x: new Date(2024, 9, 1), y: 600 },
207
+ { x: new Date(2024, 10, 1), y: 550 }, // Non-consecutive same y-value (October/November)
208
+ { x: new Date(2024, 11, 1), y: 650 },
209
+ ],
210
+ },
211
+ {
212
+ top_level_category_guid: 'category2',
213
+ category_guid: 'category2-sub1',
214
+ category_name: 'Category 2',
215
+ category_color: '#00FF00',
216
+ dataset: [
217
+ { x: new Date(2024, 0, 1), y: 250 },
218
+ { x: new Date(2024, 1, 1), y: 300 },
219
+ { x: new Date(2024, 2, 1), y: 300 }, // Consecutive same y-value (February/March)
220
+ { x: new Date(2024, 3, 1), y: 350 },
221
+ { x: new Date(2024, 4, 1), y: 400 },
222
+ { x: new Date(2024, 5, 1), y: 400 }, // Consecutive same y-value (May/June)
223
+ { x: new Date(2024, 6, 1), y: 450 },
224
+ { x: new Date(2024, 7, 1), y: 500 },
225
+ { x: new Date(2024, 8, 1), y: 500 }, // Non-consecutive same y-value (August/September)
226
+ { x: new Date(2024, 9, 1), y: 550 },
227
+ { x: new Date(2024, 10, 1), y: 600 },
228
+ { x: new Date(2024, 11, 1), y: 550 }, // Non-consecutive same y-value (October/December)
229
+ ],
230
+ },
231
+ {
232
+ top_level_category_guid: 'category3',
233
+ category_guid: 'category3-sub1',
234
+ category_name: 'Category 3',
235
+ category_color: '#0000FF',
236
+ dataset: [
237
+ { x: new Date(2024, 0, 1), y: 100 },
238
+ { x: new Date(2024, 1, 1), y: 150 },
239
+ { x: new Date(2024, 2, 1), y: 150 }, // Consecutive same y-value (February/March)
240
+ { x: new Date(2024, 3, 1), y: 200 },
241
+ { x: new Date(2024, 4, 1), y: 250 },
242
+ { x: new Date(2024, 5, 1), y: 250 }, // Consecutive same y-value (May/June)
243
+ { x: new Date(2024, 6, 1), y: 300 },
244
+ { x: new Date(2024, 7, 1), y: 350 },
245
+ { x: new Date(2024, 8, 1), y: 350 }, // Non-consecutive same y-value (July/September)
246
+ { x: new Date(2024, 9, 1), y: 400 },
247
+ { x: new Date(2024, 10, 1), y: 450 },
248
+ { x: new Date(2024, 11, 1), y: 450 }, // Non-consecutive same y-value (October/December)
249
+ ],
250
+ },
251
+ ]
252
+
253
+ export const mockUnstackedDatasetsSequential = [
254
+ {
255
+ top_level_category_guid: 'income1',
256
+ category_guid: 'income1-sub1',
257
+ category_name: 'Income 1',
258
+ category_color: '#FFA500',
259
+ dataset: [
260
+ { x: new Date(2024, 0, 1), y: 500 },
261
+ { x: new Date(2024, 1, 1), y: 550 },
262
+ { x: new Date(2024, 2, 1), y: 600 },
263
+ { x: new Date(2024, 3, 1), y: 650 },
264
+ { x: new Date(2024, 4, 1), y: 700 },
265
+ { x: new Date(2024, 5, 1), y: 750 },
266
+ { x: new Date(2024, 6, 1), y: 800 },
267
+ { x: new Date(2024, 7, 1), y: 850 },
268
+ { x: new Date(2024, 8, 1), y: 900 },
269
+ { x: new Date(2024, 9, 1), y: 950 },
270
+ { x: new Date(2024, 10, 1), y: 1000 },
271
+ { x: new Date(2024, 11, 1), y: 1050 },
272
+ ],
273
+ },
274
+ {
275
+ top_level_category_guid: 'income2',
276
+ category_guid: 'income2-sub1',
277
+ category_name: 'Income 2',
278
+ category_color: '#800080',
279
+ dataset: [
280
+ { x: new Date(2024, 0, 1), y: 400 },
281
+ { x: new Date(2024, 1, 1), y: 450 },
282
+ { x: new Date(2024, 2, 1), y: 500 },
283
+ { x: new Date(2024, 3, 1), y: 550 },
284
+ { x: new Date(2024, 4, 1), y: 600 },
285
+ { x: new Date(2024, 5, 1), y: 650 },
286
+ { x: new Date(2024, 6, 1), y: 700 },
287
+ { x: new Date(2024, 7, 1), y: 750 },
288
+ { x: new Date(2024, 8, 1), y: 800 },
289
+ { x: new Date(2024, 9, 1), y: 850 },
290
+ { x: new Date(2024, 10, 1), y: 900 },
291
+ { x: new Date(2024, 11, 1), y: 950 },
292
+ ],
293
+ },
294
+ ]
295
+
296
+ export const mockUnstackedDatasetsVarying = [
297
+ {
298
+ top_level_category_guid: 'income1',
299
+ category_guid: 'income1-sub1',
300
+ category_name: 'Income 1',
301
+ category_color: '#FFA500',
302
+ dataset: [
303
+ { x: new Date(2024, 0, 1), y: 500 },
304
+ { x: new Date(2024, 1, 1), y: 0 }, // Zero filled missing February
305
+ { x: new Date(2024, 2, 1), y: 600 },
306
+ { x: new Date(2024, 3, 1), y: 650 },
307
+ { x: new Date(2024, 4, 1), y: 0 }, // Zero filled missing May
308
+ { x: new Date(2024, 5, 1), y: 750 },
309
+ { x: new Date(2024, 6, 1), y: 800 },
310
+ { x: new Date(2024, 7, 1), y: 0 }, // Zero filled missing August
311
+ { x: new Date(2024, 8, 1), y: 0 }, // Zero filled missing September
312
+ { x: new Date(2024, 9, 1), y: 950 },
313
+ { x: new Date(2024, 10, 1), y: 0 }, // Zero filled missing November
314
+ { x: new Date(2024, 11, 1), y: 1050 },
315
+ ],
316
+ },
317
+ {
318
+ top_level_category_guid: 'income2',
319
+ category_guid: 'income2-sub1',
320
+ category_name: 'Income 2',
321
+ category_color: '#800080',
322
+ dataset: [
323
+ { x: new Date(2024, 0, 1), y: 0 }, // Zero filled missing January
324
+ { x: new Date(2024, 1, 1), y: 450 },
325
+ { x: new Date(2024, 2, 1), y: 500 },
326
+ { x: new Date(2024, 3, 1), y: 550 },
327
+ { x: new Date(2024, 4, 1), y: 0 }, // Zero filled missing May
328
+ { x: new Date(2024, 5, 1), y: 650 },
329
+ { x: new Date(2024, 6, 1), y: 700 },
330
+ { x: new Date(2024, 7, 1), y: 0 }, // Zero filled missing August
331
+ { x: new Date(2024, 8, 1), y: 0 }, // Zero filled missing September
332
+ { x: new Date(2024, 9, 1), y: 850 },
333
+ { x: new Date(2024, 10, 1), y: 0 }, // Zero filled missing November
334
+ { x: new Date(2024, 11, 1), y: 950 },
335
+ ],
336
+ },
337
+ ]
338
+
339
+ export const mockUnstackedDatasetsOverlapping = [
340
+ {
341
+ top_level_category_guid: 'income1',
342
+ category_guid: 'income1-sub1',
343
+ category_name: 'Income 1',
344
+ category_color: '#FFA500',
345
+ dataset: [
346
+ { x: new Date(2024, 0, 1), y: 500 },
347
+ { x: new Date(2024, 1, 1), y: 600 },
348
+ { x: new Date(2024, 2, 1), y: 550 }, // Overlapping
349
+ { x: new Date(2024, 3, 1), y: 650 },
350
+ { x: new Date(2024, 4, 1), y: 750 },
351
+ { x: new Date(2024, 5, 1), y: 800 },
352
+ { x: new Date(2024, 6, 1), y: 900 },
353
+ { x: new Date(2024, 7, 1), y: 700 }, // Overlapping
354
+ { x: new Date(2024, 8, 1), y: 1000 },
355
+ { x: new Date(2024, 9, 1), y: 1050 },
356
+ { x: new Date(2024, 10, 1), y: 1100 },
357
+ { x: new Date(2024, 11, 1), y: 1200 },
358
+ ],
359
+ },
360
+ {
361
+ top_level_category_guid: 'income2',
362
+ category_guid: 'income2-sub1',
363
+ category_name: 'Income 2',
364
+ category_color: '#800080',
365
+ dataset: [
366
+ { x: new Date(2024, 0, 1), y: 400 },
367
+ { x: new Date(2024, 1, 1), y: 500 },
368
+ { x: new Date(2024, 2, 1), y: 450 }, // Overlapping
369
+ { x: new Date(2024, 3, 1), y: 550 },
370
+ { x: new Date(2024, 4, 1), y: 650 },
371
+ { x: new Date(2024, 5, 1), y: 600 }, // Overlapping
372
+ { x: new Date(2024, 6, 1), y: 800 },
373
+ { x: new Date(2024, 7, 1), y: 900 },
374
+ { x: new Date(2024, 8, 1), y: 850 }, // Overlapping
375
+ { x: new Date(2024, 9, 1), y: 1000 },
376
+ { x: new Date(2024, 10, 1), y: 1100 },
377
+ { x: new Date(2024, 11, 1), y: 1150 },
378
+ ],
379
+ },
380
+ ]
381
+
382
+ export const mockUnstackedDatasetsRepeatValues = [
383
+ {
384
+ top_level_category_guid: 'income1',
385
+ category_guid: 'income1-sub1',
386
+ category_name: 'Income 1',
387
+ category_color: '#FFA500',
388
+ dataset: [
389
+ { x: new Date(2024, 0, 1), y: 500 },
390
+ { x: new Date(2024, 1, 1), y: 500 }, // Consecutive same y-value (January/February)
391
+ { x: new Date(2024, 2, 1), y: 550 },
392
+ { x: new Date(2024, 3, 1), y: 600 },
393
+ { x: new Date(2024, 4, 1), y: 550 }, // Non-consecutive same y-value (March/May)
394
+ { x: new Date(2024, 5, 1), y: 650 },
395
+ { x: new Date(2024, 6, 1), y: 700 },
396
+ { x: new Date(2024, 7, 1), y: 700 }, // Consecutive same y-value (July/August)
397
+ { x: new Date(2024, 8, 1), y: 750 },
398
+ { x: new Date(2024, 9, 1), y: 800 },
399
+ { x: new Date(2024, 10, 1), y: 750 }, // Non-consecutive same y-value (October/November)
400
+ { x: new Date(2024, 11, 1), y: 850 },
401
+ ],
402
+ },
403
+ {
404
+ top_level_category_guid: 'income2',
405
+ category_guid: 'income2-sub1',
406
+ category_name: 'Income 2',
407
+ category_color: '#800080',
408
+ dataset: [
409
+ { x: new Date(2024, 0, 1), y: 400 },
410
+ { x: new Date(2024, 1, 1), y: 450 },
411
+ { x: new Date(2024, 2, 1), y: 450 }, // Consecutive same y-value (February/March)
412
+ { x: new Date(2024, 3, 1), y: 500 },
413
+ { x: new Date(2024, 4, 1), y: 550 },
414
+ { x: new Date(2024, 5, 1), y: 550 }, // Consecutive same y-value (May/June)
415
+ { x: new Date(2024, 6, 1), y: 600 },
416
+ { x: new Date(2024, 7, 1), y: 650 },
417
+ { x: new Date(2024, 8, 1), y: 650 }, // Non-consecutive same y-value (August/September)
418
+ { x: new Date(2024, 9, 1), y: 700 },
419
+ { x: new Date(2024, 10, 1), y: 750 },
420
+ { x: new Date(2024, 11, 1), y: 750 }, // Non-consecutive same y-value (November/December)
421
+ ],
422
+ },
423
+ ]
@@ -0,0 +1,76 @@
1
+ import { addMonths } from 'date-fns/addMonths'
2
+ import { isBefore } from 'date-fns/isBefore'
3
+ import { startOfMonth } from 'date-fns/startOfMonth'
4
+ import { subMonths } from 'date-fns/subMonths'
5
+ import { endOfMonth } from 'date-fns/endOfMonth'
6
+
7
+ import { CategoryGuids, DATE_FORMATS_INTL, formatDate, MonthlyCategoryTotals } from '../../common'
8
+ import { isIncome, isPayment, isSpend } from './shared'
9
+
10
+ type DateRange = {
11
+ start: Date
12
+ end: Date
13
+ }
14
+
15
+ export const getMonthlyTotals = (totals: MonthlyCategoryTotals[], range?: DateRange) => {
16
+ const data: { x: string; y: number }[] = []
17
+ let startDate = startOfMonth(range?.start ?? subMonths(new Date(), 5))
18
+ const endDate = range?.end ?? new Date()
19
+
20
+ while (isBefore(startDate, endDate)) {
21
+ // Add total amount for each month
22
+ data.push({
23
+ x: formatDate(startDate, DATE_FORMATS_INTL.MONTH_SHORT),
24
+ y: totals
25
+ .filter((t) => t.year === startDate.getFullYear() && t.month === startDate.getMonth() + 1)
26
+ .reduce((total, item) => total + item.total, 0),
27
+ })
28
+ startDate = addMonths(startDate, 1)
29
+ }
30
+
31
+ return data
32
+ }
33
+
34
+ export const getIncomeTotals = (totals: MonthlyCategoryTotals[], range?: DateRange) => {
35
+ const incomeTotals = totals.filter(isIncome)
36
+ // Income totals are negative values, but we want to display them as positive
37
+ return getMonthlyTotals(incomeTotals, range).map((t) => ({ ...t, y: Math.abs(t.y) }))
38
+ }
39
+
40
+ export const getPaymentTotals = (totals: MonthlyCategoryTotals[], range?: DateRange) => {
41
+ const paymentTotals = totals.filter(isPayment)
42
+ // Payment totals are negative values, but we want to display them as positive
43
+ return getMonthlyTotals(paymentTotals, range).map((t) => ({ ...t, y: Math.abs(t.y) }))
44
+ }
45
+
46
+ export const getSpendingTotals = (totals: MonthlyCategoryTotals[], range?: DateRange) => {
47
+ const spendingTotals = totals.filter(isSpend)
48
+ return getMonthlyTotals(spendingTotals, range)
49
+ }
50
+
51
+ export const getSpendingData = (totals: MonthlyCategoryTotals[]) => {
52
+ const data: { x: string; y: number }[] = []
53
+
54
+ // Filter out income and transfers
55
+ const filteredTotals = totals.filter(
56
+ (t) =>
57
+ t.top_level_category_guid !== CategoryGuids.INCOME &&
58
+ t.top_level_category_guid !== CategoryGuids.TRANSFER &&
59
+ t.total > 0,
60
+ )
61
+
62
+ let startDate = startOfMonth(subMonths(new Date(), 5))
63
+ const endDate = endOfMonth(new Date())
64
+ while (isBefore(startDate, endDate)) {
65
+ // Add total amount for each month
66
+ data.push({
67
+ x: formatDate(startDate, DATE_FORMATS_INTL.MONTH_SHORT),
68
+ y: filteredTotals
69
+ .filter((t) => t.year === startDate.getFullYear() && t.month === startDate.getMonth() + 1)
70
+ .reduce((total, item) => total + item.total, 0),
71
+ })
72
+ startDate = addMonths(startDate, 1)
73
+ }
74
+
75
+ return data
76
+ }
@@ -0,0 +1,127 @@
1
+ import { GridComparatorFn } from '@mui/x-data-grid-pro'
2
+
3
+ import { CategoryColors, CategoryGuidToName, MonthlyCategoryTotals } from '../../common'
4
+
5
+ type DataPoint = { x: Date; y: number }
6
+ type Dataset = DataPoint[]
7
+
8
+ type CategoryTotalData = {
9
+ top_level_category_guid: string
10
+ category_guid: string
11
+ amount: number
12
+ year_month: number // e.g. 202409
13
+ }
14
+
15
+ type GroupedCategoryTotalData = {
16
+ [categoryGuid: string]: CategoryTotalData[]
17
+ }
18
+
19
+ export interface StackedLineChartData {
20
+ top_level_category_guid: string
21
+ category_guid: string
22
+ category_name: string
23
+ category_color: string
24
+ dataset: Dataset
25
+ }
26
+
27
+ const getCategoryColor = (categoryGuid: string): string => {
28
+ return CategoryColors[categoryGuid] ?? CategoryColors.default
29
+ }
30
+
31
+ const getCategoryName = (categoryGuid: string): string => {
32
+ return CategoryGuidToName[categoryGuid]
33
+ }
34
+
35
+ function createYearMonthRange(start: Date, end: Date): number[] {
36
+ const result = []
37
+ const current = new Date(start)
38
+
39
+ while (current <= end) {
40
+ const year = current.getFullYear()
41
+ const month = String(current.getMonth() + 1).padStart(2, '0')
42
+ result.push(Number(`${year}${month}`))
43
+ current.setMonth(current.getMonth() + 1)
44
+ }
45
+
46
+ return result
47
+ }
48
+
49
+ const createGroupedCategoryTotals = (totals: MonthlyCategoryTotals[]): GroupedCategoryTotalData => {
50
+ const groupedTotals = totals.reduce((result, item) => {
51
+ const totalData: CategoryTotalData = {
52
+ top_level_category_guid: item.top_level_category_guid,
53
+ category_guid: item.category_guid,
54
+ amount: item.total,
55
+ year_month: item.year_month,
56
+ }
57
+
58
+ const { top_level_category_guid, category_guid } = totalData
59
+
60
+ // Ensure category bucket exists
61
+ if (!result[category_guid]) {
62
+ result[category_guid] = []
63
+ }
64
+ result[category_guid].push(totalData)
65
+
66
+ // Ensure top-level category bucket exists (if different than category)
67
+ if (top_level_category_guid !== category_guid) {
68
+ if (!result[top_level_category_guid]) {
69
+ result[top_level_category_guid] = []
70
+ }
71
+ result[top_level_category_guid].push(totalData)
72
+ }
73
+
74
+ return result
75
+ }, {} as GroupedCategoryTotalData)
76
+
77
+ return groupedTotals
78
+ }
79
+
80
+ export const getStackedLineChartData = (
81
+ totals: MonthlyCategoryTotals[],
82
+ start: Date,
83
+ end: Date,
84
+ ): StackedLineChartData[] => {
85
+ const groupedTotals = createGroupedCategoryTotals(totals)
86
+ const yearMonths = createYearMonthRange(start, end)
87
+
88
+ const chartData = Object.entries(groupedTotals).map(([categoryGuid, totals]) => {
89
+ const topLevelCategoryGuid = totals[0].top_level_category_guid
90
+ // Build dataset for current category
91
+ const dataset: Dataset = yearMonths
92
+ // Build chart coordinates and fill missing totals with 0
93
+ .map((yearMonth) => {
94
+ // Sum category totals for same month
95
+ // (totals with same top_level_category_guid but different category_guid)
96
+ // And fill missing totals with 0
97
+ // (necessary for StackedLineChart lines to be smooth)
98
+ const sumTotal = totals
99
+ .filter((total) => total.year_month === yearMonth)
100
+ .reduce((sum, total) => sum + Math.abs(total.amount), 0)
101
+
102
+ const year = Number(String(yearMonth).slice(0, 4))
103
+ const month = Number(String(yearMonth).slice(4))
104
+ const date = new Date(year, month - 1)
105
+
106
+ return { x: date, y: sumTotal }
107
+ })
108
+ .sort((a, b) => a.x.getTime() - b.x.getTime())
109
+
110
+ return {
111
+ top_level_category_guid: topLevelCategoryGuid,
112
+ category_guid: categoryGuid,
113
+ category_name: getCategoryName(categoryGuid),
114
+ category_color: getCategoryColor(topLevelCategoryGuid),
115
+ dataset: dataset,
116
+ }
117
+ })
118
+
119
+ return chartData
120
+ }
121
+
122
+ export const amountComparator: GridComparatorFn<string | number> = (v1, v2) => {
123
+ const num1 = typeof v1 === 'string' ? parseFloat(v1.replace(/[^0-9.-]+/g, '')) : v1
124
+ const num2 = typeof v2 === 'string' ? parseFloat(v2.replace(/[^0-9.-]+/g, '')) : v2
125
+
126
+ return (num1 || 0) - (num2 || 0)
127
+ }
@@ -0,0 +1,39 @@
1
+ import { CategoryGuids, MonthlyCategoryTotals, PaymentCategories } from '../../common'
2
+ import { StackedLineChartData } from './TrendsData'
3
+
4
+ type TotalsData = MonthlyCategoryTotals | StackedLineChartData
5
+
6
+ export const isIncome = (totals: TotalsData) => {
7
+ return (
8
+ totals.top_level_category_guid === CategoryGuids.INCOME ||
9
+ totals.category_guid === CategoryGuids.INCOME
10
+ )
11
+ }
12
+
13
+ export const isExpense = (totals: TotalsData) => {
14
+ return !isIncome(totals) && !isTransfer(totals)
15
+ }
16
+
17
+ export const isPayment = (totals: TotalsData) => {
18
+ return (
19
+ PaymentCategories.includes(totals.top_level_category_guid) ||
20
+ PaymentCategories.includes(totals.category_guid)
21
+ )
22
+ }
23
+
24
+ export const isTransfer = (totals: TotalsData) => {
25
+ return (
26
+ totals.top_level_category_guid === CategoryGuids.TRANSFER ||
27
+ totals.category_guid === CategoryGuids.TRANSFER
28
+ )
29
+ }
30
+
31
+ export const isSpend = (totals: TotalsData) => {
32
+ return !isIncome(totals) && !isPayment(totals) && !isTransfer(totals)
33
+ }
34
+
35
+ export const getTopLevelCategoryTotals = (
36
+ totals: (MonthlyCategoryTotals | StackedLineChartData)[],
37
+ ) => {
38
+ return totals.filter((item) => item.category_guid === item.top_level_category_guid)
39
+ }