|
1 | 1 | # frozen_string_literal: true |
2 | 2 |
|
3 | 3 | class SolidusAdmin::UI::Forms::Address::Component < SolidusAdmin::BaseComponent |
4 | | - DEFAULT_FIELDS = %i[ |
5 | | - street |
6 | | - street_contd |
7 | | - city |
8 | | - zipcode |
9 | | - country_and_state |
10 | | - phone |
11 | | - email |
12 | | - ].freeze |
| 4 | + DefaultNamedFieldsetNotFound = Class.new(NameError) |
13 | 5 |
|
14 | | - FIELDS_PRESETS = { |
15 | | - contact: DEFAULT_FIELDS + %i[name vat_id reverse_charge_status], |
16 | | - location: DEFAULT_FIELDS, |
17 | | - }.freeze |
| 6 | + include SolidusAdmin::SlotableDefault |
18 | 7 |
|
19 | | - renders_one :name, -> do |
20 | | - component("ui/forms/field").text_field(@form_field_name, :name, object: @addressable) |
21 | | - end |
22 | | - |
23 | | - renders_one :street, -> do |
24 | | - component("ui/forms/field").text_field(@form_field_name, :address1, object: @addressable) |
25 | | - end |
26 | | - |
27 | | - renders_one :street_contd, -> do |
28 | | - component("ui/forms/field").text_field(@form_field_name, :address2, object: @addressable) |
29 | | - end |
30 | | - |
31 | | - renders_one :city, -> do |
32 | | - component("ui/forms/field").text_field(@form_field_name, :city, object: @addressable) |
33 | | - end |
34 | | - |
35 | | - renders_one :zipcode, -> do |
36 | | - component("ui/forms/field").text_field(@form_field_name, :zipcode, object: @addressable) |
37 | | - end |
| 8 | + renders_one :fieldset |
38 | 9 |
|
39 | | - renders_one :country_and_state, SolidusAdmin::UI::Forms::Address::CountryAndState::Component |
40 | | - renders_one :phone, -> do |
41 | | - component("ui/forms/field").text_field(@form_field_name, :phone, object: @addressable) |
42 | | - end |
43 | | - |
44 | | - renders_one :email, -> do |
45 | | - component("ui/forms/field").text_field(@form_field_name, :email, object: @addressable) |
46 | | - end |
47 | | - |
48 | | - renders_one :vat_id, -> do |
49 | | - component("ui/forms/field").text_field(@form_field_name, :vat_id, object: @addressable) |
50 | | - end |
51 | | - |
52 | | - renders_one :reverse_charge_status, -> do |
53 | | - component("ui/forms/field").select( |
54 | | - @form_field_name, |
55 | | - :reverse_charge_status, |
56 | | - Spree::Address.reverse_charge_statuses.keys.map { |key| [I18n.t("spree.reverse_charge_statuses.#{key}"), key] }, |
57 | | - object: @addressable |
| 10 | + # @param fieldset [Symbol] use a default named fieldset, component of the same name must be defined |
| 11 | + # in "ui/forms/address/fieldsets" |
| 12 | + # @param extends [Array<Symbol, Hash{Symbol => #call}>] extend default fieldset, |
| 13 | + # see +SolidusAdmin::UI::Forms::Address::Fieldsets::Base+ |
| 14 | + # @param excludes [Array<Symbol>, Symbol] optionally exclude fields that are present in a default fieldset |
| 15 | + # @raise [DefaultNamedFieldsetNotFound] if the provided +:fieldset+ option does not correspond to a defined component |
| 16 | + # in "ui/forms/address/fieldsets" |
| 17 | + def initialize(addressable:, form_field_name:, disabled: false, fieldset: :contact, extends: [], excludes: []) |
| 18 | + @disabled = disabled |
| 19 | + @default_fieldset = fieldset_component(fieldset).new( |
| 20 | + addressable:, |
| 21 | + form_field_name:, |
| 22 | + extends:, |
| 23 | + excludes:, |
58 | 24 | ) |
59 | 25 | end |
60 | 26 |
|
61 | | - # @param fields_preset [Symbol] decides which set of fields to render, accepted values: [:contact, :location] |
62 | | - # @param include_fields [Symbol] optionally include fields that are not present in default/chosen field preset |
63 | | - # @param exclude_fields [Symbol] optionally exclude fields that are present in default/chosen field preset |
64 | | - def initialize(addressable:, form_field_name:, disabled: false, fields_preset: :contact, include_fields: [], exclude_fields: []) |
65 | | - @addressable = addressable |
66 | | - @form_field_name = form_field_name |
67 | | - @disabled = disabled |
| 27 | + attr_reader :default_fieldset |
68 | 28 |
|
69 | | - fields = FIELDS_PRESETS[fields_preset] || [] |
70 | | - fields = (fields + Array.wrap(include_fields.map(&:to_sym)) - Array.wrap(exclude_fields.map(&:to_sym))).uniq |
| 29 | + private |
71 | 30 |
|
72 | | - with_name if fields.include?(:name) |
73 | | - with_street if fields.include?(:street) |
74 | | - with_street_contd if fields.include?(:street_contd) |
75 | | - with_city if fields.include?(:city) |
76 | | - with_zipcode if fields.include?(:zipcode) |
77 | | - with_country_and_state(addressable:, form_field_name:) if fields.include?(:country_and_state) |
78 | | - with_phone if fields.include?(:phone) |
79 | | - with_email if fields.include?(:email) |
80 | | - with_vat_id if fields.include?(:vat_id) |
81 | | - with_reverse_charge_status if fields.include?(:reverse_charge_status) |
| 31 | + def fieldset_component(fieldset) |
| 32 | + component("ui/forms/address/fieldsets/#{fieldset}") |
| 33 | + rescue SolidusAdmin::ComponentRegistry::ComponentNotFoundError |
| 34 | + raise DefaultNamedFieldsetNotFound, |
| 35 | + "to use a default named fieldset `#{fieldset}` you must implement a component in 'ui/forms/address/fieldsets/#{fieldset}'" |
82 | 36 | end |
83 | 37 | end |
0 commit comments