import React, { useState } from 'react'; import { css } from 'glamor'; import { reportBudget } 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, Text, Button, Tooltip, Menu, Stack, HoverTarget, AlignedText } from '../../common'; import NotesButton from '../../NotesButton'; import CellValue from '../../spreadsheet/CellValue'; import format from '../../spreadsheet/format'; import NamespaceContext from '../../spreadsheet/NamespaceContext'; import useSheetValue from '../../spreadsheet/useSheetValue'; import { MONTH_BOX_SHADOW } from '../constants'; import { makeAmountFullStyle } from '../util'; import { useReport } from './ReportContext'; function PieProgress({ style, progress, color, backgroundColor }) { let radius = 4; let circum = 2 * Math.PI * radius; let dash = progress * circum; let gap = circum; return ( {' '} ); } function fraction(num, denom) { if (denom === 0) { if (num > 0) { return 1; } return 0; } return num / denom; } function IncomeProgress({ current, target }) { let totalIncome = useSheetValue(current) || 0; let totalBudgeted = useSheetValue(target) || 0; let over = false; if (totalIncome < 0) { over = true; totalIncome = -totalIncome; } let frac = fraction(totalIncome, totalBudgeted); return ( ); } function ExpenseProgress({ current, target }) { let totalSpent = useSheetValue(current) || 0; let totalBudgeted = useSheetValue(target) || 0; // Reverse total spent, and also set a bottom boundary of 0 (in case // income goes into an expense category and it's "positive", don't // show that in the graph) totalSpent = Math.max(-totalSpent, 0); let frac; let over = false; if (totalSpent > totalBudgeted) { frac = (totalSpent - totalBudgeted) / totalBudgeted; over = true; } else { frac = fraction(totalSpent, totalBudgeted); } return ( ); } function BudgetTotal({ title, current, target, ProgressComponent, style }) { return ( {title} {' of '} ); } function IncomeTotal({ projected, style }) { return ( ); } function ExpenseTotal({ style }) { return ( ); } function Saved({ projected, style }) { let budgetedSaved = useSheetValue(reportBudget.totalBudgetedSaved) || 0; let totalSaved = useSheetValue(reportBudget.totalSaved) || 0; let saved = projected ? budgetedSaved : totalSaved; let isNegative = saved < 0; return ( {projected ? ( Projected Savings: ) : ( {isNegative ? 'Overspent:' : 'Saved:'} )} { if (!projected) { let diff = totalSaved - budgetedSaved; return ( {format(budgetedSaved, 'financial-with-sign')} } /> {format(diff, 'financial-with-sign')} } /> ); } return null; }} > {format(saved, 'financial')} ); } export default React.memo(function BudgetSummary({ month }) { let { currentMonth, summaryCollapsed: collapsed, onBudgetAction, onToggleSummaryCollapse } = useReport(); let [menuOpen, setMenuOpen] = useState(false); function onMenuOpen(e) { setMenuOpen(true); } function onMenuClose(bag) { setMenuOpen(false); } 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 && ( )} {collapsed ? ( = currentMonth} /> ) : ( = currentMonth} style={{ marginTop: 13, marginBottom: 20 }} /> )} ); });