@actual-app/web 23.7.2 → 23.8.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 (42) hide show
  1. package/build/asset-manifest.json +24 -16
  2. package/build/index.html +1 -1
  3. package/build/kcab/kcab.worker.73a03b9f0217ad62df42.js +3 -0
  4. package/build/kcab/kcab.worker.73a03b9f0217ad62df42.js.map +1 -0
  5. package/build/static/css/{main.1037ae74.css → main.90cc2688.css} +2 -2
  6. package/build/static/css/main.90cc2688.css.map +1 -0
  7. package/build/static/js/281.6bb03bd1.chunk.js +2 -0
  8. package/build/static/js/281.6bb03bd1.chunk.js.map +1 -0
  9. package/build/static/js/383.1b04bac1.chunk.js +2 -0
  10. package/build/static/js/383.1b04bac1.chunk.js.map +1 -0
  11. package/build/static/js/457.4c255aed.chunk.js +2 -0
  12. package/build/static/js/457.4c255aed.chunk.js.map +1 -0
  13. package/build/static/js/876.00fe0e63.chunk.js +2 -0
  14. package/build/static/js/876.00fe0e63.chunk.js.map +1 -0
  15. package/build/static/js/969.b56f4e53.chunk.js +2 -0
  16. package/build/static/js/{969.98ab5142.chunk.js.map → 969.b56f4e53.chunk.js.map} +1 -1
  17. package/build/static/js/main.f758b66a.js +3 -0
  18. package/build/static/js/main.f758b66a.js.map +1 -0
  19. package/build/static/js/narrow-components.55a3b7fd.chunk.js +2 -0
  20. package/build/static/js/narrow-components.55a3b7fd.chunk.js.map +1 -0
  21. package/build/static/js/reports.d1b97437.chunk.js +2 -0
  22. package/build/static/js/reports.d1b97437.chunk.js.map +1 -0
  23. package/build/static/js/resize-observer-polyfill.68c3249b.chunk.js +2 -0
  24. package/build/static/js/{resize-observer-polyfill.a2fa22b1.chunk.js.map → resize-observer-polyfill.68c3249b.chunk.js.map} +1 -1
  25. package/build/static/js/wide-components.6cb72932.chunk.js +2 -0
  26. package/build/static/js/wide-components.6cb72932.chunk.js.map +1 -0
  27. package/package.json +4 -2
  28. package/build/kcab/kcab.worker.7aebb51bfd02e5b1a78f.js +0 -3
  29. package/build/kcab/kcab.worker.7aebb51bfd02e5b1a78f.js.map +0 -1
  30. package/build/static/css/main.1037ae74.css.map +0 -1
  31. package/build/static/js/457.e2e3c7b2.chunk.js +0 -2
  32. package/build/static/js/457.e2e3c7b2.chunk.js.map +0 -1
  33. package/build/static/js/969.98ab5142.chunk.js +0 -2
  34. package/build/static/js/main.6ae08084.js +0 -3
  35. package/build/static/js/main.6ae08084.js.map +0 -1
  36. package/build/static/js/reports.c9bf4be9.chunk.js +0 -2
  37. package/build/static/js/reports.c9bf4be9.chunk.js.map +0 -1
  38. package/build/static/js/resize-observer-polyfill.a2fa22b1.chunk.js +0 -2
  39. package/build/static/media/Inter.var.c2fe3cb2b7c746f7966a.woff2 +0 -0
  40. package/build/static/media/bg.42987350d58d04897ed83a3ce50df2d5.svg +0 -1
  41. /package/build/kcab/{kcab.worker.7aebb51bfd02e5b1a78f.js.LICENSE.txt → kcab.worker.73a03b9f0217ad62df42.js.LICENSE.txt} +0 -0
  42. /package/build/static/js/{main.6ae08084.js.LICENSE.txt → main.f758b66a.js.LICENSE.txt} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/js/wide-components.6cb72932.chunk.js","mappings":"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","sources":["components/common/MenuTooltip.tsx","icons/v2/SettingsSliderAlternate.js","components/filters/FiltersMenu.js","components/filters/SavedFilters.js","icons/v2/CustomNotesPaper.js","components/NotesButton.tsx","components/budget/MonthsContext.js","components/budget/BudgetSummaries.js","components/budget/constants.js","components/budget/MonthPicker.js","components/budget/util.js","components/budget/misc.js","components/budget/DynamicBudgetTable.js","../../loot-core/src/shared/arithmetic.ts","components/budget/BalanceWithCarryover.tsx","icons/v2/ArrowButtonDown1.js","icons/v2/ArrowButtonUp1.js","components/common/HoverTarget.tsx","components/budget/report/ReportContext.tsx","components/budget/report/BudgetSummary.tsx","components/budget/report/components.tsx","components/budget/rollover/TransferTooltip.tsx","components/budget/rollover/HoldTooltip.tsx","components/budget/rollover/RolloverContext.tsx","components/budget/rollover/BudgetSummary.tsx","components/budget/rollover/rollover-components.tsx","components/budget/index.js","icons/v2/Check.js","components/schedules/SchedulesTable.js","components/schedules/index.js","components/schedules/EditSchedule.js","components/schedules/LinkSchedule.js","components/schedules/DiscoverSchedules.js","hooks/useSendPlatformRequest.ts","components/gocardless/GoCardlessLink.js","icons/v0/LeftArrow2.js","icons/v1/ArrowDown.js","icons/v1/ArrowUp.js","icons/v2/Hyperlink2.js","components/transactions/TransactionsTable.js","hooks/usePrevious.js","hooks/useMergedRefs.js","components/transactions/TransactionList.js","icons/v2/ArrowsExpand3.js","icons/v2/ArrowsShrink3.js","icons/v2/DownloadThickBottom.js","icons/v2/Pencil1.js","components/common/MenuButton.tsx","components/transactions/SelectedTransactions.js","icons/v2/ArrowButtonRight1.js","components/accounts/Balance.js","components/accounts/Reconcile.js","components/accounts/Header.js","components/accounts/Account.js","../../loot-core/src/shared/categories.ts","../../loot-core/src/shared/transactions.ts","../../../node_modules/debounce/index.js"],"sourcesContent":["import React from 'react';\n\nimport { Tooltip } from '../tooltips';\n\nexport default function MenuTooltip({ width, onClose, children }) {\n return (\n <Tooltip\n position=\"bottom-right\"\n width={width}\n style={{ padding: 0 }}\n onClose={onClose}\n >\n {children}\n </Tooltip>\n );\n}\n","import * as React from 'react';\nconst SvgSettingsSliderAlternate = props => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n fill=\"currentColor\"\n d=\"M4.5 17.5h6.646a3.5 3.5 0 0 0 6.708 0H19.5a1 1 0 0 0 0-2h-1.646a3.5 3.5 0 0 0-6.708 0H4.5a1 1 0 0 0 0 2Zm10-2.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3ZM19.5 6.5h-6.646a3.5 3.5 0 0 0-6.708 0H4.5a1 1 0 0 0 0 2h1.646a3.5 3.5 0 0 0 6.708 0H19.5a1 1 0 1 0 0-2ZM9.5 9a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3Z\"\n />\n </svg>\n);\nexport default SvgSettingsSliderAlternate;\n","import React, { useState, useRef, useEffect, useReducer } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { FocusScope } from '@react-aria/focus';\nimport {\n parse as parseDate,\n format as formatDate,\n isValid as isDateValid,\n} from 'date-fns';\n\nimport { useFilters } from 'loot-core/src/client/data-hooks/filters';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport { getMonthYearFormat } from 'loot-core/src/shared/months';\nimport {\n mapField,\n friendlyOp,\n deserializeField,\n getFieldError,\n unparse,\n makeValue,\n FIELD_TYPES,\n TYPE_INFO,\n} from 'loot-core/src/shared/rules';\nimport { titleFirst } from 'loot-core/src/shared/util';\n\nimport DeleteIcon from '../../icons/v0/Delete';\nimport SettingsSliderAlternate from '../../icons/v2/SettingsSliderAlternate';\nimport { colors } from '../../style';\nimport Button from '../common/Button';\nimport Menu from '../common/Menu';\nimport Select from '../common/Select';\nimport Stack from '../common/Stack';\nimport Text from '../common/Text';\nimport View from '../common/View';\nimport { Value } from '../ManageRules';\nimport { Tooltip } from '../tooltips';\nimport GenericInput from '../util/GenericInput';\n\nimport { CondOpMenu } from './SavedFilters';\n\nlet filterFields = [\n 'date',\n 'account',\n 'payee',\n 'notes',\n 'category',\n 'amount',\n 'cleared',\n 'saved',\n].map(field => [field, mapField(field)]);\n\nfunction subfieldFromFilter({ field, options, value }) {\n if (field === 'date') {\n if (value.length === 7) {\n return 'month';\n } else if (value.length === 4) {\n return 'year';\n }\n } else if (field === 'amount') {\n if (options && options.inflow) {\n return 'amount-inflow';\n } else if (options && options.outflow) {\n return 'amount-outflow';\n }\n }\n return field;\n}\n\nfunction subfieldToOptions(field, subfield) {\n switch (field) {\n case 'amount':\n switch (subfield) {\n case 'amount-inflow':\n return { inflow: true };\n case 'amount-outflow':\n return { outflow: true };\n default:\n return null;\n }\n case 'date':\n switch (subfield) {\n case 'month':\n return { month: true };\n case 'year':\n return { year: true };\n default:\n return null;\n }\n default:\n return null;\n }\n}\n\nfunction OpButton({ op, selected, style, onClick }) {\n return (\n <Button\n type=\"bare\"\n style={[\n { backgroundColor: colors.n10, marginBottom: 5 },\n style,\n selected && {\n color: 'white',\n '&,:hover,:active': { backgroundColor: colors.b4 },\n },\n ]}\n onClick={onClick}\n >\n {friendlyOp(op)}\n </Button>\n );\n}\n\nfunction updateFilterReducer(state, action) {\n switch (action.type) {\n case 'set-op': {\n let type = FIELD_TYPES.get(state.field);\n let value = state.value;\n if (\n (type === 'id' || type === 'string') &&\n (action.op === 'contains' ||\n action.op === 'is' ||\n action.op === 'doesNotContain' ||\n action.op === 'isNot')\n ) {\n // Clear out the value if switching between contains or\n // is/oneof for the id or string type\n value = null;\n }\n return { ...state, op: action.op, value };\n }\n case 'set-value': {\n let { value } = makeValue(action.value, {\n type: FIELD_TYPES.get(state.field),\n });\n return { ...state, value: value };\n }\n default:\n throw new Error(`Unhandled action type: ${action.type}`);\n }\n}\n\nfunction ConfigureField({\n field,\n initialSubfield = field,\n op,\n value,\n dispatch,\n onApply,\n}) {\n let [subfield, setSubfield] = useState(initialSubfield);\n let inputRef = useRef();\n let prevOp = useRef(null);\n\n useEffect(() => {\n if (prevOp.current !== op && inputRef.current) {\n inputRef.current.focus();\n }\n prevOp.current = op;\n }, [op]);\n\n let type = FIELD_TYPES.get(field);\n let ops = TYPE_INFO[type].ops.filter(op => op !== 'isbetween');\n\n // Month and year fields are quite hacky right now! Figure out how\n // to clean this up later\n if (subfield === 'month' || subfield === 'year') {\n ops = ['is'];\n }\n\n return (\n <Tooltip\n position=\"bottom-left\"\n style={{ padding: 15 }}\n width={275}\n onClose={() => dispatch({ type: 'close' })}\n >\n <FocusScope>\n <View style={{ marginBottom: 10 }}>\n {field === 'amount' || field === 'date' ? (\n <Select\n options={\n field === 'amount'\n ? [\n ['amount', 'Amount'],\n ['amount-inflow', 'Amount (inflow)'],\n ['amount-outflow', 'Amount (outflow)'],\n ]\n : field === 'date'\n ? [\n ['date', 'Date'],\n ['month', 'Month'],\n ['year', 'Year'],\n ]\n : null\n }\n value={subfield}\n onChange={sub => {\n setSubfield(sub);\n\n if (sub === 'month' || sub === 'year') {\n dispatch({ type: 'set-op', op: 'is' });\n }\n }}\n style={{ borderWidth: 1 }}\n />\n ) : (\n titleFirst(mapField(field))\n )}\n </View>\n\n <View\n style={{\n color: colors.n4,\n marginBottom: 10,\n }}\n >\n {field === 'saved' && 'Existing filters will be cleared'}\n </View>\n\n <Stack\n direction=\"row\"\n align=\"flex-start\"\n spacing={1}\n style={{ flexWrap: 'wrap' }}\n >\n {type === 'boolean'\n ? [\n <OpButton\n key=\"true\"\n op=\"true\"\n selected={value === true}\n onClick={() => {\n dispatch({ type: 'set-op', op: 'is' });\n dispatch({ type: 'set-value', value: true });\n }}\n />,\n <OpButton\n key=\"false\"\n op=\"false\"\n selected={value === false}\n onClick={() => {\n dispatch({ type: 'set-op', op: 'is' });\n dispatch({ type: 'set-value', value: false });\n }}\n />,\n ]\n : [\n <Stack\n direction=\"row\"\n align=\"flex-start\"\n spacing={1}\n style={{ flexWrap: 'wrap' }}\n >\n {ops.slice(0, 3).map(currOp => (\n <OpButton\n key={currOp}\n op={currOp}\n selected={currOp === op}\n onClick={() => dispatch({ type: 'set-op', op: currOp })}\n />\n ))}\n </Stack>,\n <Stack\n direction=\"row\"\n align=\"flex-start\"\n spacing={1}\n style={{ flexWrap: 'wrap' }}\n >\n {ops.slice(3, ops.length).map(currOp => (\n <View>\n <OpButton\n key={currOp}\n op={currOp}\n selected={currOp === op}\n onClick={() => dispatch({ type: 'set-op', op: currOp })}\n />\n </View>\n ))}\n </Stack>,\n ]}\n </Stack>\n\n <form action=\"#\">\n {type !== 'boolean' && (\n <GenericInput\n inputRef={inputRef}\n field={field}\n subfield={subfield}\n type={\n type === 'id' && (op === 'contains' || op === 'doesNotContain')\n ? 'string'\n : type\n }\n value={value}\n multi={op === 'oneOf' || op === 'notOneOf'}\n style={{ marginTop: 10 }}\n onChange={v => dispatch({ type: 'set-value', value: v })}\n />\n )}\n\n <Stack\n direction=\"row\"\n justify=\"flex-end\"\n align=\"center\"\n style={{ marginTop: 15 }}\n >\n <View style={{ flex: 1 }} />\n <Button\n type=\"primary\"\n onClick={e => {\n e.preventDefault();\n onApply({\n field,\n op,\n value,\n options: subfieldToOptions(field, subfield),\n });\n }}\n >\n Apply\n </Button>\n </Stack>\n </form>\n </FocusScope>\n </Tooltip>\n );\n}\n\nexport function FilterButton({ onApply }) {\n let filters = useFilters();\n\n let { dateFormat } = useSelector(state => {\n return {\n dateFormat: state.prefs.local.dateFormat || 'MM/dd/yyyy',\n };\n });\n\n let [state, dispatch] = useReducer(\n (state, action) => {\n switch (action.type) {\n case 'select-field':\n return { ...state, fieldsOpen: true, condOpen: false };\n case 'configure': {\n let { field } = deserializeField(action.field);\n let type = FIELD_TYPES.get(field);\n let ops = TYPE_INFO[type].ops;\n return {\n ...state,\n fieldsOpen: false,\n condOpen: true,\n field: action.field,\n op: ops[0],\n value: type === 'boolean' ? true : null,\n };\n }\n case 'close':\n return { fieldsOpen: false, condOpen: false, value: null };\n default:\n return updateFilterReducer(state, action);\n }\n },\n { fieldsOpen: false, condOpen: false, field: null, value: null },\n );\n\n async function onValidateAndApply(cond) {\n cond = unparse({ ...cond, type: FIELD_TYPES.get(cond.field) });\n\n if (cond.type === 'date' && cond.options) {\n if (cond.options.month) {\n let date = parseDate(\n cond.value,\n getMonthYearFormat(dateFormat),\n new Date(),\n );\n if (isDateValid(date)) {\n cond.value = formatDate(date, 'yyyy-MM');\n } else {\n alert('Invalid date format');\n return;\n }\n } else if (cond.options.year) {\n let date = parseDate(cond.value, 'yyyy', new Date());\n if (isDateValid(date)) {\n cond.value = formatDate(date, 'yyyy');\n } else {\n alert('Invalid date format');\n return;\n }\n }\n }\n\n let { error } =\n cond.field !== 'saved' &&\n (await send('rule-validate', {\n conditions: [cond],\n actions: [],\n }));\n\n let saved = filters.find(f => cond.value === f.id);\n\n if (error && error.conditionErrors.length > 0) {\n let field = titleFirst(mapField(cond.field));\n alert(field + ': ' + getFieldError(error.conditionErrors[0]));\n } else {\n onApply(saved ? saved : cond);\n dispatch({ type: 'close' });\n }\n }\n\n return (\n <View>\n <Button type=\"bare\" onClick={() => dispatch({ type: 'select-field' })}>\n <SettingsSliderAlternate\n style={{ width: 16, height: 16, marginRight: 5 }}\n />{' '}\n Filter\n </Button>\n {state.fieldsOpen && (\n <Tooltip\n position=\"bottom-left\"\n style={{ padding: 0 }}\n onClose={() => dispatch({ type: 'close' })}\n >\n <Menu\n onMenuSelect={name => {\n dispatch({ type: 'configure', field: name });\n }}\n items={filterFields.map(([name, text]) => ({\n name: name,\n text: titleFirst(text),\n }))}\n />\n </Tooltip>\n )}\n {state.condOpen && (\n <ConfigureField\n field={state.field}\n op={state.op}\n value={state.value}\n dispatch={dispatch}\n onApply={onValidateAndApply}\n />\n )}\n </View>\n );\n}\n\nfunction FilterEditor({ field, op, value, options, onSave, onClose }) {\n let [state, dispatch] = useReducer(\n (state, action) => {\n switch (action.type) {\n case 'close':\n onClose();\n return state;\n default:\n return updateFilterReducer(state, action);\n }\n },\n { field, op, value, options },\n );\n\n return (\n <ConfigureField\n field={state.field}\n initialSubfield={subfieldFromFilter({ field, options, value })}\n op={state.op}\n value={state.value}\n options={state.options}\n dispatch={dispatch}\n onApply={cond => {\n onSave(cond);\n onClose();\n }}\n />\n );\n}\n\nfunction FilterExpression({\n field: originalField,\n customName,\n op,\n value,\n options,\n stage,\n style,\n onChange,\n onDelete,\n}) {\n let [editing, setEditing] = useState(false);\n\n let field = subfieldFromFilter({ field: originalField, value });\n\n return (\n <View\n style={[\n {\n backgroundColor: colors.n9,\n borderRadius: 4,\n flexDirection: 'row',\n alignItems: 'center',\n marginRight: 10,\n marginTop: 10,\n },\n style,\n ]}\n >\n <Button\n type=\"bare\"\n disabled={customName != null}\n onClick={() => setEditing(true)}\n style={{ marginRight: -7 }}\n >\n <div style={{ paddingBlock: 1, paddingLeft: 5, paddingRight: 2 }}>\n {customName ? (\n <Text style={{ color: colors.p4 }}>{customName}</Text>\n ) : (\n <>\n <Text style={{ color: colors.p4 }}>\n {mapField(field, options)}\n </Text>{' '}\n <Text style={{ color: colors.n3 }}>{friendlyOp(op, null)}</Text>{' '}\n <Value\n value={value}\n field={field}\n inline={true}\n valueIsRaw={op === 'contains' || op === 'doesNotContain'}\n />\n </>\n )}\n </div>\n </Button>\n <Button type=\"bare\" onClick={onDelete}>\n <DeleteIcon\n style={{\n width: 8,\n height: 8,\n margin: 5,\n marginLeft: 3,\n }}\n />\n </Button>\n {editing && (\n <FilterEditor\n field={originalField}\n customName={customName}\n op={op}\n value={value}\n options={options}\n stage={stage}\n onSave={onChange}\n onClose={() => setEditing(false)}\n />\n )}\n </View>\n );\n}\n\nexport function AppliedFilters({\n filters,\n editingFilter,\n onUpdate,\n onDelete,\n conditionsOp,\n onCondOpChange,\n}) {\n return (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'flex-start',\n flexWrap: 'wrap',\n }}\n >\n <CondOpMenu\n conditionsOp={conditionsOp}\n onCondOpChange={onCondOpChange}\n filters={filters}\n />\n {filters.map((filter, i) => (\n <FilterExpression\n key={i}\n customName={filter.customName}\n field={filter.field}\n op={filter.op}\n value={filter.value}\n options={filter.options}\n editing={editingFilter === filter}\n onChange={newFilter => onUpdate(filter, newFilter)}\n onDelete={() => onDelete(filter)}\n />\n ))}\n </View>\n );\n}\n","import React, { useState, useRef, useEffect } from 'react';\n\nimport { send, sendCatch } from 'loot-core/src/platform/client/fetch';\n\nimport ExpandArrow from '../../icons/v0/ExpandArrow';\nimport { colors } from '../../style';\nimport Button from '../common/Button';\nimport Menu from '../common/Menu';\nimport MenuTooltip from '../common/MenuTooltip';\nimport Stack from '../common/Stack';\nimport Text from '../common/Text';\nimport View from '../common/View';\nimport { FormField, FormLabel } from '../forms';\nimport { FieldSelect } from '../modals/EditRule';\nimport GenericInput from '../util/GenericInput';\n\nimport { AppliedFilters } from './FiltersMenu';\n\nfunction SavedFilterMenuButton({\n filters,\n conditionsOp,\n filterId,\n onClearFilters,\n onReloadSavedFilter,\n filtersList,\n}) {\n let [nameOpen, setNameOpen] = useState(false);\n let [adding, setAdding] = useState(false);\n let [menuOpen, setMenuOpen] = useState(false);\n let [err, setErr] = useState(null);\n let [menuItem, setMenuItem] = useState(null);\n let inputRef = useRef();\n let name = filterId.name;\n let id = filterId.id;\n let res;\n let savedFilter;\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }, [NameFilter]);\n\n const onFilterMenuSelect = async item => {\n setMenuItem(item);\n switch (item) {\n case 'rename-filter':\n setErr(null);\n setAdding(false);\n setMenuOpen(false);\n setNameOpen(true);\n break;\n case 'delete-filter':\n setMenuOpen(false);\n await send('filter-delete', id);\n onClearFilters();\n break;\n case 'update-filter':\n setErr(null);\n setAdding(false);\n setMenuOpen(false);\n savedFilter = {\n conditions: filters,\n conditionsOp: conditionsOp,\n id: filterId.id,\n name: filterId.name,\n status: 'saved',\n };\n res = await sendCatch('filter-update', {\n state: savedFilter,\n filters: [...filtersList],\n });\n if (res.error) {\n setErr(res.error.message);\n setNameOpen(true);\n } else {\n onReloadSavedFilter(savedFilter, 'update');\n }\n break;\n case 'save-filter':\n setErr(null);\n setAdding(true);\n setMenuOpen(false);\n setNameOpen(true);\n break;\n case 'reload-filter':\n setMenuOpen(false);\n savedFilter = {\n status: 'saved',\n };\n onReloadSavedFilter(savedFilter, 'reload');\n break;\n case 'clear-filter':\n setMenuOpen(false);\n onClearFilters();\n break;\n default:\n }\n };\n\n function FilterMenu({ onClose, filterId }) {\n return (\n <MenuTooltip width={200} onClose={onClose}>\n <Menu\n onMenuSelect={item => {\n onFilterMenuSelect(item);\n }}\n items={[\n ...(!filterId.id\n ? [\n { name: 'save-filter', text: 'Save new filter' },\n { name: 'clear-filter', text: 'Clear all conditions' },\n ]\n : [\n ...(filterId.id !== null && filterId.status === 'saved'\n ? [\n { name: 'rename-filter', text: 'Rename' },\n { name: 'delete-filter', text: 'Delete' },\n Menu.line,\n {\n name: 'save-filter',\n text: 'Save new filter',\n disabled: true,\n },\n { name: 'clear-filter', text: 'Clear all conditions' },\n ]\n : [\n { name: 'rename-filter', text: 'Rename' },\n { name: 'update-filter', text: 'Update condtions' },\n { name: 'reload-filter', text: 'Revert changes' },\n { name: 'delete-filter', text: 'Delete' },\n Menu.line,\n { name: 'save-filter', text: 'Save new filter' },\n { name: 'clear-filter', text: 'Clear all conditions' },\n ]),\n ]),\n ]}\n />\n </MenuTooltip>\n );\n }\n\n async function onAddUpdate() {\n if (adding) {\n //create new flow\n savedFilter = {\n conditions: filters,\n conditionsOp: conditionsOp,\n name: name,\n status: 'saved',\n };\n res = await sendCatch('filter-create', {\n state: savedFilter,\n filters: [...filtersList],\n });\n savedFilter = {\n ...savedFilter,\n id: res.data,\n };\n } else {\n //rename flow\n savedFilter = {\n conditions: filterId.conditions,\n conditionsOp: filterId.conditionsOp,\n id: filterId.id,\n name: name,\n };\n res = await sendCatch('filter-update', {\n state: savedFilter,\n filters: [...filtersList],\n });\n }\n if (res.error) {\n setErr(res.error.message);\n } else {\n setNameOpen(false);\n onReloadSavedFilter(savedFilter);\n }\n }\n\n function NameFilter({ onClose }) {\n return (\n <MenuTooltip width={325} onClose={onClose}>\n {menuItem !== 'update-filter' && (\n <form>\n <Stack\n direction=\"row\"\n justify=\"flex-end\"\n align=\"center\"\n style={{ padding: 10 }}\n >\n <FormField style={{ flex: 1 }}>\n <FormLabel\n title=\"Filter Name\"\n htmlFor=\"name-field\"\n style={{ userSelect: 'none' }}\n />\n <GenericInput\n inputRef={inputRef}\n id=\"name-field\"\n field=\"string\"\n type=\"string\"\n value={name}\n onChange={e => (name = e)}\n />\n </FormField>\n <Button\n type=\"primary\"\n style={{ marginTop: 18 }}\n onClick={e => {\n e.preventDefault();\n onAddUpdate();\n }}\n >\n {adding ? 'Add' : 'Update'}\n </Button>\n </Stack>\n </form>\n )}\n {err && (\n <Stack direction=\"row\" align=\"center\" style={{ padding: 10 }}>\n <Text style={{ color: colors.r4 }}>{err}</Text>\n </Stack>\n )}\n </MenuTooltip>\n );\n }\n\n return (\n <View>\n {filters.length > 0 && (\n <Button\n type=\"bare\"\n style={{ marginTop: 10 }}\n onClick={() => {\n setMenuOpen(true);\n }}\n >\n <Text\n style={{\n maxWidth: 150,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n flexShrink: 0,\n }}\n >\n {!filterId.id ? 'Unsaved filter' : filterId.name}&nbsp;\n </Text>\n {filterId.id && filterId.status !== 'saved' && (\n <Text>(modified)&nbsp;</Text>\n )}\n <ExpandArrow width={8} height={8} style={{ marginRight: 5 }} />\n </Button>\n )}\n {menuOpen && (\n <FilterMenu onClose={() => setMenuOpen(false)} filterId={filterId} />\n )}\n {nameOpen && <NameFilter onClose={() => setNameOpen(false)} />}\n </View>\n );\n}\n\nexport function CondOpMenu({ conditionsOp, onCondOpChange, filters }) {\n return (\n filters.length > 1 && (\n <Text style={{ color: colors.n4, marginTop: 11, marginRight: 5 }}>\n <FieldSelect\n style={{ display: 'inline-flex' }}\n fields={[\n ['and', 'all'],\n ['or', 'any'],\n ]}\n value={conditionsOp}\n onChange={(name, value) => onCondOpChange(value, filters)}\n />\n of:\n </Text>\n )\n );\n}\n\nexport function FiltersStack({\n filters,\n conditionsOp,\n onUpdateFilter,\n onDeleteFilter,\n onClearFilters,\n onReloadSavedFilter,\n filterId,\n filtersList,\n onCondOpChange,\n}) {\n return (\n <View>\n <Stack\n spacing={2}\n direction=\"row\"\n justify=\"flex-start\"\n align=\"flex-start\"\n >\n <AppliedFilters\n filters={filters}\n conditionsOp={conditionsOp}\n onCondOpChange={onCondOpChange}\n onUpdate={onUpdateFilter}\n onDelete={onDeleteFilter}\n />\n <View style={{ flex: 1 }} />\n <SavedFilterMenuButton\n filters={filters}\n conditionsOp={conditionsOp}\n filterId={filterId}\n onClearFilters={onClearFilters}\n onReloadSavedFilter={onReloadSavedFilter}\n filtersList={filtersList}\n />\n </Stack>\n </View>\n );\n}\n","import * as React from 'react';\nconst SvgCustomNotesPaper = props => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 19 24\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n fill=\"currentColor\"\n d=\"M17 24H2a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2h9a1 1 0 0 1 .707.293l7 7A1 1 0 0 1 19 8v14a2 2 0 0 1-2 2ZM2 21.5a.5.5 0 0 0 .5.5h14a.5.5 0 0 0 .5-.5V9a.5.5 0 0 0-.5-.5h-4a2 2 0 0 1-2-2v-4A.5.5 0 0 0 10 2H2.5a.5.5 0 0 0-.5.5v19Z\"\n />\n </svg>\n);\nexport default SvgCustomNotesPaper;\n","import React, { createRef, useState, useEffect } from 'react';\n\nimport { type CSSProperties, css } from 'glamor';\n\nimport q from 'loot-core/src/client/query-helpers';\nimport { useLiveQuery } from 'loot-core/src/client/query-hooks';\nimport { send } from 'loot-core/src/platform/client/fetch';\n\nimport CustomNotesPaper from '../icons/v2/CustomNotesPaper';\nimport { colors } from '../style';\n\nimport Button from './common/Button';\nimport Text from './common/Text';\nimport View from './common/View';\nimport { Tooltip, useTooltip } from './tooltips';\n\ntype NotesTooltipProps = {\n editable?: boolean;\n defaultNotes?: string;\n position?: string;\n onClose?: (notes: string) => void;\n};\nfunction NotesTooltip({\n editable,\n defaultNotes,\n position = 'bottom-left',\n onClose,\n}: NotesTooltipProps) {\n let [notes, setNotes] = useState<string>(defaultNotes);\n let inputRef = createRef<HTMLTextAreaElement>();\n\n useEffect(() => {\n if (editable) {\n inputRef.current.focus();\n }\n }, [inputRef, editable]);\n\n return (\n <Tooltip position={position} onClose={() => onClose(notes)}>\n {editable ? (\n <textarea\n ref={inputRef}\n {...css({\n border: '1px solid ' + colors.border,\n padding: 7,\n minWidth: 300,\n minHeight: 120,\n outline: 'none',\n })}\n value={notes || ''}\n onChange={e => setNotes(e.target.value)}\n />\n ) : (\n <Text\n {...css({\n display: 'block',\n maxWidth: 225,\n padding: 8,\n whiteSpace: 'pre-wrap',\n overflowWrap: 'break-word',\n })}\n >\n {notes}\n </Text>\n )}\n </Tooltip>\n );\n}\n\ntype NotesButtonProps = {\n id: string;\n width?: number;\n height?: number;\n defaultColor?: string;\n tooltipPosition?: string;\n style?: CSSProperties;\n};\nexport default function NotesButton({\n id,\n width = 12,\n height = 12,\n defaultColor = colors.n8,\n tooltipPosition,\n style,\n}: NotesButtonProps) {\n let [hover, setHover] = useState(false);\n let tooltip = useTooltip();\n let data = useLiveQuery(() => q('notes').filter({ id }).select('*'), [id]);\n let note = data && data.length > 0 ? data[0].note : null;\n let hasNotes = note && note !== '';\n\n function onClose(notes) {\n send('notes-save', { id, note: notes });\n tooltip.close();\n }\n\n const [delayHandler, setDelayHandler] = useState(null);\n\n const handleMouseEnter = () => {\n setDelayHandler(\n setTimeout(() => {\n setHover(true);\n }, 300),\n );\n };\n\n const handleMouseLeave = () => {\n clearTimeout(delayHandler);\n setHover(false);\n };\n\n // This account for both the tooltip hover, and editing tooltip\n const tooltipOpen = tooltip.isOpen || (hasNotes && hover);\n\n return (\n <View\n style={[{ flexShrink: 0 }]}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <Button\n type=\"bare\"\n className={!hasNotes && !tooltipOpen ? 'hover-visible' : ''}\n style={[\n { color: defaultColor },\n style,\n hasNotes && { display: 'flex !important' },\n tooltipOpen && { color: colors.n1 },\n ]}\n {...tooltip.getOpenEvents()}\n >\n <CustomNotesPaper style={{ width, height }} />\n </Button>\n {tooltipOpen && (\n <NotesTooltip\n editable={tooltip.isOpen}\n defaultNotes={note}\n position={tooltipPosition}\n onClose={onClose}\n />\n )}\n </View>\n );\n}\n","import React, { createContext } from 'react';\n\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nexport function getValidMonthBounds(bounds, startMonth, endMonth) {\n return {\n start: startMonth < bounds.start ? bounds.start : startMonth,\n end: endMonth > bounds.end ? bounds.end : endMonth,\n };\n}\n\nexport let MonthsContext = createContext();\n\nexport function MonthsProvider({\n startMonth,\n numMonths,\n monthBounds,\n type,\n children,\n}) {\n let endMonth = monthUtils.addMonths(startMonth, numMonths - 1);\n let bounds = getValidMonthBounds(monthBounds, startMonth, endMonth);\n let months = monthUtils.rangeInclusive(bounds.start, bounds.end);\n\n return (\n <MonthsContext.Provider value={{ months, type }}>\n {children}\n </MonthsContext.Provider>\n );\n}\n","import React, {\n useContext,\n useState,\n useRef,\n useCallback,\n useLayoutEffect,\n} from 'react';\nimport { useSpring, animated } from 'react-spring';\n\nimport { css } from 'glamor';\n\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nimport useResizeObserver from '../../hooks/useResizeObserver';\nimport View from '../common/View';\n\nimport { MonthsContext } from './MonthsContext';\n\nexport default function BudgetSummaries({ SummaryComponent }) {\n let { months } = useContext(MonthsContext);\n\n let [widthState, setWidthState] = useState(0);\n let [styles, spring] = useSpring(() => ({\n x: 0,\n config: { mass: 3, tension: 600, friction: 80 },\n }));\n\n let containerRef = useResizeObserver(\n useCallback(rect => {\n setWidthState(rect.width);\n }, []),\n );\n\n let prevMonth0 = useRef(months[0]);\n\n let allMonths = [...months];\n allMonths.unshift(monthUtils.subMonths(months[0], 1));\n allMonths.push(monthUtils.addMonths(months[months.length - 1], 1));\n let monthWidth = widthState / months.length;\n\n useLayoutEffect(() => {\n let prevMonth = prevMonth0.current;\n let reversed = prevMonth > months[0];\n let offsetX = monthWidth;\n let from = reversed ? -offsetX * 2 : 0;\n if (prevMonth !== allMonths[0] && prevMonth !== allMonths[2]) {\n from = -offsetX;\n }\n let to = -offsetX;\n spring.start({ from: { x: from }, x: to });\n }, [months[0]]);\n\n useLayoutEffect(() => {\n prevMonth0.current = months[0];\n }, [months[0]]);\n\n useLayoutEffect(() => {\n spring.start({ from: { x: -monthWidth }, to: { x: -monthWidth } });\n }, [monthWidth]);\n\n return (\n <div\n {...css([\n { flex: 1, overflow: 'hidden' },\n months.length === 1 && {\n marginLeft: -4,\n marginRight: -4,\n },\n ])}\n ref={containerRef}\n >\n <animated.div\n className=\"view\"\n style={{\n flexDirection: 'row',\n width: widthState,\n willChange: 'transform',\n transform: styles.x.to(x => `translateX(${x}px)`),\n }}\n >\n {allMonths.map(month => {\n return (\n <View\n key={month}\n style={[\n { flex: `0 0 ${monthWidth}px` },\n { paddingLeft: 4, paddingRight: 4 },\n ]}\n >\n <SummaryComponent month={month} />\n </View>\n );\n })}\n </animated.div>\n </div>\n );\n}\n","export const INCOME_HEADER_HEIGHT = 70;\nexport const MONTH_BOX_SHADOW =\n '0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24)';\nexport const MONTH_RIGHT_PADDING = 5;\n","import { useState } from 'react';\n\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nimport useResizeObserver from '../../hooks/useResizeObserver';\nimport { styles, colors } from '../../style';\nimport View from '../common/View';\n\nexport const MonthPicker = ({\n startMonth,\n numDisplayed,\n monthBounds,\n style,\n onSelect,\n}) => {\n const [hoverId, setHoverId] = useState(null);\n const [targetMonthCount, setTargetMonthCount] = useState(12);\n\n const currentMonth = monthUtils.currentMonth();\n const firstSelectedMonth = startMonth;\n\n const lastSelectedMonth = monthUtils.addMonths(\n firstSelectedMonth,\n numDisplayed - 1,\n );\n\n const range = monthUtils.rangeInclusive(\n monthUtils.subMonths(\n firstSelectedMonth,\n targetMonthCount / 2 - numDisplayed / 2,\n ),\n monthUtils.addMonths(\n lastSelectedMonth,\n targetMonthCount / 2 - numDisplayed / 2,\n ),\n );\n\n const firstSelectedIndex =\n Math.floor(range.length / 2) - Math.floor(numDisplayed / 2);\n const lastSelectedIndex = firstSelectedIndex + numDisplayed - 1;\n\n const [size, setSize] = useState('small');\n const containerRef = useResizeObserver(rect => {\n setSize(rect.width <= 400 ? 'small' : 'big');\n setTargetMonthCount(\n Math.min(Math.max(Math.floor(rect.width / 50), 12), 24),\n );\n });\n\n let yearHeadersShown = [];\n\n return (\n <View\n style={[\n {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n },\n style,\n ]}\n >\n <View\n innerRef={containerRef}\n style={{\n flexDirection: 'row',\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {range.map((month, idx) => {\n const monthName = monthUtils.format(month, 'MMM');\n const selected =\n idx >= firstSelectedIndex && idx <= lastSelectedIndex;\n\n const lastHoverId = hoverId + numDisplayed - 1;\n const hovered =\n hoverId === null ? false : idx >= hoverId && idx <= lastHoverId;\n\n const current = currentMonth === month;\n const year = monthUtils.getYear(month);\n\n let showYearHeader = false;\n\n if (!yearHeadersShown.includes(year)) {\n yearHeadersShown.push(year);\n showYearHeader = true;\n }\n\n const isMonthBudgeted =\n month >= monthBounds.start && month <= monthBounds.end;\n\n return (\n <View\n key={month}\n style={[\n {\n padding: '3px 3px',\n width: size === 'big' ? '35px' : '20px',\n textAlign: 'center',\n userSelect: 'none',\n cursor: 'default',\n borderRadius: 2,\n border: 'none',\n },\n !isMonthBudgeted && {\n textDecoration: 'line-through',\n color: colors.n7,\n },\n styles.smallText,\n selected && {\n backgroundColor: colors.p6,\n color: 'white',\n },\n (hovered || selected) && {\n borderRadius: 0,\n cursor: 'pointer',\n },\n hovered &&\n !selected && {\n backgroundColor: 'rgba(100, 100, 100, .15)',\n },\n hovered &&\n selected && {\n backgroundColor: colors.p7,\n },\n (idx === firstSelectedIndex ||\n (idx === hoverId && !selected)) && {\n borderTopLeftRadius: 2,\n borderBottomLeftRadius: 2,\n },\n (idx === lastSelectedIndex ||\n (idx === lastHoverId && !selected)) && {\n borderTopRightRadius: 2,\n borderBottomRightRadius: 2,\n },\n current && { fontWeight: 'bold' },\n ]}\n onClick={() => onSelect(month)}\n onMouseEnter={() => setHoverId(idx)}\n onMouseLeave={() => setHoverId(null)}\n >\n {size === 'small' ? monthName[0] : monthName}\n {showYearHeader && (\n <View\n style={[\n {\n position: 'absolute',\n top: -14,\n left: 0,\n fontSize: 10,\n fontWeight: 'bold',\n color: isMonthBudgeted ? '#272630' : colors.n7,\n },\n ]}\n >\n {year}\n </View>\n )}\n </View>\n );\n })}\n </View>\n </View>\n );\n};\n","import { createContext } from 'react';\n\nimport { colors } from '../../style';\n\nexport let CategoryGroupsContext = createContext([]);\n\nexport function addToBeBudgetedGroup(groups) {\n return [\n {\n id: 'to-be-budgeted',\n name: 'To Be Budgeted',\n categories: [{ id: 'to-be-budgeted', name: 'To Be Budgeted' }],\n },\n ...groups,\n ];\n}\n\nexport function separateGroups(categoryGroups) {\n return [\n categoryGroups.filter(g => !g.is_income),\n categoryGroups.find(g => g.is_income),\n ];\n}\n\nexport function makeAmountGrey(value) {\n return value === 0 || value === '0' || value === ''\n ? { color: colors.n10 }\n : null;\n}\n\nexport function makeAmountStyle(value) {\n const greyed = makeAmountGrey(value);\n if (greyed) {\n return greyed;\n }\n\n if (value < 0) {\n return { color: colors.r4 };\n }\n}\n\nexport function makeAmountFullStyle(value) {\n return {\n color: value < 0 ? colors.r4 : value === 0 ? colors.n10 : colors.g4,\n };\n}\n\nexport function findSortDown(arr, pos, targetId) {\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(arr, pos, targetId) {\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","import React, {\n createRef,\n memo,\n Component,\n useContext,\n useState,\n useMemo,\n} from 'react';\n\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nimport ExpandArrow from '../../icons/v0/ExpandArrow';\nimport CheveronDown from '../../icons/v1/CheveronDown';\nimport DotsHorizontalTriple from '../../icons/v1/DotsHorizontalTriple';\nimport { styles, colors } from '../../style';\nimport Button from '../common/Button';\nimport Menu from '../common/Menu';\nimport Text from '../common/Text';\nimport View from '../common/View';\nimport NotesButton from '../NotesButton';\nimport {\n useDraggable,\n useDroppable,\n DropHighlight,\n DropHighlightPosContext,\n} from '../sort';\nimport NamespaceContext from '../spreadsheet/NamespaceContext';\nimport { Row, InputCell, ROW_HEIGHT } from '../table';\nimport { Tooltip, IntersectionBoundary } from '../tooltips';\n\nimport BudgetSummaries from './BudgetSummaries';\nimport { INCOME_HEADER_HEIGHT, MONTH_BOX_SHADOW } from './constants';\nimport { MonthPicker } from './MonthPicker';\nimport { MonthsProvider, MonthsContext } from './MonthsContext';\nimport { separateGroups, findSortDown, findSortUp } from './util';\n\nfunction getScrollbarWidth() {\n return Math.max(styles.scrollbarWidth - 2, 0);\n}\n\nexport class BudgetTable extends Component {\n constructor(props) {\n super(props);\n this.budgetCategoriesRef = createRef();\n\n this.state = {\n editing: null,\n draggingState: null,\n showHiddenCategories: props.prefs['budget.showHiddenCategories'] ?? false,\n };\n }\n\n onEditMonth = (id, monthIndex) => {\n this.setState({ editing: id ? { id, cell: monthIndex } : null });\n };\n\n onEditName = id => {\n this.setState({ editing: id ? { id, cell: 'name' } : null });\n };\n\n onReorderCategory = (id, dropPos, targetId) => {\n let { categoryGroups } = this.props;\n\n let isGroup = !!categoryGroups.find(g => g.id === targetId);\n\n if (isGroup) {\n let { targetId: groupId } = findSortUp(categoryGroups, dropPos, targetId);\n let group = categoryGroups.find(g => g.id === groupId);\n\n if (group) {\n let { categories } = group;\n this.props.onReorderCategory({\n id,\n groupId: group.id,\n targetId:\n categories.length === 0 || dropPos === 'top'\n ? null\n : categories[0].id,\n });\n }\n } else {\n let targetGroup;\n\n for (let group of categoryGroups) {\n if (group.categories.find(cat => cat.id === targetId)) {\n targetGroup = group;\n break;\n }\n }\n\n this.props.onReorderCategory({\n id,\n groupId: targetGroup.id,\n ...findSortDown(targetGroup.categories, dropPos, targetId),\n });\n }\n };\n\n onReorderGroup = (id, dropPos, targetId) => {\n let { categoryGroups } = this.props;\n\n this.props.onReorderGroup({\n id,\n ...findSortDown(categoryGroups, dropPos, targetId),\n });\n };\n\n moveVertically = dir => {\n let { editing } = this.state;\n let { type, categoryGroups, collapsed } = this.props;\n\n const flattened = categoryGroups.reduce((all, group) => {\n if (collapsed.includes(group.id)) {\n return all.concat({ id: group.id, isGroup: true });\n }\n return all.concat([{ id: group.id, isGroup: true }, ...group.categories]);\n }, []);\n\n if (editing) {\n const idx = flattened.findIndex(item => item.id === editing.id);\n let nextIdx = idx + dir;\n\n while (nextIdx >= 0 && nextIdx < flattened.length) {\n const next = flattened[nextIdx];\n\n if (next.isGroup) {\n nextIdx += dir;\n continue;\n } else if (type === 'report' || !next.is_income) {\n this.onEditMonth(next.id, editing.cell);\n return;\n } else {\n break;\n }\n }\n }\n };\n\n onKeyDown = e => {\n if (!this.state.editing) {\n return null;\n }\n\n if (e.key === 'Enter' || e.key === 'Tab') {\n e.preventDefault();\n this.moveVertically(e.shiftKey ? -1 : 1);\n }\n };\n\n onShowActivity = (catName, catId, monthIndex) => {\n this.props.onShowActivity(catName, catId, this.resolveMonth(monthIndex));\n };\n\n onBudgetAction = (monthIndex, type, args) => {\n this.props.onBudgetAction(this.resolveMonth(monthIndex), type, args);\n };\n\n resolveMonth = monthIndex => {\n return monthUtils.addMonths(this.props.startMonth, monthIndex);\n };\n\n clearEditing() {\n this.setState({ editing: null });\n }\n\n toggleHiddenCategories = () => {\n this.setState(prevState => ({\n showHiddenCategories: !prevState.showHiddenCategories,\n }));\n this.props.savePrefs({\n 'budget.showHiddenCategories': !this.state.showHiddenCategories,\n });\n };\n\n expandAllCategories = () => {\n this.props.setCollapsed([]);\n };\n\n collapseAllCategories = () => {\n let { setCollapsed, categoryGroups } = this.props;\n setCollapsed(categoryGroups.map(g => g.id));\n };\n\n render() {\n let {\n type,\n categoryGroups,\n prewarmStartMonth,\n startMonth,\n numMonths,\n monthBounds,\n collapsed,\n setCollapsed,\n newCategoryForGroup,\n dataComponents,\n isAddingGroup,\n onSaveCategory,\n onSaveGroup,\n onDeleteCategory,\n onDeleteGroup,\n onShowNewCategory,\n onHideNewCategory,\n onShowNewGroup,\n onHideNewGroup,\n } = this.props;\n let { editing, draggingState, showHiddenCategories } = this.state;\n\n return (\n <View\n data-testid=\"budget-table\"\n style={[\n { flex: 1 },\n styles.lightScrollbar && {\n '& ::-webkit-scrollbar': {\n backgroundColor: 'transparent',\n },\n '& ::-webkit-scrollbar-thumb:vertical': {\n backgroundColor: 'white',\n },\n },\n ]}\n >\n <View\n style={{\n flexDirection: 'row',\n overflow: 'hidden',\n flexShrink: 0,\n // This is necessary to align with the table because the\n // table has this padding to allow the shadow to show\n paddingLeft: 5,\n paddingRight: 5 + getScrollbarWidth(),\n }}\n >\n <View style={{ width: 200 }} />\n <MonthsProvider\n startMonth={prewarmStartMonth}\n numMonths={numMonths}\n monthBounds={monthBounds}\n type={type}\n >\n <BudgetSummaries\n SummaryComponent={dataComponents.SummaryComponent}\n />\n </MonthsProvider>\n </View>\n\n <MonthsProvider\n startMonth={startMonth}\n numMonths={numMonths}\n monthBounds={monthBounds}\n type={type}\n >\n <BudgetTotals\n MonthComponent={dataComponents.BudgetTotalsComponent}\n toggleHiddenCategories={this.toggleHiddenCategories}\n expandAllCategories={this.expandAllCategories}\n collapseAllCategories={this.collapseAllCategories}\n />\n <IntersectionBoundary.Provider value={this.budgetCategoriesRef}>\n <View\n style={{\n overflowY: 'scroll',\n overflowAnchor: 'none',\n flex: 1,\n paddingLeft: 5,\n paddingRight: 5,\n }}\n innerRef={this.budgetCategoriesRef}\n >\n <View\n style={{\n opacity: draggingState ? 0.5 : 1,\n flexShrink: 0,\n }}\n onKeyDown={this.onKeyDown}\n innerRef={el => (this.budgetDataNode = el)}\n >\n <BudgetCategories\n showHiddenCategories={showHiddenCategories}\n categoryGroups={categoryGroups}\n newCategoryForGroup={newCategoryForGroup}\n isAddingGroup={isAddingGroup}\n editingCell={editing}\n collapsed={collapsed}\n setCollapsed={setCollapsed}\n dataComponents={dataComponents}\n onEditMonth={this.onEditMonth}\n onEditName={this.onEditName}\n onSaveCategory={onSaveCategory}\n onSaveGroup={onSaveGroup}\n onDeleteCategory={onDeleteCategory}\n onDeleteGroup={onDeleteGroup}\n onReorderCategory={this.onReorderCategory}\n onReorderGroup={this.onReorderGroup}\n onShowNewCategory={onShowNewCategory}\n onHideNewCategory={onHideNewCategory}\n onShowNewGroup={onShowNewGroup}\n onHideNewGroup={onHideNewGroup}\n onBudgetAction={this.onBudgetAction}\n onShowActivity={this.onShowActivity}\n />\n </View>\n </View>\n </IntersectionBoundary.Provider>\n </MonthsProvider>\n </View>\n );\n }\n}\n\nfunction SidebarCategory({\n innerRef,\n category,\n dragPreview,\n dragging,\n editing,\n style,\n borderColor = colors.border,\n isLast,\n onDragChange,\n onEditMonth,\n onEditName,\n onSave,\n onDelete,\n onHideNewCategory,\n}) {\n const temporary = category.id === 'new';\n const [menuOpen, setMenuOpen] = useState(false);\n\n const displayed = (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n userSelect: 'none',\n WebkitUserSelect: 'none',\n opacity: category.hidden ? 0.33 : undefined,\n }}\n >\n <div\n data-testid=\"category-name\"\n style={{\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n minWidth: 0,\n }}\n >\n {category.name}\n </div>\n <View style={{ flexShrink: 0, marginLeft: 5 }}>\n <Button\n type=\"bare\"\n onClick={e => {\n e.stopPropagation();\n setMenuOpen(true);\n }}\n style={{ color: 'currentColor', padding: 3 }}\n >\n <CheveronDown\n width={14}\n height={14}\n style={{ color: 'currentColor' }}\n />\n </Button>\n {menuOpen && (\n <Tooltip\n position=\"bottom-left\"\n width={200}\n style={{ padding: 0 }}\n onClose={() => setMenuOpen(false)}\n >\n <Menu\n onMenuSelect={type => {\n if (type === 'rename') {\n onEditName(category.id);\n } else if (type === 'delete') {\n onDelete(category.id);\n } else if (type === 'toggleVisibility') {\n onSave({ ...category, hidden: !category.hidden });\n }\n setMenuOpen(false);\n }}\n items={[\n {\n name: 'toggleVisibility',\n text: category.hidden ? 'Show' : 'Hide',\n },\n { name: 'rename', text: 'Rename' },\n { name: 'delete', text: 'Delete' },\n ]}\n />\n </Tooltip>\n )}\n </View>\n <View style={{ flex: 1 }} />\n <NotesButton\n id={category.id}\n style={dragging && { color: 'currentColor' }}\n />\n </View>\n );\n\n return (\n <View\n innerRef={innerRef}\n style={[\n {\n width: 200,\n '& button': { display: 'none' },\n },\n !dragging &&\n !dragPreview && {\n '&:hover button': { display: 'flex', color: colors.n1 },\n },\n dragging && { color: colors.n8 },\n\n // The zIndex here forces the the view on top of a row below\n // it that may be \"collapsed\" and show a border on top\n dragPreview && {\n backgroundColor: 'white',\n zIndex: 10000,\n borderRadius: 6,\n overflow: 'hidden',\n },\n style,\n ]}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n onEditName(null);\n e.stopPropagation();\n }\n }}\n >\n <InputCell\n value={category.name}\n formatter={value => displayed}\n width=\"flex\"\n exposed={editing || temporary}\n borderColor={dragPreview ? 'transparent' : borderColor}\n onUpdate={value => {\n if (temporary) {\n if (value === '') {\n onHideNewCategory();\n } else if (value !== '') {\n onSave({ ...category, name: value });\n }\n } else {\n if (value !== category.name) {\n onSave({ ...category, name: value });\n }\n }\n }}\n onBlur={() => onEditName(null)}\n style={[{ paddingLeft: 13 }, isLast && { borderBottomWidth: 0 }]}\n inputProps={{\n placeholder: temporary ? 'New Category Name' : '',\n }}\n />\n </View>\n );\n}\n\nfunction SidebarGroup({\n group,\n editing,\n collapsed,\n dragPreview,\n innerRef,\n style,\n borderColor = colors.border,\n onEdit,\n onSave,\n onDelete,\n onShowNewCategory,\n onHideNewGroup,\n onToggleCollapse,\n}) {\n const temporary = group.id === 'new';\n const [menuOpen, setMenuOpen] = useState(false);\n\n const displayed = (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n userSelect: 'none',\n WebkitUserSelect: 'none',\n }}\n onClick={e => {\n onToggleCollapse(group.id);\n }}\n >\n {!dragPreview && (\n <ExpandArrow\n width={8}\n height={8}\n style={{\n marginRight: 5,\n marginLeft: 5,\n flexShrink: 0,\n transition: 'transform .1s',\n transform: collapsed ? 'rotate(-90deg)' : '',\n }}\n />\n )}\n <div\n style={{\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n minWidth: 0,\n }}\n >\n {dragPreview && <Text style={{ fontWeight: 500 }}>Group: </Text>}\n {group.name}\n </div>\n {!dragPreview && (\n <>\n <View style={{ marginLeft: 5, flexShrink: 0 }}>\n <Button\n type=\"bare\"\n onClick={e => {\n e.stopPropagation();\n setMenuOpen(true);\n }}\n style={{ padding: 3 }}\n >\n <CheveronDown width={14} height={14} />\n </Button>\n {menuOpen && (\n <Tooltip\n position=\"bottom-left\"\n width={200}\n style={{ padding: 0 }}\n onClose={() => setMenuOpen(false)}\n >\n <Menu\n onMenuSelect={type => {\n if (type === 'rename') {\n onEdit(group.id);\n } else if (type === 'add-category') {\n onShowNewCategory(group.id);\n } else if (type === 'delete') {\n onDelete(group.id);\n } else if (type === 'toggleVisibility') {\n onSave({ ...group, hidden: !group.hidden });\n }\n setMenuOpen(false);\n }}\n items={[\n { name: 'add-category', text: 'Add category' },\n {\n name: 'toggleVisibility',\n text: group.hidden ? 'Show' : 'Hide',\n },\n { name: 'rename', text: 'Rename' },\n onDelete && { name: 'delete', text: 'Delete' },\n ]}\n />\n </Tooltip>\n )}\n </View>\n <View style={{ flex: 1 }} />\n <NotesButton id={group.id} />\n </>\n )}\n </View>\n );\n\n return (\n <View\n innerRef={innerRef}\n style={[\n style,\n {\n width: 200,\n backgroundColor: colors.n11,\n '& button': { display: 'none' },\n '&:hover button': { display: 'flex', color: colors.n1 },\n },\n dragPreview && {\n paddingLeft: 10,\n zIndex: 10000,\n borderRadius: 6,\n overflow: 'hidden',\n },\n ]}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n onEdit(null);\n e.stopPropagation();\n }\n }}\n >\n <InputCell\n value={group.name}\n formatter={value => displayed}\n width=\"flex\"\n exposed={editing}\n borderColor={colors.border}\n onUpdate={value => {\n if (temporary) {\n if (value === '') {\n onHideNewGroup();\n } else if (value !== '') {\n onSave({ id: group.id, name: value });\n }\n } else {\n onSave({ id: group.id, name: value });\n }\n }}\n onBlur={() => onEdit(null)}\n style={{ fontWeight: 600 }}\n inputProps={{\n style: { marginLeft: 20 },\n placeholder: temporary ? 'New Group Name' : '',\n }}\n />\n </View>\n );\n}\n\nfunction RenderMonths({ component: Component, editingIndex, args, style }) {\n let { months, type } = useContext(MonthsContext);\n\n return months.map((month, index) => {\n let editing = editingIndex === index;\n\n return (\n <NamespaceContext.Provider\n key={index}\n value={monthUtils.sheetForMonth(month, type)}\n >\n <View\n style={[\n { flex: 1 },\n { borderLeft: '1px solid ' + colors.border },\n style,\n ]}\n >\n <Component monthIndex={index} editing={editing} {...args} />\n </View>\n </NamespaceContext.Provider>\n );\n });\n}\n\nconst BudgetTotals = memo(function BudgetTotals({\n MonthComponent,\n toggleHiddenCategories,\n expandAllCategories,\n collapseAllCategories,\n}) {\n const [menuOpen, setMenuOpen] = useState(false);\n return (\n <View\n data-testid=\"budget-totals\"\n style={{\n backgroundColor: 'white',\n flexDirection: 'row',\n flexShrink: 0,\n boxShadow: MONTH_BOX_SHADOW,\n marginLeft: 5,\n marginRight: 5 + getScrollbarWidth(),\n borderRadius: '4px 4px 0 0',\n borderBottom: '1px solid ' + colors.border,\n }}\n >\n <View\n style={{\n width: 200,\n color: colors.n4,\n justifyContent: 'center',\n paddingLeft: 15,\n paddingRight: 5,\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n userSelect: 'none',\n WebkitUserSelect: 'none',\n }}\n >\n <View style={{ flexGrow: '1' }}>Category</View>\n <Button\n type=\"bare\"\n onClick={() => {\n setMenuOpen(true);\n }}\n style={{ color: 'currentColor', padding: 3 }}\n >\n <DotsHorizontalTriple\n width={15}\n height={15}\n style={{ color: colors.n5 }}\n />\n {menuOpen && (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 0 }}\n onClose={() => {\n setMenuOpen(false);\n }}\n >\n <Menu\n onMenuSelect={type => {\n if (type === 'toggleVisibility') {\n toggleHiddenCategories();\n } else if (type === 'expandAllCategories') {\n expandAllCategories();\n } else if (type === 'collapseAllCategories') {\n collapseAllCategories();\n }\n setMenuOpen(false);\n }}\n items={[\n {\n name: 'toggleVisibility',\n text: 'Toggle hidden',\n },\n {\n name: 'expandAllCategories',\n text: 'Expand all',\n },\n {\n name: 'collapseAllCategories',\n text: 'Collapse all',\n },\n ]}\n />\n </Tooltip>\n )}\n </Button>\n </View>\n <RenderMonths component={MonthComponent} />\n </View>\n );\n});\n\nfunction ExpenseGroup({\n group,\n collapsed,\n editingCell,\n dragState,\n itemPos,\n MonthComponent,\n onEditName,\n onSave,\n onDelete,\n onDragChange,\n onReorderGroup,\n onReorderCategory,\n onToggleCollapse,\n onShowNewCategory,\n}) {\n let dragging = dragState && dragState.item === group;\n\n let { dragRef } = useDraggable({\n type: 'group',\n onDragChange,\n item: group,\n canDrag: editingCell === null,\n });\n\n let { dropRef, dropPos } = useDroppable({\n types: 'group',\n id: group.id,\n onDrop: onReorderGroup,\n });\n\n let { dropRef: catDropRef, dropPos: catDropPos } = useDroppable({\n types: 'category',\n id: group.id,\n onDrop: onReorderCategory,\n onLongHover: () => {\n if (collapsed) {\n onToggleCollapse(group.id);\n }\n },\n });\n\n return (\n <Row\n collapsed={true}\n backgroundColor={colors.n11}\n style={{\n fontWeight: 600,\n opacity: group.hidden ? 0.33 : undefined,\n }}\n >\n {dragState && !dragState.preview && dragState.type === 'group' && (\n <View\n innerRef={dropRef}\n style={{\n position: 'absolute',\n left: 0,\n right: 0,\n height: collapsed\n ? ROW_HEIGHT - 1\n : (1 + group.categories.length) * (ROW_HEIGHT - 1) + 1,\n zIndex: 10000,\n }}\n >\n <DropHighlight pos={dropPos} offset={{ top: 1 }} />\n </View>\n )}\n\n <DropHighlight pos={catDropPos} offset={{ top: 1 }} />\n\n <View\n innerRef={catDropRef}\n style={{\n flex: 1,\n flexDirection: 'row',\n opacity: dragging && !dragState.preview ? 0.3 : 1,\n }}\n >\n <SidebarGroup\n innerRef={dragRef}\n group={group}\n editing={\n editingCell &&\n editingCell.cell === 'name' &&\n editingCell.id === group.id\n }\n dragPreview={dragging && dragState.preview}\n collapsed={collapsed}\n onToggleCollapse={onToggleCollapse}\n onEdit={onEditName}\n onSave={onSave}\n onDelete={onDelete}\n onShowNewCategory={onShowNewCategory}\n />\n <RenderMonths component={MonthComponent} args={{ group }} />\n </View>\n </Row>\n );\n}\n\nfunction ExpenseCategory({\n cat,\n budgetArray,\n editingCell,\n dragState,\n MonthComponent,\n onEditName,\n onEditMonth,\n onSave,\n onDelete,\n onBudgetAction,\n onShowActivity,\n onDragChange,\n onReorder,\n}) {\n let dragging = dragState && dragState.item === cat;\n\n if (dragState && dragState.item.id === cat.cat_group) {\n dragging = true;\n }\n\n let { dragRef } = useDraggable({\n type: 'category',\n onDragChange,\n item: cat,\n canDrag: editingCell === null,\n });\n\n let { dropRef, dropPos } = useDroppable({\n types: 'category',\n id: cat.id,\n onDrop: onReorder,\n });\n\n return (\n <Row\n innerRef={dropRef}\n collapsed={true}\n style={{\n backgroundColor: 'transparent',\n opacity: cat.hidden ? 0.5 : undefined,\n }}\n >\n <DropHighlight pos={dropPos} offset={{ top: 1 }} />\n\n <View\n style={[\n {\n flex: 1,\n flexDirection: 'row',\n },\n ]}\n >\n <SidebarCategory\n innerRef={dragRef}\n category={cat}\n dragPreview={dragging && dragState.preview}\n dragging={dragging && !dragState.preview}\n editing={\n editingCell &&\n editingCell.cell === 'name' &&\n editingCell.id === cat.id\n }\n onEditName={onEditName}\n onSave={onSave}\n onDelete={onDelete}\n onDragChange={onDragChange}\n />\n\n <RenderMonths\n component={MonthComponent}\n editingIndex={\n editingCell && editingCell.id === cat.id && editingCell.cell\n }\n args={{\n category: cat,\n onEdit: onEditMonth,\n onBudgetAction,\n onShowActivity,\n }}\n />\n </View>\n </Row>\n );\n}\n\nfunction IncomeGroup({\n group,\n editingCell,\n collapsed,\n MonthComponent,\n onEditName,\n onSave,\n onToggleCollapse,\n onShowNewCategory,\n}) {\n return (\n <Row\n collapsed={true}\n backgroundColor={colors.n11}\n style={{ fontWeight: 600 }}\n >\n <SidebarGroup\n group={group}\n collapsed={collapsed}\n editing={\n editingCell &&\n editingCell.cell === 'name' &&\n editingCell.id === group.id\n }\n onEdit={onEditName}\n onSave={onSave}\n onToggleCollapse={onToggleCollapse}\n onShowNewCategory={onShowNewCategory}\n />\n <RenderMonths component={MonthComponent} args={{ group }} />\n </Row>\n );\n}\n\nfunction IncomeCategory({\n cat,\n isLast,\n editingCell,\n MonthComponent,\n onEditName,\n onEditMonth,\n onSave,\n onDelete,\n onDragChange,\n onBudgetAction,\n onReorder,\n onShowActivity,\n}) {\n let { dragRef } = useDraggable({\n type: 'income-category',\n onDragChange,\n item: cat,\n canDrag: editingCell === null,\n });\n\n let { dropRef, dropPos } = useDroppable({\n types: 'income-category',\n id: cat.id,\n onDrop: onReorder,\n });\n\n return (\n <Row innerRef={dropRef} collapsed={true} backgroundColor=\"transparent\">\n <DropHighlight pos={dropPos} offset={{ top: 1 }} />\n\n <SidebarCategory\n innerRef={dragRef}\n category={cat}\n isLast={isLast}\n editing={\n editingCell &&\n editingCell.cell === 'name' &&\n editingCell.id === cat.id\n }\n onEditName={onEditName}\n onSave={onSave}\n onDelete={onDelete}\n />\n <RenderMonths\n component={MonthComponent}\n editingIndex={\n editingCell && editingCell.id === cat.id && editingCell.cell\n }\n args={{\n category: cat,\n onEdit: onEditMonth,\n isLast,\n onShowActivity,\n onBudgetAction,\n }}\n />\n </Row>\n );\n}\n\nconst BudgetCategories = memo(\n ({\n categoryGroups,\n newCategoryForGroup,\n showHiddenCategories,\n isAddingGroup,\n editingCell,\n collapsed,\n setCollapsed,\n dataComponents,\n onBudgetAction,\n onShowActivity,\n onEditName,\n onEditMonth,\n onSaveCategory,\n onSaveGroup,\n onDeleteCategory,\n onDeleteGroup,\n onReorderCategory,\n onReorderGroup,\n onShowNewCategory,\n onHideNewCategory,\n onShowNewGroup,\n onHideNewGroup,\n }) => {\n let items = useMemo(() => {\n let [expenseGroups, incomeGroup] = separateGroups(categoryGroups);\n\n let items = Array.prototype.concat.apply(\n [],\n expenseGroups.map(group => {\n if (group.hidden && !showHiddenCategories) {\n return [];\n }\n\n const groupCategories = group.categories.filter(\n cat => showHiddenCategories || !cat.hidden,\n );\n\n let items = [{ type: 'expense-group', value: { ...group } }];\n\n if (newCategoryForGroup === group.id) {\n items.push({ type: 'new-category' });\n }\n\n return [\n ...items,\n ...(collapsed.includes(group.id) ? [] : groupCategories).map(\n cat => ({\n type: 'expense-category',\n value: cat,\n }),\n ),\n ];\n }),\n );\n\n if (isAddingGroup) {\n items.push({ type: 'new-group' });\n }\n\n if (incomeGroup) {\n items = items.concat(\n [\n { type: 'income-separator' },\n { type: 'income-group', value: incomeGroup },\n newCategoryForGroup === incomeGroup.id && { type: 'new-category' },\n ...(collapsed.includes(incomeGroup.id)\n ? []\n : incomeGroup.categories.filter(\n cat => showHiddenCategories || !cat.hidden,\n )\n ).map(cat => ({\n type: 'income-category',\n value: cat,\n })),\n ].filter(x => x),\n );\n }\n\n return items;\n }, [\n categoryGroups,\n collapsed,\n newCategoryForGroup,\n isAddingGroup,\n showHiddenCategories,\n ]);\n\n let [dragState, setDragState] = useState(null);\n let [savedCollapsed, setSavedCollapsed] = useState(null);\n\n // TODO: If we turn this into a reducer, we could probably memoize\n // each item in the list for better perf\n function onDragChange(newDragState) {\n let { state } = newDragState;\n\n if (state === 'start-preview') {\n setDragState({\n type: newDragState.type,\n item: newDragState.item,\n preview: true,\n });\n } else if (state === 'start') {\n if (dragState) {\n setDragState({\n ...dragState,\n preview: false,\n });\n setSavedCollapsed(collapsed);\n }\n } else if (state === 'hover') {\n setDragState({\n ...dragState,\n hoveredId: newDragState.id,\n hoveredPos: newDragState.pos,\n });\n } else if (state === 'end') {\n setDragState(null);\n setCollapsed(savedCollapsed || []);\n }\n }\n\n function onToggleCollapse(id) {\n if (collapsed.includes(id)) {\n setCollapsed(collapsed.filter(id_ => id_ !== id));\n } else {\n setCollapsed([...collapsed, id]);\n }\n }\n\n return (\n <View\n style={{\n marginBottom: 10,\n backgroundColor: 'white',\n overflow: 'hidden',\n boxShadow: MONTH_BOX_SHADOW,\n borderRadius: '0 0 4px 4px',\n flex: 1,\n }}\n >\n {items.map((item, idx) => {\n let content;\n switch (item.type) {\n case 'new-group':\n content = (\n <Row style={{ backgroundColor: colors.n11 }}>\n <SidebarGroup\n group={{ id: 'new', name: '' }}\n editing={true}\n onSave={onSaveGroup}\n onHideNewGroup={onHideNewGroup}\n onEdit={onEditName}\n />\n </Row>\n );\n break;\n case 'new-category':\n content = (\n <Row>\n <SidebarCategory\n category={{\n name: '',\n cat_group: newCategoryForGroup,\n is_income:\n newCategoryForGroup ===\n categoryGroups.find(g => g.is_income).id,\n id: 'new',\n }}\n editing={true}\n onSave={onSaveCategory}\n onHideNewCategory={onHideNewCategory}\n onEditName={onEditName}\n />\n </Row>\n );\n break;\n\n case 'expense-group':\n content = (\n <ExpenseGroup\n group={item.value}\n editingCell={editingCell}\n collapsed={collapsed.includes(item.value.id)}\n MonthComponent={dataComponents.ExpenseGroupComponent}\n dragState={dragState}\n onEditName={onEditName}\n onSave={onSaveGroup}\n onDelete={onDeleteGroup}\n onDragChange={onDragChange}\n onReorderGroup={onReorderGroup}\n onReorderCategory={onReorderCategory}\n onToggleCollapse={onToggleCollapse}\n onShowNewCategory={onShowNewCategory}\n />\n );\n break;\n case 'expense-category':\n content = (\n <ExpenseCategory\n cat={item.value}\n editingCell={editingCell}\n MonthComponent={dataComponents.ExpenseCategoryComponent}\n dragState={dragState}\n onEditName={onEditName}\n onEditMonth={onEditMonth}\n onSave={onSaveCategory}\n onDelete={onDeleteCategory}\n onDragChange={onDragChange}\n onReorder={onReorderCategory}\n onBudgetAction={onBudgetAction}\n onShowActivity={onShowActivity}\n />\n );\n break;\n case 'income-separator':\n content = (\n <View\n style={{\n height: INCOME_HEADER_HEIGHT,\n backgroundColor: 'white',\n }}\n >\n <IncomeHeader\n MonthComponent={dataComponents.IncomeHeaderComponent}\n onShowNewGroup={onShowNewGroup}\n />\n </View>\n );\n break;\n case 'income-group':\n content = (\n <IncomeGroup\n group={item.value}\n editingCell={editingCell}\n MonthComponent={dataComponents.IncomeGroupComponent}\n collapsed={collapsed.includes(item.value.id)}\n onEditName={onEditName}\n onSave={onSaveGroup}\n onToggleCollapse={onToggleCollapse}\n onShowNewCategory={onShowNewCategory}\n />\n );\n break;\n case 'income-category':\n content = (\n <IncomeCategory\n cat={item.value}\n editingCell={editingCell}\n isLast={idx === items.length - 1}\n MonthComponent={dataComponents.IncomeCategoryComponent}\n onEditName={onEditName}\n onEditMonth={onEditMonth}\n onSave={onSaveCategory}\n onDelete={onDeleteCategory}\n onDragChange={onDragChange}\n onReorder={onReorderCategory}\n onBudgetAction={onBudgetAction}\n onShowActivity={onShowActivity}\n />\n );\n break;\n default:\n throw new Error('Unknown item type: ' + item.type);\n }\n\n let pos =\n idx === 0 ? 'first' : idx === items.length - 1 ? 'last' : null;\n\n return (\n <DropHighlightPosContext.Provider\n key={\n item.value\n ? item.value.id\n : item.type === 'income-separator'\n ? 'separator'\n : idx\n }\n value={pos}\n >\n <View\n style={\n !dragState && {\n ':hover': { backgroundColor: '#fcfcfc' },\n }\n }\n >\n {content}\n </View>\n </DropHighlightPosContext.Provider>\n );\n })}\n </View>\n );\n },\n);\n\nfunction IncomeHeader({ MonthComponent, onShowNewGroup }) {\n return (\n <View style={{ flexDirection: 'row', flex: 1 }}>\n <View\n style={{\n width: 200,\n alignItems: 'flex-start',\n justifyContent: 'flex-start',\n }}\n >\n <Button onClick={onShowNewGroup} style={{ fontSize: 12, margin: 10 }}>\n Add Group\n </Button>\n </View>\n <RenderMonths\n component={MonthComponent}\n style={{ border: 0, justifyContent: 'flex-end' }}\n />\n </View>\n );\n}\n\nexport const BudgetPageHeader = memo(\n ({ startMonth, onMonthSelect, numMonths, monthBounds, style }) => {\n function getValidMonth(month) {\n let start = monthBounds.start;\n let end = monthUtils.subMonths(monthBounds.end, numMonths - 1);\n\n if (month < start) {\n return start;\n } else if (month > end) {\n return end;\n }\n return month;\n }\n\n return (\n <View style={{ marginLeft: 200 + 5, flexShrink: 0 }}>\n <View style={{ marginRight: 5 + getScrollbarWidth() }}>\n <MonthPicker\n startMonth={startMonth}\n numDisplayed={numMonths}\n monthBounds={monthBounds}\n style={{ paddingTop: 5 }}\n onSelect={month => onMonthSelect(getValidMonth(month))}\n />\n </View>\n </View>\n );\n },\n);\n","import React, { forwardRef, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport AutoSizer from 'react-virtualized-auto-sizer';\n\nimport { useActions } from '../../hooks/useActions';\nimport View from '../common/View';\n\nimport { useBudgetMonthCount } from './BudgetMonthCountContext';\nimport { BudgetPageHeader, BudgetTable } from './misc';\nimport { CategoryGroupsContext } from './util';\n\nfunction getNumPossibleMonths(width) {\n let estimatedTableWidth = width - 200;\n\n if (estimatedTableWidth < 500) {\n return 1;\n } else if (estimatedTableWidth < 750) {\n return 2;\n } else if (estimatedTableWidth < 1000) {\n return 3;\n } else if (estimatedTableWidth < 1250) {\n return 4;\n } else if (estimatedTableWidth < 1500) {\n return 5;\n }\n\n return 6;\n}\n\nconst DynamicBudgetTableInner = forwardRef(\n (\n {\n width,\n height,\n categoryGroups,\n prewarmStartMonth,\n startMonth,\n maxMonths = 3,\n monthBounds,\n onMonthSelect: onMonthSelect_,\n onPreload,\n ...props\n },\n ref,\n ) => {\n let prefs = useSelector(state => state.prefs.local);\n let { setDisplayMax } = useBudgetMonthCount();\n let actions = useActions();\n\n let numPossible = getNumPossibleMonths(width);\n let numMonths = Math.min(numPossible, maxMonths);\n let maxWidth = 200 + 500 * numMonths;\n\n useEffect(() => {\n setDisplayMax(numPossible);\n }, [numPossible]);\n\n function onMonthSelect(month) {\n onMonthSelect_(month, numMonths);\n }\n\n return (\n <CategoryGroupsContext.Provider value={categoryGroups}>\n <View\n style={{\n width,\n height,\n alignItems: 'center',\n opacity: width <= 0 || height <= 0 ? 0 : 1,\n }}\n >\n <View style={{ width: '100%', maxWidth }}>\n <BudgetPageHeader\n startMonth={prewarmStartMonth}\n numMonths={numMonths}\n monthBounds={monthBounds}\n onMonthSelect={onMonthSelect}\n />\n <BudgetTable\n ref={ref}\n categoryGroups={categoryGroups}\n prewarmStartMonth={prewarmStartMonth}\n startMonth={startMonth}\n numMonths={numMonths}\n monthBounds={monthBounds}\n prefs={prefs}\n {...actions}\n {...props}\n />\n </View>\n </View>\n </CategoryGroupsContext.Provider>\n );\n },\n);\n\nexport default forwardRef((props, ref) => {\n return (\n <AutoSizer>\n {({ width, height }) => (\n <DynamicBudgetTableInner\n ref={ref}\n width={width}\n height={height}\n {...props}\n />\n )}\n </AutoSizer>\n );\n});\n","import { getNumberFormat } from './util';\n\nfunction fail(state, msg) {\n throw new Error(\n msg + ': ' + JSON.stringify(state.str.slice(state.index, 10)),\n );\n}\n\nfunction char(state) {\n return state.str[state.index];\n}\n\nfunction next(state) {\n if (state.index >= state.str.length) {\n return null;\n }\n\n let ch = char(state);\n state.index++;\n return ch;\n}\n\nfunction nextOperator(state, op) {\n if (char(state) === op) {\n next(state);\n return true;\n }\n\n return false;\n}\n\nfunction parsePrimary(state) {\n // We only support numbers\n let isNegative = char(state) === '-';\n if (isNegative) {\n next(state);\n }\n\n if (/\\p{Sc}/u.test(char(state))) {\n next(state);\n }\n\n // TODO: The regex should probably respect the number format better,\n // and we should do more strict parsing\n let numberStr = '';\n while (char(state) && char(state).match(/[0-9,.]/)) {\n let thousandsSep = getNumberFormat().separator === ',' ? '.' : ',';\n\n // Don't include the thousands separator\n if (char(state) === thousandsSep) {\n next(state);\n } else {\n numberStr += next(state);\n }\n }\n\n if (numberStr === '') {\n fail(state, 'Unexpected character');\n }\n\n let number = parseFloat(numberStr.replace(getNumberFormat().separator, '.'));\n return isNegative ? -number : number;\n}\n\nfunction parseParens(state) {\n if (char(state) === '(') {\n next(state);\n let expr = parseOperator(state);\n\n if (char(state) !== ')') {\n fail(state, 'Unbalanced parentheses');\n }\n\n next(state);\n return expr;\n }\n\n return parsePrimary(state);\n}\n\nfunction makeOperatorParser(...ops) {\n return ops.reduce((prevParser, op) => {\n return state => {\n let node = prevParser(state);\n while (nextOperator(state, op)) {\n node = { op, left: node, right: prevParser(state) };\n }\n return node;\n };\n }, parseParens);\n}\n\n// These operators go from high to low order of precedence\nlet parseOperator = makeOperatorParser('^', '/', '*', '-', '+');\n\nfunction parse(expression) {\n let state = { str: expression.replace(/\\s/g, ''), index: 0 };\n return parseOperator(state);\n}\n\nfunction evaluate(ast) {\n if (typeof ast === 'number') {\n return ast;\n }\n\n let { left, right, op } = ast;\n\n switch (op) {\n case '+':\n return evaluate(left) + evaluate(right);\n case '-':\n return evaluate(left) - evaluate(right);\n case '*':\n return evaluate(left) * evaluate(right);\n case '/':\n return evaluate(left) / evaluate(right);\n case '^':\n return Math.pow(evaluate(left), evaluate(right));\n default:\n throw new Error('Unknown operator: ' + op);\n }\n}\n\nexport default function evalArithmetic(expression, defaultValue = null) {\n // An empty expression always evals to the default\n if (expression === '') {\n return defaultValue;\n }\n\n let result;\n try {\n result = evaluate(parse(expression));\n } catch (e) {\n // If it errors, return the default value\n return defaultValue;\n }\n\n // Never return NaN\n return isNaN(result) ? defaultValue : result;\n}\n","import React, { type ComponentProps } from 'react';\n\nimport ArrowThinRight from '../../icons/v1/ArrowThinRight';\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};\nexport default function BalanceWithCarryover({\n carryover,\n balance,\n disabled,\n}: BalanceWithCarryoverProps) {\n let carryoverValue = useSheetValue(carryover);\n let balanceValue = useSheetValue(balance);\n\n return (\n <>\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 ]}\n />\n {carryoverValue === true && (\n <View\n style={{\n alignSelf: 'center',\n marginLeft: 2,\n position: 'absolute',\n right: -4,\n top: 0,\n bottom: 0,\n justifyContent: 'center',\n }}\n >\n <ArrowThinRight\n width={7}\n height={7}\n style={makeAmountStyle(balanceValue)}\n />\n </View>\n )}\n </>\n );\n}\n","import * as React from 'react';\nconst SvgArrowButtonDown1 = props => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n d=\"M12 13.584a2.643 2.643 0 0 1-1.875-.775L.584 3.268a1.768 1.768 0 0 1 2.5-2.5l8.739 8.739a.25.25 0 0 0 .354 0L20.916.768a1.768 1.768 0 0 1 2.5 2.5l-9.541 9.541a2.643 2.643 0 0 1-1.875.775Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M12 23.75a2.643 2.643 0 0 1-1.875-.775L.584 13.434a1.768 1.768 0 0 1 2.5-2.5l8.739 8.739a.25.25 0 0 0 .354 0l8.739-8.739a1.768 1.768 0 0 1 2.5 2.5l-9.541 9.541A2.643 2.643 0 0 1 12 23.75Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\nexport default SvgArrowButtonDown1;\n","import * as React from 'react';\nconst SvgArrowButtonUp1 = props => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n d=\"M12 10.416a2.643 2.643 0 0 1 1.875.775l9.541 9.541a1.768 1.768 0 0 1-2.5 2.5l-8.739-8.739a.25.25 0 0 0-.354 0l-8.739 8.739a1.768 1.768 0 0 1-2.5-2.5l9.541-9.541A2.643 2.643 0 0 1 12 10.416Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M12 .25a2.643 2.643 0 0 1 1.875.775l9.541 9.541a1.768 1.768 0 0 1-2.5 2.5l-8.739-8.739a.25.25 0 0 0-.354 0l-8.739 8.739a1.768 1.768 0 0 1-2.5-2.5l9.541-9.541A2.643 2.643 0 0 1 12 .25Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\nexport default SvgArrowButtonUp1;\n","import { useCallback, useEffect, useState, type ReactNode } from 'react';\n\nimport { type CSSProperties } from 'glamor';\n\nimport View from './View';\n\ntype HoverTargetProps = {\n style?: CSSProperties;\n contentStyle?: CSSProperties;\n children: ReactNode;\n renderContent: () => ReactNode;\n disabled?: boolean;\n};\n\nexport default function HoverTarget({\n style,\n contentStyle,\n children,\n renderContent,\n disabled,\n}: HoverTargetProps) {\n let [hovered, setHovered] = useState(false);\n\n const onMouseEnter = useCallback(() => {\n if (!disabled) {\n setHovered(true);\n }\n }, [disabled]);\n\n const onMouseLeave = useCallback(() => {\n if (!disabled) {\n setHovered(false);\n }\n }, [disabled]);\n\n useEffect(() => {\n if (disabled && hovered) {\n setHovered(false);\n }\n }, [disabled, hovered]);\n\n return (\n <View style={style}>\n <View\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n style={contentStyle}\n >\n {children}\n </View>\n {hovered && renderContent()}\n </View>\n );\n}\n","import React, { type ReactNode, createContext, useContext } from 'react';\n\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nlet Context = createContext(null);\n\ntype ReportProviderProps = {\n summaryCollapsed: boolean;\n onBudgetAction: (idx: number, action: string, arg: unknown) => void;\n onToggleSummaryCollapse: () => void;\n children: ReactNode;\n};\nexport function ReportProvider({\n summaryCollapsed,\n onBudgetAction,\n onToggleSummaryCollapse,\n children,\n}: ReportProviderProps) {\n let currentMonth = monthUtils.currentMonth();\n\n return (\n <Context.Provider\n value={{\n currentMonth,\n summaryCollapsed,\n onBudgetAction,\n onToggleSummaryCollapse,\n }}\n children={children}\n />\n );\n}\n\nexport function useReport() {\n return useContext(Context);\n}\n","import React, {\n type ComponentProps,\n type ComponentType,\n type ReactNode,\n useState,\n type SVGProps,\n} from 'react';\n\nimport { css, type CSSProperties } from 'glamor';\n\nimport { reportBudget } from 'loot-core/src/client/queries';\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nimport useFeatureFlag from '../../../hooks/useFeatureFlag';\nimport DotsHorizontalTriple from '../../../icons/v1/DotsHorizontalTriple';\nimport ArrowButtonDown1 from '../../../icons/v2/ArrowButtonDown1';\nimport ArrowButtonUp1 from '../../../icons/v2/ArrowButtonUp1';\nimport { colors, styles } from '../../../style';\nimport AlignedText from '../../common/AlignedText';\nimport Button from '../../common/Button';\nimport HoverTarget from '../../common/HoverTarget';\nimport Menu from '../../common/Menu';\nimport Stack from '../../common/Stack';\nimport Text from '../../common/Text';\nimport View from '../../common/View';\nimport NotesButton from '../../NotesButton';\nimport PrivacyFilter from '../../PrivacyFilter';\nimport CellValue from '../../spreadsheet/CellValue';\nimport format from '../../spreadsheet/format';\nimport NamespaceContext from '../../spreadsheet/NamespaceContext';\nimport useSheetValue from '../../spreadsheet/useSheetValue';\nimport { Tooltip } from '../../tooltips';\nimport { MONTH_BOX_SHADOW } from '../constants';\nimport { makeAmountFullStyle } from '../util';\n\nimport { useReport } from './ReportContext';\n\ntype PieProgressProps = {\n style?: SVGProps<SVGSVGElement>['style'];\n progress: number;\n color: string;\n backgroundColor: string;\n};\nfunction PieProgress({\n style,\n progress,\n color,\n backgroundColor,\n}: PieProgressProps) {\n let radius = 4;\n let circum = 2 * Math.PI * radius;\n let dash = progress * circum;\n let gap = circum;\n\n return (\n <svg viewBox=\"0 0 20 20\" style={style}>\n <circle r=\"10\" cx=\"10\" cy=\"10\" fill={backgroundColor} />\n <circle\n r={radius}\n cx=\"10\"\n cy=\"10\"\n fill=\"none\"\n stroke={color}\n strokeWidth={radius * 2}\n strokeDasharray={`${dash} ${gap}`}\n transform=\"rotate(-90) translate(-20)\"\n />{' '}\n </svg>\n );\n}\n\nfunction fraction(num, denom) {\n if (denom === 0) {\n if (num > 0) {\n return 1;\n }\n return 0;\n }\n\n return num / denom;\n}\n\ntype IncomeProgressProps = {\n current: ComponentProps<typeof CellValue>['binding'];\n target: ComponentProps<typeof CellValue>['binding'];\n};\nfunction IncomeProgress({ current, target }: IncomeProgressProps) {\n let totalIncome = useSheetValue(current) || 0;\n let totalBudgeted = useSheetValue(target) || 0;\n\n let over = false;\n\n if (totalIncome < 0) {\n over = true;\n totalIncome = -totalIncome;\n }\n\n let frac = fraction(totalIncome, totalBudgeted);\n\n return (\n <PieProgress\n progress={frac}\n color={over ? colors.r7 : colors.g5}\n backgroundColor={over ? colors.r10 : colors.n10}\n style={{ width: 20, height: 20 }}\n />\n );\n}\n\ntype ExpenseProgressProps = {\n current: ComponentProps<typeof CellValue>['binding'];\n target: ComponentProps<typeof CellValue>['binding'];\n};\nfunction ExpenseProgress({ current, target }: ExpenseProgressProps) {\n let totalSpent = useSheetValue(current) || 0;\n let totalBudgeted = useSheetValue(target) || 0;\n\n // Reverse total spent, and also set a bottom boundary of 0 (in case\n // income goes into an expense category and it's \"positive\", don't\n // show that in the graph)\n totalSpent = Math.max(-totalSpent, 0);\n\n let frac;\n let over = false;\n\n if (totalSpent > totalBudgeted) {\n frac = (totalSpent - totalBudgeted) / totalBudgeted;\n over = true;\n } else {\n frac = fraction(totalSpent, totalBudgeted);\n }\n\n return (\n <PieProgress\n progress={frac}\n color={over ? colors.r7 : colors.g5}\n backgroundColor={over ? colors.r10 : colors.n10}\n style={{ width: 20, height: 20 }}\n />\n );\n}\n\ntype BudgetTotalProps = {\n title: ReactNode;\n current: ComponentProps<typeof CellValue>['binding'];\n target: ComponentProps<typeof CellValue>['binding'];\n ProgressComponent: ComponentType<{ current; target }>;\n style?: CSSProperties;\n};\nfunction BudgetTotal({\n title,\n current,\n target,\n ProgressComponent,\n style,\n}: BudgetTotalProps) {\n return (\n <View\n style={[\n {\n lineHeight: 1.5,\n flexDirection: 'row',\n alignItems: 'center',\n fontSize: 14,\n },\n style,\n ]}\n >\n <ProgressComponent current={current} target={target} />\n\n <View style={{ marginLeft: 10 }}>\n <View>\n <Text style={{ color: colors.n4 }}>{title}</Text>\n </View>\n\n <Text>\n <CellValue binding={current} type=\"financial\" />\n <Text style={{ color: colors.n6, fontStyle: 'italic' }}>\n {' of '}\n <CellValue\n binding={target}\n type=\"financial\"\n style={styles.notFixed}\n />\n </Text>\n </Text>\n </View>\n </View>\n );\n}\n\ntype IncomeTotalProps = {\n style?: CSSProperties;\n};\nfunction IncomeTotal({ style }: IncomeTotalProps) {\n return (\n <BudgetTotal\n title=\"Income\"\n current={reportBudget.totalIncome}\n target={reportBudget.totalBudgetedIncome}\n ProgressComponent={IncomeProgress}\n style={style}\n />\n );\n}\n\ntype ExpenseTotalProps = {\n style?: CSSProperties;\n};\nfunction ExpenseTotal({ style }: ExpenseTotalProps) {\n return (\n <BudgetTotal\n title=\"Expenses\"\n current={reportBudget.totalSpent}\n target={reportBudget.totalBudgetedExpense}\n ProgressComponent={ExpenseProgress}\n style={style}\n />\n );\n}\n\ntype SavedProps = {\n projected: boolean;\n style?: CSSProperties;\n};\nfunction Saved({ projected, style }: SavedProps) {\n let budgetedSaved = useSheetValue(reportBudget.totalBudgetedSaved) || 0;\n let totalSaved = useSheetValue(reportBudget.totalSaved) || 0;\n let saved = projected ? budgetedSaved : totalSaved;\n let isNegative = saved < 0;\n\n return (\n <View style={[{ alignItems: 'center', fontSize: 14 }, style]}>\n {projected ? (\n <Text style={{ color: colors.n4 }}>Projected Savings:</Text>\n ) : (\n <View style={{ color: colors.n4 }}>\n {isNegative ? 'Overspent:' : 'Saved:'}\n </View>\n )}\n\n <HoverTarget\n renderContent={() => {\n if (!projected) {\n let diff = totalSaved - budgetedSaved;\n return (\n <Tooltip\n position=\"bottom-center\"\n style={{ padding: 10, fontSize: 14 }}\n >\n <AlignedText\n left=\"Projected Savings:\"\n right={\n <Text\n style={[makeAmountFullStyle(budgetedSaved), styles.tnum]}\n >\n {format(budgetedSaved, 'financial-with-sign')}\n </Text>\n }\n />\n <AlignedText\n left=\"Difference:\"\n right={\n <Text style={[makeAmountFullStyle(diff), styles.tnum]}>\n {format(diff, 'financial-with-sign')}\n </Text>\n }\n />\n </Tooltip>\n );\n }\n return null;\n }}\n >\n <View\n {...css([\n {\n fontSize: 25,\n color: projected ? colors.y3 : isNegative ? colors.r4 : colors.p5,\n },\n ])}\n >\n <PrivacyFilter blurIntensity={7}>\n {format(saved, 'financial')}\n </PrivacyFilter>\n </View>\n </HoverTarget>\n </View>\n );\n}\n\ntype BudgetSummaryProps = {\n month?: string;\n};\nexport function BudgetSummary({ month }: BudgetSummaryProps) {\n let {\n currentMonth,\n summaryCollapsed: collapsed,\n onBudgetAction,\n onToggleSummaryCollapse,\n } = useReport();\n\n const isGoalTemplatesEnabled = useFeatureFlag('goalTemplatesEnabled');\n\n let [menuOpen, setMenuOpen] = useState(false);\n function onMenuOpen() {\n setMenuOpen(true);\n }\n\n function onMenuClose() {\n setMenuOpen(false);\n }\n\n let ExpandOrCollapseIcon = collapsed ? ArrowButtonDown1 : ArrowButtonUp1;\n\n return (\n <View\n style={{\n backgroundColor: 'white',\n boxShadow: MONTH_BOX_SHADOW,\n borderRadius: 6,\n marginLeft: 0,\n marginRight: 0,\n marginTop: 5,\n flex: 1,\n cursor: 'default',\n marginBottom: 5,\n overflow: 'hidden',\n '& .hover-visible': {\n opacity: 0,\n transition: 'opacity .25s',\n },\n '&:hover .hover-visible': {\n opacity: 1,\n },\n }}\n >\n <NamespaceContext.Provider value={monthUtils.sheetForMonth(month)}>\n <View\n style={[\n { padding: '0 13px' },\n collapsed ? { margin: '10px 0' } : { marginTop: 16 },\n ]}\n >\n <View\n style={{\n position: 'absolute',\n left: 10,\n top: 0,\n }}\n >\n <Button\n type=\"bare\"\n className=\"hover-visible\"\n onClick={onToggleSummaryCollapse}\n >\n <ExpandOrCollapseIcon\n width={13}\n height={13}\n // The margin is to make it the exact same size as the dots button\n style={{ color: colors.n6, margin: 1 }}\n />\n </Button>\n </View>\n\n <div\n {...css([\n {\n textAlign: 'center',\n marginTop: 3,\n fontSize: 18,\n fontWeight: 500,\n textDecorationSkip: 'ink',\n },\n currentMonth === month && { textDecoration: 'underline' },\n ])}\n >\n {monthUtils.format(month, 'MMMM')}\n </div>\n\n <View\n style={{\n position: 'absolute',\n right: 10,\n top: 0,\n flexDirection: 'row',\n alignItems: 'center',\n }}\n >\n <View>\n <NotesButton\n id={`budget-${month}`}\n width={15}\n height={15}\n tooltipPosition=\"bottom-right\"\n defaultColor={colors.n6}\n />\n </View>\n <View style={{ userSelect: 'none' }}>\n <Button type=\"bare\" onClick={onMenuOpen}>\n <DotsHorizontalTriple\n width={15}\n height={15}\n style={{ color: colors.n5 }}\n />\n </Button>\n {menuOpen && (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 0 }}\n onClose={onMenuClose}\n >\n <Menu\n onMenuSelect={type => {\n onMenuClose();\n onBudgetAction(month, type);\n }}\n items={[\n { name: 'copy-last', text: 'Copy last month’s budget' },\n { name: 'set-zero', text: 'Set budgets to zero' },\n {\n name: 'set-3-avg',\n text: 'Set budgets to 3 month avg',\n },\n isGoalTemplatesEnabled && {\n name: 'check-templates',\n text: 'Check templates',\n },\n isGoalTemplatesEnabled && {\n name: 'apply-goal-template',\n text: 'Apply budget template',\n },\n isGoalTemplatesEnabled && {\n name: 'overwrite-goal-template',\n text: 'Overwrite with budget template',\n },\n ]}\n />\n </Tooltip>\n )}\n </View>\n </View>\n </View>\n\n {!collapsed && (\n <Stack\n spacing={2}\n style={{\n alignSelf: 'center',\n backgroundColor: colors.n11,\n borderRadius: 4,\n padding: '10px 15px',\n marginTop: 13,\n }}\n >\n <IncomeTotal />\n <ExpenseTotal />\n </Stack>\n )}\n\n {collapsed ? (\n <View\n style={{\n alignItems: 'center',\n padding: '10px 20px',\n justifyContent: 'space-between',\n backgroundColor: colors.n11,\n borderTop: '1px solid ' + colors.n10,\n }}\n >\n <Saved projected={month >= currentMonth} />\n </View>\n ) : (\n <Saved\n projected={month >= currentMonth}\n style={{ marginTop: 13, marginBottom: 20 }}\n />\n )}\n </NamespaceContext.Provider>\n </View>\n );\n}\n","import React, { memo, useState } from 'react';\n\nimport { reportBudget } from 'loot-core/src/client/queries';\nimport evalArithmetic from 'loot-core/src/shared/arithmetic';\nimport { integerToCurrency, amountToInteger } from 'loot-core/src/shared/util';\n\nimport useFeatureFlag from '../../../hooks/useFeatureFlag';\nimport CheveronDown from '../../../icons/v1/CheveronDown';\nimport { styles, colors } from '../../../style';\nimport Button from '../../common/Button';\nimport Menu from '../../common/Menu';\nimport Text from '../../common/Text';\nimport View from '../../common/View';\nimport CellValue from '../../spreadsheet/CellValue';\nimport format from '../../spreadsheet/format';\nimport useSheetValue from '../../spreadsheet/useSheetValue';\nimport { Field, SheetCell } from '../../table';\nimport { Tooltip, useTooltip } from '../../tooltips';\nimport BalanceWithCarryover from '../BalanceWithCarryover';\nimport { MONTH_RIGHT_PADDING } from '../constants';\nimport { makeAmountGrey } from '../util';\n\nexport { BudgetSummary } from './BudgetSummary';\n\nlet headerLabelStyle = { flex: 1, padding: '0 5px', textAlign: 'right' };\n\nexport const BudgetTotalsMonth = memo(function BudgetTotalsMonth() {\n return (\n <View\n style={{\n flex: 1,\n flexDirection: 'row',\n marginRight: MONTH_RIGHT_PADDING,\n paddingTop: 10,\n paddingBottom: 10,\n }}\n >\n <View style={headerLabelStyle}>\n <Text style={{ color: colors.n4 }}>Budgeted</Text>\n <CellValue\n binding={reportBudget.totalBudgetedExpense}\n type=\"financial\"\n style={{ color: colors.n4, fontWeight: 600 }}\n formatter={value => {\n return format(parseFloat(value || '0'), 'financial');\n }}\n />\n </View>\n <View style={headerLabelStyle}>\n <Text style={{ color: colors.n4 }}>Spent</Text>\n <CellValue\n binding={reportBudget.totalSpent}\n type=\"financial\"\n style={{ color: colors.n4, fontWeight: 600 }}\n />\n </View>\n <View style={headerLabelStyle}>\n <Text style={{ color: colors.n4 }}>Balance</Text>\n <CellValue\n binding={reportBudget.totalLeftover}\n type=\"financial\"\n style={{ color: colors.n4, fontWeight: 600 }}\n />\n </View>\n </View>\n );\n});\n\nexport function IncomeHeaderMonth() {\n return (\n <View\n style={{\n flexDirection: 'row',\n marginRight: MONTH_RIGHT_PADDING,\n paddingBottom: 5,\n }}\n >\n <View style={headerLabelStyle}>\n <Text style={{ color: colors.n4 }}>Budgeted</Text>\n </View>\n <View style={headerLabelStyle}>\n <Text style={{ color: colors.n4 }}>Received</Text>\n </View>\n </View>\n );\n}\n\ntype GroupMonthProps = {\n group: { id: string; is_income: boolean };\n};\nexport const GroupMonth = memo(function GroupMonth({ group }: GroupMonthProps) {\n let borderColor = colors.border;\n let { id } = group;\n\n return (\n <View style={{ flex: 1, flexDirection: 'row' }}>\n <SheetCell\n name=\"budgeted\"\n width=\"flex\"\n borderColor={borderColor}\n textAlign=\"right\"\n style={[{ fontWeight: 600 }, styles.tnum]}\n valueProps={{\n binding: reportBudget.groupBudgeted(id),\n type: 'financial',\n }}\n />\n <SheetCell\n name=\"spent\"\n width=\"flex\"\n textAlign=\"right\"\n borderColor={borderColor}\n style={[{ fontWeight: 600 }, styles.tnum]}\n valueProps={{\n binding: reportBudget.groupSumAmount(id),\n type: 'financial',\n }}\n />\n {!group.is_income && (\n <SheetCell\n name=\"balance\"\n width=\"flex\"\n borderColor={borderColor}\n textAlign=\"right\"\n style={[\n { fontWeight: 600, paddingRight: MONTH_RIGHT_PADDING },\n styles.tnum,\n ]}\n valueProps={{\n binding: reportBudget.groupBalance(id),\n type: 'financial',\n privacyFilter: {\n style: {\n paddingRight: MONTH_RIGHT_PADDING,\n },\n },\n }}\n />\n )}\n </View>\n );\n});\n\ntype BalanceTooltipProps = {\n categoryId: string;\n tooltip: { close: () => void };\n monthIndex: number;\n onBudgetAction: (idx: number, action: string, arg: unknown) => void;\n};\nfunction BalanceTooltip({\n categoryId,\n tooltip,\n monthIndex,\n onBudgetAction,\n}: BalanceTooltipProps) {\n let carryover = useSheetValue(reportBudget.catCarryover(categoryId));\n\n return (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 0 }}\n onClose={tooltip.close}\n >\n <Menu\n onMenuSelect={type => {\n onBudgetAction(monthIndex, 'carryover', {\n category: categoryId,\n flag: !carryover,\n });\n tooltip.close();\n }}\n items={[\n {\n name: 'carryover',\n text: carryover\n ? 'Remove overspending rollover'\n : 'Rollover overspending',\n },\n ]}\n />\n </Tooltip>\n );\n}\n\ntype CategoryMonthProps = {\n monthIndex: number;\n category: { id: string; name: string; is_income: boolean };\n editing: boolean;\n onEdit: (id: string | null, idx?: number) => void;\n onBudgetAction: (idx: number, action: string, arg: unknown) => void;\n onShowActivity: (name: string, id: string, idx: number) => void;\n};\nexport const CategoryMonth = memo(function CategoryMonth({\n monthIndex,\n category,\n editing,\n onEdit,\n onBudgetAction,\n onShowActivity,\n}: CategoryMonthProps) {\n let borderColor = colors.border;\n let balanceTooltip = useTooltip();\n const [menuOpen, setMenuOpen] = useState(false);\n const [hover, setHover] = useState(false);\n const isGoalTemplatesEnabled = useFeatureFlag('goalTemplatesEnabled');\n\n return (\n <View\n style={{\n flex: 1,\n flexDirection: 'row',\n '& .hover-visible': {\n opacity: 0,\n transition: 'opacity .25s',\n },\n '&:hover .hover-visible': {\n opacity: 1,\n },\n }}\n >\n <View\n style={{\n flex: 1,\n flexDirection: 'row',\n borderTopWidth: 1,\n borderBottomWidth: 1,\n borderColor,\n backgroundColor: 'white',\n }}\n onMouseOverCapture={() => setHover(true)}\n onMouseLeave={() => {\n setHover(false);\n }}\n >\n {!editing && (hover || menuOpen) && (\n <View\n style={{\n flexShrink: 0,\n marginRight: 0,\n marginLeft: 3,\n justifyContent: 'center',\n }}\n >\n <Button\n type=\"bare\"\n onClick={e => {\n e.stopPropagation();\n setMenuOpen(true);\n }}\n style={{\n padding: 3,\n }}\n >\n <CheveronDown\n width={14}\n height={14}\n className=\"hover-visible\"\n style={menuOpen && { opacity: 1 }}\n />\n </Button>\n {menuOpen && (\n <Tooltip\n position=\"bottom-left\"\n width={200}\n style={{ padding: 0 }}\n onClose={() => setMenuOpen(false)}\n >\n <Menu\n onMenuSelect={type => {\n onBudgetAction(monthIndex, type, { category: category.id });\n setMenuOpen(false);\n }}\n items={[\n {\n name: 'copy-single-last',\n text: 'Copy last month’s budget',\n },\n {\n name: 'set-single-3-avg',\n text: 'Set to 3 month average',\n },\n {\n name: 'set-single-6-avg',\n text: 'Set to 6 month average',\n },\n {\n name: 'set-single-12-avg',\n text: 'Set to yearly average',\n },\n isGoalTemplatesEnabled && {\n name: 'apply-single-category-template',\n text: 'Apply budget template',\n },\n ]}\n />\n </Tooltip>\n )}\n </View>\n )}\n <SheetCell\n name=\"budget\"\n exposed={editing}\n focused={editing}\n width=\"flex\"\n borderColor=\"white\"\n onExpose={() => onEdit(category.id, monthIndex)}\n style={[editing && { zIndex: 100 }, styles.tnum]}\n textAlign=\"right\"\n valueStyle={[\n {\n cursor: 'default',\n margin: 1,\n padding: '0 4px',\n borderRadius: 4,\n },\n {\n ':hover': {\n boxShadow: 'inset 0 0 0 1px ' + colors.n7,\n backgroundColor: 'white',\n },\n },\n ]}\n valueProps={{\n binding: reportBudget.catBudgeted(category.id),\n type: 'financial',\n getValueStyle: makeAmountGrey,\n formatExpr: expr => {\n return integerToCurrency(expr);\n },\n unformatExpr: expr => {\n return amountToInteger(evalArithmetic(expr, 0));\n },\n }}\n inputProps={{\n onBlur: () => {\n onEdit(null);\n },\n }}\n onSave={amount => {\n onBudgetAction(monthIndex, 'budget-amount', {\n category: category.id,\n amount,\n });\n }}\n />\n </View>\n <Field\n name=\"spent\"\n width=\"flex\"\n borderColor={borderColor}\n style={{ textAlign: 'right' }}\n >\n <span\n data-testid=\"category-month-spent\"\n onClick={() => onShowActivity(category.name, category.id, monthIndex)}\n >\n <CellValue\n binding={reportBudget.catSumAmount(category.id)}\n type=\"financial\"\n getStyle={makeAmountGrey}\n style={{\n cursor: 'pointer',\n ':hover': {\n textDecoration: 'underline',\n },\n }}\n />\n </span>\n </Field>\n\n {!category.is_income && (\n <Field\n name=\"balance\"\n width=\"flex\"\n borderColor={borderColor}\n style={{ paddingRight: MONTH_RIGHT_PADDING, textAlign: 'right' }}\n >\n <span {...(category.is_income ? {} : balanceTooltip.getOpenEvents())}>\n <BalanceWithCarryover\n disabled={category.is_income}\n carryover={reportBudget.catCarryover(category.id)}\n balance={reportBudget.catBalance(category.id)}\n />\n </span>\n {balanceTooltip.isOpen && (\n <BalanceTooltip\n categoryId={category.id}\n tooltip={balanceTooltip}\n monthIndex={monthIndex}\n onBudgetAction={onBudgetAction}\n />\n )}\n </Field>\n )}\n </View>\n );\n});\n\nexport const ExpenseGroupMonth = GroupMonth;\nexport const ExpenseCategoryMonth = CategoryMonth;\n\nexport const IncomeGroupMonth = GroupMonth;\nexport const IncomeCategoryMonth = CategoryMonth;\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 CategoryAutocomplete from '../../autocomplete/CategorySelect';\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, CategoryGroupsContext } 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 categoryGroups = useContext(CategoryGroupsContext);\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 React, {\n useState,\n useContext,\n useEffect,\n type ChangeEvent,\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 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';\n\ntype HoldTooltipProps = {\n onSubmit: (amount: number) => void;\n onClose: () => void;\n};\nexport default function HoldTooltip({ onSubmit, onClose }: HoldTooltipProps) {\n const spreadsheet = useSpreadsheet();\n const sheetName = useContext(NamespaceContext);\n\n const [amount, setAmount] = useState(null);\n\n useEffect(() => {\n (async () => {\n const node = await spreadsheet.get(sheetName, 'to-budget');\n setAmount(integerToCurrency(Math.max(node.value, 0)));\n })();\n }, []);\n\n function submit() {\n const parsedAmount = evalArithmetic(amount, null);\n if (parsedAmount) {\n onSubmit(amountToInteger(parsedAmount));\n }\n onClose();\n }\n\n if (amount === null) {\n // See `TransferTooltip` for more info about this\n return null;\n }\n\n return (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 10 }}\n onClose={onClose}\n >\n <View style={{ marginBottom: 5 }}>Hold this amount:</View>\n <View>\n <InitialFocus>\n <Input\n value={amount}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n setAmount(e.target.value)\n }\n onEnter={submit}\n />\n </InitialFocus>\n </View>\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 Hold\n </Button>\n </View>\n </Tooltip>\n );\n}\n","import React, { type ReactNode, createContext, useContext } from 'react';\n\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nlet Context = createContext(null);\n\ntype RolloverContextProps = {\n categoryGroups: unknown[];\n summaryCollapsed: boolean;\n onBudgetAction: (idx: number, action: string, arg?: unknown) => void;\n onToggleSummaryCollapse: () => void;\n children: ReactNode;\n};\nexport function RolloverContext({\n categoryGroups,\n summaryCollapsed,\n onBudgetAction,\n onToggleSummaryCollapse,\n children,\n}: RolloverContextProps) {\n let currentMonth = monthUtils.currentMonth();\n\n return (\n <Context.Provider\n value={{\n currentMonth,\n categoryGroups,\n summaryCollapsed,\n onBudgetAction,\n onToggleSummaryCollapse,\n }}\n children={children}\n />\n );\n}\n\nexport function useRollover() {\n return useContext(Context);\n}\n","import React, { useState } from 'react';\n\nimport { css } from 'glamor';\n\nimport { rolloverBudget } from 'loot-core/src/client/queries';\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nimport DotsHorizontalTriple from '../../../icons/v1/DotsHorizontalTriple';\nimport ArrowButtonDown1 from '../../../icons/v2/ArrowButtonDown1';\nimport ArrowButtonUp1 from '../../../icons/v2/ArrowButtonUp1';\nimport { colors, styles } from '../../../style';\nimport AlignedText from '../../common/AlignedText';\nimport Block from '../../common/Block';\nimport Button from '../../common/Button';\nimport HoverTarget from '../../common/HoverTarget';\nimport Menu from '../../common/Menu';\nimport View from '../../common/View';\nimport NotesButton from '../../NotesButton';\nimport PrivacyFilter from '../../PrivacyFilter';\nimport CellValue from '../../spreadsheet/CellValue';\nimport format from '../../spreadsheet/format';\nimport NamespaceContext from '../../spreadsheet/NamespaceContext';\nimport useSheetName from '../../spreadsheet/useSheetName';\nimport useSheetValue from '../../spreadsheet/useSheetValue';\nimport { Tooltip } from '../../tooltips';\nimport { MONTH_BOX_SHADOW } from '../constants';\n\nimport HoldTooltip from './HoldTooltip';\nimport { useRollover } from './RolloverContext';\nimport TransferTooltip from './TransferTooltip';\n\ntype TotalsListProps = {\n prevMonthName: string;\n collapsed?: boolean;\n};\nfunction TotalsList({ prevMonthName, collapsed }: TotalsListProps) {\n return (\n <View\n style={[\n {\n flexDirection: 'row',\n lineHeight: 1.5,\n justifyContent: 'center',\n },\n !collapsed && {\n padding: '5px 0',\n marginTop: 17,\n backgroundColor: colors.n11,\n borderTopWidth: 1,\n borderBottomWidth: 1,\n borderColor: colors.n9,\n },\n collapsed && {\n padding: 7,\n },\n styles.smallText,\n ]}\n >\n <View\n style={{\n textAlign: 'right',\n marginRight: 10,\n minWidth: 50,\n }}\n >\n <HoverTarget\n style={{ flexShrink: 0 }}\n renderContent={() => (\n <Tooltip\n width={200}\n style={{ lineHeight: 1.5, padding: '6px 10px' }}\n >\n <AlignedText\n left=\"Income:\"\n right={\n <CellValue\n binding={rolloverBudget.totalIncome}\n type=\"financial\"\n privacyFilter={false}\n />\n }\n />\n <AlignedText\n left=\"From Last Month:\"\n right={\n <CellValue\n binding={rolloverBudget.fromLastMonth}\n type=\"financial\"\n privacyFilter={false}\n />\n }\n />\n </Tooltip>\n )}\n >\n <CellValue\n binding={rolloverBudget.incomeAvailable}\n type=\"financial\"\n style={{ fontWeight: 600 }}\n />\n </HoverTarget>\n\n <CellValue\n binding={rolloverBudget.lastMonthOverspent}\n type=\"financial\"\n formatter={value => {\n let v = format(value, 'financial');\n return value > 0 ? '+' + v : value === 0 ? '-' + v : v;\n }}\n style={[{ fontWeight: 600 }, styles.tnum]}\n />\n\n <CellValue\n binding={rolloverBudget.totalBudgeted}\n type=\"financial\"\n formatter={value => {\n let v = format(value, 'financial');\n return value > 0 ? '+' + v : value === 0 ? '-' + v : v;\n }}\n style={[{ fontWeight: 600 }, styles.tnum]}\n />\n\n <CellValue\n binding={rolloverBudget.forNextMonth}\n type=\"financial\"\n formatter={value => {\n let n = parseInt(value) || 0;\n let v = format(Math.abs(n), 'financial');\n return n >= 0 ? '-' + v : '+' + v;\n }}\n style={[{ fontWeight: 600 }, styles.tnum]}\n />\n </View>\n\n <View>\n <Block>Available Funds</Block>\n <Block>Overspent in {prevMonthName}</Block>\n <Block>Budgeted</Block>\n <Block>For Next Month</Block>\n </View>\n </View>\n );\n}\n\ntype ToBudgetProps = {\n month: string | number;\n prevMonthName?: string;\n collapsed?: boolean;\n onBudgetAction: (idx: string | number, action: string, arg?: unknown) => void;\n};\nfunction ToBudget({\n month,\n prevMonthName,\n collapsed,\n onBudgetAction,\n}: ToBudgetProps) {\n let [menuOpen, setMenuOpen] = useState(null);\n let sheetName = useSheetName(rolloverBudget.toBudget);\n let sheetValue = useSheetValue({\n name: rolloverBudget.toBudget,\n value: 0,\n });\n let availableValue = parseInt(sheetValue);\n let num = isNaN(availableValue) ? 0 : availableValue;\n let isNegative = num < 0;\n\n return (\n <View style={{ alignItems: 'center' }}>\n <Block>{isNegative ? 'Overbudgeted:' : 'To Budget:'}</Block>\n <View>\n <HoverTarget\n disabled={!collapsed || menuOpen}\n renderContent={() => (\n <Tooltip position=\"bottom-center\">\n <TotalsList collapsed={true} prevMonthName={prevMonthName} />\n </Tooltip>\n )}\n >\n <PrivacyFilter blurIntensity={7}>\n <Block\n onClick={() => setMenuOpen('actions')}\n data-cellname={sheetName}\n {...css([\n styles.veryLargeText,\n {\n fontWeight: 400,\n userSelect: 'none',\n cursor: 'pointer',\n color: isNegative ? colors.r4 : colors.p5,\n marginBottom: -1,\n borderBottom: '1px solid transparent',\n ':hover': {\n borderColor: isNegative ? colors.r4 : colors.p5,\n },\n },\n ])}\n >\n {format(num, 'financial')}\n </Block>\n </PrivacyFilter>\n </HoverTarget>\n {menuOpen === 'actions' && (\n <Tooltip\n position=\"bottom-center\"\n width={200}\n style={{ padding: 0 }}\n onClose={() => setMenuOpen(null)}\n >\n <Menu\n onMenuSelect={type => {\n if (type === 'reset-buffer') {\n onBudgetAction(month, 'reset-hold');\n setMenuOpen(null);\n } else {\n setMenuOpen(type);\n }\n }}\n items={[\n {\n name: 'transfer',\n text: 'Move to a category',\n },\n {\n name: 'buffer',\n text: 'Hold for next month',\n },\n {\n name: 'reset-buffer',\n text: 'Reset next month’s buffer',\n },\n ]}\n />\n </Tooltip>\n )}\n {menuOpen === 'buffer' && (\n <HoldTooltip\n onClose={() => setMenuOpen(null)}\n onSubmit={amount => {\n onBudgetAction(month, 'hold', { amount });\n }}\n />\n )}\n {menuOpen === 'transfer' && (\n <TransferTooltip\n initialAmount={availableValue}\n onClose={() => setMenuOpen(null)}\n onSubmit={(amount, category) => {\n onBudgetAction(month, 'transfer-available', {\n amount,\n category,\n });\n }}\n />\n )}\n </View>\n </View>\n );\n}\n\ntype BudgetSummaryProps = {\n month: string;\n isGoalTemplatesEnabled: boolean;\n};\nexport function BudgetSummary({\n month,\n isGoalTemplatesEnabled,\n}: BudgetSummaryProps) {\n let {\n currentMonth,\n summaryCollapsed: collapsed,\n onBudgetAction,\n onToggleSummaryCollapse,\n } = useRollover();\n\n let [menuOpen, setMenuOpen] = useState(false);\n function onMenuOpen(e) {\n setMenuOpen(true);\n }\n\n function onMenuClose() {\n setMenuOpen(false);\n }\n\n let prevMonthName = monthUtils.format(monthUtils.prevMonth(month), 'MMM');\n\n let ExpandOrCollapseIcon = collapsed ? ArrowButtonDown1 : ArrowButtonUp1;\n\n return (\n <View\n data-testid=\"budget-summary\"\n style={{\n backgroundColor: 'white',\n boxShadow: MONTH_BOX_SHADOW,\n borderRadius: 6,\n marginLeft: 0,\n marginRight: 0,\n marginTop: 5,\n flex: 1,\n cursor: 'default',\n marginBottom: 5,\n overflow: 'hidden',\n '& .hover-visible': {\n opacity: 0,\n transition: 'opacity .25s',\n },\n '&:hover .hover-visible': {\n opacity: 1,\n },\n }}\n >\n <NamespaceContext.Provider value={monthUtils.sheetForMonth(month)}>\n <View\n style={[\n { padding: '0 13px' },\n collapsed ? { margin: '10px 0' } : { marginTop: 16 },\n ]}\n >\n <View\n style={{\n position: 'absolute',\n left: 10,\n top: 0,\n }}\n >\n <Button\n type=\"bare\"\n className=\"hover-visible\"\n onClick={onToggleSummaryCollapse}\n >\n <ExpandOrCollapseIcon\n width={13}\n height={13}\n // The margin is to make it the exact same size as the dots button\n style={{ color: colors.n6, margin: 1 }}\n />\n </Button>\n </View>\n\n <div\n {...css([\n {\n textAlign: 'center',\n marginTop: 3,\n fontSize: 18,\n fontWeight: 500,\n textDecorationSkip: 'ink',\n },\n currentMonth === month && { fontWeight: 'bold' },\n ])}\n >\n {monthUtils.format(month, 'MMMM')}\n </div>\n\n <View\n style={{\n position: 'absolute',\n right: 10,\n top: 0,\n flexDirection: 'row',\n alignItems: 'center',\n }}\n >\n <View>\n <NotesButton\n id={`budget-${month}`}\n width={15}\n height={15}\n tooltipPosition=\"bottom-right\"\n defaultColor={colors.n6}\n />\n </View>\n <View style={{ userSelect: 'none', marginLeft: 2 }}>\n <Button type=\"bare\" onClick={onMenuOpen}>\n <DotsHorizontalTriple\n width={15}\n height={15}\n style={{ color: colors.n5 }}\n />\n </Button>\n {menuOpen && (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 0 }}\n onClose={onMenuClose}\n >\n <Menu\n onMenuSelect={type => {\n onMenuClose();\n onBudgetAction(month, type);\n }}\n items={[\n { name: 'copy-last', text: 'Copy last month’s budget' },\n { name: 'set-zero', text: 'Set budgets to zero' },\n {\n name: 'set-3-avg',\n text: 'Set budgets to 3 month avg',\n },\n isGoalTemplatesEnabled && {\n name: 'check-templates',\n text: 'Check templates',\n },\n isGoalTemplatesEnabled && {\n name: 'apply-goal-template',\n text: 'Apply budget template',\n },\n isGoalTemplatesEnabled && {\n name: 'overwrite-goal-template',\n text: 'Overwrite with budget template',\n },\n isGoalTemplatesEnabled && {\n name: 'cleanup-goal-template',\n text: 'End of month cleanup',\n },\n ]}\n />\n </Tooltip>\n )}\n </View>\n </View>\n </View>\n\n {collapsed ? (\n <View\n style={{\n alignItems: 'center',\n padding: '10px 20px',\n justifyContent: 'space-between',\n backgroundColor: colors.n11,\n borderTop: '1px solid ' + colors.n10,\n }}\n >\n <ToBudget\n collapsed={collapsed}\n prevMonthName={prevMonthName}\n month={month}\n onBudgetAction={onBudgetAction}\n />\n </View>\n ) : (\n <>\n <TotalsList prevMonthName={prevMonthName} />\n <View style={{ margin: '23px 0' }}>\n <ToBudget month={month} onBudgetAction={onBudgetAction} />\n </View>\n </>\n )}\n </NamespaceContext.Provider>\n </View>\n );\n}\n","import React, { type ComponentProps, memo, useContext, useState } from 'react';\n\nimport { rolloverBudget } from 'loot-core/src/client/queries';\nimport evalArithmetic from 'loot-core/src/shared/arithmetic';\nimport { integerToCurrency, amountToInteger } from 'loot-core/src/shared/util';\n\nimport useFeatureFlag from '../../../hooks/useFeatureFlag';\nimport CheveronDown from '../../../icons/v1/CheveronDown';\nimport { styles, colors } from '../../../style';\nimport CategoryAutocomplete from '../../autocomplete/CategorySelect';\nimport Button from '../../common/Button';\nimport InitialFocus from '../../common/InitialFocus';\nimport Menu from '../../common/Menu';\nimport Text from '../../common/Text';\nimport View from '../../common/View';\nimport CellValue from '../../spreadsheet/CellValue';\nimport format from '../../spreadsheet/format';\nimport useSheetValue from '../../spreadsheet/useSheetValue';\nimport { Row, Field, SheetCell } from '../../table';\nimport { Tooltip, useTooltip } from '../../tooltips';\nimport BalanceWithCarryover from '../BalanceWithCarryover';\nimport { MONTH_RIGHT_PADDING } from '../constants';\nimport {\n makeAmountGrey,\n addToBeBudgetedGroup,\n CategoryGroupsContext,\n} from '../util';\n\nimport TransferTooltip from './TransferTooltip';\n\nexport { BudgetSummary } from './BudgetSummary';\n\ntype CoverTooltipProps = {\n tooltipProps?: ComponentProps<typeof Tooltip>;\n onSubmit: (category: unknown) => void;\n onClose: () => void;\n};\nfunction CoverTooltip({ tooltipProps, onSubmit, onClose }: CoverTooltipProps) {\n let categoryGroups = useContext(CategoryGroupsContext);\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\ntype BalanceTooltipProps = {\n categoryId: string;\n tooltip: { close: () => void };\n monthIndex: number;\n onBudgetAction: (idx: number, action: string, arg?: unknown) => void;\n};\nfunction BalanceTooltip({\n categoryId,\n tooltip,\n monthIndex,\n onBudgetAction,\n}: BalanceTooltipProps) {\n let carryover = useSheetValue(rolloverBudget.catCarryover(categoryId));\n let balance = useSheetValue(rolloverBudget.catBalance(categoryId));\n let [menu, setMenu] = useState('menu');\n\n return (\n <>\n {menu === 'menu' && (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 0 }}\n onClose={tooltip.close}\n >\n <Menu\n onMenuSelect={type => {\n if (type === 'carryover') {\n onBudgetAction(monthIndex, 'carryover', {\n category: categoryId,\n flag: !carryover,\n });\n tooltip.close();\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={tooltip.close}\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={tooltip.close}\n onSubmit={fromCategory => {\n onBudgetAction(monthIndex, 'cover', {\n to: categoryId,\n from: fromCategory,\n });\n }}\n />\n )}\n </>\n );\n}\n\nlet headerLabelStyle = { flex: 1, padding: '0 5px', textAlign: 'right' };\n\nexport const BudgetTotalsMonth = memo(function BudgetTotalsMonth() {\n return (\n <View\n style={{\n flex: 1,\n flexDirection: 'row',\n marginRight: MONTH_RIGHT_PADDING,\n paddingTop: 10,\n paddingBottom: 10,\n }}\n >\n <View style={headerLabelStyle}>\n <Text style={{ color: colors.n4 }}>Budgeted</Text>\n <CellValue\n binding={rolloverBudget.totalBudgeted}\n type=\"financial\"\n style={{ color: colors.n4, fontWeight: 600 }}\n formatter={value => {\n return format(-parseFloat(value || '0'), 'financial');\n }}\n />\n </View>\n <View style={headerLabelStyle}>\n <Text style={{ color: colors.n4 }}>Spent</Text>\n <CellValue\n binding={rolloverBudget.totalSpent}\n type=\"financial\"\n style={{ color: colors.n4, fontWeight: 600 }}\n />\n </View>\n <View style={headerLabelStyle}>\n <Text style={{ color: colors.n4 }}>Balance</Text>\n <CellValue\n binding={rolloverBudget.totalBalance}\n type=\"financial\"\n style={{ color: colors.n4, fontWeight: 600 }}\n />\n </View>\n </View>\n );\n});\n\nexport function IncomeHeaderMonth() {\n return (\n <Row\n style={{\n color: colors.n4,\n alignItems: 'center',\n paddingRight: 10,\n }}\n >\n <View style={{ flex: 1, textAlign: 'right' }}>Received</View>\n </Row>\n );\n}\n\ntype ExpenseGroupMonthProps = {\n group: { id: string };\n};\nexport const ExpenseGroupMonth = memo(function ExpenseGroupMonth({\n group,\n}: ExpenseGroupMonthProps) {\n let borderColor = colors.border;\n let { id } = group;\n\n return (\n <View style={{ flex: 1, flexDirection: 'row' }}>\n <SheetCell\n name=\"budgeted\"\n width=\"flex\"\n borderColor={borderColor}\n textAlign=\"right\"\n style={[{ fontWeight: 600 }, styles.tnum]}\n valueProps={{\n binding: rolloverBudget.groupBudgeted(id),\n type: 'financial',\n }}\n />\n <SheetCell\n name=\"spent\"\n width=\"flex\"\n textAlign=\"right\"\n borderColor={borderColor}\n style={[{ fontWeight: 600 }, styles.tnum]}\n valueProps={{\n binding: rolloverBudget.groupSumAmount(id),\n type: 'financial',\n }}\n />\n <SheetCell\n name=\"balance\"\n width=\"flex\"\n borderColor={borderColor}\n textAlign=\"right\"\n style={[\n { fontWeight: 600, paddingRight: MONTH_RIGHT_PADDING },\n styles.tnum,\n ]}\n valueProps={{\n binding: rolloverBudget.groupBalance(id),\n type: 'financial',\n privacyFilter: {\n style: {\n paddingRight: MONTH_RIGHT_PADDING,\n },\n },\n }}\n />\n </View>\n );\n});\n\ntype ExpenseCategoryMonthProps = {\n monthIndex: number;\n category: { id: string; name: string; is_income: boolean };\n editing: boolean;\n onEdit: (id: string | null, idx?: number) => void;\n onBudgetAction: (idx: number, action: string, arg?: unknown) => void;\n onShowActivity: (name: string, id: string, idx: number) => void;\n};\nexport const ExpenseCategoryMonth = memo(function ExpenseCategoryMonth({\n monthIndex,\n category,\n editing,\n onEdit,\n onBudgetAction,\n onShowActivity,\n}: ExpenseCategoryMonthProps) {\n let borderColor = colors.border;\n let balanceTooltip = useTooltip();\n const [menuOpen, setMenuOpen] = useState(false);\n const [hover, setHover] = useState(false);\n const isGoalTemplatesEnabled = useFeatureFlag('goalTemplatesEnabled');\n\n return (\n <View\n style={{\n flex: 1,\n flexDirection: 'row',\n '& .hover-visible': {\n opacity: 0,\n transition: 'opacity .25s',\n },\n '&:hover .hover-visible': {\n opacity: 1,\n },\n }}\n >\n <View\n style={{\n flex: 1,\n flexDirection: 'row',\n borderTopWidth: 1,\n borderBottomWidth: 1,\n borderColor,\n backgroundColor: 'white',\n }}\n onMouseOverCapture={() => setHover(true)}\n onMouseLeave={() => {\n setHover(false);\n }}\n >\n {!editing && (hover || menuOpen) ? (\n <View\n style={{\n flexShrink: 1,\n marginRight: 0,\n marginLeft: 3,\n justifyContent: 'center',\n }}\n >\n <Button\n type=\"bare\"\n onClick={e => {\n e.stopPropagation();\n setMenuOpen(true);\n }}\n style={{\n padding: 3,\n }}\n >\n <CheveronDown\n width={14}\n height={14}\n className=\"hover-visible\"\n style={menuOpen && { opacity: 1 }}\n />\n </Button>\n {menuOpen && (\n <Tooltip\n position=\"bottom-left\"\n width={200}\n style={{ padding: 0 }}\n onClose={() => setMenuOpen(false)}\n >\n <Menu\n onMenuSelect={type => {\n onBudgetAction(monthIndex, type, { category: category.id });\n setMenuOpen(false);\n }}\n items={[\n {\n name: 'copy-single-last',\n text: 'Copy last month’s budget',\n },\n {\n name: 'set-single-3-avg',\n text: 'Set to 3 month average',\n },\n {\n name: 'set-single-6-avg',\n text: 'Set to 6 month average',\n },\n {\n name: 'set-single-12-avg',\n text: 'Set to yearly average',\n },\n isGoalTemplatesEnabled && {\n name: 'apply-single-category-template',\n text: 'Apply budget template',\n },\n ]}\n />\n </Tooltip>\n )}\n </View>\n ) : null}\n <SheetCell\n name=\"budget\"\n exposed={editing}\n focused={editing}\n width=\"flex\"\n borderColor=\"white\"\n onExpose={() => onEdit(category.id, monthIndex)}\n style={[editing && { zIndex: 100 }, styles.tnum]}\n textAlign=\"right\"\n valueStyle={[\n {\n cursor: 'default',\n margin: 1,\n padding: '0 4px',\n borderRadius: 4,\n },\n {\n ':hover': {\n boxShadow: 'inset 0 0 0 1px ' + colors.n7,\n backgroundColor: 'white',\n },\n },\n ]}\n valueProps={{\n binding: rolloverBudget.catBudgeted(category.id),\n type: 'financial',\n getValueStyle: makeAmountGrey,\n formatExpr: expr => {\n return integerToCurrency(expr);\n },\n unformatExpr: expr => {\n return amountToInteger(evalArithmetic(expr, 0));\n },\n }}\n inputProps={{\n onBlur: () => {\n onEdit(null);\n },\n }}\n onSave={amount => {\n onBudgetAction(monthIndex, 'budget-amount', {\n category: category.id,\n amount,\n });\n }}\n />\n </View>\n <Field\n name=\"spent\"\n width=\"flex\"\n borderColor={borderColor}\n style={{ textAlign: 'right' }}\n >\n <span\n data-testid=\"category-month-spent\"\n onClick={() => onShowActivity(category.name, category.id, monthIndex)}\n >\n <CellValue\n binding={rolloverBudget.catSumAmount(category.id)}\n type=\"financial\"\n getStyle={makeAmountGrey}\n style={{\n cursor: 'pointer',\n ':hover': { textDecoration: 'underline' },\n }}\n />\n </span>\n </Field>\n <Field\n name=\"balance\"\n width=\"flex\"\n borderColor={borderColor}\n style={{ paddingRight: MONTH_RIGHT_PADDING, textAlign: 'right' }}\n >\n <span {...balanceTooltip.getOpenEvents()}>\n <BalanceWithCarryover\n carryover={rolloverBudget.catCarryover(category.id)}\n balance={rolloverBudget.catBalance(category.id)}\n />\n </span>\n {balanceTooltip.isOpen && (\n <BalanceTooltip\n categoryId={category.id}\n tooltip={balanceTooltip}\n monthIndex={monthIndex}\n onBudgetAction={onBudgetAction}\n />\n )}\n </Field>\n </View>\n );\n});\n\nexport function IncomeGroupMonth() {\n return (\n <View style={{ flex: 1 }}>\n <SheetCell\n name=\"received\"\n width=\"flex\"\n borderColor={colors.border}\n textAlign=\"right\"\n style={[\n { fontWeight: 600, paddingRight: MONTH_RIGHT_PADDING },\n styles.tnum,\n ]}\n valueProps={{\n binding: rolloverBudget.groupIncomeReceived,\n type: 'financial',\n privacyFilter: {\n style: {\n paddingRight: MONTH_RIGHT_PADDING,\n },\n },\n }}\n />\n </View>\n );\n}\n\ntype IncomeCategoryMonthProps = {\n category: { id: string; name: string };\n isLast: boolean;\n monthIndex: number;\n onShowActivity: (name: string, id: string, idx: number) => void;\n};\nexport function IncomeCategoryMonth({\n category,\n isLast,\n monthIndex,\n onShowActivity,\n}: IncomeCategoryMonthProps) {\n return (\n <View style={{ flex: 1 }}>\n <Field\n name=\"received\"\n width=\"flex\"\n borderColor={colors.border}\n style={[\n { paddingRight: MONTH_RIGHT_PADDING, textAlign: 'right' },\n isLast && { borderBottomWidth: 0 },\n ]}\n >\n <span\n onClick={() => onShowActivity(category.name, category.id, monthIndex)}\n >\n <CellValue\n binding={rolloverBudget.catSumAmount(category.id)}\n type=\"financial\"\n style={{\n cursor: 'pointer',\n ':hover': { textDecoration: 'underline' },\n }}\n />\n </span>\n </Field>\n </View>\n );\n}\n","import React, { memo, PureComponent, useContext, useMemo } from 'react';\nimport { useSelector } from 'react-redux';\nimport { useLocation, useMatch, useNavigate } from 'react-router-dom';\n\nimport { useSpreadsheet } from 'loot-core/src/client/SpreadsheetProvider';\nimport { send, listen } from 'loot-core/src/platform/client/fetch';\nimport {\n addCategory,\n updateCategory,\n moveCategory,\n moveCategoryGroup,\n deleteCategory,\n addGroup,\n updateGroup,\n deleteGroup,\n} from 'loot-core/src/shared/categories';\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nimport { useActions } from '../../hooks/useActions';\nimport useFeatureFlag from '../../hooks/useFeatureFlag';\nimport { styles } from '../../style';\nimport View from '../common/View';\nimport { TitlebarContext } from '../Titlebar';\n\nimport DynamicBudgetTable from './DynamicBudgetTable';\nimport { getValidMonthBounds } from './MonthsContext';\nimport * as report from './report/components';\nimport { ReportProvider } from './report/ReportContext';\nimport * as rollover from './rollover/rollover-components';\nimport { RolloverContext } from './rollover/RolloverContext';\n\nlet _initialBudgetMonth = null;\n\nclass Budget extends PureComponent {\n constructor(props) {\n super(props);\n\n const currentMonth = _initialBudgetMonth || monthUtils.currentMonth();\n this.state = {\n initialized: false,\n prewarmStartMonth: props.startMonth || currentMonth,\n newCategoryForGroup: null,\n isAddingGroup: false,\n collapsed: props.collapsedPrefs || [],\n bounds: { start: currentMonth, end: currentMonth },\n categoryGroups: null,\n summaryCollapsed: props.summaryCollapsed,\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 { titlebar, budgetType } = this.props;\n this.loadCategories();\n\n let { start, end } = await send('get-budget-bounds');\n this.setState({ bounds: { start, end } });\n\n this.prewarmAllMonths({ start, end }, budgetType);\n\n let unlistens = [\n 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 this.loadCategories();\n }\n }),\n\n listen('undo-event', ({ tables }) => {\n if (this.table) {\n // g dammit\n // We need to clear the editing cell, otherwise when\n // the user navigates away from the page they will\n // accidentally clear the undo stack if they have pressed\n // undo, since the cell will save itself on blur (worst case:\n // undo takes you to another screen and then you can't redo\n // any of the budget changes)\n this.table.clearEditing();\n }\n\n if (tables.includes('categories')) {\n this.loadCategories();\n }\n }),\n\n titlebar.subscribe(this.onTitlebarEvent),\n ];\n\n this.cleanup = () => {\n unlistens.forEach(unlisten => unlisten());\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevState.collapsed !== this.state.collapsed) {\n this.props.savePrefs({ 'budget.collapsed': this.state.collapsed });\n }\n\n const currentMonth = _initialBudgetMonth || monthUtils.currentMonth();\n const startMonth = this.props.startMonth || currentMonth;\n\n if (prevState.startMonth !== startMonth) {\n // Save it off into a global state so if the component re-mounts\n // we keep this state (but don't need to subscribe to it)\n _initialBudgetMonth = startMonth;\n }\n\n if (this.props.accountId !== prevProps.accountId) {\n // Make to sure to check if the budget bounds have changed, and\n // if so reload the budget data\n send('get-budget-bounds').then(({ start, end }) => {\n let { bounds } = this.state;\n if (bounds.start !== start || bounds.end !== end) {\n this.setState({ bounds: { start, end } });\n }\n });\n }\n }\n\n componentWillUnmount() {\n if (this.cleanup) {\n this.cleanup();\n }\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\n async prewarmAllMonths(bounds, type = null) {\n let numMonths = 3;\n\n const currentMonth = _initialBudgetMonth || monthUtils.currentMonth();\n const startMonth = this.props.startMonth || currentMonth;\n\n bounds = getValidMonthBounds(\n bounds,\n monthUtils.subMonths(startMonth, 1),\n monthUtils.addMonths(startMonth, numMonths + 1),\n );\n let months = monthUtils.rangeInclusive(bounds.start, bounds.end);\n\n await Promise.all(months.map(month => this.prewarmMonth(month, type)));\n\n this.setState({ initialized: true });\n }\n\n onMonthSelect = async (month, numDisplayed) => {\n this.setState({ prewarmStartMonth: month });\n\n this.warmingMonth = month;\n\n const currentMonth = _initialBudgetMonth || monthUtils.currentMonth();\n const startMonth = this.props.startMonth || currentMonth;\n\n // We could be smarter about this, but this is a good start. We\n // optimize for the case where users press the left/right button\n // to move between months. This loads the month data all at once\n // and \"prewarms\" the spreadsheet cache. This uses a simple\n // heuristic that will fail if the user clicks an arbitrary month,\n // but it will just load in some unnecessary data.\n if (month < startMonth) {\n // pre-warm prev month\n await this.prewarmMonth(monthUtils.subMonths(month, 1));\n } else if (month > startMonth) {\n // pre-warm next month\n await this.prewarmMonth(monthUtils.addMonths(month, numDisplayed));\n }\n\n if (this.warmingMonth === month) {\n this.props.savePrefs({ 'budget.startMonth': month });\n }\n };\n\n onShowNewCategory = groupId => {\n this.setState({\n newCategoryForGroup: groupId,\n collapsed: this.state.collapsed.filter(c => c !== groupId),\n });\n };\n\n onHideNewCategory = () => {\n this.setState({ newCategoryForGroup: null });\n };\n\n onShowNewGroup = () => {\n this.setState({ isAddingGroup: true });\n };\n\n onHideNewGroup = () => {\n this.setState({ isAddingGroup: false });\n };\n\n setCollapsed = collapsed => {\n this.setState({ collapsed });\n };\n\n onCopy(month) {\n this.props.copyPreviousMonthInto(month, this.props.categories);\n }\n\n onSaveCategory = async category => {\n let { categoryGroups } = this.state;\n\n if (category.id === 'new') {\n let id = await this.props.createCategory(\n category.name,\n category.cat_group,\n category.is_income,\n );\n\n this.setState({\n newCategoryForGroup: null,\n categoryGroups: addCategory(categoryGroups, {\n ...category,\n is_income: category.is_income ? 1 : 0,\n id,\n }),\n });\n } else {\n const cat = {\n ...category,\n hidden: category.hidden ? 1 : 0,\n };\n\n this.props.updateCategory(cat);\n this.setState({\n categoryGroups: updateCategory(categoryGroups, cat),\n });\n }\n };\n\n onDeleteCategory = async id => {\n const mustTransfer = await send('must-category-transfer', { id });\n let { categoryGroups } = this.state;\n\n if (mustTransfer) {\n this.props.pushModal('confirm-category-delete', {\n category: id,\n onDelete: transferCategory => {\n if (id !== transferCategory) {\n this.props.deleteCategory(id, transferCategory);\n\n this.setState({\n categoryGroups: deleteCategory(categoryGroups, id),\n });\n }\n },\n });\n } else {\n this.props.deleteCategory(id);\n\n this.setState({\n categoryGroups: deleteCategory(categoryGroups, id),\n });\n }\n };\n\n onSaveGroup = async group => {\n let { categoryGroups } = this.state;\n\n if (group.id === 'new') {\n let id = await this.props.createGroup(group.name);\n this.setState({\n isAddingGroup: false,\n categoryGroups: addGroup(categoryGroups, {\n ...group,\n is_income: 0,\n categories: group.categories || [],\n id,\n }),\n });\n } else {\n const grp = {\n ...group,\n hidden: group.hidden ? 1 : 0,\n };\n\n this.props.updateGroup(grp);\n this.setState({\n categoryGroups: updateGroup(categoryGroups, grp),\n });\n }\n };\n\n onDeleteGroup = async id => {\n let { categoryGroups } = this.state;\n let group = categoryGroups.find(g => g.id === id);\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: id,\n onDelete: transferCategory => {\n this.props.deleteGroup(id, transferCategory);\n\n this.setState({\n categoryGroups: deleteGroup(categoryGroups, id),\n });\n },\n });\n } else {\n this.props.deleteGroup(id);\n\n this.setState({\n categoryGroups: deleteGroup(categoryGroups, id),\n });\n }\n };\n\n onBudgetAction = (month, type, args) => {\n this.props.applyBudgetAction(month, type, args);\n };\n\n onShowActivity = (categoryName, categoryId, month) => {\n this.props.navigate('/accounts', {\n state: {\n goBack: true,\n filterName: `${categoryName} (${monthUtils.format(\n month,\n 'MMMM yyyy',\n )})`,\n filter: {\n category: categoryId,\n date: { $transform: '$month', $eq: month },\n },\n },\n });\n };\n\n onReorderCategory = async sortInfo => {\n let { categoryGroups } = this.state;\n\n this.props.moveCategory(sortInfo.id, sortInfo.groupId, sortInfo.targetId);\n this.setState({\n categoryGroups: moveCategory(\n categoryGroups,\n sortInfo.id,\n sortInfo.groupId,\n sortInfo.targetId,\n ),\n });\n };\n\n onReorderGroup = async sortInfo => {\n let { categoryGroups } = this.state;\n\n this.props.moveCategoryGroup(sortInfo.id, sortInfo.targetId);\n this.setState({\n categoryGroups: moveCategoryGroup(\n categoryGroups,\n sortInfo.id,\n sortInfo.targetId,\n ),\n });\n };\n\n onToggleCollapse = () => {\n let collapsed = !this.state.summaryCollapsed;\n this.setState({ summaryCollapsed: collapsed });\n this.props.savePrefs({ 'budget.summaryCollapsed': collapsed });\n };\n\n onTitlebarEvent = async msg => {\n switch (msg) {\n case 'budget/switch-type': {\n let type = this.props.budgetType;\n let newType = type === 'rollover' ? 'report' : 'rollover';\n\n this.props.spreadsheet.disableObservers();\n await send('budget-set-type', { type: newType });\n await this.prewarmAllMonths(this.state.bounds, newType);\n this.props.spreadsheet.enableObservers();\n this.props.loadPrefs();\n break;\n }\n default:\n }\n };\n\n render() {\n let {\n maxMonths,\n budgetType: type,\n reportComponents,\n rolloverComponents,\n } = this.props;\n let {\n initialized,\n categoryGroups,\n prewarmStartMonth,\n newCategoryForGroup,\n isAddingGroup,\n collapsed,\n summaryCollapsed,\n bounds,\n } = this.state;\n\n maxMonths = maxMonths || 1;\n\n if (!initialized || !categoryGroups) {\n return null;\n }\n\n const currentMonth = _initialBudgetMonth || monthUtils.currentMonth();\n const startMonth = this.props.startMonth || currentMonth;\n\n let table;\n if (type === 'report') {\n table = (\n <ReportProvider\n summaryCollapsed={summaryCollapsed}\n onBudgetAction={this.onBudgetAction}\n onToggleSummaryCollapse={this.onToggleCollapse}\n >\n <DynamicBudgetTable\n ref={el => (this.table = el)}\n type={type}\n categoryGroups={categoryGroups}\n prewarmStartMonth={prewarmStartMonth}\n startMonth={startMonth}\n monthBounds={bounds}\n maxMonths={maxMonths}\n collapsed={collapsed}\n setCollapsed={this.setCollapsed}\n newCategoryForGroup={newCategoryForGroup}\n isAddingGroup={isAddingGroup}\n dataComponents={reportComponents}\n onMonthSelect={this.onMonthSelect}\n onShowNewCategory={this.onShowNewCategory}\n onHideNewCategory={this.onHideNewCategory}\n onShowNewGroup={this.onShowNewGroup}\n onHideNewGroup={this.onHideNewGroup}\n onDeleteCategory={this.onDeleteCategory}\n onDeleteGroup={this.onDeleteGroup}\n onSaveCategory={this.onSaveCategory}\n onSaveGroup={this.onSaveGroup}\n onBudgetAction={this.onBudgetAction}\n onShowActivity={this.onShowActivity}\n onReorderCategory={this.onReorderCategory}\n onReorderGroup={this.onReorderGroup}\n />\n </ReportProvider>\n );\n } else {\n table = (\n <RolloverContext\n categoryGroups={categoryGroups}\n summaryCollapsed={summaryCollapsed}\n onBudgetAction={this.onBudgetAction}\n onToggleSummaryCollapse={this.onToggleCollapse}\n >\n <DynamicBudgetTable\n ref={el => (this.table = el)}\n type={type}\n categoryGroups={categoryGroups}\n prewarmStartMonth={prewarmStartMonth}\n startMonth={startMonth}\n monthBounds={bounds}\n maxMonths={maxMonths}\n collapsed={collapsed}\n setCollapsed={this.setCollapsed}\n newCategoryForGroup={newCategoryForGroup}\n isAddingGroup={isAddingGroup}\n dataComponents={rolloverComponents}\n onMonthSelect={this.onMonthSelect}\n onShowNewCategory={this.onShowNewCategory}\n onHideNewCategory={this.onHideNewCategory}\n onShowNewGroup={this.onShowNewGroup}\n onHideNewGroup={this.onHideNewGroup}\n onDeleteCategory={this.onDeleteCategory}\n onDeleteGroup={this.onDeleteGroup}\n onSaveCategory={this.onSaveCategory}\n onSaveGroup={this.onSaveGroup}\n onBudgetAction={this.onBudgetAction}\n onShowActivity={this.onShowActivity}\n onReorderCategory={this.onReorderCategory}\n onReorderGroup={this.onReorderGroup}\n />\n </RolloverContext>\n );\n }\n\n return (\n <View style={{ flex: 1 }} innerRef={el => (this.page = el)}>\n {table}\n </View>\n );\n }\n}\n\nconst RolloverBudgetSummary = memo(props => {\n const isGoalTemplatesEnabled = useFeatureFlag('goalTemplatesEnabled');\n return (\n <rollover.BudgetSummary\n {...props}\n isGoalTemplatesEnabled={isGoalTemplatesEnabled}\n />\n );\n});\n\nexport default function BudgetWrapper(props) {\n let startMonth = useSelector(state => state.prefs.local['budget.startMonth']);\n let collapsedPrefs = useSelector(\n state => state.prefs.local['budget.collapsed'],\n );\n let summaryCollapsed = useSelector(\n state => state.prefs.local['budget.summaryCollapsed'],\n );\n let budgetType = useSelector(\n state => state.prefs.local.budgetType || 'rollover',\n );\n let maxMonths = useSelector(state => state.prefs.global.maxMonths);\n let categoryGroups = useSelector(state => state.queries.categories.grouped);\n\n let actions = useActions();\n let spreadsheet = useSpreadsheet();\n let titlebar = useContext(TitlebarContext);\n let location = useLocation();\n let match = useMatch(location.pathname);\n let navigate = useNavigate();\n\n let reportComponents = useMemo(\n () => ({\n SummaryComponent: report.BudgetSummary,\n ExpenseCategoryComponent: report.ExpenseCategoryMonth,\n ExpenseGroupComponent: report.ExpenseGroupMonth,\n IncomeCategoryComponent: report.IncomeCategoryMonth,\n IncomeGroupComponent: report.IncomeGroupMonth,\n BudgetTotalsComponent: report.BudgetTotalsMonth,\n IncomeHeaderComponent: report.IncomeHeaderMonth,\n }),\n [report],\n );\n\n let rolloverComponents = useMemo(\n () => ({\n SummaryComponent: RolloverBudgetSummary,\n ExpenseCategoryComponent: rollover.ExpenseCategoryMonth,\n ExpenseGroupComponent: rollover.ExpenseGroupMonth,\n IncomeCategoryComponent: rollover.IncomeCategoryMonth,\n IncomeGroupComponent: rollover.IncomeGroupMonth,\n BudgetTotalsComponent: rollover.BudgetTotalsMonth,\n IncomeHeaderComponent: rollover.IncomeHeaderMonth,\n }),\n [rollover],\n );\n\n // In a previous iteration, the wrapper needs `overflow: hidden` for\n // some reason. Without it at certain dimensions the width/height\n // that autosizer gives us is slightly wrong, causing scrollbars to\n // appear. We might not need it anymore?\n return (\n <View\n style={[\n styles.page,\n { paddingLeft: 8, paddingRight: 8, overflow: 'hidden' },\n ]}\n >\n <Budget\n startMonth={startMonth}\n collapsedPrefs={collapsedPrefs}\n summaryCollapsed={summaryCollapsed}\n budgetType={budgetType}\n maxMonths={maxMonths}\n categoryGroups={categoryGroups}\n {...actions}\n reportComponents={reportComponents}\n rolloverComponents={rolloverComponents}\n spreadsheet={spreadsheet}\n titlebar={titlebar}\n navigate={navigate}\n match={match}\n />\n </View>\n );\n}\n","import * as React from 'react';\nconst SvgCheck = props => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n fill=\"currentColor\"\n d=\"M6.847 21.429a3.408 3.408 0 0 1-2.662-1.34l-3.76-4.273a1.714 1.714 0 0 1 2.572-2.263l3.522 4.01a.429.429 0 0 0 .631.014L21.036 3.105a1.715 1.715 0 1 1 2.486 2.362l-14.06 14.8a3.327 3.327 0 0 1-2.615 1.162Z\"\n />\n </svg>\n);\nexport default SvgCheck;\n","import React, { useState, useMemo } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { useCachedAccounts } from 'loot-core/src/client/data-hooks/accounts';\nimport { useCachedPayees } from 'loot-core/src/client/data-hooks/payees';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport { getScheduledAmount } from 'loot-core/src/shared/schedules';\nimport { integerToCurrency } from 'loot-core/src/shared/util';\n\nimport DotsHorizontalTriple from '../../icons/v1/DotsHorizontalTriple';\nimport Check from '../../icons/v2/Check';\nimport { colors } from '../../style';\nimport Button from '../common/Button';\nimport Menu from '../common/Menu';\nimport Text from '../common/Text';\nimport View from '../common/View';\nimport { Table, TableHeader, Row, Field, Cell } from '../table';\nimport { Tooltip } from '../tooltips';\nimport DisplayId from '../util/DisplayId';\n\nimport { StatusBadge } from './StatusBadge';\n\nexport let ROW_HEIGHT = 43;\n\nfunction OverflowMenu({ schedule, status, onAction }) {\n let [open, setOpen] = useState(false);\n\n return (\n <View>\n <Button\n type=\"bare\"\n onClick={e => {\n e.stopPropagation();\n setOpen(true);\n }}\n >\n <DotsHorizontalTriple\n width={15}\n height={15}\n style={{ transform: 'rotateZ(90deg)' }}\n />\n </Button>\n {open && (\n <Tooltip\n position=\"bottom-right\"\n width={150}\n style={{ padding: 0 }}\n onClose={() => setOpen(false)}\n >\n <Menu\n onMenuSelect={name => {\n onAction(name, schedule.id);\n setOpen(false);\n }}\n items={[\n status === 'due' && {\n name: 'post-transaction',\n text: 'Post transaction',\n },\n ...(schedule.completed\n ? [{ name: 'restart', text: 'Restart' }]\n : [\n { name: 'skip', text: 'Skip next date' },\n { name: 'complete', text: 'Complete' },\n ]),\n { name: 'delete', text: 'Delete' },\n ]}\n />\n </Tooltip>\n )}\n </View>\n );\n}\n\nexport function ScheduleAmountCell({ amount, op }) {\n let num = getScheduledAmount(amount);\n let str = integerToCurrency(Math.abs(num || 0));\n let isApprox = op === 'isapprox' || op === 'isbetween';\n\n return (\n <Cell\n width={100}\n plain\n style={{\n textAlign: 'right',\n flexDirection: 'row',\n alignItems: 'center',\n padding: '0 5px',\n }}\n name=\"amount\"\n >\n {isApprox && (\n <View\n style={{\n textAlign: 'left',\n color: colors.n7,\n lineHeight: '1em',\n marginRight: 10,\n }}\n title={(isApprox ? 'Approximately ' : '') + str}\n >\n ~\n </View>\n )}\n <Text\n style={{\n flex: 1,\n color: num > 0 ? colors.g5 : null,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n title={(isApprox ? 'Approximately ' : '') + str}\n >\n {num > 0 ? `+${str}` : `${str}`}\n </Text>\n </Cell>\n );\n}\n\nexport function SchedulesTable({\n schedules,\n statuses,\n filter,\n minimal,\n allowCompleted,\n style,\n onSelect,\n onAction,\n tableStyle,\n}) {\n let dateFormat = useSelector(state => {\n return state.prefs.local.dateFormat || 'MM/dd/yyyy';\n });\n\n let [showCompleted, setShowCompleted] = useState(false);\n\n let payees = useCachedPayees();\n let accounts = useCachedAccounts();\n\n let filteredSchedules = useMemo(() => {\n if (!filter) {\n return schedules;\n }\n const filterIncludes = str =>\n str\n ? str.toLowerCase().includes(filter.toLowerCase()) ||\n filter.toLowerCase().includes(str.toLowerCase())\n : false;\n\n return schedules.filter(schedule => {\n let payee = payees.find(p => schedule._payee === p.id);\n let account = accounts.find(a => schedule._account === a.id);\n let amount = getScheduledAmount(schedule._amount);\n let amountStr =\n (schedule._amountOp === 'isapprox' || schedule._amountOp === 'isbetween'\n ? '~'\n : '') +\n (amount > 0 ? '+' : '') +\n integerToCurrency(Math.abs(amount || 0));\n let dateStr = schedule.next_date\n ? monthUtils.format(schedule.next_date, dateFormat)\n : null;\n\n return (\n filterIncludes(schedule.name) ||\n filterIncludes(payee && payee.name) ||\n filterIncludes(account && account.name) ||\n filterIncludes(amountStr) ||\n filterIncludes(statuses.get(schedule.id)) ||\n filterIncludes(dateStr)\n );\n });\n }, [schedules, filter, statuses]);\n\n let items = useMemo(() => {\n if (!allowCompleted) {\n return filteredSchedules.filter(s => !s.completed);\n }\n if (showCompleted) {\n return filteredSchedules;\n }\n let arr = filteredSchedules.filter(s => !s.completed);\n if (filteredSchedules.find(s => s.completed)) {\n arr.push({ type: 'show-completed' });\n }\n return arr;\n }, [filteredSchedules, showCompleted, allowCompleted]);\n\n function renderSchedule({ item }) {\n return (\n <Row\n height={ROW_HEIGHT}\n inset={15}\n backgroundColor=\"transparent\"\n onClick={() => onSelect(item.id)}\n style={{\n cursor: 'pointer',\n backgroundColor: 'white',\n ':hover': { backgroundColor: colors.hover },\n }}\n >\n <Field width=\"flex\" name=\"name\">\n <Text\n style={item.name == null ? { color: colors.n8 } : null}\n title={item.name ? item.name : ''}\n >\n {item.name ? item.name : 'None'}\n </Text>\n </Field>\n <Field width=\"flex\" name=\"payee\">\n <DisplayId type=\"payees\" id={item._payee} />\n </Field>\n <Field width=\"flex\" name=\"account\">\n <DisplayId type=\"accounts\" id={item._account} />\n </Field>\n <Field width={110} name=\"date\">\n {item.next_date\n ? monthUtils.format(item.next_date, dateFormat)\n : null}\n </Field>\n <Field width={120} name=\"status\" style={{ alignItems: 'flex-start' }}>\n <StatusBadge status={statuses.get(item.id)} />\n </Field>\n <ScheduleAmountCell amount={item._amount} op={item._amountOp} />\n {!minimal && (\n <Field width={80} style={{ textAlign: 'center' }}>\n {item._date && item._date.frequency && (\n <Check style={{ width: 13, height: 13 }} />\n )}\n </Field>\n )}\n {!minimal && (\n <Field width={40} name=\"actions\">\n <OverflowMenu\n schedule={item}\n status={statuses.get(item.id)}\n onAction={onAction}\n />\n </Field>\n )}\n </Row>\n );\n }\n\n function renderItem({ item }) {\n if (item.type === 'show-completed') {\n return (\n <Row\n height={ROW_HEIGHT}\n inset={15}\n backgroundColor=\"transparent\"\n style={{\n cursor: 'pointer',\n backgroundColor: 'white',\n ':hover': { backgroundColor: colors.hover },\n }}\n onClick={() => setShowCompleted(true)}\n >\n <Field\n width=\"flex\"\n style={{\n fontStyle: 'italic',\n textAlign: 'center',\n color: colors.n6,\n }}\n >\n Show completed schedules\n </Field>\n </Row>\n );\n }\n return renderSchedule({ item });\n }\n\n return (\n <View style={[{ flex: 1 }, tableStyle]}>\n <TableHeader height={ROW_HEIGHT} inset={15} version=\"v2\">\n <Field width=\"flex\">Name</Field>\n <Field width=\"flex\">Payee</Field>\n <Field width=\"flex\">Account</Field>\n <Field width={110}>Next date</Field>\n <Field width={120}>Status</Field>\n <Field width={100} style={{ textAlign: 'right' }}>\n Amount\n </Field>\n {!minimal && (\n <Field width={80} style={{ textAlign: 'center' }}>\n Recurring\n </Field>\n )}\n {!minimal && <Field width={40} />}\n </TableHeader>\n <Table\n rowHeight={ROW_HEIGHT}\n backgroundColor=\"transparent\"\n version=\"v2\"\n style={[{ flex: 1, backgroundColor: 'transparent' }, style]}\n items={items}\n renderItem={renderItem}\n renderEmpty={filter ? 'No matching schedules' : 'No schedules'}\n allowPopupsEscape={items.length < 6}\n />\n </View>\n );\n}\n","import React, { useState } from 'react';\n\nimport { useSchedules } from 'loot-core/src/client/data-hooks/schedules';\nimport { send } from 'loot-core/src/platform/client/fetch';\n\nimport { usePushModal } from '../../util/router-tools';\nimport Button from '../common/Button';\nimport Search from '../common/Search';\nimport View from '../common/View';\nimport { Page } from '../Page';\n\nimport { SchedulesTable, ROW_HEIGHT } from './SchedulesTable';\n\nexport default function Schedules() {\n let pushModal = usePushModal();\n\n let [filter, setFilter] = useState('');\n\n let scheduleData = useSchedules();\n\n if (scheduleData == null) {\n return null;\n }\n\n let { schedules, statuses } = scheduleData;\n\n function onEdit(id) {\n pushModal(`/schedule/edit/${id}`);\n }\n\n function onAdd() {\n pushModal('/schedule/edit');\n }\n\n function onDiscover() {\n pushModal('/schedule/discover');\n }\n\n async function onAction(name, id) {\n switch (name) {\n case 'post-transaction':\n await send('schedule/post-transaction', { id });\n break;\n case 'skip':\n await send('schedule/skip-next-date', { id });\n break;\n case 'complete':\n await send('schedule/update', { schedule: { id, completed: true } });\n break;\n case 'restart':\n await send('schedule/update', {\n schedule: { id, completed: false },\n resetNextDate: true,\n });\n break;\n case 'delete':\n await send('schedule/delete', { id });\n break;\n default:\n }\n }\n\n return (\n <Page title=\"Schedules\">\n <View style={{ alignItems: 'flex-end' }}>\n <Search\n placeholder=\"Filter schedules…\"\n value={filter}\n onChange={setFilter}\n />\n </View>\n\n <View\n style={{\n marginTop: 15,\n flexBasis: (ROW_HEIGHT - 1) * (Math.max(schedules.length, 1) + 1),\n overflow: 'hidden',\n }}\n >\n <SchedulesTable\n schedules={schedules}\n filter={filter}\n statuses={statuses}\n allowCompleted={true}\n onSelect={onEdit}\n onAction={onAction}\n style={{ backgroundColor: 'white' }}\n />\n </View>\n\n <View\n style={{\n flexDirection: 'row',\n justifyContent: 'space-between',\n margin: '20px 0',\n flexShrink: 0,\n }}\n >\n <Button onClick={onDiscover}>Find schedules</Button>\n <Button type=\"primary\" onClick={onAdd}>\n Add new schedule\n </Button>\n </View>\n </Page>\n );\n}\n","import React, { useEffect, useReducer } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useParams, useNavigate } from 'react-router-dom';\n\nimport { pushModal } from 'loot-core/src/client/actions/modals';\nimport { useCachedPayees } from 'loot-core/src/client/data-hooks/payees';\nimport q, { runQuery, liveQuery } from 'loot-core/src/client/query-helpers';\nimport { send, sendCatch } from 'loot-core/src/platform/client/fetch';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport { extractScheduleConds } from 'loot-core/src/shared/schedules';\n\nimport useSelected, { SelectedProvider } from '../../hooks/useSelected';\nimport { colors } from '../../style';\nimport AccountAutocomplete from '../autocomplete/AccountAutocomplete';\nimport PayeeAutocomplete from '../autocomplete/PayeeAutocomplete';\nimport Button from '../common/Button';\nimport Stack from '../common/Stack';\nimport Text from '../common/Text';\nimport View from '../common/View';\nimport { FormField, FormLabel, Checkbox } from '../forms';\nimport { OpSelect } from '../modals/EditRule';\nimport { Page } from '../Page';\nimport DateSelect from '../select/DateSelect';\nimport RecurringSchedulePicker from '../select/RecurringSchedulePicker';\nimport { SelectedItemsButton } from '../table';\nimport SimpleTransactionsTable from '../transactions/SimpleTransactionsTable';\nimport { AmountInput, BetweenAmountInput } from '../util/AmountInput';\nimport GenericInput from '../util/GenericInput';\n\nfunction mergeFields(defaults, initial) {\n let res = { ...defaults };\n if (initial) {\n // Only merge in fields from `initial` that exist in `defaults`\n Object.keys(initial).forEach(key => {\n if (key in defaults) {\n res[key] = initial[key];\n }\n });\n }\n return res;\n}\n\nfunction updateScheduleConditions(schedule, fields) {\n let conds = extractScheduleConds(schedule._conditions);\n\n let updateCond = (cond, op, field, value) => {\n if (cond) {\n return { ...cond, value };\n }\n\n if (value != null) {\n return { op, field, value };\n }\n\n return null;\n };\n\n // Validate\n if (fields.date == null) {\n return { error: 'Date is required' };\n }\n\n if (fields.amount == null) {\n return { error: 'A valid amount is required' };\n }\n\n return {\n conditions: [\n updateCond(conds.payee, 'is', 'payee', fields.payee),\n updateCond(conds.account, 'is', 'account', fields.account),\n updateCond(conds.date, 'isapprox', 'date', fields.date),\n // We don't use `updateCond` for amount because we want to\n // overwrite it completely\n {\n op: fields.amountOp,\n field: 'amount',\n value: fields.amount,\n },\n ].filter(Boolean),\n };\n}\n\nexport default function ScheduleDetails() {\n let { id, initialFields } = useParams();\n let adding = id == null;\n let payees = useCachedPayees({ idKey: true });\n let navigate = useNavigate();\n let globalDispatch = useDispatch();\n let dateFormat = useSelector(state => {\n return state.prefs.local.dateFormat || 'MM/dd/yyyy';\n });\n\n let [state, dispatch] = useReducer(\n (state, action) => {\n switch (action.type) {\n case 'set-schedule': {\n let schedule = action.schedule;\n\n // See if there are custom rules\n let conds = extractScheduleConds(schedule._conditions);\n let condsSet = new Set(Object.values(conds));\n let isCustom =\n schedule._conditions.find(c => !condsSet.has(c)) ||\n schedule._actions.find(a => a.op !== 'link-schedule');\n\n return {\n ...state,\n schedule: action.schedule,\n isCustom,\n fields: {\n payee: schedule._payee,\n account: schedule._account,\n amount: schedule._amount || 0,\n amountOp: schedule._amountOp || 'isapprox',\n date: schedule._date,\n posts_transaction: action.schedule.posts_transaction,\n name: schedule.name,\n },\n };\n }\n case 'set-field':\n if (!(action.field in state.fields)) {\n throw new Error('Unknown field: ' + action.field);\n }\n\n let fields = { [action.field]: action.value };\n\n // If we are changing the amount operator either to or\n // away from the `isbetween` operator, the amount value is\n // different and we need to convert it\n if (\n action.field === 'amountOp' &&\n action.value !== state.fields.amountOp\n ) {\n if (action.value === 'isbetween') {\n // We need a range if switching to `isbetween`. The\n // amount field should be a number since we are\n // switching away from the other ops, but check just in\n // case\n fields.amount =\n typeof state.fields.amount === 'number'\n ? { num1: state.fields.amount, num2: state.fields.amount }\n : { num1: 0, num2: 0 };\n } else if (state.fields.amountOp === 'isbetween') {\n // We need just a number if switching away from\n // `isbetween`. The amount field should be a range, but\n // also check just in case. We grab just the first\n // number and use it\n fields.amount =\n typeof state.fields.amount === 'number'\n ? state.fields.amount\n : state.fields.amount.num1;\n }\n }\n\n return {\n ...state,\n fields: { ...state.fields, ...fields },\n };\n case 'set-transactions':\n return { ...state, transactions: action.transactions };\n case 'set-repeats':\n return {\n ...state,\n fields: {\n ...state.fields,\n date: action.repeats\n ? {\n frequency: 'monthly',\n start: monthUtils.currentDay(),\n patterns: [],\n }\n : monthUtils.currentDay(),\n },\n };\n case 'set-upcoming-dates':\n return {\n ...state,\n upcomingDates: action.dates,\n };\n\n case 'form-error':\n return { ...state, error: action.error };\n\n case 'switch-transactions':\n return { ...state, transactionsMode: action.mode };\n\n default:\n throw new Error('Unknown action: ' + action.type);\n }\n },\n {\n schedule: null,\n upcomingDates: null,\n error: null,\n fields: mergeFields(\n {\n payee: null,\n account: null,\n amount: null,\n amountOp: null,\n date: null,\n posts_transaction: false,\n name: null,\n },\n initialFields,\n ),\n transactions: [],\n transactionsMode: adding ? 'matched' : 'linked',\n },\n );\n\n async function loadSchedule() {\n let { data } = await runQuery(q('schedules').filter({ id }).select('*'));\n return data[0];\n }\n\n useEffect(() => {\n async function run() {\n if (adding) {\n let date = {\n start: monthUtils.currentDay(),\n frequency: 'monthly',\n patterns: [],\n };\n let schedule = {\n posts_transaction: false,\n _date: date,\n _conditions: [{ op: 'isapprox', field: 'date', value: date }],\n _actions: [],\n };\n\n dispatch({ type: 'set-schedule', schedule });\n } else {\n let schedule = await loadSchedule();\n\n if (schedule && state.schedule == null) {\n dispatch({ type: 'set-schedule', schedule });\n }\n }\n }\n run();\n }, []);\n\n useEffect(() => {\n async function run() {\n let date = state.fields.date;\n\n if (date == null) {\n dispatch({ type: 'set-upcoming-dates', dates: null });\n } else {\n if (date.frequency) {\n let { data } = await sendCatch('schedule/get-upcoming-dates', {\n config: date,\n count: 3,\n });\n dispatch({ type: 'set-upcoming-dates', dates: data });\n } else {\n let today = monthUtils.currentDay();\n if (date === today || monthUtils.isAfter(date, today)) {\n dispatch({ type: 'set-upcoming-dates', dates: [date] });\n } else {\n dispatch({ type: 'set-upcoming-dates', dates: null });\n }\n }\n }\n }\n run();\n }, [state.fields.date]);\n\n useEffect(() => {\n if (\n state.schedule &&\n state.schedule.id &&\n state.transactionsMode === 'linked'\n ) {\n let live = liveQuery(\n q('transactions')\n .filter({ schedule: state.schedule.id })\n .select('*')\n .options({ splits: 'none' }),\n data => dispatch({ type: 'set-transactions', transactions: data }),\n );\n return live.unsubscribe;\n }\n }, [state.schedule, state.transactionsMode]);\n\n useEffect(() => {\n let current = true;\n let unsubscribe;\n\n if (state.schedule && state.transactionsMode === 'matched') {\n let { error, conditions } = updateScheduleConditions(\n state.schedule,\n state.fields,\n );\n\n if (error) {\n dispatch({ type: 'form-error', error });\n return;\n }\n\n // *Extremely* gross hack because the rules are not mapped to\n // public names automatically. We really should be doing that\n // at the database layer\n conditions = conditions.map(cond => {\n if (cond.field === 'description') {\n return { ...cond, field: 'payee' };\n } else if (cond.field === 'acct') {\n return { ...cond, field: 'account' };\n }\n return cond;\n });\n\n send('make-filters-from-conditions', {\n conditions: conditions,\n }).then(({ filters }) => {\n if (current) {\n let live = liveQuery(\n q('transactions')\n .filter({ $and: filters })\n .select('*')\n .options({ splits: 'none' }),\n data => dispatch({ type: 'set-transactions', transactions: data }),\n );\n unsubscribe = live.unsubscribe;\n }\n });\n }\n\n return () => {\n current = false;\n if (unsubscribe) {\n unsubscribe();\n }\n };\n }, [state.schedule, state.transactionsMode, state.fields]);\n\n let selectedInst = useSelected('transactions', state.transactions, []);\n\n async function onSave() {\n dispatch({ type: 'form-error', error: null });\n if (state.fields.name) {\n let { data: sameName } = await runQuery(\n q('schedules').filter({ name: state.fields.name }).select('id'),\n );\n if (sameName.length > 0 && sameName[0].id !== state.schedule.id) {\n dispatch({\n type: 'form-error',\n error: 'There is already a schedule with this name',\n });\n return;\n }\n }\n\n let { error, conditions } = updateScheduleConditions(\n state.schedule,\n state.fields,\n );\n\n if (error) {\n dispatch({ type: 'form-error', error });\n return;\n }\n\n let res = await sendCatch(adding ? 'schedule/create' : 'schedule/update', {\n schedule: {\n id: state.schedule.id,\n posts_transaction: state.fields.posts_transaction,\n name: state.fields.name,\n },\n conditions,\n });\n\n if (res.error) {\n dispatch({\n type: 'form-error',\n error:\n 'An error occurred while saving. Please visit https://actualbudget.org/contact/ for support.',\n });\n } else {\n if (adding) {\n await onLinkTransactions([...selectedInst.items], res.data);\n }\n navigate(-1);\n }\n }\n\n async function onEditRule(ruleId) {\n let rule = await send('rule-get', { id: ruleId || state.schedule.rule });\n\n globalDispatch(\n pushModal('edit-rule', {\n rule,\n onSave: async () => {\n let schedule = await loadSchedule();\n dispatch({ type: 'set-schedule', schedule });\n },\n }),\n );\n }\n\n async function onLinkTransactions(ids, scheduleId) {\n await send('transactions-batch-update', {\n updated: ids.map(id => ({\n id,\n schedule: scheduleId || state.schedule.id,\n })),\n });\n selectedInst.dispatch({ type: 'select-none' });\n }\n\n async function onUnlinkTransactions(ids) {\n await send('transactions-batch-update', {\n updated: ids.map(id => ({ id, schedule: null })),\n });\n selectedInst.dispatch({ type: 'select-none' });\n }\n\n if (state.schedule == null) {\n return null;\n }\n\n function onSwitchTransactions(mode) {\n dispatch({ type: 'switch-transactions', mode });\n selectedInst.dispatch({ type: 'select-none' });\n }\n\n let payee = payees ? payees[state.fields.payee] : null;\n\n // This is derived from the date\n let repeats = state.fields.date ? !!state.fields.date.frequency : false;\n\n return (\n <Page\n title={payee ? `Schedule: ${payee.name}` : 'Schedule'}\n modalSize=\"medium\"\n >\n <Stack direction=\"row\" style={{ marginTop: 10 }}>\n <FormField style={{ flex: 1 }}>\n <FormLabel title=\"Schedule Name\" htmlFor=\"name-field\" />\n <GenericInput\n field=\"string\"\n type=\"string\"\n value={state.fields.name}\n multi={false}\n onChange={e => {\n dispatch({ type: 'set-field', field: 'name', value: e });\n }}\n />\n </FormField>\n </Stack>\n <Stack direction=\"row\" style={{ marginTop: 20 }}>\n <FormField style={{ flex: 1 }}>\n <FormLabel title=\"Payee\" id=\"payee-label\" htmlFor=\"payee-field\" />\n <PayeeAutocomplete\n value={state.fields.payee}\n labelProps={{ id: 'payee-label' }}\n inputProps={{ id: 'payee-field', placeholder: '(none)' }}\n onSelect={id =>\n dispatch({ type: 'set-field', field: 'payee', value: id })\n }\n isCreatable\n />\n </FormField>\n\n <FormField style={{ flex: 1 }}>\n <FormLabel\n title=\"Account\"\n id=\"account-label\"\n htmlFor=\"account-field\"\n />\n <AccountAutocomplete\n includeClosedAccounts={false}\n value={state.fields.account}\n labelProps={{ id: 'account-label' }}\n inputProps={{ id: 'account-field', placeholder: '(none)' }}\n onSelect={id =>\n dispatch({ type: 'set-field', field: 'account', value: id })\n }\n />\n </FormField>\n\n <FormField style={{ flex: 1 }}>\n <Stack direction=\"row\" align=\"center\" style={{ marginBottom: 3 }}>\n <FormLabel\n title=\"Amount\"\n htmlFor=\"amount-field\"\n style={{ margin: 0, flex: 1 }}\n />\n <OpSelect\n ops={['isapprox', 'is', 'isbetween']}\n value={state.fields.amountOp}\n formatOp={op => {\n switch (op) {\n case 'is':\n return 'is exactly';\n case 'isapprox':\n return 'is approximately';\n case 'isbetween':\n return 'is between';\n default:\n throw new Error('Invalid op for select: ' + op);\n }\n }}\n style={{\n padding: '0 10px',\n color: colors.n5,\n fontSize: 12,\n }}\n onChange={(_, op) =>\n dispatch({ type: 'set-field', field: 'amountOp', value: op })\n }\n />\n </Stack>\n {state.fields.amountOp === 'isbetween' ? (\n <BetweenAmountInput\n defaultValue={state.fields.amount}\n onChange={value =>\n dispatch({\n type: 'set-field',\n field: 'amount',\n value,\n })\n }\n />\n ) : (\n <AmountInput\n id=\"amount-field\"\n defaultValue={state.fields.amount}\n onChange={value =>\n dispatch({\n type: 'set-field',\n field: 'amount',\n value,\n })\n }\n />\n )}\n </FormField>\n </Stack>\n\n <View style={{ marginTop: 20 }}>\n <FormLabel title=\"Date\" />\n </View>\n\n <Stack direction=\"row\" align=\"flex-start\">\n <View style={{ flex: 1 }}>\n {repeats ? (\n <RecurringSchedulePicker\n value={state.fields.date}\n onChange={value =>\n dispatch({ type: 'set-field', field: 'date', value })\n }\n />\n ) : (\n <DateSelect\n value={state.fields.date}\n onSelect={date =>\n dispatch({ type: 'set-field', field: 'date', value: date })\n }\n dateFormat={dateFormat}\n />\n )}\n\n {state.upcomingDates && (\n <View style={{ fontSize: 13, marginTop: 20 }}>\n <Text style={{ color: colors.n4, fontWeight: 600 }}>\n Upcoming dates\n </Text>\n <Stack\n direction=\"column\"\n spacing={1}\n style={{ marginTop: 10, color: colors.n4 }}\n >\n {state.upcomingDates.map(date => (\n <View key={date}>\n {monthUtils.format(date, `${dateFormat} EEEE`)}\n </View>\n ))}\n </Stack>\n </View>\n )}\n </View>\n\n <View\n style={{\n marginTop: 5,\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center',\n userSelect: 'none',\n }}\n >\n <Checkbox\n id=\"form_repeats\"\n checked={repeats}\n onChange={e => {\n dispatch({ type: 'set-repeats', repeats: e.target.checked });\n }}\n />\n <label htmlFor=\"form_repeats\" style={{ userSelect: 'none' }}>\n Repeats\n </label>\n </View>\n\n <View\n style={{\n alignItems: 'flex-end',\n flex: 1,\n }}\n >\n <View\n style={{\n marginTop: 5,\n flexDirection: 'row',\n alignItems: 'center',\n userSelect: 'none',\n justifyContent: 'flex-end',\n }}\n >\n <Checkbox\n id=\"form_posts_transaction\"\n checked={state.fields.posts_transaction}\n onChange={e => {\n dispatch({\n type: 'set-field',\n field: 'posts_transaction',\n value: e.target.checked,\n });\n }}\n />\n <label\n htmlFor=\"form_posts_transaction\"\n style={{ userSelect: 'none' }}\n >\n Automatically add transaction\n </label>\n </View>\n\n <Text\n style={{\n width: 350,\n textAlign: 'right',\n color: colors.n4,\n marginTop: 10,\n fontSize: 13,\n lineHeight: '1.4em',\n }}\n >\n If checked, the schedule will automatically create transactions for\n you in the specified account\n </Text>\n\n {!adding && state.schedule.rule && (\n <Stack direction=\"row\" align=\"center\" style={{ marginTop: 30 }}>\n {state.isCustom && (\n <Text\n style={{\n color: colors.b5,\n fontSize: 13,\n textAlign: 'right',\n width: 350,\n }}\n >\n This schedule has custom conditions and actions\n </Text>\n )}\n <Button onClick={() => onEditRule()} disabled={adding}>\n Edit as rule\n </Button>\n </Stack>\n )}\n </View>\n </Stack>\n\n <View style={{ marginTop: 30, flex: 1 }}>\n <SelectedProvider instance={selectedInst}>\n {adding ? (\n <View style={{ flexDirection: 'row', padding: '5px 0' }}>\n <Text style={{ color: colors.n4 }}>\n These transactions match this schedule:\n </Text>\n <View style={{ flex: 1 }} />\n <Text style={{ color: colors.n6 }}>\n Select transactions to link on save\n </Text>\n </View>\n ) : (\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n <Button\n type=\"bare\"\n style={{\n color:\n state.transactionsMode === 'linked' ? colors.b4 : colors.n7,\n marginRight: 10,\n fontSize: 14,\n }}\n onClick={() => onSwitchTransactions('linked')}\n >\n Linked transactions\n </Button>{' '}\n <Button\n type=\"bare\"\n style={{\n color:\n state.transactionsMode === 'matched'\n ? colors.b4\n : colors.n7,\n fontSize: 14,\n }}\n onClick={() => onSwitchTransactions('matched')}\n >\n Find matching transactions\n </Button>\n <View style={{ flex: 1 }} />\n <SelectedItemsButton\n name=\"transactions\"\n items={\n state.transactionsMode === 'linked'\n ? [{ name: 'unlink', text: 'Unlink from schedule' }]\n : [{ name: 'link', text: 'Link to schedule' }]\n }\n onSelect={(name, ids) => {\n switch (name) {\n case 'link':\n onLinkTransactions(ids);\n break;\n case 'unlink':\n onUnlinkTransactions(ids);\n break;\n default:\n }\n }}\n />\n </View>\n )}\n\n <SimpleTransactionsTable\n renderEmpty={\n state.transactionsMode === 'matched' &&\n (() => (\n <View\n style={{ padding: 20, color: colors.n4, textAlign: 'center' }}\n >\n {state.error ? (\n <Text style={{ color: colors.r4 }}>\n Could not search: {state.error}\n </Text>\n ) : (\n 'No transactions found'\n )}\n </View>\n ))\n }\n transactions={state.transactions}\n fields={['date', 'payee', 'amount']}\n style={{\n border: '1px solid ' + colors.border,\n borderRadius: 4,\n overflow: 'hidden',\n marginTop: 5,\n }}\n />\n </SelectedProvider>\n </View>\n\n <Stack\n direction=\"row\"\n justify=\"flex-end\"\n align=\"center\"\n style={{ marginTop: 20 }}\n >\n {state.error && <Text style={{ color: colors.r4 }}>{state.error}</Text>}\n <Button style={{ marginRight: 10 }} onClick={() => navigate(-1)}>\n Cancel\n </Button>\n <Button type=\"primary\" onClick={onSave}>\n {adding ? 'Add' : 'Save'}\n </Button>\n </Stack>\n </Page>\n );\n}\n","import React, { useCallback, useState } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\n\nimport { useSchedules } from 'loot-core/src/client/data-hooks/schedules';\nimport { send } from 'loot-core/src/platform/client/fetch';\n\nimport Search from '../common/Search';\nimport Text from '../common/Text';\nimport View from '../common/View';\nimport { Page } from '../Page';\n\nimport { SchedulesTable } from './SchedulesTable';\n\nexport default function ScheduleLink() {\n let location = useLocation();\n let navigate = useNavigate();\n let scheduleData = useSchedules(\n useCallback(query => query.filter({ completed: false }), []),\n );\n\n let [filter, setFilter] = useState('');\n\n if (scheduleData == null) {\n return null;\n }\n\n let { schedules, statuses } = scheduleData;\n\n async function onSelect(scheduleId) {\n let { state } = location;\n let ids = state.transactionIds;\n if (ids && ids.length > 0) {\n await send('transactions-batch-update', {\n updated: ids.map(id => ({ id, schedule: scheduleId })),\n });\n }\n navigate(-1);\n }\n\n return (\n <Page title=\"Link Schedule\" modalSize=\"medium\">\n <View\n style={{ flexDirection: 'row', marginBottom: 20, alignItems: 'center' }}\n >\n <Text>Choose a schedule to link these transactions to:</Text>\n <View style={{ flex: 1 }} />\n <Search\n isInModal\n width={300}\n placeholder=\"Filter schedules…\"\n value={filter}\n onChange={setFilter}\n />\n </View>\n\n <SchedulesTable\n schedules={schedules}\n filter={filter}\n statuses={statuses}\n minimal={true}\n onSelect={onSelect}\n tableStyle={{ marginInline: -20 }}\n />\n </Page>\n );\n}\n","import React, { useState } from 'react';\nimport { Navigate, useLocation, useNavigate } from 'react-router-dom';\n\nimport q, { runQuery } from 'loot-core/src/client/query-helpers';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport { getRecurringDescription } from 'loot-core/src/shared/schedules';\n\nimport useSelected, {\n useSelectedDispatch,\n useSelectedItems,\n SelectedProvider,\n} from '../../hooks/useSelected';\nimport useSendPlatformRequest from '../../hooks/useSendPlatformRequest';\nimport { colors } from '../../style';\nimport { getParent } from '../../util/router-tools';\nimport { ButtonWithLoading } from '../common/Button';\nimport Paragraph from '../common/Paragraph';\nimport Stack from '../common/Stack';\nimport View from '../common/View';\nimport { Page, usePageType } from '../Page';\nimport { Table, TableHeader, Row, Field, SelectCell } from '../table';\nimport DisplayId from '../util/DisplayId';\n\nimport { ScheduleAmountCell } from './SchedulesTable';\n\nlet ROW_HEIGHT = 43;\n\nfunction DiscoverSchedulesTable({ schedules, loading }) {\n let pageType = usePageType();\n let selectedItems = useSelectedItems();\n let dispatchSelected = useSelectedDispatch();\n\n function renderItem({ item }) {\n let selected = selectedItems.has(item.id);\n let amountOp = item._conditions.find(c => c.field === 'amount').op;\n let recurDescription = getRecurringDescription(item.date);\n\n return (\n <Row\n height={ROW_HEIGHT}\n inset={15}\n backgroundColor=\"transparent\"\n onClick={e => {\n dispatchSelected({ type: 'select', id: item.id, event: e });\n }}\n borderColor={selected ? colors.b8 : colors.border}\n style={{\n cursor: 'pointer',\n backgroundColor: selected ? colors.selected : 'white',\n ':hover': {\n backgroundColor: selected ? colors.selected : colors.hover,\n },\n }}\n >\n <SelectCell\n exposed={true}\n focused={false}\n selected={selected}\n onSelect={e => {\n dispatchSelected({ type: 'select', id: item.id, event: e });\n }}\n />\n <Field width=\"flex\">\n <DisplayId type=\"payees\" id={item.payee} />\n </Field>\n <Field width=\"flex\">\n <DisplayId type=\"accounts\" id={item.account} />\n </Field>\n <Field width=\"auto\" title={recurDescription} style={{ flex: 1.5 }}>\n {recurDescription}\n </Field>\n <ScheduleAmountCell amount={item.amount} op={amountOp} />\n </Row>\n );\n }\n\n return (\n <View style={{ flex: 1 }}>\n <TableHeader height={ROW_HEIGHT} inset={15} version=\"v2\">\n <SelectCell\n exposed={!loading}\n focused={false}\n selected={selectedItems.size > 0}\n onSelect={e => dispatchSelected({ type: 'select-all', event: e })}\n />\n <Field width=\"flex\">Payee</Field>\n <Field width=\"flex\">Account</Field>\n <Field width=\"auto\" style={{ flex: 1.5 }}>\n When\n </Field>\n <Field width={100} style={{ textAlign: 'right' }}>\n Amount\n </Field>\n </TableHeader>\n <Table\n rowHeight={ROW_HEIGHT}\n version=\"v2\"\n backgroundColor={pageType.type === 'modal' ? 'transparent' : undefined}\n style={{\n flex: 1,\n backgroundColor:\n pageType.type === 'modal' ? 'transparent' : undefined,\n }}\n items={schedules}\n loading={loading}\n isSelected={id => selectedItems.has(id)}\n renderItem={renderItem}\n renderEmpty=\"No schedules found\"\n />\n </View>\n );\n}\n\nexport default function DiscoverSchedules() {\n let pageType = usePageType();\n let navigate = useNavigate();\n let { data: schedules, isLoading } =\n useSendPlatformRequest('schedule/discover');\n if (!schedules) schedules = [];\n\n let [creating, setCreating] = useState(false);\n\n let selectedInst = useSelected('discover-schedules', schedules, []);\n\n let location = useLocation();\n if (!getParent(location)) {\n return <Navigate to=\"/schedules\" replace />;\n }\n\n async function onCreate() {\n let selected = schedules.filter(s => selectedInst.items.has(s.id));\n setCreating(true);\n\n for (let schedule of selected) {\n let scheduleId = await send('schedule/create', {\n conditions: schedule._conditions,\n });\n\n // Now query for matching transactions and link them automatically\n let { filters } = await send('make-filters-from-conditions', {\n conditions: schedule._conditions,\n });\n\n if (filters.length > 0) {\n let { data: transactions } = await runQuery(\n q('transactions').filter({ $and: filters }).select('id'),\n );\n await send('transactions-batch-update', {\n updated: transactions.map(t => ({\n id: t.id,\n schedule: scheduleId,\n })),\n });\n }\n }\n\n setCreating(false);\n navigate(-1);\n }\n\n return (\n <Page title=\"Found schedules\" modalSize={{ width: 850, height: 650 }}>\n <Paragraph>\n We found some possible schedules in your current transactions. Select\n the ones you want to create.\n </Paragraph>\n <Paragraph>\n If you expected a schedule here and don’t see it, it might be because\n the payees of the transactions don’t match. Make sure you rename payees\n on all transactions for a schedule to be the same payee.\n </Paragraph>\n\n <SelectedProvider instance={selectedInst}>\n <DiscoverSchedulesTable loading={isLoading} schedules={schedules} />\n </SelectedProvider>\n\n <Stack\n direction=\"row\"\n align=\"center\"\n justify=\"flex-end\"\n style={{\n paddingTop: 20,\n paddingBottom: pageType.type === 'modal' ? 0 : 20,\n }}\n >\n <ButtonWithLoading\n type=\"primary\"\n loading={creating}\n disabled={selectedInst.items.size === 0}\n onClick={onCreate}\n >\n Create schedules\n </ButtonWithLoading>\n </Stack>\n </Page>\n );\n}\n","import { useEffect, useState } from 'react';\n\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport type { Handlers } from 'loot-core/src/types/handlers';\n\nexport default function useSendPlatformRequest<K extends keyof Handlers>(\n name: K,\n args?: Parameters<Handlers[K]>[0],\n options?: { catchErrors?: boolean },\n) {\n const [data, setData] = useState<unknown>(null);\n const [isLoading, setIsLoading] = useState<boolean | null>(null);\n\n useEffect(() => {\n async function run() {\n setIsLoading(true);\n setData(await send(name, args, options));\n setIsLoading(false);\n }\n\n run();\n }, [name, args, options]);\n\n return {\n data,\n isLoading,\n };\n}\n","import React from 'react';\n\nimport Modal from '../common/Modal';\nimport Paragraph from '../common/Paragraph';\nimport View from '../common/View';\n\nexport default function GoCardlessLink() {\n window.close();\n\n return (\n <Modal isCurrent={true} showClose={false} title=\"Account sync\">\n {() => (\n <View style={{ maxWidth: 500 }}>\n <Paragraph>Please wait...</Paragraph>\n <Paragraph>\n The window should close automatically. If nothing happend you can\n close this window or tab.\n </Paragraph>\n </View>\n )}\n </Modal>\n );\n}\n","import * as React from 'react';\nconst SvgLeftArrow2 = props => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 91 51\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n fill=\"currentColor\"\n d=\"M30.256 48.614a3.14 3.14 0 0 0-.989-2.153L10.803 29.063h76.915a3.2 3.2 0 0 0 .315 0c1.584-.084 2.95-1.64 2.867-3.266-.082-1.625-1.598-3.028-3.182-2.943H10.803L29.267 5.49c1.284-1.099 1.456-3.057.385-4.373a2.972 2.972 0 0 0-4.48-.187L.971 23.695a3.163 3.163 0 0 0 0 4.56l24.2 22.766a2.98 2.98 0 0 0 2.205.84c1.669-.08 2.958-1.534 2.88-3.247Z\"\n />\n </svg>\n);\nexport default SvgLeftArrow2;\n","import * as React from 'react';\nconst SvgArrowDown = props => (\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=\"m9 16.172-6.071-6.071-1.414 1.414L10 20l.707-.707 7.778-7.778-1.414-1.414L11 16.172V0H9z\"\n fill=\"currentColor\"\n />\n </svg>\n);\nexport default SvgArrowDown;\n","import * as React from 'react';\nconst SvgArrowUp = props => (\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=\"M9 3.828 2.929 9.899 1.515 8.485 10 0l.707.707 7.778 7.778-1.414 1.414L11 3.828V20H9V3.828z\"\n fill=\"currentColor\"\n />\n </svg>\n);\nexport default SvgArrowUp;\n","import * as React from 'react';\nconst SvgHyperlink2 = props => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n d=\"M12.406 14.905a1 1 0 0 0-.543 1.307 1 1 0 0 1-.217 1.09l-2.828 2.829a2 2 0 0 1-2.828 0L3.868 18.01a2 2 0 0 1 0-2.829L6.7 12.353a1.013 1.013 0 0 1 1.091-.217 1 1 0 0 0 .763-1.849 3.034 3.034 0 0 0-3.268.652l-2.832 2.828a4.006 4.006 0 0 0 0 5.657l2.122 2.121a4 4 0 0 0 5.656 0l2.829-2.828a3.008 3.008 0 0 0 .651-3.27 1 1 0 0 0-1.306-.542Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M7.757 16.241a1.011 1.011 0 0 0 1.414 0l7.779-7.778a1 1 0 0 0-1.414-1.414l-7.779 7.778a1 1 0 0 0 0 1.414Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"m21.546 4.574-2.121-2.121a4.006 4.006 0 0 0-5.657 0l-2.829 2.828a3.006 3.006 0 0 0-.651 3.269 1 1 0 1 0 1.849-.764 1 1 0 0 1 .217-1.086l2.828-2.828a2 2 0 0 1 2.829 0l2.121 2.121a2 2 0 0 1 0 2.829L17.3 11.645a1.015 1.015 0 0 1-1.091.217 1 1 0 0 0-.765 1.849 3.026 3.026 0 0 0 3.27-.651l2.828-2.828a4.007 4.007 0 0 0 .004-5.658Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\nexport default SvgHyperlink2;\n","import React, {\n createContext,\n createElement,\n createRef,\n forwardRef,\n memo,\n useState,\n useRef,\n useMemo,\n useCallback,\n useLayoutEffect,\n useEffect,\n useContext,\n useReducer,\n} from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\n\nimport {\n format as formatDate,\n parseISO,\n isValid as isDateValid,\n} from 'date-fns';\n\nimport { useCachedSchedules } from 'loot-core/src/client/data-hooks/schedules';\nimport {\n getAccountsById,\n getPayeesById,\n getCategoriesById,\n} from 'loot-core/src/client/reducers/queries';\nimport evalArithmetic from 'loot-core/src/shared/arithmetic';\nimport { currentDay } from 'loot-core/src/shared/months';\nimport { getScheduledAmount } from 'loot-core/src/shared/schedules';\nimport {\n splitTransaction,\n updateTransaction,\n deleteTransaction,\n addSplitTransaction,\n} from 'loot-core/src/shared/transactions';\nimport {\n integerToCurrency,\n amountToInteger,\n titleFirst,\n} from 'loot-core/src/shared/util';\n\nimport { useMergedRefs } from '../../hooks/useMergedRefs';\nimport usePrevious from '../../hooks/usePrevious';\nimport { useSelectedDispatch, useSelectedItems } from '../../hooks/useSelected';\nimport LeftArrow2 from '../../icons/v0/LeftArrow2';\nimport RightArrow2 from '../../icons/v0/RightArrow2';\nimport ArrowDown from '../../icons/v1/ArrowDown';\nimport ArrowUp from '../../icons/v1/ArrowUp';\nimport CheveronDown from '../../icons/v1/CheveronDown';\nimport ArrowsSynchronize from '../../icons/v2/ArrowsSynchronize';\nimport CalendarIcon from '../../icons/v2/Calendar';\nimport Hyperlink2 from '../../icons/v2/Hyperlink2';\nimport { styles, colors } from '../../style';\nimport AccountAutocomplete from '../autocomplete/AccountAutocomplete';\nimport CategoryAutocomplete from '../autocomplete/CategorySelect';\nimport PayeeAutocomplete from '../autocomplete/PayeeAutocomplete';\nimport Button from '../common/Button';\nimport Text from '../common/Text';\nimport View from '../common/View';\nimport { getStatusProps } from '../schedules/StatusBadge';\nimport DateSelect from '../select/DateSelect';\nimport {\n Cell,\n Field,\n Row,\n InputCell,\n SelectCell,\n DeleteCell,\n CustomCell,\n CellButton,\n useTableNavigator,\n Table,\n UnexposedCellContent,\n} from '../table';\nimport { Tooltip } from '../tooltips';\n\nfunction getDisplayValue(obj, name) {\n return obj ? obj[name] : '';\n}\n\nfunction serializeTransaction(transaction, showZeroInDeposit) {\n let { amount, date } = transaction;\n\n if (isPreviewId(transaction.id)) {\n amount = (transaction._inverse ? -1 : 1) * getScheduledAmount(amount);\n }\n\n let debit = amount < 0 ? -amount : null;\n let credit = amount > 0 ? amount : null;\n\n if (amount === 0) {\n if (showZeroInDeposit) {\n credit = 0;\n } else {\n debit = 0;\n }\n }\n\n // Validate the date format\n if (!isDateValid(parseISO(date))) {\n // Be a little forgiving if the date isn't valid. This at least\n // stops the UI from crashing, but this is a serious problem with\n // the data. This allows the user to go through and see empty\n // dates and manually fix them.\n date = null;\n }\n\n return {\n ...transaction,\n date,\n debit: debit != null ? integerToCurrency(debit) : '',\n credit: credit != null ? integerToCurrency(credit) : '',\n };\n}\n\nfunction deserializeTransaction(transaction, originalTransaction) {\n let { debit, credit, date, ...realTransaction } = transaction;\n\n let amount;\n if (debit !== '') {\n let parsed = evalArithmetic(debit, null);\n amount = parsed != null ? -parsed : null;\n } else {\n amount = evalArithmetic(credit, null);\n }\n\n amount =\n amount != null ? amountToInteger(amount) : originalTransaction.amount;\n\n if (date == null) {\n date = originalTransaction.date || currentDay();\n }\n\n return { ...realTransaction, date, amount };\n}\n\nfunction isLastChild(transactions, index) {\n let trans = transactions[index];\n return (\n trans &&\n trans.is_child &&\n (transactions[index + 1] == null ||\n transactions[index + 1].parent_id !== trans.parent_id)\n );\n}\n\nlet SplitsExpandedContext = createContext(null);\n\nexport function useSplitsExpanded() {\n let data = useContext(SplitsExpandedContext);\n\n return useMemo(\n () => ({\n ...data,\n expanded: id =>\n data.state.mode === 'collapse'\n ? !data.state.ids.has(id)\n : data.state.ids.has(id),\n }),\n [data],\n );\n}\n\nexport function SplitsExpandedProvider({ children, initialMode = 'expand' }) {\n let cachedState = useSelector(state => state.app.lastSplitState);\n let reduxDispatch = useDispatch();\n\n let [state, dispatch] = useReducer((state, action) => {\n switch (action.type) {\n case 'toggle-split': {\n let ids = new Set([...state.ids]);\n let { id } = action;\n if (ids.has(id)) {\n ids.delete(id);\n } else {\n ids.add(id);\n }\n return { ...state, ids };\n }\n case 'open-split': {\n let ids = new Set([...state.ids]);\n let { id } = action;\n if (state.mode === 'collapse') {\n ids.delete(id);\n } else {\n ids.add(id);\n }\n return { ...state, ids };\n }\n case 'set-mode': {\n return {\n ...state,\n mode: action.mode,\n ids: new Set(),\n transitionId: null,\n };\n }\n case 'switch-mode':\n if (state.transitionId != null) {\n // You can only transition once at a time\n return state;\n }\n\n return {\n ...state,\n mode: state.mode === 'expand' ? 'collapse' : 'expand',\n transitionId: action.id,\n ids: new Set(),\n };\n case 'finish-switch-mode':\n return { ...state, transitionId: null };\n default:\n throw new Error('Unknown action type: ' + action.type);\n }\n }, cachedState.current || { ids: new Set(), mode: initialMode });\n\n useEffect(() => {\n if (state.transitionId != null) {\n // This timeout allows animations to finish\n setTimeout(() => {\n dispatch({ type: 'finish-switch-mode' });\n }, 250);\n }\n }, [state.transitionId]);\n\n useEffect(() => {\n // In a finished state, cache the state\n if (state.transitionId == null) {\n reduxDispatch({ type: 'SET_LAST_SPLIT_STATE', splitState: state });\n }\n }, [state]);\n\n let value = useMemo(() => ({ state, dispatch }), [state, dispatch]);\n\n return (\n <SplitsExpandedContext.Provider value={value}>\n {children}\n </SplitsExpandedContext.Provider>\n );\n}\n\nfunction selectAscDesc(field, ascDesc, clicked, defaultAscDesc = 'asc') {\n return field === clicked\n ? ascDesc === 'asc'\n ? 'desc'\n : 'asc'\n : defaultAscDesc;\n}\n\nconst TransactionHeader = memo(\n ({\n hasSelected,\n showAccount,\n showCategory,\n showBalance,\n showCleared,\n scrollWidth,\n onSort,\n ascDesc,\n field,\n }) => {\n let dispatchSelected = useSelectedDispatch();\n\n return (\n <Row\n borderColor={colors.n9}\n backgroundColor=\"white\"\n style={{\n color: colors.n4,\n fontWeight: 300,\n zIndex: 200,\n }}\n >\n <SelectCell\n exposed={true}\n focused={false}\n selected={hasSelected}\n width={20}\n onSelect={e => dispatchSelected({ type: 'select-all', event: e })}\n />\n <HeaderCell\n value=\"Date\"\n width={110}\n alignItems=\"flex\"\n marginLeft={-5}\n id=\"date\"\n icon={field === 'date' ? ascDesc : 'clickable'}\n onClick={() =>\n onSort('date', selectAscDesc(field, ascDesc, 'date', 'desc'))\n }\n />\n {showAccount && (\n <HeaderCell\n value=\"Account\"\n width=\"flex\"\n alignItems=\"flex\"\n marginLeft={-5}\n id=\"account\"\n icon={field === 'account' ? ascDesc : 'clickable'}\n onClick={() =>\n onSort('account', selectAscDesc(field, ascDesc, 'account', 'asc'))\n }\n />\n )}\n <HeaderCell\n value=\"Payee\"\n width=\"flex\"\n alignItems=\"flex\"\n marginLeft={-5}\n id=\"payee\"\n icon={field === 'payee' ? ascDesc : 'clickable'}\n onClick={() =>\n onSort('payee', selectAscDesc(field, ascDesc, 'payee', 'asc'))\n }\n />\n <HeaderCell\n value=\"Notes\"\n width=\"flex\"\n alignItems=\"flex\"\n marginLeft={-5}\n id=\"notes\"\n icon={field === 'notes' ? ascDesc : 'clickable'}\n onClick={() =>\n onSort('notes', selectAscDesc(field, ascDesc, 'notes', 'asc'))\n }\n />\n {showCategory && (\n <HeaderCell\n value=\"Category\"\n width=\"flex\"\n alignItems=\"flex\"\n marginLeft={-5}\n id=\"category\"\n icon={field === 'category' ? ascDesc : 'clickable'}\n onClick={() =>\n onSort(\n 'category',\n selectAscDesc(field, ascDesc, 'category', 'asc'),\n )\n }\n />\n )}\n <HeaderCell\n value=\"Payment\"\n width={90}\n alignItems=\"flex-end\"\n marginRight={-5}\n id=\"payment\"\n icon={field === 'payment' ? ascDesc : 'clickable'}\n onClick={() =>\n onSort('payment', selectAscDesc(field, ascDesc, 'payment', 'asc'))\n }\n />\n <HeaderCell\n value=\"Deposit\"\n width={85}\n alignItems=\"flex-end\"\n marginRight={-5}\n id=\"deposit\"\n icon={field === 'deposit' ? ascDesc : 'clickable'}\n onClick={() =>\n onSort('deposit', selectAscDesc(field, ascDesc, 'deposit', 'desc'))\n }\n />\n {showBalance && <Cell value=\"Balance\" width={88} textAlign=\"right\" />}\n {showCleared && <Field width={23} truncate={false} />}\n <Cell value=\"\" width={5 + scrollWidth ?? 0} />\n </Row>\n );\n },\n);\n\nfunction getPayeePretty(transaction, payee, transferAcct) {\n let { payee: payeeId } = transaction;\n\n if (transferAcct) {\n return (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n }}\n >\n <div\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {transferAcct.name}\n </div>\n </View>\n );\n } else if (payee && !payee.transfer_acct) {\n // Check to make sure this isn't a transfer because in the rare\n // occasion that the account has been deleted but the payee is\n // still there, we don't want to show the name.\n return payee.name;\n } else if (payeeId && payeeId.startsWith('new:')) {\n return payeeId.slice('new:'.length);\n }\n\n return '';\n}\n\nfunction StatusCell({\n id,\n focused,\n selected,\n status,\n isChild,\n onEdit,\n onUpdate,\n}) {\n let isClearedField = status === 'cleared' || status == null;\n let statusProps = getStatusProps(status);\n\n let props = {\n color:\n status === 'cleared'\n ? colors.g5\n : status === 'missed'\n ? colors.r6\n : status === 'due'\n ? colors.y5\n : selected\n ? colors.b7\n : colors.n7,\n };\n\n function onSelect() {\n if (isClearedField) {\n onUpdate('cleared', !(status === 'cleared'));\n }\n }\n\n return (\n <Cell\n name=\"cleared\"\n width={23}\n focused={focused}\n style={{ padding: 1 }}\n plain\n >\n <CellButton\n style={[\n {\n padding: 3,\n border: '1px solid transparent',\n borderRadius: 50,\n ':focus': {\n border: '1px solid ' + props.color,\n boxShadow: `0 1px 2px ${props.color}`,\n },\n cursor: isClearedField ? 'pointer' : 'default',\n },\n\n isChild && { visibility: 'hidden' },\n ]}\n onEdit={() => onEdit(id, 'cleared')}\n onSelect={onSelect}\n >\n {createElement(statusProps.Icon, {\n style: {\n width: 13,\n height: 13,\n color: props.color,\n marginTop: status === 'due' ? -1 : 0,\n },\n })}\n </CellButton>\n </Cell>\n );\n}\n\nfunction HeaderCell({\n value,\n id,\n width,\n alignItems,\n marginLeft,\n marginRight,\n icon,\n onClick,\n}) {\n return (\n <CustomCell\n width={width}\n name={id}\n alignItems={alignItems}\n unexposedContent={\n <Button\n type=\"bare\"\n onClick={onClick}\n style={{\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n color: colors.n4,\n fontWeight: 300,\n marginLeft: marginLeft,\n marginRight: marginRight,\n }}\n >\n <UnexposedCellContent value={value} />\n {icon === 'asc' && (\n <ArrowDown width={10} height={10} style={{ marginLeft: 5 }} />\n )}\n {icon === 'desc' && (\n <ArrowUp width={10} height={10} style={{ marginLeft: 5 }} />\n )}\n </Button>\n }\n />\n );\n}\n\nfunction PayeeCell({\n id,\n payeeId,\n accountId,\n focused,\n inherited,\n payees,\n accounts,\n valueStyle,\n transaction,\n payee,\n transferAcct,\n isPreview,\n onEdit,\n onUpdate,\n onCreatePayee,\n onManagePayees,\n onNavigateToTransferAccount,\n onNavigateToSchedule,\n}) {\n let isCreatingPayee = useRef(false);\n\n // Filter out the account we're currently in as it is not a valid transfer\n accounts = accounts.filter(account => account.id !== accountId);\n payees = payees.filter(payee => payee.transfer_acct !== accountId);\n\n return (\n <CustomCell\n width=\"flex\"\n name=\"payee\"\n textAlign=\"flex\"\n value={payeeId}\n valueStyle={[valueStyle, inherited && { color: colors.n8 }]}\n exposed={focused}\n onExpose={name => !isPreview && onEdit(id, name)}\n onUpdate={async value => {\n onUpdate('payee', value);\n\n if (value && value.startsWith('new:') && !isCreatingPayee.current) {\n isCreatingPayee.current = true;\n let id = await onCreatePayee(value.slice('new:'.length));\n onUpdate('payee', id);\n isCreatingPayee.current = false;\n }\n }}\n unexposedContent={\n <>\n <PayeeIcons\n transaction={transaction}\n transferAccount={transferAcct}\n onNavigateToTransferAccount={onNavigateToTransferAccount}\n onNavigateToSchedule={onNavigateToSchedule}\n />\n <UnexposedCellContent\n value={payeeId}\n formatter={() => getPayeePretty(transaction, payee, transferAcct)}\n />\n </>\n }\n >\n {({\n onBlur,\n onKeyDown,\n onUpdate,\n onSave,\n shouldSaveFromKey,\n inputStyle,\n }) => {\n return (\n <PayeeAutocomplete\n payees={payees}\n accounts={accounts}\n value={payeeId}\n shouldSaveFromKey={shouldSaveFromKey}\n inputProps={{\n onBlur,\n onKeyDown,\n style: inputStyle,\n }}\n showManagePayees={true}\n tableBehavior={true}\n defaultFocusTransferPayees={transaction.is_child}\n focused={true}\n onUpdate={onUpdate}\n onSelect={onSave}\n onManagePayees={() => onManagePayees(payeeId)}\n isCreatable\n menuPortalTarget={undefined}\n />\n );\n }}\n </CustomCell>\n );\n}\n\nfunction PayeeIcons({\n transaction,\n transferAccount,\n onNavigateToTransferAccount,\n onNavigateToSchedule,\n children,\n}) {\n let scheduleId = transaction.schedule;\n let scheduleData = useCachedSchedules();\n let schedule = scheduleData\n ? scheduleData.schedules.find(s => s.id === scheduleId)\n : null;\n\n if (schedule == null && transferAccount == null) {\n // Neither a valid scheduled transaction nor a transfer.\n return children;\n }\n\n let buttonStyle = {\n marginLeft: -5,\n marginRight: 2,\n width: 23,\n height: 23,\n color: 'inherit',\n };\n\n let scheduleIconStyle = { width: 13, height: 13 };\n\n let transferIconStyle = { width: 10, height: 10 };\n\n let recurring = schedule && schedule._date && !!schedule._date.frequency;\n\n return schedule ? (\n <Button\n type=\"bare\"\n style={buttonStyle}\n onClick={e => {\n e.stopPropagation();\n onNavigateToSchedule(scheduleId);\n }}\n >\n {recurring ? (\n <ArrowsSynchronize style={scheduleIconStyle} />\n ) : (\n <CalendarIcon style={scheduleIconStyle} />\n )}\n </Button>\n ) : transferAccount ? (\n <Button\n type=\"bare\"\n style={buttonStyle}\n onClick={e => {\n e.stopPropagation();\n if (!isTemporaryId(transaction.id)) {\n onNavigateToTransferAccount(transferAccount.id);\n }\n }}\n >\n {(transaction._inverse ? -1 : 1) * transaction.amount > 0 ? (\n <LeftArrow2 style={transferIconStyle} />\n ) : (\n <RightArrow2 style={transferIconStyle} />\n )}\n </Button>\n ) : null;\n}\n\nconst Transaction = memo(function Transaction(props) {\n let {\n transaction: originalTransaction,\n editing,\n backgroundColor = 'white',\n showAccount,\n showBalance,\n showCleared,\n showZeroInDeposit,\n style,\n hovered,\n selected,\n highlighted,\n added,\n matched,\n expanded,\n inheritedFields,\n focusedField,\n categoryGroups,\n payees,\n accounts,\n balance,\n dateFormat = 'MM/dd/yyyy',\n hideFraction,\n onSave,\n onEdit,\n onHover,\n onDelete,\n onSplit,\n onManagePayees,\n onCreatePayee,\n onToggleSplit,\n onNavigateToTransferAccount,\n onNavigateToSchedule,\n } = props;\n\n let dispatchSelected = useSelectedDispatch();\n\n let [prevShowZero, setPrevShowZero] = useState(showZeroInDeposit);\n let [prevTransaction, setPrevTransaction] = useState(originalTransaction);\n let [transaction, setTransaction] = useState(() =>\n serializeTransaction(originalTransaction, showZeroInDeposit),\n );\n let isPreview = isPreviewId(transaction.id);\n\n if (\n originalTransaction !== prevTransaction ||\n showZeroInDeposit !== prevShowZero\n ) {\n setTransaction(\n serializeTransaction(originalTransaction, showZeroInDeposit),\n );\n setPrevTransaction(originalTransaction);\n setPrevShowZero(showZeroInDeposit);\n }\n\n function onUpdate(name, value) {\n if (transaction[name] !== value) {\n let newTransaction = { ...transaction, [name]: value };\n\n // Don't change the note to an empty string if it's null (since they are both rendered the same)\n if (name === 'note' && value === '' && transaction.note == null) {\n return;\n }\n\n if (\n name === 'account' &&\n value &&\n getAccountsById(accounts)[value].offbudget\n ) {\n newTransaction.category = null;\n }\n\n // If entering an amount in either of the credit/debit fields, we\n // need to clear out the other one so it's always properly\n // translated into the desired amount (see\n // `deserializeTransaction`)\n if (name === 'credit') {\n newTransaction['debit'] = '';\n } else if (name === 'debit') {\n newTransaction['credit'] = '';\n }\n\n // Don't save a temporary value (a new payee) which will be\n // filled in with a real id later\n if (name === 'payee' && value && value.startsWith('new:')) {\n setTransaction(newTransaction);\n } else {\n let deserialized = deserializeTransaction(\n newTransaction,\n originalTransaction,\n );\n // Run the transaction through the formatting so that we know\n // it's always showing the formatted result\n setTransaction(serializeTransaction(deserialized, showZeroInDeposit));\n onSave(deserialized);\n }\n }\n }\n\n let {\n id,\n debit,\n credit,\n payee: payeeId,\n imported_payee: importedPayee,\n notes,\n date,\n account: accountId,\n category: categoryId,\n cleared,\n is_parent: isParent,\n _unmatched = false,\n _inverse = false,\n } = transaction;\n\n // Join in some data\n let payee = payees && payeeId && getPayeesById(payees)[payeeId];\n let account = accounts && accountId && getAccountsById(accounts)[accountId];\n let transferAcct;\n\n if (_inverse) {\n transferAcct =\n accounts && accountId && getAccountsById(accounts)[accountId];\n } else {\n transferAcct =\n payee &&\n payee.transfer_acct &&\n getAccountsById(accounts)[payee.transfer_acct];\n }\n\n let isChild = transaction.is_child;\n let borderColor = selected ? colors.b8 : colors.border;\n let isBudgetTransfer = transferAcct && transferAcct.offbudget === 0;\n let isOffBudget = account && account.offbudget === 1;\n\n let valueStyle = added ? { fontWeight: 600 } : null;\n let backgroundFocus = hovered || focusedField === 'select';\n let amountStyle = hideFraction ? { letterSpacing: -0.5 } : null;\n\n return (\n <Row\n borderColor={borderColor}\n backgroundColor={\n selected\n ? colors.selected\n : backgroundFocus\n ? colors.hover\n : isPreview\n ? '#fcfcfc'\n : backgroundColor\n }\n highlighted={highlighted}\n style={[\n style,\n isPreview && { color: colors.n5, fontStyle: 'italic' },\n _unmatched && { opacity: 0.5 },\n ]}\n onMouseEnter={() => onHover && onHover(transaction.id)}\n >\n {isChild && (\n <Field\n borderColor=\"transparent\"\n width={110}\n style={{\n width: 110,\n backgroundColor: colors.n11,\n borderBottomWidth: 0,\n }}\n />\n )}\n {isChild && showAccount && (\n <Field\n borderColor=\"transparent\"\n style={{\n flex: 1,\n backgroundColor: colors.n11,\n opacity: 0,\n }}\n />\n )}\n\n {isTemporaryId(transaction.id) ? (\n isChild ? (\n <DeleteCell\n onDelete={() => onDelete && onDelete(transaction.id)}\n exposed={hovered || editing}\n style={[isChild && { borderLeftWidth: 1 }, { lineHeight: 0 }]}\n />\n ) : (\n <Cell width={20} />\n )\n ) : (\n <SelectCell\n exposed={hovered || selected || editing}\n focused={focusedField === 'select'}\n onSelect={e => {\n dispatchSelected({ type: 'select', id: transaction.id, event: e });\n }}\n onEdit={() => onEdit(id, 'select')}\n selected={selected}\n style={[isChild && { borderLeftWidth: 1 }]}\n value={\n matched && (\n <Hyperlink2 style={{ width: 13, height: 13, color: colors.n7 }} />\n )\n }\n />\n )}\n\n {!isChild && (\n <CustomCell\n name=\"date\"\n width={110}\n textAlign=\"flex\"\n exposed={focusedField === 'date'}\n value={date}\n valueStyle={valueStyle}\n formatter={date =>\n date ? formatDate(parseISO(date), dateFormat) : ''\n }\n onExpose={name => !isPreview && onEdit(id, name)}\n onUpdate={value => {\n onUpdate('date', value);\n }}\n >\n {({\n onBlur,\n onKeyDown,\n onUpdate,\n onSave,\n shouldSaveFromKey,\n inputStyle,\n }) => (\n <DateSelect\n value={date || ''}\n dateFormat={dateFormat}\n inputProps={{ onBlur, onKeyDown, style: inputStyle }}\n shouldSaveFromKey={shouldSaveFromKey}\n tableBehavior={true}\n onUpdate={onUpdate}\n onSelect={onSave}\n />\n )}\n </CustomCell>\n )}\n\n {!isChild && showAccount && (\n <CustomCell\n name=\"account\"\n width=\"flex\"\n textAlign=\"flex\"\n value={accountId}\n formatter={acctId => {\n let acct = acctId && getAccountsById(accounts)[acctId];\n if (acct) {\n return acct.name;\n }\n return '';\n }}\n valueStyle={valueStyle}\n exposed={focusedField === 'account'}\n onExpose={name => !isPreview && onEdit(id, name)}\n onUpdate={async value => {\n // Only ever allow non-null values\n if (value) {\n onUpdate('account', value);\n }\n }}\n >\n {({\n onBlur,\n onKeyDown,\n onUpdate,\n onSave,\n shouldSaveFromKey,\n inputStyle,\n }) => (\n <AccountAutocomplete\n includeClosedAccounts={false}\n value={accountId}\n accounts={accounts}\n shouldSaveFromKey={shouldSaveFromKey}\n tableBehavior={true}\n focused={true}\n inputProps={{ onBlur, onKeyDown, style: inputStyle }}\n onUpdate={onUpdate}\n onSelect={onSave}\n menuPortalTarget={undefined}\n />\n )}\n </CustomCell>\n )}\n {(() => (\n <PayeeCell\n id={id}\n payeeId={payeeId}\n accountId={accountId}\n focused={focusedField === 'payee'}\n inherited={inheritedFields && inheritedFields.has('payee')}\n payees={payees}\n accounts={accounts}\n valueStyle={valueStyle}\n transaction={transaction}\n payee={payee}\n transferAcct={transferAcct}\n importedPayee={importedPayee}\n isPreview={isPreview}\n onEdit={onEdit}\n onUpdate={onUpdate}\n onCreatePayee={onCreatePayee}\n onManagePayees={onManagePayees}\n onNavigateToTransferAccount={onNavigateToTransferAccount}\n onNavigateToSchedule={onNavigateToSchedule}\n />\n ))()}\n\n {isPreview ? (\n <Cell name=\"notes\" width=\"flex\" />\n ) : (\n <InputCell\n width=\"flex\"\n name=\"notes\"\n textAlign=\"flex\"\n exposed={focusedField === 'notes'}\n focused={focusedField === 'notes'}\n value={notes || ''}\n valueStyle={valueStyle}\n onExpose={name => !isPreview && onEdit(id, name)}\n inputProps={{\n value: notes || '',\n onUpdate: onUpdate.bind(null, 'notes'),\n }}\n />\n )}\n\n {isPreview ? (\n <Cell width=\"flex\" style={{ alignItems: 'flex-start' }} exposed={true}>\n {() => (\n <View\n style={{\n color:\n notes === 'missed'\n ? colors.r6\n : notes === 'due'\n ? colors.y4\n : selected\n ? colors.b5\n : colors.n6,\n backgroundColor:\n notes === 'missed'\n ? colors.r10\n : notes === 'due'\n ? colors.y9\n : selected\n ? colors.b8\n : colors.n10,\n margin: '0 5px',\n padding: '3px 7px',\n borderRadius: 4,\n }}\n >\n {titleFirst(notes)}\n </View>\n )}\n </Cell>\n ) : isParent ? (\n <Cell\n name=\"category\"\n width=\"flex\"\n focused={focusedField === 'category'}\n style={{ padding: 0 }}\n plain\n >\n <CellButton\n style={{\n alignSelf: 'flex-start',\n color: colors.n6,\n borderRadius: 4,\n transition: 'none',\n '&:hover': {\n backgroundColor: 'rgba(100, 100, 100, .15)',\n color: colors.n5,\n },\n }}\n disabled={isTemporaryId(transaction.id)}\n onEdit={() => onEdit(id, 'category')}\n onSelect={() => onToggleSplit(id)}\n >\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n alignSelf: 'stretch',\n borderRadius: 4,\n flex: 1,\n padding: 4,\n }}\n >\n {isParent && (\n <CheveronDown\n style={{\n width: 14,\n height: 14,\n transition: 'transform .08s',\n transform: expanded ? 'rotateZ(0)' : 'rotateZ(-90deg)',\n }}\n />\n )}\n <Text style={{ fontStyle: 'italic', userSelect: 'none' }}>\n Split\n </Text>\n </View>\n </CellButton>\n </Cell>\n ) : isBudgetTransfer || isOffBudget || isPreview ? (\n <InputCell\n name=\"category\"\n width=\"flex\"\n exposed={focusedField === 'category'}\n focused={focusedField === 'category'}\n onExpose={name => !isPreview && onEdit(id, name)}\n value={\n isParent\n ? 'Split'\n : isOffBudget\n ? 'Off Budget'\n : isBudgetTransfer\n ? 'Transfer'\n : ''\n }\n valueStyle={valueStyle}\n style={{\n fontStyle: 'italic',\n color: '#c0c0c0',\n fontWeight: 300,\n }}\n inputProps={{\n readOnly: true,\n style: { fontStyle: 'italic' },\n }}\n />\n ) : (\n <CustomCell\n name=\"category\"\n width=\"flex\"\n textAlign=\"flex\"\n value={categoryId}\n formatter={value =>\n value\n ? getDisplayValue(\n getCategoriesById(categoryGroups)[value],\n 'name',\n )\n : transaction.id\n ? 'Categorize'\n : ''\n }\n exposed={focusedField === 'category'}\n onExpose={name => onEdit(id, name)}\n valueStyle={\n !categoryId\n ? {\n fontStyle: 'italic',\n fontWeight: 300,\n color: colors.p8,\n }\n : valueStyle\n }\n onUpdate={async value => {\n if (value === 'split') {\n onSplit(transaction.id);\n } else {\n onUpdate('category', value);\n }\n }}\n >\n {({\n onBlur,\n onKeyDown,\n onUpdate,\n onSave,\n shouldSaveFromKey,\n inputStyle,\n }) => (\n <CategoryAutocomplete\n categoryGroups={categoryGroups}\n value={categoryId}\n focused={true}\n tableBehavior={true}\n showSplitOption={!isChild && !isParent}\n shouldSaveFromKey={shouldSaveFromKey}\n inputProps={{ onBlur, onKeyDown, style: inputStyle }}\n onUpdate={onUpdate}\n onSelect={onSave}\n menuPortalTarget={undefined}\n />\n )}\n </CustomCell>\n )}\n\n <InputCell\n type=\"input\"\n width={90}\n name=\"debit\"\n exposed={focusedField === 'debit'}\n focused={focusedField === 'debit'}\n value={debit === '' && credit === '' ? '0.00' : debit}\n valueStyle={valueStyle}\n textAlign=\"right\"\n title={debit}\n onExpose={name => !isPreview && onEdit(id, name)}\n style={[isParent && { fontStyle: 'italic' }, styles.tnum, amountStyle]}\n inputProps={{\n value: debit === '' && credit === '' ? '0.00' : debit,\n onUpdate: onUpdate.bind(null, 'debit'),\n }}\n privacyFilter={{\n activationFilters: [!isTemporaryId(transaction.id)],\n }}\n />\n\n <InputCell\n type=\"input\"\n width={85}\n name=\"credit\"\n exposed={focusedField === 'credit'}\n focused={focusedField === 'credit'}\n value={credit}\n valueStyle={valueStyle}\n textAlign=\"right\"\n title={credit}\n onExpose={name => !isPreview && onEdit(id, name)}\n style={[isParent && { fontStyle: 'italic' }, styles.tnum, amountStyle]}\n inputProps={{\n value: credit,\n onUpdate: onUpdate.bind(null, 'credit'),\n }}\n privacyFilter={{\n activationFilters: [!isTemporaryId(transaction.id)],\n }}\n />\n\n {showBalance && (\n <Cell\n name=\"balance\"\n value={balance == null || isChild ? '' : integerToCurrency(balance)}\n valueStyle={{ color: balance < 0 ? colors.r4 : colors.g4 }}\n style={[styles.tnum, amountStyle]}\n width={88}\n textAlign=\"right\"\n privacyFilter\n />\n )}\n\n {showCleared && (\n <StatusCell\n id={id}\n focused={focusedField === 'cleared'}\n selected={selected}\n isPreview={isPreview}\n status={isPreview ? notes : cleared ? 'cleared' : null}\n isChild={isChild}\n onEdit={onEdit}\n onUpdate={onUpdate}\n />\n )}\n\n <Cell width={5} />\n </Row>\n );\n});\n\nfunction TransactionError({ error, isDeposit, onAddSplit, style }) {\n switch (error.type) {\n case 'SplitTransactionError':\n if (error.version === 1) {\n return (\n <View\n style={[\n {\n flexDirection: 'row',\n alignItems: 'center',\n padding: '0 5px',\n },\n style,\n ]}\n data-testid=\"transaction-error\"\n >\n <Text>\n Amount left:{' '}\n <Text style={{ fontWeight: 500 }}>\n {integerToCurrency(\n isDeposit ? error.difference : -error.difference,\n )}\n </Text>\n </Text>\n <View style={{ flex: 1 }} />\n <Button\n type=\"primary\"\n style={{ marginLeft: 15, padding: '4px 10px' }}\n onClick={onAddSplit}\n >\n Add Split\n </Button>\n </View>\n );\n }\n break;\n default:\n return null;\n }\n}\n\nfunction makeTemporaryTransactions(\n currentAccountId,\n currentCategoryId,\n lastDate,\n) {\n return [\n {\n id: 'temp',\n date: lastDate || currentDay(),\n account: currentAccountId || null,\n category: currentCategoryId || null,\n cleared: false,\n amount: null,\n },\n ];\n}\n\nfunction isTemporaryId(id) {\n return id.indexOf('temp') !== -1;\n}\n\nexport function isPreviewId(id) {\n return id.indexOf('preview/') !== -1;\n}\n\nfunction NewTransaction({\n transactions,\n accounts,\n categoryGroups,\n payees,\n editingTransaction,\n hoveredTransaction,\n focusedField,\n showAccount,\n showCategory,\n showBalance,\n showCleared,\n dateFormat,\n hideFraction,\n onHover,\n onClose,\n onSplit,\n onEdit,\n onDelete,\n onSave,\n onAdd,\n onAddSplit,\n onManagePayees,\n onCreatePayee,\n onNavigateToTransferAccount,\n onNavigateToSchedule,\n}) {\n const error = transactions[0].error;\n const isDeposit = transactions[0].amount > 0;\n\n return (\n <View\n style={{\n borderBottom: '1px solid #ebebeb',\n paddingBottom: 6,\n backgroundColor: 'white',\n }}\n data-testid=\"new-transaction\"\n onKeyDown={e => {\n if (e.key === 'Escape') {\n onClose();\n }\n }}\n onMouseLeave={() => onHover(null)}\n >\n {transactions.map((transaction, idx) => (\n <Transaction\n key={transaction.id}\n editing={editingTransaction === transaction.id}\n hovered={hoveredTransaction === transaction.id}\n transaction={transaction}\n showAccount={showAccount}\n showCategory={showCategory}\n showBalance={showBalance}\n showCleared={showCleared}\n focusedField={editingTransaction === transaction.id && focusedField}\n showZeroInDeposit={isDeposit}\n accounts={accounts}\n categoryGroups={categoryGroups}\n payees={payees}\n dateFormat={dateFormat}\n hideFraction={hideFraction}\n expanded={true}\n onHover={onHover}\n onEdit={onEdit}\n onSave={onSave}\n onSplit={onSplit}\n onDelete={onDelete}\n onAdd={onAdd}\n onManagePayees={onManagePayees}\n onCreatePayee={onCreatePayee}\n style={{ marginTop: -1 }}\n onNavigateToTransferAccount={onNavigateToTransferAccount}\n onNavigateToSchedule={onNavigateToSchedule}\n />\n ))}\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-end',\n marginTop: 6,\n marginRight: 20,\n }}\n >\n <Button\n style={{ marginRight: 10, padding: '4px 10px' }}\n onClick={() => onClose()}\n data-testid=\"cancel-button\"\n >\n Cancel\n </Button>\n {error ? (\n <TransactionError\n error={error}\n isDeposit={isDeposit}\n onAddSplit={() => onAddSplit(transactions[0].id)}\n />\n ) : (\n <Button\n type=\"primary\"\n style={{ padding: '4px 10px' }}\n onClick={onAdd}\n data-testid=\"add-button\"\n >\n Add\n </Button>\n )}\n </View>\n </View>\n );\n}\n\nfunction TransactionTableInner({\n tableNavigator,\n tableRef,\n dateFormat = 'MM/dd/yyyy',\n newNavigator,\n renderEmpty,\n onHover,\n onScroll,\n ...props\n}) {\n const containerRef = createRef();\n const isAddingPrev = usePrevious(props.isAdding);\n let [scrollWidth, setScrollWidth] = useState(0);\n\n function saveScrollWidth(parent, child) {\n let width = parent > 0 && child > 0 && parent - child;\n\n setScrollWidth(!width ? 0 : width);\n }\n\n let onNavigateToTransferAccount = useCallback(\n accountId => {\n props.onCloseAddTransaction();\n props.onNavigateToTransferAccount(accountId);\n },\n [props.onCloseAddTransaction, props.onNavigateToTransferAccount],\n );\n\n let onNavigateToSchedule = useCallback(\n scheduleId => {\n props.onCloseAddTransaction();\n props.onNavigateToSchedule(scheduleId);\n },\n [props.onCloseAddTransaction, props.onNavigateToSchedule],\n );\n\n useEffect(() => {\n if (!isAddingPrev && props.isAdding) {\n newNavigator.onEdit('temp', 'date');\n }\n }, [isAddingPrev, props.isAdding, newNavigator]);\n\n const renderRow = ({ item, index, position, editing }) => {\n const {\n transactions,\n selectedItems,\n hoveredTransaction,\n accounts,\n categoryGroups,\n payees,\n showCleared,\n showAccount,\n showCategory,\n showBalances,\n balances,\n hideFraction,\n isNew,\n isMatched,\n isExpanded,\n } = props;\n\n let trans = item;\n let hovered = hoveredTransaction === trans.id;\n let selected = selectedItems.has(trans.id);\n\n let parent = props.transactionMap.get(trans.parent_id);\n let isChildDeposit = parent && parent.amount > 0;\n let expanded = isExpanded && isExpanded((parent || trans).id);\n\n // For backwards compatibility, read the error of the transaction\n // since in previous versions we stored it there. In the future we\n // can simplify this to just the parent\n let error = expanded\n ? (parent && parent.error) || trans.error\n : trans.error;\n\n return (\n <>\n {(!expanded || isLastChild(transactions, index)) &&\n error &&\n error.type === 'SplitTransactionError' && (\n <Tooltip\n position=\"bottom-right\"\n width={250}\n forceTop={position}\n forceLayout={true}\n style={{ transform: 'translate(-5px, 2px)' }}\n >\n <TransactionError\n error={error}\n isDeposit={isChildDeposit}\n onAddSplit={() => props.onAddSplit(trans.id)}\n />\n </Tooltip>\n )}\n <Transaction\n editing={editing}\n transaction={trans}\n showAccount={showAccount}\n showCategory={showCategory}\n showBalance={showBalances}\n showCleared={showCleared}\n hovered={hovered}\n selected={selected}\n highlighted={false}\n added={isNew?.(trans.id)}\n expanded={isExpanded?.(trans.id)}\n matched={isMatched?.(trans.id)}\n showZeroInDeposit={isChildDeposit}\n balance={balances?.[trans.id]?.balance}\n focusedField={editing && tableNavigator.focusedField}\n accounts={accounts}\n categoryGroups={categoryGroups}\n payees={payees}\n inheritedFields={\n parent?.payee === trans.payee ? new Set(['payee']) : new Set()\n }\n dateFormat={dateFormat}\n hideFraction={hideFraction}\n onHover={onHover}\n onEdit={tableNavigator.onEdit}\n onSave={props.onSave}\n onDelete={props.onDelete}\n onSplit={props.onSplit}\n onManagePayees={props.onManagePayees}\n onCreatePayee={props.onCreatePayee}\n onToggleSplit={props.onToggleSplit}\n onNavigateToTransferAccount={onNavigateToTransferAccount}\n onNavigateToSchedule={onNavigateToSchedule}\n />\n </>\n );\n };\n\n return (\n <View\n innerRef={containerRef}\n style={[{ flex: 1, cursor: 'default' }, props.style]}\n >\n <View>\n <TransactionHeader\n hasSelected={props.selectedItems.size > 0}\n showAccount={props.showAccount}\n showCategory={props.showCategory}\n showBalance={props.showBalances}\n showCleared={props.showCleared}\n scrollWidth={scrollWidth}\n onSort={props.onSort}\n ascDesc={props.ascDesc}\n field={props.sortField}\n />\n\n {props.isAdding && (\n <View\n {...newNavigator.getNavigatorProps({\n onKeyDown: e => props.onCheckNewEnter(e),\n })}\n >\n <NewTransaction\n transactions={props.newTransactions}\n editingTransaction={newNavigator.editingId}\n hoveredTransaction={props.hoveredTransaction}\n focusedField={newNavigator.focusedField}\n accounts={props.accounts}\n categoryGroups={props.categoryGroups}\n payees={props.payees || []}\n showAccount={props.showAccount}\n showCategory={props.showCategory}\n showBalance={props.showBalances}\n showCleared={props.showCleared}\n dateFormat={dateFormat}\n hideFraction={props.hideFraction}\n onClose={props.onCloseAddTransaction}\n onAdd={props.onAddTemporary}\n onAddSplit={props.onAddSplit}\n onSplit={props.onSplit}\n onEdit={newNavigator.onEdit}\n onSave={props.onSave}\n onDelete={props.onDelete}\n onHover={onHover}\n onManagePayees={props.onManagePayees}\n onCreatePayee={props.onCreatePayee}\n onNavigateToTransferAccount={onNavigateToTransferAccount}\n onNavigateToSchedule={onNavigateToTransferAccount}\n />\n </View>\n )}\n </View>\n {/*// * On Windows, makes the scrollbar always appear\n // the full height of the container ??? */}\n\n <View\n style={[{ flex: 1, overflow: 'hidden' }]}\n data-testid=\"transaction-table\"\n onMouseLeave={() => onHover(null)}\n >\n <Table\n navigator={tableNavigator}\n ref={tableRef}\n items={props.transactions}\n renderItem={renderRow}\n renderEmpty={renderEmpty}\n loadMore={props.loadMoreTransactions}\n isSelected={id => props.selectedItems.has(id)}\n onKeyDown={e => props.onCheckEnter(e)}\n onScroll={onScroll}\n saveScrollWidth={saveScrollWidth}\n />\n\n {props.isAdding && (\n <div\n key=\"shadow\"\n style={{\n position: 'absolute',\n top: -20,\n left: 0,\n right: 0,\n height: 20,\n backgroundColor: 'red',\n boxShadow: '0 0 6px rgba(0, 0, 0, .20)',\n }}\n />\n )}\n </View>\n </View>\n );\n}\n\nexport let TransactionTable = forwardRef((props, ref) => {\n let [newTransactions, setNewTransactions] = useState(null);\n let [hoveredTransaction, setHoveredTransaction] = useState(\n props.hoveredTransaction,\n );\n let [prevIsAdding, setPrevIsAdding] = useState(false);\n let splitsExpanded = useSplitsExpanded();\n let prevSplitsExpanded = useRef(null);\n\n let tableRef = useRef(null);\n let mergedRef = useMergedRefs(tableRef, ref);\n\n let transactions = useMemo(() => {\n let result;\n if (splitsExpanded.state.transitionId != null) {\n let index = props.transactions.findIndex(\n t => t.id === splitsExpanded.state.transitionId,\n );\n result = props.transactions.filter((t, idx) => {\n if (t.parent_id) {\n if (idx >= index) {\n return splitsExpanded.expanded(t.parent_id);\n } else if (prevSplitsExpanded.current) {\n return prevSplitsExpanded.current.expanded(t.parent_id);\n }\n }\n return true;\n });\n } else {\n if (\n prevSplitsExpanded.current &&\n prevSplitsExpanded.current.state.transitionId != null\n ) {\n tableRef.current.anchor();\n tableRef.current.setRowAnimation(false);\n }\n prevSplitsExpanded.current = splitsExpanded;\n\n result = props.transactions.filter(t => {\n if (t.parent_id) {\n return splitsExpanded.expanded(t.parent_id);\n }\n return true;\n });\n }\n\n prevSplitsExpanded.current = splitsExpanded;\n return result;\n }, [props.transactions, splitsExpanded]);\n const transactionMap = useMemo(() => {\n return new Map(transactions.map(trans => [trans.id, trans]));\n }, [transactions]);\n\n useEffect(() => {\n // If it's anchored that means we've also disabled animations. To\n // reduce the chance for side effect collision, only do this if\n // we've actually anchored it\n if (tableRef.current.isAnchored()) {\n tableRef.current.unanchor();\n tableRef.current.setRowAnimation(true);\n }\n }, [prevSplitsExpanded.current]);\n\n let newNavigator = useTableNavigator(newTransactions, getFields);\n let tableNavigator = useTableNavigator(transactions, getFields);\n let shouldAdd = useRef(false);\n let latestState = useRef({ newTransactions, newNavigator, tableNavigator });\n let savePending = useRef(false);\n let afterSaveFunc = useRef(false);\n let [_, forceRerender] = useState({});\n let selectedItems = useSelectedItems();\n\n useLayoutEffect(() => {\n latestState.current = {\n newTransactions,\n newNavigator,\n tableNavigator,\n transactions: props.transactions,\n };\n });\n\n // Derive new transactions from the `isAdding` prop\n if (prevIsAdding !== props.isAdding) {\n if (!prevIsAdding && props.isAdding) {\n setNewTransactions(\n makeTemporaryTransactions(\n props.currentAccountId,\n props.currentCategoryId,\n ),\n );\n }\n setPrevIsAdding(props.isAdding);\n }\n\n useEffect(() => {\n if (shouldAdd.current) {\n if (newTransactions[0].account == null) {\n props.addNotification({\n type: 'error',\n message: 'Account is a required field',\n });\n newNavigator.onEdit('temp', 'account');\n } else {\n let transactions = latestState.current.newTransactions;\n let lastDate = transactions.length > 0 ? transactions[0].date : null;\n setNewTransactions(\n makeTemporaryTransactions(\n props.currentAccountId,\n props.currentCategoryId,\n lastDate,\n ),\n );\n newNavigator.onEdit('temp', 'date');\n props.onAdd(transactions);\n }\n shouldAdd.current = false;\n }\n });\n\n useEffect(() => {\n if (savePending.current && afterSaveFunc.current) {\n afterSaveFunc.current(props);\n afterSaveFunc.current = null;\n }\n\n savePending.current = false;\n }, [newTransactions, props.transactions]);\n\n function getFields(item) {\n let fields = [\n 'select',\n 'date',\n 'account',\n 'payee',\n 'notes',\n 'category',\n 'debit',\n 'credit',\n 'cleared',\n ];\n\n fields = item.is_child\n ? ['select', 'payee', 'notes', 'category', 'debit', 'credit']\n : fields.filter(\n f =>\n (props.showAccount || f !== 'account') &&\n (props.showCategory || f !== 'category'),\n );\n\n if (isPreviewId(item.id)) {\n fields = ['select', 'cleared'];\n }\n if (isTemporaryId(item.id)) {\n // You can't focus the select/delete button of temporary\n // transactions\n fields = fields.slice(1);\n }\n\n return fields;\n }\n\n function afterSave(func) {\n if (savePending.current) {\n afterSaveFunc.current = func;\n } else {\n func(props);\n }\n }\n\n function onCheckNewEnter(e) {\n if (e.key === 'Enter') {\n if (e.metaKey) {\n e.stopPropagation();\n onAddTemporary();\n } else if (!e.shiftKey) {\n function getLastTransaction(state) {\n let { newTransactions } = state.current;\n return newTransactions[newTransactions.length - 1];\n }\n\n // Right now, the table navigator does some funky stuff with\n // focus, so we want to stop it from handling this event. We\n // still want enter to move up/down normally, so we only stop\n // it if we are on the last transaction (where we are about to\n // do some logic). I don't like this.\n if (newNavigator.editingId === getLastTransaction(latestState).id) {\n e.stopPropagation();\n }\n\n afterSave(() => {\n let lastTransaction = getLastTransaction(latestState);\n let isSplit = lastTransaction.parent_id || lastTransaction.is_parent;\n\n if (\n latestState.current.newTransactions[0].error &&\n newNavigator.editingId === lastTransaction.id\n ) {\n // add split\n onAddSplit(lastTransaction.id);\n } else if (\n newNavigator.editingId === lastTransaction.id &&\n (!isSplit || !lastTransaction.error)\n ) {\n onAddTemporary();\n }\n });\n }\n }\n }\n\n function onCheckEnter(e) {\n if (e.key === 'Enter' && !e.shiftKey) {\n let { editingId: id, focusedField } = tableNavigator;\n\n afterSave(() => {\n let transactions = latestState.current.transactions;\n let idx = transactions.findIndex(t => t.id === id);\n let parent = transactionMap.get(transactions[idx]?.parent_id);\n\n if (\n isLastChild(transactions, idx) &&\n parent &&\n parent.error &&\n focusedField !== 'select'\n ) {\n e.stopPropagation();\n onAddSplit(id);\n }\n });\n }\n }\n\n let onAddTemporary = useCallback(() => {\n shouldAdd.current = true;\n // A little hacky - this forces a rerender which will cause the\n // effect we want to run. We have to wait for all updates to be\n // committed (the input could still be saving a value).\n forceRerender({});\n }, [props.onAdd, newNavigator.onEdit]);\n\n let onSave = useCallback(\n async transaction => {\n savePending.current = true;\n\n if (isTemporaryId(transaction.id)) {\n if (props.onApplyRules) {\n transaction = await props.onApplyRules(transaction);\n }\n\n let newTrans = latestState.current.newTransactions;\n setNewTransactions(updateTransaction(newTrans, transaction).data);\n } else {\n props.onSave(transaction);\n }\n },\n [props.onSave],\n );\n\n let onHover = useCallback(id => {\n setHoveredTransaction(id);\n }, []);\n\n let onDelete = useCallback(id => {\n let temporary = isTemporaryId(id);\n\n if (temporary) {\n let newTrans = latestState.current.newTransactions;\n\n if (id === newTrans[0].id) {\n // You can never delete the parent new transaction\n return;\n }\n\n setNewTransactions(deleteTransaction(newTrans, id).data);\n }\n }, []);\n\n let onSplit = useMemo(() => {\n return id => {\n if (isTemporaryId(id)) {\n let { newNavigator } = latestState.current;\n let newTrans = latestState.current.newTransactions;\n let { data, diff } = splitTransaction(newTrans, id);\n setNewTransactions(data);\n\n // Jump next to \"debit\" field if it is empty\n // Otherwise jump to the same field as before, but downwards\n // to the added split transaction\n if (newTrans[0].amount === null) {\n newNavigator.onEdit(newTrans[0].id, 'debit');\n } else {\n newNavigator.onEdit(\n diff.added[0].id,\n latestState.current.newNavigator.focusedField,\n );\n }\n } else {\n let trans = latestState.current.transactions.find(t => t.id === id);\n let newId = props.onSplit(id);\n\n splitsExpanded.dispatch({ type: 'open-split', id: trans.id });\n\n let { tableNavigator } = latestState.current;\n if (trans.amount === null) {\n tableNavigator.onEdit(trans.id, 'debit');\n } else {\n tableNavigator.onEdit(newId, tableNavigator.focusedField);\n }\n }\n };\n }, [props.onSplit, splitsExpanded.dispatch]);\n\n let onAddSplit = useCallback(\n id => {\n if (isTemporaryId(id)) {\n let newTrans = latestState.current.newTransactions;\n let { data, diff } = addSplitTransaction(newTrans, id);\n setNewTransactions(data);\n newNavigator.onEdit(\n diff.added[0].id,\n latestState.current.newNavigator.focusedField,\n );\n } else {\n let newId = props.onAddSplit(id);\n tableNavigator.onEdit(\n newId,\n latestState.current.tableNavigator.focusedField,\n );\n }\n },\n [props.onAddSplit],\n );\n\n function onCloseAddTransaction() {\n setNewTransactions(\n makeTemporaryTransactions(\n props.currentAccountId,\n props.currentCategoryId,\n ),\n );\n props.onCloseAddTransaction();\n }\n\n let onToggleSplit = useCallback(\n id => splitsExpanded.dispatch({ type: 'toggle-split', id }),\n [splitsExpanded.dispatch],\n );\n\n return (\n <TransactionTableInner\n tableRef={mergedRef}\n {...props}\n transactions={transactions}\n transactionMap={transactionMap}\n selectedItems={selectedItems}\n hoveredTransaction={hoveredTransaction}\n isExpanded={splitsExpanded.expanded}\n onHover={onHover}\n onSave={onSave}\n onDelete={onDelete}\n onSplit={onSplit}\n onCheckNewEnter={onCheckNewEnter}\n onCheckEnter={onCheckEnter}\n onAddTemporary={onAddTemporary}\n onAddSplit={onAddSplit}\n onCloseAddTransaction={onCloseAddTransaction}\n onToggleSplit={onToggleSplit}\n newTransactions={newTransactions}\n tableNavigator={tableNavigator}\n newNavigator={newNavigator}\n />\n );\n});\n","import { useEffect, useRef } from 'react';\n\nexport default function usePrevious(value) {\n const ref = useRef();\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref.current;\n}\n","import { useMemo } from 'react';\n\nexport function useMergedRefs(ref1, ref2) {\n return useMemo(() => {\n function ref(value) {\n [ref1, ref2].forEach(ref => {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref != null) {\n ref.current = value;\n }\n });\n }\n\n return ref;\n }, [ref1, ref2]);\n}\n","import React, { useRef, useCallback, useLayoutEffect } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport {\n splitTransaction,\n updateTransaction,\n addSplitTransaction,\n realizeTempTransactions,\n applyTransactionDiff,\n} from 'loot-core/src/shared/transactions';\nimport { getChangedValues, applyChanges } from 'loot-core/src/shared/util';\n\nimport { usePushModal } from '../../util/router-tools';\n\nimport { TransactionTable } from './TransactionsTable';\n\n// When data changes, there are two ways to update the UI:\n//\n// * Optimistic updates: we apply the needed updates to local data\n// and rerender immediately, and send off the changes to the\n// server. Currently, it assumes the server request is successful.\n// If it fails the user will see a generic error which isn't\n// great, but since the server is local a failure is very\n// unlikely. Still, we should notify errors better.\n//\n// * A full refetch and rerender: this is needed when applying\n// updates locally is too complex. Usually this happens when\n// changing a field that data is sorted on: we're not going\n// to resort the data in memory, we want to rely on the database\n// for that. So we need to do a full refresh.\n//\n// When writing updates, it's up to you to decide which one to do.\n// Optimistic updates feel snappy, but they might show data\n// differently than a full refresh. It's up to you to decide which\n// one to use when doing updates.\n\nasync function saveDiff(diff) {\n let remoteUpdates = await send('transactions-batch-update', {\n ...diff,\n learnCategories: true,\n });\n if (remoteUpdates.length > 0) {\n return { updates: remoteUpdates };\n }\n return {};\n}\n\nasync function saveDiffAndApply(diff, changes, onChange) {\n let remoteDiff = await saveDiff(diff);\n onChange(\n applyTransactionDiff(changes.newTransaction, remoteDiff),\n applyChanges(remoteDiff, changes.data),\n );\n}\n\nexport default function TransactionList({\n tableRef,\n transactions,\n allTransactions,\n loadMoreTransactions,\n account,\n accounts,\n category,\n categoryGroups,\n payees,\n balances,\n showBalances,\n showCleared,\n showAccount,\n headerContent,\n animated,\n isAdding,\n isNew,\n isMatched,\n isFiltered,\n dateFormat,\n hideFraction,\n addNotification,\n renderEmpty,\n onSort,\n sortField,\n ascDesc,\n onChange,\n onRefetch,\n onCloseAddTransaction,\n onCreatePayee,\n}) {\n let transactionsLatest = useRef();\n let navigate = useNavigate();\n let pushModal = usePushModal();\n\n useLayoutEffect(() => {\n transactionsLatest.current = transactions;\n }, [transactions]);\n\n let onAdd = useCallback(async newTransactions => {\n newTransactions = realizeTempTransactions(newTransactions);\n\n await saveDiff({ added: newTransactions });\n onRefetch();\n }, []);\n\n let onSave = useCallback(async transaction => {\n let changes = updateTransaction(transactionsLatest.current, transaction);\n\n if (changes.diff.updated.length > 0) {\n let dateChanged = !!changes.diff.updated[0].date;\n if (dateChanged) {\n // Make sure it stays at the top of the list of transactions\n // for that date\n changes.diff.updated[0].sort_order = Date.now();\n await saveDiff(changes.diff);\n onRefetch();\n } else {\n onChange(changes.newTransaction, changes.data);\n saveDiffAndApply(changes.diff, changes, onChange);\n }\n }\n }, []);\n\n let onAddSplit = useCallback(id => {\n const changes = addSplitTransaction(transactionsLatest.current, id);\n onChange(changes.newTransaction, changes.data);\n saveDiffAndApply(changes.diff, changes, onChange);\n return changes.diff.added[0].id;\n }, []);\n\n let onSplit = useCallback(id => {\n const changes = splitTransaction(transactionsLatest.current, id);\n onChange(changes.newTransaction, changes.data);\n saveDiffAndApply(changes.diff, changes, onChange);\n return changes.diff.added[0].id;\n }, []);\n\n let onApplyRules = useCallback(async transaction => {\n let afterRules = await send('rules-run', { transaction });\n let diff = getChangedValues(transaction, afterRules);\n\n let newTransaction = { ...transaction };\n if (diff) {\n Object.keys(diff).forEach(field => {\n if (\n newTransaction[field] == null ||\n newTransaction[field] === '' ||\n newTransaction[field] === 0 ||\n newTransaction[field] === false\n ) {\n newTransaction[field] = diff[field];\n }\n });\n }\n return newTransaction;\n }, []);\n\n let onManagePayees = useCallback(id => {\n navigate('/payees', { selectedPayee: id });\n });\n\n let onNavigateToTransferAccount = useCallback(accountId => {\n navigate(`/accounts/${accountId}`);\n });\n\n let onNavigateToSchedule = useCallback(scheduleId => {\n pushModal(`/schedule/edit/${scheduleId}`);\n });\n\n return (\n <TransactionTable\n ref={tableRef}\n transactions={allTransactions}\n loadMoreTransactions={loadMoreTransactions}\n accounts={accounts}\n categoryGroups={categoryGroups}\n payees={payees}\n showBalances={showBalances}\n balances={balances}\n showCleared={showCleared}\n showAccount={showAccount}\n showCategory={true}\n animated={animated}\n currentAccountId={account && account.id}\n currentCategoryId={category && category.id}\n isAdding={isAdding}\n isNew={isNew}\n isMatched={isMatched}\n isFiltered={isFiltered}\n dateFormat={dateFormat}\n hideFraction={hideFraction}\n addNotification={addNotification}\n headerContent={headerContent}\n renderEmpty={renderEmpty}\n onSave={onSave}\n onApplyRules={onApplyRules}\n onSplit={onSplit}\n onCloseAddTransaction={onCloseAddTransaction}\n onAdd={onAdd}\n onAddSplit={onAddSplit}\n onManagePayees={onManagePayees}\n onCreatePayee={onCreatePayee}\n style={{ backgroundColor: 'white' }}\n onNavigateToTransferAccount={onNavigateToTransferAccount}\n onNavigateToSchedule={onNavigateToSchedule}\n onSort={onSort}\n sortField={sortField}\n ascDesc={ascDesc}\n />\n );\n}\n","import * as React from 'react';\nconst SvgArrowsExpand3 = props => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n fill=\"currentColor\"\n d=\"M19.611 2.571h-3.754a1.286 1.286 0 1 1 0-2.571h6.857A1.286 1.286 0 0 1 24 1.286v6.857a1.286 1.286 0 0 1-2.571 0V4.39L15.48 10.34a1.286 1.286 0 0 1-1.817-1.817l5.948-5.95ZM1.286 14.571a1.286 1.286 0 0 1 1.285 1.286v3.754l5.949-5.946a1.286 1.286 0 0 1 1.817 1.817L4.39 21.429h3.753a1.285 1.285 0 1 1 0 2.571H1.286A1.286 1.286 0 0 1 0 22.714v-6.857a1.286 1.286 0 0 1 1.286-1.286Z\"\n />\n </svg>\n);\nexport default SvgArrowsExpand3;\n","import * as React from 'react';\nconst SvgArrowsShrink3 = props => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n fill=\"currentColor\"\n d=\"M14.143 1.714A1.286 1.286 0 0 1 15.429 3v3.753L21.806.377a1.286 1.286 0 0 1 1.817 1.817l-6.376 6.377H21a1.286 1.286 0 1 1 0 2.572h-6.857a1.286 1.286 0 0 1-1.286-1.286V3a1.286 1.286 0 0 1 1.286-1.286ZM9.857 22.286A1.285 1.285 0 0 1 8.571 21v-3.753l-6.377 6.376a1.286 1.286 0 0 1-1.817-1.817l6.376-6.377H3a1.286 1.286 0 0 1 0-2.572h6.857a1.286 1.286 0 0 1 1.286 1.286V21a1.286 1.286 0 0 1-1.286 1.286Z\"\n />\n </svg>\n);\nexport default SvgArrowsShrink3;\n","import * as React from 'react';\nconst SvgDownloadThickBottom = props => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n d=\"M8.616 1.741A1.455 1.455 0 0 1 10.07.287h3.392a1.455 1.455 0 0 1 1.453 1.454v8.228a.25.25 0 0 0 .25.25h2.9a1.138 1.138 0 0 1 .827 2l-6.1 6.1a1.489 1.489 0 0 1-2.056 0l-6.1-6.1a1.137 1.137 0 0 1 .827-2h2.9a.249.249 0 0 0 .25-.25Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M0 19.677a4.039 4.039 0 0 0 4.035 4.035h15.93A4.039 4.039 0 0 0 24 19.677V17.8a1.225 1.225 0 0 0-2.449 0v1.874a1.588 1.588 0 0 1-1.586 1.586H4.035a1.588 1.588 0 0 1-1.586-1.586V17.8A1.225 1.225 0 0 0 0 17.8Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\nexport default SvgDownloadThickBottom;\n","import * as React from 'react';\nconst SvgPencil1 = props => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n d=\"M15.067 3.986a.5.5 0 0 0-.354-.148.5.5 0 0 0-.354.147L3.437 14.91a.5.5 0 0 0 0 .707l4.948 4.948a.5.5 0 0 0 .707 0L20.009 9.648a.5.5 0 0 0 0-.706ZM2.43 16.8a.5.5 0 0 0-.489-.127.5.5 0 0 0-.351.364L.084 23.314a.5.5 0 0 0 .133.47.507.507 0 0 0 .47.132l6.272-1.5a.5.5 0 0 0 .237-.84ZM23.2 2.924 21.077.8a2.5 2.5 0 0 0-3.532 0l-1.418 1.417a.5.5 0 0 0 0 .707l4.95 4.949a.5.5 0 0 0 .707 0L23.2 6.454a2.5 2.5 0 0 0 0-3.53Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\nexport default SvgPencil1;\n","import React from 'react';\n\nimport DotsHorizontalTriple from '../../icons/v1/DotsHorizontalTriple';\n\nimport Button from './Button';\n\nexport default function MenuButton({ onClick }) {\n return (\n <Button type=\"bare\" onClick={onClick} aria-label=\"Menu\">\n <DotsHorizontalTriple\n width={15}\n height={15}\n style={{ transform: 'rotateZ(90deg)' }}\n />\n </Button>\n );\n}\n","import React, { useMemo } from 'react';\n\nimport { useSelectedItems } from '../../hooks/useSelected';\nimport { usePushModal } from '../../util/router-tools';\nimport Menu from '../common/Menu';\nimport { SelectedItemsButton } from '../table';\n\nimport { isPreviewId } from './TransactionsTable';\n\nexport function SelectedTransactionsButton({\n getTransaction,\n onShow,\n onDuplicate,\n onDelete,\n onEdit,\n onUnlink,\n onCreateRule,\n onScheduleAction,\n}) {\n let pushModal = usePushModal();\n let selectedItems = useSelectedItems();\n\n let types = useMemo(() => {\n let items = [...selectedItems];\n return {\n preview: !!items.find(id => isPreviewId(id)),\n trans: !!items.find(id => !isPreviewId(id)),\n };\n }, [selectedItems]);\n\n let ambiguousDuplication = useMemo(() => {\n let transactions = [...selectedItems].map(id => getTransaction(id));\n\n return transactions.some(t => t && t.is_child);\n }, [selectedItems]);\n\n let linked = useMemo(() => {\n return (\n !types.preview &&\n [...selectedItems].every(id => {\n let t = getTransaction(id);\n return t && t.schedule;\n })\n );\n }, [types.preview, selectedItems, getTransaction]);\n\n return (\n <SelectedItemsButton\n name=\"transactions\"\n keyHandlers={\n types.trans && {\n f: () => onShow([...selectedItems]),\n d: () => onDelete([...selectedItems]),\n a: () => onEdit('account', [...selectedItems]),\n p: () => onEdit('payee', [...selectedItems]),\n n: () => onEdit('notes', [...selectedItems]),\n c: () => onEdit('category', [...selectedItems]),\n l: () => onEdit('cleared', [...selectedItems]),\n }\n }\n items={[\n ...(!types.trans\n ? [\n { name: 'view-schedule', text: 'View schedule' },\n { name: 'post-transaction', text: 'Post transaction' },\n { name: 'skip', text: 'Skip scheduled date' },\n ]\n : [\n { name: 'show', text: 'Show', key: 'F' },\n {\n name: 'duplicate',\n text: 'Duplicate',\n disabled: ambiguousDuplication,\n },\n { name: 'delete', text: 'Delete', key: 'D' },\n ...(linked\n ? [\n {\n name: 'view-schedule',\n text: 'View schedule',\n disabled: selectedItems.size > 1,\n },\n { name: 'unlink-schedule', text: 'Unlink schedule' },\n ]\n : [\n {\n name: 'link-schedule',\n text: 'Link schedule',\n },\n {\n name: 'create-rule',\n text: 'Create rule',\n },\n ]),\n Menu.line,\n { type: Menu.label, name: 'Edit field' },\n { name: 'date', text: 'Date' },\n { name: 'account', text: 'Account', key: 'A' },\n { name: 'payee', text: 'Payee', key: 'P' },\n { name: 'notes', text: 'Notes', key: 'N' },\n { name: 'category', text: 'Category', key: 'C' },\n { name: 'amount', text: 'Amount' },\n { name: 'cleared', text: 'Cleared', key: 'L' },\n ]),\n ]}\n onSelect={name => {\n switch (name) {\n case 'show':\n onShow([...selectedItems]);\n break;\n case 'duplicate':\n onDuplicate([...selectedItems]);\n break;\n case 'delete':\n onDelete([...selectedItems]);\n break;\n case 'post-transaction':\n case 'skip':\n onScheduleAction(name, selectedItems);\n break;\n case 'view-schedule':\n let firstId = [...selectedItems][0];\n let scheduleId;\n if (isPreviewId(firstId)) {\n let parts = firstId.split('/');\n scheduleId = parts[1];\n } else {\n let trans = getTransaction(firstId);\n scheduleId = trans && trans.schedule;\n }\n\n if (scheduleId) {\n pushModal(`/schedule/edit/${scheduleId}`);\n }\n break;\n case 'link-schedule':\n pushModal('/schedule/link', {\n transactionIds: [...selectedItems],\n });\n break;\n case 'unlink-schedule':\n onUnlink([...selectedItems]);\n break;\n case 'create-rule':\n onCreateRule([...selectedItems]);\n break;\n default:\n onEdit(name, [...selectedItems]);\n }\n }}\n />\n );\n}\n","import * as React from 'react';\nconst SvgArrowButtonRight1 = props => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n d=\"M13.584 12a2.643 2.643 0 0 1-.775 1.875l-9.541 9.541a1.768 1.768 0 0 1-2.5-2.5l8.739-8.739a.25.25 0 0 0 0-.354L.768 3.084a1.768 1.768 0 0 1 2.5-2.5l9.541 9.541A2.643 2.643 0 0 1 13.584 12Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M23.75 12a2.643 2.643 0 0 1-.775 1.875l-9.541 9.541a1.768 1.768 0 0 1-2.5-2.5l8.739-8.739a.25.25 0 0 0 0-.354l-8.739-8.739a1.768 1.768 0 0 1 2.5-2.5l9.541 9.541A2.643 2.643 0 0 1 23.75 12Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\nexport default SvgArrowButtonRight1;\n","import React from 'react';\n\nimport { useCachedSchedules } from 'loot-core/src/client/data-hooks/schedules';\nimport q from 'loot-core/src/client/query-helpers';\n\nimport { useSelectedItems } from '../../hooks/useSelected';\nimport ArrowButtonRight1 from '../../icons/v2/ArrowButtonRight1';\nimport { colors } from '../../style';\nimport Button from '../common/Button';\nimport Text from '../common/Text';\nimport View from '../common/View';\nimport PrivacyFilter from '../PrivacyFilter';\nimport CellValue from '../spreadsheet/CellValue';\nimport format from '../spreadsheet/format';\nimport useSheetValue from '../spreadsheet/useSheetValue';\nimport { isPreviewId } from '../transactions/TransactionsTable';\n\nfunction DetailedBalance({ name, balance }) {\n return (\n <Text\n style={{\n marginLeft: 15,\n backgroundColor: colors.n9,\n borderRadius: 4,\n padding: '4px 6px',\n color: colors.n5,\n }}\n >\n {name}{' '}\n <PrivacyFilter>\n <Text style={{ fontWeight: 600 }}>{format(balance, 'financial')}</Text>\n </PrivacyFilter>\n </Text>\n );\n}\n\nfunction SelectedBalance({ selectedItems, account }) {\n let name = `selected-balance-${[...selectedItems].join('-')}`;\n\n let rows = useSheetValue({\n name,\n query: q('transactions')\n .filter({\n id: { $oneof: [...selectedItems] },\n parent_id: { $oneof: [...selectedItems] },\n })\n .select('id'),\n });\n let ids = new Set((rows || []).map(r => r.id));\n\n let finalIds = [...selectedItems].filter(id => !ids.has(id));\n let balance = useSheetValue({\n name: name + '-sum',\n query: q('transactions')\n .filter({ id: { $oneof: finalIds } })\n .options({ splits: 'all' })\n .calculate({ $sum: '$amount' }),\n });\n\n let scheduleBalance = null;\n let scheduleData = useCachedSchedules();\n let schedules = scheduleData ? scheduleData.schedules : [];\n let previewIds = [...selectedItems]\n .filter(id => isPreviewId(id))\n .map(id => id.slice(8));\n for (let s of schedules) {\n if (previewIds.includes(s.id)) {\n if (!account || account.id === s._account) {\n scheduleBalance += s._amount;\n } else {\n scheduleBalance -= s._amount;\n }\n }\n }\n\n if (balance == null) {\n if (scheduleBalance == null) {\n return null;\n } else {\n balance = scheduleBalance;\n }\n } else if (scheduleBalance != null) {\n balance += scheduleBalance;\n }\n\n return <DetailedBalance name=\"Selected balance:\" balance={balance} />;\n}\n\nfunction MoreBalances({ balanceQuery }) {\n let cleared = useSheetValue({\n name: balanceQuery.name + '-cleared',\n query: balanceQuery.query.filter({ cleared: true }),\n });\n let uncleared = useSheetValue({\n name: balanceQuery.name + '-uncleared',\n query: balanceQuery.query.filter({ cleared: false }),\n });\n\n return (\n <View style={{ flexDirection: 'row' }}>\n <DetailedBalance name=\"Cleared total:\" balance={cleared} />\n <DetailedBalance name=\"Uncleared total:\" balance={uncleared} />\n </View>\n );\n}\n\nexport function Balances({\n balanceQuery,\n showExtraBalances,\n onToggleExtraBalances,\n account,\n}) {\n let selectedItems = useSelectedItems();\n\n return (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n marginTop: -5,\n marginLeft: -5,\n }}\n >\n <Button\n data-testid=\"account-balance\"\n type=\"bare\"\n onClick={onToggleExtraBalances}\n style={{\n '& svg': {\n opacity: selectedItems.size > 0 || showExtraBalances ? 1 : 0,\n },\n '&:hover svg': { opacity: 1 },\n }}\n >\n <CellValue\n binding={{ ...balanceQuery, value: 0 }}\n type=\"financial\"\n style={{ fontSize: 22, fontWeight: 400 }}\n getStyle={value => ({\n color: value < 0 ? colors.r5 : value > 0 ? colors.g5 : colors.n8,\n })}\n privacyFilter={{\n blurIntensity: 5,\n }}\n />\n\n <ArrowButtonRight1\n style={{\n width: 10,\n height: 10,\n marginLeft: 10,\n color: colors.n5,\n transform: showExtraBalances ? 'rotateZ(180deg)' : 'rotateZ(0)',\n }}\n />\n </Button>\n {showExtraBalances && <MoreBalances balanceQuery={balanceQuery} />}\n\n {selectedItems.size > 0 && (\n <SelectedBalance selectedItems={selectedItems} account={account} />\n )}\n </View>\n );\n}\n","import React from 'react';\n\nimport * as queries from 'loot-core/src/client/queries';\nimport { currencyToInteger } from 'loot-core/src/shared/util';\n\nimport CheckCircle1 from '../../icons/v2/CheckCircle1';\nimport { styles, colors } from '../../style';\nimport Button from '../common/Button';\nimport InitialFocus from '../common/InitialFocus';\nimport Input from '../common/Input';\nimport Text from '../common/Text';\nimport View from '../common/View';\nimport format from '../spreadsheet/format';\nimport useSheetValue from '../spreadsheet/useSheetValue';\nimport { Tooltip } from '../tooltips';\n\nexport function ReconcilingMessage({\n balanceQuery,\n targetBalance,\n onDone,\n onCreateTransaction,\n}) {\n let cleared = useSheetValue({\n name: balanceQuery.name + '-cleared',\n value: 0,\n query: balanceQuery.query.filter({ cleared: true }),\n });\n let targetDiff = targetBalance - cleared;\n\n return (\n <View\n style={{\n flexDirection: 'row',\n alignSelf: 'center',\n backgroundColor: 'white',\n ...styles.shadow,\n borderRadius: 4,\n marginTop: 5,\n marginBottom: 15,\n padding: 10,\n }}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n {targetDiff === 0 ? (\n <View\n style={{\n color: colors.g4,\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <CheckCircle1\n style={{\n width: 13,\n height: 13,\n color: colors.g5,\n marginRight: 3,\n }}\n />\n All reconciled!\n </View>\n ) : (\n <View style={{ color: colors.n3 }}>\n <Text style={{ fontStyle: 'italic', textAlign: 'center' }}>\n Your cleared balance{' '}\n <strong>{format(cleared, 'financial')}</strong> needs{' '}\n <strong>\n {(targetDiff > 0 ? '+' : '') + format(targetDiff, 'financial')}\n </strong>{' '}\n to match\n <br /> your bank’s balance of{' '}\n <Text style={{ fontWeight: 700 }}>\n {format(targetBalance, 'financial')}\n </Text>\n </Text>\n </View>\n )}\n <View style={{ marginLeft: 15 }}>\n <Button type=\"primary\" onClick={onDone}>\n Done Reconciling\n </Button>\n </View>\n {targetDiff !== 0 && (\n <View style={{ marginLeft: 15 }}>\n <Button onClick={() => onCreateTransaction(targetDiff)}>\n Create Reconciliation Transaction\n </Button>\n </View>\n )}\n </View>\n </View>\n );\n}\n\nexport function ReconcileTooltip({ account, onReconcile, onClose }) {\n let balance = useSheetValue(queries.accountBalance(account));\n\n function onSubmit(e) {\n e.preventDefault();\n let input = e.target.elements[0];\n let amount = currencyToInteger(input.value);\n if (amount != null) {\n onReconcile(amount == null ? balance : amount);\n onClose();\n } else {\n input.select();\n }\n }\n\n return (\n <Tooltip position=\"bottom-right\" width={275} onClose={onClose}>\n <View style={{ padding: '5px 8px' }}>\n <Text>\n Enter the current balance of your bank account that you want to\n reconcile with:\n </Text>\n <form onSubmit={onSubmit}>\n {balance != null && (\n <InitialFocus>\n <Input\n defaultValue={format(balance, 'financial')}\n style={{ margin: '7px 0' }}\n />\n </InitialFocus>\n )}\n <Button type=\"primary\">Reconcile</Button>\n </form>\n </View>\n </Tooltip>\n );\n}\n","import React, { useState, useRef } from 'react';\n\nimport useSyncServerStatus from '../../hooks/useSyncServerStatus';\nimport AnimatedLoading from '../../icons/AnimatedLoading';\nimport Add from '../../icons/v1/Add';\nimport ArrowsExpand3 from '../../icons/v2/ArrowsExpand3';\nimport ArrowsShrink3 from '../../icons/v2/ArrowsShrink3';\nimport DownloadThickBottom from '../../icons/v2/DownloadThickBottom';\nimport Pencil1 from '../../icons/v2/Pencil1';\nimport { styles, colors } from '../../style';\nimport AnimatedRefresh from '../AnimatedRefresh';\nimport Button from '../common/Button';\nimport InitialFocus from '../common/InitialFocus';\nimport Input from '../common/Input';\nimport Menu from '../common/Menu';\nimport MenuButton from '../common/MenuButton';\nimport MenuTooltip from '../common/MenuTooltip';\nimport Search from '../common/Search';\nimport Stack from '../common/Stack';\nimport View from '../common/View';\nimport { FilterButton } from '../filters/FiltersMenu';\nimport { FiltersStack } from '../filters/SavedFilters';\nimport { KeyHandlers } from '../KeyHandlers';\nimport NotesButton from '../NotesButton';\nimport { SelectedTransactionsButton } from '../transactions/SelectedTransactions';\nimport { useSplitsExpanded } from '../transactions/TransactionsTable';\n\nimport { Balances } from './Balance';\nimport { ReconcilingMessage, ReconcileTooltip } from './Reconcile';\n\nexport function AccountHeader({\n tableRef,\n editingName,\n isNameEditable,\n workingHard,\n accountName,\n account,\n filterId,\n filtersList,\n accountsSyncing,\n accounts,\n transactions,\n showBalances,\n showExtraBalances,\n showCleared,\n showEmptyMessage,\n balanceQuery,\n reconcileAmount,\n canCalculateBalance,\n isSorted,\n search,\n filters,\n conditionsOp,\n savePrefs,\n onSearch,\n onAddTransaction,\n onShowTransactions,\n onDoneReconciling,\n onCreateReconciliationTransaction,\n onToggleExtraBalances,\n onSaveName,\n onExposeName,\n onSync,\n onImport,\n onMenuSelect,\n onReconcile,\n onBatchDelete,\n onBatchDuplicate,\n onBatchEdit,\n onBatchUnlink,\n onCreateRule,\n onApplyFilter,\n onUpdateFilter,\n onClearFilters,\n onReloadSavedFilter,\n onCondOpChange,\n onDeleteFilter,\n onScheduleAction,\n}) {\n let [menuOpen, setMenuOpen] = useState(false);\n let searchInput = useRef(null);\n let splitsExpanded = useSplitsExpanded();\n\n let canSync = account && account.account_id;\n if (!account) {\n // All accounts - check for any syncable account\n canSync = !!accounts.find(account => !!account.account_id);\n }\n\n function onToggleSplits() {\n if (tableRef.current) {\n splitsExpanded.dispatch({\n type: 'switch-mode',\n id: tableRef.current.getScrolledItem(),\n });\n\n savePrefs({\n 'expand-splits': !(splitsExpanded.state.mode === 'expand'),\n });\n }\n }\n\n return (\n <>\n <KeyHandlers\n keys={{\n 'ctrl+f, cmd+f': () => {\n if (searchInput.current) {\n searchInput.current.focus();\n }\n },\n }}\n />\n\n <View style={[styles.pageContent, { paddingBottom: 10, flexShrink: 0 }]}>\n <View style={{ marginTop: 2, alignItems: 'flex-start' }}>\n <View>\n {editingName ? (\n <InitialFocus>\n <Input\n defaultValue={accountName}\n onEnter={e => onSaveName(e.target.value)}\n onBlur={() => onExposeName(false)}\n style={{\n fontSize: 25,\n fontWeight: 500,\n marginTop: -5,\n marginBottom: -2,\n marginLeft: -5,\n }}\n />\n </InitialFocus>\n ) : isNameEditable ? (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n gap: 3,\n '& .hover-visible': {\n opacity: 0,\n transition: 'opacity .25s',\n },\n '&:hover .hover-visible': {\n opacity: 1,\n },\n }}\n >\n <View\n style={{\n fontSize: 25,\n fontWeight: 500,\n marginRight: 5,\n marginBottom: 5,\n }}\n data-testid=\"account-name\"\n >\n {account && account.closed\n ? 'Closed: ' + accountName\n : accountName}\n </View>\n\n {account && <NotesButton id={`account-${account.id}`} />}\n <Button\n type=\"bare\"\n className=\"hover-visible\"\n onClick={() => onExposeName(true)}\n >\n <Pencil1\n style={{\n width: 11,\n height: 11,\n color: colors.n8,\n }}\n />\n </Button>\n </View>\n ) : (\n <View\n style={{ fontSize: 25, fontWeight: 500, marginBottom: 5 }}\n data-testid=\"account-name\"\n >\n {account && account.closed\n ? 'Closed: ' + accountName\n : accountName}\n </View>\n )}\n </View>\n </View>\n\n <Balances\n balanceQuery={balanceQuery}\n showExtraBalances={showExtraBalances}\n onToggleExtraBalances={onToggleExtraBalances}\n account={account}\n />\n\n <Stack\n spacing={2}\n direction=\"row\"\n align=\"center\"\n style={{ marginTop: 12 }}\n >\n {((account && !account.closed) || canSync) && (\n <Button type=\"bare\" onClick={canSync ? onSync : onImport}>\n {canSync ? (\n <>\n <AnimatedRefresh\n width={13}\n height={13}\n animating={\n (account && accountsSyncing === account.name) ||\n accountsSyncing === '__all'\n }\n style={{ marginRight: 4 }}\n />{' '}\n Sync\n </>\n ) : (\n <>\n <DownloadThickBottom\n width={13}\n height={13}\n style={{ marginRight: 4 }}\n />{' '}\n Import\n </>\n )}\n </Button>\n )}\n {!showEmptyMessage && (\n <Button type=\"bare\" onClick={onAddTransaction}>\n <Add width={10} height={10} style={{ marginRight: 3 }} /> Add New\n </Button>\n )}\n <View style={{ flexShrink: 0 }}>\n <FilterButton onApply={onApplyFilter} />\n </View>\n <View style={{ flex: 1 }} />\n <Search\n placeholder=\"Search\"\n value={search}\n onChange={onSearch}\n inputRef={searchInput}\n />\n {workingHard ? (\n <View>\n <AnimatedLoading\n color={colors.n1}\n style={{ width: 16, height: 16 }}\n />\n </View>\n ) : (\n <SelectedTransactionsButton\n getTransaction={id => transactions.find(t => t.id === id)}\n onShow={onShowTransactions}\n onDuplicate={onBatchDuplicate}\n onDelete={onBatchDelete}\n onEdit={onBatchEdit}\n onUnlink={onBatchUnlink}\n onCreateRule={onCreateRule}\n onScheduleAction={onScheduleAction}\n />\n )}\n <Button\n type=\"bare\"\n disabled={search !== '' || filters.length > 0}\n style={{ padding: 6, marginLeft: 10 }}\n onClick={onToggleSplits}\n title={\n splitsExpanded.state.mode === 'collapse'\n ? 'Collapse split transactions'\n : 'Expand split transactions'\n }\n >\n {splitsExpanded.state.mode === 'collapse' ? (\n <ArrowsShrink3 style={{ width: 14, height: 14 }} />\n ) : (\n <ArrowsExpand3 style={{ width: 14, height: 14 }} />\n )}\n </Button>\n {account ? (\n <View>\n <MenuButton onClick={() => setMenuOpen(true)} />\n\n {menuOpen && (\n <AccountMenu\n account={account}\n canSync={canSync}\n canShowBalances={canCalculateBalance()}\n isSorted={isSorted}\n showBalances={showBalances}\n showCleared={showCleared}\n onMenuSelect={item => {\n setMenuOpen(false);\n onMenuSelect(item);\n }}\n onReconcile={onReconcile}\n onClose={() => setMenuOpen(false)}\n />\n )}\n </View>\n ) : (\n <View>\n <MenuButton onClick={() => setMenuOpen(true)} />\n\n {menuOpen && (\n <CategoryMenu\n onMenuSelect={item => {\n setMenuOpen(false);\n onMenuSelect(item);\n }}\n onClose={() => setMenuOpen(false)}\n isSorted={isSorted}\n />\n )}\n </View>\n )}\n </Stack>\n\n {filters && filters.length > 0 && (\n <FiltersStack\n filters={filters}\n conditionsOp={conditionsOp}\n onUpdateFilter={onUpdateFilter}\n onDeleteFilter={onDeleteFilter}\n onClearFilters={onClearFilters}\n onReloadSavedFilter={onReloadSavedFilter}\n filterId={filterId}\n filtersList={filtersList}\n onCondOpChange={onCondOpChange}\n />\n )}\n </View>\n {reconcileAmount != null && (\n <ReconcilingMessage\n targetBalance={reconcileAmount}\n balanceQuery={balanceQuery}\n onDone={onDoneReconciling}\n onCreateTransaction={onCreateReconciliationTransaction}\n />\n )}\n </>\n );\n}\n\nfunction AccountMenu({\n account,\n canSync,\n showBalances,\n canShowBalances,\n showCleared,\n onClose,\n isSorted,\n onReconcile,\n onMenuSelect,\n}) {\n let [tooltip, setTooltip] = useState('default');\n const syncServerStatus = useSyncServerStatus();\n\n return tooltip === 'reconcile' ? (\n <ReconcileTooltip\n account={account}\n onClose={onClose}\n onReconcile={onReconcile}\n />\n ) : (\n <MenuTooltip width={200} onClose={onClose}>\n <Menu\n onMenuSelect={item => {\n if (item === 'reconcile') {\n setTooltip('reconcile');\n } else {\n onMenuSelect(item);\n }\n }}\n items={[\n isSorted && {\n name: 'remove-sorting',\n text: 'Remove all Sorting',\n },\n canShowBalances && {\n name: 'toggle-balance',\n text: (showBalances ? 'Hide' : 'Show') + ' Running Balance',\n },\n {\n name: 'toggle-cleared',\n text: (showCleared ? 'Hide' : 'Show') + ' “Cleared” Checkboxes',\n },\n { name: 'export', text: 'Export' },\n { name: 'reconcile', text: 'Reconcile' },\n account &&\n !account.closed &&\n (canSync\n ? {\n name: 'unlink',\n text: 'Unlink Account',\n }\n : syncServerStatus === 'online' && {\n name: 'link',\n text: 'Link Account',\n }),\n account.closed\n ? { name: 'reopen', text: 'Reopen Account' }\n : { name: 'close', text: 'Close Account' },\n ].filter(x => x)}\n />\n </MenuTooltip>\n );\n}\n\nfunction CategoryMenu({ onClose, onMenuSelect, isSorted }) {\n return (\n <MenuTooltip width={200} onClose={onClose}>\n <Menu\n onMenuSelect={item => {\n onMenuSelect(item);\n }}\n items={[\n isSorted && {\n name: 'remove-sorting',\n text: 'Remove all Sorting',\n },\n { name: 'export', text: 'Export' },\n ]}\n />\n </MenuTooltip>\n );\n}\n","import React, { PureComponent, createRef, useMemo } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { Navigate, useParams, useLocation, useMatch } from 'react-router-dom';\n\nimport { debounce } from 'debounce';\nimport { bindActionCreators } from 'redux';\n\nimport * as actions from 'loot-core/src/client/actions';\nimport { useFilters } from 'loot-core/src/client/data-hooks/filters';\nimport {\n SchedulesProvider,\n useCachedSchedules,\n} from 'loot-core/src/client/data-hooks/schedules';\nimport * as queries from 'loot-core/src/client/queries';\nimport q, { runQuery, pagedQuery } from 'loot-core/src/client/query-helpers';\nimport { send, listen } from 'loot-core/src/platform/client/fetch';\nimport { currentDay } from 'loot-core/src/shared/months';\nimport {\n deleteTransaction,\n updateTransaction,\n realizeTempTransactions,\n ungroupTransaction,\n ungroupTransactions,\n} from 'loot-core/src/shared/transactions';\nimport { applyChanges, groupById } from 'loot-core/src/shared/util';\n\nimport { authorizeBank } from '../../gocardless';\nimport { SelectedProviderWithItems } from '../../hooks/useSelected';\nimport { styles, colors } from '../../style';\nimport { useActiveLocation } from '../ActiveLocation';\nimport Button from '../common/Button';\nimport Text from '../common/Text';\nimport View from '../common/View';\nimport TransactionList from '../transactions/TransactionList';\nimport {\n SplitsExpandedProvider,\n useSplitsExpanded,\n} from '../transactions/TransactionsTable';\n\nimport { AccountHeader } from './Header';\n\nfunction EmptyMessage({ onAdd }) {\n return (\n <View\n style={{\n backgroundColor: 'white',\n flex: 1,\n alignItems: 'center',\n borderTopWidth: 1,\n borderColor: colors.n9,\n }}\n >\n <View\n style={{\n width: 550,\n marginTop: 75,\n fontSize: 15,\n alignItems: 'center',\n }}\n >\n <Text style={{ textAlign: 'center', lineHeight: '1.4em' }}>\n For Actual to be useful, you need to <strong>add an account</strong>.\n You can link an account to automatically download transactions, or\n manage it locally yourself.\n </Text>\n\n <Button type=\"primary\" style={{ marginTop: 20 }} onClick={onAdd}>\n Add account\n </Button>\n\n <View style={{ marginTop: 20, fontSize: 13, color: colors.n5 }}>\n In the future, you can add accounts from the sidebar.\n </View>\n </View>\n </View>\n );\n}\n\nfunction AllTransactions({\n account = {},\n transactions,\n balances,\n showBalances,\n filtered,\n children,\n}) {\n const { id: accountId } = account;\n let scheduleData = useCachedSchedules();\n\n transactions ??= [];\n\n let schedules = useMemo(\n () =>\n scheduleData\n ? scheduleData.schedules.filter(\n s =>\n !s.completed &&\n ['due', 'upcoming', 'missed'].includes(\n scheduleData.statuses.get(s.id),\n ),\n )\n : [],\n [scheduleData],\n );\n\n let prependTransactions = useMemo(() => {\n return 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 _inverse: accountId !== schedule._account,\n }));\n }, [schedules, accountId]);\n\n let runningBalance = useMemo(() => {\n if (!showBalances) {\n return 0;\n }\n\n return balances && transactions?.length > 0\n ? balances[transactions[0].id]?.balance ?? 0\n : 0;\n }, [showBalances, balances, transactions]);\n\n let prependBalances = useMemo(() => {\n if (!showBalances) {\n return null;\n }\n\n // Reverse so we can calculate from earliest upcoming schedule.\n let scheduledBalances = [...prependTransactions]\n .reverse()\n .map(scheduledTransaction => {\n let amount =\n (scheduledTransaction._inverse ? -1 : 1) *\n scheduledTransaction.amount;\n return {\n balance: (runningBalance += amount),\n id: scheduledTransaction.id,\n };\n });\n return groupById(scheduledBalances);\n }, [showBalances, prependTransactions, runningBalance]);\n\n let allTransactions = useMemo(() => {\n // Don't prepend scheduled transactions if we are filtering\n if (!filtered && prependTransactions.length > 0) {\n return prependTransactions.concat(transactions);\n }\n return transactions;\n }, [filtered, prependTransactions, transactions]);\n\n let allBalances = useMemo(() => {\n // Don't prepend scheduled transactions if we are filtering\n if (!filtered && prependBalances && balances) {\n return { ...prependBalances, ...balances };\n }\n return balances;\n }, [filtered, prependBalances, balances]);\n\n if (scheduleData == null) {\n return children(transactions, balances);\n }\n return children(allTransactions, allBalances);\n}\n\nfunction getField(field) {\n switch (field) {\n case 'account':\n return 'account.name';\n case 'payee':\n return 'payee.name';\n case 'category':\n return 'category.name';\n case 'payment':\n return 'amount';\n case 'deposit':\n return 'amount';\n default:\n return field;\n }\n}\n\nclass AccountInternal extends PureComponent {\n constructor(props) {\n super(props);\n this.paged = null;\n this.table = createRef();\n this.animated = true;\n\n this.state = {\n search: '',\n filters: [],\n loading: true,\n workingHard: false,\n reconcileAmount: null,\n transactions: [],\n transactionsCount: 0,\n showBalances: props.showBalances,\n balances: null,\n showCleared: props.showCleared,\n editingName: false,\n isAdding: false,\n latestDate: null,\n filterId: [],\n conditionsOp: 'and',\n sort: [],\n };\n }\n\n async componentDidMount() {\n let maybeRefetch = tables => {\n if (\n tables.includes('transactions') ||\n tables.includes('category_mapping') ||\n tables.includes('payee_mapping')\n ) {\n return this.refetchTransactions();\n }\n };\n\n let onUndo = async ({ tables, messages, undoTag }) => {\n await maybeRefetch(tables);\n\n // If all the messages are dealing with transactions, find the\n // first message referencing a non-deleted row so that we can\n // highlight the row\n //\n let focusId;\n if (\n messages.every(msg => msg.dataset === 'transactions') &&\n !messages.find(msg => msg.column === 'tombstone')\n ) {\n let focusableMsgs = messages.filter(\n msg =>\n msg.dataset === 'transactions' && !(msg.column === 'tombstone'),\n );\n\n focusId = focusableMsgs.length === 1 ? focusableMsgs[0].row : null;\n\n // Highlight the transactions\n // this.table && this.table.highlight(focusableMsgs.map(msg => msg.row));\n }\n\n if (this.table.current) {\n this.table.current.edit(null);\n\n // Focus a transaction if applicable. There is a chance if the\n // user navigated away that focusId is a transaction that has\n // been \"paged off\" and we won't focus it. That's ok, we just\n // do our best.\n if (focusId) {\n this.table.current.scrollTo(focusId);\n }\n }\n\n this.props.setLastUndoState(null);\n };\n\n let unlistens = [listen('undo-event', onUndo)];\n\n this.unlisten = () => {\n unlistens.forEach(unlisten => unlisten());\n };\n\n // Important that any async work happens last so that the\n // listeners are set up synchronously\n if (this.props.categoryGroups.length === 0) {\n await this.props.getCategories();\n }\n await this.props.initiallyLoadPayees();\n await this.fetchTransactions();\n\n // If there is a pending undo, apply it immediately (this happens\n // when an undo changes the location to this page)\n if (this.props.lastUndoState && this.props.lastUndoState.current) {\n onUndo(this.props.lastUndoState.current);\n }\n }\n\n componentDidUpdate(prevProps) {\n // If the active account changes - close the transaction entry mode\n if (this.state.isAdding && this.props.accountId !== prevProps.accountId) {\n this.setState({ isAdding: false });\n }\n\n // If the user was on a different screen and is now coming back to\n // the transactions, automatically refresh the transaction to make\n // sure we have updated state\n if (prevProps.modalShowing && !this.props.modalShowing) {\n // This is clearly a hack. Need a better way to track which\n // things are listening to transactions and refetch\n // automatically (use ActualQL?)\n setTimeout(() => {\n this.refetchTransactions();\n }, 100);\n }\n\n //Resest sort/filter/search on account change\n if (this.props.accountId !== prevProps.accountId) {\n this.setState({ sort: [], search: '', filters: [] });\n }\n }\n\n componentWillUnmount() {\n if (this.unlisten) {\n this.unlisten();\n }\n if (this.paged) {\n this.paged.unsubscribe();\n }\n }\n\n fetchAllIds = async () => {\n let { data } = await runQuery(this.paged.getQuery().select('id'));\n // Remember, this is the `grouped` split type so we need to deal\n // with the `subtransactions` property\n return data.reduce((arr, t) => {\n arr.push(t.id);\n t.subtransactions.forEach(sub => arr.push(sub.id));\n return arr;\n }, []);\n };\n\n refetchTransactions = async () => {\n this.paged?.run();\n };\n\n fetchTransactions = () => {\n let query = this.makeRootQuery();\n this.rootQuery = this.currentQuery = query;\n this.updateQuery(query);\n\n if (this.props.accountId) {\n this.props.markAccountRead(this.props.accountId);\n }\n };\n\n makeRootQuery = () => {\n let locationState = this.props.location.state;\n let accountId = this.props.accountId;\n\n if (locationState && locationState.filter) {\n return q('transactions')\n .options({ splits: 'grouped' })\n .filter({\n 'account.offbudget': false,\n ...locationState.filter,\n });\n }\n\n return queries.makeTransactionsQuery(accountId);\n };\n\n updateQuery(query, isFiltered) {\n if (this.paged) {\n this.paged.unsubscribe();\n }\n\n this.paged = pagedQuery(\n query.select('*'),\n async (data, prevData) => {\n const firstLoad = prevData == null;\n\n if (firstLoad) {\n this.table.current?.setRowAnimation(false);\n\n if (isFiltered) {\n this.props.splitsExpandedDispatch({\n type: 'set-mode',\n mode: 'collapse',\n });\n } else {\n this.props.splitsExpandedDispatch({\n type: 'set-mode',\n mode: this.props.expandSplits ? 'expand' : 'collapse',\n });\n }\n }\n\n this.setState(\n {\n transactions: data,\n transactionCount: this.paged.getTotalCount(),\n transactionsFiltered: isFiltered,\n loading: false,\n workingHard: false,\n balances: this.state.showBalances\n ? await this.calculateBalances()\n : null,\n },\n () => {\n if (firstLoad) {\n this.table.current?.scrollToTop();\n }\n\n setTimeout(() => {\n this.table.current?.setRowAnimation(true);\n }, 0);\n },\n );\n },\n {\n pageCount: 150,\n onlySync: true,\n mapper: ungroupTransactions,\n },\n );\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.accountId !== nextProps.accountId) {\n this.setState(\n {\n editingName: false,\n loading: true,\n search: '',\n showBalances: nextProps.showBalances,\n balances: null,\n showCleared: nextProps.showCleared,\n },\n () => {\n this.fetchTransactions();\n },\n );\n }\n }\n\n onSearch = value => {\n this.paged.unsubscribe();\n this.setState({ search: value }, this.onSearchDone);\n };\n\n onSearchDone = debounce(() => {\n if (this.state.search === '') {\n this.updateQuery(this.currentQuery, this.state.filters.length > 0);\n } else {\n this.updateQuery(\n queries.makeTransactionSearchQuery(\n this.currentQuery,\n this.state.search,\n this.props.dateFormat,\n ),\n true,\n );\n }\n }, 150);\n\n onSync = async () => {\n const accountId = this.props.accountId;\n const account = this.props.accounts.find(acct => acct.id === accountId);\n\n await this.props.syncAndDownload(account ? account.id : null);\n };\n\n onImport = async () => {\n const accountId = this.props.accountId;\n const account = this.props.accounts.find(acct => acct.id === accountId);\n\n if (account) {\n const res = await window.Actual.openFileDialog({\n filters: [\n {\n name: 'Financial Files',\n extensions: ['qif', 'ofx', 'qfx', 'csv', 'tsv'],\n },\n ],\n });\n\n if (res) {\n this.props.pushModal('import-transactions', {\n accountId,\n filename: res[0],\n onImported: didChange => {\n if (didChange) {\n this.fetchTransactions();\n }\n },\n });\n }\n }\n };\n\n onExport = async accountName => {\n let exportedTransactions = await send('transactions-export-query', {\n query: this.currentQuery.serialize(),\n });\n let normalizedName =\n accountName && accountName.replace(/[()]/g, '').replace(/\\s+/g, '-');\n let filename = `${normalizedName || 'transactions'}.csv`;\n\n window.Actual.saveFile(\n exportedTransactions,\n filename,\n 'Export Transactions',\n );\n };\n\n onTransactionsChange = (newTransaction, data) => {\n // Apply changes to pagedQuery data\n this.paged.optimisticUpdate(\n data => {\n if (newTransaction._deleted) {\n return data.filter(t => t.id !== newTransaction.id);\n } else {\n return data.map(t => {\n return t.id === newTransaction.id ? newTransaction : t;\n });\n }\n },\n mappedData => {\n return data;\n },\n );\n\n this.props.updateNewTransactions(newTransaction.id);\n };\n\n canCalculateBalance = () => {\n let accountId = this.props.accountId;\n let account = this.props.accounts.find(account => account.id === accountId);\n return (\n account &&\n this.state.search === '' &&\n this.state.filters.length === 0 &&\n (this.state.sort.length === 0 ||\n (this.state.sort.field === 'date' &&\n this.state.sort.ascDesc === 'desc'))\n );\n };\n\n async calculateBalances() {\n if (!this.canCalculateBalance()) {\n return null;\n }\n\n let { data } = await runQuery(\n this.paged\n .getQuery()\n .options({ splits: 'none' })\n .select([{ balance: { $sumOver: '$amount' } }]),\n );\n\n return groupById(data);\n }\n\n onAddTransaction = () => {\n this.setState({ isAdding: true });\n };\n\n onExposeName = flag => {\n this.setState({ editingName: flag });\n };\n\n onSaveName = name => {\n if (name.trim().length) {\n const accountId = this.props.accountId;\n const account = this.props.accounts.find(\n account => account.id === accountId,\n );\n this.props.updateAccount({ ...account, name });\n this.setState({ editingName: false });\n }\n };\n\n onToggleExtraBalances = () => {\n let { accountId, showExtraBalances } = this.props;\n let key = 'show-extra-balances-' + accountId || 'all-accounts';\n\n this.props.savePrefs({ [key]: !showExtraBalances });\n };\n\n onMenuSelect = async item => {\n const accountId = this.props.accountId;\n const account = this.props.accounts.find(\n account => account.id === accountId,\n );\n\n switch (item) {\n case 'link':\n authorizeBank(this.props.pushModal, { upgradingAccountId: accountId });\n break;\n case 'unlink':\n this.props.unlinkAccount(accountId);\n break;\n case 'close':\n this.props.openAccountCloseModal(accountId);\n break;\n case 'reopen':\n this.props.reopenAccount(accountId);\n break;\n case 'export':\n const accountName = this.getAccountTitle(account, accountId);\n this.onExport(accountName);\n break;\n case 'toggle-balance':\n if (this.state.showBalances) {\n this.props.savePrefs({ ['show-balances-' + accountId]: false });\n this.setState({ showBalances: false, balances: null });\n } else {\n this.props.savePrefs({ ['show-balances-' + accountId]: true });\n this.setState(\n {\n transactions: [],\n transactionCount: 0,\n filters: [],\n search: '',\n sort: [],\n showBalances: true,\n },\n () => {\n this.fetchTransactions();\n },\n );\n }\n break;\n case 'remove-sorting': {\n this.setState({ sort: [] }, () => {\n let filters = this.state.filters;\n if (filters.length > 0) {\n this.applyFilters([...filters]);\n } else {\n this.fetchTransactions();\n }\n if (this.state.search !== '') {\n this.onSearch(this.state.search);\n }\n });\n break;\n }\n case 'toggle-cleared':\n if (this.state.showCleared) {\n this.props.savePrefs({ ['hide-cleared-' + accountId]: true });\n this.setState({ showCleared: false });\n } else {\n this.props.savePrefs({ ['hide-cleared-' + accountId]: false });\n this.setState({ showCleared: true });\n }\n break;\n default:\n }\n };\n\n getAccountTitle(account, id) {\n let { filterName } = this.props.location.state || {};\n\n if (filterName) {\n return filterName;\n }\n\n if (!account) {\n if (id === 'budgeted') {\n return 'Budgeted Accounts';\n } else if (id === 'offbudget') {\n return 'Off Budget Accounts';\n } else if (id === 'uncategorized') {\n return 'Uncategorized';\n } else if (!id) {\n return 'All Accounts';\n }\n return null;\n }\n\n return account.name;\n }\n\n getBalanceQuery(account, id) {\n return {\n name: `balance-query-${id}`,\n query: this.makeRootQuery().calculate({ $sum: '$amount' }),\n };\n }\n\n isNew = id => {\n return this.props.newTransactions.includes(id);\n };\n\n isMatched = id => {\n return this.props.matchedTransactions.includes(id);\n };\n\n onCreatePayee = name => {\n let trimmed = name.trim();\n if (trimmed !== '') {\n return this.props.createPayee(name);\n }\n return null;\n };\n\n onReconcile = balance => {\n this.setState({ reconcileAmount: balance });\n };\n\n onDoneReconciling = () => {\n this.setState({ reconcileAmount: null });\n };\n\n onCreateReconciliationTransaction = async diff => {\n // Create a new reconciliation transaction\n const reconciliationTransactions = realizeTempTransactions([\n {\n id: 'temp',\n account: this.props.accountId,\n cleared: true,\n amount: diff,\n date: currentDay(),\n notes: 'Reconciliation balance adjustment',\n },\n ]);\n\n // Optimistic UI: update the transaction list before sending the data to the database\n this.setState({\n transactions: [...this.state.transactions, ...reconciliationTransactions],\n });\n\n // sync the reconciliation transaction\n await send('transactions-batch-update', {\n added: reconciliationTransactions,\n });\n await this.refetchTransactions();\n };\n\n onShowTransactions = async ids => {\n this.onApplyFilter({\n customName: 'Selected transactions',\n filter: { id: { $oneof: ids } },\n });\n };\n\n onBatchEdit = async (name, ids) => {\n let onChange = async (name, value) => {\n this.setState({ workingHard: true });\n\n let { data } = await runQuery(\n q('transactions')\n .filter({ id: { $oneof: ids } })\n .select('*')\n .options({ splits: 'grouped' }),\n );\n let transactions = ungroupTransactions(data);\n\n let changes = { deleted: [], updated: [] };\n\n // Cleared is a special case right now\n if (name === 'cleared') {\n // Clear them if any are uncleared, otherwise unclear them\n value = !!transactions.find(t => !t.cleared);\n }\n\n const idSet = new Set(ids);\n\n transactions.forEach(trans => {\n if (!idSet.has(trans.id)) {\n // Skip transactions which aren't actually selected, since the query\n // above also retrieves the siblings & parent of any selected splits.\n return;\n }\n\n let { diff } = updateTransaction(transactions, {\n ...trans,\n [name]: value,\n });\n\n // TODO: We need to keep an updated list of transactions so\n // the logic in `updateTransaction`, particularly about\n // updating split transactions, works. This isn't ideal and we\n // should figure something else out\n transactions = applyChanges(diff, transactions);\n\n changes.deleted = changes.deleted\n ? changes.deleted.concat(diff.deleted)\n : diff.deleted;\n changes.updated = changes.updated\n ? changes.updated.concat(diff.updated)\n : diff.updated;\n changes.added = changes.added\n ? changes.added.concat(diff.added)\n : diff.added;\n });\n\n await send('transactions-batch-update', changes);\n await this.refetchTransactions();\n\n if (this.table.current) {\n this.table.current.edit(transactions[0].id, 'select', false);\n }\n };\n\n if (name === 'cleared') {\n // Cleared just toggles it on/off and it depends on the data\n // loaded. Need to clean this up in the future.\n onChange('cleared', null);\n } else {\n this.props.pushModal('edit-field', { name, onSubmit: onChange });\n }\n };\n\n onBatchDuplicate = async ids => {\n this.setState({ workingHard: true });\n\n let { data } = await runQuery(\n q('transactions')\n .filter({ id: { $oneof: ids } })\n .select('*')\n .options({ splits: 'grouped' }),\n );\n\n let changes = {\n added: data\n .reduce((newTransactions, trans) => {\n return newTransactions.concat(\n realizeTempTransactions(ungroupTransaction(trans)),\n );\n }, [])\n .map(({ sort_order, ...trans }) => ({ ...trans })),\n };\n\n await send('transactions-batch-update', changes);\n\n await this.refetchTransactions();\n };\n\n onBatchDelete = async ids => {\n this.setState({ workingHard: true });\n\n let { data } = await runQuery(\n q('transactions')\n .filter({ id: { $oneof: ids } })\n .select('*')\n .options({ splits: 'grouped' }),\n );\n let transactions = ungroupTransactions(data);\n\n let idSet = new Set(ids);\n let changes = { deleted: [], updated: [] };\n\n transactions.forEach(trans => {\n let parentId = trans.parent_id;\n\n // First, check if we're actually deleting this transaction by\n // checking `idSet`. Then, we don't need to do anything if it's\n // a child transaction and the parent is already being deleted\n if (!idSet.has(trans.id) || (parentId && idSet.has(parentId))) {\n return;\n }\n\n let { diff } = deleteTransaction(transactions, trans.id);\n\n // TODO: We need to keep an updated list of transactions so\n // the logic in `updateTransaction`, particularly about\n // updating split transactions, works. This isn't ideal and we\n // should figure something else out\n transactions = applyChanges(diff, transactions);\n\n changes.deleted = diff.deleted\n ? changes.deleted.concat(diff.deleted)\n : diff.deleted;\n changes.updated = diff.updated\n ? changes.updated.concat(diff.updated)\n : diff.updated;\n });\n\n await send('transactions-batch-update', changes);\n await this.refetchTransactions();\n };\n\n onBatchUnlink = async ids => {\n await send('transactions-batch-update', {\n updated: ids.map(id => ({ id, schedule: null })),\n });\n\n await this.refetchTransactions();\n };\n\n onCreateRule = async ids => {\n let { data } = await runQuery(\n q('transactions')\n .filter({ id: { $oneof: ids } })\n .select('*')\n .options({ splits: 'grouped' }),\n );\n let transactions = ungroupTransactions(data);\n let payeeCondition = transactions[0].imported_payee\n ? {\n field: 'imported_payee',\n op: 'is',\n value: transactions[0].imported_payee,\n type: 'string',\n }\n : {\n field: 'payee',\n op: 'is',\n value: transactions[0].payee,\n type: 'id',\n };\n\n let rule = {\n stage: null,\n conditionsOp: 'and',\n conditions: [payeeCondition],\n actions: [\n {\n op: 'set',\n field: 'category',\n value: transactions[0].category,\n type: 'id',\n },\n ],\n };\n\n this.props.pushModal('edit-rule', { rule });\n };\n\n onCondOpChange = (value, filters) => {\n this.setState({ conditionsOp: value });\n this.setState({ filterId: { ...this.state.filterId, status: 'changed' } });\n this.applyFilters([...filters]);\n if (this.state.search !== '') {\n this.onSearch(this.state.search);\n }\n };\n\n onReloadSavedFilter = (savedFilter, item) => {\n if (item === 'reload') {\n let [getFilter] = this.props.filtersList.filter(\n f => f.id === this.state.filterId.id,\n );\n this.setState({ conditionsOp: getFilter.conditionsOp });\n this.applyFilters([...getFilter.conditions]);\n } else {\n if (savedFilter.status) {\n this.setState({ conditionsOp: savedFilter.conditionsOp });\n this.applyFilters([...savedFilter.conditions]);\n }\n }\n this.setState({ filterId: { ...this.state.filterId, ...savedFilter } });\n };\n\n onClearFilters = () => {\n this.setState({ conditionsOp: 'and' });\n this.setState({ filterId: [] });\n this.applyFilters([]);\n if (this.state.search !== '') {\n this.onSearch(this.state.search);\n }\n };\n\n onUpdateFilter = (oldFilter, updatedFilter) => {\n this.applyFilters(\n this.state.filters.map(f => (f === oldFilter ? updatedFilter : f)),\n );\n this.setState({\n filterId: {\n ...this.state.filterId,\n status: this.state.filterId && 'changed',\n },\n });\n if (this.state.search !== '') {\n this.onSearch(this.state.search);\n }\n };\n\n onDeleteFilter = filter => {\n this.applyFilters(this.state.filters.filter(f => f !== filter));\n if (this.state.filters.length === 1) {\n this.setState({ filterId: [] });\n this.setState({ conditionsOp: 'and' });\n } else {\n this.setState({\n filterId: {\n ...this.state.filterId,\n status: this.state.filterId && 'changed',\n },\n });\n }\n if (this.state.search !== '') {\n this.onSearch(this.state.search);\n }\n };\n\n onApplyFilter = async cond => {\n let filters = this.state.filters;\n if (cond.customName) {\n filters = filters.filter(f => f.customName !== cond.customName);\n }\n if (cond.conditions) {\n this.setState({ filterId: { ...cond, status: 'saved' } });\n this.setState({ conditionsOp: cond.conditionsOp });\n this.applyFilters([...cond.conditions]);\n } else {\n this.setState({\n filterId: {\n ...this.state.filterId,\n status: this.state.filterId && 'changed',\n },\n });\n this.applyFilters([...filters, cond]);\n }\n if (this.state.search !== '') {\n this.onSearch(this.state.search);\n }\n };\n\n onScheduleAction = async (name, ids) => {\n switch (name) {\n case 'post-transaction':\n for (let id of ids) {\n let parts = id.split('/');\n await send('schedule/post-transaction', { id: parts[1] });\n }\n this.refetchTransactions();\n break;\n case 'skip':\n for (let id of ids) {\n let parts = id.split('/');\n await send('schedule/skip-next-date', { id: parts[1] });\n }\n break;\n default:\n }\n };\n\n applyFilters = async conditions => {\n if (conditions.length > 0) {\n let customFilters = conditions\n .filter(cond => !!cond.customName)\n .map(f => f.filter);\n let { filters } = await send('make-filters-from-conditions', {\n conditions: conditions.filter(cond => !cond.customName),\n });\n const conditionsOpKey = this.state.conditionsOp === 'or' ? '$or' : '$and';\n this.currentQuery = this.rootQuery.filter({\n [conditionsOpKey]: [...filters, ...customFilters],\n });\n\n this.setState({ filters: conditions }, () => {\n this.updateQuery(this.currentQuery, true);\n });\n } else {\n this.setState(\n {\n transactions: [],\n transactionCount: 0,\n filters: conditions,\n },\n () => {\n this.fetchTransactions();\n },\n );\n }\n\n if (this.state.sort.length !== 0) {\n this.applySort();\n }\n };\n\n applySort = (field, ascDesc, prevField, prevAscDesc) => {\n let filters = this.state.filters;\n let sortField = getField(!field ? this.state.sort.field : field);\n let sortAscDesc = !ascDesc ? this.state.sort.ascDesc : ascDesc;\n let sortPrevField = getField(\n !prevField ? this.state.sort.prevField : prevField,\n );\n let sortPrevAscDesc = !prevField\n ? this.state.sort.prevAscDesc\n : prevAscDesc;\n\n if (!field) {\n //no sort was made (called by applyFilters)\n this.currentQuery = this.currentQuery.orderBy({\n [sortField]: sortAscDesc,\n });\n } else {\n //sort called directly\n if (filters.length > 0) {\n //if filters already exist then apply them\n this.applyFilters([...filters]);\n this.currentQuery = this.currentQuery.orderBy({\n [sortField]: sortAscDesc,\n });\n } else {\n //no filters exist make new rootquery\n this.currentQuery = this.rootQuery.orderBy({\n [sortField]: sortAscDesc,\n });\n }\n }\n if (sortPrevField) {\n //apply previos sort if it exists\n this.currentQuery = this.currentQuery.orderBy({\n [sortPrevField]: sortPrevAscDesc,\n });\n }\n\n this.updateQuery(this.currentQuery, this.state.filters.length > 0);\n };\n\n onSort = (headerClicked, ascDesc) => {\n let prevField;\n let prevAscDesc;\n //if staying on same column but switching asc/desc\n //then keep prev the same\n if (headerClicked === this.state.sort.field) {\n prevField = this.state.sort.prevField;\n prevAscDesc = this.state.sort.prevAscDesc;\n this.setState({\n sort: {\n ...this.state.sort,\n ascDesc: ascDesc,\n },\n });\n } else {\n //if switching to new column then capture state\n //of current sort column as prev\n prevField = this.state.sort.field;\n prevAscDesc = this.state.sort.ascDesc;\n this.setState({\n sort: {\n field: headerClicked,\n ascDesc: ascDesc,\n prevField: this.state.sort.field,\n prevAscDesc: this.state.sort.ascDesc,\n },\n });\n }\n\n this.applySort(headerClicked, ascDesc, prevField, prevAscDesc);\n if (this.state.search !== '') {\n this.onSearch(this.state.search);\n }\n };\n\n render() {\n let {\n accounts,\n categoryGroups,\n payees,\n dateFormat,\n hideFraction,\n addNotification,\n accountsSyncing,\n replaceModal,\n showExtraBalances,\n accountId,\n categoryId,\n } = this.props;\n let {\n transactions,\n loading,\n workingHard,\n filterId,\n reconcileAmount,\n transactionsFiltered,\n editingName,\n showBalances,\n balances,\n showCleared,\n } = this.state;\n\n let account = accounts.find(account => account.id === accountId);\n const accountName = this.getAccountTitle(account, accountId);\n\n if (!accountName && !loading) {\n // This is probably an account that was deleted, so redirect to\n // all accounts\n return <Navigate to=\"/accounts\" replace />;\n }\n\n let category = categoryGroups\n .flatMap(g => g.categories)\n .find(category => category.id === categoryId);\n\n let showEmptyMessage = !loading && !accountId && accounts.length === 0;\n\n let isNameEditable =\n accountId &&\n accountId !== 'budgeted' &&\n accountId !== 'offbudget' &&\n accountId !== 'uncategorized';\n\n let balanceQuery = this.getBalanceQuery(account, accountId);\n\n return (\n <AllTransactions\n account={account}\n transactions={transactions}\n balances={balances}\n showBalances={showBalances}\n filtered={transactionsFiltered}\n >\n {(allTransactions, allBalances) => (\n <SelectedProviderWithItems\n name=\"transactions\"\n items={allTransactions}\n fetchAllIds={this.fetchAllIds}\n registerDispatch={dispatch => (this.dispatchSelected = dispatch)}\n >\n <View style={[styles.page]}>\n <AccountHeader\n tableRef={this.table}\n editingName={editingName}\n isNameEditable={isNameEditable}\n workingHard={workingHard}\n account={account}\n filterId={filterId}\n filtersList={this.props.filtersList}\n location={this.props.location}\n accountName={accountName}\n accountsSyncing={accountsSyncing}\n accounts={accounts}\n transactions={transactions}\n showBalances={showBalances}\n showExtraBalances={showExtraBalances}\n showCleared={showCleared}\n showEmptyMessage={showEmptyMessage}\n balanceQuery={balanceQuery}\n canCalculateBalance={this.canCalculateBalance}\n isSorted={this.state.sort.length !== 0}\n reconcileAmount={reconcileAmount}\n search={this.state.search}\n filters={this.state.filters}\n conditionsOp={this.state.conditionsOp}\n savePrefs={this.props.savePrefs}\n onSearch={this.onSearch}\n onShowTransactions={this.onShowTransactions}\n onMenuSelect={this.onMenuSelect}\n onAddTransaction={this.onAddTransaction}\n onToggleExtraBalances={this.onToggleExtraBalances}\n onSaveName={this.onSaveName}\n onExposeName={this.onExposeName}\n onReconcile={this.onReconcile}\n onDoneReconciling={this.onDoneReconciling}\n onCreateReconciliationTransaction={\n this.onCreateReconciliationTransaction\n }\n onSync={this.onSync}\n onImport={this.onImport}\n onBatchDelete={this.onBatchDelete}\n onBatchDuplicate={this.onBatchDuplicate}\n onBatchEdit={this.onBatchEdit}\n onBatchUnlink={this.onBatchUnlink}\n onCreateRule={this.onCreateRule}\n onUpdateFilter={this.onUpdateFilter}\n onClearFilters={this.onClearFilters}\n onReloadSavedFilter={this.onReloadSavedFilter}\n onCondOpChange={this.onCondOpChange}\n onDeleteFilter={this.onDeleteFilter}\n onApplyFilter={this.onApplyFilter}\n onScheduleAction={this.onScheduleAction}\n />\n\n <View style={{ flex: 1 }}>\n <TransactionList\n tableRef={this.table}\n account={account}\n transactions={transactions}\n allTransactions={allTransactions}\n animated={this.animated}\n loadMoreTransactions={() =>\n this.paged && this.paged.fetchNext()\n }\n accounts={accounts}\n category={category}\n categoryGroups={categoryGroups}\n payees={payees}\n balances={allBalances}\n showBalances={!!allBalances}\n showCleared={showCleared}\n showAccount={\n !accountId ||\n accountId === 'offbudget' ||\n accountId === 'budgeted' ||\n accountId === 'uncategorized'\n }\n isAdding={this.state.isAdding}\n isNew={this.isNew}\n isMatched={this.isMatched}\n isFiltered={\n this.state.search !== '' || this.state.filters.length > 0\n }\n dateFormat={dateFormat}\n hideFraction={hideFraction}\n addNotification={addNotification}\n renderEmpty={() =>\n showEmptyMessage ? (\n <EmptyMessage onAdd={() => replaceModal('add-account')} />\n ) : !loading ? (\n <View\n style={{\n marginTop: 20,\n textAlign: 'center',\n fontStyle: 'italic',\n }}\n >\n No transactions\n </View>\n ) : null\n }\n onSort={this.onSort}\n sortField={this.state.sort.field}\n ascDesc={this.state.sort.ascDesc}\n onChange={this.onTransactionsChange}\n onRefetch={this.refetchTransactions}\n onRefetchUpToRow={row =>\n this.paged.refetchUpToRow(row, {\n field: 'date',\n order: 'desc',\n })\n }\n onCloseAddTransaction={() =>\n this.setState({ isAdding: false })\n }\n onCreatePayee={this.onCreatePayee}\n />\n </View>\n </View>\n </SelectedProviderWithItems>\n )}\n </AllTransactions>\n );\n }\n}\n\nfunction AccountHack(props) {\n let { dispatch: splitsExpandedDispatch } = useSplitsExpanded();\n let match = useMatch(props.location.pathname);\n\n return (\n <AccountInternal\n {...props}\n match={match}\n splitsExpandedDispatch={splitsExpandedDispatch}\n />\n );\n}\n\nexport default function Account() {\n let params = useParams();\n let location = useLocation();\n let activeLocation = useActiveLocation();\n\n let state = useSelector(state => ({\n newTransactions: state.queries.newTransactions,\n matchedTransactions: state.queries.matchedTransactions,\n accounts: state.queries.accounts,\n failedAccounts: state.account.failedAccounts,\n categoryGroups: state.queries.categories.grouped,\n dateFormat: state.prefs.local.dateFormat || 'MM/dd/yyyy',\n hideFraction: state.prefs.local.hideFraction || false,\n expandSplits: state.prefs.local['expand-splits'],\n showBalances: params.id && state.prefs.local['show-balances-' + params.id],\n showCleared: params.id && !state.prefs.local['hide-cleared-' + params.id],\n showExtraBalances:\n state.prefs.local['show-extra-balances-' + params.id || 'all-accounts'],\n payees: state.queries.payees,\n modalShowing: state.modals.modalStack.length > 0,\n accountsSyncing: state.account.accountsSyncing,\n lastUndoState: state.app.lastUndoState,\n }));\n\n let dispatch = useDispatch();\n let filtersList = useFilters();\n let actionCreators = useMemo(\n () => bindActionCreators(actions, dispatch),\n [dispatch],\n );\n\n let transform = useMemo(() => {\n let filterByAccount = queries.getAccountFilter(params.id, '_account');\n let filterByPayee = queries.getAccountFilter(\n params.id,\n '_payee.transfer_acct',\n );\n\n // Never show schedules on these pages\n if (\n (location.state && location.state.filter) ||\n params.id === 'uncategorized'\n ) {\n filterByAccount = { id: null };\n filterByPayee = { id: null };\n }\n\n return q => {\n q = q.filter({\n $and: [{ '_account.closed': false }],\n $or: [filterByAccount, filterByPayee],\n });\n return q.orderBy({ next_date: 'desc' });\n };\n }, [params.id]);\n\n return (\n <SchedulesProvider transform={transform}>\n <SplitsExpandedProvider\n initialMode={state.expandSplits ? 'collapse' : 'expand'}\n >\n <AccountHack\n {...state}\n {...actionCreators}\n modalShowing={\n state.modalShowing ||\n !!(activeLocation.state && activeLocation.state.parent)\n }\n accountId={params.id}\n categoryId={activeLocation?.state?.filter?.category}\n location={location}\n filtersList={filtersList}\n />\n </SplitsExpandedProvider>\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","import { v4 as uuidv4 } from 'uuid';\n\nimport { last, diffItems, applyChanges } from './util';\n\nexport function isPreviewId(id) {\n return id.indexOf('preview/') !== -1;\n}\n\n// The amount might be null when adding a new transaction\nfunction num(n) {\n return typeof n === 'number' ? n : 0;\n}\n\nfunction SplitTransactionError(total, parent) {\n let difference = num(parent.amount) - total;\n\n return {\n type: 'SplitTransactionError',\n version: 1,\n difference,\n };\n}\n\nexport function makeChild(parent, data) {\n let prefix = parent.id === 'temp' ? 'temp' : '';\n\n return {\n amount: 0,\n ...data,\n payee: data.payee || parent.payee,\n id: data.id ? data.id : prefix + uuidv4(),\n account: parent.account,\n date: parent.date,\n cleared: parent.cleared != null ? parent.cleared : null,\n starting_balance_flag:\n parent.starting_balance_flag != null\n ? parent.starting_balance_flag\n : null,\n is_child: true,\n parent_id: parent.id,\n error: null,\n };\n}\n\nexport function recalculateSplit(trans) {\n // Calculate the new total of split transactions and make sure\n // that it equals the parent amount\n const total = trans.subtransactions.reduce(\n (acc, t) => acc + num(t.amount),\n 0,\n );\n return {\n ...trans,\n error:\n total === num(trans.amount) ? null : SplitTransactionError(total, trans),\n };\n}\n\nfunction findParentIndex(transactions, idx) {\n // This relies on transactions being sorted in a way where parents\n // are always before children, which is enforced in the db layer.\n // Walk backwards and find the last parent;\n while (idx >= 0) {\n let trans = transactions[idx];\n if (trans.is_parent) {\n return idx;\n }\n idx--;\n }\n return null;\n}\n\nexport function getSplit(transactions, parentIndex) {\n let split = [transactions[parentIndex]];\n let curr = parentIndex + 1;\n while (curr < transactions.length && transactions[curr].is_child) {\n split.push(transactions[curr]);\n curr++;\n }\n return split;\n}\n\nexport function ungroupTransactions(transactions) {\n let x = transactions.reduce((list, parent) => {\n let { subtransactions, ...trans } = parent;\n subtransactions = subtransactions || [];\n\n list.push(trans);\n\n for (let i = 0; i < subtransactions.length; i++) {\n list.push(subtransactions[i]);\n }\n return list;\n }, []);\n return x;\n}\n\nfunction groupTransaction(split) {\n return { ...split[0], subtransactions: split.slice(1) };\n}\n\nexport function ungroupTransaction(split) {\n if (split == null) {\n return null;\n }\n return ungroupTransactions([split]);\n}\n\nexport function applyTransactionDiff(groupedTrans, diff) {\n return groupTransaction(applyChanges(diff, ungroupTransaction(groupedTrans)));\n}\n\nfunction replaceTransactions(transactions, id, func) {\n let idx = transactions.findIndex(t => t.id === id);\n let trans = transactions[idx];\n let transactionsCopy = [...transactions];\n\n if (idx === -1) {\n throw new Error('Tried to edit unknown transaction id: ' + id);\n }\n\n if (trans.is_parent || trans.is_child) {\n let parentIndex = findParentIndex(transactions, idx);\n if (parentIndex == null) {\n console.log('Cannot find parent index');\n return { diff: { deleted: [], updated: [] } };\n }\n\n let split = getSplit(transactions, parentIndex);\n let grouped = func(groupTransaction(split));\n let newSplit = ungroupTransaction(grouped);\n\n let diff;\n if (newSplit == null) {\n // If everything was deleted, just delete the parent which will\n // delete everything\n diff = { deleted: [{ id: split[0].id }], updated: [] };\n grouped = { id: split[0].id, _deleted: true };\n transactionsCopy.splice(parentIndex, split.length);\n } else {\n diff = diffItems(split, newSplit);\n transactionsCopy.splice(parentIndex, split.length, ...newSplit);\n }\n\n return { data: transactionsCopy, newTransaction: grouped, diff };\n } else {\n let grouped = func(trans);\n let newTrans = ungroupTransaction(grouped) || [];\n if (grouped) {\n grouped.subtransactions = grouped.subtransactions || [];\n }\n transactionsCopy.splice(idx, 1, ...newTrans);\n\n return {\n data: transactionsCopy,\n newTransaction: grouped || { id: trans.id, _deleted: true },\n diff: diffItems([trans], newTrans),\n };\n }\n}\n\nexport function addSplitTransaction(transactions, id) {\n return replaceTransactions(transactions, id, trans => {\n if (!trans.is_parent) {\n return trans;\n }\n let prevSub = last(trans.subtransactions);\n trans.subtransactions.push(\n makeChild(trans, {\n amount: 0,\n sort_order: num(prevSub && prevSub.sort_order) - 1,\n }),\n );\n return trans;\n });\n}\n\nexport function updateTransaction(transactions, transaction) {\n return replaceTransactions(transactions, transaction.id, trans => {\n if (trans.is_parent) {\n let parent = trans.id === transaction.id ? transaction : trans;\n let sub = trans.subtransactions.map(t => {\n // Make sure to update the children to reflect the updated\n // properties (if the parent updated)\n\n let child = t;\n if (trans.id === transaction.id) {\n child = {\n ...t,\n payee: t.payee === trans.payee ? transaction.payee : t.payee,\n };\n } else if (t.id === transaction.id) {\n child = transaction;\n }\n\n return makeChild(parent, child);\n });\n\n return recalculateSplit({ ...parent, subtransactions: sub });\n } else {\n return transaction;\n }\n });\n}\n\nexport function deleteTransaction(transactions, id) {\n return replaceTransactions(transactions, id, trans => {\n if (trans.is_parent) {\n if (trans.id === id) {\n return null;\n } else if (trans.subtransactions.length === 1) {\n return {\n ...trans,\n subtransactions: null,\n is_parent: false,\n error: null,\n };\n } else {\n let sub = trans.subtransactions.filter(t => t.id !== id);\n return recalculateSplit({ ...trans, subtransactions: sub });\n }\n } else {\n return null;\n }\n });\n}\n\nexport function splitTransaction(transactions, id) {\n return replaceTransactions(transactions, id, trans => {\n if (trans.is_parent || trans.is_child) {\n return trans;\n }\n\n return {\n ...trans,\n is_parent: true,\n error: num(trans.amount) === 0 ? null : SplitTransactionError(0, trans),\n subtransactions: [makeChild(trans, { amount: 0, sort_order: -1 })],\n };\n });\n}\n\nexport function realizeTempTransactions(transactions) {\n let parent = transactions.find(t => !t.is_child);\n parent = { ...parent, id: uuidv4() };\n\n let children = transactions.filter(t => t.is_child);\n return [\n parent,\n ...children.map(child => ({\n ...child,\n id: uuidv4(),\n parent_id: parent.id,\n })),\n ];\n}\n","/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing. The function also has a property 'clear' \n * that is a function which will clear the timer to prevent previously scheduled executions. \n *\n * @source underscore.js\n * @see http://unscriptable.com/2009/03/20/debouncing-javascript-methods/\n * @param {Function} function to wrap\n * @param {Number} timeout in ms (`100`)\n * @param {Boolean} whether to execute at the beginning (`false`)\n * @api public\n */\nfunction debounce(func, wait, immediate){\n var timeout, args, context, timestamp, result;\n if (null == wait) wait = 100;\n\n function later() {\n var last = Date.now() - timestamp;\n\n if (last < wait && last >= 0) {\n timeout = setTimeout(later, wait - last);\n } else {\n timeout = null;\n if (!immediate) {\n result = func.apply(context, args);\n context = args = null;\n }\n }\n };\n\n var debounced = function(){\n context = this;\n args = arguments;\n timestamp = Date.now();\n var callNow = immediate && !timeout;\n if (!timeout) timeout = setTimeout(later, wait);\n if (callNow) {\n result = func.apply(context, args);\n context = args = null;\n }\n\n return result;\n };\n\n debounced.clear = function() {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n };\n \n debounced.flush = function() {\n if (timeout) {\n result = func.apply(context, args);\n context = args = null;\n \n clearTimeout(timeout);\n timeout = null;\n }\n };\n\n return debounced;\n};\n\n// Adds compatibility for ES modules\ndebounce.debounce = debounce;\n\nmodule.exports = debounce;\n"],"names":["MenuTooltip","_ref","width","onClose","children","_jsx","Tooltip","position","style","padding","props","xmlns","viewBox","color","fill","d","filterFields","map","field","mapField","subfieldFromFilter","options","value","length","inflow","outflow","subfieldToOptions","subfield","month","year","OpButton","_ref2","op","selected","onClick","Button","type","backgroundColor","colors","marginBottom","friendlyOp","updateFilterReducer","state","action","FIELD_TYPES","makeValue","Error","ConfigureField","_ref3","initialSubfield","dispatch","onApply","setSubfield","useState","inputRef","useRef","prevOp","useEffect","current","focus","ops","TYPE_INFO","filter","_jsxs","FocusScope","View","Select","onChange","sub","borderWidth","titleFirst","Stack","direction","align","spacing","flexWrap","slice","currOp","GenericInput","multi","marginTop","v","justify","flex","e","preventDefault","FilterButton","_ref4","filters","useFilters","dateFormat","useSelector","prefs","local","useReducer","fieldsOpen","condOpen","deserializeField","SettingsSliderAlternate","height","marginRight","Menu","onMenuSelect","name","items","_ref5","text","async","cond","unparse","date","parseDate","getMonthYearFormat","Date","isDateValid","alert","formatDate","error","send","conditions","actions","saved","find","f","id","conditionErrors","getFieldError","FilterEditor","_ref6","onSave","FilterExpression","_ref7","originalField","customName","stage","onDelete","editing","setEditing","borderRadius","flexDirection","alignItems","disabled","paddingBlock","paddingLeft","paddingRight","Text","_Fragment","Value","inline","valueIsRaw","DeleteIcon","margin","marginLeft","AppliedFilters","_ref8","editingFilter","onUpdate","conditionsOp","onCondOpChange","CondOpMenu","i","newFilter","SavedFilterMenuButton","res","savedFilter","filterId","onClearFilters","onReloadSavedFilter","filtersList","nameOpen","setNameOpen","adding","setAdding","menuOpen","setMenuOpen","err","setErr","menuItem","setMenuItem","NameFilter","onFilterMenuSelect","item","status","sendCatch","message","FilterMenu","FormField","FormLabel","title","htmlFor","userSelect","data","onAddUpdate","maxWidth","whiteSpace","overflow","textOverflow","flexShrink","ExpandArrow","FieldSelect","display","fields","FiltersStack","onUpdateFilter","onDeleteFilter","NotesTooltip","editable","defaultNotes","notes","setNotes","createRef","ref","css","border","minWidth","minHeight","outline","target","overflowWrap","NotesButton","defaultColor","tooltipPosition","hover","setHover","tooltip","useTooltip","useLiveQuery","q","select","note","hasNotes","delayHandler","setDelayHandler","tooltipOpen","isOpen","onMouseEnter","handleMouseEnter","setTimeout","onMouseLeave","handleMouseLeave","clearTimeout","className","getOpenEvents","CustomNotesPaper","close","getValidMonthBounds","bounds","startMonth","endMonth","start","end","MonthsContext","createContext","MonthsProvider","numMonths","monthBounds","monthUtils","months","Provider","BudgetSummaries","SummaryComponent","useContext","widthState","setWidthState","styles","spring","useSpring","x","config","mass","tension","friction","containerRef","useResizeObserver","useCallback","rect","prevMonth0","allMonths","unshift","push","monthWidth","useLayoutEffect","prevMonth","reversed","offsetX","from","to","animated","willChange","transform","MONTH_BOX_SHADOW","MONTH_RIGHT_PADDING","MonthPicker","numDisplayed","onSelect","hoverId","setHoverId","targetMonthCount","setTargetMonthCount","currentMonth","firstSelectedMonth","lastSelectedMonth","range","firstSelectedIndex","Math","floor","lastSelectedIndex","size","setSize","min","max","yearHeadersShown","justifyContent","innerRef","idx","monthName","lastHoverId","hovered","showYearHeader","includes","isMonthBudgeted","textAlign","cursor","textDecoration","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","fontWeight","top","left","fontSize","CategoryGroupsContext","addToBeBudgetedGroup","groups","categories","makeAmountGrey","makeAmountStyle","greyed","makeAmountFullStyle","findSortDown","arr","pos","targetId","findIndex","newIdx","getScrollbarWidth","BudgetTable","Component","constructor","_props$prefs$budgetS","super","onEditMonth","monthIndex","this","setState","cell","onEditName","onReorderCategory","dropPos","categoryGroups","g","groupId","findSortUp","group","targetGroup","cat","onReorderGroup","moveVertically","dir","collapsed","flattened","reduce","all","concat","isGroup","nextIdx","next","is_income","onKeyDown","key","shiftKey","onShowActivity","catName","catId","resolveMonth","onBudgetAction","args","toggleHiddenCategories","prevState","showHiddenCategories","savePrefs","expandAllCategories","setCollapsed","collapseAllCategories","budgetCategoriesRef","draggingState","clearEditing","render","prewarmStartMonth","newCategoryForGroup","dataComponents","isAddingGroup","onSaveCategory","onSaveGroup","onDeleteCategory","onDeleteGroup","onShowNewCategory","onHideNewCategory","onShowNewGroup","onHideNewGroup","BudgetTotals","MonthComponent","BudgetTotalsComponent","IntersectionBoundary","overflowY","overflowAnchor","opacity","el","budgetDataNode","BudgetCategories","editingCell","SidebarCategory","category","dragPreview","dragging","borderColor","isLast","onDragChange","temporary","displayed","WebkitUserSelect","hidden","undefined","stopPropagation","CheveronDown","zIndex","InputCell","formatter","exposed","onBlur","borderBottomWidth","inputProps","placeholder","SidebarGroup","onEdit","onToggleCollapse","transition","RenderMonths","component","editingIndex","index","NamespaceContext","borderLeft","memo","boxShadow","borderBottom","flexGrow","DotsHorizontalTriple","ExpenseGroup","dragState","itemPos","dragRef","useDraggable","canDrag","dropRef","useDroppable","types","onDrop","catDropRef","catDropPos","onLongHover","Row","preview","right","ROW_HEIGHT","DropHighlight","offset","ExpenseCategory","budgetArray","onReorder","cat_group","IncomeGroup","IncomeCategory","_ref9","useMemo","expenseGroups","incomeGroup","separateGroups","Array","prototype","apply","groupCategories","setDragState","savedCollapsed","setSavedCollapsed","newDragState","hoveredId","hoveredPos","id_","content","ExpenseGroupComponent","ExpenseCategoryComponent","IncomeHeader","IncomeHeaderComponent","IncomeGroupComponent","IncomeCategoryComponent","DropHighlightPosContext","_ref10","BudgetPageHeader","_ref11","onMonthSelect","paddingTop","getValidMonth","DynamicBudgetTableInner","forwardRef","maxMonths","onMonthSelect_","onPreload","setDisplayMax","useBudgetMonthCount","useActions","numPossible","estimatedTableWidth","getNumPossibleMonths","AutoSizer","fail","msg","JSON","stringify","str","char","ch","nextOperator","parseParens","expr","parseOperator","isNegative","test","numberStr","match","thousandsSep","getNumberFormat","separator","number","parseFloat","replace","parsePrimary","_len","arguments","_key","prevParser","node","makeOperatorParser","evaluate","ast","pow","evalArithmetic","expression","result","defaultValue","parse","isNaN","BalanceWithCarryover","carryover","balance","carryoverValue","useSheetValue","balanceValue","CellValue","binding","getStyle","alignSelf","bottom","ArrowThinRight","HoverTarget","contentStyle","renderContent","setHovered","Context","ReportProvider","summaryCollapsed","onToggleSummaryCollapse","PieProgress","progress","circum","PI","dash","gap","r","cx","cy","stroke","strokeWidth","radius","strokeDasharray","fraction","num","denom","IncomeProgress","totalIncome","over","frac","ExpenseProgress","totalSpent","totalBudgeted","BudgetTotal","ProgressComponent","lineHeight","fontStyle","IncomeTotal","reportBudget","ExpenseTotal","Saved","projected","budgetedSaved","totalSaved","diff","AlignedText","format","PrivacyFilter","blurIntensity","BudgetSummary","isGoalTemplatesEnabled","useFeatureFlag","onMenuClose","ExpandOrCollapseIcon","ArrowButtonDown1","ArrowButtonUp1","textDecorationSkip","borderTop","headerLabelStyle","BudgetTotalsMonth","paddingBottom","IncomeHeaderMonth","GroupMonth","SheetCell","valueProps","privacyFilter","BalanceTooltip","categoryId","flag","CategoryMonth","balanceTooltip","borderTopWidth","onMouseOverCapture","focused","onExpose","valueStyle","getValueStyle","formatExpr","integerToCurrency","unformatExpr","amountToInteger","amount","Field","ExpenseGroupMonth","ExpenseCategoryMonth","IncomeGroupMonth","IncomeCategoryMonth","TransferTooltip","initialAmount","initialAmountName","showToBeBudgeted","tooltipProps","onSubmit","spreadsheet","useSpreadsheet","sheetName","setAmount","setCategory","submit","parsedAmount","get","InitialFocus","Input","onEnter","CategoryAutocomplete","openOnFocus","HoldTooltip","RolloverContext","TotalsList","prevMonthName","rolloverBudget","n","parseInt","abs","Block","ToBudget","useSheetName","sheetValue","availableValue","CoverTooltip","menu","setMenu","toCategory","fromCategory","_initialBudgetMonth","Budget","PureComponent","_this","prewarmMonth","budgetType","method","values","prewarmCache","warmingMonth","c","createCategory","addCategory","updateCategory","mustTransfer","pushModal","transferCategory","deleteCategory","createGroup","addGroup","grp","updateGroup","deleteGroup","applyBudgetAction","categoryName","navigate","goBack","filterName","$transform","$eq","moveCategory","sortInfo","moveCategoryGroup","onTitlebarEvent","newType","disableObservers","prewarmAllMonths","enableObservers","loadPrefs","initialized","collapsedPrefs","getCategories","grouped","titlebar","loadCategories","unlistens","listen","tables","table","subscribe","cleanup","forEach","unlisten","componentDidUpdate","prevProps","accountId","then","componentWillUnmount","Promise","onCopy","copyPreviousMonthInto","reportComponents","rolloverComponents","DynamicBudgetTable","page","RolloverBudgetSummary","rollover","BudgetWrapper","global","queries","TitlebarContext","location","useLocation","useMatch","pathname","useNavigate","report","OverflowMenu","schedule","onAction","open","setOpen","completed","ScheduleAmountCell","getScheduledAmount","isApprox","Cell","plain","SchedulesTable","schedules","statuses","minimal","allowCompleted","tableStyle","showCompleted","setShowCompleted","payees","useCachedPayees","accounts","useCachedAccounts","filteredSchedules","filterIncludes","toLowerCase","payee","p","_payee","account","a","_account","_amount","amountStr","_amountOp","dateStr","next_date","s","TableHeader","inset","version","Table","rowHeight","renderItem","DisplayId","StatusBadge","_date","frequency","Check","renderSchedule","renderEmpty","allowPopupsEscape","Schedules","usePushModal","setFilter","scheduleData","useSchedules","Page","Search","flexBasis","resetNextDate","mergeFields","defaults","initial","Object","keys","updateScheduleConditions","conds","extractScheduleConds","_conditions","updateCond","amountOp","Boolean","ScheduleDetails","initialFields","useParams","idKey","globalDispatch","useDispatch","condsSet","Set","isCustom","has","_actions","posts_transaction","num1","num2","transactions","repeats","patterns","upcomingDates","dates","transactionsMode","mode","loadSchedule","runQuery","run","count","today","liveQuery","splits","unsubscribe","live","$and","selectedInst","useSelected","onLinkTransactions","ids","scheduleId","updated","onSwitchTransactions","modalSize","PayeeAutocomplete","labelProps","isCreatable","AccountAutocomplete","includeClosedAccounts","OpSelect","formatOp","_","BetweenAmountInput","AmountInput","RecurringSchedulePicker","DateSelect","Checkbox","checked","rule","ruleId","onEditRule","SelectedProvider","instance","SelectedItemsButton","onUnlinkTransactions","SimpleTransactionsTable","sameName","ScheduleLink","query","isInModal","transactionIds","marginInline","DiscoverSchedulesTable","loading","pageType","usePageType","selectedItems","useSelectedItems","dispatchSelected","useSelectedDispatch","SelectCell","event","isSelected","recurDescription","getRecurringDescription","DiscoverSchedules","isLoading","setData","setIsLoading","useSendPlatformRequest","creating","setCreating","getParent","Navigate","Paragraph","ButtonWithLoading","t","GoCardlessLink","window","Modal","isCurrent","showClose","serializeTransaction","transaction","showZeroInDeposit","isPreviewId","_inverse","debit","credit","parseISO","isLastChild","trans","is_child","parent_id","SplitsExpandedContext","useSplitsExpanded","expanded","SplitsExpandedProvider","initialMode","cachedState","app","lastSplitState","reduxDispatch","delete","add","transitionId","splitState","selectAscDesc","ascDesc","clicked","TransactionHeader","hasSelected","showAccount","showCategory","showBalance","showCleared","scrollWidth","onSort","HeaderCell","icon","truncate","StatusCell","isChild","isClearedField","statusProps","getStatusProps","CellButton","visibility","createElement","Icon","CustomCell","unexposedContent","UnexposedCellContent","ArrowDown","ArrowUp","PayeeCell","payeeId","inherited","transferAcct","isPreview","onCreatePayee","onManagePayees","onNavigateToTransferAccount","onNavigateToSchedule","isCreatingPayee","transfer_acct","startsWith","PayeeIcons","transferAccount","getPayeePretty","shouldSaveFromKey","inputStyle","showManagePayees","tableBehavior","defaultFocusTransferPayees","menuPortalTarget","useCachedSchedules","buttonStyle","scheduleIconStyle","transferIconStyle","recurring","ArrowsSynchronize","CalendarIcon","isTemporaryId","LeftArrow2","RightArrow2","Transaction","originalTransaction","highlighted","added","matched","inheritedFields","focusedField","hideFraction","onHover","onSplit","onToggleSplit","prevShowZero","setPrevShowZero","prevTransaction","setPrevTransaction","setTransaction","newTransaction","getAccountsById","offbudget","deserialized","realTransaction","parsed","currentDay","deserializeTransaction","imported_payee","importedPayee","cleared","is_parent","isParent","_unmatched","getPayeesById","isBudgetTransfer","isOffBudget","backgroundFocus","amountStyle","letterSpacing","DeleteCell","borderLeftWidth","Hyperlink2","acctId","acct","bind","readOnly","obj","getCategoriesById","showSplitOption","activationFilters","TransactionError","_ref12","isDeposit","onAddSplit","difference","makeTemporaryTransactions","currentAccountId","currentCategoryId","lastDate","indexOf","NewTransaction","_ref13","editingTransaction","hoveredTransaction","onAdd","TransactionTableInner","_ref14","tableNavigator","tableRef","newNavigator","onScroll","isAddingPrev","usePrevious","isAdding","setScrollWidth","onCloseAddTransaction","showBalances","sortField","getNavigatorProps","onCheckNewEnter","newTransactions","editingId","onAddTemporary","navigator","_ref15","_balances$trans$id","balances","isNew","isMatched","isExpanded","parent","transactionMap","isChildDeposit","forceTop","forceLayout","loadMore","loadMoreTransactions","onCheckEnter","saveScrollWidth","child","TransactionTable","setNewTransactions","setHoveredTransaction","prevIsAdding","setPrevIsAdding","splitsExpanded","prevSplitsExpanded","mergedRef","ref1","ref2","anchor","setRowAnimation","Map","isAnchored","unanchor","useTableNavigator","getFields","shouldAdd","latestState","savePending","afterSaveFunc","forceRerender","afterSave","func","addNotification","onApplyRules","newTrans","updateTransaction","deleteTransaction","splitTransaction","newId","addSplitTransaction","metaKey","getLastTransaction","lastTransaction","isSplit","_transactions$idx","saveDiff","remoteUpdates","learnCategories","updates","saveDiffAndApply","changes","remoteDiff","applyTransactionDiff","applyChanges","TransactionList","allTransactions","headerContent","isFiltered","onRefetch","transactionsLatest","realizeTempTransactions","sort_order","now","afterRules","getChangedValues","selectedPayee","MenuButton","SelectedTransactionsButton","getTransaction","onShow","onDuplicate","onUnlink","onCreateRule","onScheduleAction","ambiguousDuplication","some","linked","every","keyHandlers","l","firstId","split","DetailedBalance","SelectedBalance","join","rows","$oneof","finalIds","calculate","$sum","scheduleBalance","previewIds","MoreBalances","balanceQuery","uncleared","Balances","showExtraBalances","onToggleExtraBalances","ArrowButtonRight1","ReconcilingMessage","targetBalance","onDone","onCreateTransaction","targetDiff","CheckCircle1","ReconcileTooltip","onReconcile","input","elements","currencyToInteger","AccountHeader","editingName","isNameEditable","workingHard","accountName","accountsSyncing","showEmptyMessage","reconcileAmount","canCalculateBalance","isSorted","search","onSearch","onAddTransaction","onShowTransactions","onDoneReconciling","onCreateReconciliationTransaction","onSaveName","onExposeName","onSync","onImport","onBatchDelete","onBatchDuplicate","onBatchEdit","onBatchUnlink","onApplyFilter","searchInput","canSync","account_id","KeyHandlers","ctrl+f, cmd+f","closed","Pencil1","AnimatedRefresh","animating","DownloadThickBottom","Add","AnimatedLoading","getScrolledItem","ArrowsShrink3","ArrowsExpand3","AccountMenu","canShowBalances","CategoryMenu","setTooltip","syncServerStatus","useSyncServerStatus","EmptyMessage","AllTransactions","filtered","prependTransactions","runningBalance","_transactions","_balances$transaction","_balances$transaction2","prependBalances","scheduledBalances","reverse","scheduledTransaction","groupById","allBalances","getField","AccountInternal","fetchAllIds","paged","getQuery","subtransactions","refetchTransactions","_this$paged","fetchTransactions","makeRootQuery","rootQuery","currentQuery","updateQuery","markAccountRead","locationState","onSearchDone","debounce","syncAndDownload","Actual","openFileDialog","extensions","filename","onImported","didChange","onExport","exportedTransactions","serialize","saveFile","onTransactionsChange","optimisticUpdate","_deleted","mappedData","updateNewTransactions","sort","trim","updateAccount","authorizeBank","upgradingAccountId","unlinkAccount","openAccountCloseModal","reopenAccount","getAccountTitle","transactionCount","applyFilters","matchedTransactions","createPayee","reconciliationTransactions","ungroupTransactions","deleted","idSet","edit","ungroupTransaction","parentId","getFilter","oldFilter","updatedFilter","parts","customFilters","conditionsOpKey","applySort","prevField","prevAscDesc","sortAscDesc","sortPrevField","sortPrevAscDesc","orderBy","headerClicked","transactionsCount","latestDate","maybeRefetch","onUndo","focusId","messages","undoTag","dataset","column","focusableMsgs","row","scrollTo","setLastUndoState","initiallyLoadPayees","lastUndoState","modalShowing","pagedQuery","prevData","firstLoad","_this$table$current","splitsExpandedDispatch","expandSplits","getTotalCount","transactionsFiltered","calculateBalances","_this$table$current2","scrollToTop","_this$table$current3","pageCount","onlySync","mapper","componentWillReceiveProps","nextProps","$sumOver","getBalanceQuery","replaceModal","flatMap","SelectedProviderWithItems","registerDispatch","fetchNext","onRefetchUpToRow","refetchUpToRow","order","AccountHack","Account","_activeLocation$state","_activeLocation$state2","params","activeLocation","useActiveLocation","failedAccounts","modals","modalStack","actionCreators","bindActionCreators","filterByAccount","filterByPayee","$or","SchedulesProvider","moveCat","cats","moveGroup","SplitTransactionError","total","makeChild","prefix","uuidv4","starting_balance_flag","recalculateSplit","acc","getSplit","parentIndex","curr","list","groupTransaction","groupedTrans","replaceTransactions","transactionsCopy","findParentIndex","console","log","newSplit","splice","diffItems","prevSub","last","wait","immediate","timeout","context","timestamp","later","debounced","callNow","clear","flush","module","exports"],"sourceRoot":""}