ux(goals/show): catch-up CTA pre-fills + secondary "Adjust your target" link

The "Add $1,531.25" CTA used to open the contribution modal with an
empty amount field — label was a hint, not a default. Now passes the
catch-up amount via ?amount= and the contributions controller seeds
@contribution.amount from params. One click brings the user to the
modal already populated.

Adds a secondary text link below the primary CTA: "Or adjust your
target" → opens the edit modal (Turbo frame). Behavioural-econ choice
architecture: gives the rebaseline path explicitly so users who can't
realistically catch up don't feel forced into the contribution.

Trade-off: lets the alert respect autonomy — commit or recalibrate,
both fine. Action paralysis kept low by visual hierarchy (primary
button vs muted text link).
This commit is contained in:
Guillem Arias
2026-05-11 21:11:42 +02:00
parent 46bd5e0434
commit 57b7848eec
3 changed files with 9 additions and 3 deletions

View File

@@ -7,7 +7,8 @@ class GoalContributionsController < ApplicationController
@contribution = @goal.goal_contributions.new(
contributed_at: Date.current,
currency: @goal.currency,
source: "manual"
source: "manual",
amount: params[:amount].presence
)
end

View File

@@ -146,15 +146,19 @@
<%= t("goals.show.catch_up.body", avg: catch_up_avg_money.format, delta: catch_up_delta_money.format) %>
<% end %>
</p>
<div class="mt-2">
<div class="mt-2 flex items-center gap-3 flex-wrap">
<%= render DS::Link.new(
text: t("goals.show.catch_up.cta", amount: catch_up_money.format),
variant: "primary",
size: "sm",
href: new_goal_contribution_path(@goal),
href: new_goal_contribution_path(@goal, amount: @goal.monthly_target_amount.to_f),
icon: "plus",
frame: :modal
) %>
<%= link_to t("goals.show.catch_up.adjust_target_cta"),
edit_goal_path(@goal),
data: { turbo_frame: :modal },
class: "text-xs text-secondary hover:text-primary underline-offset-2 hover:underline" %>
</div>
<% end %>
<% end %>

View File

@@ -127,6 +127,7 @@ en:
body_with_date: "Your current pace is %{avg}/mo. You need an extra %{delta}/mo to finish by %{date}."
body: "Your current pace is %{avg}/mo. You need an extra %{delta}/mo to hit the required rate."
cta: "Add %{amount}"
adjust_target_cta: Or adjust your target
confirm_complete_title: Mark this goal complete?
confirm_complete_body: It leaves the Ongoing list. You can still archive or restore it later.
confirm_complete_cta: Mark complete