mirror of
https://github.com/we-promise/sure.git
synced 2026-04-12 08:37:22 +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>
58 lines
2.5 KiB
Plaintext
58 lines
2.5 KiB
Plaintext
<%# locals: (entry:, categories:) %>
|
|
|
|
<%= styled_form_with model: entry, url: transactions_path, class: "space-y-4" do |f| %>
|
|
<% if entry.errors.any? %>
|
|
<%= render "shared/form_errors", model: entry %>
|
|
<% end %>
|
|
|
|
<section>
|
|
<%= render "shared/transaction_type_tabs", active_tab: params[:nature] == "inflow" ? "income" : "expense", account_id: params[:account_id] %>
|
|
|
|
<%= f.hidden_field :nature, value: params[:nature] || "outflow" %>
|
|
<%= f.hidden_field :entryable_type, value: "Transaction" %>
|
|
</section>
|
|
|
|
<section class="space-y-2">
|
|
<%= f.text_field :name, label: t(".description"), placeholder: t(".description_placeholder"), required: true %>
|
|
|
|
<% if @entry.account_id %>
|
|
<%= f.hidden_field :account_id %>
|
|
<% else %>
|
|
<%= f.collection_select :account_id, Current.family.accounts.manual.active.alphabetically, :id, :name, { prompt: t(".account_prompt"), label: t(".account"), selected: Current.user.default_account_for_transactions&.id, variant: :logo }, required: true, class: "form-field__input text-ellipsis" %>
|
|
<% end %>
|
|
|
|
<%= f.money_field :amount, label: t(".amount"), required: true %>
|
|
<%= f.fields_for :entryable do |ef| %>
|
|
<%= ef.collection_select :category_id, categories, :id, :name, { prompt: t(".category_prompt"), label: t(".category"), variant: :badge, searchable: true } %>
|
|
<% end %>
|
|
<%= f.date_field :date, label: t(".date"), required: true, min: Entry.min_supported_date, max: Date.current, value: Date.current %>
|
|
</section>
|
|
|
|
<%= render DS::Disclosure.new(title: t(".details")) do %>
|
|
<%= f.fields_for :entryable do |ef| %>
|
|
<%= ef.collection_select :merchant_id,
|
|
Current.family.available_merchants.alphabetically,
|
|
:id, :name,
|
|
{ include_blank: t(".none"),
|
|
label: t(".merchant_label") } %>
|
|
<%= ef.select :tag_ids,
|
|
Current.family.tags.alphabetically.pluck(:name, :id),
|
|
{
|
|
include_blank: t(".none"),
|
|
multiple: true,
|
|
label: t(".tags_label")
|
|
},
|
|
{ "data-controller": "multi-select" } %>
|
|
<% end %>
|
|
<%= f.text_area :notes,
|
|
label: t(".note_label"),
|
|
placeholder: t(".note_placeholder"),
|
|
rows: 5,
|
|
"data-auto-submit-form-target": "auto" %>
|
|
<% end %>
|
|
|
|
<section>
|
|
<%= f.submit t(".submit") %>
|
|
</section>
|
|
<% end %>
|