feat: dashboard quick stats enhancements and monthly actuals read/edit mode
Dashboard Quick Stats: - Create Capital Projects section with "Planned Capital Spend 2026" - Fix Interest Earned YTD to pull from actual journal entries on interest income accounts instead of unrealized investment gains - Add Interest Earned YoY showing projected current year vs last year actuals with percentage change badge Monthly Actuals: - Default to read-only view when actuals are already reconciled - Show "Edit Actuals" button instead of "Save Actuals" for reconciled months - Add confirmation modal warning that editing will void existing journal entry before allowing edits - New months without actuals open directly in edit mode Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -306,6 +306,8 @@ interface DashboardData {
|
||||
reserve_investments: string;
|
||||
est_monthly_interest: string;
|
||||
interest_earned_ytd: string;
|
||||
interest_last_year: string;
|
||||
interest_projected: string;
|
||||
planned_capital_spend: string;
|
||||
}
|
||||
|
||||
@@ -541,7 +543,30 @@ export function DashboardPage() {
|
||||
<Text size="sm" fw={500} c="teal">{fmt(data?.interest_earned_ytd || '0')}</Text>
|
||||
</Group>
|
||||
<Group justify="space-between">
|
||||
<Text size="sm" c="dimmed">Planned Capital Spend</Text>
|
||||
<Text size="sm" c="dimmed">Interest Earned YoY</Text>
|
||||
<Group gap={6}>
|
||||
<Text size="sm" fw={500} c="teal">{fmt(data?.interest_projected || '0')}</Text>
|
||||
<Text size="xs" c="dimmed">proj</Text>
|
||||
<Text size="xs" c="dimmed">vs</Text>
|
||||
<Text size="sm" fw={500} c="gray">{fmt(data?.interest_last_year || '0')}</Text>
|
||||
<Text size="xs" c="dimmed">prev</Text>
|
||||
{(() => {
|
||||
const proj = parseFloat(data?.interest_projected || '0');
|
||||
const prev = parseFloat(data?.interest_last_year || '0');
|
||||
const diff = proj - prev;
|
||||
if (prev === 0 && proj === 0) return null;
|
||||
return (
|
||||
<Badge size="xs" color={diff >= 0 ? 'green' : 'red'} variant="light">
|
||||
{diff >= 0 ? '+' : ''}{prev > 0 ? ((diff / prev) * 100).toFixed(0) : '—'}%
|
||||
</Badge>
|
||||
);
|
||||
})()}
|
||||
</Group>
|
||||
</Group>
|
||||
<Divider my={4} />
|
||||
<Text size="xs" c="dimmed" tt="uppercase" fw={700}>Capital Projects</Text>
|
||||
<Group justify="space-between">
|
||||
<Text size="sm" c="dimmed">Planned Capital Spend {new Date().getFullYear()}</Text>
|
||||
<Text size="sm" fw={500} c="orange">{fmt(data?.planned_capital_spend || '0')}</Text>
|
||||
</Group>
|
||||
<Divider my={4} />
|
||||
|
||||
Reference in New Issue
Block a user