mirror of
https://github.com/we-promise/sure.git
synced 2026-04-09 23:34:50 +00:00
* 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>
41 lines
1.3 KiB
Ruby
41 lines
1.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class DS::Menu < DesignSystemComponent
|
|
attr_reader :variant, :avatar_url, :initials, :placement, :offset, :icon_vertical, :no_padding, :testid, :mobile_fullwidth, :max_width
|
|
|
|
renders_one :button, ->(**button_options, &block) do
|
|
options_with_target = button_options.merge(data: { DS__menu_target: "button" })
|
|
|
|
if block
|
|
content_tag(:button, **options_with_target, &block)
|
|
else
|
|
DS::Button.new(**options_with_target)
|
|
end
|
|
end
|
|
|
|
renders_one :header, ->(&block) do
|
|
content_tag(:div, class: "border-b border-tertiary", &block)
|
|
end
|
|
|
|
renders_one :custom_content
|
|
|
|
renders_many :items, DS::MenuItem
|
|
|
|
VARIANTS = %i[icon button avatar].freeze
|
|
|
|
def initialize(variant: "icon", avatar_url: nil, initials: nil, placement: "bottom-end", offset: 12, icon_vertical: false, no_padding: false, testid: nil, mobile_fullwidth: true, max_width: nil)
|
|
@variant = variant.to_sym
|
|
@avatar_url = avatar_url
|
|
@initials = initials
|
|
@placement = placement
|
|
@offset = offset
|
|
@icon_vertical = icon_vertical
|
|
@no_padding = no_padding
|
|
@testid = testid
|
|
@mobile_fullwidth = mobile_fullwidth
|
|
@max_width = max_width
|
|
|
|
raise ArgumentError, "Invalid variant: #{@variant}" unless VARIANTS.include?(@variant)
|
|
end
|
|
end
|