import React, { useState } from 'react'; import Component from '@reactions/component'; import { css } from 'glamor'; import { rolloverBudget } from 'loot-core/src/client/queries'; import * as monthUtils from 'loot-core/src/shared/months'; import { colors, styles } from '../../../style'; import DotsHorizontalTriple from '../../../svg/v1/DotsHorizontalTriple'; import ArrowButtonDown1 from '../../../svg/v2/ArrowButtonDown1'; import ArrowButtonUp1 from '../../../svg/v2/ArrowButtonUp1'; import { View, Block, Button, Tooltip, Menu, HoverTarget, AlignedText } from '../../common'; import NotesButton from '../../NotesButton'; import CellValue from '../../spreadsheet/CellValue'; import format from '../../spreadsheet/format'; import NamespaceContext from '../../spreadsheet/NamespaceContext'; import SheetValue from '../../spreadsheet/SheetValue'; import { MONTH_BOX_SHADOW } from '../constants'; import HoldTooltip from './HoldTooltip'; import { useRollover } from './RolloverContext'; import TransferTooltip from './TransferTooltip'; function TotalsList({ prevMonthName, collapsed }) { return ( ( } /> } /> )} > { let v = format(value, 'financial'); return value > 0 ? '+' + v : value === 0 ? '-' + v : v; }} style={[{ fontWeight: 600 }, styles.tnum]} /> { let v = format(value, 'financial'); return value > 0 ? '+' + v : value === 0 ? '-' + v : v; }} style={[{ fontWeight: 600 }, styles.tnum]} /> { let n = parseInt(value) || 0; let v = format(Math.abs(n), 'financial'); return n >= 0 ? '-' + v : '+' + v; }} style={[{ fontWeight: 600 }, styles.tnum]} /> Available Funds Overspent in {prevMonthName} Budgeted For Next Month ); } function ToBudget({ month, prevMonthName, collapsed, onBudgetAction }) { return ( {node => { const availableValue = parseInt(node.value); const num = isNaN(availableValue) ? 0 : availableValue; const isNegative = num < 0; return ( {isNegative ? 'Overbudgeted:' : 'To Budget:'} {({ state, setState }) => ( ( )} > setState({ menuOpen: 'actions' })} data-cellname={node.name} {...css([ styles.veryLargeText, { fontWeight: 400, userSelect: 'none', cursor: 'pointer', color: isNegative ? colors.r4 : colors.p5, marginBottom: -1, borderBottom: '1px solid transparent', ':hover': { borderColor: isNegative ? colors.r4 : colors.p5 } } ])} > {format(num, 'financial')} {state.menuOpen === 'actions' && ( setState({ menuOpen: null })} > { if (type === 'reset-buffer') { onBudgetAction(month, 'reset-hold'); setState({ menuOpen: null }); } else { setState({ menuOpen: type }); } }} items={[ { name: 'transfer', text: 'Move to a category' }, { name: 'buffer', text: 'Hold for next month' }, { name: 'reset-buffer', text: "Reset next month's buffer" } ]} /> )} {state.menuOpen === 'buffer' && ( setState({ menuOpen: null })} onSubmit={amount => { onBudgetAction(month, 'hold', { amount }); }} /> )} {state.menuOpen === 'transfer' && ( setState({ menuOpen: null })} onSubmit={(amount, category) => { onBudgetAction(month, 'transfer-available', { amount, category }); }} /> )} )} ); }} ); } export default React.memo(function BudgetSummary({ month }) { let { currentMonth, summaryCollapsed: collapsed, onBudgetAction, onToggleSummaryCollapse } = useRollover(); let [menuOpen, setMenuOpen] = useState(false); function onMenuOpen(e) { setMenuOpen(true); } function onMenuClose(bag) { setMenuOpen(false); } let prevMonthName = monthUtils.format(monthUtils.prevMonth(month), 'MMM'); let ExpandOrCollapseIcon = collapsed ? ArrowButtonDown1 : ArrowButtonUp1; return (
{monthUtils.format(month, 'MMMM')}
{menuOpen && ( { onMenuClose(); onBudgetAction(month, type); }} items={[ { name: 'copy-last', text: "Copy last month's budget" }, { name: 'set-zero', text: 'Set budgets to zero' }, { name: 'set-3-avg', text: 'Set budgets to 3 month avg' } ]} /> )} {collapsed ? ( ) : ( <> )} ); });