@actual-app/web 23.10.0 → 23.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/build/asset-manifest.json +15 -15
  2. package/build/index.html +1 -1
  3. package/build/kcab/{kcab.worker.b835d2cdcf8004c363da.js → kcab.worker.8a181a0b032adc34600e.js} +54 -54
  4. package/build/kcab/{kcab.worker.b835d2cdcf8004c363da.js.map → kcab.worker.8a181a0b032adc34600e.js.map} +1 -1
  5. package/build/static/js/312.9f087b98.chunk.js +2 -0
  6. package/build/static/js/312.9f087b98.chunk.js.map +1 -0
  7. package/build/static/js/{713.1731d555.chunk.js → 444.301f7ece.chunk.js} +2 -2
  8. package/build/static/js/444.301f7ece.chunk.js.map +1 -0
  9. package/build/static/js/848.aa73d5a0.chunk.js +19 -0
  10. package/build/static/js/848.aa73d5a0.chunk.js.map +1 -0
  11. package/build/static/js/main.fd0bdfe2.js +188 -0
  12. package/build/static/js/main.fd0bdfe2.js.map +1 -0
  13. package/build/static/js/narrow-components.9ae206be.chunk.js +2 -0
  14. package/build/static/js/narrow-components.9ae206be.chunk.js.map +1 -0
  15. package/build/static/js/reports.778a42ee.chunk.js +2 -0
  16. package/build/static/js/reports.778a42ee.chunk.js.map +1 -0
  17. package/build/static/js/wide-components.481c39ec.chunk.js +2 -0
  18. package/build/static/js/wide-components.481c39ec.chunk.js.map +1 -0
  19. package/package.json +3 -2
  20. package/build/static/js/389.c8f94185.chunk.js +0 -2
  21. package/build/static/js/389.c8f94185.chunk.js.map +0 -1
  22. package/build/static/js/678.bf349f5d.chunk.js +0 -2
  23. package/build/static/js/678.bf349f5d.chunk.js.map +0 -1
  24. package/build/static/js/713.1731d555.chunk.js.map +0 -1
  25. package/build/static/js/main.7e6eedd0.js +0 -188
  26. package/build/static/js/main.7e6eedd0.js.map +0 -1
  27. package/build/static/js/narrow-components.11cf3591.chunk.js +0 -2
  28. package/build/static/js/narrow-components.11cf3591.chunk.js.map +0 -1
  29. package/build/static/js/reports.39b7254a.chunk.js +0 -2
  30. package/build/static/js/reports.39b7254a.chunk.js.map +0 -1
  31. package/build/static/js/wide-components.fd8595f4.chunk.js +0 -2
  32. package/build/static/js/wide-components.fd8595f4.chunk.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/js/narrow-components.9ae206be.chunk.js","mappings":"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","sources":["components/budget/BalanceWithCarryover.tsx","components/budget/rollover/CoverTooltip.tsx","components/budget/rollover/BalanceTooltip.tsx","components/budget/rollover/TransferTooltip.tsx","components/budget/util.ts","components/common/ButtonLink.tsx","components/SyncRefresh.tsx","icons/v1/ArrowThinLeft.tsx","components/common/Card.tsx","components/common/Label.tsx","components/budget/MobileTable.tsx","components/budget/MobileBudgetTable.js","components/budget/MobileBudget.js","../../../node_modules/react-simple-pull-to-refresh/build/index.esm.js","components/responsive/PullToRefresh.tsx","components/accounts/MobileAccounts.js","components/accounts/MobileAccountDetails.js","components/accounts/MobileAccount.js","../../loot-core/src/shared/categories.ts"],"sourcesContent":["import React, { type ComponentProps } from 'react';\n\nimport ArrowThinRight from '../../icons/v1/ArrowThinRight';\nimport { type CSSProperties } from '../../style';\nimport View from '../common/View';\nimport CellValue from '../spreadsheet/CellValue';\nimport useSheetValue from '../spreadsheet/useSheetValue';\n\nimport { makeAmountStyle } from './util';\n\ntype BalanceWithCarryoverProps = {\n carryover: ComponentProps<typeof CellValue>['binding'];\n balance: ComponentProps<typeof CellValue>['binding'];\n disabled?: boolean;\n style?: CSSProperties;\n balanceStyle?: CSSProperties;\n carryoverStyle?: CSSProperties;\n};\nexport default function BalanceWithCarryover({\n carryover,\n balance,\n disabled,\n style,\n balanceStyle,\n carryoverStyle,\n}: BalanceWithCarryoverProps) {\n let carryoverValue = useSheetValue(carryover);\n let balanceValue = useSheetValue(balance);\n\n return (\n <View style={style}>\n <CellValue\n binding={balance}\n type=\"financial\"\n getStyle={makeAmountStyle}\n style={{\n textAlign: 'right',\n ...(!disabled && {\n cursor: 'pointer',\n ':hover': { textDecoration: 'underline' },\n }),\n ...balanceStyle,\n }}\n />\n {carryoverValue && (\n <View\n style={{\n alignSelf: 'center',\n marginLeft: 2,\n position: 'absolute',\n right: -8,\n top: 0,\n bottom: 0,\n justifyContent: 'center',\n ...carryoverStyle,\n }}\n >\n <ArrowThinRight\n width={7}\n height={7}\n style={makeAmountStyle(balanceValue)}\n />\n </View>\n )}\n </View>\n );\n}\n","import React, { type ComponentProps, useState } from 'react';\n\nimport useCategories from '../../../hooks/useCategories';\nimport CategoryAutocomplete from '../../autocomplete/CategoryAutocomplete';\nimport Button from '../../common/Button';\nimport InitialFocus from '../../common/InitialFocus';\nimport View from '../../common/View';\nimport { Tooltip } from '../../tooltips';\nimport { addToBeBudgetedGroup } from '../util';\n\ntype CoverTooltipProps = {\n tooltipProps?: ComponentProps<typeof Tooltip>;\n onSubmit: (category: unknown) => void;\n onClose: () => void;\n};\nexport default function CoverTooltip({\n tooltipProps,\n onSubmit,\n onClose,\n}: CoverTooltipProps) {\n let { grouped: categoryGroups } = useCategories();\n categoryGroups = addToBeBudgetedGroup(\n categoryGroups.filter(g => !g.is_income),\n );\n let [category, setCategory] = useState(null);\n\n function submit() {\n if (category) {\n onSubmit(category);\n onClose();\n }\n }\n\n return (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 10 }}\n {...tooltipProps}\n onClose={onClose}\n >\n <View style={{ marginBottom: 5 }}>Cover from category:</View>\n\n <InitialFocus>\n {node => (\n <CategoryAutocomplete\n categoryGroups={categoryGroups}\n value={null}\n openOnFocus={true}\n onUpdate={id => {}}\n onSelect={id => setCategory(id)}\n inputProps={{\n inputRef: node,\n onKeyDown: e => {\n if (e.key === 'Enter') {\n submit();\n }\n },\n }}\n />\n )}\n </InitialFocus>\n\n <View\n style={{\n alignItems: 'flex-end',\n marginTop: 10,\n }}\n >\n <Button\n type=\"primary\"\n style={{\n fontSize: 12,\n paddingTop: 3,\n }}\n onClick={submit}\n >\n Transfer\n </Button>\n </View>\n </Tooltip>\n );\n}\n","import React, { useState } from 'react';\n\nimport { rolloverBudget } from 'loot-core/src/client/queries';\n\nimport Menu from '../../common/Menu';\nimport useSheetValue from '../../spreadsheet/useSheetValue';\nimport { Tooltip } from '../../tooltips';\n\nimport CoverTooltip from './CoverTooltip';\nimport TransferTooltip from './TransferTooltip';\n\ntype BalanceTooltipProps = {\n categoryId: string;\n tooltip: { close: () => void };\n monthIndex: number;\n onBudgetAction: (idx: number, action: string, arg?: unknown) => void;\n onClose?: () => void;\n};\nexport default function BalanceTooltip({\n categoryId,\n tooltip,\n monthIndex,\n onBudgetAction,\n onClose,\n ...tooltipProps\n}: BalanceTooltipProps) {\n let carryover = useSheetValue(rolloverBudget.catCarryover(categoryId));\n let balance = useSheetValue(rolloverBudget.catBalance(categoryId));\n let [menu, setMenu] = useState('menu');\n\n let _onClose = () => {\n tooltip.close();\n onClose?.();\n };\n\n return (\n <>\n {menu === 'menu' && (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 0 }}\n onClose={_onClose}\n {...tooltipProps}\n >\n <Menu\n onMenuSelect={type => {\n if (type === 'carryover') {\n onBudgetAction(monthIndex, 'carryover', {\n category: categoryId,\n flag: !carryover,\n });\n _onClose();\n } else {\n setMenu(type);\n }\n }}\n items={[\n {\n name: 'transfer',\n text: 'Transfer to another category',\n },\n {\n name: 'carryover',\n text: carryover\n ? 'Remove overspending rollover'\n : 'Rollover overspending',\n },\n balance < 0 && {\n name: 'cover',\n text: 'Cover overspending',\n },\n ].filter(x => x)}\n />\n </Tooltip>\n )}\n\n {menu === 'transfer' && (\n <TransferTooltip\n initialAmountName={rolloverBudget.catBalance(categoryId)}\n showToBeBudgeted={true}\n onClose={_onClose}\n onSubmit={(amount, toCategory) => {\n onBudgetAction(monthIndex, 'transfer-category', {\n amount,\n from: categoryId,\n to: toCategory,\n });\n }}\n />\n )}\n\n {menu === 'cover' && (\n <CoverTooltip\n onClose={_onClose}\n onSubmit={fromCategory => {\n onBudgetAction(monthIndex, 'cover', {\n to: categoryId,\n from: fromCategory,\n });\n }}\n />\n )}\n </>\n );\n}\n","import React, {\n useState,\n useContext,\n useEffect,\n type ComponentProps,\n} from 'react';\n\nimport { useSpreadsheet } from 'loot-core/src/client/SpreadsheetProvider';\nimport evalArithmetic from 'loot-core/src/shared/arithmetic';\nimport { integerToCurrency, amountToInteger } from 'loot-core/src/shared/util';\n\nimport useCategories from '../../../hooks/useCategories';\nimport CategoryAutocomplete from '../../autocomplete/CategoryAutocomplete';\nimport Button from '../../common/Button';\nimport InitialFocus from '../../common/InitialFocus';\nimport Input from '../../common/Input';\nimport View from '../../common/View';\nimport NamespaceContext from '../../spreadsheet/NamespaceContext';\nimport { Tooltip } from '../../tooltips';\nimport { addToBeBudgetedGroup } from '../util';\n\ntype TransferTooltipProps = {\n initialAmount?: number;\n initialAmountName?: string;\n showToBeBudgeted?: boolean;\n tooltipProps?: ComponentProps<typeof Tooltip>;\n onSubmit: (amount: number, category: unknown) => void;\n onClose: () => void;\n};\nexport default function TransferTooltip({\n initialAmount,\n initialAmountName,\n showToBeBudgeted,\n tooltipProps,\n onSubmit,\n onClose,\n}: TransferTooltipProps) {\n let spreadsheet = useSpreadsheet();\n let sheetName = useContext(NamespaceContext);\n let { grouped: categoryGroups } = useCategories();\n\n categoryGroups = categoryGroups.filter(g => !g.is_income);\n if (showToBeBudgeted) {\n categoryGroups = addToBeBudgetedGroup(categoryGroups);\n }\n\n let [amount, setAmount] = useState(null);\n let [category, setCategory] = useState(null);\n\n useEffect(() => {\n (async () => {\n if (initialAmountName) {\n const node = await spreadsheet.get(sheetName, initialAmountName);\n setAmount(integerToCurrency(Math.max(node.value, 0)));\n } else {\n setAmount(integerToCurrency(Math.max(initialAmount, 0)));\n }\n })();\n }, []);\n\n function submit() {\n let parsedAmount = evalArithmetic(amount, null);\n if (parsedAmount && category) {\n onSubmit(amountToInteger(parsedAmount), category);\n onClose();\n }\n }\n\n if (amount === null) {\n // Don't render anything until we have the amount to show. This\n // ensures that the amount field is focused and fully selected\n // when it's initially rendered (instead of being updated\n // afterwards and losing selection)\n return null;\n }\n\n return (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 10 }}\n {...tooltipProps}\n onClose={onClose}\n >\n <View style={{ marginBottom: 5 }}>Transfer this amount:</View>\n <View>\n <InitialFocus>\n <Input\n value={amount}\n onChange={e => setAmount(e.target['value'])}\n onEnter={submit}\n />\n </InitialFocus>\n </View>\n <View style={{ margin: '10px 0 5px 0' }}>To:</View>\n\n <CategoryAutocomplete\n categoryGroups={categoryGroups}\n value={null}\n openOnFocus={true}\n onUpdate={id => {}}\n onSelect={id => setCategory(id)}\n inputProps={{ onEnter: submit, placeholder: '(none)' }}\n />\n\n <View\n style={{\n alignItems: 'flex-end',\n marginTop: 10,\n }}\n >\n <Button\n type=\"primary\"\n style={{\n fontSize: 12,\n paddingTop: 3,\n paddingBottom: 3,\n }}\n onClick={submit}\n >\n Transfer\n </Button>\n </View>\n </Tooltip>\n );\n}\n","import { type CategoryGroupEntity } from 'loot-core/src/types/models';\n\nimport { styles, theme } from '../../style';\nimport { type DropPosition } from '../sort';\n\nexport function addToBeBudgetedGroup(groups: CategoryGroupEntity[]) {\n return [\n {\n id: 'to-be-budgeted',\n name: 'To Be Budgeted',\n categories: [\n {\n id: 'to-be-budgeted',\n name: 'To Be Budgeted',\n cat_group: 'to-be-budgeted',\n group: {\n id: 'to-be-budgeted',\n name: 'To Be Budgeted',\n },\n },\n ],\n },\n ...groups,\n ];\n}\n\nexport function separateGroups(categoryGroups: CategoryGroupEntity[]) {\n return [\n categoryGroups.filter(g => !g.is_income),\n categoryGroups.find(g => g.is_income),\n ];\n}\n\nexport function makeAmountGrey(value: number | string) {\n return value === 0 || value === '0' || value === '' || value == null\n ? { color: theme.altMenuItemText }\n : null;\n}\n\nexport function makeAmountStyle(value: number) {\n const greyed = makeAmountGrey(value);\n if (greyed) {\n return greyed;\n }\n\n if (value < 0) {\n return { color: theme.errorText };\n }\n}\n\nexport function makeAmountFullStyle(value: number) {\n return {\n color:\n value < 0\n ? theme.errorText\n : value === 0\n ? theme.altMenuItemText\n : theme.noticeText,\n };\n}\n\nexport function findSortDown(\n arr: CategoryGroupEntity[],\n pos: DropPosition,\n targetId: string,\n) {\n if (pos === 'top') {\n return { targetId };\n } else {\n let idx = arr.findIndex(item => item.id === targetId);\n\n if (idx === -1) {\n throw new Error('findSort: item not found: ' + targetId);\n }\n\n let newIdx = idx + 1;\n if (newIdx < arr.length - 1) {\n return { targetId: arr[newIdx].id };\n } else {\n // Move to the end\n return { targetId: null };\n }\n }\n}\n\nexport function findSortUp(\n arr: CategoryGroupEntity[],\n pos: DropPosition,\n targetId: string,\n) {\n if (pos === 'bottom') {\n return { targetId };\n } else {\n let idx = arr.findIndex(item => item.id === targetId);\n\n if (idx === -1) {\n throw new Error('findSort: item not found: ' + targetId);\n }\n\n let newIdx = idx - 1;\n if (newIdx >= 0) {\n return { targetId: arr[newIdx].id };\n } else {\n // Move to the beginning\n return { targetId: null };\n }\n }\n}\n\nexport function getScrollbarWidth() {\n return Math.max(styles.scrollbarWidth - 2, 0);\n}\n","import React, { type ComponentProps } from 'react';\nimport { useMatch } from 'react-router-dom';\n\nimport useNavigate from '../../hooks/useNavigate';\nimport { type CSSProperties } from '../../style';\n\nimport Button from './Button';\n\ntype ButtonLinkProps = ComponentProps<typeof Button> & {\n to: string;\n activeStyle?: CSSProperties;\n};\nexport default function ButtonLink({\n to,\n style,\n activeStyle,\n ...props\n}: ButtonLinkProps) {\n const navigate = useNavigate();\n const match = useMatch({ path: to });\n return (\n <Button\n style={{\n ...style,\n ...(match ? activeStyle : {}),\n }}\n activeStyle={activeStyle}\n {...props}\n onClick={e => {\n props.onClick?.(e);\n navigate(to);\n }}\n />\n );\n}\n","import { type ReactNode, useState } from 'react';\n\ntype ChildrenProps = {\n refreshing: boolean;\n onRefresh: () => Promise<void>;\n};\ntype SyncRefreshProps = {\n onSync: () => Promise<void>;\n children: (props: ChildrenProps) => ReactNode;\n};\nexport default function SyncRefresh({ onSync, children }: SyncRefreshProps) {\n let [syncing, setSyncing] = useState(false);\n\n async function onSync_() {\n setSyncing(true);\n await onSync();\n setSyncing(false);\n }\n\n return children({ refreshing: syncing, onRefresh: onSync_ });\n}\n","import * as React from 'react';\nimport type { SVGProps } from 'react';\nconst SvgArrowThinLeft = (props: SVGProps<SVGSVGElement>) => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n d=\"m3.828 9 6.071-6.071-1.414-1.414L0 10l.707.707 7.778 7.778 1.414-1.414L3.828 11H20V9H3.828z\"\n fill=\"currentColor\"\n />\n </svg>\n);\nexport default SvgArrowThinLeft;\n","import { type ComponentProps, forwardRef } from 'react';\n\nimport { theme } from '../../style';\n\nimport View from './View';\n\ntype CardProps = ComponentProps<typeof View>;\n\nconst Card = forwardRef<HTMLDivElement, CardProps>(\n ({ children, ...props }, ref) => {\n return (\n <View\n {...props}\n ref={ref}\n style={{\n marginTop: 15,\n marginLeft: 5,\n marginRight: 5,\n borderRadius: 6,\n backgroundColor: theme.cardBackground,\n borderColor: theme.cardBorder,\n boxShadow: '0 1px 2px #9594A8',\n ...props.style,\n }}\n >\n <View\n style={{\n borderRadius: 6,\n overflow: 'hidden',\n }}\n >\n {children}\n </View>\n </View>\n );\n },\n);\n\nexport default Card;\n","import { type ReactNode } from 'react';\n\nimport { type CSSProperties, theme, styles } from '../../style';\n\nimport Text from './Text';\n\ntype LabelProps = {\n title: ReactNode;\n style?: CSSProperties;\n};\n\nexport default function Label({ title, style }: LabelProps) {\n return (\n <Text\n style={{\n ...styles.text,\n color: theme.tableRowHeaderText,\n textAlign: 'right',\n fontSize: 12,\n marginBottom: 2,\n ...style,\n }}\n >\n {title}\n </Text>\n );\n}\n","import React, { type ComponentProps, type ReactNode } from 'react';\n\nimport { type CSSProperties, theme } from '../../style';\nimport View from '../common/View';\n\nexport const ROW_HEIGHT = 50;\n\ntype ListItemProps = ComponentProps<typeof View> & {\n children?: ReactNode;\n style: CSSProperties;\n};\n\nexport const ListItem = ({ children, style, ...props }: ListItemProps) => {\n return (\n <View\n style={{\n height: ROW_HEIGHT,\n borderBottomWidth: 1,\n borderColor: theme.tableBorder,\n flexDirection: 'row',\n alignItems: 'center',\n paddingLeft: 10,\n paddingRight: 10,\n zIndex: 1,\n ...style,\n }}\n {...props}\n >\n {children}\n </View>\n );\n};\n","import React, { memo, useEffect, useRef, useState } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport memoizeOne from 'memoize-one';\n\nimport { rolloverBudget, reportBudget } from 'loot-core/src/client/queries';\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nimport ArrowThinLeft from '../../icons/v1/ArrowThinLeft';\nimport ArrowThinRight from '../../icons/v1/ArrowThinRight';\nimport DotsHorizontalTriple from '../../icons/v1/DotsHorizontalTriple';\nimport { useResponsive } from '../../ResponsiveProvider';\nimport { theme, styles } from '../../style';\nimport Button from '../common/Button';\nimport Card from '../common/Card';\nimport InputWithContent from '../common/InputWithContent';\nimport Label from '../common/Label';\nimport Menu from '../common/Menu';\nimport Text from '../common/Text';\nimport View from '../common/View';\nimport { useServerURL } from '../ServerContext';\nimport CellValue from '../spreadsheet/CellValue';\nimport NamespaceContext from '../spreadsheet/NamespaceContext';\nimport useFormat from '../spreadsheet/useFormat';\nimport useSheetValue from '../spreadsheet/useSheetValue';\nimport { SyncButton } from '../Titlebar';\nimport { Tooltip, useTooltip } from '../tooltips';\nimport { AmountInput } from '../util/AmountInput';\n// import {\n// AmountAccessoryContext,\n// MathOperations\n// } from '../mobile/AmountInput';\n\n// import { DragDrop, Draggable, Droppable, DragDropHighlight } from './dragdrop';\nimport BalanceWithCarryover from './BalanceWithCarryover';\nimport { ListItem, ROW_HEIGHT } from './MobileTable';\nimport BalanceTooltip from './rollover/BalanceTooltip';\nimport { makeAmountGrey } from './util';\n\nfunction ToBudget({ toBudget, onClick }) {\n let amount = useSheetValue(toBudget);\n return (\n <Button\n type=\"bare\"\n style={{ flexDirection: 'column', alignItems: 'flex-start' }}\n onClick={onClick}\n >\n <Label\n title={amount < 0 ? 'OVERBUDGETED' : 'TO BUDGET'}\n style={{\n ...styles.underlinedText,\n color: theme.formInputText,\n flexShrink: 0,\n textAlign: 'left',\n }}\n />\n <CellValue\n binding={toBudget}\n type=\"financial\"\n style={{\n ...styles.smallText,\n fontWeight: '500',\n color: amount < 0 ? theme.errorText : theme.formInputText,\n }}\n />\n </Button>\n );\n}\n\nfunction Saved({ projected }) {\n let binding = projected\n ? reportBudget.totalBudgetedSaved\n : reportBudget.totalSaved;\n\n let saved = useSheetValue(binding) || 0;\n let isNegative = saved < 0;\n\n return (\n <View\n style={{\n flexDirection: 'column',\n alignItems: 'flex-start',\n }}\n >\n {projected ? (\n <Label\n title=\"PROJECTED SAVINGS\"\n style={{ color: theme.formInputText, textAlign: 'left' }}\n />\n ) : (\n <Label\n title={isNegative ? 'OVERSPENT' : 'SAVED'}\n style={{ color: theme.formInputText, textAlign: 'left' }}\n />\n )}\n\n <CellValue\n binding={binding}\n type=\"financial\"\n style={{\n ...styles.smallText,\n fontWeight: '500',\n color: projected\n ? theme.alt2WarningText\n : isNegative\n ? theme.errorTextDark\n : theme.formInputText,\n }}\n />\n </View>\n );\n}\n\nfunction BudgetCell({\n name,\n binding,\n style,\n textStyle,\n categoryId,\n month,\n onBudgetAction,\n onEdit,\n isEditing,\n}) {\n let sheetValue = useSheetValue(binding);\n\n function updateBudgetAmount(amount) {\n onBudgetAction?.(month, 'budget-amount', {\n category: categoryId,\n amount: amount,\n });\n }\n\n function onAmountClick(e) {\n onEdit?.(categoryId);\n }\n\n return (\n <View style={style}>\n {isEditing ? (\n <AmountInput\n initialValue={sheetValue}\n zeroSign=\"+\"\n style={{\n height: ROW_HEIGHT,\n transform: 'translateX(6px)',\n }}\n focused={isEditing}\n textStyle={{ ...styles.smallText, ...textStyle }}\n onChange={updateBudgetAmount}\n onBlur={() => onEdit?.(null)}\n />\n ) : (\n <View\n role=\"button\"\n style={{\n justifyContent: 'center',\n alignItems: 'flex-end',\n height: ROW_HEIGHT,\n }}\n >\n <CellValue\n binding={binding}\n type=\"financial\"\n style={{\n ...styles.smallText,\n ...textStyle,\n ...styles.underlinedText,\n }}\n getStyle={makeAmountGrey}\n data-testid={name}\n onPointerUp={onAmountClick}\n onPointerDown={e => e.preventDefault()}\n />\n </View>\n )}\n </View>\n );\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction ExpenseGroupPreview({ group, pending, style }) {\n return (\n <Card\n style={{\n marginTop: 7,\n marginBottom: 7,\n opacity: pending ? 1 : 0.4,\n }}\n >\n <ExpenseGroupTotals group={group} blank={true} />\n\n {group.categories.map((cat, index) => (\n <ExpenseCategory\n key={cat.id}\n category={cat}\n blank={true}\n index={index}\n />\n ))}\n </Card>\n );\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction ExpenseCategoryPreview({ name, pending, style }) {\n return (\n <ListItem\n style={{\n flex: 1,\n borderColor: 'transparent',\n borderRadius: 4,\n }}\n >\n <Text style={styles.smallText}>{name}</Text>\n </ListItem>\n );\n}\n\nconst ExpenseCategory = memo(function ExpenseCategory({\n category,\n index,\n // gestures,\n blank,\n style,\n month,\n editMode,\n isEditing,\n onEdit,\n isEditingBudget,\n onEditBudget,\n onSave,\n onDelete,\n isBudgetActionMenuOpen,\n onOpenBudgetActionMenu,\n onBudgetAction,\n show3Cols,\n showBudgetedCol,\n}) {\n let opacity = blank ? 0 : 1;\n let showEditables = editMode || isEditing;\n\n let [categoryName, setCategoryName] = useState(category.name);\n let [isHidden, setIsHidden] = useState(category.hidden);\n\n let budgeted = rolloverBudget.catBudgeted(category.id);\n let spent = rolloverBudget.catSumAmount(category.id);\n\n let tooltip = useTooltip();\n let balanceTooltip = useTooltip();\n\n useEffect(() => {\n if (isBudgetActionMenuOpen) {\n balanceTooltip.open();\n }\n }, [isBudgetActionMenuOpen, balanceTooltip]);\n\n useEffect(() => {\n if (!isEditing && tooltip.isOpen) {\n tooltip.close();\n }\n }, [isEditing, tooltip]);\n\n let onSubmit = () => {\n if (categoryName) {\n onSave?.({\n ...category,\n name: categoryName,\n });\n } else {\n setCategoryName(category.name);\n }\n onEdit?.(null);\n };\n\n let onMenuSelect = type => {\n onEdit?.(null);\n switch (type) {\n case 'toggle-visibility':\n setIsHidden(!isHidden);\n onSave?.({\n ...category,\n hidden: !isHidden,\n });\n break;\n case 'delete':\n onDelete?.(category.id);\n break;\n default:\n throw new Error(`Unrecognized category menu type: ${type}`);\n }\n };\n\n let listItemRef = useRef();\n let inputRef = useRef();\n\n let content = (\n <ListItem\n style={{\n backgroundColor: isEditingBudget\n ? theme.altTableTextEditing\n : 'transparent',\n borderBottomWidth: 0,\n borderTopWidth: index > 0 ? 1 : 0,\n opacity: isHidden ? 0.5 : undefined,\n ...style,\n }}\n data-testid=\"row\"\n innerRef={listItemRef}\n >\n <View\n style={{\n ...(!showEditables && { display: 'none' }),\n flexDirection: 'row',\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n height: ROW_HEIGHT,\n }}\n >\n <InputWithContent\n focused={isEditing}\n inputRef={inputRef}\n rightContent={\n <>\n <Button\n type=\"bare\"\n style={{ padding: 10 }}\n {...tooltip.getOpenEvents()}\n >\n <DotsHorizontalTriple width={12} height={12} />\n </Button>\n {tooltip.isOpen && (\n <Tooltip\n position=\"bottom-stretch\"\n offset={1}\n style={{ padding: 0 }}\n onClose={() => {\n tooltip.close();\n inputRef.current?.focus();\n }}\n >\n <Menu\n onMenuSelect={onMenuSelect}\n items={[\n {\n name: 'toggle-visibility',\n text: isHidden ? 'Show' : 'Hide',\n },\n {\n name: 'delete',\n text: 'Delete',\n },\n ]}\n />\n </Tooltip>\n )}\n </>\n }\n style={{ width: '100%' }}\n placeholder=\"Category Name\"\n value={categoryName}\n onUpdate={setCategoryName}\n onEnter={onSubmit}\n onBlur={e => {\n if (!listItemRef.current?.contains(e.relatedTarget)) {\n onSubmit();\n }\n }}\n />\n </View>\n <View\n role=\"button\"\n style={{ ...(showEditables && { display: 'none' }), flex: 1 }}\n >\n <Text\n style={{\n ...styles.smallText,\n ...styles.underlinedText,\n ...styles.lineClamp(2),\n }}\n onPointerUp={() => onEdit?.(category.id)}\n data-testid=\"category-name\"\n >\n {category.name}\n </Text>\n </View>\n <View\n style={{\n ...(showEditables && { display: 'none' }),\n justifyContent: 'center',\n alignItems: 'center',\n flexDirection: 'row',\n opacity,\n }}\n >\n <BudgetCell\n name=\"budgeted\"\n binding={budgeted}\n style={{\n ...(!show3Cols && !showBudgetedCol && { display: 'none' }),\n width: 90,\n }}\n textStyle={{ ...styles.smallText, textAlign: 'right' }}\n categoryId={category.id}\n month={month}\n onBudgetAction={onBudgetAction}\n isEditing={isEditingBudget}\n onEdit={onEditBudget}\n />\n <View\n style={{\n ...(!show3Cols && showBudgetedCol && { display: 'none' }),\n justifyContent: 'center',\n alignItems: 'flex-end',\n width: 90,\n height: ROW_HEIGHT,\n }}\n >\n <CellValue\n name=\"spent\"\n binding={spent}\n style={{\n ...styles.smallText,\n textAlign: 'right',\n }}\n getStyle={makeAmountGrey}\n type=\"financial\"\n />\n </View>\n <View\n style={{\n ...styles.noTapHighlight,\n justifyContent: 'center',\n alignItems: 'flex-end',\n width: 90,\n height: ROW_HEIGHT,\n }}\n >\n <span\n role=\"button\"\n onPointerUp={() => onOpenBudgetActionMenu?.(category.id)}\n onPointerDown={e => e.preventDefault()}\n >\n <BalanceWithCarryover\n carryover={rolloverBudget.catCarryover(category.id)}\n balance={rolloverBudget.catBalance(category.id)}\n balanceStyle={{\n ...styles.smallText,\n ...styles.underlinedText,\n }}\n />\n {balanceTooltip.isOpen && (\n <BalanceTooltip\n offset={5}\n categoryId={category.id}\n tooltip={balanceTooltip}\n monthIndex={monthUtils.getMonthIndex(month)}\n onBudgetAction={(monthIndex, action, arg) => {\n onBudgetAction?.(\n monthUtils.getMonthFromIndex(\n monthUtils.getYear(month),\n monthIndex,\n ),\n action,\n arg,\n );\n }}\n onClose={() => {\n onOpenBudgetActionMenu?.(null);\n }}\n />\n )}\n </span>\n </View>\n </View>\n </ListItem>\n );\n\n return <View>{content}</View>;\n\n // <Draggable\n // id={category.id}\n // type=\"category\"\n // preview={({ pending, style }) => (\n // <BudgetCategoryPreview\n // name={category.name}\n // pending={pending}\n // style={style}\n // />\n // )}\n // gestures={gestures}\n // >\n // <Droppable\n // type=\"category\"\n // getActiveStatus={(x, y, { layout }, { id }) => {\n // let pos = (y - layout.y) / layout.height;\n // return pos < 0.5 ? 'top' : 'bottom';\n // }}\n // onDrop={(id, type, droppable, status) =>\n // props.onReorder(id.replace('category:', ''), {\n // aroundCategory: {\n // id: category.id,\n // position: status\n // }\n // })\n // }\n // >\n // {() => content}\n // </Droppable>\n // </Draggable>\n});\n\nconst ExpenseGroupTotals = memo(function ExpenseGroupTotals({\n group,\n editMode,\n isEditing,\n onEdit,\n blank,\n onAddCategory,\n onSave,\n onDelete,\n show3Cols,\n showBudgetedCol,\n}) {\n let opacity = blank ? 0 : 1;\n let showEditables = editMode || isEditing;\n\n let [groupName, setGroupName] = useState(group.name);\n let [isHidden, setIsHidden] = useState(group.hidden);\n\n let tooltip = useTooltip();\n\n useEffect(() => {\n if (!isEditing && tooltip.isOpen) {\n tooltip.close();\n }\n }, [isEditing]);\n\n let onSubmit = () => {\n if (groupName) {\n onSave?.({\n ...group,\n name: groupName,\n });\n } else {\n setGroupName(group.name);\n }\n onEdit?.(null);\n };\n\n let onMenuSelect = type => {\n onEdit?.(null);\n switch (type) {\n case 'add-category':\n onAddCategory?.(group.id, group.is_income);\n break;\n case 'toggle-visibility':\n setIsHidden(!isHidden);\n onSave?.({\n ...group,\n hidden: !isHidden,\n });\n break;\n case 'delete':\n onDelete?.(group.id);\n break;\n default:\n throw new Error(`Unrecognized group menu type: ${type}`);\n }\n };\n\n let listItemRef = useRef();\n let inputRef = useRef();\n\n let content = (\n <ListItem\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: theme.tableRowHeaderBackground,\n opacity: isHidden ? 0.5 : undefined,\n }}\n data-testid=\"totals\"\n innerRef={listItemRef}\n >\n <View\n style={{\n ...(!showEditables && { display: 'none' }),\n flexDirection: 'row',\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n height: ROW_HEIGHT,\n }}\n >\n <InputWithContent\n focused={isEditing}\n inputRef={inputRef}\n rightContent={\n <>\n <Button\n type=\"bare\"\n style={{ padding: 10 }}\n {...tooltip.getOpenEvents()}\n >\n <DotsHorizontalTriple width={12} height={12} />\n </Button>\n {tooltip.isOpen && (\n <Tooltip\n position=\"bottom-stretch\"\n offset={1}\n style={{ padding: 0 }}\n onClose={() => {\n tooltip.close();\n inputRef.current?.focus();\n }}\n >\n <Menu\n onMenuSelect={onMenuSelect}\n items={[\n {\n name: 'add-category',\n text: 'Add category',\n },\n {\n name: 'toggle-visibility',\n text: isHidden ? 'Show' : 'Hide',\n },\n {\n name: 'delete',\n text: 'Delete',\n },\n ]}\n />\n </Tooltip>\n )}\n </>\n }\n style={{ width: '100%' }}\n placeholder=\"Category Group Name\"\n value={groupName}\n onUpdate={setGroupName}\n onEnter={onSubmit}\n onBlur={e => {\n if (!listItemRef.current?.contains(e.relatedTarget)) {\n onSubmit();\n }\n }}\n />\n </View>\n <View\n role=\"button\"\n style={{ ...(showEditables && { display: 'none' }), flex: 1 }}\n >\n <Text\n tabIndex={-1}\n style={{\n ...styles.smallText,\n ...styles.underlinedText,\n ...styles.lineClamp(2),\n fontWeight: '500',\n }}\n onPointerUp={() => onEdit?.(group.id)}\n data-testid=\"name\"\n >\n {group.name}\n </Text>\n </View>\n <View\n style={{\n ...(showEditables && { display: 'none' }),\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n height: ROW_HEIGHT,\n opacity,\n }}\n >\n <View\n style={{\n ...(!show3Cols && !showBudgetedCol && { display: 'none' }),\n width: 90,\n height: ROW_HEIGHT,\n justifyContent: 'center',\n alignItems: 'flex-end',\n }}\n >\n <CellValue\n binding={rolloverBudget.groupBudgeted(group.id)}\n style={{\n ...styles.smallText,\n fontWeight: '500',\n textAlign: 'right',\n }}\n type=\"financial\"\n />\n </View>\n <View\n style={{\n ...(!show3Cols && showBudgetedCol && { display: 'none' }),\n width: 90,\n height: ROW_HEIGHT,\n justifyContent: 'center',\n alignItems: 'flex-end',\n }}\n >\n <CellValue\n binding={rolloverBudget.groupSumAmount(group.id)}\n style={{\n ...styles.smallText,\n fontWeight: '500',\n textAlign: 'right',\n }}\n type=\"financial\"\n />\n </View>\n <View\n style={{\n width: 90,\n height: ROW_HEIGHT,\n justifyContent: 'center',\n alignItems: 'flex-end',\n }}\n >\n <CellValue\n binding={rolloverBudget.groupBalance(group.id)}\n style={{\n ...styles.smallText,\n fontWeight: '500',\n textAlign: 'right',\n }}\n type=\"financial\"\n />\n </View>\n </View>\n\n {/* {editMode && (\n <View>\n <Button\n onClick={() => onAddCategory(group.id, group.is_income)}\n style={{ padding: 10 }}\n >\n <Add width={15} height={15} />\n </Button>\n </View>\n )} */}\n </ListItem>\n );\n\n if (!editMode) {\n return content;\n }\n\n return content;\n // <Droppable\n // type=\"category\"\n // getActiveStatus={(x, y, { layout }, { id }) => {\n // return 'bottom';\n // }}\n // onDrop={(id, type, droppable, status) =>\n // props.onReorderCategory(id, { inGroup: group.id })\n // }\n // >\n // {() => content}\n // </Droppable>\n});\n\nconst IncomeGroupTotals = memo(function IncomeGroupTotals({\n group,\n budget,\n balance,\n style,\n onAddCategory,\n onSave,\n onDelete,\n editMode,\n isEditing,\n onEdit,\n}) {\n let [groupName, setGroupName] = useState(group.name);\n let [isHidden, setIsHidden] = useState(group.hidden);\n let showEditables = editMode || isEditing;\n\n let tooltip = useTooltip();\n\n useEffect(() => {\n if (!isEditing && tooltip.isOpen) {\n tooltip.close();\n }\n }, [isEditing]);\n\n let onSubmit = () => {\n if (groupName) {\n onSave?.({\n ...group,\n name: groupName,\n });\n } else {\n setGroupName(group.name);\n }\n onEdit?.(null);\n };\n\n let onMenuSelect = type => {\n onEdit?.(null);\n switch (type) {\n case 'add-category':\n onAddCategory?.(group.id, group.is_income);\n break;\n case 'toggle-visibility':\n setIsHidden(!isHidden);\n onSave?.({\n ...group,\n hidden: !isHidden,\n });\n break;\n case 'delete':\n onDelete?.(group.id);\n break;\n default:\n throw new Error(`Unrecognized group menu type: ${type}`);\n }\n };\n\n let listItemRef = useRef();\n let inputRef = useRef();\n\n return (\n <ListItem\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n padding: 10,\n backgroundColor: theme.tableRowHeaderBackground,\n opacity: isHidden ? 0.5 : undefined,\n ...style,\n }}\n innerRef={listItemRef}\n >\n <View\n style={{\n ...(!showEditables && { display: 'none' }),\n flexDirection: 'row',\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n height: ROW_HEIGHT,\n }}\n >\n <InputWithContent\n focused={isEditing}\n inputRef={inputRef}\n rightContent={\n <>\n <Button\n type=\"bare\"\n style={{ padding: 10 }}\n {...tooltip.getOpenEvents()}\n >\n <DotsHorizontalTriple width={12} height={12} />\n </Button>\n {tooltip.isOpen && (\n <Tooltip\n position=\"bottom-stretch\"\n offset={1}\n style={{ padding: 0 }}\n onClose={() => {\n tooltip.close();\n inputRef.current?.focus();\n }}\n >\n <Menu\n onMenuSelect={onMenuSelect}\n items={[\n {\n name: 'add-category',\n text: 'Add category',\n },\n {\n name: 'toggle-visibility',\n text: isHidden ? 'Show' : 'Hide',\n },\n {\n name: 'delete',\n text: 'Delete',\n },\n ]}\n />\n </Tooltip>\n )}\n </>\n }\n style={{ width: '100%' }}\n placeholder=\"Category Group Name\"\n value={groupName}\n onUpdate={setGroupName}\n onEnter={onSubmit}\n onBlur={e => {\n if (!listItemRef.current?.contains(e.relatedTarget)) {\n onSubmit();\n }\n }}\n />\n </View>\n <View\n role=\"button\"\n style={{\n ...(showEditables && { display: 'none' }),\n flex: 1,\n justifyContent: 'center',\n alignItems: 'flex-start',\n height: ROW_HEIGHT,\n }}\n >\n <Text\n style={{\n ...styles.smallText,\n ...styles.underlinedText,\n ...styles.lineClamp(2),\n fontWeight: '500',\n }}\n onPointerUp={() => onEdit?.(group.id)}\n data-testid=\"name\"\n >\n {group.name}\n </Text>\n </View>\n {budget && (\n <View\n style={{\n ...(showEditables && { display: 'none' }),\n justifyContent: 'center',\n alignItems: 'flex-end',\n width: 90,\n height: ROW_HEIGHT,\n }}\n >\n <CellValue\n binding={budget}\n style={{\n ...styles.smallText,\n textAlign: 'right',\n fontWeight: '500',\n }}\n type=\"financial\"\n />\n </View>\n )}\n <View\n style={{\n ...(showEditables && { display: 'none' }),\n justifyContent: 'center',\n alignItems: 'flex-end',\n width: 90,\n height: ROW_HEIGHT,\n }}\n >\n <CellValue\n binding={balance}\n style={{\n ...styles.smallText,\n textAlign: 'right',\n fontWeight: '500',\n }}\n type=\"financial\"\n />\n </View>\n </ListItem>\n );\n});\n\nconst IncomeCategory = memo(function IncomeCategory({\n category,\n budget,\n balance,\n style,\n onSave,\n onDelete,\n editMode,\n isEditing,\n onEdit,\n}) {\n let [categoryName, setCategoryName] = useState(category.name);\n let [isHidden, setIsHidden] = useState(category.hidden);\n let showEditables = editMode || isEditing;\n\n let tooltip = useTooltip();\n\n useEffect(() => {\n if (!isEditing && tooltip.isOpen) {\n tooltip.close();\n }\n }, [isEditing]);\n\n let onSubmit = () => {\n if (categoryName) {\n onSave?.({\n ...category,\n name: categoryName,\n });\n } else {\n setCategoryName(category.name);\n }\n onEdit?.(null);\n };\n\n let onMenuSelect = type => {\n onEdit?.(null);\n switch (type) {\n case 'toggle-visibility':\n setIsHidden(!isHidden);\n onSave?.({\n ...category,\n hidden: !isHidden,\n });\n break;\n case 'delete':\n onDelete?.(category.id);\n break;\n default:\n throw new Error(`Unrecognized category menu type: ${type}`);\n }\n };\n\n let listItemRef = useRef();\n let inputRef = useRef();\n\n return (\n <ListItem\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n padding: 10,\n backgroundColor: 'transparent',\n opacity: isHidden ? 0.5 : undefined,\n ...style,\n }}\n innerRef={listItemRef}\n >\n <View\n style={{\n ...(!showEditables && { display: 'none' }),\n flexDirection: 'row',\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n height: ROW_HEIGHT,\n }}\n >\n <InputWithContent\n focused={isEditing}\n inputRef={inputRef}\n rightContent={\n <>\n <Button\n type=\"bare\"\n style={{ padding: 10 }}\n {...tooltip.getOpenEvents()}\n >\n <DotsHorizontalTriple width={12} height={12} />\n </Button>\n {tooltip.isOpen && (\n <Tooltip\n position=\"bottom-stretch\"\n offset={1}\n style={{ padding: 0 }}\n onClose={() => {\n tooltip.close();\n inputRef.current?.focus();\n }}\n >\n <Menu\n onMenuSelect={onMenuSelect}\n items={[\n {\n name: 'toggle-visibility',\n text: isHidden ? 'Show' : 'Hide',\n },\n {\n name: 'delete',\n text: 'Delete',\n },\n ]}\n />\n </Tooltip>\n )}\n </>\n }\n style={{ width: '100%' }}\n placeholder=\"Category Name\"\n value={categoryName}\n onUpdate={setCategoryName}\n onEnter={onSubmit}\n onBlur={e => {\n if (!listItemRef.current?.contains(e.relatedTarget)) {\n onSubmit();\n }\n }}\n />\n </View>\n <View\n role=\"button\"\n style={{\n ...(showEditables && { display: 'none' }),\n flex: 1,\n justifyContent: 'center',\n alignItems: 'flex-start',\n height: ROW_HEIGHT,\n }}\n >\n <Text\n tabIndex={-1}\n style={{\n ...styles.smallText,\n ...styles.underlinedText,\n ...styles.lineClamp(2),\n }}\n onPointerUp={() => onEdit?.(category.id)}\n data-testid=\"name\"\n >\n {category.name}\n </Text>\n </View>\n {budget && (\n <View\n style={{\n ...(showEditables && { display: 'none' }),\n justifyContent: 'center',\n alignItems: 'flex-end',\n width: 90,\n height: ROW_HEIGHT,\n }}\n >\n <CellValue\n binding={budget}\n style={{\n ...styles.smallText,\n textAlign: 'right',\n }}\n type=\"financial\"\n />\n </View>\n )}\n <View\n style={{\n ...(showEditables && { display: 'none' }),\n justifyContent: 'center',\n alignItems: 'flex-end',\n width: 90,\n height: ROW_HEIGHT,\n }}\n >\n <CellValue\n binding={balance}\n style={{\n ...styles.smallText,\n textAlign: 'right',\n }}\n type=\"financial\"\n />\n </View>\n </ListItem>\n );\n});\n\n// export function BudgetAccessoryView() {\n// let emitter = useContext(AmountAccessoryContext);\n\n// return (\n// <View>\n// <View\n// style={{\n// flexDirection: 'row',\n// justifyContent: 'flex-end',\n// alignItems: 'stretch',\n// backgroundColor: colorsm.tableBackground,\n// padding: 5,\n// height: 45\n// }}\n// >\n// <MathOperations emitter={emitter} />\n// <View style={{ flex: 1 }} />\n// <Button\n// onClick={() => emitter.emit('moveUp')}\n// style={{ marginRight: 5 }}\n// data-testid=\"up\"\n// >\n// <ArrowThinUp width={13} height={13} />\n// </Button>\n// <Button\n// onClick={() => emitter.emit('moveDown')}\n// style={{ marginRight: 5 }}\n// data-testid=\"down\"\n// >\n// <ArrowThinDown width={13} height={13} />\n// </Button>\n// <Button onClick={() => emitter.emit('done')} data-testid=\"done\">\n// Done\n// </Button>\n// </View>\n// </View>\n// );\n// }\n\nconst ExpenseGroup = memo(function ExpenseGroup({\n group,\n editMode,\n editingGroupId,\n onEditGroup,\n editingCategoryId,\n onEditCategory,\n editingBudgetCategoryId,\n onEditCategoryBudget,\n openBudgetActionMenuId,\n onOpenBudgetActionMenu,\n // gestures,\n month,\n onSaveCategory,\n onDeleteCategory,\n // onReorderCategory,\n // onReorderGroup,\n onAddCategory,\n onSave,\n onDelete,\n onBudgetAction,\n showBudgetedCol,\n show3Cols,\n showHiddenCategories,\n}) {\n function editable(content) {\n if (!editMode) {\n return content;\n }\n\n return content;\n // <Draggable\n // id={group.id}\n // type=\"group\"\n // preview={({ pending, style }) => (\n // <BudgetGroupPreview group={group} pending={pending} style={style} />\n // )}\n // gestures={gestures}\n // >\n // <Droppable\n // type=\"group\"\n // getActiveStatus={(x, y, { layout }, { id }) => {\n // let pos = (y - layout.y) / layout.height;\n // return pos < 0.5 ? 'top' : 'bottom';\n // }}\n // onDrop={(id, type, droppable, status) => {\n // onReorderGroup(id, group.id, status);\n // }}\n // >\n // {() => content}\n // </Droppable>\n // </Draggable>\n }\n\n return editable(\n <Card\n style={{\n marginTop: 7,\n marginBottom: 7,\n }}\n >\n <ExpenseGroupTotals\n group={group}\n showBudgetedCol={showBudgetedCol}\n budgeted={rolloverBudget.groupBudgeted(group.id)}\n balance={rolloverBudget.groupBalance(group.id)}\n show3Cols={show3Cols}\n editMode={editMode}\n onAddCategory={onAddCategory}\n onSave={onSave}\n onDelete={onDelete}\n isEditing={editingGroupId === group.id}\n onEdit={onEditGroup}\n // onReorderCategory={onReorderCategory}\n />\n\n {group.categories\n .filter(category => !category.hidden || showHiddenCategories)\n .map((category, index) => {\n const isEditingCategory = editingCategoryId === category.id;\n const isEditingCategoryBudget =\n editingBudgetCategoryId === category.id;\n const isBudgetActionMenuOpen = openBudgetActionMenuId === category.id;\n return (\n <ExpenseCategory\n show3Cols={show3Cols}\n key={category.id}\n index={index}\n category={category}\n showBudgetedCol={showBudgetedCol}\n editMode={editMode}\n isEditing={isEditingCategory}\n onEdit={onEditCategory}\n isEditingBudget={isEditingCategoryBudget}\n onEditBudget={onEditCategoryBudget}\n isBudgetActionMenuOpen={isBudgetActionMenuOpen}\n onOpenBudgetActionMenu={onOpenBudgetActionMenu}\n // gestures={gestures}\n month={month}\n onSave={onSaveCategory}\n onDelete={onDeleteCategory}\n // onReorder={onReorderCategory}\n onBudgetAction={onBudgetAction}\n />\n );\n })}\n </Card>,\n );\n});\n\nfunction IncomeGroup({\n type,\n group,\n onSave,\n onDelete,\n onAddCategory,\n onSaveCategory,\n onDeleteCategory,\n showHiddenCategories,\n editMode,\n editingGroupId,\n onEditGroup,\n editingCategoryId,\n onEditCategory,\n}) {\n return (\n <View>\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-end',\n marginTop: 50,\n marginBottom: 5,\n marginRight: 14,\n }}\n >\n {type === 'report' && <Label title=\"BUDGETED\" style={{ width: 90 }} />}\n <Label title=\"RECEIVED\" style={{ width: 90 }} />\n </View>\n\n <Card style={{ marginTop: 0 }}>\n <IncomeGroupTotals\n group={group}\n budget={\n type === 'report' ? reportBudget.groupBudgeted(group.id) : null\n }\n balance={\n type === 'report'\n ? reportBudget.groupSumAmount(group.id)\n : rolloverBudget.groupSumAmount(group.id)\n }\n style={{\n backgroundColor: theme.altTableBackground,\n }}\n onAddCategory={onAddCategory}\n onSave={onSave}\n onDelete={onDelete}\n editMode={editMode}\n isEditing={editingGroupId === group.id}\n onEdit={onEditGroup}\n />\n\n {group.categories\n .filter(category => !category.hidden || showHiddenCategories)\n .map((category, index) => {\n return (\n <IncomeCategory\n key={category.id}\n category={category}\n type={type}\n budget={\n type === 'report'\n ? reportBudget.catBudgeted(category.id)\n : null\n }\n balance={\n type === 'report'\n ? reportBudget.catSumAmount(category.id)\n : rolloverBudget.catSumAmount(category.id)\n }\n index={index}\n onSave={onSaveCategory}\n onDelete={onDeleteCategory}\n editMode={editMode}\n isEditing={editingCategoryId === category.id}\n onEdit={onEditCategory}\n />\n );\n })}\n </Card>\n </View>\n );\n}\n\nfunction BudgetGroups({\n type,\n categoryGroups,\n editingGroupId,\n onEditGroup,\n editingCategoryId,\n onEditCategory,\n editingBudgetCategoryId,\n onEditCategoryBudget,\n openBudgetActionMenuId,\n onOpenBudgetActionMenu,\n editMode,\n gestures,\n month,\n onSaveCategory,\n onDeleteCategory,\n onAddCategory,\n onAddGroup,\n onSaveGroup,\n onDeleteGroup,\n onReorderCategory,\n onReorderGroup,\n onBudgetAction,\n showBudgetedCol,\n show3Cols,\n showHiddenCategories,\n}) {\n const separateGroups = memoizeOne(groups => {\n return {\n incomeGroup: groups.find(group => group.is_income),\n expenseGroups: groups.filter(group => !group.is_income),\n };\n });\n\n const { incomeGroup, expenseGroups } = separateGroups(categoryGroups);\n\n return (\n <View\n data-testid=\"budget-groups\"\n style={{ flex: '1 0 auto', overflowY: 'auto', paddingBottom: 15 }}\n >\n {expenseGroups\n .filter(group => !group.hidden || showHiddenCategories)\n .map(group => {\n return (\n <ExpenseGroup\n key={group.id}\n group={group}\n showBudgetedCol={showBudgetedCol}\n gestures={gestures}\n month={month}\n editMode={editMode}\n editingGroupId={editingGroupId}\n onEditGroup={onEditGroup}\n editingCategoryId={editingCategoryId}\n onEditCategory={onEditCategory}\n editingBudgetCategoryId={editingBudgetCategoryId}\n onEditCategoryBudget={onEditCategoryBudget}\n openBudgetActionMenuId={openBudgetActionMenuId}\n onOpenBudgetActionMenu={onOpenBudgetActionMenu}\n onSaveCategory={onSaveCategory}\n onDeleteCategory={onDeleteCategory}\n onAddCategory={onAddCategory}\n onSave={onSaveGroup}\n onDelete={onDeleteGroup}\n onReorderCategory={onReorderCategory}\n onReorderGroup={onReorderGroup}\n onBudgetAction={onBudgetAction}\n show3Cols={show3Cols}\n showHiddenCategories={showHiddenCategories}\n />\n );\n })}\n\n <View\n style={{\n alignItems: 'flex-start',\n justifyContent: 'flex-start',\n }}\n >\n <Button onPointerUp={onAddGroup} style={{ fontSize: 12, margin: 10 }}>\n Add Group\n </Button>\n </View>\n\n {incomeGroup && (\n <IncomeGroup\n type={type}\n group={incomeGroup}\n onSave={onSaveGroup}\n onDelete={onDeleteGroup}\n onAddCategory={onAddCategory}\n onSaveCategory={onSaveCategory}\n onDeleteCategory={onDeleteCategory}\n showHiddenCategories={showHiddenCategories}\n editMode={editMode}\n editingGroupId={editingGroupId}\n onEditGroup={onEditGroup}\n editingCategoryId={editingCategoryId}\n onEditCategory={onEditCategory}\n />\n )}\n </View>\n );\n}\n\nexport function BudgetTable(props) {\n const {\n type,\n categoryGroups,\n month,\n monthBounds,\n editMode,\n // refreshControl,\n onPrevMonth,\n onNextMonth,\n onSaveGroup,\n onDeleteGroup,\n onAddGroup,\n onAddCategory,\n onSaveCategory,\n onDeleteCategory,\n onEditMode,\n onReorderCategory,\n onReorderGroup,\n onShowBudgetDetails,\n // onOpenActionSheet,\n onBudgetAction,\n savePrefs,\n } = props;\n\n const GROUP_EDIT_ACTION = 'group';\n const [editingGroupId, setEditingGroupId] = useState(null);\n function onEditGroup(id) {\n onEdit(GROUP_EDIT_ACTION, id);\n }\n\n const CATEGORY_EDIT_ACTION = 'category';\n const [editingCategoryId, setEditingCategoryId] = useState(null);\n function onEditCategory(id) {\n onEdit(CATEGORY_EDIT_ACTION, id);\n }\n\n const CATEGORY_BUDGET_EDIT_ACTION = 'category-budget';\n const [editingBudgetCategoryId, setEditingBudgetCategoryId] = useState(null);\n function onEditCategoryBudget(id) {\n onEdit(CATEGORY_BUDGET_EDIT_ACTION, id);\n }\n\n const BUDGET_MENU_OPEN_ACTION = 'budget-menu';\n const [openBudgetActionMenuId, setOpenBudgetActionMenuId] = useState(null);\n function onOpenBudgetActionMenu(id) {\n onEdit(BUDGET_MENU_OPEN_ACTION, id);\n }\n\n function onEdit(action, id) {\n // Do not allow editing if another field is currently being edited.\n // Cancel the currently editing field in that case.\n const currentlyEditing =\n editingGroupId ||\n editingCategoryId ||\n editingBudgetCategoryId ||\n openBudgetActionMenuId;\n\n setEditingGroupId(\n action === GROUP_EDIT_ACTION && !currentlyEditing ? id : null,\n );\n setEditingCategoryId(\n action === CATEGORY_EDIT_ACTION && !currentlyEditing ? id : null,\n );\n setEditingBudgetCategoryId(\n action === CATEGORY_BUDGET_EDIT_ACTION && !currentlyEditing ? id : null,\n );\n setOpenBudgetActionMenuId(\n action === BUDGET_MENU_OPEN_ACTION && !currentlyEditing ? id : null,\n );\n }\n\n const { width } = useResponsive();\n const show3Cols = width >= 360;\n\n // let editMode = false; // neuter editMode -- sorry, not rewriting drag-n-drop right now\n let currentMonth = monthUtils.currentMonth();\n let format = useFormat();\n\n const mobileShowBudgetedColPref = useSelector(state => {\n return state.prefs?.local?.toggleMobileDisplayPref || true;\n });\n\n const showHiddenCategories = useSelector(state => {\n return state.prefs?.local?.['budget.showHiddenCategories'] || false;\n });\n\n let [showBudgetedCol, setShowBudgetedCol] = useState(\n !mobileShowBudgetedColPref &&\n !document.cookie.match(/mobileShowBudgetedColPref=true/),\n );\n\n function toggleDisplay() {\n setShowBudgetedCol(!showBudgetedCol);\n if (!showBudgetedCol) {\n savePrefs({ mobileShowBudgetedColPref: true });\n }\n }\n\n let buttonStyle = {\n padding: 0,\n backgroundColor: 'transparent',\n borderRadius: 'unset',\n };\n\n return (\n <NamespaceContext.Provider value={monthUtils.sheetForMonth(month, type)}>\n <View style={{ flex: 1, overflowY: 'hidden' }} data-testid=\"budget-table\">\n <BudgetHeader\n currentMonth={month}\n toggleDisplay={toggleDisplay}\n monthBounds={monthBounds}\n editMode={editMode}\n onEditMode={onEditMode}\n // onOpenActionSheet={onOpenActionSheet}\n onPrevMonth={onPrevMonth}\n onNextMonth={onNextMonth}\n showHiddenCategories={showHiddenCategories}\n savePrefs={savePrefs}\n />\n <View\n style={{\n flexDirection: 'row',\n flex: '0 0 auto',\n padding: 10,\n paddingRight: 14,\n backgroundColor: 'white',\n borderBottomWidth: 1,\n borderColor: theme.tableBorder,\n }}\n >\n {type === 'report' ? (\n <Saved projected={month >= currentMonth} />\n ) : (\n <ToBudget\n toBudget={rolloverBudget.toBudget}\n onClick={onShowBudgetDetails}\n />\n )}\n <View style={{ flex: 1 }} />\n {(show3Cols || showBudgetedCol) && (\n <Button\n type=\"bare\"\n disabled={show3Cols}\n onClick={toggleDisplay}\n style={{\n ...buttonStyle,\n padding: '0 8px',\n margin: '0 -8px',\n background:\n showBudgetedCol && !show3Cols\n ? `linear-gradient(-45deg, ${theme.formInputBackgroundSelection} 8px, transparent 0)`\n : null,\n }}\n >\n <View\n style={{\n flexBasis: 90,\n width: 90,\n justifyContent: 'center',\n alignItems: 'flex-end',\n }}\n >\n <Label\n title=\"BUDGETED\"\n style={{ color: theme.buttonNormalText }}\n />\n <CellValue\n binding={reportBudget.totalBudgetedExpense}\n type=\"financial\"\n style={{\n ...styles.smallText,\n color: theme.buttonNormalText,\n textAlign: 'right',\n fontWeight: '500',\n }}\n formatter={value => {\n return format(-parseFloat(value || '0'), 'financial');\n }}\n />\n </View>\n </Button>\n )}\n {(show3Cols || !showBudgetedCol) && (\n <Button\n type=\"bare\"\n disabled={show3Cols}\n onClick={toggleDisplay}\n style={{\n ...buttonStyle,\n background:\n !showBudgetedCol && !show3Cols\n ? `linear-gradient(45deg, ${theme.formInputBackgroundSelection} 8px, transparent 0)`\n : null,\n }}\n >\n <View\n style={{\n width: 90,\n justifyContent: 'center',\n alignItems: 'flex-end',\n }}\n >\n <Label title=\"SPENT\" style={{ color: theme.formInputText }} />\n <CellValue\n binding={rolloverBudget.totalSpent}\n type=\"financial\"\n style={{\n ...styles.smallText,\n color: theme.formInputText,\n textAlign: 'right',\n fontWeight: '500',\n }}\n />\n </View>\n </Button>\n )}\n <View\n style={{\n width: 90,\n justifyContent: 'center',\n alignItems: 'flex-end',\n }}\n >\n <Label title=\"BALANCE\" style={{ color: theme.formInputText }} />\n <CellValue\n binding={rolloverBudget.totalBalance}\n type=\"financial\"\n style={{\n ...styles.smallText,\n color: theme.formInputText,\n textAlign: 'right',\n fontWeight: '500',\n }}\n />\n </View>\n </View>\n <View style={{ overflowY: 'auto' }}>\n {!editMode ? (\n // <ScrollView\n // ref={el => (this.list = el)}\n // keyboardShouldPersistTaps=\"always\"\n // refreshControl={refreshControl}\n // style={{ backgroundColor: colors.n10 }}\n // automaticallyAdjustContentInsets={false}\n // >\n <View>\n <BudgetGroups\n type={type}\n categoryGroups={categoryGroups}\n showBudgetedCol={showBudgetedCol}\n show3Cols={show3Cols}\n showHiddenCategories={showHiddenCategories}\n // gestures={gestures}\n month={month}\n editMode={editMode}\n editingGroupId={editingGroupId}\n onEditGroup={onEditGroup}\n editingCategoryId={editingCategoryId}\n onEditCategory={onEditCategory}\n editingBudgetCategoryId={editingBudgetCategoryId}\n onEditCategoryBudget={onEditCategoryBudget}\n openBudgetActionMenuId={openBudgetActionMenuId}\n onOpenBudgetActionMenu={onOpenBudgetActionMenu}\n onSaveCategory={onSaveCategory}\n onDeleteCategory={onDeleteCategory}\n onAddCategory={onAddCategory}\n onAddGroup={onAddGroup}\n onSaveGroup={onSaveGroup}\n onDeleteGroup={onDeleteGroup}\n onReorderCategory={onReorderCategory}\n onReorderGroup={onReorderGroup}\n onBudgetAction={onBudgetAction}\n />\n </View>\n ) : (\n // </ScrollView>\n // <DragDrop>\n // {({\n // dragging,\n // onGestureEvent,\n // onHandlerStateChange,\n // scrollRef,\n // onScroll\n // }) => (\n <View>\n <BudgetGroups\n type={type}\n categoryGroups={categoryGroups}\n showBudgetedCol={showBudgetedCol}\n show3Cols={show3Cols}\n showHiddenCategories={showHiddenCategories}\n // gestures={gestures}\n editMode={editMode}\n editingGroupId={editingGroupId}\n onEditGroup={onEditGroup}\n editingCategoryId={editingCategoryId}\n onEditCategory={onEditCategory}\n editingBudgetCategoryId={editingBudgetCategoryId}\n onEditCategoryBudget={onEditCategoryBudget}\n onSaveCategory={onSaveCategory}\n onDeleteCategory={onDeleteCategory}\n onAddCategory={onAddCategory}\n onAddGroup={onAddGroup}\n onSaveGroup={onSaveGroup}\n onDeleteGroup={onDeleteGroup}\n onReorderCategory={onReorderCategory}\n onReorderGroup={onReorderGroup}\n onBudgetAction={onBudgetAction}\n />\n </View>\n\n // <DragDropHighlight />\n // </DragDrop>\n )}\n </View>\n </View>\n </NamespaceContext.Provider>\n );\n}\n\nconst BUDGET_HEADER_HEIGHT = 50;\n\nfunction BudgetHeader({\n currentMonth,\n monthBounds,\n onPrevMonth,\n onNextMonth,\n editMode,\n onEditMode,\n showHiddenCategories,\n savePrefs,\n}) {\n let serverURL = useServerURL();\n\n let prevEnabled = currentMonth > monthBounds.start;\n let nextEnabled = currentMonth < monthUtils.subMonths(monthBounds.end, 1);\n\n let buttonStyle = {\n paddingLeft: 15,\n paddingRight: 15,\n backgroundColor: 'transparent',\n };\n\n let toggleHiddenCategories = () => {\n savePrefs({\n 'budget.showHiddenCategories': !showHiddenCategories,\n });\n };\n\n let tooltip = useTooltip();\n\n let onMenuSelect = name => {\n tooltip.close();\n switch (name) {\n case 'edit-mode':\n onEditMode?.(true);\n break;\n case 'toggle-hidden-categories':\n toggleHiddenCategories();\n break;\n default:\n throw new Error(`Unrecognized menu option: ${name}`);\n }\n };\n\n return (\n <View\n style={{\n flexDirection: 'row',\n flexShrink: 0,\n height: BUDGET_HEADER_HEIGHT,\n backgroundColor: theme.buttonPrimaryBackground,\n }}\n >\n <View\n style={{\n flexBasis: '25%',\n justifyContent: 'flex-start',\n flexDirection: 'row',\n }}\n >\n {serverURL && (\n <SyncButton\n isMobile\n style={{\n color: 'white',\n backgroundColor: 'transparent',\n paddingLeft: 12,\n paddingRight: 12,\n }}\n />\n )}\n </View>\n <View\n style={{\n flexBasis: '50%',\n justifyContent: 'center',\n alignItems: 'center',\n flexDirection: 'row',\n }}\n >\n <Button\n type=\"bare\"\n // hitSlop={{ top: 5, bottom: 5, left: 0, right: 30 }}\n onClick={prevEnabled && onPrevMonth}\n style={{\n ...buttonStyle,\n opacity: prevEnabled ? 1 : 0.6,\n }}\n >\n <ArrowThinLeft\n style={{ color: theme.formInputTextReadOnlySelection }}\n width=\"15\"\n height=\"15\"\n />\n </Button>\n <Text\n style={{\n ...styles.mediumText,\n color: theme.formInputTextSelected,\n textAlign: 'center',\n // zIndex: -1\n }}\n >\n {/* eslint-disable-next-line rulesdir/typography */}\n {monthUtils.format(currentMonth, \"MMMM ''yy\")}\n </Text>\n <Button\n type=\"bare\"\n onClick={nextEnabled && onNextMonth}\n // hitSlop={{ top: 5, bottom: 5, left: 30, right: 5 }}\n style={{ ...buttonStyle, opacity: nextEnabled ? 1 : 0.6 }}\n >\n <ArrowThinRight\n style={{ color: theme.formInputTextReadOnlySelection }}\n width=\"15\"\n height=\"15\"\n />\n </Button>\n </View>\n <View\n style={{\n flexBasis: '25%',\n justifyContent: 'flex-end',\n flexDirection: 'row',\n }}\n >\n {!editMode ? (\n <>\n <Button\n type=\"bare\"\n style={{\n backgroundColor: 'transparent',\n paddingLeft: 12,\n paddingRight: 12,\n }}\n {...tooltip.getOpenEvents()}\n >\n <DotsHorizontalTriple\n width=\"20\"\n height=\"20\"\n style={{ color: 'white' }}\n />\n </Button>\n {tooltip.isOpen && (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 0 }}\n onClose={tooltip.close}\n >\n <Menu\n onMenuSelect={onMenuSelect}\n items={[\n { name: 'edit-mode', text: 'Edit mode' },\n {\n name: 'toggle-hidden-categories',\n text: 'Toggle hidden categories',\n },\n ]}\n />\n </Tooltip>\n )}\n </>\n ) : (\n <Button\n type=\"bare\"\n style={{\n backgroundColor: 'transparent',\n paddingLeft: 12,\n paddingRight: 12,\n ...styles.mediumText,\n color: 'white',\n }}\n onClick={() => onEditMode?.(false)}\n >\n Done\n </Button>\n )}\n </View>\n </View>\n );\n}\n","import React, { Component } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { useSpreadsheet } from 'loot-core/src/client/SpreadsheetProvider';\nimport { send, listen } from 'loot-core/src/platform/client/fetch';\nimport {\n addCategory,\n addGroup,\n deleteCategory,\n deleteGroup,\n moveCategory,\n moveCategoryGroup,\n updateCategory,\n updateGroup,\n} from 'loot-core/src/shared/categories';\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nimport { useActions } from '../../hooks/useActions';\nimport useCategories from '../../hooks/useCategories';\nimport { useSetThemeColor } from '../../hooks/useSetThemeColor';\nimport AnimatedLoading from '../../icons/AnimatedLoading';\nimport { theme } from '../../style';\nimport View from '../common/View';\nimport SyncRefresh from '../SyncRefresh';\n\nimport { BudgetTable } from './MobileBudgetTable';\n\nclass Budget extends Component {\n constructor(props) {\n super(props);\n\n const currentMonth = monthUtils.currentMonth();\n this.state = {\n bounds: { start: currentMonth, end: currentMonth },\n currentMonth: currentMonth,\n initialized: false,\n editMode: false,\n categoryGroups: [],\n };\n }\n\n async loadCategories() {\n let result = await this.props.getCategories();\n this.setState({ categoryGroups: result.grouped });\n }\n\n async componentDidMount() {\n // let removeBlur = this.props.navigation.addListener('didBlur', () => {\n // this.setState({ editMode: false });\n // });\n\n this.loadCategories();\n\n const { start, end } = await send('get-budget-bounds');\n this.setState({ bounds: { start, end } });\n\n this.prewarmMonth(this.state.currentMonth);\n\n let unlisten = listen('sync-event', ({ type, tables }) => {\n if (\n type === 'success' &&\n (tables.includes('categories') ||\n tables.includes('category_mapping') ||\n tables.includes('category_groups'))\n ) {\n // TODO: is this loading every time?\n this.loadCategories();\n }\n });\n\n this.cleanup = () => {\n // removeBlur();\n unlisten();\n };\n }\n\n componentWillUnmount() {\n this.cleanup?.();\n }\n\n prewarmMonth = async (month, type = null) => {\n type = type || this.props.budgetType;\n\n let method =\n type === 'report' ? 'report-budget-month' : 'rollover-budget-month';\n\n let values = await send(method, { month });\n\n for (let value of values) {\n this.props.spreadsheet.prewarmCache(value.name, value);\n }\n\n if (!this.state.initialized) {\n this.setState({ initialized: true });\n }\n };\n\n onShowBudgetDetails = () => {\n this.props.pushModal('budget-summary', { month: this.state.currentMonth });\n };\n\n onBudgetAction = type => {\n const { currentMonth } = this.state;\n this.props.applyBudgetAction(currentMonth, type, this.state.bounds);\n };\n\n onAddGroup = () => {\n this.props.pushModal('new-category-group', {\n onValidate: name => (!name ? 'Name is required.' : null),\n onSubmit: async name => {\n const id = await this.props.createGroup(name);\n this.setState(state => ({\n categoryGroups: addGroup(state.categoryGroups, {\n id,\n name,\n categories: [],\n is_income: 0,\n }),\n }));\n },\n });\n };\n\n onAddCategory = (groupId, isIncome) => {\n this.props.pushModal('new-category', {\n onValidate: name => (!name ? 'Name is required.' : null),\n onSubmit: async name => {\n const id = await this.props.createCategory(name, groupId, isIncome);\n this.setState(state => ({\n categoryGroups: addCategory(state.categoryGroups, {\n id,\n name,\n cat_group: groupId,\n is_income: isIncome ? 1 : 0,\n }),\n }));\n },\n });\n };\n\n onSaveGroup = group => {\n this.props.updateGroup(group);\n this.setState(state => ({\n categoryGroups: updateGroup(state.categoryGroups, group),\n }));\n };\n\n onDeleteGroup = async groupId => {\n let group = this.state.categoryGroups?.find(g => g.id === groupId);\n\n if (!group) {\n return;\n }\n\n let mustTransfer = false;\n for (let category of group.categories) {\n if (await send('must-category-transfer', { id: category.id })) {\n mustTransfer = true;\n break;\n }\n }\n\n if (mustTransfer) {\n this.props.pushModal('confirm-category-delete', {\n group: groupId,\n onDelete: transferCategory => {\n this.props.deleteGroup(groupId, transferCategory);\n this.setState(state => ({\n categoryGroups: deleteGroup(state.categoryGroups, groupId),\n }));\n },\n });\n } else {\n this.props.deleteGroup(groupId);\n this.setState(state => ({\n categoryGroups: deleteGroup(state.categoryGroups, groupId),\n }));\n }\n };\n\n onSaveCategory = category => {\n this.props.updateCategory(category);\n this.setState(state => ({\n categoryGroups: updateCategory(state.categoryGroups, category),\n }));\n };\n\n onDeleteCategory = async categoryId => {\n const mustTransfer = await send('must-category-transfer', {\n id: categoryId,\n });\n\n if (mustTransfer) {\n this.props.pushModal('confirm-category-delete', {\n category: categoryId,\n onDelete: transferCategory => {\n if (categoryId !== transferCategory) {\n this.props.deleteCategory(categoryId, transferCategory);\n this.setState(state => ({\n categoryGroups: deleteCategory(state.categoryGroups, categoryId),\n }));\n }\n },\n });\n } else {\n this.props.deleteCategory(categoryId);\n this.setState(state => ({\n categoryGroups: deleteCategory(state.categoryGroups, categoryId),\n }));\n }\n };\n\n onReorderCategory = (id, { inGroup, aroundCategory }) => {\n let { categoryGroups } = this.state;\n let groupId, targetId;\n\n if (inGroup) {\n groupId = inGroup;\n } else if (aroundCategory) {\n let { id: catId, position } = aroundCategory;\n\n let group = categoryGroups.find(group =>\n group.categories.find(cat => cat.id === catId),\n );\n\n if (position === 'bottom') {\n let { categories } = group;\n let idx = categories.findIndex(cat => cat.id === catId);\n catId = idx < categories.length - 1 ? categories[idx + 1].id : null;\n }\n\n groupId = group.id;\n targetId = catId;\n }\n\n this.props.moveCategory(id, groupId, targetId);\n\n this.setState({\n categoryGroups: moveCategory(categoryGroups, id, groupId, targetId),\n });\n };\n\n onReorderGroup = (id, targetId, position) => {\n let { categoryGroups } = this.state;\n\n if (position === 'bottom') {\n let idx = categoryGroups.findIndex(group => group.id === targetId);\n targetId =\n idx < categoryGroups.length - 1 ? categoryGroups[idx + 1].id : null;\n }\n\n this.props.moveCategoryGroup(id, targetId);\n\n this.setState({\n categoryGroups: moveCategoryGroup(categoryGroups, id, targetId),\n });\n };\n\n sync = async () => {\n const { updated, error } = await this.props.sync();\n if (error) {\n return 'error';\n } else if (updated) {\n return 'updated';\n }\n return null;\n };\n\n onPrevMonth = async () => {\n let month = monthUtils.subMonths(this.state.currentMonth, 1);\n await this.prewarmMonth(month);\n this.setState({ currentMonth: month });\n };\n\n onNextMonth = async () => {\n let month = monthUtils.addMonths(this.state.currentMonth, 1);\n await this.prewarmMonth(month);\n this.setState({ currentMonth: month });\n };\n\n onOpenActionSheet = () => {\n let { budgetType } = this.props;\n\n let options = [\n 'Edit Categories',\n 'Copy last month’s budget',\n 'Set budgets to zero',\n 'Set budgets to 3 month average',\n budgetType === 'report' && 'Apply to all future budgets',\n 'Cancel',\n ].filter(Boolean);\n\n this.props.showActionSheetWithOptions(\n {\n options,\n cancelButtonIndex: options.length - 1,\n title: 'Actions',\n },\n idx => {\n switch (idx) {\n case 0:\n this.setState({ editMode: true });\n break;\n case 1:\n this.onBudgetAction('copy-last');\n break;\n case 2:\n this.onBudgetAction('set-zero');\n break;\n case 3:\n this.onBudgetAction('set-3-avg');\n break;\n case 4:\n if (budgetType === 'report') {\n this.onBudgetAction('set-all-future');\n }\n break;\n default:\n }\n },\n );\n };\n\n render() {\n const { currentMonth, bounds, editMode, initialized } = this.state;\n const {\n categories,\n categoryGroups,\n prefs,\n savePrefs,\n budgetType,\n navigation,\n applyBudgetAction,\n } = this.props;\n let numberFormat = prefs.numberFormat || 'comma-dot';\n let hideFraction = prefs.hideFraction || false;\n\n if (!categoryGroups || !initialized) {\n return (\n <View\n style={{\n flex: 1,\n backgroundColor: theme.pageBackgroundLineTop,\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 25,\n }}\n >\n <AnimatedLoading width={25} height={25} />\n </View>\n );\n }\n\n return (\n <SyncRefresh onSync={this.sync}>\n {({ refreshing, onRefresh }) => (\n <BudgetTable\n // This key forces the whole table rerender when the number\n // format changes\n key={numberFormat + hideFraction}\n categories={categories}\n categoryGroups={categoryGroups}\n type={budgetType}\n month={currentMonth}\n monthBounds={bounds}\n navigation={navigation}\n // refreshControl={\n // <RefreshControl refreshing={refreshing} onRefresh={onRefresh} />\n // }\n editMode={editMode}\n onEditMode={flag => this.setState({ editMode: flag })}\n onShowBudgetDetails={this.onShowBudgetDetails}\n onPrevMonth={this.onPrevMonth}\n onNextMonth={this.onNextMonth}\n onSaveGroup={this.onSaveGroup}\n onDeleteGroup={this.onDeleteGroup}\n onAddGroup={this.onAddGroup}\n onAddCategory={this.onAddCategory}\n onSaveCategory={this.onSaveCategory}\n onDeleteCategory={this.onDeleteCategory}\n onReorderCategory={this.onReorderCategory}\n onReorderGroup={this.onReorderGroup}\n onOpenActionSheet={() => {}} //this.onOpenActionSheet}\n onBudgetAction={applyBudgetAction}\n savePrefs={savePrefs}\n />\n )}\n </SyncRefresh>\n );\n }\n}\n\nexport default function BudgetWrapper() {\n let { list: categories, grouped: categoryGroups } = useCategories();\n let budgetType = useSelector(\n state => state.prefs.local.budgetType || 'rollover',\n );\n let prefs = useSelector(state => state.prefs.local);\n\n let actions = useActions();\n let spreadsheet = useSpreadsheet();\n useSetThemeColor(theme.mobileBudgetViewTheme);\n return (\n <Budget\n categoryGroups={categoryGroups}\n categories={categories}\n budgetType={budgetType}\n prefs={prefs}\n {...actions}\n spreadsheet={spreadsheet}\n />\n );\n}\n","import React, { useRef, useEffect } from 'react';\n\nvar DIRECTION;\r\n(function (DIRECTION) {\r\n DIRECTION[DIRECTION[\"UP\"] = -1] = \"UP\";\r\n DIRECTION[DIRECTION[\"DOWN\"] = 1] = \"DOWN\";\r\n})(DIRECTION || (DIRECTION = {}));\n\nfunction isOverflowScrollable(element) {\r\n var overflowType = getComputedStyle(element).overflowY;\r\n if (element === document.scrollingElement && overflowType === 'visible') {\r\n return true;\r\n }\r\n if (overflowType !== 'scroll' && overflowType !== 'auto') {\r\n return false;\r\n }\r\n return true;\r\n}\r\nfunction isScrollable(element, direction) {\r\n if (!isOverflowScrollable(element)) {\r\n return false;\r\n }\r\n if (direction === DIRECTION.DOWN) {\r\n var bottomScroll = element.scrollTop + element.clientHeight;\r\n return bottomScroll < element.scrollHeight;\r\n }\r\n if (direction === DIRECTION.UP) {\r\n return element.scrollTop > 0;\r\n }\r\n throw new Error('unsupported direction');\r\n}\r\n/**\r\n * Returns whether a given element or any of its ancestors (up to rootElement) is scrollable in a given direction.\r\n */\r\nfunction isTreeScrollable(element, direction) {\r\n if (isScrollable(element, direction)) {\r\n return true;\r\n }\r\n if (element.parentElement == null) {\r\n return false;\r\n }\r\n return isTreeScrollable(element.parentElement, direction);\r\n}\n\nfunction styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nvar css = \".lds-ellipsis {\\n display: inline-block;\\n position: relative;\\n width: 64px;\\n height: 64px; }\\n\\n.lds-ellipsis div {\\n position: absolute;\\n top: 27px;\\n width: 11px;\\n height: 11px;\\n border-radius: 50%;\\n background: #363636;\\n animation-timing-function: cubic-bezier(0, 1, 1, 0); }\\n\\n.lds-ellipsis div:nth-child(1) {\\n left: 6px;\\n animation: lds-ellipsis1 0.6s infinite; }\\n\\n.lds-ellipsis div:nth-child(2) {\\n left: 6px;\\n animation: lds-ellipsis2 0.6s infinite; }\\n\\n.lds-ellipsis div:nth-child(3) {\\n left: 26px;\\n animation: lds-ellipsis2 0.6s infinite; }\\n\\n.lds-ellipsis div:nth-child(4) {\\n left: 45px;\\n animation: lds-ellipsis3 0.6s infinite; }\\n\\n@keyframes lds-ellipsis1 {\\n 0% {\\n transform: scale(0); }\\n 100% {\\n transform: scale(1); } }\\n\\n@keyframes lds-ellipsis3 {\\n 0% {\\n transform: scale(1); }\\n 100% {\\n transform: scale(0); } }\\n\\n@keyframes lds-ellipsis2 {\\n 0% {\\n transform: translate(0, 0); }\\n 100% {\\n transform: translate(19px, 0); } }\\n\";\nstyleInject(css);\n\n// Source: https://loading.io/css/\r\nvar RefreshingContent = function () {\r\n return (React.createElement(\"div\", { className: \"lds-ellipsis\" },\r\n React.createElement(\"div\", null),\r\n React.createElement(\"div\", null),\r\n React.createElement(\"div\", null),\r\n React.createElement(\"div\", null)));\r\n};\n\nvar PullingContent = function () {\r\n return (React.createElement(\"div\", null,\r\n React.createElement(\"p\", null, \"\\u21A7\\u00A0\\u00A0pull to refresh\\u00A0\\u00A0\\u21A7\")));\r\n};\n\nvar css$1 = \".ptr,\\n.ptr__children {\\n height: 100%;\\n width: 100%;\\n overflow: hidden;\\n -webkit-overflow-scrolling: touch;\\n position: relative; }\\n\\n.ptr.ptr--fetch-more-treshold-breached .ptr__fetch-more {\\n display: block; }\\n\\n.ptr__fetch-more {\\n display: none; }\\n\\n/**\\n * Pull down transition \\n */\\n.ptr__children,\\n.ptr__pull-down {\\n transition: transform 0.2s cubic-bezier(0, 0, 0.31, 1); }\\n\\n.ptr__pull-down {\\n position: absolute;\\n overflow: hidden;\\n left: 0;\\n right: 0;\\n top: 0;\\n visibility: hidden; }\\n .ptr__pull-down > div {\\n display: none; }\\n\\n.ptr--dragging {\\n /**\\n * Hide PullMore content is treshold breached\\n */\\n /**\\n * Otherwize, display content\\n */ }\\n .ptr--dragging.ptr--pull-down-treshold-breached .ptr__pull-down--pull-more {\\n display: none; }\\n .ptr--dragging .ptr__pull-down--pull-more {\\n display: block; }\\n\\n.ptr--pull-down-treshold-breached {\\n /**\\n * Force opacity to 1 is pull down trashold breached\\n */\\n /**\\n * And display loader\\n */ }\\n .ptr--pull-down-treshold-breached .ptr__pull-down {\\n opacity: 1 !important; }\\n .ptr--pull-down-treshold-breached .ptr__pull-down--loading {\\n display: block; }\\n\\n.ptr__loader {\\n margin: 0 auto;\\n text-align: center; }\\n\";\nstyleInject(css$1);\n\nvar PullToRefresh = function (_a) {\r\n var _b = _a.isPullable, isPullable = _b === void 0 ? true : _b, _c = _a.canFetchMore, canFetchMore = _c === void 0 ? false : _c, onRefresh = _a.onRefresh, onFetchMore = _a.onFetchMore, _d = _a.refreshingContent, refreshingContent = _d === void 0 ? React.createElement(RefreshingContent, null) : _d, _e = _a.pullingContent, pullingContent = _e === void 0 ? React.createElement(PullingContent, null) : _e, children = _a.children, _f = _a.pullDownThreshold, pullDownThreshold = _f === void 0 ? 67 : _f, _g = _a.fetchMoreThreshold, fetchMoreThreshold = _g === void 0 ? 100 : _g, _h = _a.maxPullDownDistance, maxPullDownDistance = _h === void 0 ? 95 : _h, // max distance to scroll to trigger refresh\r\n _j = _a.resistance, // max distance to scroll to trigger refresh\r\n resistance = _j === void 0 ? 1 : _j, backgroundColor = _a.backgroundColor, _k = _a.className, className = _k === void 0 ? '' : _k;\r\n var containerRef = useRef(null);\r\n var childrenRef = useRef(null);\r\n var pullDownRef = useRef(null);\r\n var fetchMoreRef = useRef(null);\r\n var pullToRefreshThresholdBreached = false;\r\n var fetchMoreTresholdBreached = false; // if true, fetchMore loader is displayed\r\n var isDragging = false;\r\n var startY = 0;\r\n var currentY = 0;\r\n useEffect(function () {\r\n if (!isPullable || !childrenRef || !childrenRef.current)\r\n return;\r\n var childrenEl = childrenRef.current;\r\n childrenEl.addEventListener('touchstart', onTouchStart, { passive: true });\r\n childrenEl.addEventListener('mousedown', onTouchStart);\r\n childrenEl.addEventListener('touchmove', onTouchMove, { passive: false });\r\n childrenEl.addEventListener('mousemove', onTouchMove);\r\n window.addEventListener('scroll', onScroll);\r\n childrenEl.addEventListener('touchend', onEnd);\r\n childrenEl.addEventListener('mouseup', onEnd);\r\n document.body.addEventListener('mouseleave', onEnd);\r\n return function () {\r\n childrenEl.removeEventListener('touchstart', onTouchStart);\r\n childrenEl.removeEventListener('mousedown', onTouchStart);\r\n childrenEl.removeEventListener('touchmove', onTouchMove);\r\n childrenEl.removeEventListener('mousemove', onTouchMove);\r\n window.removeEventListener('scroll', onScroll);\r\n childrenEl.removeEventListener('touchend', onEnd);\r\n childrenEl.removeEventListener('mouseup', onEnd);\r\n document.body.removeEventListener('mouseleave', onEnd);\r\n };\r\n }, [\r\n children,\r\n isPullable,\r\n onRefresh,\r\n pullDownThreshold,\r\n maxPullDownDistance,\r\n canFetchMore,\r\n fetchMoreThreshold,\r\n ]);\r\n /**\r\n * Check onMount / canFetchMore becomes true\r\n * if fetchMoreThreshold is already breached\r\n */\r\n useEffect(function () {\r\n var _a;\r\n /**\r\n * Check if it is already in fetching more state\r\n */\r\n if (!((_a = containerRef) === null || _a === void 0 ? void 0 : _a.current))\r\n return;\r\n var isAlreadyFetchingMore = containerRef.current.classList.contains('ptr--fetch-more-treshold-breached');\r\n if (isAlreadyFetchingMore)\r\n return;\r\n /**\r\n * Proceed\r\n */\r\n if (canFetchMore && getScrollToBottomValue() < fetchMoreThreshold && onFetchMore) {\r\n containerRef.current.classList.add('ptr--fetch-more-treshold-breached');\r\n fetchMoreTresholdBreached = true;\r\n onFetchMore().then(initContainer).catch(initContainer);\r\n }\r\n }, [canFetchMore, children]);\r\n /**\r\n * Returns distance to bottom of the container\r\n */\r\n var getScrollToBottomValue = function () {\r\n if (!childrenRef || !childrenRef.current)\r\n return -1;\r\n var scrollTop = window.scrollY; // is the pixels hidden in top due to the scroll. With no scroll its value is 0.\r\n var scrollHeight = childrenRef.current.scrollHeight; // is the pixels of the whole container\r\n return scrollHeight - scrollTop - window.innerHeight;\r\n };\r\n var initContainer = function () {\r\n requestAnimationFrame(function () {\r\n /**\r\n * Reset Styles\r\n */\r\n if (childrenRef.current) {\r\n childrenRef.current.style.overflowX = 'hidden';\r\n childrenRef.current.style.overflowY = 'auto';\r\n childrenRef.current.style.transform = \"unset\";\r\n }\r\n if (pullDownRef.current) {\r\n pullDownRef.current.style.opacity = '0';\r\n }\r\n if (containerRef.current) {\r\n containerRef.current.classList.remove('ptr--pull-down-treshold-breached');\r\n containerRef.current.classList.remove('ptr--dragging');\r\n containerRef.current.classList.remove('ptr--fetch-more-treshold-breached');\r\n }\r\n if (pullToRefreshThresholdBreached)\r\n pullToRefreshThresholdBreached = false;\r\n if (fetchMoreTresholdBreached)\r\n fetchMoreTresholdBreached = false;\r\n });\r\n };\r\n var onTouchStart = function (e) {\r\n isDragging = false;\r\n if (e instanceof MouseEvent) {\r\n startY = e.pageY;\r\n }\r\n if (window.TouchEvent && e instanceof TouchEvent) {\r\n startY = e.touches[0].pageY;\r\n }\r\n currentY = startY;\r\n // Check if element can be scrolled\r\n if (e.type === 'touchstart' && isTreeScrollable(e.target, DIRECTION.UP)) {\r\n return;\r\n }\r\n // Top non visible so cancel\r\n if (childrenRef.current.getBoundingClientRect().top < 0) {\r\n return;\r\n }\r\n isDragging = true;\r\n };\r\n var onTouchMove = function (e) {\r\n if (!isDragging) {\r\n return;\r\n }\r\n if (window.TouchEvent && e instanceof TouchEvent) {\r\n currentY = e.touches[0].pageY;\r\n }\r\n else {\r\n currentY = e.pageY;\r\n }\r\n containerRef.current.classList.add('ptr--dragging');\r\n if (currentY < startY) {\r\n isDragging = false;\r\n return;\r\n }\r\n if (e.cancelable) {\r\n e.preventDefault();\r\n }\r\n var yDistanceMoved = Math.min((currentY - startY) / resistance, maxPullDownDistance);\r\n // Limit to trigger refresh has been breached\r\n if (yDistanceMoved >= pullDownThreshold) {\r\n isDragging = true;\r\n pullToRefreshThresholdBreached = true;\r\n containerRef.current.classList.remove('ptr--dragging');\r\n containerRef.current.classList.add('ptr--pull-down-treshold-breached');\r\n }\r\n // maxPullDownDistance breached, stop the animation\r\n if (yDistanceMoved >= maxPullDownDistance) {\r\n return;\r\n }\r\n pullDownRef.current.style.opacity = ((yDistanceMoved) / 65).toString();\r\n childrenRef.current.style.overflow = 'visible';\r\n childrenRef.current.style.transform = \"translate(0px, \" + yDistanceMoved + \"px)\";\r\n pullDownRef.current.style.visibility = 'visible';\r\n };\r\n var onScroll = function (e) {\r\n /**\r\n * Check if component has already called onFetchMore\r\n */\r\n if (fetchMoreTresholdBreached)\r\n return;\r\n /**\r\n * Check if user breached fetchMoreThreshold\r\n */\r\n if (canFetchMore && getScrollToBottomValue() < fetchMoreThreshold && onFetchMore) {\r\n fetchMoreTresholdBreached = true;\r\n containerRef.current.classList.add('ptr--fetch-more-treshold-breached');\r\n onFetchMore().then(initContainer).catch(initContainer);\r\n }\r\n };\r\n var onEnd = function () {\r\n isDragging = false;\r\n startY = 0;\r\n currentY = 0;\r\n // Container has not been dragged enough, put it back to it's initial state\r\n if (!pullToRefreshThresholdBreached) {\r\n if (pullDownRef.current)\r\n pullDownRef.current.style.visibility = 'hidden';\r\n initContainer();\r\n return;\r\n }\r\n if (childrenRef.current) {\r\n childrenRef.current.style.overflow = 'visible';\r\n childrenRef.current.style.transform = \"translate(0px, \" + pullDownThreshold + \"px)\";\r\n }\r\n onRefresh().then(initContainer).catch(initContainer);\r\n };\r\n return (React.createElement(\"div\", { className: \"ptr \" + className, style: { backgroundColor: backgroundColor }, ref: containerRef },\r\n React.createElement(\"div\", { className: \"ptr__pull-down\", ref: pullDownRef },\r\n React.createElement(\"div\", { className: \"ptr__loader ptr__pull-down--loading\" }, refreshingContent),\r\n React.createElement(\"div\", { className: \"ptr__pull-down--pull-more\" }, pullingContent)),\r\n React.createElement(\"div\", { className: \"ptr__children\", ref: childrenRef },\r\n children,\r\n React.createElement(\"div\", { className: \"ptr__fetch-more\", ref: fetchMoreRef },\r\n React.createElement(\"div\", { className: \"ptr__loader ptr__fetch-more--loading\" }, refreshingContent)))));\r\n};\n\nexport default PullToRefresh;\n","import React, { type ComponentProps } from 'react';\nimport BasePullToRefresh from 'react-simple-pull-to-refresh';\n\nimport { css } from 'glamor';\n\ntype PullToRefreshProps = ComponentProps<typeof BasePullToRefresh>;\n\nexport default function PullToRefresh(props: PullToRefreshProps) {\n return (\n <div style={{ overflow: 'auto' }}>\n <BasePullToRefresh\n pullDownThreshold={80}\n resistance={2}\n className={String(\n css({\n '& .ptr__pull-down': {\n textAlign: 'center',\n },\n '& .ptr__children': {\n overflow: 'hidden auto',\n },\n }),\n )}\n {...props}\n />\n </div>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport * as queries from 'loot-core/src/client/queries';\n\nimport { useActions } from '../../hooks/useActions';\nimport useCategories from '../../hooks/useCategories';\nimport useNavigate from '../../hooks/useNavigate';\nimport { useSetThemeColor } from '../../hooks/useSetThemeColor';\nimport { theme, styles } from '../../style';\nimport Button from '../common/Button';\nimport Text from '../common/Text';\nimport TextOneLine from '../common/TextOneLine';\nimport View from '../common/View';\nimport { Page } from '../Page';\nimport PullToRefresh from '../responsive/PullToRefresh';\nimport CellValue from '../spreadsheet/CellValue';\n\nfunction AccountHeader({ name, amount, style = {} }) {\n return (\n <View\n style={{\n flex: '1 0 auto',\n flexDirection: 'row',\n marginTop: 10,\n color: theme.pageTextLight,\n ...style,\n }}\n >\n <View style={{ flex: 1 }}>\n <Text\n style={{\n ...styles.text,\n textTransform: 'uppercase',\n fontSize: 13,\n }}\n data-testid=\"name\"\n >\n {name}\n </Text>\n </View>\n <CellValue\n binding={amount}\n style={{ ...styles.text, fontSize: 13 }}\n type=\"financial\"\n />\n </View>\n );\n}\n\nfunction AccountCard({ account, updated, getBalanceQuery, onSelect }) {\n return (\n <View\n style={{\n flex: '1 0 auto',\n flexDirection: 'row',\n backgroundColor: theme.tableBackground,\n boxShadow: `0 1px 1px ${theme.mobileAccountShadow}`,\n borderRadius: 6,\n marginTop: 10,\n }}\n data-testid=\"account\"\n >\n <Button\n onMouseDown={() => onSelect(account.id)}\n style={{\n flexDirection: 'row',\n flex: 1,\n alignItems: 'center',\n borderRadius: 6,\n '&:active': {\n opacity: 0.1,\n },\n }}\n >\n <View\n style={{\n flex: '1 auto',\n margin: '10px 0',\n }}\n >\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n }}\n >\n <TextOneLine\n style={{\n ...styles.text,\n fontSize: 17,\n fontWeight: 600,\n color: updated ? theme.mobileAccountText : theme.pillText,\n paddingRight: 30,\n }}\n data-testid=\"account-name\"\n >\n {account.name}\n </TextOneLine>\n {account.bankId && (\n <View\n style={{\n backgroundColor: theme.noticeBackgroundDark,\n marginLeft: '-23px',\n width: 8,\n height: 8,\n borderRadius: 8,\n }}\n />\n )}\n </View>\n </View>\n <CellValue\n binding={getBalanceQuery(account)}\n type=\"financial\"\n style={{ fontSize: 16, color: 'inherit' }}\n getStyle={value => value < 0 && { color: 'inherit' }}\n data-testid=\"account-balance\"\n />\n </Button>\n </View>\n );\n}\n\nfunction EmptyMessage({ onAdd }) {\n return (\n <View style={{ flex: 1, padding: 30 }}>\n <Text style={styles.text}>\n For Actual to be useful, you need to add an account. You can link an\n account to automatically download transactions, or manage it locally\n yourself.\n </Text>\n\n <Button\n type=\"primary\"\n style={{ marginTop: 20, alignSelf: 'center' }}\n onClick={() =>\n alert(\n 'Account creation is not supported on mobile on the self-hosted service yet',\n )\n }\n >\n Add Account\n </Button>\n\n <Text style={{ marginTop: 20, color: theme.pageTextLight }}>\n In the future, you can add accounts using the add button in the header.\n </Text>\n </View>\n );\n}\n\nfunction AccountList({\n accounts,\n updatedAccounts,\n getBalanceQuery,\n getOnBudgetBalance,\n getOffBudgetBalance,\n onAddAccount,\n onSelectAccount,\n}) {\n const { syncAndDownload } = useActions();\n\n const budgetedAccounts = accounts.filter(account => account.offbudget === 0);\n const offbudgetAccounts = accounts.filter(account => account.offbudget === 1);\n\n // If there are no accounts, show a helpful message\n if (accounts.length === 0) {\n return <EmptyMessage onAdd={onAddAccount} />;\n }\n\n return (\n <View style={{ flex: 1 }}>\n <Page title=\"Accounts\">\n <PullToRefresh onRefresh={syncAndDownload}>\n <AccountHeader name=\"For Budget\" amount={getOnBudgetBalance()} />\n {budgetedAccounts.map(acct => (\n <AccountCard\n account={acct}\n key={acct.id}\n updated={updatedAccounts.includes(acct.id)}\n getBalanceQuery={getBalanceQuery}\n onSelect={onSelectAccount}\n />\n ))}\n\n <AccountHeader\n name=\"Off budget\"\n amount={getOffBudgetBalance()}\n style={{ marginTop: 30 }}\n />\n {offbudgetAccounts.map(acct => (\n <AccountCard\n account={acct}\n key={acct.id}\n updated={updatedAccounts.includes(acct.id)}\n getBalanceQuery={getBalanceQuery}\n onSelect={onSelectAccount}\n />\n ))}\n </PullToRefresh>\n </Page>\n </View>\n );\n}\n\nexport default function Accounts() {\n let accounts = useSelector(state => state.queries.accounts);\n let newTransactions = useSelector(state => state.queries.newTransactions);\n let updatedAccounts = useSelector(state => state.queries.updatedAccounts);\n let numberFormat = useSelector(\n state => state.prefs.local.numberFormat || 'comma-dot',\n );\n let hideFraction = useSelector(\n state => state.prefs.local.hideFraction || false,\n );\n\n const { list: categories } = useCategories();\n let { getAccounts } = useActions();\n\n const transactions = useState({});\n const navigate = useNavigate();\n\n useEffect(() => {\n (async () => getAccounts())();\n }, []);\n\n const onSelectAccount = id => {\n navigate(`/accounts/${id}`);\n };\n\n const onSelectTransaction = transaction => {\n navigate(`/transaction/${transaction}`);\n };\n\n useSetThemeColor(theme.mobileAccountsViewTheme);\n\n return (\n <View style={{ flex: 1 }}>\n <AccountList\n // This key forces the whole table rerender when the number\n // format changes\n key={numberFormat + hideFraction}\n accounts={accounts.filter(account => !account.closed)}\n categories={categories}\n transactions={transactions || []}\n updatedAccounts={updatedAccounts}\n newTransactions={newTransactions}\n getBalanceQuery={queries.accountBalance}\n getOnBudgetBalance={queries.budgetedAccountBalance}\n getOffBudgetBalance={queries.offbudgetAccountBalance}\n onAddAccount={() => {}} // () => navigate('AddAccountModal')\n onSelectAccount={onSelectAccount}\n onSelectTransaction={onSelectTransaction}\n />\n </View>\n );\n}\n","import React, { useState, useMemo } from 'react';\nimport { Link } from 'react-router-dom';\n\nimport { useActions } from '../../hooks/useActions';\nimport Add from '../../icons/v1/Add';\nimport CheveronLeft from '../../icons/v1/CheveronLeft';\nimport SearchAlternate from '../../icons/v2/SearchAlternate';\nimport { theme, styles } from '../../style';\nimport ButtonLink from '../common/ButtonLink';\nimport InputWithContent from '../common/InputWithContent';\nimport Label from '../common/Label';\nimport Text from '../common/Text';\nimport View from '../common/View';\nimport PullToRefresh from '../responsive/PullToRefresh';\nimport CellValue from '../spreadsheet/CellValue';\nimport { TransactionList } from '../transactions/MobileTransaction';\n\nfunction TransactionSearchInput({ accountName, onSearch }) {\n const [text, setText] = useState('');\n\n return (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: theme.tableHeaderBackground,\n margin: '11px auto 4px',\n borderRadius: 4,\n padding: 10,\n width: '100%',\n }}\n >\n <InputWithContent\n leftContent={\n <SearchAlternate\n style={{\n width: 13,\n height: 13,\n flexShrink: 0,\n color: text ? theme.formInputTextHighlight : 'inherit',\n margin: 5,\n marginRight: 0,\n }}\n />\n }\n value={text}\n onUpdate={text => {\n setText(text);\n onSearch(text);\n }}\n placeholder={`Search ${accountName}`}\n style={{\n backgroundColor: theme.formInputBackground,\n border: `1px solid ${theme.formInputBorder}`,\n fontSize: 15,\n flex: 1,\n height: 32,\n marginLeft: 4,\n padding: 8,\n }}\n />\n </View>\n );\n}\n\nconst LEFT_RIGHT_FLEX_WIDTH = 70;\nexport default function AccountDetails({\n account,\n prependTransactions,\n transactions,\n accounts,\n categories,\n payees,\n balance,\n isNewTransaction,\n onLoadMore,\n onSearch,\n onSelectTransaction,\n pushModal,\n}) {\n let allTransactions = useMemo(() => {\n return prependTransactions.concat(transactions);\n }, [prependTransactions, transactions]);\n\n const { syncAndDownload } = useActions();\n const onRefresh = async () => {\n await syncAndDownload(account.id);\n };\n\n return (\n <View\n style={{\n flex: 1,\n backgroundColor: theme.tableHeaderBackground,\n overflowY: 'hidden',\n width: '100%',\n }}\n >\n <View\n style={{\n alignItems: 'center',\n flexShrink: 0,\n overflowY: 'hidden',\n paddingTop: 10,\n top: 0,\n width: '100%',\n }}\n >\n <View\n style={{\n alignItems: 'center',\n flexDirection: 'row',\n justifyContent: 'space-between',\n width: '100%',\n }}\n >\n <Link\n to={-1}\n style={{\n color: theme.formLabelText,\n alignItems: 'center',\n display: 'flex',\n textDecoration: 'none',\n width: LEFT_RIGHT_FLEX_WIDTH,\n }}\n >\n <CheveronLeft style={{ width: 32, height: 32 }} />\n <Text style={{ ...styles.text, fontWeight: 500 }}>Back</Text>\n </Link>\n <View\n style={{\n fontSize: 16,\n fontWeight: 500,\n }}\n role=\"heading\"\n >\n {account.name}\n </View>\n\n <ButtonLink\n to=\"transactions/new\"\n type=\"bare\"\n aria-label=\"Add Transaction\"\n style={{ justifyContent: 'center', width: LEFT_RIGHT_FLEX_WIDTH }}\n hoveredStyle={{ background: 'transparent' }}\n activeStyle={{ background: 'transparent' }}\n >\n <Add width={20} height={20} />\n </ButtonLink>\n </View>\n <Label title=\"BALANCE\" style={{ marginTop: 10 }} />\n <CellValue\n binding={balance}\n type=\"financial\"\n debug={true}\n style={{\n fontSize: 18,\n fontWeight: '500',\n }}\n getStyle={value => ({\n color: value < 0 ? theme.errorText : theme.pillTextHighlighted,\n })}\n data-testid=\"account-balance\"\n />\n <TransactionSearchInput\n accountName={account.name}\n onSearch={onSearch}\n />\n </View>\n\n <PullToRefresh onRefresh={onRefresh}>\n <TransactionList\n transactions={allTransactions}\n categories={categories}\n accounts={accounts}\n payees={payees}\n showCategory={!account.offbudget}\n isNew={isNewTransaction}\n onLoadMore={onLoadMore}\n onSelect={onSelectTransaction}\n pushModal={pushModal}\n />\n </PullToRefresh>\n </View>\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useParams } from 'react-router-dom';\n\nimport debounce from 'debounce';\nimport memoizeOne from 'memoize-one';\nimport { bindActionCreators } from 'redux';\n\nimport * as actions from 'loot-core/src/client/actions';\nimport {\n SchedulesProvider,\n useCachedSchedules,\n} from 'loot-core/src/client/data-hooks/schedules';\nimport * as queries from 'loot-core/src/client/queries';\nimport { pagedQuery } from 'loot-core/src/client/query-helpers';\nimport { listen } from 'loot-core/src/platform/client/fetch';\nimport {\n isPreviewId,\n ungroupTransactions,\n} from 'loot-core/src/shared/transactions';\n\nimport useCategories from '../../hooks/useCategories';\nimport useNavigate from '../../hooks/useNavigate';\nimport { useSetThemeColor } from '../../hooks/useSetThemeColor';\nimport { theme } from '../../style';\n\nimport AccountDetails from './MobileAccountDetails';\n\nconst getSchedulesTransform = memoizeOne((id, hasSearch) => {\n let filter = queries.getAccountFilter(id, '_account');\n\n // Never show schedules on these pages\n if (hasSearch) {\n filter = { id: null };\n }\n\n return q => {\n q = q.filter({ $and: [filter, { '_account.closed': false }] });\n return q.orderBy({ next_date: 'desc' });\n };\n});\n\nfunction PreviewTransactions({ accountId, children }) {\n let scheduleData = useCachedSchedules();\n\n if (scheduleData == null) {\n return children(null);\n }\n\n let schedules = scheduleData.schedules.filter(\n s =>\n !s.completed &&\n ['due', 'upcoming', 'missed'].includes(scheduleData.statuses.get(s.id)),\n );\n\n return children(\n schedules.map(schedule => ({\n id: 'preview/' + schedule.id,\n payee: schedule._payee,\n account: schedule._account,\n amount: schedule._amount,\n date: schedule.next_date,\n notes: scheduleData.statuses.get(schedule.id),\n schedule: schedule.id,\n })),\n );\n}\n\nlet paged;\n\nexport default function Account(props) {\n const accounts = useSelector(state => state.queries.accounts);\n\n const navigate = useNavigate();\n const [transactions, setTransactions] = useState([]);\n const [searchText, setSearchText] = useState('');\n const [currentQuery, setCurrentQuery] = useState();\n\n let state = useSelector(state => ({\n payees: state.queries.payees,\n newTransactions: state.queries.newTransactions,\n prefs: state.prefs.local,\n dateFormat: state.prefs.local.dateFormat || 'MM/dd/yyyy',\n }));\n\n let dispatch = useDispatch();\n let actionCreators = useMemo(\n () => bindActionCreators(actions, dispatch),\n [dispatch],\n );\n\n const { id: accountId } = useParams();\n\n const makeRootQuery = () => queries.makeTransactionsQuery(accountId);\n\n const updateQuery = query => {\n if (paged) {\n paged.unsubscribe();\n }\n\n paged = pagedQuery(\n query.options({ splits: 'grouped' }).select('*'),\n data => setTransactions(data),\n { pageCount: 150, mapper: ungroupTransactions },\n );\n };\n\n const fetchTransactions = async () => {\n let query = makeRootQuery();\n setCurrentQuery(query);\n updateQuery(query);\n };\n\n useEffect(() => {\n let unlisten;\n\n async function setUpAccount() {\n unlisten = listen('sync-event', ({ type, tables }) => {\n if (type === 'applied') {\n if (\n tables.includes('transactions') ||\n tables.includes('category_mapping') ||\n tables.includes('payee_mapping')\n ) {\n paged?.run();\n }\n\n if (tables.includes('payees') || tables.includes('payee_mapping')) {\n actionCreators.getPayees();\n }\n }\n });\n\n if (accounts.length === 0) {\n await actionCreators.getAccounts();\n }\n\n await actionCreators.initiallyLoadPayees();\n await fetchTransactions();\n\n actionCreators.markAccountRead(accountId);\n }\n\n setUpAccount();\n\n return () => unlisten();\n }, []);\n\n // Load categories if necessary.\n const categories = useCategories();\n\n const updateSearchQuery = debounce(() => {\n if (searchText === '' && currentQuery) {\n updateQuery(currentQuery);\n } else if (searchText && currentQuery) {\n updateQuery(\n queries.makeTransactionSearchQuery(\n currentQuery,\n searchText,\n state.dateFormat,\n ),\n );\n }\n }, 150);\n\n useEffect(updateSearchQuery, [searchText, currentQuery, state.dateFormat]);\n\n useSetThemeColor(theme.mobileAccountViewTheme);\n\n if (!accounts || !accounts.length) {\n return null;\n }\n\n const account = accounts.find(acct => acct.id === accountId);\n\n const isNewTransaction = id => {\n return state.newTransactions.includes(id);\n };\n\n const onSearch = async text => {\n paged.unsubscribe();\n setSearchText(text);\n };\n\n const onSelectTransaction = transaction => {\n // details of how the native app used to handle preview transactions here can be found at commit 05e58279\n if (!isPreviewId(transaction.id)) {\n navigate(`transactions/${transaction.id}`);\n }\n };\n\n let balance = queries.accountBalance(account);\n let numberFormat = state.prefs.numberFormat || 'comma-dot';\n let hideFraction = state.prefs.hideFraction || false;\n\n return (\n <SchedulesProvider\n transform={getSchedulesTransform(accountId, searchText !== '')}\n >\n <PreviewTransactions accountId={props.accountId}>\n {prependTransactions =>\n prependTransactions == null ? null : (\n <AccountDetails\n // This key forces the whole table rerender when the number\n // format changes\n {...state}\n {...actionCreators}\n key={numberFormat + hideFraction}\n account={account}\n accounts={accounts}\n categories={categories.list}\n payees={state.payees}\n transactions={transactions}\n prependTransactions={prependTransactions || []}\n balance={balance}\n isNewTransaction={isNewTransaction}\n onLoadMore={() => {\n paged?.fetchNext();\n }}\n onSearch={onSearch}\n onSelectTransaction={onSelectTransaction}\n />\n )\n }\n </PreviewTransactions>\n </SchedulesProvider>\n );\n}\n","export function addCategory(categoryGroups, cat) {\n return categoryGroups.map(group => {\n if (group.id === cat.cat_group) {\n group.categories = [cat, ...group.categories];\n }\n return { ...group };\n });\n}\n\nexport function updateCategory(categoryGroups, category) {\n return categoryGroups.map(group => {\n if (group.id === category.cat_group) {\n group.categories = group.categories.map(c => {\n if (c.id === category.id) {\n return { ...c, ...category };\n }\n return c;\n });\n }\n return group;\n });\n}\n\nexport function moveCategory(categoryGroups, id, groupId, targetId) {\n if (id === targetId) {\n return categoryGroups;\n }\n\n let moveCat = categoryGroups.reduce((value, group) => {\n return value || group.categories.find(cat => cat.id === id);\n }, null);\n\n // Update the group id on the category\n moveCat = { ...moveCat, cat_group: groupId };\n\n return categoryGroups.map(group => {\n if (group.id === groupId) {\n group.categories = group.categories.reduce((cats, cat) => {\n if (cat.id === targetId) {\n cats.push(moveCat);\n cats.push(cat);\n } else if (cat.id !== id) {\n cats.push(cat);\n }\n return cats;\n }, []);\n\n if (!targetId) {\n group.categories.push(moveCat);\n }\n } else {\n group.categories = group.categories.filter(cat => cat.id !== id);\n }\n\n return { ...group };\n });\n}\n\nexport function moveCategoryGroup(categoryGroups, id, targetId) {\n if (id === targetId) {\n return categoryGroups;\n }\n\n let moveGroup = categoryGroups.find(g => g.id === id);\n\n categoryGroups = categoryGroups.reduce((groups, group) => {\n if (group.id === targetId) {\n groups.push(moveGroup);\n groups.push(group);\n } else if (group.id !== id) {\n groups.push(group);\n }\n return groups;\n }, []);\n\n if (!targetId) {\n categoryGroups.push(moveGroup);\n }\n\n return categoryGroups;\n}\n\nexport function deleteCategory(categoryGroups, id) {\n return categoryGroups.map(group => {\n group.categories = group.categories.filter(c => c.id !== id);\n return group;\n });\n}\n\nexport function addGroup(categoryGroups, group) {\n return [...categoryGroups, group];\n}\n\nexport function updateGroup(categoryGroups, group) {\n return categoryGroups.map(g => {\n if (g.id === group.id) {\n return { ...g, ...group };\n }\n return g;\n });\n}\n\nexport function deleteGroup(categoryGroups, id) {\n return categoryGroups.filter(g => g.id !== id);\n}\n"],"names":["BalanceWithCarryover","carryover","balance","disabled","style","balanceStyle","carryoverStyle","carryoverValue","useSheetValue","balanceValue","View","CellValue","binding","type","getStyle","makeAmountStyle","textAlign","cursor","textDecoration","alignSelf","marginLeft","position","right","top","bottom","justifyContent","ArrowThinRight","width","height","CoverTooltip","tooltipProps","onSubmit","onClose","grouped","categoryGroups","useCategories","addToBeBudgetedGroup","filter","g","is_income","category","setCategory","useState","submit","Tooltip","padding","marginBottom","InitialFocus","node","CategoryAutocomplete","value","openOnFocus","onUpdate","id","onSelect","inputProps","inputRef","onKeyDown","e","key","alignItems","marginTop","Button","fontSize","paddingTop","onClick","BalanceTooltip","categoryId","tooltip","monthIndex","onBudgetAction","rolloverBudget","catCarryover","catBalance","menu","setMenu","_onClose","close","Menu","onMenuSelect","flag","items","name","text","x","TransferTooltip","initialAmountName","showToBeBudgeted","amount","toCategory","from","to","fromCategory","initialAmount","spreadsheet","useSpreadsheet","sheetName","useContext","NamespaceContext","setAmount","useEffect","get","integerToCurrency","Math","max","parsedAmount","evalArithmetic","amountToInteger","Input","onChange","target","onEnter","margin","placeholder","paddingBottom","groups","categories","cat_group","group","separateGroups","find","makeAmountGrey","color","theme","altMenuItemText","greyed","errorText","makeAmountFullStyle","noticeText","findSortDown","arr","pos","targetId","idx","findIndex","item","Error","newIdx","length","findSortUp","getScrollbarWidth","styles","scrollbarWidth","ButtonLink","activeStyle","props","navigate","useNavigate","match","useMatch","path","SyncRefresh","onSync","children","syncing","setSyncing","onSync_","refreshing","onRefresh","SvgArrowThinLeft","svg","xmlns","viewBox","d","fill","Card","forwardRef","ref","marginRight","borderRadius","backgroundColor","cardBackground","borderColor","cardBorder","boxShadow","overflow","Label","title","Text","tableRowHeaderText","ROW_HEIGHT","ListItem","borderBottomWidth","tableBorder","flexDirection","paddingLeft","paddingRight","zIndex","ToBudget","toBudget","underlinedText","formInputText","flexShrink","smallText","fontWeight","Saved","projected","reportBudget","totalBudgetedSaved","totalSaved","saved","isNegative","alt2WarningText","errorTextDark","BudgetCell","textStyle","month","onEdit","isEditing","sheetValue","updateBudgetAmount","onAmountClick","AmountInput","initialValue","zeroSign","transform","focused","onBlur","role","data-testid","onPointerUp","onPointerDown","preventDefault","ExpenseGroupPreview","pending","opacity","ExpenseGroupTotals","blank","map","cat","index","ExpenseCategory","ExpenseCategoryPreview","flex","memo","editMode","isEditingBudget","onEditBudget","onSave","onDelete","isBudgetActionMenuOpen","onOpenBudgetActionMenu","show3Cols","showBudgetedCol","showEditables","categoryName","setCategoryName","isHidden","setIsHidden","hidden","budgeted","catBudgeted","spent","catSumAmount","useTooltip","balanceTooltip","open","isOpen","listItemRef","useRef","content","altTableTextEditing","borderTopWidth","undefined","innerRef","display","InputWithContent","rightContent","getOpenEvents","DotsHorizontalTriple","offset","current","focus","contains","relatedTarget","lineClamp","noTapHighlight","span","monthUtils","action","arg","onAddCategory","groupName","setGroupName","tableRowHeaderBackground","tabIndex","groupBudgeted","groupSumAmount","groupBalance","IncomeGroupTotals","budget","IncomeCategory","ExpenseGroup","editingGroupId","onEditGroup","editingCategoryId","onEditCategory","editingBudgetCategoryId","onEditCategoryBudget","openBudgetActionMenuId","onSaveCategory","onDeleteCategory","showHiddenCategories","editable","isEditingCategory","isEditingCategoryBudget","IncomeGroup","altTableBackground","BudgetGroups","gestures","onAddGroup","onSaveGroup","onDeleteGroup","onReorderCategory","onReorderGroup","memoizeOne","incomeGroup","expenseGroups","overflowY","BudgetTable","monthBounds","onPrevMonth","onNextMonth","onEditMode","onShowBudgetDetails","savePrefs","GROUP_EDIT_ACTION","setEditingGroupId","CATEGORY_EDIT_ACTION","setEditingCategoryId","CATEGORY_BUDGET_EDIT_ACTION","setEditingBudgetCategoryId","BUDGET_MENU_OPEN_ACTION","setOpenBudgetActionMenuId","currentlyEditing","useResponsive","currentMonth","format","useFormat","mobileShowBudgetedColPref","useSelector","state","prefs","local","toggleMobileDisplayPref","setShowBudgetedCol","document","cookie","toggleDisplay","buttonStyle","Provider","BudgetHeader","background","formInputBackgroundSelection","flexBasis","buttonNormalText","totalBudgetedExpense","formatter","parseFloat","totalSpent","totalBalance","BUDGET_HEADER_HEIGHT","serverURL","useServerURL","prevEnabled","start","nextEnabled","end","toggleHiddenCategories","buttonPrimaryBackground","SyncButton","isMobile","ArrowThinLeft","formInputTextReadOnlySelection","mediumText","formInputTextSelected","Budget","Component","constructor","bounds","initialized","loadCategories","result","getCategories","setState","componentDidMount","send","prewarmMonth","unlisten","listen","tables","includes","cleanup","componentWillUnmount","budgetType","method","values","prewarmCache","pushModal","applyBudgetAction","onValidate","createGroup","addGroup","groupId","isIncome","createCategory","addCategory","updateGroup","mustTransfer","transferCategory","deleteGroup","updateCategory","deleteCategory","inGroup","aroundCategory","catId","moveCategory","moveCategoryGroup","sync","updated","error","onOpenActionSheet","options","Boolean","showActionSheetWithOptions","cancelButtonIndex","render","navigation","numberFormat","hideFraction","pageBackgroundLineTop","AnimatedLoading","BudgetWrapper","list","actions","useActions","useSetThemeColor","mobileBudgetViewTheme","DIRECTION","isOverflowScrollable","element","overflowType","getComputedStyle","scrollingElement","isScrollable","direction","DOWN","bottomScroll","scrollTop","clientHeight","scrollHeight","UP","isTreeScrollable","parentElement","styleInject","css","insertAt","head","getElementsByTagName","createElement","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","RefreshingContent","className","PullingContent","css$1","PullToRefresh","_a","_b","isPullable","_c","canFetchMore","onFetchMore","_d","refreshingContent","_e","pullingContent","_f","pullDownThreshold","_g","fetchMoreThreshold","_h","maxPullDownDistance","_j","resistance","_k","containerRef","childrenRef","pullDownRef","fetchMoreRef","pullToRefreshThresholdBreached","fetchMoreTresholdBreached","isDragging","startY","currentY","childrenEl","addEventListener","onTouchStart","passive","onTouchMove","window","onScroll","onEnd","body","removeEventListener","isAlreadyFetchingMore","classList","getScrollToBottomValue","add","then","initContainer","catch","scrollY","innerHeight","requestAnimationFrame","overflowX","remove","MouseEvent","pageY","TouchEvent","touches","getBoundingClientRect","cancelable","yDistanceMoved","min","toString","visibility","div","BasePullToRefresh","String","AccountHeader","pageTextLight","textTransform","AccountCard","account","getBalanceQuery","tableBackground","mobileAccountShadow","onMouseDown","TextOneLine","mobileAccountText","pillText","bankId","noticeBackgroundDark","EmptyMessage","onAdd","alert","AccountList","accounts","updatedAccounts","getOnBudgetBalance","getOffBudgetBalance","onAddAccount","onSelectAccount","syncAndDownload","budgetedAccounts","offbudget","offbudgetAccounts","Page","acct","Accounts","queries","newTransactions","getAccounts","transactions","onSelectTransaction","transaction","mobileAccountsViewTheme","closed","TransactionSearchInput","accountName","onSearch","setText","tableHeaderBackground","leftContent","SearchAlternate","formInputTextHighlight","formInputBackground","border","formInputBorder","LEFT_RIGHT_FLEX_WIDTH","AccountDetails","prependTransactions","payees","isNewTransaction","onLoadMore","allTransactions","useMemo","concat","Link","formLabelText","CheveronLeft","aria-label","hoveredStyle","Add","debug","pillTextHighlighted","TransactionList","showCategory","isNew","getSchedulesTransform","hasSearch","q","$and","orderBy","next_date","PreviewTransactions","accountId","scheduleData","useCachedSchedules","schedules","s","completed","statuses","schedule","payee","_payee","_account","_amount","date","notes","paged","Account","setTransactions","searchText","setSearchText","currentQuery","setCurrentQuery","dateFormat","dispatch","useDispatch","actionCreators","bindActionCreators","useParams","makeRootQuery","updateQuery","query","unsubscribe","pagedQuery","splits","select","data","pageCount","mapper","ungroupTransactions","fetchTransactions","setUpAccount","run","getPayees","initiallyLoadPayees","markAccountRead","updateSearchQuery","debounce","mobileAccountViewTheme","isPreviewId","SchedulesProvider","fetchNext","c","moveCat","reduce","cats","push","moveGroup"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self["webpackChunk_actual_app_web"]=self["webpackChunk_actual_app_web"]||[]).push([[992],{10646:function(e,t,n){n.d(t,{Z:function(){return i}});var s=n(43188);var r=n(66204);var a=n(59379);var o=n(24868);var l=n(56816);function i({to:e,style:t,activeStyle:n,...r}){const i=(0,o.Z)();const c=(0,a.bS)({path:e});return(0,s.jsx)(l.Z,{style:{...t,...c?n:{}},activeStyle:n,...r,onClick:t=>{r.onClick?.(t);i(e)}})}},29696:function(e,t,n){n.r(t);n.d(t,{ReportRouter:function(){return e0}});var s=n(43188);var r=n(66204);var a=n(59379);var o=n(56605);var l=n(41071);var i=n(84094);var c=n(73416);var d=n(89362);function h(e=[]){const[t,n]=(0,r.useState)(e);const[s,a]=(0,r.useState)("and");const[o,l]=(0,r.useState)(null);const i=(0,r.useCallback)(e=>{if(e.conditions){n([...e.conditions]);a(e.conditionsOp);l(e.id)}else{n(t=>[...t,e]);l(null)}},[n]);const c=(0,r.useCallback)((e,t)=>{n(n=>n.map(n=>n===e?t:n));l(null)},[n]);const d=(0,r.useCallback)(e=>{n(t=>t.filter(t=>t!==e));l(null)},[n]);const h=(0,r.useCallback)(e=>{a(e)},[a]);return(0,r.useMemo)(()=>({filters:t,saved:o,conditionsOp:s,onApply:i,onUpdate:c,onDelete:d,onCondOpChange:h}),[t,o,i,c,d,h,s])}var u=n(45492);var x=n(30715);var f=n(24924);var g=n(42994);var p=n(77644);var m=n(24307);var y=n(16853);function j({amount:e}){return(0,s.jsxs)(f.Z,{style:{...u.W2.smallText,color:e<0?u.rS.errorText:u.rS.noticeTextLight},children:[e>=0?"+":"",(0,d.zA)(e)]})}var v=j;var Z=n(79982);var b=n(10959);function w(e){return e.slice(0,7)}async function M(e,t){let n=await Promise.all(e.map(e=>{return(0,b.Vn)(e).then(({data:e})=>e)}));t(n)}function k(e,t,n){const s={};e.forEach(e=>{s[n?n(e[t]):e[t]]=e});return s}function S(e,t,n){const s={};e.forEach(e=>{let r=s[e.date]?s[e.date][e.isTransfer]?s[e.date][e.isTransfer]:0:0;let a={[e[n]]:e.amount+r};s[e[t]]={...s[e[t]],...a}});return s};function C(e,t){return async(n,s)=>{function r(){return(0,b.ZP)("transactions").filter({$and:[{date:{$gte:e}},{date:{$lte:t}}],"account.offbudget":false,$or:[{"payee.transfer_acct.offbudget":true,"payee.transfer_acct":null}]}).calculate({$sum:"$amount"})}return M([r().filter({amount:{$gt:0}}),r().filter({amount:{$lt:0}})],e=>{s({graphData:{income:e[0],expense:e[1]}})})}}function W(e,t,n,s=[],r){return async(a,o)=>{let{filters:l}=await (0,i.lW)("make-filters-from-conditions",{conditions:s.filter(e=>!e.customName)});const c=r==="or"?"$or":"$and";function d(s){let r=(0,b.ZP)("transactions").filter({[c]:[...l]}).filter({$and:[{date:{$transform:"$month",$gte:e}},{date:{$transform:"$month",$lte:t}}],"account.offbudget":false});if(n){return r.groupBy([{$month:"$date"},"payee.transfer_acct"]).select([{date:{$month:"$date"}},{isTransfer:"payee.transfer_acct"},{amount:{$sum:"$amount"}}])}return r.groupBy(["date","payee.transfer_acct"]).select(["date",{isTransfer:"payee.transfer_acct"},{amount:{$sum:"$amount"}}])}return M([(0,b.ZP)("transactions").filter({[c]:l,date:{$transform:"$month",$lt:e},"account.offbudget":false}).calculate({$sum:"$amount"}),d("amount > 0").filter({amount:{$gt:0}}),d("amount < 0").filter({amount:{$lt:0}})],s=>{o($(s,e,t,n))})}}function $(e,t,n,r){let[a,o,i]=e;let h=o.map(e=>{return{...e,isTransfer:e.isTransfer!==null}});let u=i.map(e=>{return{...e,isTransfer:e.isTransfer!==null}});const f=r?c.Do(c.jw(t),c.jw(n)):c.Gn(t,n);const g=S(h,"date","isTransfer");const p=S(u,"date","isTransfer");let m=a;let y=0;let j=0;let v=0;const b=f.reduce((e,t)=>{let n=0;let a=0;let o=0;let i=0;if(g[t]){n=!g[t].false?0:g[t].false;o=!g[t].true?0:g[t].true}if(p[t]){a=!p[t].false?0:p[t].false;i=!p[t].true?0:p[t].true}y+=a;j+=n;m+=n+a+o+i;v+=o+i;const c=l.Z(t);const h=(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{style:{marginBottom:10},children:(0,s.jsx)("strong",{children:Z.Z(c,r?"MMMM yyyy":"MMMM d, yyyy")})}),(0,s.jsxs)("div",{style:{lineHeight:1.5},children:[(0,s.jsx)(x.Z,{left:"Income:",right:(0,d.zA)(n)}),(0,s.jsx)(x.Z,{left:"Expenses:",right:(0,d.zA)(a)}),(0,s.jsx)(x.Z,{left:"Change:",right:(0,s.jsx)("strong",{children:(0,d.zA)(n+a)})}),o+i!==0&&(0,s.jsx)(x.Z,{left:"Transfers:",right:(0,d.zA)(o+i)}),(0,s.jsx)(x.Z,{left:"Balance:",right:(0,d.zA)(m)})]})]});e.income.push({x:c,y:(0,d.Bf)(n)});e.expenses.push({x:c,y:(0,d.Bf)(a)});e.balances.push({x:c,y:(0,d.Bf)(m),premadeLabel:h,amount:m});return e},{expenses:[],income:[],balances:[]});const{balances:w}=b;return{graphData:b,balance:w[w.length-1].amount,totalExpenses:y,totalIncome:j,totalTransfers:v,totalChange:w[w.length-1].amount-w[0].amount}}var A=n(34827);var D=n(18826);var T=n(68812);var B=n(160);var P=n(15326);var F=n(54494);let L={blueFadeStart:"rgba(229, 245, 255, 1)",blueFadeEnd:"rgba(229, 245, 255, 0)",redFadeStart:"rgba(255, 243, 242, 1)",redFadeEnd:"rgba(255, 243, 242, 0)"};const E="Inter var, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, Helvetica, Arial, sans-serif";const _="normal";const z=13;const K={fontFamily:E,fontSize:z,letterSpacing:_,fill:u.rS.reportsLabel,stroke:"transparent"};const R={axis:{fill:"transparent",stroke:"none"},grid:{fill:"none",stroke:"none",pointerEvents:"none"},ticks:{fill:"transparent",size:1,stroke:"none"},axisLabel:K,tickLabels:K};const I={colors:{...L,red:u.rS.reportsRed,blue:u.rS.reportsBlue},area:{style:{labels:K,data:{stroke:u.rS.reportsBlue,strokeWidth:2,strokeLinejoin:"round",strokeLinecap:"round"}}},axis:{style:R},dependentAxis:{style:{...R,grid:{...R.grid,stroke:"rgba(0,0,0,.2)",strokeDasharray:"1,1"},tickLabels:{...K,padding:5}}},independentAxis:{style:{...R,axis:{...R.axis,stroke:"rgba(0,0,0,.2)"},tickLabels:{...K,padding:10}}},bar:{style:{labels:K,data:{fill:u.rS.reportsBlue,stroke:"none"}}},line:{style:{labels:K,data:{fill:"none",stroke:u.rS.reportsBlue,strokeWidth:2,strokeLinejoin:"round",strokeLinecap:"round"}}},voronoi:{style:{labels:K}},chart:{padding:{top:20,left:65,right:20,bottom:50}}};var U=n(38638);function G({style:e,children:t}){const n=(0,r.useRef)(null);return(0,s.jsxs)(m.Z,{style:{height:300,position:"relative",flexShrink:0,...e},children:[(0,s.jsx)("div",{ref:n}),(0,s.jsx)(U.Z,{children:({width:e,height:r})=>(0,s.jsx)("div",{style:{width:e,height:r},children:t(e,r,n.current)})})]})}var N=n(42457);var O=n(99818);var H=n(90407);class V extends r.Component{static defaultEvents=H.Z.defaultEvents;render(){let{active:e,x:t,y:n,scale:r,datum:a,portalHost:o,offsetX:l=0,offsetY:i,position:c,light:d,forceActive:h,style:x}=this.props;const f=r.x.range();const g=t-f[0];if(!c){if(a.labelPosition){c=a.labelPosition}else{c=g<150?"right":"left"}}if(!o||!e&&!h){return null}n=i?i(n):n;return N.createPortal((0,s.jsx)("div",{className:`${(0,O.iv)({position:"absolute",top:0,left:l,transform:c==="right"?`translate(calc(${t}px + 15px), calc(${n}px ${d?"":"- 50%"}))`:`translate(calc(${t}px - 100% - 15px), calc(${n}px ${d?"":"- 50%"}))`,zIndex:1e3,pointerEvents:"none",borderRadius:2,boxShadow:d?"none":"0 1px 6px rgba(0, 0, 0, .20)",backgroundColor:d?"transparent":u.rS.alt2MenuBackground,color:d?"inherit":u.rS.alt2MenuItemText,padding:10},!d&&(0,O.bb)({position:"absolute",display:"inline-block",borderTop:"7px solid transparent",borderBottom:"7px solid transparent",[c==="right"?"borderRight":"borderLeft"]:"7px solid "+u.rS.alt2MenuBackground,[c==="right"?"left":"right"]:-6,top:"calc(50% - 7px)",content:'" "'}),x)}`,children:a.premadeLabel}),o)}}var Y=V;function q({graphData:e,isConcise:t}){return(0,s.jsx)(G,{children:(n,r,a)=>e&&(0,s.jsxs)(A.k,{scale:{x:"time",y:"linear"},theme:I,domainPadding:10,width:n,height:r,containerComponent:(0,s.jsx)(D.Z,{voronoiDimension:"x"}),children:[(0,s.jsxs)(T.G,{children:[(0,s.jsx)(B.Z,{data:e.expenses,style:{data:{fill:I.colors.red}}}),(0,s.jsx)(B.Z,{data:e.income})]}),(0,s.jsx)(P.j,{data:e.balances,labelComponent:(0,s.jsx)(Y,{portalHost:a}),labels:e=>e.premadeLabel,style:{data:{stroke:u.rS.pageTextLight}}}),(0,s.jsx)(F.E,{tickFormat:e=>Z.Z(e,t?"MMM ''yy":"MMM d"),tickValues:e.balances.map(e=>e.x),tickCount:Math.min(5,e.balances.length),offsetY:50}),(0,s.jsx)(F.E,{dependentAxis:true,crossAxis:false})]})})}var X=q;var J=n(93734);var Q=n(56816);var ee=n(10646);var et=n(78628);var en=n(16598);function es(e,t,n){const s=e[e.length-1].name;if(n<t){n=c.zI(t,6)}return ea(s,t,n)}function er(e,t,n){const s=e[e.length-1].name;if(t>n){t=c.W9(n,6)}return ea(s,t,n)}function ea(e,t,n){const s=c.dK();if(n>s){n=s}if(t<e){t=e}return[t,n]}function eo(e){const t=c.dK();const n=c.W9(t,e);return[n,t]}function el(e){const t=e[e.length-1].name;const n=c.dK();return[t,n]}function ei({title:e,start:t,end:n,show1Month:r,allMonths:a,onChangeDates:o,filters:l,conditionsOp:i,onApply:d,onUpdateFilter:h,onDeleteFilter:x,onCondOpChange:f,headerPrefixItems:g}){return(0,s.jsxs)(m.Z,{style:{padding:10,paddingTop:0,flexShrink:0},children:[(0,s.jsxs)(ee.Z,{type:"bare",to:"/reports",style:{marginBottom:"15",alignSelf:"flex-start"},children:[(0,s.jsx)(J.Z,{width:10,height:10,style:{marginRight:5}})," Back"]}),(0,s.jsx)(m.Z,{style:u.W2.veryLargeText,children:e}),(0,s.jsxs)(m.Z,{style:{flexDirection:"row",alignItems:"center",marginTop:15,gap:15},children:[g,(0,s.jsxs)(m.Z,{style:{flexDirection:"row",alignItems:"center",gap:5},children:[(0,s.jsx)(et.Z,{onChange:e=>o(...es(a,e,n)),value:t,defaultLabel:c.WU(t,"MMMM, yyyy"),options:a.map(({name:e,pretty:t})=>[e,t])}),(0,s.jsx)(m.Z,{children:"to"}),(0,s.jsx)(et.Z,{onChange:e=>o(...er(a,t,e)),value:n,options:a.map(({name:e,pretty:t})=>[e,t])})]}),l&&(0,s.jsx)(en.L,{onApply:d}),r&&(0,s.jsx)(Q.Z,{type:"bare",onClick:()=>o(...eo(1)),children:"1 month"}),(0,s.jsx)(Q.Z,{type:"bare",onClick:()=>o(...eo(2)),children:"3 months"}),(0,s.jsx)(Q.Z,{type:"bare",onClick:()=>o(...eo(5)),children:"6 months"}),(0,s.jsx)(Q.Z,{type:"bare",onClick:()=>o(...eo(11)),children:"1 Year"}),(0,s.jsx)(Q.Z,{type:"bare",onClick:()=>o(...el(a)),children:"All Time"})]}),l&&l.length>0&&(0,s.jsx)(m.Z,{style:{marginTop:5},spacing:2,direction:"row",justify:"flex-start",align:"flex-start",children:(0,s.jsx)(en.M,{filters:l,onUpdate:h,onDelete:x,conditionsOp:i,onCondOpChange:f})})]})}var ec=ei;var ed=n(55833);function eh(e,t){const n=(0,ed.M)();const[s,a]=(0,r.useState)(null);(0,r.useEffect)(()=>{let e;t(n,e=>a(e)).then(t=>{e=t});return()=>{e?.()}},[t]);return s}var eu=eh;function ex(){const{filters:e,conditionsOp:t,onApply:n,onDelete:a,onUpdate:j,onCondOpChange:Z}=h();const[b,w]=(0,r.useState)(null);const[M,k]=(0,r.useState)(c.W9(c.dK(),5));const[S,C]=(0,r.useState)(c.PR());const[$,A]=(0,r.useState)(()=>{const e=o.Z(l.Z(S),l.Z(M));return e>31*3});const D=(0,r.useMemo)(()=>W(M,S,$,e,t),[M,S,$,e,t]);const T=eu("cash_flow",D);(0,r.useEffect)(()=>{async function e(){const e=await (0,i.lW)("get-earliest-transaction");const t=e?c.DT(l.Z(e.date)):c.dK();const n=c.Do(t,c.dK()).map(e=>({name:e,pretty:c.WU(e,"MMMM, yyyy")})).reverse();w(n)}e()},[]);function B(e,t){const n=o.Z(l.Z(t),l.Z(e));const s=n>31*3;let r=t+"-31";if(r>c.PR()){r=c.PR()}k(e+"-01");C(r);A(s)}if(!b||!T){return null}const{graphData:P,totalExpenses:F,totalIncome:L,totalTransfers:E}=T;return(0,s.jsxs)(m.Z,{style:{...u.W2.page,minWidth:650,overflow:"hidden"},children:[(0,s.jsx)(ec,{title:"Cash Flow",allMonths:b,start:c.jw(M),end:c.jw(S),show1Month:true,onChangeDates:B,onApply:n,filters:e,onUpdateFilter:j,onDeleteFilter:a,conditionsOp:t,onCondOpChange:Z}),(0,s.jsxs)(m.Z,{style:{backgroundColor:u.rS.tableBackground,padding:30,paddingTop:0,overflow:"auto"},children:[(0,s.jsxs)(m.Z,{style:{paddingTop:20,paddingRight:20,flexShrink:0,alignItems:"flex-end",color:u.rS.pageText},children:[(0,s.jsx)(x.Z,{style:{marginBottom:5,minWidth:160},left:(0,s.jsx)(f.Z,{children:"Income:"}),right:(0,s.jsx)(p.Z,{style:{fontWeight:600},children:(0,s.jsx)(y.ZP,{children:(0,d.zA)(L)})})}),(0,s.jsx)(x.Z,{style:{marginBottom:5,minWidth:160},left:(0,s.jsx)(f.Z,{children:"Expenses:"}),right:(0,s.jsx)(p.Z,{style:{fontWeight:600},children:(0,s.jsx)(y.ZP,{children:(0,d.zA)(F)})})}),(0,s.jsx)(x.Z,{style:{marginBottom:5,minWidth:160},left:(0,s.jsx)(f.Z,{children:"Transfers:"}),right:(0,s.jsx)(p.Z,{style:{fontWeight:600},children:(0,s.jsx)(y.ZP,{children:(0,d.zA)(E)})})}),(0,s.jsx)(p.Z,{style:{fontWeight:600},children:(0,s.jsx)(y.ZP,{children:(0,s.jsx)(v,{amount:L+F+E})})})]}),(0,s.jsx)(X,{start:M,end:S,graphData:P,isConcise:$}),(0,s.jsxs)(m.Z,{style:{marginTop:30},children:[(0,s.jsx)(g.Z,{children:(0,s.jsx)("strong",{children:"How is cash flow calculated?"})}),(0,s.jsx)(g.Z,{children:"Cash flow shows the balance of your budgeted accounts over time, and the amount of expenses/income each day or month. Your budgeted accounts are considered to be “cash on hand,” so this gives you a picture of how available money fluctuates."})]})]})]})}var ef=ex;var eg=n(9579);var ep=n(93536);var em=n(36360);var ey=n(10730);function ej({categoryGroups:e,selectedCategories:t,setSelectedCategories:n}){const[a,o]=(0,r.useState)(false);return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("div",{children:(0,s.jsx)(Q.Z,{onClick:()=>o(e=>!e),children:a?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(ep.Z,{width:20,height:20}),"Show unchecked"]}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(em.Z,{width:20,height:20}),"Hide unchecked"]})})}),(0,s.jsx)("ul",{style:{listStyle:"none",marginLeft:0,paddingLeft:0,paddingRight:10,height:320,flexGrow:1,overflowY:"scroll"},children:e&&e.map(e=>{const o=e.categories.every(e=>t.some(t=>t.id===e.id));const l=e.categories.every(e=>!t.some(t=>t.id===e.id));return(0,s.jsxs)(r.Fragment,{children:[(0,s.jsxs)("li",{style:{display:l&&a?"none":"flex",marginBottom:8,flexDirection:"row"},children:[(0,s.jsx)(ey.XZ,{id:`form_${e.id}`,checked:o,onChange:s=>{const r=t.filter(t=>!e.categories.some(e=>e.id===t.id));if(o){n(r)}else{n(r.concat(e.categories))}}}),(0,s.jsx)("label",{htmlFor:`form_${e.id}`,style:{userSelect:"none",fontWeight:"bold"},children:e.name})]}),(0,s.jsx)("li",{children:(0,s.jsx)("ul",{style:{listStyle:"none",marginLeft:0,marginBottom:10,paddingLeft:10},children:e.categories.map((e,r)=>{const o=t.some(t=>t.id===e.id);return(0,s.jsxs)("li",{style:{display:!o&&a?"none":"flex",flexDirection:"row",marginBottom:4},children:[(0,s.jsx)(ey.XZ,{id:`form_${e.id}`,checked:o,onChange:s=>{if(o){n(t.filter(t=>t.id!==e.id))}else{n([...t,e])}}}),(0,s.jsx)("label",{htmlFor:`form_${e.id}`,style:{userSelect:"none"},children:e.name})]},e.id)})})})]},e.id)})})]})}var ev=n(46055);function eZ(e,t,n,s){return async(r,a)=>{if(e===null||t===null||s.length===0){return}let o;if(n===-1){const e=await (0,b.Vn)((0,b.ZP)("transactions").filter({$or:s.map(e=>({category:e.id}))}).orderBy({date:"asc"}).limit(1).select("date"));if(e.data.length===0){return}o=c.Do(c.DT(e.data[0].date),t)}else{o=c.Do(c.W9(e,n),t)}const l=async(e,t)=>Promise.all([r.get(e,ev.aK.catBudgeted(t.id)).then(e=>e.value??0),r.get(e,ev.aK.catSumAmount(t.id)).then(e=>e.value??0),r.get(e,ev.aK.catBalance(t.id)).then(e=>e.value??0)]).then(([e,t,n])=>({budgeted:e,sumAmount:t,balance:n}));const i=async e=>o.reduce(async(t,n)=>({...await t,[n]:await l(c.cv(n),e)}),Promise.resolve({}));const d=await s.reduce(async(s,r)=>({...await s,[r.id]:await i(r).then(s=>eb(e,t,r,n,s))}),Promise.resolve({}));a({categories:s,tickValues:d[s[0].id].map(e=>e.x),data:d})}}function eb(e,t,n,r,a){const o=c.Do(e,t);const[i,h]=o.reduce(([e,t],o)=>{const i=a[o];const h=l.Z(`${o}-01`);const u=r===-1?t:r;const f=[];for(let e=0;e<u;e++){f.push(a[c.W9(o,e)].sumAmount)}const g=f.reduce((e,t)=>e+t)/f.length;const p=(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{style:{marginBottom:10},children:(0,s.jsx)("strong",{children:n.name})}),(0,s.jsxs)("div",{style:{lineHeight:1.5},children:[r!==0&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(x.Z,{left:"Average:",right:(0,d.zA)(Math.round(g))}),(0,s.jsx)("hr",{})]}),(0,s.jsx)(x.Z,{left:"Budgeted:",right:(0,d.zA)(i.budgeted)}),(0,s.jsx)(x.Z,{left:"Spent:",right:(0,d.zA)(i.sumAmount)}),(0,s.jsx)(x.Z,{left:"Balance:",right:(0,d.zA)(i.balance)})]})]});return[[...e,{x:h,y:(0,d.Bf)(Math.round(g)),premadeLabel:p,average:g,budgeted:i.budgeted,total:i.sumAmount}],t+1]},[[],1]);return i}var ew=n(94818);function eM({start:e,end:t,scale:n,range:r}){const a=n.y(0);const o=n.x(l.Z(e+"-01"));const i=n.x(l.Z(t+"-01"));if(o<0||i<0||o===undefined||i===undefined){return null}return(0,s.jsx)("svg",{children:(0,s.jsxs)("defs",{children:[(0,s.jsx)("clipPath",{id:"positive",children:(0,s.jsx)("rect",{x:o,y:r.y[1],width:i-o,height:a-r.y[1]+1,fill:"#ffffff"})}),(0,s.jsx)("clipPath",{id:"negative",children:(0,s.jsx)("rect",{x:o,y:a+1,width:i-o,height:Math.max(r.y[0]-a-1,0),fill:"#ffffff"})}),(0,s.jsxs)("linearGradient",{id:"positive-gradient",gradientUnits:"userSpaceOnUse",x1:0,y1:r.y[1],x2:0,y2:a,children:[(0,s.jsx)("stop",{offset:"0%",stopColor:I.colors.blueFadeStart}),(0,s.jsx)("stop",{offset:"100%",stopColor:I.colors.blueFadeEnd})]}),(0,s.jsxs)("linearGradient",{id:"negative-gradient",gradientUnits:"userSpaceOnUse",x1:0,y1:a,x2:0,y2:r.y[0],children:[(0,s.jsx)("stop",{offset:"0%",stopColor:I.colors.redFadeEnd}),(0,s.jsx)("stop",{offset:"100%",stopColor:I.colors.redFadeStart})]})]})})};function ek({style:e,start:t,end:n,graphData:r,compact:a}){if(!r||!r.data){return}return(0,s.jsx)(G,{style:{...e,...a&&{height:"auto",flex:1}},children:(e,o,l)=>(0,s.jsxs)(A.k,{scale:{x:"time",y:"linear"},theme:I,width:e,height:o,children:[(0,s.jsx)(eM,{start:t,end:n}),(0,s.jsx)(ew.N,{colorScale:"qualitative",domainPadding:{x:a?5:15},children:r.categories.map(e=>(0,s.jsx)(B.Z,{data:r.data[e.id],labelComponent:!a?(0,s.jsx)(Y,{portalHost:l}):undefined,labels:e=>e.premadeLabel},e.id))}),!a&&(0,s.jsx)(F.E,{style:{ticks:{stroke:"red"}},tickFormat:e=>Z.Z(e,"MMM ''yy"),tickValues:r.tickValues,tickCount:Math.max(1,Math.min(e>760?12:5,r.tickValues.length)),offsetY:50,orientation:"bottom"}),(0,s.jsx)(F.E,{dependentAxis:true,crossAxis:false,invertAxis:true,tickCount:a?2:o/70})]})})}var eS=ek;function eC(){const e=(0,eg.Z)();const[t,n]=(0,r.useState)(null);const[a,o]=(0,r.useState)(null);const[d,h]=(0,r.useState)(c.W9(c.dK(),5));const[x,f]=(0,r.useState)(c.dK());const[g,p]=(0,r.useState)(1);(0,r.useEffect)(()=>{if(t===null&&e.list.length!==0){n(e.list)}},[e,t]);const y=(0,r.useMemo)(()=>{return eZ(d,x,g,(e.list||[]).filter(e=>!e.is_income&&!e.hidden&&t&&t.some(t=>t.id===e.id)))},[d,x,g,e,t]);const j=eu("category_spending",y);(0,r.useEffect)(()=>{async function e(){const e=await (0,i.lW)("get-earliest-transaction");const t=c.dK();let n=e?c.DT(l.Z(w(e.date))):t;const s=c.W9(c.dK(),12);if(n>s){n=s}const r=c.Do(n,c.dK()).map(e=>({name:e,pretty:c.WU(e,"MMMM, yyyy")})).reverse();o(r)}e()},[]);function v(e,t){h(e);f(t)}if(!a||!j){return null}const Z=[{value:1,description:"No averaging"},{value:3,description:"3 months"},{value:6,description:"6 months"},{value:12,description:"12 months"},{value:-1,description:"All time"}];const b=Z.length-1;const M=(0,s.jsxs)(m.Z,{style:{flexDirection:"row",alignItems:"center",gap:5},children:[(0,s.jsx)(m.Z,{children:"Average: "}),(0,s.jsx)(et.Z,{style:{backgroundColor:"white"},onChange:p,value:g,options:Z.map(e=>[e.value,e.description]),line:b})]});return(0,s.jsxs)(m.Z,{style:{...u.W2.page,overflow:"hidden"},children:[(0,s.jsx)(ec,{title:"Category Spending",allMonths:a,start:d,end:x,onChangeDates:v,headerPrefixItems:M}),(0,s.jsxs)(m.Z,{style:{display:"flex",flexDirection:"row",padding:15,gap:15,flexGrow:1},children:[(0,s.jsx)(m.Z,{style:{width:200},children:(0,s.jsx)(ej,{categoryGroups:e.grouped.filter(e=>!e.is_income),selectedCategories:t,setSelectedCategories:n})}),(0,s.jsx)(m.Z,{style:{flexGrow:1,backgroundColor:"white",padding:30,overflow:"auto",transition:"flex-grow .3s linear"},children:(0,s.jsx)(eS,{style:{flexGrow:1},start:d,end:x,graphData:j})})]})]})}var eW=eC;var e$=n(37496);function eA(e,t,n,s=[],r){return async(a,o)=>{if(n.length===0){return null}let{filters:l}=await (0,i.lW)("make-filters-from-conditions",{conditions:s.filter(e=>!e.customName)});const c=r==="or"?"$or":"$and";const d=await Promise.all(n.map(async n=>{let[s,r]=await Promise.all([(0,b.Vn)((0,b.ZP)("transactions").filter({[c]:l,account:n.id,date:{$lt:e+"-01"}}).calculate({$sum:"$amount"})).then(({data:e})=>e),(0,b.Vn)((0,b.ZP)("transactions").filter({[c]:[...l]}).filter({account:n.id,$and:[{date:{$gte:e+"-01"}},{date:{$lte:t+"-31"}}]}).groupBy({$month:"$date"}).select([{date:{$month:"$date"}},{amount:{$sum:"$amount"}}])).then(({data:e})=>e)]);return{id:n.id,balances:k(r,"date"),starting:s}}));o(eD(d,e,t))}}function eD(e,t,n){const s=c.Do(t,n);const r=e.map(e=>{let t=e.starting;return s.map(n=>{if(e.balances[n]){t+=e.balances[n].amount}return t})});let a=false;let o=0;let i=0;let h=null;let u=null;const x=s.reduce((e,t,n)=>{let s=0;let c=0;let x=0;const f=e.length===0?null:e[e.length-1];r.forEach(e=>{const t=e[n];if(t<0){s+=-t}else{c+=t}x+=t});if(x<0){a=true}const g=l.Z(t+"-01");const p=f?x-(0,d.l9)(f.y):0;if(e.length===0){o=x}i=x;e.push({x:Z.Z(g,"MMM ’yy"),y:(0,d.Bf)(x),assets:(0,d.zA)(c),debt:`-${(0,d.zA)(s)}`,change:(0,d.zA)(p),networth:(0,d.zA)(x),date:Z.Z(g,"MMMM yyyy")});e.forEach(e=>{if(e.y<h||h===null){h=e.y}if(e.y>u||u===null){u=e.y}});return e},[]);return{graphData:{data:x,hasNegative:a,start:t,end:n},netWorth:i,totalChange:i-o,lowestNetWorth:h,highestNetWorth:u}}var eT=n(65115);var eB=n(7998);var eP=n(88575);var eF=n(55816);var eL=n(10345);var eE=n(32495);var e_=n(7097);const ez=e=>{if(typeof e==="number"){return Math.round(e)}return null};function eK({style:e,graphData:t,compact:n,domain:r}){const a=e=>{return`${Math.round(e).toLocaleString()}`};const o=()=>{const e=Math.max(...t.data.map(e=>e.y));const n=Math.min(...t.data.map(e=>e.y));if(e<=0){return 0}if(n>=0){return 1}return e/(e-n)};const l=o();const i=({active:t,payload:n,label:r})=>{if(t&&n&&n.length){return(0,s.jsx)("div",{className:`${(0,O.iv)({zIndex:1e3,pointerEvents:"none",borderRadius:2,boxShadow:"0 1px 6px rgba(0, 0, 0, .20)",backgroundColor:u.rS.alt2MenuBackground,color:u.rS.alt2MenuItemText,padding:10},e)}`,children:(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{style:{marginBottom:10},children:(0,s.jsx)("strong",{children:n[0].payload.date})}),(0,s.jsxs)("div",{style:{lineHeight:1.5},children:[(0,s.jsx)(x.Z,{left:"Assets:",right:n[0].payload.assets}),(0,s.jsx)(x.Z,{left:"Debt:",right:n[0].payload.debt}),(0,s.jsx)(x.Z,{left:"Net worth:",right:(0,s.jsx)("strong",{children:n[0].payload.networth})}),(0,s.jsx)(x.Z,{left:"Change:",right:n[0].payload.change})]})]})})}};return(0,s.jsx)(G,{style:{...e,...n&&{height:"auto"}},children:(e,r,o)=>t&&(0,s.jsx)(eT.h,{children:(0,s.jsxs)("div",{children:[!n&&(0,s.jsx)("div",{style:{marginTop:"15px"}}),(0,s.jsxs)(eB.T,{width:e,height:r,data:t.data,margin:{top:0,right:0,left:0,bottom:0},children:[n?null:(0,s.jsx)(eP.q,{strokeDasharray:"3 3",vertical:false}),n?null:(0,s.jsx)(eF.K,{dataKey:"x"}),n?null:(0,s.jsx)(eL.B,{dataKey:"y",domain:["auto","auto"],tickFormatter:a}),(0,s.jsx)(eE.u,{content:(0,s.jsx)(i,{}),formatter:ez,isAnimationActive:false}),(0,s.jsx)("defs",{children:(0,s.jsxs)("linearGradient",{id:"splitColor",x1:"0",y1:"0",x2:"0",y2:"1",children:[(0,s.jsx)("stop",{offset:l,stopColor:u.rS.reportsBlue,stopOpacity:.2}),(0,s.jsx)("stop",{offset:l,stopColor:u.rS.reportsRed,stopOpacity:.2})]})}),(0,s.jsx)(e_.u,{type:"linear",dot:false,activeDot:false,animationDuration:0,dataKey:"y",stroke:u.rS.reportsBlue,fill:"url(#splitColor)",fillOpacity:1})]})]})})})}var eR=eK;function eI(){let e=(0,e$.v9)(e=>e.queries.accounts);const{filters:t,saved:n,conditionsOp:a,onApply:o,onDelete:x,onUpdate:f,onCondOpChange:p}=h();const[j,Z]=(0,r.useState)(null);const[b,M]=(0,r.useState)(c.W9(c.dK(),5));const[k,S]=(0,r.useState)(c.dK());const C=(0,r.useMemo)(()=>eA(b,k,e,t,a),[b,k,e,t,a]);const W=eu("net_worth",C);(0,r.useEffect)(()=>{async function e(){const e=await (0,i.lW)("get-earliest-transaction");const t=c.dK();let n=e?c.DT(l.Z(w(e.date))):t;const s=c.W9(c.dK(),12);if(n>s){n=s}const r=c.Do(n,c.dK()).map(e=>({name:e,pretty:c.WU(e,"MMMM, yyyy")})).reverse();Z(r)}e()},[]);function $(e,t){M(e);S(t)}if(!j||!W){return null}return(0,s.jsxs)(m.Z,{style:{...u.W2.page,minWidth:650,overflow:"hidden"},children:[(0,s.jsx)(ec,{title:"Net Worth",allMonths:j,start:b,end:k,onChangeDates:$,filters:t,saved:n,onApply:o,onUpdateFilter:f,onDeleteFilter:x,conditionsOp:a,onCondOpChange:p}),(0,s.jsxs)(m.Z,{style:{backgroundColor:u.rS.tableBackground,padding:30,paddingTop:0,overflow:"auto",flexGrow:1},children:[(0,s.jsxs)(m.Z,{style:{textAlign:"right",paddingTop:20,paddingRight:20,flexShrink:0},children:[(0,s.jsx)(m.Z,{style:{...u.W2.largeText,fontWeight:400,marginBottom:5},children:(0,s.jsx)(y.ZP,{blurIntensity:5,children:(0,d.zA)(W.netWorth)})}),(0,s.jsx)(y.ZP,{children:(0,s.jsx)(v,{amount:W.totalChange})})]}),(0,s.jsx)(eR,{style:{flexGrow:1},start:b,end:k,graphData:W.graphData,domain:{y:[W.lowestNetWorth*.99,W.highestNetWorth*1.01]}}),(0,s.jsxs)(m.Z,{style:{marginTop:30},children:[(0,s.jsx)(g.Z,{children:(0,s.jsx)("strong",{children:"How is net worth calculated?"})}),(0,s.jsx)(g.Z,{children:"Net worth shows the balance of all accounts over time, including all of your investments. Your “net worth” is considered to be the amount you’d have if you sold all your assets and paid off as much debt as possible. If you hover over the graph, you can also see the amount of assets and debt individually."})]})]})]})}var eU=n(58068);var eG=n(99458);var eN=n(99147);function eO({start:e,end:t}){e=l.Z(e);t=l.Z(t);let n;if(e.getYear()!==t.getYear()){n=(0,s.jsxs)("div",{children:[Z.Z(e,"MMM yyyy")," - ",Z.Z(t,"MMM yyyy")]})}else if(e.getMonth()!==t.getMonth()){n=(0,s.jsxs)("div",{children:[Z.Z(e,"MMM")," - ",Z.Z(t,"MMM yyyy")]})}else{n=Z.Z(t,"MMMM yyyy")}return(0,s.jsx)(f.Z,{style:{color:u.rS.pageTextSubdued},children:n})}var eH=eO;function eV({flex:e,to:t,style:n,children:r}){const a={flex:e,margin:15};const o=(0,s.jsx)(m.Z,{style:{backgroundColor:u.rS.tableBackground,borderRadius:2,height:200,boxShadow:"0 2px 6px rgba(0, 0, 0, .15)",transition:"box-shadow .25s","& .recharts-surface:hover":{cursor:"pointer"},":hover":t&&{boxShadow:"0 4px 6px rgba(0, 0, 0, .15)"},...t?null:a,...n},children:r});if(t){return(0,s.jsx)(eN.Z,{to:t,style:{textDecoration:"none",flex:e,...a},children:o})}return o}function eY(){return(0,s.jsx)(m.Z,{style:{height:"100%",alignItems:"center",justifyContent:"center"},children:(0,s.jsx)(eG.Z,{style:{width:25,height:25}})})}function eq({accounts:e}){const t=c.dK();const n=c.W9(t,5);const[a,o]=(0,r.useState)(false);const l=(0,r.useCallback)(()=>o(true));const i=(0,r.useCallback)(()=>o(false));const h=(0,r.useMemo)(()=>eA(n,t,e),[n,t,e]);const x=eu("net_worth",h);return(0,s.jsx)(eV,{flex:2,to:"/reports/net-worth",children:(0,s.jsxs)(m.Z,{style:{flex:1},onPointerEnter:l,onPointerLeave:i,children:[(0,s.jsxs)(m.Z,{style:{flexDirection:"row",padding:20},children:[(0,s.jsxs)(m.Z,{style:{flex:1},children:[(0,s.jsx)(f.Z,{style:{...u.W2.mediumText,fontWeight:500,marginBottom:5},role:"heading",children:"Net Worth"}),(0,s.jsx)(eH,{start:n,end:t})]}),x&&(0,s.jsxs)(m.Z,{style:{textAlign:"right"},children:[(0,s.jsx)(f.Z,{style:{...u.W2.mediumText,fontWeight:500,marginBottom:5},children:(0,s.jsx)(y.ZP,{activationFilters:[!a],children:(0,d.zA)(x.netWorth)})}),(0,s.jsx)(y.ZP,{activationFilters:[!a],children:(0,s.jsx)(v,{amount:x.totalChange,style:{color:u.rS.altTableText,fontWeight:300}})})]})]}),x?(0,s.jsx)(eR,{start:n,end:t,graphData:x.graphData,compact:true,style:{height:"auto",flex:1}}):(0,s.jsx)(eY,{})]})})}function eX(){const e=c.PR();const t=c.dK()+"-01";const n=(0,r.useMemo)(()=>C(t,e),[t,e]);const a=eu("cash_flow_simple",n);const[o,l]=(0,r.useState)(false);const i=(0,r.useCallback)(()=>l(true));const h=(0,r.useCallback)(()=>l(false));const{graphData:x}=a||{};const g=-(x?.expense||0);const p=x?.income||0;return(0,s.jsx)(eV,{flex:1,to:"/reports/cash-flow",children:(0,s.jsxs)(m.Z,{style:{flex:1},onPointerEnter:i,onPointerLeave:h,children:[(0,s.jsxs)(m.Z,{style:{flexDirection:"row",padding:20},children:[(0,s.jsxs)(m.Z,{style:{flex:1},children:[(0,s.jsx)(f.Z,{style:{...u.W2.mediumText,fontWeight:500,marginBottom:5},role:"heading",children:"Cash Flow"}),(0,s.jsx)(eH,{start:t,end:e})]}),a&&(0,s.jsx)(m.Z,{style:{textAlign:"right"},children:(0,s.jsx)(y.ZP,{activationFilters:[!o],children:(0,s.jsx)(v,{amount:p-g,style:{color:u.rS.altTableText,fontWeight:300}})})})]}),a?(0,s.jsx)(G,{style:{height:"auto",flex:1},children:(e,t,n)=>(0,s.jsxs)(T.G,{colorScale:[I.colors.blue,I.colors.red],width:100,height:t,theme:I,domain:{x:[0,100],y:[0,Math.max(p,g,100)]},containerComponent:(0,s.jsx)(D.Z,{voronoiDimension:"x"}),labelComponent:(0,s.jsx)(Y,{portalHost:n,offsetX:(e-100)/2,offsetY:e=>e+40>t?t-40:e,light:true,forceActive:true,style:{padding:0}}),padding:{top:0,bottom:0,left:0,right:0},children:[(0,s.jsx)(B.Z,{barWidth:13,data:[{x:30,y:Math.max(p,5),premadeLabel:(0,s.jsxs)(m.Z,{style:{textAlign:"right"},children:["Income",(0,s.jsx)(m.Z,{children:(0,s.jsx)(y.ZP,{activationFilters:[!o],children:(0,d.zA)(p)})})]}),labelPosition:"left"}],labels:e=>e.premadeLabel}),(0,s.jsx)(B.Z,{barWidth:13,data:[{x:60,y:Math.max(g,5),premadeLabel:(0,s.jsxs)(m.Z,{children:["Expenses",(0,s.jsx)(m.Z,{children:(0,s.jsx)(y.ZP,{activationFilters:[!o],children:(0,d.zA)(g)})})]}),labelPosition:"right"}],labels:e=>e.premadeLabel})]})}):(0,s.jsx)(eY,{})]})})}function eJ(){const{list:e=[]}=(0,eg.Z)();const t=c.PR();const n=c.W9(t,3);const a=(0,r.useMemo)(()=>{return eZ(n,t,3,e.filter(e=>!e.is_income&&!e.hidden))},[n,t,e]);const o=eu("category_spending",a);return(0,s.jsxs)(eV,{flex:1,to:"/reports/category-spending",children:[(0,s.jsx)(m.Z,{children:(0,s.jsx)(m.Z,{style:{flexDirection:"row",padding:"20px 20px 0"},children:(0,s.jsxs)(m.Z,{style:{flex:1},children:[(0,s.jsx)(f.Z,{style:{...u.W2.mediumText,fontWeight:500,marginBottom:5},role:"heading",children:"Spending"}),(0,s.jsx)(eH,{start:n,end:t})]})})}),o?(0,s.jsx)(eS,{start:n,end:t,graphData:o,compact:true}):(0,s.jsx)(eY,{})]})}function eQ(){let e=(0,eU.Z)("categorySpendingReport");let t=(0,e$.v9)(e=>e.queries.accounts);return(0,s.jsxs)(m.Z,{style:{...u.W2.page,...{paddingLeft:40,paddingRight:40,minWidth:700}},children:[(0,s.jsxs)(m.Z,{style:{flexDirection:"row",flex:"0 0 auto"},children:[(0,s.jsx)(eq,{accounts:t}),(0,s.jsx)(eX,{})]}),e&&(0,s.jsxs)(m.Z,{style:{flex:"0 0 auto",flexDirection:"row"},children:[(0,s.jsx)(eJ,{}),(0,s.jsx)("div",{style:{flex:1}}),(0,s.jsx)("div",{style:{flex:1}})]})]})};function e0(){return(0,s.jsxs)(a.Z5,{children:[(0,s.jsx)(a.AW,{path:"/",element:(0,s.jsx)(eQ,{})}),(0,s.jsx)(a.AW,{path:"/net-worth",element:(0,s.jsx)(eI,{})}),(0,s.jsx)(a.AW,{path:"/cash-flow",element:(0,s.jsx)(ef,{})}),(0,s.jsx)(a.AW,{path:"/category-spending",element:(0,s.jsx)(eW,{})})]})}}}]);
2
+ //# sourceMappingURL=reports.778a42ee.chunk.js.map