-
Matiss Janis Aboltins authoredMatiss Janis Aboltins authored
BudgetSummary.tsx 6.77 KiB
import React, { useRef, useState } from 'react';
import { css } from 'glamor';
import * as monthUtils from 'loot-core/src/shared/months';
import { SvgDotsHorizontalTriple } from '../../../../icons/v1';
import { SvgArrowButtonDown1, SvgArrowButtonUp1 } from '../../../../icons/v2';
import { theme, styles } from '../../../../style';
import { Button } from '../../../common/Button';
import { Popover } from '../../../common/Popover';
import { View } from '../../../common/View';
import { NotesButton } from '../../../NotesButton';
import { NamespaceContext } from '../../../spreadsheet/NamespaceContext';
import { useRollover } from '../RolloverContext';
import { BudgetMonthMenu } from './BudgetMonthMenu';
import { ToBudget } from './ToBudget';
import { TotalsList } from './TotalsList';
type BudgetSummaryProps = {
month: string;
isGoalTemplatesEnabled?: boolean;
};
export function BudgetSummary({ month }: BudgetSummaryProps) {
const {
currentMonth,
summaryCollapsed: collapsed,
onBudgetAction,
onToggleSummaryCollapse,
} = useRollover();
const [menuOpen, setMenuOpen] = useState(false);
const triggerRef = useRef(null);
function onMenuOpen() {
setMenuOpen(true);
}
function onMenuClose() {
setMenuOpen(false);
}
const prevMonthName = monthUtils.format(monthUtils.prevMonth(month), 'MMM');
const ExpandOrCollapseIcon = collapsed
? SvgArrowButtonDown1
: SvgArrowButtonUp1;
return (
<View
data-testid="budget-summary"
style={{
backgroundColor: theme.tableBackground,
boxShadow: styles.cardShadow,
borderRadius: 6,
marginLeft: 0,
marginRight: 0,
marginTop: 5,
flex: 1,
cursor: 'default',
marginBottom: 5,
overflow: 'hidden',
'& .hover-visible': {
opacity: 0,
transition: 'opacity .25s',
},
'&:hover .hover-visible': {
opacity: 1,
},
}}
>
<NamespaceContext.Provider value={monthUtils.sheetForMonth(month)}>
<View
style={{
padding: '0 13px',
...(collapsed ? { margin: '10px 0' } : { marginTop: 16 }),
}}
>
<View
style={{
position: 'absolute',
left: 10,
top: 0,
}}
>
<Button
type="bare"
aria-label={`${collapsed ? 'Expand' : 'Collapse'} month summary`}
className="hover-visible"
onClick={onToggleSummaryCollapse}
>
<ExpandOrCollapseIcon
width={13}
height={13}
// The margin is to make it the exact same size as the dots button
style={{ color: theme.tableTextLight, margin: 1 }}
/>
</Button>
</View>
<div
className={`${css([
{
textAlign: 'center',
marginTop: 3,
fontSize: 18,
fontWeight: 500,
textDecorationSkip: 'ink',
},
currentMonth === month && { fontWeight: 'bold' },
])}`}
>
{monthUtils.format(month, 'MMMM')}
</div>
<View
style={{
position: 'absolute',
right: 10,
top: 0,
flexDirection: 'row',
alignItems: 'center',
}}
>
<View>
<NotesButton
id={`budget-${month}`}
width={15}
height={15}
tooltipPosition="bottom right"
defaultColor={theme.tableTextLight}
/>
</View>
<View style={{ userSelect: 'none', marginLeft: 2 }}>
<Button
ref={triggerRef}
type="bare"
aria-label="Menu"
onClick={onMenuOpen}
>
<SvgDotsHorizontalTriple
width={15}
height={15}
style={{ color: theme.pageTextLight }}
/>
</Button>
<Popover
triggerRef={triggerRef}
isOpen={menuOpen}
onOpenChange={onMenuClose}
>
<BudgetMonthMenu
onCopyLastMonthBudget={() => {
onBudgetAction(month, 'copy-last');
onMenuClose();
}}
onSetBudgetsToZero={() => {
onBudgetAction(month, 'set-zero');
onMenuClose();
}}
onSetMonthsAverage={numberOfMonths => {
onBudgetAction(month, `set-${numberOfMonths}-avg`);
onMenuClose();
}}
onCheckTemplates={() => {
onBudgetAction(month, 'check-templates');
onMenuClose();
}}
onApplyBudgetTemplates={() => {
onBudgetAction(month, 'apply-goal-template');
onMenuClose();
}}
onOverwriteWithBudgetTemplates={() => {
onBudgetAction(month, 'overwrite-goal-template');
onMenuClose();
}}
onEndOfMonthCleanup={() => {
onBudgetAction(month, 'cleanup-goal-template');
onMenuClose();
}}
/>
</Popover>
</View>
</View>
</View>
{collapsed ? (
<View
style={{
alignItems: 'center',
padding: '10px 20px',
justifyContent: 'space-between',
backgroundColor: theme.tableBackground,
borderTop: '1px solid ' + theme.tableBorder,
}}
>
<ToBudget
prevMonthName={prevMonthName}
month={month}
onBudgetAction={onBudgetAction}
isCollapsed
/>
</View>
) : (
<>
<TotalsList
prevMonthName={prevMonthName}
style={{
padding: '5px 0',
marginTop: 17,
backgroundColor: theme.tableRowHeaderBackground,
borderTopWidth: 1,
borderBottomWidth: 1,
borderColor: theme.tableBorder,
}}
/>
<View style={{ margin: '23px 0' }}>
<ToBudget
prevMonthName={prevMonthName}
month={month}
onBudgetAction={onBudgetAction}
/>
</View>
</>
)}
</NamespaceContext.Provider>
</View>
);
}