@mx-cartographer/experiences 4.0.14-alpha.JB0 → 4.0.14-alpha.JB2

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 (75) hide show
  1. package/dist/AccountStore-B23-oV1B.mjs +244 -0
  2. package/dist/AccountStore-B23-oV1B.mjs.map +1 -0
  3. package/dist/BeatApi-BxXgbSJY.mjs +99 -0
  4. package/dist/BeatApi-BxXgbSJY.mjs.map +1 -0
  5. package/dist/BudgetUtil-BSn9Zr71.mjs +208 -0
  6. package/dist/BudgetUtil-BSn9Zr71.mjs.map +1 -0
  7. package/dist/CashflowApi-zcebgnO1.mjs +103 -0
  8. package/dist/CashflowApi-zcebgnO1.mjs.map +1 -0
  9. package/dist/CashflowStore-gPEEBiXo.mjs +53 -0
  10. package/dist/CashflowStore-gPEEBiXo.mjs.map +1 -0
  11. package/dist/Categories-XVFviD23.mjs +117 -0
  12. package/dist/Categories-XVFviD23.mjs.map +1 -0
  13. package/dist/CategoryStore-CSNSMNA6.mjs +298 -0
  14. package/dist/CategoryStore-CSNSMNA6.mjs.map +1 -0
  15. package/dist/ConnectMiniWidget-Ep65CtHH.mjs +10854 -0
  16. package/dist/ConnectMiniWidget-Ep65CtHH.mjs.map +1 -0
  17. package/dist/DebtsStore-Duf3n1vZ.mjs +127 -0
  18. package/dist/DebtsStore-Duf3n1vZ.mjs.map +1 -0
  19. package/dist/Donut-DgMeKScZ.mjs +53 -0
  20. package/dist/Donut-DgMeKScZ.mjs.map +1 -0
  21. package/dist/Fetch-DpUi1_Dx.mjs +99 -0
  22. package/dist/Fetch-DpUi1_Dx.mjs.map +1 -0
  23. package/dist/GoalStore-BYoRLx99.mjs +128 -0
  24. package/dist/GoalStore-BYoRLx99.mjs.map +1 -0
  25. package/dist/MerchantStore-RhLvDvX-.mjs +118 -0
  26. package/dist/MerchantStore-RhLvDvX-.mjs.map +1 -0
  27. package/dist/NetWorthStore-syD1VnxE.mjs +66 -0
  28. package/dist/NetWorthStore-syD1VnxE.mjs.map +1 -0
  29. package/dist/NotificationStore-CqTYHfJC.mjs +141 -0
  30. package/dist/NotificationStore-CqTYHfJC.mjs.map +1 -0
  31. package/dist/RecurringActivityStore-B_COvGWG.mjs +304 -0
  32. package/dist/RecurringActivityStore-B_COvGWG.mjs.map +1 -0
  33. package/dist/StackedLineChart-CCqGRwvs.mjs +342 -0
  34. package/dist/StackedLineChart-CCqGRwvs.mjs.map +1 -0
  35. package/dist/TransactionStore-BUrjBWkk.mjs +478 -0
  36. package/dist/TransactionStore-BUrjBWkk.mjs.map +1 -0
  37. package/dist/index.es.js +12 -17869
  38. package/dist/index.es.js.map +1 -1
  39. package/dist/index.es10.js +107 -0
  40. package/dist/index.es10.js.map +1 -0
  41. package/dist/index.es11.js +159 -0
  42. package/dist/index.es11.js.map +1 -0
  43. package/dist/index.es12.js +483 -0
  44. package/dist/index.es12.js.map +1 -0
  45. package/dist/index.es13.js +620 -0
  46. package/dist/index.es13.js.map +1 -0
  47. package/dist/index.es14.js +788 -0
  48. package/dist/index.es14.js.map +1 -0
  49. package/dist/index.es15.js +891 -0
  50. package/dist/index.es15.js.map +1 -0
  51. package/dist/index.es16.js +962 -0
  52. package/dist/index.es16.js.map +1 -0
  53. package/dist/index.es17.js +1904 -0
  54. package/dist/index.es17.js.map +1 -0
  55. package/dist/index.es2.js +11 -0
  56. package/dist/index.es2.js.map +1 -0
  57. package/dist/index.es3.js +10 -0
  58. package/dist/index.es3.js.map +1 -0
  59. package/dist/index.es4.js +9 -0
  60. package/dist/index.es4.js.map +1 -0
  61. package/dist/index.es5.js +7 -0
  62. package/dist/index.es5.js.map +1 -0
  63. package/dist/index.es6.js +7 -0
  64. package/dist/index.es6.js.map +1 -0
  65. package/dist/index.es7.js +10 -0
  66. package/dist/index.es7.js.map +1 -0
  67. package/dist/index.es8.js +10 -0
  68. package/dist/index.es8.js.map +1 -0
  69. package/dist/index.es9.js +18 -0
  70. package/dist/index.es9.js.map +1 -0
  71. package/dist/useCombineEvents-CZUDHE96.mjs +170 -0
  72. package/dist/useCombineEvents-CZUDHE96.mjs.map +1 -0
  73. package/dist/usePrevious-BLb3umpI.mjs +11 -0
  74. package/dist/usePrevious-BLb3umpI.mjs.map +1 -0
  75. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.es16.js","sources":["../src/budgets/utils/BubblesSVG.ts","../src/budgets/components/bubblechart/Mercury.tsx","../src/budgets/components/bubblechart/Bubble.tsx","../src/budgets/components/BubbleChart.tsx","../src/budgets/components/ZeroState.tsx","../src/budgets/components/BubbleBudgets.tsx","../src/budgets/BubbleBudgetsMiniWidget.tsx","../src/budgets/components/budgetlist/BudgetRow.tsx","../src/budgets/components/BudgetList.tsx","../src/budgets/components/Overview.tsx","../src/budgets/components/addbudget/Header.tsx","../src/budgets/components/addbudget/RecalculateBudgetRow.tsx","../src/budgets/components/addbudget/RecalculateBudgets.tsx","../src/budgets/components/shared/BudgetAmount.tsx","../src/budgets/components/addbudget/UnbudgetedRow.tsx","../src/budgets/components/AddBudgets.tsx","../src/budgets/components/budgetdetails/Header.tsx","../src/budgets/components/budgetlist/SubBudgetZeroState.tsx","../src/budgets/components/budgetlist/SubBudgetRow.tsx","../src/budgets/components/budgetdetails/AddSubBudget.tsx","../src/budgets/components/budgetdetails/SubBudgetList.tsx","../src/budgets/components/budgetdetails/BudgetDetails.tsx","../src/budgets/components/BudgetDetailsDrawer.tsx","../src/budgets/BubbleBudgetsWidget.tsx"],"sourcesContent":["import * as d3 from 'd3'\n\nimport type { Simulation } from 'd3'\n\nimport { type BubbleData } from '../components/BubbleChart'\nimport { DetailedBudget } from '../../common'\n\n// D3 SVG Types\nexport type SimulationType = Simulation<BubbleData, undefined>\n\nconst PROGRESS_INDICATOR_SIZE = 5\nconst MAX_BUBBLE_RADIUS = 100\nconst MIN_BUBBLE_RADIUS = 25\n\n/**\n * Enables dragging of bubbles\n * @param simulation D3 Simulation\n */\nexport const drag = (simulation: SimulationType) => {\n const dragStarted = (event: any) => {\n if (!event.active) simulation.alphaTarget(0.3).restart()\n event.subject.fx = event.subject.x\n event.subject.fy = event.subject.y\n }\n\n const dragged = (event: any) => {\n event.subject.fx = event.x\n event.subject.fy = event.y\n }\n\n const dragEnded = (event: any) => {\n if (!event.active) simulation.alphaTarget(0)\n event.subject.fx = null\n event.subject.fy = null\n }\n return d3.drag().on('start', dragStarted).on('drag', dragged).on('end', dragEnded)\n}\n\n/**\n * Provide d values for the arc between the start and end radius based on time\n * @param bubble Bubble data\n */\nexport const arcTween = (bubble: BubbleData) => {\n // Percentage of the budget\n let p = bubble.transaction_total / bubble.amount\n if (p < 0) p = 0\n else if (p > 1) p = 1\n\n // End angle for the progress status\n const angle = p * 2 * Math.PI\n // Interpolate values between 0 and the end angle\n const interpolate = d3.interpolate(0, angle)\n // Progress arc starting at 0\n const arc = d3\n .arc<BubbleData>()\n .cornerRadius(5)\n .innerRadius(bubble.radius - PROGRESS_INDICATOR_SIZE * 2)\n .outerRadius(bubble.radius - PROGRESS_INDICATOR_SIZE)\n .startAngle(0)\n .endAngle(0)\n\n return (t: number) => {\n // assign end angle to interpolated value for t\n arc.endAngle(interpolate(t))\n // call arc and return intermediate `d` value\n return arc(bubble) || ''\n }\n}\n\n/**\n * Enable drag\n * @param simulation D3 Simulation\n */\nexport const enableDrag = (simulation: SimulationType) => {\n d3.selectAll('.bubble').call(drag(simulation) as any)\n}\n\n/**\n * Update location after a resize\n * @param simulation D3 Simulation\n * @param height New height\n * @param width New width\n */\nexport const resize = (simulation: SimulationType, height: number, width: number) => {\n simulation\n .alpha(1)\n .restart()\n .force(\n 'x',\n d3\n .forceX()\n .x(width / 2)\n .strength(0.01),\n )\n .force(\n 'y',\n d3\n .forceY()\n .y(height / 2)\n .strength(0.01),\n )\n}\n\nexport const getScale = (min: number, max: number) =>\n d3.scaleLinear().domain([min, max]).range([MIN_BUBBLE_RADIUS, MAX_BUBBLE_RADIUS])\n\n/**\n * Simulates the chart\n * @param budgets Budget data\n */\nexport const simulate = (budgets: DetailedBudget[]) => {\n const maxValue = budgets.reduce((acc, budget) => {\n const max = Math.max(budget.transaction_total, budget.amount)\n return max > acc ? max : acc\n }, 0)\n\n const minValue = budgets.reduce((acc, budget) => {\n const max = Math.max(budget.transaction_total, budget.amount)\n return max < acc ? max : acc\n }, maxValue)\n\n const scale = getScale(minValue, maxValue)\n\n const bubbles = budgets.map((budget) => {\n const radius = scale(Math.max(budget.transaction_total, budget.amount)) || 25\n\n return {\n ...budget,\n radius,\n } as BubbleData\n })\n\n return d3\n .forceSimulation<BubbleData>(bubbles)\n .velocityDecay(0.05)\n .force('collide', d3.forceCollide<BubbleData>((d) => d.radius + 2).strength(0.5))\n .on('tick', () => {\n d3.selectAll('.bubble')\n .data(bubbles)\n .attr('transform', (d: BubbleData) => `translate(${d.x},${d.y})`)\n })\n}\n","import React from 'react'\nimport * as d3 from 'd3'\n\nimport useTheme from '@mui/material/styles/useTheme'\n\nimport { arcTween } from '../../utils/BubblesSVG'\n\nimport type { BubbleData } from '../BubbleChart'\n\nconst PROGRESS_INDICATOR_SIZE = 5\nconst PROGRESS_DURATION = 2000\n\ninterface MercuryProps {\n bubble: BubbleData\n}\n\nexport function Mercury({ bubble }: MercuryProps) {\n const theme = useTheme()\n const {\n guid,\n budgetColors: { mercury },\n radius,\n } = bubble\n\n const bubbleId = `mercury-${guid}`\n\n React.useEffect(() => {\n // Remove previous status arc\n d3.select(`.${bubbleId}`).selectAll('.status').remove()\n\n // Append updated status arc\n d3.select(`.${bubbleId}`)\n .append('path')\n .transition()\n .duration(PROGRESS_DURATION)\n .delay(0)\n .attr('class', 'status')\n .attr('style', `fill: ${mercury}; fill-opacity: 1;`)\n .attrTween('d', () => arcTween(bubble))\n }, [bubble])\n\n const trackArc = d3\n .arc<number>()\n .innerRadius((radius: number) => radius - 2 * PROGRESS_INDICATOR_SIZE)\n .outerRadius((radius: number) => radius - PROGRESS_INDICATOR_SIZE)\n .startAngle(0)\n .endAngle(2 * Math.PI)\n\n return (\n <g className={bubbleId}>\n <path\n d={trackArc(radius) || ''}\n style={{ fill: theme.palette.common.white, fillOpacity: 0.35 }}\n />\n </g>\n )\n}\n","import React from 'react'\nimport * as d3 from 'd3'\n\nimport Tooltip from '@mui/material/Tooltip'\n\nimport { Icon, Text } from '@kyper/mui'\n\nimport { Mercury } from './Mercury'\n\nimport type { DetailedBudget } from '../../../common'\nimport type { BubbleData } from '../BubbleChart'\n\nconst LARGE_THRESHOLD = 75\nconst MEDIUM_THRESHOLD = 50\n\ninterface BubbleProps {\n bubble: BubbleData\n isDraggable: boolean\n onClick?: (budget: DetailedBudget) => void\n}\n\nexport function Bubble({ bubble, isDraggable, onClick = () => {} }: BubbleProps) {\n const [showTooltip, setShowTooltip] = React.useState(false)\n\n React.useEffect(() => {\n document.fonts.ready.then(() => {\n // Due to icon font location on Safari, we have determine x after the icon font has loaded\n const iconText = d3.select(`.icon-${icon}`) as d3.Selection<\n SVGTextElement,\n BubbleData,\n HTMLElement,\n any\n >\n const textLength = iconText.node()?.getComputedTextLength()\n iconText.attr('x', () => {\n if (radius < LARGE_THRESHOLD) {\n return textLength ? textLength / 2 - 12 : 12\n }\n return textLength ? textLength / 2 - 16 : 16\n })\n })\n }, [])\n\n if (!bubble) return undefined\n\n const {\n budgetColors: { background, text: textColor },\n category: { icon, name },\n guid,\n description,\n radius,\n x,\n y,\n } = bubble\n\n let iconY = 13\n if (radius > 75) iconY = -20\n else if (radius > 50) iconY = -6\n\n const tooltipText = `${bubble.category.name}: ${description}`\n const tooltipPopperSlot = {\n modifiers: [\n {\n name: 'offset',\n options: { offset: [0, 15] },\n },\n ],\n }\n\n return (\n <g\n className=\"bubble\"\n id={`bubble-${guid}`}\n key={guid}\n onClick={() => onClick(bubble)}\n onMouseEnter={() => setShowTooltip(true)}\n onMouseLeave={() => setShowTooltip(false)}\n style={{ cursor: isDraggable ? 'pointer' : 'default' }}\n textAnchor=\"middle\"\n x={x}\n y={y}\n >\n <Tooltip\n followCursor={true}\n open={showTooltip}\n slotProps={{ popper: tooltipPopperSlot }}\n title={tooltipText}\n >\n <circle fill={background} id={`circle-${guid}`} r={radius} />\n </Tooltip>\n\n <Icon\n className={`icon-${icon}`}\n component=\"text\"\n name={icon}\n size={radius <= LARGE_THRESHOLD ? 24 : 32}\n sx={{\n fill: textColor,\n }}\n /* @ts-expect-error Property doesn't exist on type */\n y={iconY}\n />\n\n {radius > LARGE_THRESHOLD && (\n <Text\n bold={true}\n component=\"text\"\n id={`budget-category-${guid}`}\n sx={{ fill: textColor }}\n variant=\"Small\"\n /* @ts-expect-error Property doesn't exist on type */\n y={4}\n >\n {name}\n </Text>\n )}\n\n {radius > MEDIUM_THRESHOLD && (\n <Text\n bold={true}\n component=\"text\"\n id={`budget-description-${guid}-1`}\n sx={{ fill: textColor }}\n variant=\"Body\"\n /* @ts-expect-error Property doesn't exist on type */\n y={radius <= LARGE_THRESHOLD ? 12 : 24}\n >\n {radius <= LARGE_THRESHOLD ? description.split(' ')[0] : description}\n </Text>\n )}\n\n {radius <= LARGE_THRESHOLD && radius > MEDIUM_THRESHOLD && (\n <Text\n component=\"text\"\n id={`budget-description-${guid}-2`}\n sx={{ fill: textColor }}\n variant=\"XSmall\"\n /* @ts-expect-error Property doesn't exist on type */\n y={28}\n >\n {description.split(' ')[1]}\n </Text>\n )}\n\n <Mercury bubble={bubble} />\n </g>\n )\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { SimulationNodeDatum } from 'd3-force'\n\nimport { DetailedBudget, useBudgetsStore } from '../../common'\n\nimport { enableDrag, resize, simulate, SimulationType } from '../utils/BubblesSVG'\nimport { Bubble } from './bubblechart/Bubble'\n\nexport interface BubbleData extends DetailedBudget, SimulationNodeDatum {\n radius: number\n}\n\ninterface BubbleChartProps {\n height: number\n width: number\n isDraggable?: boolean\n onClick?: (budget: DetailedBudget) => void\n}\n\nlet simulation: SimulationType\n\nconst BubbleChart: React.FC<BubbleChartProps> = ({\n height,\n width,\n isDraggable = false,\n onClick = () => {},\n}) => {\n const { detailedBudgets: budgets } = useBudgetsStore()\n\n simulation = React.useMemo(() => simulate(budgets), [budgets])\n\n React.useEffect(() => {\n resize(simulation, height, width)\n\n if (isDraggable) {\n enableDrag(simulation)\n }\n }, [simulation, height, width])\n\n return (\n <svg height={height} style={{ overflow: 'visible' }} width={Math.abs(width)}>\n {simulation.nodes().map((bubble) => (\n <Bubble bubble={bubble} isDraggable={isDraggable} key={bubble.guid} onClick={onClick} />\n ))}\n </svg>\n )\n}\n\nexport default observer(BubbleChart)\n","import Stack from '@mui/material/Stack'\n\nimport { Icon, Text } from '@kyper/mui'\n\nimport { useGlobalCopyStore } from '../../common'\n\nconst ZeroState = () => {\n const { budgets: budgetsCopy } = useGlobalCopyStore()\n\n return (\n <Stack alignItems=\"center\" gap={12} sx={{ mx: 24, textAlign: 'center' }}>\n <Icon name=\"bubble_chart\" size={48} />\n <Text bold={true} variant=\"Paragraph\">\n {budgetsCopy.zero_state_title}\n </Text>\n <Text sx={{ whiteSpace: 'wrap' }} variant=\"Paragraph\">\n {budgetsCopy.zero_state_description}\n </Text>\n </Stack>\n )\n}\n\nexport default ZeroState\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\n\nimport {\n type DetailedBudget,\n ANALYTICS_EVENTS,\n useBudgetsStore,\n useEvent,\n useGlobalUiStore,\n useWidgetContainerProvider,\n useCategoryStore,\n Loader,\n useScreenSize,\n} from '../../common'\n\nimport BubbleChart from './BubbleChart'\nimport ZeroState from './ZeroState'\n\ninterface BubbleBudgetsProps {\n height: number\n isDraggable?: boolean\n shouldShowZeroState: boolean\n unavailableWidth?: number\n}\n\nexport const BubbleBudgets: React.FC<BubbleBudgetsProps> = observer(\n ({ height, isDraggable = false, shouldShowZeroState, unavailableWidth = 24 }) => {\n const { onEvent } = useEvent()\n const { setSelectedBudget } = useBudgetsStore()\n const { isLoadingCategoryTotals } = useCategoryStore()\n const { isInitialized } = useGlobalUiStore()\n const { availableWidth } = useWidgetContainerProvider()\n const { isMobile } = useScreenSize()\n\n const width = React.useMemo(() => {\n return availableWidth - unavailableWidth\n }, [availableWidth])\n\n const handleBubbleClick = (budget: DetailedBudget) => {\n setSelectedBudget(budget)\n onEvent(ANALYTICS_EVENTS.BUDGETS_CLICK_BUDGET_CATEGORY, {\n budget_category: budget.category.name,\n click_type: 'bubble',\n })\n }\n\n if (isLoadingCategoryTotals) {\n return (\n <Stack alignItems=\"center\" height={height} justifyContent=\"center\" width={Math.abs(width)}>\n <Loader />\n </Stack>\n )\n }\n\n return (\n <Box ml={shouldShowZeroState || isMobile ? 0 : 24}>\n {shouldShowZeroState || !isInitialized ? (\n <ZeroState />\n ) : (\n <BubbleChart\n height={height}\n isDraggable={isDraggable}\n onClick={handleBubbleClick}\n width={width}\n />\n )}\n </Box>\n )\n },\n)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\nimport useTheme from '@mui/material/styles/useTheme'\n\nimport { Text } from '@kyper/mui'\n\nimport {\n MiniWidgetContainer,\n MiniWidgetProps,\n formatCurrency,\n useBudgetsStore,\n useGlobalCopyStore,\n} from '../common'\n\nimport { useGetBudgetDifference } from './utils/BudgetUtil'\nimport { BubbleBudgets } from './components/BubbleBudgets'\n\nconst BubbleBudgetsMiniWidget = (props: MiniWidgetProps) => {\n const theme = useTheme()\n\n const { budgets, loadBudgets, setTheme } = useBudgetsStore()\n const { budgets: budgetsCopy } = useGlobalCopyStore()\n const difference = useGetBudgetDifference()\n const shouldShowZeroState = budgets.length === 0\n\n React.useEffect(() => {\n setTheme(theme)\n loadBudgets().finally()\n }, [])\n\n return (\n <MiniWidgetContainer\n primaryCtaLabel={shouldShowZeroState ? budgetsCopy.get_started_cta : budgetsCopy.details_cta}\n title={budgetsCopy.budgets_title}\n {...props}\n >\n <Stack height={450} mt={32}>\n <BubbleBudgets height={370} shouldShowZeroState={shouldShowZeroState} />\n {!shouldShowZeroState && (\n <Box ml={16}>\n <Text bold={true} color={difference < 0 ? 'error.main' : 'success.main'}>\n {formatCurrency(Math.abs(difference), '0,0')}\n </Text>\n <Text>\n {difference < 0 ? budgetsCopy.overspent_in_budgets : budgetsCopy.left_in_budgets}\n </Text>\n </Box>\n )}\n </Stack>\n </MiniWidgetContainer>\n )\n}\n\nexport default observer(BubbleBudgetsMiniWidget)\n","import React from 'react'\n\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport Stack from '@mui/material/Stack'\n\nimport { CategoryIcon, Text } from '@kyper/mui'\n\nimport { type DetailedBudget, formatCurrency, SingleSegmentDonut } from '../../../common'\n\ninterface BudgetRowProps {\n budget: DetailedBudget\n onClick?: (budget: DetailedBudget) => void\n}\n\nexport const BudgetRow: React.FC<BudgetRowProps> = ({ budget, onClick }) => {\n const {\n amount,\n budgetColors: { background, description: descriptionColor },\n category_guid,\n description,\n percentage,\n subBudgets,\n transaction_total,\n } = budget\n\n return (\n <ListItem>\n <ListItemButton onClick={() => onClick?.(budget)}>\n <ListItemAvatar sx={{ mb: -8, mr: 16 }}>\n <SingleSegmentDonut color={background} percent={percentage} size={40}>\n <CategoryIcon categoryGuid={category_guid} variant=\"basic\" />\n </SingleSegmentDonut>\n </ListItemAvatar>\n <ListItemText\n primary={\n <Stack component=\"span\" direction=\"row\" justifyContent=\"space-between\">\n <Text bold={true} variant=\"Body\">\n {budget.category.name}\n </Text>\n <Text fontWeight={400} variant=\"Body\">\n {`\n ${formatCurrency(transaction_total, '0,0')} / \n ${formatCurrency(amount, '0,0')}\n `}\n </Text>\n </Stack>\n }\n secondary={\n <Stack component=\"span\" direction=\"row\" justifyContent=\"space-between\">\n <Text variant=\"XSmall\">{`${subBudgets.length} Sub-budgets`}</Text>\n <Text bold={percentage > 100} color={descriptionColor} variant=\"XSmall\">\n {description}\n </Text>\n </Stack>\n }\n />\n </ListItemButton>\n </ListItem>\n )\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Card from '@mui/material/Card'\nimport CardContent from '@mui/material/CardContent'\nimport CardHeader from '@mui/material/CardHeader'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\n\nimport { H3 } from '@kyper/mui'\n\nimport {\n type DetailedBudget,\n ANALYTICS_EVENTS,\n useBudgetsStore,\n useEvent,\n useGlobalCopyStore,\n} from '../../common'\n\nimport { BudgetRow } from './budgetlist/BudgetRow'\n\nexport const BudgetList = observer(() => {\n const { onEvent } = useEvent()\n const { budgets: copy } = useGlobalCopyStore()\n const { detailedBudgets: budgets, setSelectedBudget } = useBudgetsStore()\n\n const handleBudgetClick = (budget: DetailedBudget) => {\n setSelectedBudget(budget)\n onEvent(ANALYTICS_EVENTS.BUDGETS_CLICK_BUDGET_CATEGORY, {\n budget_category: budget.category.name,\n click_type: 'list',\n })\n }\n\n return (\n <Card elevation={2} sx={{ borderRadius: 2 }}>\n <CardHeader sx={{ pb: 8, pl: 24 }} title={<H3>{copy.budget_categories_title}</H3>} />\n <CardContent sx={{ p: 0, ':last-child': { p: 0 } }}>\n <List>\n {budgets.map((budget) => (\n <React.Fragment key={budget.guid}>\n <BudgetRow budget={budget} onClick={handleBudgetClick} />\n <Divider />\n </React.Fragment>\n ))}\n </List>\n </CardContent>\n </Card>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { subDays } from 'date-fns/subDays'\n\nimport Card from '@mui/material/Card'\nimport CardContent from '@mui/material/CardContent'\nimport CardHeader from '@mui/material/CardHeader'\nimport IconButton from '@mui/material/IconButton'\nimport Stack from '@mui/material/Stack'\nimport useTheme from '@mui/material/styles/useTheme'\n\nimport { H3, Icon, Text } from '@kyper/mui'\n\nimport {\n type StatusBarData,\n ANALYTICS_EVENTS,\n buildDynamicCopy,\n Drawer,\n formatCurrency,\n StatusBar,\n useBudgetsStore,\n useCategoryStore,\n useGlobalCopyStore,\n useRecurringActivityStore,\n useTransactionStore,\n useAccountStore,\n useEvent,\n} from '../../common'\n\nimport { ManageIncome } from '../../recurringactivity'\n\nexport const Overview = observer(() => {\n const theme = useTheme()\n\n const { onEvent } = useEvent()\n const { accounts } = useAccountStore()\n const { budgets: copy, common: commonCopy, recurring: recurringCopy } = useGlobalCopyStore()\n const { incomeCategories, spendCategories } = useCategoryStore()\n const { detailedBudgets: budgets, totalBudgeted } = useBudgetsStore()\n const { projectedIncome } = useRecurringActivityStore()\n const { setFilter } = useTransactionStore()\n\n const [isIncomeOpen, setIsIncomeOpen] = React.useState(false)\n\n const [spentTotal, spendingStatus] = React.useMemo(() => {\n const spentTotal = spendCategories.reduce((total, current) => total + current.totalAmount, 0)\n let spendingPercentage = spentTotal / totalBudgeted\n if (spendingPercentage > 1) spendingPercentage = 1\n let color = theme.palette.success.main\n if (spendingPercentage > 0.8 && spendingPercentage < 1) {\n color = theme.palette.warning.main\n } else if (spendingPercentage >= 1) {\n color = theme.palette.error.main\n }\n\n const spendingStatus = [\n {\n color,\n percentage: `${spendingPercentage}`,\n },\n ] as StatusBarData[]\n return [spentTotal, spendingStatus]\n }, [budgets, spendCategories])\n\n const [incomePaid, incomeStatus] = React.useMemo(() => {\n const incomePaid = Math.abs(\n incomeCategories.reduce((total, current) => total + current.totalAmount, 0),\n )\n let incomePercentage = incomePaid / projectedIncome\n if (incomePercentage > 1) incomePercentage = 1\n\n const incomeStatus = [\n {\n color: theme.palette.secondary.main,\n percentage: `${incomePercentage}`,\n },\n ]\n return [incomePaid, incomeStatus]\n }, [incomeCategories, projectedIncome])\n\n const handleOpenIncome = () => {\n setFilter({\n accounts: accounts.map((account) => account.guid),\n dateRange: {\n start: subDays(new Date(), 90),\n end: new Date(),\n },\n })\n setIsIncomeOpen(true)\n onEvent(ANALYTICS_EVENTS.BUDGETS_CLICK_EDIT_INCOME)\n }\n\n return (\n <Card elevation={2} sx={{ overflow: 'visible', borderRadius: 2 }}>\n <CardHeader sx={{ pb: 8, pl: 24 }} title={<H3>{copy.overview_title}</H3>} />\n <CardContent sx={{ pt: 12, px: 24 }}>\n <Stack gap={24}>\n <Stack gap={8}>\n <Text bold={true} sx={{ mb: 8 }} variant=\"Body\">\n {copy.spending_title}\n </Text>\n <StatusBar data={spendingStatus} height={16} />\n <Text variant=\"Small\">\n {\n buildDynamicCopy(\n copy.spending_description,\n formatCurrency(spentTotal, '0,0'),\n formatCurrency(totalBudgeted, '0,0'),\n ) as string\n }\n </Text>\n </Stack>\n\n <Stack gap={8}>\n <Stack alignItems=\"center\" direction=\"row\" gap={4} mb={-4}>\n <Text bold={true} variant=\"Body\">\n {copy.income_title}\n </Text>\n <IconButton\n aria-label={recurringCopy.manage_income}\n onClick={handleOpenIncome}\n sx={{ p: 0 }}\n >\n <Icon name=\"edit\" />\n </IconButton>\n </Stack>\n <StatusBar data={incomeStatus} height={16} />\n <Text variant=\"Small\">\n {\n buildDynamicCopy(\n copy.income_description,\n formatCurrency(incomePaid, '0,0'),\n formatCurrency(projectedIncome, '0,0'),\n ) as string\n }\n </Text>\n </Stack>\n </Stack>\n </CardContent>\n\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isIncomeOpen}\n onClose={() => setIsIncomeOpen(false)}\n title={recurringCopy.manage_income}\n >\n <Stack gap={4}>\n <Text bold={true} sx={{ mt: 12, mx: 24 }} variant=\"Small\">\n {copy.income_title}\n </Text>\n <ManageIncome />\n </Stack>\n </Drawer>\n </Card>\n )\n})\n","import { observer } from 'mobx-react-lite'\n\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@kyper/mui'\n\nimport {\n formatCurrency,\n useBudgetsStore,\n useGlobalCopyStore,\n useRecurringActivityStore,\n} from '../../../common'\n\nexport const Header = observer(() => {\n const { budgets: copy } = useGlobalCopyStore()\n const { totalBudgeted } = useBudgetsStore()\n const { projectedIncome } = useRecurringActivityStore()\n\n const remaining = projectedIncome - totalBudgeted\n\n return (\n <Stack direction=\"row\" justifyContent=\"center\" my={16} spacing={20}>\n <Stack alignItems=\"center\">\n <Text bold={true} variant=\"Body\">\n {formatCurrency(projectedIncome, '0,0')}\n </Text>\n <Text color=\"secondary\" variant=\"Small\">\n {copy.projected_income}\n </Text>\n </Stack>\n\n <Text bold={true} justifyContent=\"center\" variant=\"Body\">\n {'-'}\n </Text>\n\n <Stack alignItems=\"center\">\n <Text bold={true} variant=\"Body\">\n {formatCurrency(totalBudgeted, '0,0')}\n </Text>\n <Text color=\"secondary\" variant=\"Small\">\n {copy.budgeted}\n </Text>\n </Stack>\n\n <Text bold={true} justifyContent=\"center\" variant=\"Body\">\n {'='}\n </Text>\n\n <Stack alignItems=\"center\">\n <Text bold={true} variant=\"Body\">\n {formatCurrency(remaining, '0,0')}\n </Text>\n <Text color=\"secondary\" variant=\"Small\">\n {copy.remaining}\n </Text>\n </Stack>\n </Stack>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Divider from '@mui/material/Divider'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\n\nimport { CategoryIcon } from '@kyper/mui'\n\nimport {\n type DetailedCategory,\n buildDynamicCopy,\n formatCurrency,\n useBudgetsStore,\n useGlobalCopyStore,\n} from '../../../common'\n\ninterface RecalculateBudgetRowProps {\n category: DetailedCategory\n}\n\nexport const RecalculateBudgetRow: React.FC<RecalculateBudgetRowProps> = observer(\n ({ category }) => {\n const { budgets: copy } = useGlobalCopyStore()\n const { budgets } = useBudgetsStore()\n\n const secondaryText = React.useMemo(() => {\n const budget = budgets.find((b) => b.category_guid === category.guid)\n const part1 = formatCurrency(category.totalAverageAmount, '0,0')\n const part2 = budget\n ? buildDynamicCopy(copy.recalculate_previous_budget, formatCurrency(budget.amount, '0,0'))\n : copy.recalculate_new_budget\n\n return `${part1} - ${part2}`\n }, [copy, budgets])\n\n return (\n <React.Fragment key={category.guid}>\n <ListItem>\n <ListItemButton>\n <ListItemAvatar>\n <CategoryIcon categoryGuid={category.guid} variant=\"filled\" />\n </ListItemAvatar>\n <ListItemText primary={category.name} secondary={secondaryText} />\n </ListItemButton>\n </ListItem>\n <Divider />\n </React.Fragment>\n )\n },\n)\n","import React from 'react'\n\nimport Button from '@mui/material/Button'\nimport List from '@mui/material/List'\nimport Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@kyper/mui'\n\nimport { Drawer, useBudgetsStore, useCategoryStore, useGlobalCopyStore } from '../../../common'\n\nimport { RecalculateBudgetRow } from './RecalculateBudgetRow'\n\ninterface RecalculateBudgetsProps {\n onRecalculateBudgets?: () => void\n}\n\nexport const RecalculateBudgets = ({ onRecalculateBudgets }: RecalculateBudgetsProps) => {\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n const { spendCategories } = useCategoryStore()\n const { recalculateBudgets, setAlert } = useBudgetsStore()\n\n const [isOpen, setIsOpen] = React.useState(false)\n\n const newBudgetCategories = spendCategories.filter((category) => category.totalAverageAmount > 0)\n\n const handlePrimaryClick = async () => {\n await recalculateBudgets(newBudgetCategories)\n\n setIsOpen(false)\n setAlert(copy.alert_recalculated_budgets)\n onRecalculateBudgets?.()\n }\n\n return (\n <React.Fragment>\n <Button onClick={() => setIsOpen(true)} sx={{ mt: 24, mx: 24 }} variant=\"text\">\n {copy.recalculate_button}\n </Button>\n\n <Text sx={{ mx: 24, my: 16, textAlign: 'center', whiteSpace: 'wrap' }} variant=\"Paragraph\">\n {copy.recalculate_help}\n </Text>\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n onPrimaryAction={handlePrimaryClick}\n title={copy.recalculate_title}\n >\n <Stack>\n <Stack mx={24} my={16}>\n <Text bold={true} variant=\"Body\">\n {copy.recalculate_description_top}\n </Text>\n <Text variant=\"ParagraphSmall\">{copy.recalculate_description_bottom}</Text>\n </Stack>\n <Box bgcolor=\"background.paper\">\n <List>\n {newBudgetCategories.map((category) => (\n <RecalculateBudgetRow category={category} key={category.guid} />\n ))}\n </List>\n </Box>\n </Stack>\n </Drawer>\n </React.Fragment>\n )\n}\n","import React from 'react'\n\nimport Stack from '@mui/material/Stack'\nimport { Text } from '@kyper/mui'\nimport {\n buildDynamicCopy,\n CurrencyInput,\n formatCurrency,\n useBudgetsStore,\n useGlobalCopyStore,\n useRecurringActivityStore,\n} from '../../../common'\n\ninterface BudgetAmountProps {\n amount: string\n categoryName: string\n onAmountChanged: (amount: string) => void\n}\n\nexport const BudgetAmount: React.FC<BudgetAmountProps> = ({\n amount,\n categoryName,\n onAmountChanged,\n}) => {\n const { budgets: copy } = useGlobalCopyStore()\n const { totalBudgeted } = useBudgetsStore()\n const { projectedIncome } = useRecurringActivityStore()\n\n const unbudgetedIncome = projectedIncome - totalBudgeted\n\n return (\n <Stack gap={16}>\n <Stack>\n <Text>\n {\n buildDynamicCopy(\n copy.add_description_top,\n formatCurrency(unbudgetedIncome, '0,0'),\n ) as string\n }\n </Text>\n <Text>{buildDynamicCopy(copy.add_description_bottom, categoryName) as string}</Text>\n </Stack>\n <CurrencyInput\n amount={amount}\n autoFocus={true}\n label={copy.add_label}\n minAmount={0}\n setAmount={onAmountChanged}\n sx={{ '.MuiTypography-Body': { p: 0 } }}\n />\n </Stack>\n )\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemSecondaryAction from '@mui/material/ListItemSecondaryAction'\nimport ListItemText from '@mui/material/ListItemText'\n\nimport { CategoryIcon, Icon } from '@kyper/mui'\n\nimport { type DetailedCategory, Dialog, formatCurrency, useGlobalCopyStore } from '../../../common'\n\nimport { BudgetAmount } from '../shared/BudgetAmount'\n\ninterface UnbudgetedRowProps {\n category: DetailedCategory\n onAddBudget: (category: DetailedCategory, amount: number) => void\n}\n\nexport const UnbudgetedRow: React.FC<UnbudgetedRowProps> = observer(({ category, onAddBudget }) => {\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n\n const [isAddBudgetOpen, setIsAddBudgetOpen] = React.useState(false)\n const [amount, setAmount] = React.useState(\n `${category.totalAmount === 0 ? '' : category.totalAmount}`,\n )\n\n return (\n <React.Fragment>\n <ListItem key={category.guid}>\n <ListItemButton onClick={() => setIsAddBudgetOpen(true)}>\n <ListItemAvatar>\n <CategoryIcon categoryGuid={category.guid} />\n </ListItemAvatar>\n <ListItemText\n primary={category.name}\n secondary={formatCurrency(category.totalAmount, '0,0')}\n />\n <ListItemSecondaryAction>\n <Icon name=\"add\" size={20} />\n </ListItemSecondaryAction>\n </ListItemButton>\n </ListItem>\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.add_title }}\n disablePrimaryButton={Number(amount) <= 0}\n isOpen={isAddBudgetOpen}\n onClose={() => setIsAddBudgetOpen(false)}\n onPrimaryAction={() => onAddBudget(category, Number(amount))}\n primaryText={copy.add_save_button}\n >\n <BudgetAmount amount={amount} categoryName={category.name} onAmountChanged={setAmount} />\n </Dialog>\n </React.Fragment>\n )\n})\n","import { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport List from '@mui/material/List'\nimport Stack from '@mui/material/Stack'\n\nimport {\n buildDynamicCopy,\n type DetailedCategory,\n useBudgetsStore,\n useGlobalCopyStore,\n} from '../../common'\n\nimport { Header } from './addbudget/Header'\nimport { RecalculateBudgets } from './addbudget/RecalculateBudgets'\nimport { UnbudgetedRow } from './addbudget/UnbudgetedRow'\n\ninterface AddBudgetsProps {\n onRecalculateBudgets?: () => void\n}\n\nexport const AddBudgets = observer(({ onRecalculateBudgets }: AddBudgetsProps) => {\n const { budgets: copy } = useGlobalCopyStore()\n const { addBudget, setAlert, unbudgetedCategories } = useBudgetsStore()\n\n const handleOnAddBudget = async (category: DetailedCategory, amount: number) => {\n await addBudget(category, amount)\n setAlert(buildDynamicCopy(copy.alert_budget_created, category.name) as string)\n }\n\n return (\n <Stack>\n <Header />\n\n <Box bgcolor=\"background.paper\">\n <List>\n {unbudgetedCategories.map((category) => (\n <UnbudgetedRow\n category={category}\n key={category.guid}\n onAddBudget={handleOnAddBudget}\n />\n ))}\n </List>\n </Box>\n\n <RecalculateBudgets onRecalculateBudgets={onRecalculateBudgets} />\n </Stack>\n )\n})\n","import React from 'react'\n\nimport Card from '@mui/material/Card'\nimport CardContent from '@mui/material/CardContent'\nimport Stack from '@mui/material/Stack'\n\nimport { CategoryIcon, H1, Text } from '@kyper/mui'\n\nimport { DetailedBudget, formatCurrency, StatusBar } from '../../../common'\n\ninterface HeaderProps {\n budget: DetailedBudget\n}\n\nexport const Header: React.FC<HeaderProps> = ({ budget }) => {\n const {\n amount,\n budgetColors: { background },\n category: { name: categoryName },\n category_guid,\n percentage,\n transaction_total,\n } = budget\n\n const status = [\n {\n color: background,\n percentage: `${percentage}%`,\n },\n ]\n\n return (\n <Card sx={{ mt: 24, mx: 24 }}>\n <CardContent>\n <Stack alignItems=\"center\" gap={16}>\n <CategoryIcon categoryGuid={category_guid} size={56} />\n <H1>\n {`${formatCurrency(transaction_total, '0,0')} / ${formatCurrency(amount, '0,0')}`}\n </H1>\n <Text bold={true} variant=\"XSmall\">\n {categoryName}\n </Text>\n <StatusBar data={status} height={10} />\n </Stack>\n </CardContent>\n </Card>\n )\n}\n","import Stack from '@mui/material/Stack'\nimport { observer } from 'mobx-react-lite'\n\nimport { Icon, Text } from '@kyper/mui'\n\nimport { useGlobalCopyStore } from '../../../common'\n\nexport const SubBudgetZeroState = observer(() => {\n const { budgets: copy } = useGlobalCopyStore()\n\n return (\n <Stack alignItems=\"center\" gap={12} height=\"auto\" mb={24} mt={24}>\n <Icon color=\"secondary\" name=\"bubble_chart\" sx={{ fontSize: 32 }} />\n <Text bold={true} color=\"secondary\" variant=\"Small\">\n {copy.zero_state_no_sub_budgets}\n </Text>\n <Text color=\"text.secondary\" variant=\"XSmall\">\n {copy.zero_state_no_sub_budgets_description}\n </Text>\n </Stack>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport Stack from '@mui/material/Stack'\n\nimport { CategoryIcon, Text } from '@kyper/mui'\n\nimport {\n type DetailedBudget,\n formatCurrency,\n SingleSegmentDonut,\n useBudgetsStore,\n} from '../../../common'\n\ninterface SubBudgetRowProps {\n budget: DetailedBudget\n}\n\nexport const SubBudgetRow: React.FC<SubBudgetRowProps> = observer(({ budget }) => {\n const {\n amount,\n budgetColors: { background },\n category,\n percentage,\n transaction_total,\n } = budget\n\n const { setSelectedSubBudget } = useBudgetsStore()\n\n return (\n <ListItem>\n <ListItemButton onClick={() => setSelectedSubBudget(budget)}>\n <ListItemAvatar sx={{ mb: -8, mr: 16 }}>\n <SingleSegmentDonut color={background} percent={percentage} size={40}>\n <CategoryIcon categoryGuid={category.parent_guid} variant=\"basic\" />\n </SingleSegmentDonut>\n </ListItemAvatar>\n <ListItemText\n primary={\n <Stack component=\"span\" direction=\"row\" justifyContent=\"space-between\">\n <Text bold={true} variant=\"Body\">\n {budget.category.name}\n </Text>\n </Stack>\n }\n secondary={\n <Stack component=\"span\" direction=\"row\" justifyContent=\"space-between\">\n <Text fontWeight={400} variant=\"Body\">\n {`\n ${formatCurrency(transaction_total, '0,0')} / \n ${formatCurrency(amount, '0,0')}\n `}\n </Text>\n </Stack>\n }\n />\n </ListItemButton>\n </ListItem>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport Stack from '@mui/material/Stack'\n\nimport { Icon, Text } from '@kyper/mui'\n\nimport {\n type DetailedBudget,\n type DetailedCategory,\n Dialog,\n Drawer,\n useBudgetsStore,\n useGlobalCopyStore,\n} from '../../../common'\nimport { CategoryRow, useCategoryUiStore } from '../../../categories'\nimport { BudgetAmount } from '../shared/BudgetAmount'\n\ninterface AddSubBudgetProps {\n category: DetailedCategory\n parentBudget: DetailedBudget\n}\n\nexport const AddSubBudget: React.FC<AddSubBudgetProps> = observer(({ category, parentBudget }) => {\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n const { setExpandedGuid, setOnSelect } = useCategoryUiStore()\n const { addBudget } = useBudgetsStore()\n\n const [isOpen, setIsOpen] = React.useState(false)\n const [isAddBudgetOpen, setIsAddBudgetOpen] = React.useState(false)\n const [amount, setAmount] = React.useState('')\n const [subCategory, setSubCategory] = React.useState<DetailedCategory | undefined>(undefined)\n\n React.useEffect(() => {\n setOnSelect((guid: string) => {\n const subCategory = category.subCategories.find((sc) => sc.guid === guid)\n if (subCategory) {\n setSubCategory(subCategory)\n setAmount(`${subCategory.currentAmount === 0 ? '' : subCategory.currentAmount}`)\n setIsAddBudgetOpen(true)\n }\n })\n }, [])\n\n const handleOpen = () => {\n setExpandedGuid(category.guid)\n setIsOpen(true)\n }\n\n const handleAddSubBudget = async () => {\n if (subCategory && Number(amount) > 0) {\n await addBudget(subCategory, Number(amount), parentBudget.guid)\n setIsAddBudgetOpen(false)\n setIsOpen(false)\n setSubCategory(undefined)\n }\n }\n\n return (\n <Box>\n <ListItem disableGutters={true} disablePadding={true} sx={{ bgcolor: 'background.paper' }}>\n <ListItemButton onClick={handleOpen}>\n <ListItemText>\n <Stack alignItems=\"center\" direction=\"row\" justifyContent=\"space-between\">\n <Stack alignItems=\"center\" direction=\"row\" gap={8}>\n <Icon fill={true} name=\"add_box\" size={24} sx={{ color: 'action.active' }} />\n <Text bold={true} sx={{ color: 'action.active' }} variant=\"Body\">\n {copy.add_sub_budget_button}\n </Text>\n </Stack>\n <Icon name=\"chevron_right\" size={24} sx={{ color: 'primary.light' }} />\n </Stack>\n </ListItemText>\n </ListItemButton>\n </ListItem>\n <Divider />\n\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n title={copy.add_sub_budget_title}\n >\n <List>\n <CategoryRow category={category} subCategories={category.subCategories} />\n </List>\n </Drawer>\n\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.add_title }}\n disablePrimaryButton={Number(amount) <= 0}\n isOpen={isAddBudgetOpen}\n onClose={() => setIsAddBudgetOpen(false)}\n onPrimaryAction={handleAddSubBudget}\n primaryText={copy.add_save_button}\n >\n <BudgetAmount\n amount={amount}\n categoryName={subCategory?.name || ''}\n onAmountChanged={setAmount}\n />\n </Dialog>\n </Box>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@kyper/mui'\n\nimport {\n type Budget,\n type DetailedBudget,\n type Transaction,\n buildDynamicCopy,\n Dialog,\n Drawer,\n useBudgetsStore,\n useGlobalCopyStore,\n useTransactionStore,\n} from '../../../common'\n\nimport { TransactionList } from '../../../transactions'\n\nimport { SubBudgetZeroState } from '../budgetlist/SubBudgetZeroState'\nimport { SubBudgetRow } from '../budgetlist/SubBudgetRow'\nimport { BudgetAmount } from '../shared/BudgetAmount'\nimport { AddSubBudget } from './AddSubBudget'\nimport { Header } from './Header'\n\ninterface SubBudgetListProps {\n budget: DetailedBudget\n}\n\nexport const SubBudgetList: React.FC<SubBudgetListProps> = observer(({ budget }) => {\n const { category, subBudgets } = budget\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n const { deleteBudget, selectedSubBudget, setSelectedSubBudget, updateBudget } = useBudgetsStore()\n const { filter, setFilter } = useTransactionStore()\n\n const [isEditOpen, setIsEditOpen] = React.useState(false)\n const [isDeleteOpen, setIsDeleteOpen] = React.useState(false)\n const [amount, setAmount] = React.useState(``)\n\n React.useEffect(() => {\n if (selectedSubBudget) {\n setAmount(`${selectedSubBudget.amount}`)\n setFilter({\n ...filter,\n custom: (t: Transaction) => t.category_guid === selectedSubBudget.category_guid,\n })\n }\n }, [selectedSubBudget])\n\n const handleUpdateBudget = async () => {\n if (selectedSubBudget) {\n await updateBudget({\n ...selectedSubBudget,\n amount: Number(amount),\n } as Budget)\n }\n }\n\n const handleDeleteBudget = async () => {\n if (selectedSubBudget) {\n await deleteBudget(selectedSubBudget.guid)\n }\n setIsDeleteOpen(false)\n handleClose()\n }\n\n const handleClose = () => {\n setFilter({\n ...filter,\n custom: (t: Transaction) =>\n t.category_guid === budget.category_guid ||\n t.top_level_category_guid === budget.category_guid,\n })\n setSelectedSubBudget(undefined)\n }\n\n return (\n <React.Fragment>\n <List sx={{ bgcolor: 'background.paper' }}>\n {subBudgets.length === 0 ? (\n <SubBudgetZeroState />\n ) : (\n subBudgets.map((subBudget) => (\n <React.Fragment key={subBudget.guid}>\n <SubBudgetRow budget={subBudget} />\n <Divider />\n </React.Fragment>\n ))\n )}\n <AddSubBudget category={category} parentBudget={budget} />\n </List>\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={Boolean(selectedSubBudget)}\n onClose={handleClose}\n onPrimaryAction={() => setIsEditOpen(true)}\n onSecondaryAction={() => setIsDeleteOpen(true)}\n primaryText={copy.details_edit_button}\n secondaryText={copy.details_delete_button}\n title={copy.details_title}\n >\n {selectedSubBudget && (\n <Stack gap={24}>\n <Header budget={selectedSubBudget} />\n <TransactionList height=\"100%\" />\n </Stack>\n )}\n </Drawer>\n\n {selectedSubBudget && (\n <React.Fragment>\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.details_edit_title }}\n disablePrimaryButton={Number(amount) <= 0}\n isOpen={isEditOpen}\n onClose={() => setIsEditOpen(false)}\n onPrimaryAction={handleUpdateBudget}\n primaryText={copy.edit_save_button}\n >\n <BudgetAmount\n amount={amount}\n categoryName={selectedSubBudget.category.name}\n onAmountChanged={setAmount}\n />\n </Dialog>\n\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.delete_title }}\n isOpen={isDeleteOpen}\n onClose={() => setIsDeleteOpen(false)}\n onPrimaryAction={handleDeleteBudget}\n primaryColor=\"error\"\n primaryText=\"Delete\"\n secondaryColor=\"secondary\"\n >\n <Text variant=\"Paragraph\">\n {buildDynamicCopy(copy.delete_description, selectedSubBudget.category.name) as string}\n </Text>\n </Dialog>\n </React.Fragment>\n )}\n </React.Fragment>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Button from '@mui/material/Button'\nimport Stack from '@mui/material/Stack'\nimport Tab from '@mui/material/Tab'\nimport Tabs from '@mui/material/Tabs'\n\nimport { Icon } from '@kyper/mui'\n\nimport {\n type DetailedBudget,\n Drawer,\n useBudgetsStore,\n useGlobalCopyStore,\n useTransactionStore,\n} from '../../../common'\n\nimport { exportTransactionsToCSV, TransactionDetails, TransactionList } from '../../../transactions'\n\nimport { Header } from './Header'\nimport { SubBudgetList } from './SubBudgetList'\n\ninterface BudgetDetailsProps {\n budget: DetailedBudget\n}\n\nexport const BudgetDetails: React.FC<BudgetDetailsProps> = observer(({ budget }) => {\n const { budgets: copy, common: commonCopy, transactions: transactionCopy } = useGlobalCopyStore()\n const { setAlert } = useBudgetsStore()\n const { sortedTransactions: transactions, tags } = useTransactionStore()\n\n const [selectedTab, setSelectedTab] = React.useState(0)\n const [transactionGuid, setTransactionGuid] = React.useState('')\n\n const transaction = React.useMemo(\n () => transactions.find((t) => t.guid === transactionGuid),\n [transactionGuid],\n )\n\n const handleTabChange = (_event: React.SyntheticEvent, newValue: number) => {\n setSelectedTab(newValue)\n }\n\n const handleExportToCsv = () => {\n exportTransactionsToCSV(transactions, tags)\n setAlert(copy.alert_csv_downloaded)\n }\n\n return (\n <Stack gap={24}>\n <Header budget={budget} />\n\n <Stack>\n <Tabs\n onChange={handleTabChange}\n sx={{ width: '100%' }}\n value={selectedTab}\n variant=\"fullWidth\"\n >\n <Tab label={copy.details_transactions_tab} />\n <Tab label={copy.details_subbudgets_tab} />\n </Tabs>\n {selectedTab === 0 && (\n <Stack>\n {transactions.length > 0 && (\n <Stack direction=\"row\" justifyContent=\"right\" mb={-24} mr={8} mt={8} zIndex={1}>\n <Button\n onClick={handleExportToCsv}\n startIcon={<Icon name=\"ios_share\" />}\n variant=\"text\"\n >\n {transactionCopy.export_csv_btn}\n </Button>\n </Stack>\n )}\n <TransactionList height=\"100%\" onClick={setTransactionGuid} />\n </Stack>\n )}\n {selectedTab === 1 && <SubBudgetList budget={budget} />}\n\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={Boolean(transaction)}\n onClose={() => setTransactionGuid('')}\n title={copy.details_transaction_drawer}\n >\n {transaction && <TransactionDetails transaction={transaction} />}\n </Drawer>\n </Stack>\n </Stack>\n )\n})\n","import React from 'react'\n\nimport { observer } from 'mobx-react-lite'\n\nimport { Text } from '@kyper/mui'\n\nimport {\n type Budget,\n type Transaction,\n buildDynamicCopy,\n Dialog,\n Drawer,\n useBudgetsStore,\n useGlobalCopyStore,\n useGlobalUiStore,\n useTransactionStore,\n} from '../../common'\n\nimport { BudgetDetails } from './budgetdetails/BudgetDetails'\nimport { BudgetAmount } from './shared/BudgetAmount'\n\nexport const BudgetDetailsDrawer = observer(() => {\n const { selectedAccountGuids } = useGlobalUiStore()\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n const {\n dateRange,\n deleteBudget,\n selectedBudget,\n selectedSubBudget,\n setAlert,\n setSelectedBudget,\n updateBudget,\n } = useBudgetsStore()\n const { setFilter } = useTransactionStore()\n\n const [isOpen, setIsOpen] = React.useState(false)\n const [isEditOpen, setIsEditOpen] = React.useState(false)\n const [isDeleteOpen, setIsDeleteOpen] = React.useState(false)\n const [amount, setAmount] = React.useState(``)\n\n React.useEffect(() => {\n if (selectedBudget && !selectedSubBudget) {\n setAmount(`${selectedBudget.amount}`)\n setIsOpen(true)\n setFilter({\n accounts: selectedAccountGuids,\n dateRange: dateRange,\n custom: (t: Transaction) =>\n t.category_guid === selectedBudget.category_guid ||\n t.top_level_category_guid === selectedBudget.category_guid,\n })\n }\n }, [selectedBudget])\n\n const handleUpdateBudget = async () => {\n if (selectedBudget) {\n await updateBudget({\n ...selectedBudget,\n amount: Number(amount),\n percentage: (selectedBudget.category.totalAmount / Number(amount)) * 100,\n } as Budget)\n\n setAlert(buildDynamicCopy(copy.alert_budget_updated, selectedBudget.category.name) as string)\n }\n }\n\n const handleDeleteBudget = async () => {\n if (selectedBudget) {\n await deleteBudget(selectedBudget.guid)\n setAlert(buildDynamicCopy(copy.alert_budget_deleted, selectedBudget.category.name) as string)\n }\n setIsDeleteOpen(false)\n handleClose()\n }\n\n const handleClose = () => {\n setIsOpen(false)\n // Wait for the close animation before set the selected budget\n setTimeout(() => {\n setSelectedBudget(undefined)\n }, 250)\n }\n\n if (!selectedBudget) {\n return undefined\n }\n\n return (\n <React.Fragment>\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isOpen}\n onClose={handleClose}\n onPrimaryAction={() => setIsEditOpen(true)}\n onSecondaryAction={() => setIsDeleteOpen(true)}\n primaryText={copy.details_edit_button}\n secondaryColor=\"error\"\n secondaryText={copy.details_delete_button}\n title={copy.details_title}\n >\n <BudgetDetails budget={selectedBudget} />\n </Drawer>\n\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.details_edit_title }}\n disablePrimaryButton={Number(amount) <= 0}\n isOpen={isEditOpen}\n onClose={() => setIsEditOpen(false)}\n onPrimaryAction={handleUpdateBudget}\n primaryText={copy.edit_save_button}\n >\n <BudgetAmount\n amount={amount}\n categoryName={selectedBudget.category.name}\n onAmountChanged={setAmount}\n />\n </Dialog>\n\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.delete_title }}\n isOpen={isDeleteOpen}\n onClose={() => setIsDeleteOpen(false)}\n onPrimaryAction={handleDeleteBudget}\n primaryColor=\"error\"\n primaryText={copy.details_delete_button}\n secondaryColor=\"secondary\"\n >\n <Text variant=\"Paragraph\">\n {buildDynamicCopy(copy.delete_description, selectedBudget.category.name) as string}\n </Text>\n </Dialog>\n </React.Fragment>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { isAfter } from 'date-fns/isAfter'\nimport { startOfMonth } from 'date-fns/startOfMonth'\n\nimport Alert from '@mui/material/Alert'\nimport Stack from '@mui/material/Stack'\nimport Snackbar from '@mui/material/Snackbar'\nimport useTheme from '@mui/material/styles/useTheme'\nimport { DateRange } from '@mui/x-date-pickers-pro'\n\nimport {\n ANALYTICS_EVENTS,\n Drawer,\n Loader,\n useAccountStore,\n useBudgetsStore,\n useCategoryStore,\n useEvent,\n useGlobalCopyStore,\n useGlobalUiStore,\n useRecurringActivityStore,\n useScreenSize,\n WidgetContainer,\n WidgetProps,\n} from '../common'\n\nimport { BubbleBudgets } from './components/BubbleBudgets'\nimport { BudgetList } from './components/BudgetList'\nimport { Overview } from './components/Overview'\nimport { AddBudgets } from './components/AddBudgets'\nimport { BudgetDetailsDrawer } from './components/BudgetDetailsDrawer'\n\nconst BUDGET_LIST_WIDTH = 480\n\nexport const BubbleBudgetsWidget: React.FC<WidgetProps> = observer(({ onBackClick, sx }) => {\n const theme = useTheme()\n\n const { onEvent } = useEvent()\n const { accounts } = useAccountStore()\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n const { isInitialized, selectedAccounts, setDisplayedDate, setSelectedAccounts } =\n useGlobalUiStore()\n const { alert, dateRange, loadBudgets, setDateRange, setAlert, setTheme } = useBudgetsStore()\n const { loadCashflowSequences } = useRecurringActivityStore()\n const { isDesktop, isTablet } = useScreenSize()\n const { reloadCategoryTotals } = useCategoryStore()\n\n const [isDataLoaded, setIsDataLoaded] = React.useState(false)\n const [isAddOpen, setIsAddOpen] = React.useState(false)\n\n React.useEffect(() => {\n setTheme(theme)\n setSelectedAccounts(accounts)\n setDisplayedDate(dateRange.start, dateRange.end)\n onEvent(ANALYTICS_EVENTS.BUDGETS_VIEW)\n }, [])\n\n React.useEffect(() => {\n if (isInitialized) {\n reloadCategoryTotals(selectedAccounts, dateRange.start, dateRange.end).finally()\n if (!isDataLoaded) {\n loadCashflowSequences().finally()\n loadBudgets().finally(() => setIsDataLoaded(true))\n }\n }\n }, [isInitialized, selectedAccounts, dateRange])\n\n const onMonthChanged = (dateRange: DateRange<Date>) => {\n setDateRange({ start: dateRange[0] || new Date(), end: dateRange[1] || new Date() })\n }\n\n const handleAccountFilterClick = () => {\n onEvent(ANALYTICS_EVENTS.BUDGETS_CLICK_FILTER)\n }\n\n const handleAddClick = () => {\n setIsAddOpen(true)\n onEvent(ANALYTICS_EVENTS.BUDGETS_CLICK_ADD)\n }\n\n const handleBudgetsRecalculated = () => {\n setIsAddOpen(false)\n }\n\n const shouldDisableNext = isAfter(dateRange.end, startOfMonth(new Date()))\n\n if (!isInitialized || !isDataLoaded) {\n return <Loader />\n }\n\n return (\n <WidgetContainer\n accountOptions={accounts}\n actions={[\n {\n iconName: 'add',\n label: copy.add_title,\n onClick: handleAddClick,\n },\n ]}\n calendarActions={{ onRangeChanged: onMonthChanged, shouldDisableNext }}\n onAccountsFilterClick={handleAccountFilterClick}\n onBackClick={onBackClick}\n sx={sx}\n title={copy.budgets_title}\n >\n {(!isInitialized || !isDataLoaded) && <Loader />}\n {isInitialized && isDataLoaded && (\n <Stack direction={isDesktop || isTablet ? 'row' : 'column'} height=\"100%\" width=\"100%\">\n <Stack height={isDesktop || isTablet ? 'calc(100dvh - 150px)' : 450}>\n <BubbleBudgets\n height={isDesktop || isTablet ? 800 : 450}\n isDraggable={true}\n shouldShowZeroState={false}\n unavailableWidth={isDesktop || isTablet ? BUDGET_LIST_WIDTH : 0}\n />\n </Stack>\n <Stack\n gap={24}\n height=\"100%\"\n sx={{ mr: 24 }}\n width={isDesktop || isTablet ? BUDGET_LIST_WIDTH : '100%'}\n >\n <Overview />\n <BudgetList />\n </Stack>\n </Stack>\n )}\n\n <BudgetDetailsDrawer />\n\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isAddOpen}\n onClose={() => setIsAddOpen(false)}\n title={copy.add_new_title}\n >\n <AddBudgets onRecalculateBudgets={handleBudgetsRecalculated} />\n </Drawer>\n\n <Snackbar\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n autoHideDuration={3500}\n onClose={() => setAlert('')}\n open={Boolean(alert)}\n >\n <Alert onClose={() => setAlert('')} severity=\"success\" variant=\"filled\">\n {alert}\n </Alert>\n </Snackbar>\n </WidgetContainer>\n )\n})\n"],"names":["PROGRESS_INDICATOR_SIZE","MAX_BUBBLE_RADIUS","MIN_BUBBLE_RADIUS","drag","simulation","dragStarted","event","dragged","dragEnded","d3","arcTween","bubble","p","angle","interpolate","arc","t","enableDrag","resize","height","width","getScale","min","max","simulate","budgets","maxValue","acc","budget","minValue","scale","bubbles","radius","d","PROGRESS_DURATION","Mercury","theme","useTheme","guid","mercury","bubbleId","React","trackArc","jsx","LARGE_THRESHOLD","MEDIUM_THRESHOLD","Bubble","isDraggable","onClick","showTooltip","setShowTooltip","iconText","icon","textLength","background","textColor","name","description","x","y","iconY","tooltipText","tooltipPopperSlot","jsxs","Tooltip","Icon","Text","BubbleChart","useBudgetsStore","BubbleChart$1","observer","ZeroState","budgetsCopy","useGlobalCopyStore","Stack","BubbleBudgets","shouldShowZeroState","unavailableWidth","onEvent","useEvent","setSelectedBudget","isLoadingCategoryTotals","useCategoryStore","isInitialized","useGlobalUiStore","availableWidth","useWidgetContainerProvider","isMobile","useScreenSize","handleBubbleClick","ANALYTICS_EVENTS","Loader","Box","BubbleBudgetsMiniWidget","props","loadBudgets","setTheme","difference","useGetBudgetDifference","MiniWidgetContainer","formatCurrency","BubbleBudgetsMiniWidget$1","BudgetRow","amount","descriptionColor","category_guid","percentage","subBudgets","transaction_total","ListItem","ListItemButton","ListItemAvatar","SingleSegmentDonut","CategoryIcon","ListItemText","BudgetList","copy","handleBudgetClick","Card","CardHeader","H3","CardContent","List","Divider","Overview","accounts","useAccountStore","commonCopy","recurringCopy","incomeCategories","spendCategories","totalBudgeted","projectedIncome","useRecurringActivityStore","setFilter","useTransactionStore","isIncomeOpen","setIsIncomeOpen","spentTotal","spendingStatus","total","current","spendingPercentage","color","incomePaid","incomeStatus","incomePercentage","handleOpenIncome","account","subDays","StatusBar","buildDynamicCopy","IconButton","Drawer","ManageIncome","Header","remaining","RecalculateBudgetRow","category","secondaryText","b","part1","part2","RecalculateBudgets","onRecalculateBudgets","recalculateBudgets","setAlert","isOpen","setIsOpen","newBudgetCategories","handlePrimaryClick","Button","BudgetAmount","categoryName","onAmountChanged","unbudgetedIncome","CurrencyInput","UnbudgetedRow","onAddBudget","isAddBudgetOpen","setIsAddBudgetOpen","setAmount","ListItemSecondaryAction","Dialog","AddBudgets","addBudget","unbudgetedCategories","handleOnAddBudget","status","H1","SubBudgetZeroState","SubBudgetRow","setSelectedSubBudget","AddSubBudget","parentBudget","setExpandedGuid","setOnSelect","useCategoryUiStore","subCategory","setSubCategory","sc","handleOpen","handleAddSubBudget","CategoryRow","SubBudgetList","deleteBudget","selectedSubBudget","updateBudget","filter","isEditOpen","setIsEditOpen","isDeleteOpen","setIsDeleteOpen","handleUpdateBudget","handleDeleteBudget","handleClose","subBudget","TransactionList","BudgetDetails","transactionCopy","transactions","tags","selectedTab","setSelectedTab","transactionGuid","setTransactionGuid","transaction","handleTabChange","_event","newValue","handleExportToCsv","exportTransactionsToCSV","Tabs","Tab","TransactionDetails","BudgetDetailsDrawer","selectedAccountGuids","dateRange","selectedBudget","BUDGET_LIST_WIDTH","BubbleBudgetsWidget","onBackClick","sx","selectedAccounts","setDisplayedDate","setSelectedAccounts","alert","setDateRange","loadCashflowSequences","isDesktop","isTablet","reloadCategoryTotals","isDataLoaded","setIsDataLoaded","isAddOpen","setIsAddOpen","onMonthChanged","handleAccountFilterClick","handleAddClick","handleBudgetsRecalculated","shouldDisableNext","isAfter","startOfMonth","WidgetContainer","Snackbar","Alert"],"mappings":"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"}