diff --git a/resources/js/components/BucketCard.tsx b/resources/js/components/BucketCard.tsx index ef20e15..b88113d 100644 --- a/resources/js/components/BucketCard.tsx +++ b/resources/js/components/BucketCard.tsx @@ -5,7 +5,7 @@ const centsToDollars = (cents: number): number => cents / 100; const basisPointsToPercent = (bp: number): number => bp / 100; const formatDollars = (cents: number): string => `$${centsToDollars(cents).toFixed(0)}`; -export default function BucketCard({ bucket }: { bucket: Bucket }) { +export default function BucketCard({ bucket, projectedAmount }: { bucket: Bucket; projectedAmount?: number }) { const hasFiniteCapacity = bucket.allocation_type === 'fixed_limit' && bucket.effective_capacity !== null; return ( @@ -24,6 +24,7 @@ export default function BucketCard({ bucket }: { bucket: Bucket }) { ) : ( @@ -40,6 +41,11 @@ export default function BucketCard({ bucket }: { bucket: Bucket }) { {formatDollars(bucket.current_balance)} + {projectedAmount && projectedAmount > 0 && ( + + {' '}+{formatDollars(projectedAmount)} + + )} {hasFiniteCapacity && ( {' '}/ {formatDollars(bucket.effective_capacity!)} diff --git a/resources/js/components/DigitalProgressBar.tsx b/resources/js/components/DigitalProgressBar.tsx index 0751bcf..04e44a1 100644 --- a/resources/js/components/DigitalProgressBar.tsx +++ b/resources/js/components/DigitalProgressBar.tsx @@ -1,6 +1,7 @@ interface DigitalProgressBarProps { current: number; capacity: number; + projected?: number; } const BAR_COUNT = 20; @@ -17,10 +18,15 @@ function getBarColor(index: number): string { return 'bg-green-500'; } -export default function DigitalProgressBar({ current, capacity }: DigitalProgressBarProps) { +const PROJECTED_GLOW = '0 0 8px rgba(234, 179, 8, 0.6)'; + +export default function DigitalProgressBar({ current, capacity, projected }: DigitalProgressBarProps) { const filledBars = capacity > 0 ? Math.min(Math.round((current / capacity) * BAR_COUNT), BAR_COUNT) : 0; + const projectedBars = capacity > 0 && projected + ? Math.min(Math.round(((current + projected) / capacity) * BAR_COUNT), BAR_COUNT) + : filledBars; return (
{Array.from({ length: BAR_COUNT }, (_, i) => { const filled = i < filledBars; + const isProjected = !filled && i < projectedBars; return (
); })} diff --git a/resources/js/pages/Scenarios/Show.tsx b/resources/js/pages/Scenarios/Show.tsx index 1b6f098..c86b122 100644 --- a/resources/js/pages/Scenarios/Show.tsx +++ b/resources/js/pages/Scenarios/Show.tsx @@ -281,7 +281,10 @@ export default function Show({ scenario, buckets }: Props) { onClick={() => setEditingBucket(bucket)} className="w-full border-4 border-red-500 bg-black glow-red transition-all text-left hover:border-red-400 cursor-pointer" > - + a.bucket_id === bucket.id)?.allocated_amount} + /> ))}