mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-08-02 20:15:22 +02:00
Multi-currency support: Money + Currency class improvements (#553)
* Money improvements * Replace all old money usage
This commit is contained in:
parent
e5750d1a13
commit
fe2fa0eac1
43 changed files with 2982 additions and 196 deletions
|
@ -22,6 +22,34 @@ class ApplicationFormBuilder < ActionView::Helpers::FormBuilder
|
|||
RUBY_EVAL
|
||||
end
|
||||
|
||||
# See `Monetizable` concern, which adds a _money suffix to the attribute name
|
||||
# For a monetized field, the setter will always be the attribute name without the _money suffix
|
||||
def money_field(method, options = {})
|
||||
money = @object.send(method)
|
||||
raise ArgumentError, "The value of #{method} is not a Money object" unless money.is_a?(Money) || money.nil?
|
||||
|
||||
money_amount_method = method.to_s.chomp("_money").to_sym
|
||||
money_currency_method = :currency
|
||||
|
||||
readonly_currency = options[:readonly_currency] || false
|
||||
|
||||
default_options = {
|
||||
class: "form-field__input",
|
||||
value: money&.amount,
|
||||
placeholder: Money.new(0, money&.currency || Money.default_currency).format
|
||||
}
|
||||
|
||||
merged_options = default_options.merge(options)
|
||||
|
||||
@template.form_field_tag do
|
||||
(label(method, *label_args(options)).to_s if options[:label]) +
|
||||
@template.tag.div(class: "flex items-center") do
|
||||
number_field(money_amount_method, merged_options.except(:label)) +
|
||||
select(money_currency_method, Money::Currency.popular.map(&:iso_code), { selected: money&.currency&.iso_code }, { disabled: readonly_currency, class: "ml-auto form-field__input w-fit pr-8" })
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def select(method, choices, options = {}, html_options = {})
|
||||
default_options = { class: "form-field__input" }
|
||||
merged_options = default_options.merge(html_options)
|
||||
|
|
|
@ -27,9 +27,7 @@ module ApplicationHelper
|
|||
render partial: "shared/modal", locals: { content: content }
|
||||
end
|
||||
|
||||
def currency_dropdown(f: nil, options: [])
|
||||
render partial: "shared/currency_dropdown", locals: { f: f, options: options }
|
||||
end
|
||||
|
||||
|
||||
def sidebar_modal(&block)
|
||||
content = capture &block
|
||||
|
@ -97,12 +95,15 @@ module ApplicationHelper
|
|||
end
|
||||
end
|
||||
|
||||
def format_currency(number, options = {})
|
||||
user_currency_preference = Current.family.try(:currency) || "USD"
|
||||
def format_money(number_or_money, options = {})
|
||||
money = Money.new(number_or_money)
|
||||
options.reverse_merge!(money.default_format_options)
|
||||
number_to_currency(money.amount, options)
|
||||
end
|
||||
|
||||
currency_options = CURRENCY_OPTIONS[user_currency_preference.to_sym]
|
||||
options.reverse_merge!(currency_options)
|
||||
|
||||
number_to_currency(number, options)
|
||||
def format_money_without_symbol(number_or_money, options = {})
|
||||
money = Money.new(number_or_money)
|
||||
options.reverse_merge!(money.default_format_options)
|
||||
ActiveSupport::NumberHelper.number_to_delimited(money.amount.round(options[:precision] || 0), { delimiter: options[:delimiter], separator: options[:separator] })
|
||||
end
|
||||
end
|
||||
|
|
|
@ -2,4 +2,8 @@ module FormsHelper
|
|||
def form_field_tag(&)
|
||||
tag.div class: "form-field", &
|
||||
end
|
||||
|
||||
def currency_dropdown(f: nil, options: [])
|
||||
render partial: "shared/currency_dropdown", locals: { f: f, options: options }
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue