fix(review): add type: :submit to DS::Button submitters inside forms

CI test_system on #1840 surfaced 6 failures (confirm-dialog close,
property create/edit, transaction filter apply) caused by the same
gap that db563f3d started addressing: the default-type-button policy
on DS::Button means every \`render DS::Button.new(...)\` inside a
\`<form>\` (or \`styled_form_with\`) that relies on the HTML default to
submit is now an inert \`type="button"\`.

Audited every \`render DS::Button.new(\` callsite repo-wide for the
combination (no \`type:\`, no \`href:\`, inside a form context) and
pinned \`type: :submit\` explicitly on the 12 forms that need it:

- layouts/shared/_confirm_dialog.html.erb: Confirm button inside the
  global \`<form method=\"dialog\">\` — fixes
  test_should_allow_revoking_API_key_with_confirmation.
- properties/{new,edit,balances}.html.erb: Save/Next submitter inside
  \`styled_form_with\` — fixes test_can_create_property_account,
  test_can_persist_property_subtype.
- transactions/searches/_menu.html.erb: Apply inside the filter form —
  fixes test_can_filter_uncategorized_transactions,
  test_all_filters_work_and_empty_state_shows_if_no_match,
  test_can_open_filters_and_apply_one_or_more.
- transactions/bulk_updates/new.html.erb: Save in bulk-edit drawer.
- account_sharings/show.html.erb: Save in account-sharing form.
- category/deletions/new.html.erb, tag/deletions/new.html.erb:
  destructive + safe submit buttons in deletion dialog forms.
- family_merchants/merge.html.erb: Submit in merge form.
- subscriptions/upgrade.html.erb: contribute_and_support_sure submit.
- rules/_category_rule_cta.html.erb: Dismiss inside the
  rule_prompts_disabled form.

Cancel/close DS::Button instances inside these same forms intentionally
keep the \`type=button\` default since they drive JS-only actions
(\`DS--dialog#close\`, \`DS--menu#close\`).
This commit is contained in:
Guillem Arias
2026-05-19 18:29:20 +02:00
parent db563f3d62
commit 24c517eb7a
12 changed files with 14 additions and 4 deletions

View File

@@ -83,7 +83,7 @@
</div>
</div>
<div class="flex justify-end">
<%= render DS::Button.new(text: t(".save"), class: "md:w-auto w-full justify-center") %>
<%= render DS::Button.new(text: t(".save"), type: :submit, class: "md:w-auto w-full justify-center") %>
</div>
<% end %>
</div>

View File

@@ -16,6 +16,7 @@
<%= render DS::Button.new(
variant: "destructive",
type: :submit,
text: t(".delete_and_leave_uncategorized", category_name: @category.name),
full_width: true,
data: { deletion_target: "destructiveSubmitButton" }
@@ -23,6 +24,7 @@
<%= render DS::Button.new(
text: t(".delete_and_recategorize", category_name: @category.name),
type: :submit,
data: { deletion_target: "safeSubmitButton" },
hidden: true,
full_width: true

View File

@@ -26,6 +26,7 @@
<%= render DS::Button.new(
text: t(".submit"),
type: :submit,
full_width: true
) %>
<% end %>

View File

@@ -17,6 +17,7 @@
<%= render DS::Button.new(
text: t(".confirm"),
variant: variant,
type: :submit,
autofocus: true,
full_width: true,
value: "confirm",

View File

@@ -21,6 +21,7 @@
<%= render DS::Button.new(
text: @account.active? ? t(".save") : t(".next"),
variant: "primary",
type: :submit,
) %>
</div>
<% end %>

View File

@@ -18,6 +18,7 @@
<%= render DS::Button.new(
text: @account.active? ? "Save" : "Next",
variant: "primary",
type: :submit,
) %>
</div>
<% end %>

View File

@@ -18,6 +18,7 @@
<%= render DS::Button.new(
text: t(".next"),
variant: "primary",
type: :submit,
) %>
</div>
<% end %>

View File

@@ -13,7 +13,7 @@
<%= f.hidden_field :rule_prompt_dismissed_at, value: Time.current %>
<%= tag.div class:"flex gap-2 justify-end" do %>
<%= render DS::Button.new(text: "Dismiss", variant: "secondary") %>
<%= render DS::Button.new(text: "Dismiss", variant: "secondary", type: :submit) %>
<% rule_href = new_rule_path(resource_type: "transaction", action_type: "set_transaction_category", action_value: cta[:category_id], name: cta[:merchant_name]) %>
<%= render DS::Link.new(text: "Create rule", variant: "primary", href: rule_href, frame: :modal) %>
<% end %>

View File

@@ -48,6 +48,7 @@
<%= render DS::Button.new(
text: t("subscriptions.upgrade.contribute_and_support_sure"),
variant: "primary",
type: :submit,
full_width: true
) %>

View File

@@ -16,6 +16,7 @@
<%= render DS::Button.new(
variant: "destructive",
type: :submit,
text: t(".delete_and_leave_uncategorized", tag_name: @tag.name),
full_width: true,
data: { deletion_target: "destructiveSubmitButton" }
@@ -23,6 +24,7 @@
<%= render DS::Button.new(
text: t(".delete_and_reassign"),
type: :submit,
data: { deletion_target: "safeSubmitButton" },
hidden: true,
full_width: true

View File

@@ -21,7 +21,7 @@
<div class="flex justify-end gap-2 mt-auto">
<%= render DS::Button.new(text: t(".cancel"), variant: "ghost", data: { action: "click->DS--dialog#close" }) %>
<%= render DS::Button.new(text: t(".save"), data: { bulk_select_scope_param: "bulk_update", action: "bulk-select#submitBulkRequest" }) %>
<%= render DS::Button.new(text: t(".save"), type: :submit, data: { bulk_select_scope_param: "bulk_update", action: "bulk-select#submitBulkRequest" }) %>
</div>
<% end %>
<% end %>

View File

@@ -38,7 +38,7 @@
<div>
<%= render DS::Button.new(text: t(".cancel"), type: "button", variant: "ghost", data: { action: "DS--menu#close" }) %>
<%= render DS::Button.new(text: t(".apply")) %>
<%= render DS::Button.new(text: t(".apply"), type: :submit) %>
</div>
</div>
</div>