Make the overview answer the year-by-year question

The dashboard now leads with a typographic headline, three key
figures, per-parent age-4 bars and one row per year until the fourth
birthday. Each year row shows the timeline bands beside each parent's
parental-leave days left at year end and vacation days left, carried
over or expiring, and opens into a per-parent table with that year's
wish outcomes. Tips become a plain list and absorb the planner's
surplus advice; "Detaljer" keeps the metrics and a balance snapshot
for every parent. The separate plan-proposal fold and the
type-count table are gone.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XBRLomdLK9jF7wU7a8AA6H
This commit is contained in:
2026-09-20 06:30:46 +02:00
parent 4b802ba0be
commit 80b4f1cb52
30 changed files with 2444 additions and 3477 deletions
+36 -25
View File
@@ -2,44 +2,55 @@ export const dashboard = {
'age4Bars.expiringStat': '{expiring} dagar förfaller',
'age4Bars.savableStat': '{left} av {cap} dagar kan sparas',
'age4Bars.title': 'Dagar kvar vid 4 års ålder, per förälder',
'dashboard.balancePickerPrompt': 'Vem gäller det?',
'dashboard.balanceLink': 'Uppdatera saldon',
'dashboard.daysLeft': 'Kvarvarande dagar',
'dashboard.enterManually': 'Ange uppgifter manuellt',
'dashboard.estimatedBadge': 'Uppskattat',
'dashboard.estimatedBadgeCaption': 'Inga verkliga saldon är hämtade än — siffrorna bygger på det lagstadgade antagandet (480 dagar, inget uttaget). Hämta från Försäkringskassan eller ange uppgifter manuellt för exakta siffror.',
'dashboard.estimatedBadgeCaption': 'Inga verkliga saldon är hämtade än — siffrorna utgår från 480 dagar, inget uttaget. Uppdatera saldon under Inställningar.',
'dashboard.expiringAtB4': 'Förfaller vid 4 år om nuvarande plan följs (alla föräldrar)',
'dashboard.expiringAtB4ForParent': 'Förfaller vid 4 år om nuvarande plan följs – {name}',
'dashboard.expiringAtB4ParentFallback': 'Förälder {number}',
// Still referenced by `Onboarding.tsx`'s balances step; the balance flow
// is moving to a `balance.*` namespace — drop this key once nothing else
// reads it.
'dashboard.fetchFromFk': 'Hämta från Försäkringskassan',
'dashboard.figureExpiring': 'Förfaller vid 4 år',
'dashboard.figureLeft': 'Dagar kvar',
'dashboard.figureUsed': 'Använda',
'dashboard.hero.hasPlanMessage': '{atRisk} dagar riskerar att försvinna när {childName} fyller 4 ({date}).',
'dashboard.hero.noneAtRiskMessage': 'Inga dagar går förlorade — er plan hinner använda alla innan {childName} fyller 4 ({date}).',
'dashboard.hero.noPlanMessage': 'Du har {days} dagar att planera. Utan en plan försvinner {atRisk} av dem när {childName} fyller 4.',
'dashboard.loading': 'Laddar...',
'dashboard.moreDetailsSummary': 'Fler detaljer',
'dashboard.leaveOverviewTitle': 'Fram till 4 år',
'dashboard.moreDetailsSummary': 'Detaljer',
'dashboard.overviewTitle': 'Översikt',
'dashboard.planFold.noWishesHint': 'Lägg till önskemål under Kalender för att se ett förslag här.',
'dashboard.planFold.summary': 'Planförslag för de kommande åren',
'dashboard.planFold.unknownParent': 'Okänd förälder',
'dashboard.plannedDaysTitle': 'Planerade dagar',
'dashboard.saveManualFetchError': 'Kunde inte spara uppgifterna',
'dashboard.usedDays': 'Använda dagar',
'daysBreakdown.daysHeader': 'Dagar',
'daysBreakdown.empty': 'Inga dagar registrerade än',
'daysBreakdown.typeHeader': 'Typ av ledighet',
'overviewMetrics.defaultTitle': 'Översikt',
'parentalLeaveBreakdown.dubbeldagarLeft': 'Dubbeldagar kvar',
'parentalLeaveBreakdown.empty': 'Ingen data hämtad ännu — tryck på Hämta från Försäkringskassan.',
'parentalLeaveBreakdown.lagstaNiva': 'Lägsta nivå',
'parentalLeaveBreakdown.remainingHeader': 'Återstående',
'parentalLeaveBreakdown.reservedNote': '{reserved} av dina dagar är reserverade och kan inte överlåtas till den andra föräldern (max {transferable} dagar kan överlåtas).',
'parentalLeaveBreakdown.sjukpenning': 'Sjukpenning',
'parentalLeaveBreakdown.empty': 'Inga saldon hämtade än.',
'parentalLeaveBreakdown.lagstaNiva': 'Lägstanivå',
'parentalLeaveBreakdown.leftOfTotal': '{left} av {total}',
'parentalLeaveBreakdown.noBalance': 'Inget saldo än',
'parentalLeaveBreakdown.reservedNote': '{reserved} av varje förälders dagar är reserverade och kan inte överlåtas till den andra föräldern (max {transferable} dagar kan överlåtas).',
'parentalLeaveBreakdown.sjukpenning': 'Sjukpenningnivå',
'parentalLeaveBreakdown.sourceManual': 'Manuellt angiven',
'parentalLeaveBreakdown.sourceScraped': 'Hämtad från Försäkringskassan',
'parentalLeaveBreakdown.totalHeader': 'Totalt',
'parentalLeaveBreakdown.transferableDays': 'Överlåtbara dagar',
'parentalLeaveBreakdown.typeHeader': 'Typ',
'yearTimeline.bandLabel': '{dayType}, {startDate} – {endDate} ({dayCount} dagar). Klicka för att öppna denna månad i kalendern.',
'yearTimeline.bandLabelOneDay': '{dayType}, {startDate} – {endDate} (1 dag). Klicka för att öppna denna månad i kalendern.',
'yearTimeline.caption': 'Varje rad är ett år och varje färgad stapel en planerad ledighetsperiod. Klicka på en stapel för att öppna den månaden i kalendern.',
'yearTimeline.title': 'De kommande åren',
} as const
'yearRow.assumed': 'antaget',
'yearRow.bandLabel': '{dayType}, {startDate} – {endDate} ({dayCount} dagar). Klicka för att öppna i kalendern.',
'yearRow.bandLabelOneDay': '{dayType}, {startDate} – {endDate} (1 dag). Klicka för att öppna i kalendern.',
'yearRow.carriedIn': 'Sparade in',
'yearRow.carriedOut': 'sparas {days}',
'yearRow.carriedOutRow': 'Sparas till nästa år',
'yearRow.earned': 'Intjänade',
'yearRow.expiring': 'förfaller {days}',
'yearRow.expiringRow': 'Förfaller',
'yearRow.fpLeft': 'FP kvar',
'yearRow.left': 'Kvar',
'yearRow.leftAtYearEnd': 'Kvar vid årets slut',
'yearRow.parentalLeaveTitle': 'Föräldrapenning',
'yearRow.plannedUse': 'Planerade',
'yearRow.usedThisYear': 'Använda i år',
'yearRow.vacationLeft': 'Semester kvar',
'yearRow.vacationTitle': 'Semester',
'yearRow.weeksFunded': '{funded} av {wished} veckor',
'yearRow.wishesTitle': 'Ledigheter',
} as const
+4 -18
View File
@@ -1,16 +1,11 @@
// `plan.*` (the standalone Plan tab) and most `planResults.*` keys were
// retired with the Plan/Tips tabs (leave is now authored on the calendar and
// Översikt carries the headline figures — see PLANNING_ENGINE_SPEC.md's
// superseding note). What's left here is the subset `planResults.*`
// `PlanFold.tsx` (the read-only plan-proposal fold on Översikt) and
// `frontend/src/utils/rejectionMessages.ts` still render.
// superseding note). What's left here is the subset the dashboard's year
// rows (`YearRows.tsx`: shortfall + remedy lines), its surplus-advice tips
// (`SurplusAdviceTip.tsx`) and `frontend/src/utils/rejectionMessages.ts`
// still render.
export const plan = {
'planResults.balancesTitle': 'Kvarvarande saldon efter planen',
'planResults.dubbeldagarLeftHeader': 'Dubbeldagar kvar',
'planResults.lagstaLeftHeader': 'Lägstanivådagar kvar',
'planResults.leavesHeader': 'Ledigheter',
'planResults.noWindowsInHorizon': 'Inga fönster inom planeringshorisonten.',
'planResults.parentHeader': 'Förälder',
'planResults.remedyBodyCarryVacationForward': '{spare_total} semesterdagar från tidigare år kan sparas framåt',
'planResults.remedyBodyLowerPriorityWish': 'Sänk {wish_name} från {from_weeks} till {to_weeks} veckor frigör {days_freed} dagar',
'planResults.remedyBodyReducePreschoolReserve': 'Minska förskolans planeringsdagar ({reserved} reserverade) frigör {days_freed} dagar',
@@ -26,22 +21,13 @@ export const plan = {
'planResults.rejectionInvalidDayType': 'Dag {index} ({date}): ogiltig dagtyp "{day_type}"',
'planResults.rejectionOutsideEligibleWindow': '{date}: utanför barnets tillåtna period ({birth_date} – {hard_expiry})',
'planResults.shortfallLine': '{shortfall_days} dag(ar) kunde inte finansieras',
'planResults.shortfallsTitle': 'Perioder med underskott',
'planResults.sjukpenningLeftHeader': 'Sjukpenningdagar kvar',
'planResults.surplusAdviceBodyFrontLoadEarlyYears': '{parent_name} har ett stort överskott ({days_involved} FP-dagar) — ta ut fler dagar nu medan barnet är litet och ni ändå är hemma, istället för att sprida ut dem tunt fram till 4-årsdagen.',
'planResults.surplusAdviceBodyShiftMixToFp': '{parent_name} kan byta {days_involved} semesterdagar mot föräldrapenningdagar under planen — FP-dagarna går annars förlorade vid 4-årsdagen, medan semestern inte gör det.',
'planResults.surplusAdviceBodyUseLessVacation': '{parent_name} kan ta ut {days_involved} färre semesterdagar ({years_text}) utan att gå under lägsta uttaget ({min_vacation_days_per_year} dagar/år) — spara dem istället för att täcka FP-dagar som annars går förlorade.',
'planResults.surplusAdviceBodyWishMoreLeave': '{parent_name} har råd med ytterligare {weeks} veckor ledigt ({days_involved} FP-dagar går annars förlorade vid barnets 4-årsdag) — lägg till en vecka på sommaren eller ett höstlov.',
'planResults.surplusAdviceFrontLoadEarlyYears': 'Ta ut mer ledighet medan barnet är litet',
'planResults.surplusAdviceIntro': 'Planen lämnar dagar outnyttjade som annars går förlorade vid barnets 4-årsdag. Några förslag:',
'planResults.surplusAdviceShiftMixToFp': 'Använd föräldradagar istället för semester',
'planResults.surplusAdviceTitle': 'Ni har outnyttjade dagar',
'planResults.surplusAdviceUseLessVacation': 'Spara färre semesterdagar',
'planResults.surplusAdviceWishMoreLeave': 'Önska mer ledighet',
'planResults.totalAvailableHeader': 'Totalt tillgängliga',
'planResults.unknownParent': 'Okänd förälder',
'planResults.usedHeader': 'Använda',
'planResults.weeksUnit': 'veckor',
'planResults.yearHeader': 'År',
'planResults.yearOverviewTitle': 'Översikt över åren',
} as const