@actual-app/web 23.8.0 → 23.9.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.
- package/README.md +37 -1
- package/build/asset-manifest.json +13 -17
- package/build/data/migrations/1691233396000_add_schedule_next_date_tombstone.sql +5 -0
- package/build/data-file-index.txt +1 -0
- package/build/index.html +1 -1
- package/build/kcab/{kcab.worker.73a03b9f0217ad62df42.js → kcab.worker.903b11c4b36a7822451f.js} +3 -3
- package/build/kcab/kcab.worker.903b11c4b36a7822451f.js.map +1 -0
- package/build/static/js/{457.4c255aed.chunk.js → 171.491e33e7.chunk.js} +2 -2
- package/build/static/js/171.491e33e7.chunk.js.map +1 -0
- package/build/static/js/{383.1b04bac1.chunk.js → 383.d7919241.chunk.js} +2 -2
- package/build/static/js/{383.1b04bac1.chunk.js.map → 383.d7919241.chunk.js.map} +1 -1
- package/build/static/js/main.041e259e.js +3 -0
- package/build/static/js/main.041e259e.js.map +1 -0
- package/build/static/js/narrow-components.b48d7cb2.chunk.js +2 -0
- package/build/static/js/narrow-components.b48d7cb2.chunk.js.map +1 -0
- package/build/static/js/reports.2402a148.chunk.js +2 -0
- package/build/static/js/reports.2402a148.chunk.js.map +1 -0
- package/build/static/js/wide-components.2c2e09e4.chunk.js +2 -0
- package/build/static/js/wide-components.2c2e09e4.chunk.js.map +1 -0
- package/package.json +10 -8
- package/build/kcab/kcab.worker.73a03b9f0217ad62df42.js.map +0 -1
- package/build/static/js/281.6bb03bd1.chunk.js +0 -2
- package/build/static/js/281.6bb03bd1.chunk.js.map +0 -1
- package/build/static/js/457.4c255aed.chunk.js.map +0 -1
- package/build/static/js/876.00fe0e63.chunk.js +0 -2
- package/build/static/js/876.00fe0e63.chunk.js.map +0 -1
- package/build/static/js/main.f758b66a.js +0 -3
- package/build/static/js/main.f758b66a.js.map +0 -1
- package/build/static/js/narrow-components.55a3b7fd.chunk.js +0 -2
- package/build/static/js/narrow-components.55a3b7fd.chunk.js.map +0 -1
- package/build/static/js/reports.d1b97437.chunk.js +0 -2
- package/build/static/js/reports.d1b97437.chunk.js.map +0 -1
- package/build/static/js/wide-components.6cb72932.chunk.js +0 -2
- package/build/static/js/wide-components.6cb72932.chunk.js.map +0 -1
- /package/build/kcab/{kcab.worker.73a03b9f0217ad62df42.js.LICENSE.txt → kcab.worker.903b11c4b36a7822451f.js.LICENSE.txt} +0 -0
- /package/build/static/js/{main.f758b66a.js.LICENSE.txt → main.041e259e.js.LICENSE.txt} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"static/js/reports.d1b97437.chunk.js","mappings":"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","sources":["components/common/MenuTooltip.tsx","icons/v2/SettingsSliderAlternate.js","components/filters/FiltersMenu.js","components/filters/SavedFilters.js","hooks/useFilters.ts","components/reports/Change.js","components/reports/util.js","components/reports/graphs/cash-flow-spreadsheet.tsx","components/reports/chart-theme.js","components/reports/Container.tsx","components/reports/Tooltip.js","components/reports/graphs/CashFlowGraph.tsx","components/reports/Header.js","components/reports/useReport.js","components/reports/CashFlow.js","components/reports/graphs/net-worth-spreadsheet.tsx","components/reports/graphs/NetWorthGraph.tsx","components/reports/NetWorth.js","components/reports/DateRange.js","components/reports/Overview.js","components/reports/ReportRouter.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} \n </Text>\n {filterId.id && filterId.status !== 'saved' && (\n <Text>(modified) </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 { useCallback, useMemo, useState } from 'react';\n\nexport default function useFilters<T>(initialFilters: T[] = []) {\n const [filters, setFilters] = useState<T[]>(initialFilters);\n const [conditionsOp, setConditionsOp] = useState('and');\n const [saved, setSaved] = useState<T[]>(null);\n\n const onApply = useCallback(\n newFilter => {\n if (newFilter.conditions) {\n setFilters([...newFilter.conditions]);\n setConditionsOp(newFilter.conditionsOp);\n setSaved(newFilter.id);\n } else {\n setFilters(state => [...state, newFilter]);\n setSaved(null);\n }\n },\n [setFilters],\n );\n\n const onUpdate = useCallback(\n (oldFilter: T, updatedFilter: T) => {\n setFilters(state =>\n state.map(f => (f === oldFilter ? updatedFilter : f)),\n );\n setSaved(null);\n },\n [setFilters],\n );\n\n const onDelete = useCallback(\n (deletedFilter: T) => {\n setFilters(state => state.filter(f => f !== deletedFilter));\n setSaved(null);\n },\n [setFilters],\n );\n\n const onCondOpChange = useCallback(\n condOp => {\n setConditionsOp(condOp);\n },\n [setConditionsOp],\n );\n\n return useMemo(\n () => ({\n filters,\n saved,\n conditionsOp,\n onApply,\n onUpdate,\n onDelete,\n onCondOpChange,\n }),\n [filters, saved, onApply, onUpdate, onDelete, onCondOpChange, conditionsOp],\n );\n}\n","import React from 'react';\n\nimport { integerToCurrency } from 'loot-core/src/shared/util';\n\nimport { colors, styles } from '../../style';\nimport Block from '../common/Block';\n\nfunction Change({ amount }) {\n return (\n <Block\n style={[styles.smallText, { color: amount < 0 ? colors.r5 : colors.g5 }]}\n >\n {amount >= 0 ? '+' : ''}\n {integerToCurrency(amount)}\n </Block>\n );\n}\n\nexport default Change;\n","import { runQuery } from 'loot-core/src/client/query-helpers';\n\nexport function fromDateRepr(date) {\n return date.slice(0, 7);\n}\n\nexport async function runAll(queries, cb) {\n let data = await Promise.all(\n queries.map(q => {\n return runQuery(q).then(({ data }) => data);\n }),\n );\n cb(data);\n}\n\nexport function index(data, field, mapper) {\n const result = {};\n data.forEach(item => {\n result[mapper ? mapper(item[field]) : item[field]] = item;\n });\n return result;\n}\n\nexport function indexCashFlow(data, date, isTransfer) {\n const results = {};\n data.forEach(item => {\n let findExisting = results[item.date]\n ? results[item.date][item.xfer]\n ? results[item.date][item.xfer]\n : 0\n : 0;\n let result = { [item[isTransfer]]: item.amount + findExisting };\n results[item[date]] = { ...results[item[date]], ...result };\n });\n return results;\n}\n","import React from 'react';\n\nimport * as d from 'date-fns';\n\nimport q from 'loot-core/src/client/query-helpers';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport { integerToCurrency, integerToAmount } from 'loot-core/src/shared/util';\n\nimport AlignedText from '../../common/AlignedText';\nimport { runAll, indexCashFlow } from '../util';\n\nexport function simpleCashFlow(start, end) {\n return async (spreadsheet, setData) => {\n function makeQuery() {\n return q('transactions')\n .filter({\n $and: [{ date: { $gte: start } }, { date: { $lte: end } }],\n 'account.offbudget': false,\n $or: [\n {\n 'payee.transfer_acct.offbudget': true,\n 'payee.transfer_acct': null,\n },\n ],\n })\n .calculate({ $sum: '$amount' });\n }\n\n return runAll(\n [\n makeQuery().filter({ amount: { $gt: 0 } }),\n makeQuery().filter({ amount: { $lt: 0 } }),\n ],\n data => {\n setData({\n graphData: {\n income: data[0],\n expense: data[1],\n },\n });\n },\n );\n };\n}\n\nexport function cashFlowByDate(\n start,\n end,\n isConcise,\n conditions = [],\n conditionsOp,\n) {\n return async (spreadsheet, setData) => {\n let { filters } = await send('make-filters-from-conditions', {\n conditions: conditions.filter(cond => !cond.customName),\n });\n const conditionsOpKey = conditionsOp === 'or' ? '$or' : '$and';\n\n function makeQuery(where) {\n let query = q('transactions')\n .filter({\n [conditionsOpKey]: [...filters],\n })\n .filter({\n $and: [\n { date: { $transform: '$month', $gte: start } },\n { date: { $transform: '$month', $lte: end } },\n ],\n 'account.offbudget': false,\n });\n\n if (isConcise) {\n return query\n .groupBy([{ $month: '$date' }, 'payee.transfer_acct'])\n .select([\n { date: { $month: '$date' } },\n { isTransfer: 'payee.transfer_acct' },\n { amount: { $sum: '$amount' } },\n ]);\n }\n\n return query\n .groupBy(['date', 'payee.transfer_acct'])\n .select([\n 'date',\n { isTransfer: 'payee.transfer_acct' },\n { amount: { $sum: '$amount' } },\n ]);\n }\n\n return runAll(\n [\n q('transactions')\n .filter({\n [conditionsOpKey]: filters,\n date: { $transform: '$month', $lt: start },\n 'account.offbudget': false,\n })\n .calculate({ $sum: '$amount' }),\n makeQuery('amount > 0').filter({ amount: { $gt: 0 } }),\n makeQuery('amount < 0').filter({ amount: { $lt: 0 } }),\n ],\n data => {\n setData(recalculate(data, start, end, isConcise));\n },\n );\n };\n}\n\nfunction recalculate(data, start, end, isConcise) {\n let [startingBalance, income, expense] = data;\n let convIncome = income.map(t => {\n return { ...t, isTransfer: t.isTransfer !== null };\n });\n let convExpense = expense.map(t => {\n return { ...t, isTransfer: t.isTransfer !== null };\n });\n const dates = isConcise\n ? monthUtils.rangeInclusive(\n monthUtils.getMonth(start),\n monthUtils.getMonth(end),\n )\n : monthUtils.dayRangeInclusive(start, end);\n const incomes = indexCashFlow(convIncome, 'date', 'isTransfer');\n const expenses = indexCashFlow(convExpense, 'date', 'isTransfer');\n\n let balance = startingBalance;\n let totalExpenses = 0;\n let totalIncome = 0;\n let totalTransfers = 0;\n\n const graphData = dates.reduce(\n (res, date) => {\n let income = 0;\n let expense = 0;\n let creditTransfers = 0;\n let debitTransfers = 0;\n\n if (incomes[date]) {\n income = !incomes[date].false ? 0 : incomes[date].false;\n creditTransfers = !incomes[date].true ? 0 : incomes[date].true;\n }\n if (expenses[date]) {\n expense = !expenses[date].false ? 0 : expenses[date].false;\n debitTransfers = !expenses[date].true ? 0 : expenses[date].true;\n }\n\n totalExpenses += expense;\n totalIncome += income;\n balance += income + expense + creditTransfers + debitTransfers;\n totalTransfers += creditTransfers + debitTransfers;\n const x = d.parseISO(date);\n\n const label = (\n <div>\n <div style={{ marginBottom: 10 }}>\n <strong>\n {d.format(x, isConcise ? 'MMMM yyyy' : 'MMMM d, yyyy')}\n </strong>\n </div>\n <div style={{ lineHeight: 1.5 }}>\n <AlignedText left=\"Income:\" right={integerToCurrency(income)} />\n <AlignedText left=\"Expenses:\" right={integerToCurrency(expense)} />\n <AlignedText\n left=\"Change:\"\n right={<strong>{integerToCurrency(income + expense)}</strong>}\n />\n {creditTransfers + debitTransfers !== 0 && (\n <AlignedText\n left=\"Transfers:\"\n right={integerToCurrency(creditTransfers + debitTransfers)}\n />\n )}\n <AlignedText left=\"Balance:\" right={integerToCurrency(balance)} />\n </div>\n </div>\n );\n\n res.income.push({ x, y: integerToAmount(income) });\n res.expenses.push({ x, y: integerToAmount(expense) });\n res.balances.push({\n x,\n y: integerToAmount(balance),\n premadeLabel: label,\n amount: balance,\n });\n return res;\n },\n { expenses: [], income: [], balances: [] },\n );\n\n const { balances } = graphData;\n\n return {\n graphData,\n balance: balances[balances.length - 1].amount,\n totalExpenses,\n totalIncome,\n totalTransfers,\n totalChange: balances[balances.length - 1].amount - balances[0].amount,\n };\n}\n","import { colors } from '../../style';\n\nlet colorFades = {\n blueFadeStart: 'rgba(229, 245, 255, 1)',\n blueFadeEnd: 'rgba(229, 245, 255, 0)',\n redFadeStart: 'rgba(255, 243, 242, 1)',\n redFadeEnd: 'rgba(255, 243, 242, 0)',\n};\n\n// Typography\nconst sansSerif =\n 'Inter var, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, Helvetica, Arial, sans-serif';\nconst letterSpacing = 'normal';\nconst fontSize = 13;\n\n// Labels\nconst baseLabelStyles = {\n fontFamily: sansSerif,\n fontSize,\n letterSpacing,\n fill: colors.n1,\n stroke: 'transparent',\n};\n\nconst axisBaseStyles = {\n axis: {\n fill: 'transparent',\n stroke: 'none',\n },\n grid: {\n fill: 'none',\n stroke: 'none',\n pointerEvents: 'none',\n },\n ticks: {\n fill: 'transparent',\n size: 1,\n stroke: 'none',\n },\n axisLabel: baseLabelStyles,\n tickLabels: baseLabelStyles,\n};\n\nconst theme = {\n colors: {\n ...colorFades,\n red: colors.r7,\n blue: colors.b6,\n },\n area: {\n style: {\n labels: baseLabelStyles,\n data: {\n stroke: colors.b6,\n strokeWidth: 2,\n strokeLinejoin: 'round',\n strokeLinecap: 'round',\n },\n },\n },\n axis: {\n style: axisBaseStyles,\n },\n dependentAxis: {\n style: {\n ...axisBaseStyles,\n grid: {\n ...axisBaseStyles.grid,\n stroke: 'rgba(0,0,0,.2)',\n strokeDasharray: '1,1',\n },\n tickLabels: { ...baseLabelStyles, padding: 5 },\n },\n },\n independentAxis: {\n style: {\n ...axisBaseStyles,\n axis: { ...axisBaseStyles.axis, stroke: 'rgba(0,0,0,.2)' },\n tickLabels: { ...baseLabelStyles, padding: 10 },\n },\n },\n bar: {\n style: {\n labels: baseLabelStyles,\n data: { fill: colors.b6, stroke: 'none' },\n },\n },\n line: {\n style: {\n labels: baseLabelStyles,\n data: {\n fill: 'none',\n stroke: colors.b6,\n strokeWidth: 2,\n strokeLinejoin: 'round',\n strokeLinecap: 'round',\n },\n },\n },\n voronoi: {\n style: {\n labels: baseLabelStyles,\n },\n },\n chart: {\n padding: {\n top: 20,\n left: 65,\n right: 20,\n bottom: 50,\n },\n },\n};\nexport default theme;\n","import React, { type ReactNode, useRef } from 'react';\nimport AutoSizer from 'react-virtualized-auto-sizer';\n\nimport { type CSSProperties } from 'glamor';\n\nimport View from '../common/View';\n\ntype ContainerProps = {\n style?: CSSProperties;\n children: (width: number, height: number, host: HTMLDivElement) => ReactNode;\n};\nexport default function Container({ style, children }: ContainerProps) {\n const portalHost = useRef<HTMLDivElement>(null);\n\n return (\n <View style={[{ height: 300, position: 'relative', flexShrink: 0 }, style]}>\n <div ref={portalHost} />\n <AutoSizer>\n {({ width, height }) => (\n <div style={{ width, height }}>\n {children(width, height, portalHost.current)}\n </div>\n )}\n </AutoSizer>\n </View>\n );\n}\n","import React, { Component } from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { css, before } from 'glamor';\nimport { VictoryTooltip } from 'victory';\n\nimport { colors } from '../../style';\n\nclass Tooltip extends Component {\n static defaultEvents = VictoryTooltip.defaultEvents;\n\n render() {\n let {\n active,\n x,\n y,\n scale,\n datum,\n portalHost,\n offsetX = 0,\n offsetY,\n position,\n light,\n forceActive,\n style,\n } = this.props;\n const xRange = scale.x.range();\n const xPos = x - xRange[0];\n\n if (!position) {\n if (datum.labelPosition) {\n position = datum.labelPosition;\n } else {\n position = xPos < 150 ? 'right' : 'left';\n }\n }\n\n if (!portalHost || (!active && !forceActive)) {\n return null;\n }\n\n y = offsetY ? offsetY(y) : y;\n\n return ReactDOM.createPortal(\n <div\n {...css(\n {\n position: 'absolute',\n top: 0,\n left: offsetX,\n // prettier-ignore\n transform: position === 'right' ?\n `translate(calc(${x}px + 15px), calc(${y}px ${light ? '' : '- 50%'}))` :\n `translate(calc(${x}px - 100% - 15px), calc(${y}px ${light ? '' : '- 50%'}))`,\n zIndex: 1000,\n pointerEvents: 'none',\n borderRadius: 2,\n boxShadow: light ? 'none' : '0 1px 6px rgba(0, 0, 0, .20)',\n // TODO: Transparent background\n backgroundColor: light ? 'transparent' : colors.n1,\n color: light ? 'inherit' : 'white',\n padding: 10,\n },\n !light &&\n before({\n position: 'absolute',\n display: 'inline-block',\n borderTop: '7px solid transparent',\n borderBottom: '7px solid transparent',\n [position === 'right' ? 'borderRight' : 'borderLeft']:\n '7px solid ' + colors.n1,\n [position === 'right' ? 'left' : 'right']: -6,\n top: 'calc(50% - 7px)',\n // eslint-disable-next-line rulesdir/typography\n content: '\" \"',\n }),\n style,\n )}\n >\n {datum.premadeLabel}\n </div>,\n portalHost,\n );\n }\n}\n\nexport default Tooltip;\n","import React from 'react';\n\nimport * as d from 'date-fns';\nimport {\n VictoryChart,\n VictoryBar,\n VictoryLine,\n VictoryAxis,\n VictoryVoronoiContainer,\n VictoryGroup,\n} from 'victory';\n\nimport { colors } from '../../../style';\nimport theme from '../chart-theme';\nimport Container from '../Container';\nimport Tooltip from '../Tooltip';\n\ntype CashFlowGraphProps = {\n graphData: { expenses; income; balances };\n isConcise: boolean;\n};\nfunction CashFlowGraph({ graphData, isConcise }: CashFlowGraphProps) {\n return (\n <Container>\n {(width, height, portalHost) =>\n graphData && (\n <VictoryChart\n scale={{ x: 'time', y: 'linear' }}\n theme={theme}\n domainPadding={10}\n width={width}\n height={height}\n containerComponent={\n <VictoryVoronoiContainer voronoiDimension=\"x\" />\n }\n >\n <VictoryGroup>\n <VictoryBar\n data={graphData.expenses}\n style={{ data: { fill: theme.colors.red } }}\n />\n <VictoryBar data={graphData.income} />\n </VictoryGroup>\n <VictoryLine\n data={graphData.balances}\n labelComponent={<Tooltip portalHost={portalHost} />}\n labels={x => x.premadeLabel}\n style={{\n data: { stroke: colors.n5 },\n }}\n />\n <VictoryAxis\n // eslint-disable-next-line rulesdir/typography\n tickFormat={x => d.format(x, isConcise ? \"MMM ''yy\" : 'MMM d')}\n tickValues={graphData.balances.map(item => item.x)}\n tickCount={Math.min(5, graphData.balances.length)}\n offsetY={50}\n />\n <VictoryAxis dependentAxis crossAxis={false} />\n </VictoryChart>\n )\n }\n </Container>\n );\n}\n\nexport default CashFlowGraph;\n","import * as monthUtils from 'loot-core/src/shared/months';\n\nimport ArrowLeft from '../../icons/v1/ArrowLeft';\nimport { styles } from '../../style';\nimport Button from '../common/Button';\nimport ButtonLink from '../common/ButtonLink';\nimport Select from '../common/Select';\nimport View from '../common/View';\nimport { FilterButton, AppliedFilters } from '../filters/FiltersMenu';\n\nfunction validateStart(allMonths, start, end) {\n const earliest = allMonths[allMonths.length - 1].name;\n if (end < start) {\n end = monthUtils.addMonths(start, 6);\n }\n return boundedRange(earliest, start, end);\n}\n\nfunction validateEnd(allMonths, start, end) {\n const earliest = allMonths[allMonths.length - 1].name;\n if (start > end) {\n start = monthUtils.subMonths(end, 6);\n }\n return boundedRange(earliest, start, end);\n}\n\nfunction boundedRange(earliest, start, end) {\n const latest = monthUtils.currentMonth();\n if (end > latest) {\n end = latest;\n }\n if (start < earliest) {\n start = earliest;\n }\n return [start, end];\n}\n\nfunction getLatestRange(offset) {\n const end = monthUtils.currentMonth();\n const start = monthUtils.subMonths(end, offset);\n return [start, end];\n}\n\nfunction getFullRange(allMonths) {\n const start = allMonths[allMonths.length - 1].name;\n const end = monthUtils.currentMonth();\n return [start, end];\n}\n\nfunction Header({\n title,\n start,\n end,\n show1Month,\n allMonths,\n onChangeDates,\n filters,\n conditionsOp,\n onApply,\n onUpdateFilter,\n onDeleteFilter,\n onCondOpChange,\n}) {\n return (\n <View\n style={{\n padding: 10,\n paddingTop: 0,\n flexShrink: 0,\n }}\n >\n <ButtonLink\n type=\"bare\"\n to=\"/reports\"\n style={{ marginBottom: '15', alignSelf: 'flex-start' }}\n >\n <ArrowLeft width={10} height={10} style={{ marginRight: 5 }} /> Back\n </ButtonLink>\n <View style={styles.veryLargeText}>{title}</View>\n\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n marginTop: 15,\n gap: 15,\n }}\n >\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n gap: 5,\n }}\n >\n <Select\n style={{ backgroundColor: 'white' }}\n onChange={newValue =>\n onChangeDates(...validateStart(allMonths, newValue, end))\n }\n value={start}\n defaultLabel={monthUtils.format(start, 'MMMM, yyyy')}\n options={allMonths.map(({ name, pretty }) => [name, pretty])}\n />\n <View>to</View>\n <Select\n style={{ backgroundColor: 'white' }}\n onChange={newValue =>\n onChangeDates(...validateEnd(allMonths, start, newValue))\n }\n value={end}\n options={allMonths.map(({ name, pretty }) => [name, pretty])}\n />\n </View>\n\n <FilterButton onApply={onApply} />\n\n {show1Month && (\n <Button\n type=\"bare\"\n onClick={() => onChangeDates(...getLatestRange(1))}\n >\n 1 month\n </Button>\n )}\n <Button type=\"bare\" onClick={() => onChangeDates(...getLatestRange(2))}>\n 3 months\n </Button>\n <Button type=\"bare\" onClick={() => onChangeDates(...getLatestRange(5))}>\n 6 months\n </Button>\n <Button\n type=\"bare\"\n onClick={() => onChangeDates(...getLatestRange(11))}\n >\n 1 Year\n </Button>\n <Button\n type=\"bare\"\n onClick={() => onChangeDates(...getFullRange(allMonths))}\n >\n All Time\n </Button>\n </View>\n {filters.length > 0 && (\n <View\n style={{ marginTop: 5 }}\n spacing={2}\n direction=\"row\"\n justify=\"flex-start\"\n align=\"flex-start\"\n >\n <AppliedFilters\n filters={filters}\n onUpdate={onUpdateFilter}\n onDelete={onDeleteFilter}\n conditionsOp={conditionsOp}\n onCondOpChange={onCondOpChange}\n />\n </View>\n )}\n </View>\n );\n}\n\nexport default Header;\n","import { useState, useEffect } from 'react';\n\nimport { useSpreadsheet } from 'loot-core/src/client/SpreadsheetProvider';\n\nfunction useReport(sheetName, getData) {\n const spreadsheet = useSpreadsheet();\n const [results, setResults] = useState(null);\n\n useEffect(() => {\n let cleanup;\n getData(spreadsheet, results => setResults(results)).then(c => {\n cleanup = c;\n });\n return () => {\n cleanup?.();\n };\n }, [getData]);\n\n return results;\n}\n\nexport default useReport;\n","import React, { useState, useEffect, useMemo } from 'react';\n\nimport * as d from 'date-fns';\n\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport { integerToCurrency } from 'loot-core/src/shared/util';\n\nimport useFilters from '../../hooks/useFilters';\nimport { colors, styles } from '../../style';\nimport AlignedText from '../common/AlignedText';\nimport Block from '../common/Block';\nimport Paragraph from '../common/Paragraph';\nimport Text from '../common/Text';\nimport View from '../common/View';\n\nimport Change from './Change';\nimport { cashFlowByDate } from './graphs/cash-flow-spreadsheet';\nimport CashFlowGraph from './graphs/CashFlowGraph';\nimport Header from './Header';\nimport useReport from './useReport';\n\nfunction CashFlow() {\n const {\n filters,\n conditionsOp,\n onApply: onApplyFilter,\n onDelete: onDeleteFilter,\n onUpdate: onUpdateFilter,\n onCondOpChange,\n } = useFilters();\n\n const [allMonths, setAllMonths] = useState(null);\n const [start, setStart] = useState(\n monthUtils.subMonths(monthUtils.currentMonth(), 30),\n );\n const [end, setEnd] = useState(monthUtils.currentDay());\n\n const [isConcise, setIsConcise] = useState(() => {\n const numDays = d.differenceInCalendarDays(\n d.parseISO(end),\n d.parseISO(start),\n );\n return numDays > 31 * 3;\n });\n\n const params = useMemo(\n () => cashFlowByDate(start, end, isConcise, filters, conditionsOp),\n [start, end, isConcise, filters, conditionsOp],\n );\n const data = useReport('cash_flow', params);\n\n useEffect(() => {\n async function run() {\n const trans = await send('get-earliest-transaction');\n const earliestMonth = trans\n ? monthUtils.monthFromDate(d.parseISO(trans.date))\n : monthUtils.currentMonth();\n\n const allMonths = monthUtils\n .rangeInclusive(earliestMonth, monthUtils.currentMonth())\n .map(month => ({\n name: month,\n pretty: monthUtils.format(month, 'MMMM, yyyy'),\n }))\n .reverse();\n\n setAllMonths(allMonths);\n }\n run();\n }, []);\n\n function onChangeDates(start, end) {\n const numDays = d.differenceInCalendarDays(\n d.parseISO(end),\n d.parseISO(start),\n );\n const isConcise = numDays > 31 * 3;\n\n let endDay = end + '-31';\n if (endDay > monthUtils.currentDay()) {\n endDay = monthUtils.currentDay();\n }\n\n setStart(start + '-01');\n setEnd(endDay);\n setIsConcise(isConcise);\n }\n\n if (!allMonths || !data) {\n return null;\n }\n\n const { graphData, totalExpenses, totalIncome, totalTransfers } = data;\n\n return (\n <View style={[styles.page, { minWidth: 650, overflow: 'hidden' }]}>\n <Header\n title=\"Cash Flow\"\n allMonths={allMonths}\n start={monthUtils.getMonth(start)}\n end={monthUtils.getMonth(end)}\n show1Month\n onChangeDates={onChangeDates}\n onApply={onApplyFilter}\n filters={filters}\n onUpdateFilter={onUpdateFilter}\n onDeleteFilter={onDeleteFilter}\n conditionsOp={conditionsOp}\n onCondOpChange={onCondOpChange}\n />\n\n <View\n style={{\n backgroundColor: 'white',\n padding: 30,\n paddingTop: 0,\n overflow: 'auto',\n }}\n >\n <View\n style={{\n paddingTop: 20,\n paddingRight: 20,\n flexShrink: 0,\n alignItems: 'flex-end',\n color: colors.n3,\n }}\n >\n <AlignedText\n style={{ marginBottom: 5, minWidth: 160 }}\n left={<Block>Income:</Block>}\n right={\n <Text style={{ fontWeight: 600 }}>\n {integerToCurrency(totalIncome)}\n </Text>\n }\n />\n\n <AlignedText\n style={{ marginBottom: 5, minWidth: 160 }}\n left={<Block>Expenses:</Block>}\n right={\n <Text style={{ fontWeight: 600 }}>\n {integerToCurrency(totalExpenses)}\n </Text>\n }\n />\n\n <AlignedText\n style={{ marginBottom: 5, minWidth: 160 }}\n left={<Block>Transfers:</Block>}\n right={\n <Text style={{ fontWeight: 600 }}>\n {integerToCurrency(totalTransfers)}\n </Text>\n }\n />\n <Text style={{ fontWeight: 600 }}>\n <Change amount={totalIncome + totalExpenses + totalTransfers} />\n </Text>\n </View>\n\n <CashFlowGraph\n start={start}\n end={end}\n graphData={graphData}\n isConcise={isConcise}\n />\n\n <View style={{ marginTop: 30 }}>\n <Paragraph>\n <strong>How is cash flow calculated?</strong>\n </Paragraph>\n <Paragraph>\n Cash flow shows the balance of your budgeted accounts over time, and\n the amount of expenses/income each day or month. Your budgeted\n accounts are considered to be “cash on hand,” so this gives you a\n picture of how available money fluctuates.\n </Paragraph>\n </View>\n </View>\n </View>\n );\n}\n\nexport default CashFlow;\n","import React from 'react';\n\nimport * as d from 'date-fns';\n\nimport q, { runQuery } from 'loot-core/src/client/query-helpers';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport {\n integerToCurrency,\n integerToAmount,\n amountToInteger,\n} from 'loot-core/src/shared/util';\n\nimport AlignedText from '../../common/AlignedText';\nimport { index } from '../util';\n\nexport default function createSpreadsheet(\n start,\n end,\n accounts,\n conditions = [],\n conditionsOp,\n) {\n return async (spreadsheet, setData) => {\n if (accounts.length === 0) {\n return null;\n }\n\n let { filters } = await send('make-filters-from-conditions', {\n conditions: conditions.filter(cond => !cond.customName),\n });\n const conditionsOpKey = conditionsOp === 'or' ? '$or' : '$and';\n\n const data = await Promise.all(\n accounts.map(async acct => {\n let [starting, balances] = await Promise.all([\n runQuery(\n q('transactions')\n .filter({\n [conditionsOpKey]: filters,\n account: acct.id,\n date: { $lt: start + '-01' },\n })\n .calculate({ $sum: '$amount' }),\n ).then(({ data }) => data),\n\n runQuery(\n q('transactions')\n .filter({\n [conditionsOpKey]: [...filters],\n })\n .filter({\n account: acct.id,\n $and: [\n { date: { $gte: start + '-01' } },\n { date: { $lte: end + '-31' } },\n ],\n })\n .groupBy({ $month: '$date' })\n .select([\n { date: { $month: '$date' } },\n { amount: { $sum: '$amount' } },\n ]),\n ).then(({ data }) => data),\n ]);\n\n return {\n id: acct.id,\n balances: index(balances, 'date'),\n starting,\n };\n }),\n );\n\n setData(recalculate(data, start, end));\n };\n}\n\nfunction recalculate(data, start, end) {\n const months = monthUtils.rangeInclusive(start, end);\n\n const accountBalances = data.map(account => {\n // Start off with the balance at that point in time\n let balance = account.starting;\n return months.map(month => {\n if (account.balances[month]) {\n balance += account.balances[month].amount;\n }\n return balance;\n });\n });\n\n let hasNegative = false;\n let startNetWorth = 0;\n let endNetWorth = 0;\n\n const graphData = months.reduce((arr, month, idx) => {\n let debt = 0;\n let assets = 0;\n let total = 0;\n const last = arr.length === 0 ? null : arr[arr.length - 1];\n\n accountBalances.forEach(balances => {\n const balance = balances[idx];\n if (balance < 0) {\n debt += -balance;\n } else {\n assets += balance;\n }\n total += balance;\n });\n\n if (total < 0) {\n hasNegative = true;\n }\n\n const x = d.parseISO(month + '-01');\n const change = last ? total - amountToInteger(last.y) : 0;\n\n const label = (\n <div>\n <div style={{ marginBottom: 10 }}>\n <strong>{d.format(x, 'MMMM yyyy')}</strong>\n </div>\n <div style={{ lineHeight: 1.5 }}>\n <AlignedText left=\"Assets:\" right={integerToCurrency(assets)} />\n <AlignedText left=\"Debt:\" right={`-${integerToCurrency(debt)}`} />\n <AlignedText\n left=\"Net worth:\"\n right={<strong>{integerToCurrency(total)}</strong>}\n />\n <AlignedText left=\"Change:\" right={integerToCurrency(change)} />\n </div>\n </div>\n );\n\n if (arr.length === 0) {\n startNetWorth = total;\n }\n endNetWorth = total;\n\n arr.push({ x, y: integerToAmount(total), premadeLabel: label });\n return arr;\n }, []);\n\n return {\n graphData: {\n data: graphData,\n hasNegative,\n start,\n end,\n },\n netWorth: endNetWorth,\n totalChange: endNetWorth - startNetWorth,\n };\n}\n","import React, { createElement } from 'react';\n\nimport * as d from 'date-fns';\nimport { type CSSProperties } from 'glamor';\nimport {\n VictoryChart,\n VictoryBar,\n VictoryArea,\n VictoryAxis,\n VictoryVoronoiContainer,\n VictoryGroup,\n} from 'victory';\n\nimport theme from '../chart-theme';\nimport Container from '../Container';\nimport Tooltip from '../Tooltip';\n\ntype AreaProps = {\n start: string;\n end: string;\n scale?;\n range?;\n};\nfunction Area({ start, end, scale, range }: AreaProps) {\n const zero = scale.y(0);\n\n const startX = scale.x(d.parseISO(start + '-01'));\n const endX = scale.x(d.parseISO(end + '-01'));\n\n if (startX < 0 || endX < 0) {\n return null;\n }\n\n return (\n <svg>\n <defs>\n <clipPath id=\"positive\">\n <rect\n x={startX}\n y={range.y[1]}\n width={endX - startX}\n height={zero - range.y[1] + 1}\n fill=\"#ffffff\"\n />\n </clipPath>\n <clipPath id=\"negative\">\n <rect\n x={startX}\n y={zero + 1}\n width={endX - startX}\n height={Math.max(range.y[0] - zero - 1, 0)}\n fill=\"#ffffff\"\n />\n </clipPath>\n <linearGradient\n id=\"positive-gradient\"\n gradientUnits=\"userSpaceOnUse\"\n x1={0}\n y1={range.y[1]}\n x2={0}\n y2={zero}\n >\n <stop offset=\"0%\" stopColor={theme.colors.blueFadeStart} />\n <stop offset=\"100%\" stopColor={theme.colors.blueFadeEnd} />\n </linearGradient>\n <linearGradient\n id=\"negative-gradient\"\n gradientUnits=\"userSpaceOnUse\"\n x1={0}\n y1={zero}\n x2={0}\n y2={range.y[0]}\n >\n <stop offset=\"0%\" stopColor={theme.colors.redFadeEnd} />\n <stop offset=\"100%\" stopColor={theme.colors.redFadeStart} />\n </linearGradient>\n </defs>\n </svg>\n );\n}\n\ntype NetWorthGraphProps = {\n style?: CSSProperties;\n graphData;\n compact: boolean;\n};\nfunction NetWorthGraph({ style, graphData, compact }: NetWorthGraphProps) {\n const Chart = compact ? VictoryGroup : VictoryChart;\n\n return (\n <Container style={[style, compact && { height: 'auto' }]}>\n {(width, height, portalHost) =>\n graphData && (\n <Chart\n scale={{ x: 'time', y: 'linear' }}\n theme={theme}\n domainPadding={{ x: 0, y: 10 }}\n width={width}\n height={height}\n containerComponent={\n <VictoryVoronoiContainer voronoiDimension=\"x\" />\n }\n padding={\n compact && {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n }\n }\n >\n <Area start={graphData.start} end={graphData.end} />\n {createElement(\n // @ts-expect-error defaultProps mismatch causing issue\n graphData.data.length === 1 ? VictoryBar : VictoryArea,\n {\n data: graphData.data,\n labelComponent: <Tooltip portalHost={portalHost} />,\n labels: x => x.premadeLabel,\n style: {\n data:\n graphData.data.length === 1\n ? { width: 50 }\n : {\n clipPath: 'url(#positive)',\n fill: 'url(#positive-gradient)',\n },\n },\n },\n )}\n {graphData.data.length > 1 && (\n <VictoryArea\n data={graphData.data}\n style={{\n data: {\n clipPath: 'url(#negative)',\n fill: 'url(#negative-gradient)',\n stroke: theme.colors.red,\n strokeLinejoin: 'round',\n },\n }}\n />\n )}\n {/* Somehow the path `d` attributes are stripped from second\n `<VictoryArea />` above if this is removed. I’m just as\n confused as you are! */}\n <VictoryArea\n data={graphData.data}\n style={{ data: { fill: 'none', stroke: 'none' } }}\n />\n {!compact && (\n <VictoryAxis\n style={{ ticks: { stroke: 'red' } }}\n // eslint-disable-next-line rulesdir/typography\n tickFormat={x => d.format(x, \"MMM ''yy\")}\n tickValues={graphData.data.map(item => item.x)}\n tickCount={Math.min(5, graphData.data.length)}\n offsetY={50}\n />\n )}\n {!compact && (\n <VictoryAxis dependentAxis crossAxis={!graphData.hasNegative} />\n )}\n </Chart>\n )\n }\n </Container>\n );\n}\n\nexport default NetWorthGraph;\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport * as d from 'date-fns';\n\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport { integerToCurrency } from 'loot-core/src/shared/util';\n\nimport useFilters from '../../hooks/useFilters';\nimport { styles } from '../../style';\nimport Paragraph from '../common/Paragraph';\nimport View from '../common/View';\n\nimport Change from './Change';\nimport netWorthSpreadsheet from './graphs/net-worth-spreadsheet';\nimport NetWorthGraph from './graphs/NetWorthGraph';\nimport Header from './Header';\nimport useReport from './useReport';\nimport { fromDateRepr } from './util';\n\nexport default function NetWorth() {\n let accounts = useSelector(state => state.queries.accounts);\n const {\n filters,\n saved,\n conditionsOp,\n onApply: onApplyFilter,\n onDelete: onDeleteFilter,\n onUpdate: onUpdateFilter,\n onCondOpChange,\n } = useFilters();\n\n const [allMonths, setAllMonths] = useState(null);\n const [start, setStart] = useState(\n monthUtils.subMonths(monthUtils.currentMonth(), 5),\n );\n const [end, setEnd] = useState(monthUtils.currentMonth());\n\n const params = useMemo(\n () => netWorthSpreadsheet(start, end, accounts, filters, conditionsOp),\n [start, end, accounts, filters, conditionsOp],\n );\n const data = useReport('net_worth', params);\n\n useEffect(() => {\n async function run() {\n const trans = await send('get-earliest-transaction');\n const currentMonth = monthUtils.currentMonth();\n let earliestMonth = trans\n ? monthUtils.monthFromDate(d.parseISO(fromDateRepr(trans.date)))\n : currentMonth;\n\n // Make sure the month selects are at least populates with a\n // year's worth of months. We can undo this when we have fancier\n // date selects.\n const yearAgo = monthUtils.subMonths(monthUtils.currentMonth(), 12);\n if (earliestMonth > yearAgo) {\n earliestMonth = yearAgo;\n }\n\n const allMonths = monthUtils\n .rangeInclusive(earliestMonth, monthUtils.currentMonth())\n .map(month => ({\n name: month,\n pretty: monthUtils.format(month, 'MMMM, yyyy'),\n }))\n .reverse();\n\n setAllMonths(allMonths);\n }\n run();\n }, []);\n\n function onChangeDates(start, end) {\n setStart(start);\n setEnd(end);\n }\n\n if (!allMonths || !data) {\n return null;\n }\n\n return (\n <View style={[styles.page, { minWidth: 650, overflow: 'hidden' }]}>\n <Header\n title=\"Net Worth\"\n allMonths={allMonths}\n start={start}\n end={end}\n onChangeDates={onChangeDates}\n filters={filters}\n saved={saved}\n onApply={onApplyFilter}\n onUpdateFilter={onUpdateFilter}\n onDeleteFilter={onDeleteFilter}\n conditionsOp={conditionsOp}\n onCondOpChange={onCondOpChange}\n />\n\n <View\n style={{\n backgroundColor: 'white',\n padding: 30,\n paddingTop: 0,\n overflow: 'auto',\n }}\n >\n <View\n style={{\n textAlign: 'right',\n paddingTop: 20,\n paddingRight: 20,\n flexShrink: 0,\n }}\n >\n <View\n style={[styles.largeText, { fontWeight: 400, marginBottom: 5 }]}\n >\n {integerToCurrency(data.netWorth)}\n </View>\n <Change amount={data.totalChange} />\n </View>\n\n <NetWorthGraph start={start} end={end} graphData={data.graphData} />\n\n <View style={{ marginTop: 30 }}>\n <Paragraph>\n <strong>How is net worth calculated?</strong>\n </Paragraph>\n <Paragraph>\n Net worth shows the balance of all accounts over time, including all\n of your investments. Your “net worth” is considered to be the amount\n you’d have if you sold all your assets and paid off as much debt as\n possible. If you hover over the graph, you can also see the amount\n of assets and debt individually.\n </Paragraph>\n </View>\n </View>\n </View>\n );\n}\n","import React from 'react';\n\nimport * as d from 'date-fns';\n\nimport { colors } from '../../style';\nimport Block from '../common/Block';\n\nfunction DateRange({ start, end }) {\n start = d.parseISO(start);\n end = d.parseISO(end);\n\n let content;\n if (start.getYear() !== end.getYear()) {\n content = (\n <div>\n {d.format(start, 'MMM yyyy')} - {d.format(end, 'MMM yyyy')}\n </div>\n );\n } else if (start.getMonth() !== end.getMonth()) {\n content = (\n <div>\n {d.format(start, 'MMM')} - {d.format(end, 'MMM yyyy')}\n </div>\n );\n } else {\n content = d.format(end, 'MMMM yyyy');\n }\n\n return <Block style={{ color: colors.n6 }}>{content}</Block>;\n}\n\nexport default DateRange;\n","import React, { useMemo } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { VictoryBar, VictoryGroup, VictoryVoronoiContainer } from 'victory';\n\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport { integerToCurrency } from 'loot-core/src/shared/util';\n\nimport { colors, styles } from '../../style';\nimport AnchorLink from '../common/AnchorLink';\nimport Block from '../common/Block';\nimport View from '../common/View';\n\nimport Change from './Change';\nimport theme from './chart-theme';\nimport Container from './Container';\nimport DateRange from './DateRange';\nimport { simpleCashFlow } from './graphs/cash-flow-spreadsheet';\nimport netWorthSpreadsheet from './graphs/net-worth-spreadsheet';\nimport NetWorthGraph from './graphs/NetWorthGraph';\nimport Tooltip from './Tooltip';\nimport useReport from './useReport';\n\nfunction Card({ flex, to, style, children }) {\n const containerProps = { flex, margin: 15 };\n\n const content = (\n <View\n style={[\n {\n backgroundColor: 'white',\n borderRadius: 2,\n height: 200,\n boxShadow: '0 2px 6px rgba(0, 0, 0, .15)',\n transition: 'box-shadow .25s',\n ':hover': to && {\n boxShadow: '0 4px 6px rgba(0, 0, 0, .15)',\n },\n },\n to ? null : containerProps,\n style,\n ]}\n >\n {children}\n </View>\n );\n\n if (to) {\n return (\n <AnchorLink\n to={to}\n style={[{ textDecoration: 'none', flex }, containerProps]}\n >\n {content}\n </AnchorLink>\n );\n }\n return content;\n}\n\nfunction NetWorthCard({ accounts }) {\n const end = monthUtils.currentMonth();\n const start = monthUtils.subMonths(end, 5);\n\n const params = useMemo(\n () => netWorthSpreadsheet(start, end, accounts),\n [start, end, accounts],\n );\n const data = useReport('net_worth', params);\n\n if (!data) {\n return null;\n }\n\n return (\n <Card flex={2} to=\"/reports/net-worth\">\n <View style={{ flex: 1 }}>\n <View style={{ flexDirection: 'row', padding: 20 }}>\n <View style={{ flex: 1 }}>\n <Block\n style={[styles.mediumText, { fontWeight: 500, marginBottom: 5 }]}\n role=\"heading\"\n >\n Net Worth\n </Block>\n <DateRange start={start} end={end} />\n </View>\n <View style={{ textAlign: 'right' }}>\n <Block\n style={[styles.mediumText, { fontWeight: 500, marginBottom: 5 }]}\n >\n {integerToCurrency(data.netWorth)}\n </Block>\n <Change\n amount={data.totalChange}\n style={{ color: colors.n6, fontWeight: 300 }}\n />\n </View>\n </View>\n\n <NetWorthGraph\n start={start}\n end={end}\n graphData={data.graphData}\n compact={true}\n style={{ height: 'auto', flex: 1 }}\n />\n </View>\n </Card>\n );\n}\n\nfunction CashFlowCard() {\n const end = monthUtils.currentDay();\n const start = monthUtils.currentMonth() + '-01';\n\n const params = useMemo(() => simpleCashFlow(start, end), [start, end]);\n const data = useReport('cash_flow_simple', params);\n if (!data) {\n return null;\n }\n\n const { graphData } = data;\n const expense = -(graphData.expense || 0);\n const income = graphData.income || 0;\n\n return (\n <Card flex={1} to=\"/reports/cash-flow\">\n <View style={{ flex: 1 }}>\n <View style={{ flexDirection: 'row', padding: 20 }}>\n <View style={{ flex: 1 }}>\n <Block\n style={[styles.mediumText, { fontWeight: 500, marginBottom: 5 }]}\n role=\"heading\"\n >\n Cash Flow\n </Block>\n <DateRange start={start} end={end} />\n </View>\n <View style={{ textAlign: 'right' }}>\n <Change\n amount={income - expense}\n style={{ color: colors.n6, fontWeight: 300 }}\n />\n </View>\n </View>\n\n <Container style={{ height: 'auto', flex: 1 }}>\n {(width, height, portalHost) => (\n <VictoryGroup\n colorScale={[theme.colors.blue, theme.colors.red]}\n width={100}\n height={height}\n theme={theme}\n domain={{\n x: [0, 100],\n y: [0, Math.max(income, expense, 100)],\n }}\n containerComponent={\n <VictoryVoronoiContainer voronoiDimension=\"x\" />\n }\n labelComponent={\n <Tooltip\n portalHost={portalHost}\n offsetX={(width - 100) / 2}\n offsetY={y => (y + 40 > height ? height - 40 : y)}\n light={true}\n forceActive={true}\n style={{\n padding: 0,\n }}\n />\n }\n padding={{\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n }}\n >\n <VictoryBar\n barWidth={13}\n data={[\n {\n x: 30,\n y: Math.max(income, 5),\n premadeLabel: (\n <div style={{ textAlign: 'right' }}>\n <div>Income</div>\n <div>{integerToCurrency(income)}</div>\n </div>\n ),\n labelPosition: 'left',\n },\n ]}\n labels={d => d.premadeLabel}\n />\n <VictoryBar\n barWidth={13}\n data={[\n {\n x: 60,\n y: Math.max(expense, 5),\n premadeLabel: (\n <div>\n <div>Expenses</div>\n <div>{integerToCurrency(expense)}</div>\n </div>\n ),\n labelPosition: 'right',\n fill: theme.colors.red,\n },\n ]}\n labels={d => d.premadeLabel}\n />\n </VictoryGroup>\n )}\n </Container>\n </View>\n </Card>\n );\n}\n\nexport default function Overview() {\n let accounts = useSelector(state => state.queries.accounts);\n return (\n <View\n style={[\n styles.page,\n { paddingLeft: 40, paddingRight: 40, minWidth: 700 },\n ]}\n >\n <View\n style={{\n flexDirection: 'row',\n flex: '0 0 auto',\n }}\n >\n <NetWorthCard accounts={accounts} />\n <CashFlowCard />\n </View>\n\n <View\n style={{\n flex: '0 0 auto',\n flexDirection: 'row',\n }}\n >\n <Card\n style={[\n {\n color: '#a0a0a0',\n justifyContent: 'center',\n alignItems: 'center',\n width: 200,\n },\n styles.mediumText,\n ]}\n >\n More reports\n <br /> coming soon!\n </Card>\n </View>\n </View>\n );\n}\n","import React from 'react';\nimport { Route, Routes } from 'react-router-dom';\n\nimport CashFlow from './CashFlow';\nimport NetWorth from './NetWorth';\nimport Overview from './Overview';\n\nexport function ReportRouter() {\n return (\n <Routes>\n <Route path=\"/\" element={<Overview />} />\n <Route path=\"/net-worth\" element={<NetWorth />} />\n <Route path=\"/cash-flow\" element={<CashFlow />} />\n </Routes>\n );\n}\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","initialFilters","arguments","undefined","setFilters","setConditionsOp","setSaved","useCallback","oldFilter","updatedFilter","deletedFilter","condOp","useMemo","amount","Block","styles","integerToCurrency","runAll","queries","cb","Promise","all","q","runQuery","then","index","mapper","result","forEach","indexCashFlow","isTransfer","results","findExisting","xfer","cashFlowByDate","start","end","isConcise","spreadsheet","setData","conditionsOpKey","makeQuery","where","query","$and","$transform","$gte","$lte","groupBy","$month","select","$sum","$lt","calculate","$gt","startingBalance","income","expense","convIncome","t","convExpense","dates","monthUtils","incomes","expenses","balance","totalExpenses","totalIncome","totalTransfers","graphData","reduce","creditTransfers","debitTransfers","false","true","x","label","lineHeight","AlignedText","left","right","push","y","integerToAmount","balances","premadeLabel","totalChange","recalculate","baseLabelStyles","fontFamily","fontSize","letterSpacing","stroke","axisBaseStyles","axis","grid","pointerEvents","ticks","size","axisLabel","tickLabels","blueFadeStart","blueFadeEnd","redFadeStart","redFadeEnd","red","blue","area","labels","strokeWidth","strokeLinejoin","strokeLinecap","dependentAxis","strokeDasharray","independentAxis","bar","line","voronoi","chart","top","bottom","Container","portalHost","ref","AutoSizer","Component","render","active","scale","datum","offsetX","offsetY","light","forceActive","this","xPos","range","labelPosition","ReactDOM","css","transform","zIndex","boxShadow","before","borderTop","borderBottom","content","defaultEvents","VictoryTooltip","VictoryChart","theme","domainPadding","containerComponent","VictoryVoronoiContainer","voronoiDimension","VictoryGroup","VictoryBar","VictoryLine","labelComponent","VictoryAxis","tickFormat","tickValues","tickCount","Math","min","crossAxis","boundedRange","earliest","latest","getLatestRange","offset","show1Month","allMonths","onChangeDates","paddingTop","ButtonLink","to","alignSelf","ArrowLeft","gap","newValue","validateStart","defaultLabel","pretty","validateEnd","getFullRange","sheetName","getData","useSpreadsheet","setResults","cleanup","c","_cleanup","onApplyFilter","setAllMonths","setStart","setEnd","setIsConcise","params","useReport","trans","earliestMonth","reverse","run","minWidth","Header","endDay","fontWeight","Change","CashFlowGraph","Paragraph","createSpreadsheet","accounts","months","accountBalances","account","starting","hasNegative","startNetWorth","endNetWorth","arr","idx","debt","assets","total","last","change","amountToInteger","netWorth","acct","Area","zero","startX","endX","max","gradientUnits","x1","y1","x2","y2","stopColor","compact","Chart","createElement","VictoryArea","clipPath","NetWorth","netWorthSpreadsheet","currentMonth","yearAgo","textAlign","NetWorthGraph","getYear","getMonth","Card","containerProps","transition","AnchorLink","textDecoration","NetWorthCard","role","DateRange","CashFlowCard","$or","simpleCashFlow","colorScale","domain","barWidth","Overview","justifyContent","ReportRouter","Routes","Route","path","element","CashFlow"],"sourceRoot":""}
|