Guillem Arias
04422f36b3
a11y(goals/card): scope link accessible name to title + status summary
...
Whole card was wrapped in <%= link_to ... %>, so screen readers
concatenated every nested text node into one accessible name (~60 words
on a typical card: avatar initial + name + status pill + percent +
balance + target + pace + accounts + footer).
- Outer wrapper now <div> carrying the filter-target + goal-name +
goal-status data attrs.
- Inner <a> wraps only the goal name. aria-label = "<name>, <status>,
<percent>% of <target>" — concise SR sentence.
- `before:absolute before:inset-0` makes the inner link's hit area span
the whole card so sighted users keep the existing click affordance.
- Ring SVG + percent overlay marked aria-hidden (decorative — same info
already in the aria-label).
- New locale key goals.goal_card.aria_progress.
2026-05-11 20:24:26 +02:00
Guillem Arias
9b61e4a41b
refactor: rename Savings Goals feature to Goals
...
User-facing rename + structural rename. Feature is now called just
"Goals" everywhere — page title, sidebar nav, modal headings, flash
messages, AI assistant tool. Code identifiers follow:
- Models: SavingsGoal → Goal, SavingsContribution → GoalContribution,
SavingsGoalAccount → GoalAccount.
- Tables: savings_goals → goals, savings_contributions → goal_contributions,
savings_goal_accounts → goal_accounts. FK columns savings_goal_id →
goal_id. New migration db/migrate/20260511100003_rename_savings_to_goals.rb
uses rename_table + rename_column; PG handles index renaming and FK
redirection automatically.
- Controllers: SavingsGoalsController → GoalsController,
SavingsContributionsController → GoalContributionsController.
- Routes: /savings_goals → /goals, nested /goals/:id/contributions
(resource name shifts; old route name aliases dropped).
- ViewComponent namespace: Savings::* → Goals::*. Component class
names drop their redundant "Goal" prefix where the namespace already
carries it: Savings::GoalCardComponent → Goals::CardComponent,
Savings::GoalAvatarComponent → Goals::AvatarComponent. Others keep
their names (Goals::ProgressRingComponent, Goals::StatusPillComponent,
Goals::AccountStackComponent, Goals::FundingAccountsBreakdownComponent).
- Stimulus controllers: savings_goal_* → goal_*, savings_goals_filter
→ goals_filter. Stimulus identifiers in data-controller / data-*
attributes follow.
- Locale keys: savings_goals: → goals: (top level), savings_contributions:
→ goal_contributions: (top level). All t() callers updated.
- AI assistant tool: Assistant::Function::CreateSavingsGoal →
Assistant::Function::CreateGoal, tool name "create_savings_goal" →
"create_goal", description / response text updated.
- Sidebar nav label "Savings" → "Goals". Goals/show + index page title
"Savings" → "Goals". Empty goals_section heading/subtitle dropped
(duplicated the page title post-rename).
Original migrations create_savings_goals / create_savings_goal_accounts /
create_savings_contributions remain untouched so historical replay
still works; the rename migration runs on top.
2026-05-11 20:08:32 +02:00