Feat: Add default user account and consolidate account actions in menu (#1130)

* feat: Add default account for manual transaction entries (#1061)

Allow users to designate a default account that auto-selects
in the transaction creation form. Also consolidates account list
actions (edit, link/unlink, enable/disable) into a meatball menu.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* - handle context menu width on mobile
- restrict default account to depository types only
- added FR, ES and DE i18n files

* - Add credit card accounts can also be used as default
- Moved logic into controller

* Scope context menu max-width to accounts menu only
- decouples the width constraint from the shared DS::Menu component by introducing an optional max_width param

* fix ci test and address issues raised by coderabbit and codex

* Address CodeRabbit review feedback

- Use .present? for institution_name guards to avoid empty UI artifacts
- Align "Set default" menu visibility with actual preselection eligibility
  (active + unlinked + supports_default?) to prevent drift between UI and model
- Keep disabled star visible when account is already default but now ineligible

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Add eligible_for_transaction_default? predicate to Account model

Consolidates active + unlinked + supports_default? checks into a single
shared predicate used by the controller, view, and user model guard,
preventing a direct PATCH from bypassing UI eligibility rules.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Added "Unset default" option
Added negative test for default account
Removed duplicated logic for account.eligible_for_transaction_default

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Serge L
2026-03-15 16:26:26 -04:00
committed by GitHub
parent 581d3684b2
commit 5aa808e668
17 changed files with 189 additions and 45 deletions

View File

@@ -362,6 +362,33 @@ class UserTest < ActiveSupport::TestCase
"Should return false when section key is missing from collapsed_sections"
end
# Default account for transactions
test "default_account_for_transactions returns account when active and manual" do
account = accounts(:depository)
@user.update!(default_account: account)
assert_equal account, @user.default_account_for_transactions
end
test "default_account_for_transactions returns nil when account is disabled" do
account = accounts(:depository)
@user.update!(default_account: account)
account.disable!
assert_nil @user.default_account_for_transactions
end
test "default_account_for_transactions returns nil when account is linked" do
account = accounts(:depository)
@user.update!(default_account: account)
plaid_account = plaid_accounts(:one)
AccountProvider.create!(account: account, provider: plaid_account)
account.reload
assert_nil @user.default_account_for_transactions
end
test "default_account_for_transactions returns nil when no default set" do
assert_nil @user.default_account_for_transactions
end
# SSO-only user security tests
test "sso_only? returns true for user with OIDC identity and no password" do
sso_user = users(:sso_only)