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<
ComponentPropsWithoutRef<typeof CellValue>,
'binding'
'children' | 'binding'
> & {
children?: ChildrenWithClassName;
carryover: Binding<'envelope-budget', 'carryover'>;
balance: Binding<'envelope-budget', 'leftover'>;
goal: Binding<'envelope-budget', 'goal'>;
budgeted: Binding<'envelope-budget', 'budget'>;
longGoal: Binding<'envelope-budget', 'long-goal'>;
disabled?: boolean;
isDisabled?: boolean;
CarryoverIndicator?: ComponentType<CarryoverIndicatorProps>;
};
@@ -80,7 +89,7 @@ export function BalanceWithCarryover({
goal,
budgeted,
longGoal,
disabled,
isDisabled,
CarryoverIndicator: CarryoverIndicatorComponent = CarryoverIndicator,
children,
...props
@@ -91,7 +100,7 @@ export function BalanceWithCarryover({
const budgetedValue = useSheetValue(budgeted);
const longGoalValue = useSheetValue(longGoal);
const isGoalTemplatesEnabled = useFeatureFlag('goalTemplatesEnabled');
const getBalanceStyle = useCallback(
const getBalanceAmountStyle = useCallback(
(balanceValue: number) =>
makeBalanceAmountStyle(
balanceValue,
@@ -102,7 +111,7 @@ export function BalanceWithCarryover({
);
const format = useFormat();
const differenceToGoal = useCallback(
const getDifferenceToGoal = useCallback(
(balanceValue: number) =>
longGoalValue === 1
? balanceValue - goalValue
@@ -110,93 +119,105 @@ export function BalanceWithCarryover({
[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 (
<CellValue binding={balance} type="financial" {...props}>
{({ type, name, value: balanceValue }) => (
<>
{children ? (
children({ type, name, value: balanceValue })
) : (
<Tooltip
content={
<View style={{ padding: 10 }}>
<span style={{ fontWeight: 'bold' }}>
{differenceToGoal(balanceValue) === 0 ? (
<span style={{ color: theme.noticeText }}>
{t('Fully funded')}
</span>
) : differenceToGoal(balanceValue) > 0 ? (
<span style={{ color: theme.noticeText }}>
{t('Overfunded ({{amount}})', {
amount: format(
differenceToGoal(balanceValue),
'financial',
),
})}
</span>
) : (
<span style={{ color: theme.errorText }}>
{t('Underfunded ({{amount}})', {
amount: format(
differenceToGoal(balanceValue),
'financial',
),
})}
</span>
)}
</span>
<GoalTooltipRow>
<div>{t('Goal Type:')}</div>
<div>{longGoalValue === 1 ? 'Long' : 'Template'}</div>
</GoalTooltipRow>
<GoalTooltipRow>
<div>{t('Goal:')}</div>
<div>{format(goalValue, 'financial')}</div>
</GoalTooltipRow>
<GoalTooltipRow>
{longGoalValue !== 1 ? (
<>
<div>{t('Budgeted:')}</div>
<div>{format(budgetedValue, 'financial')}</div>
</>
) : (
<>
<div>{t('Balance:')}</div>
<div>{format(balanceValue, type)}</div>
</>
)}
</GoalTooltipRow>
</View>
}
style={{ ...styles.tooltip, borderRadius: '0px 5px 5px 0px' }}
placement="bottom"
triggerProps={{
delay: 750,
isDisabled: !isGoalTemplatesEnabled || goalValue == null,
}}
>
<Tooltip
content={
<View style={{ padding: 10 }}>
<span style={{ fontWeight: 'bold' }}>
{getDifferenceToGoal(balanceValue) === 0 ? (
<span style={{ color: theme.noticeText }}>
{t('Fully funded')}
</span>
) : getDifferenceToGoal(balanceValue) > 0 ? (
<span style={{ color: theme.noticeText }}>
{t('Overfunded ({{amount}})', {
amount: format(
getDifferenceToGoal(balanceValue),
'financial',
),
})}
</span>
) : (
<span style={{ color: theme.errorText }}>
{t('Underfunded ({{amount}})', {
amount: format(
getDifferenceToGoal(balanceValue),
'financial',
),
})}
</span>
)}
</span>
<GoalTooltipRow>
<div>{t('Goal Type:')}</div>
<div>{longGoalValue === 1 ? t('Long') : t('Template')}</div>
</GoalTooltipRow>
<GoalTooltipRow>
<div>{t('Goal:')}</div>
<div>{format(goalValue, 'financial')}</div>
</GoalTooltipRow>
<GoalTooltipRow>
{longGoalValue !== 1 ? (
<>
<div>{t('Budgeted:')}</div>
<div>{format(budgetedValue, 'financial')}</div>
</>
) : (
<>
<div>{t('Balance:')}</div>
<div>{format(balanceValue, type)}</div>
</>
)}
</GoalTooltipRow>
</View>
}
style={{ ...styles.tooltip, borderRadius: '0px 5px 5px 0px' }}
placement="bottom"
triggerProps={{
delay: 750,
isDisabled: !isGoalTemplatesEnabled || goalValue == null,
}}
>
{children ? (
children({
type,
name,
value: balanceValue,
className: getDefaultClassName(balanceValue),
})
) : (
<CellValueText
type={type}
name={name}
value={balanceValue}
className={String(
css({
...getBalanceStyle(balanceValue),
overflow: 'hidden',
textOverflow: 'ellipsis',
textAlign: 'right',
...(!disabled && {
cursor: 'pointer',
}),
':hover': { textDecoration: 'underline' },
}),
)}
className={getDefaultClassName(balanceValue)}
/>
</Tooltip>
)}
)}
</Tooltip>
{carryoverValue && (
<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)}
>
<BalanceWithCarryover
disabled={category.is_income}
isDisabled={category.is_income}
carryover={trackingBudget.catCarryover(category.id)}
balance={trackingBudget.catBalance(category.id)}
goal={trackingBudget.catGoal(category.id)}

View File

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

View File

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

View File

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