Compare commits

...

3 Commits

Author SHA1 Message Date
Joel Jeremy Marquez
1bc77b5554 Update packages/desktop-client/src/components/budget/BalanceWithCarryover.tsx
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2024-09-25 14:04:45 -07:00
Joel Jeremy Marquez
a5fbd5ad43 Release notes 2024-09-25 14:03:09 -07:00
Joel Jeremy Marquez
2d8584c881 Fix mobile balance modal colors 2024-09-25 14:03:09 -07:00
5 changed files with 111 additions and 84 deletions

View File

@@ -61,16 +61,25 @@ function GoalTooltipRow({ children }) {
); );
} }
type CellValueChildren = ComponentPropsWithoutRef<typeof CellValue>['children'];
type ChildrenWithClassName = (
props: Parameters<CellValueChildren>[0] & {
className: string;
},
) => ReturnType<CellValueChildren>;
type BalanceWithCarryoverProps = Omit< type BalanceWithCarryoverProps = Omit<
ComponentPropsWithoutRef<typeof CellValue>, ComponentPropsWithoutRef<typeof CellValue>,
'binding' 'children' | 'binding'
> & { > & {
children?: ChildrenWithClassName;
carryover: Binding<'envelope-budget', 'carryover'>; carryover: Binding<'envelope-budget', 'carryover'>;
balance: Binding<'envelope-budget', 'leftover'>; balance: Binding<'envelope-budget', 'leftover'>;
goal: Binding<'envelope-budget', 'goal'>; goal: Binding<'envelope-budget', 'goal'>;
budgeted: Binding<'envelope-budget', 'budget'>; budgeted: Binding<'envelope-budget', 'budget'>;
longGoal: Binding<'envelope-budget', 'long-goal'>; longGoal: Binding<'envelope-budget', 'long-goal'>;
disabled?: boolean; isDisabled?: boolean;
CarryoverIndicator?: ComponentType<CarryoverIndicatorProps>; CarryoverIndicator?: ComponentType<CarryoverIndicatorProps>;
}; };
@@ -80,7 +89,7 @@ export function BalanceWithCarryover({
goal, goal,
budgeted, budgeted,
longGoal, longGoal,
disabled, isDisabled,
CarryoverIndicator: CarryoverIndicatorComponent = CarryoverIndicator, CarryoverIndicator: CarryoverIndicatorComponent = CarryoverIndicator,
children, children,
...props ...props
@@ -91,7 +100,7 @@ export function BalanceWithCarryover({
const budgetedValue = useSheetValue(budgeted); const budgetedValue = useSheetValue(budgeted);
const longGoalValue = useSheetValue(longGoal); const longGoalValue = useSheetValue(longGoal);
const isGoalTemplatesEnabled = useFeatureFlag('goalTemplatesEnabled'); const isGoalTemplatesEnabled = useFeatureFlag('goalTemplatesEnabled');
const getBalanceStyle = useCallback( const getBalanceAmountStyle = useCallback(
(balanceValue: number) => (balanceValue: number) =>
makeBalanceAmountStyle( makeBalanceAmountStyle(
balanceValue, balanceValue,
@@ -102,7 +111,7 @@ export function BalanceWithCarryover({
); );
const format = useFormat(); const format = useFormat();
const differenceToGoal = useCallback( const getDifferenceToGoal = useCallback(
(balanceValue: number) => (balanceValue: number) =>
longGoalValue === 1 longGoalValue === 1
? balanceValue - goalValue ? balanceValue - goalValue
@@ -110,26 +119,40 @@ export function BalanceWithCarryover({
[budgetedValue, goalValue, longGoalValue], [budgetedValue, goalValue, longGoalValue],
); );
const getDefaultClassName = useCallback(
(balanceValue: number) =>
String(
css({
...getBalanceAmountStyle(balanceValue),
overflow: 'hidden',
textOverflow: 'ellipsis',
textAlign: 'right',
...(!isDisabled && {
cursor: 'pointer',
}),
':hover': { textDecoration: 'underline' },
}),
),
[getBalanceAmountStyle, isDisabled],
);
return ( return (
<CellValue binding={balance} type="financial" {...props}> <CellValue binding={balance} type="financial" {...props}>
{({ type, name, value: balanceValue }) => ( {({ type, name, value: balanceValue }) => (
<> <>
{children ? (
children({ type, name, value: balanceValue })
) : (
<Tooltip <Tooltip
content={ content={
<View style={{ padding: 10 }}> <View style={{ padding: 10 }}>
<span style={{ fontWeight: 'bold' }}> <span style={{ fontWeight: 'bold' }}>
{differenceToGoal(balanceValue) === 0 ? ( {getDifferenceToGoal(balanceValue) === 0 ? (
<span style={{ color: theme.noticeText }}> <span style={{ color: theme.noticeText }}>
{t('Fully funded')} {t('Fully funded')}
</span> </span>
) : differenceToGoal(balanceValue) > 0 ? ( ) : getDifferenceToGoal(balanceValue) > 0 ? (
<span style={{ color: theme.noticeText }}> <span style={{ color: theme.noticeText }}>
{t('Overfunded ({{amount}})', { {t('Overfunded ({{amount}})', {
amount: format( amount: format(
differenceToGoal(balanceValue), getDifferenceToGoal(balanceValue),
'financial', 'financial',
), ),
})} })}
@@ -138,7 +161,7 @@ export function BalanceWithCarryover({
<span style={{ color: theme.errorText }}> <span style={{ color: theme.errorText }}>
{t('Underfunded ({{amount}})', { {t('Underfunded ({{amount}})', {
amount: format( amount: format(
differenceToGoal(balanceValue), getDifferenceToGoal(balanceValue),
'financial', 'financial',
), ),
})} })}
@@ -147,7 +170,7 @@ export function BalanceWithCarryover({
</span> </span>
<GoalTooltipRow> <GoalTooltipRow>
<div>{t('Goal Type:')}</div> <div>{t('Goal Type:')}</div>
<div>{longGoalValue === 1 ? 'Long' : 'Template'}</div> <div>{longGoalValue === 1 ? t('Long') : t('Template')}</div>
</GoalTooltipRow> </GoalTooltipRow>
<GoalTooltipRow> <GoalTooltipRow>
<div>{t('Goal:')}</div> <div>{t('Goal:')}</div>
@@ -175,28 +198,26 @@ export function BalanceWithCarryover({
isDisabled: !isGoalTemplatesEnabled || goalValue == null, isDisabled: !isGoalTemplatesEnabled || goalValue == null,
}} }}
> >
{children ? (
children({
type,
name,
value: balanceValue,
className: getDefaultClassName(balanceValue),
})
) : (
<CellValueText <CellValueText
type={type} type={type}
name={name} name={name}
value={balanceValue} value={balanceValue}
className={String( className={getDefaultClassName(balanceValue)}
css({
...getBalanceStyle(balanceValue),
overflow: 'hidden',
textOverflow: 'ellipsis',
textAlign: 'right',
...(!disabled && {
cursor: 'pointer',
}),
':hover': { textDecoration: 'underline' },
}),
)}
/> />
</Tooltip>
)} )}
</Tooltip>
{carryoverValue && ( {carryoverValue && (
<CarryoverIndicatorComponent <CarryoverIndicatorComponent
style={getBalanceStyle(balanceValue)} style={getBalanceAmountStyle(balanceValue)}
/> />
)} )}
</> </>

View File

@@ -398,7 +398,7 @@ export const CategoryMonth = memo(function CategoryMonth({
onClick={() => !category.is_income && setBalanceMenuOpen(true)} onClick={() => !category.is_income && setBalanceMenuOpen(true)}
> >
<BalanceWithCarryover <BalanceWithCarryover
disabled={category.is_income} isDisabled={category.is_income}
carryover={trackingBudget.catCarryover(category.id)} carryover={trackingBudget.catCarryover(category.id)}
balance={trackingBudget.catBalance(category.id)} balance={trackingBudget.catBalance(category.id)}
goal={trackingBudget.catGoal(category.id)} goal={trackingBudget.catGoal(category.id)}

View File

@@ -66,7 +66,7 @@ export function EnvelopeBalanceMenuModal({
Balance Balance
</Text> </Text>
<BalanceWithCarryover <BalanceWithCarryover
disabled isDisabled
carryover={envelopeBudget.catCarryover(categoryId)} carryover={envelopeBudget.catCarryover(categoryId)}
balance={envelopeBudget.catBalance(categoryId)} balance={envelopeBudget.catBalance(categoryId)}
goal={envelopeBudget.catGoal(categoryId)} goal={envelopeBudget.catGoal(categoryId)}

View File

@@ -64,7 +64,7 @@ export function TrackingBalanceMenuModal({
Balance Balance
</Text> </Text>
<BalanceWithCarryover <BalanceWithCarryover
disabled isDisabled
carryover={trackingBudget.catCarryover(categoryId)} carryover={trackingBudget.catCarryover(categoryId)}
balance={trackingBudget.catBalance(categoryId)} balance={trackingBudget.catBalance(categoryId)}
goal={trackingBudget.catGoal(categoryId)} goal={trackingBudget.catGoal(categoryId)}

View File

@@ -0,0 +1,6 @@
---
category: Bugfix
authors: [joel-jeremy]
---
Fix mobile balance modal not properly coloring balance.