solidus_admin 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +23 -4
- data/README.md +6 -1
- data/Rakefile +15 -15
- data/app/assets/builds/solidus_admin/tailwind.css +722 -45
- data/app/assets/images/solidus_admin/remixicon.license.txt +196 -0
- data/app/assets/images/solidus_admin/remixicon.symbol.svg +4 -4
- data/app/blueprints/solidus_admin/state_blueprint.rb +13 -0
- data/app/components/concerns/solidus_admin/slotable_default.rb +42 -0
- data/app/components/solidus_admin/adjustment_reasons/edit/component.html.erb +6 -15
- data/app/components/solidus_admin/adjustment_reasons/edit/component.yml +0 -1
- data/app/components/solidus_admin/adjustment_reasons/index/component.rb +13 -13
- data/app/components/solidus_admin/adjustment_reasons/new/component.html.erb +6 -15
- data/app/components/solidus_admin/adjustment_reasons/new/component.yml +0 -1
- data/app/components/solidus_admin/base_component.rb +7 -3
- data/app/components/solidus_admin/layout/confirm/component.html.erb +18 -0
- data/app/components/solidus_admin/layout/confirm/component.js +21 -0
- data/app/components/solidus_admin/layout/confirm/component.rb +26 -0
- data/app/components/solidus_admin/layout/confirm/component.yml +4 -0
- data/app/components/solidus_admin/layout/flashes/alerts/component.html.erb +7 -0
- data/app/components/solidus_admin/layout/flashes/alerts/component.rb +19 -0
- data/app/components/solidus_admin/layout/flashes/component.html.erb +5 -0
- data/app/components/solidus_admin/layout/flashes/component.rb +4 -0
- data/app/components/solidus_admin/layout/flashes/toasts/component.html.erb +5 -0
- data/app/components/solidus_admin/layout/flashes/toasts/component.rb +9 -0
- data/app/components/solidus_admin/layout/navigation/account/component.html.erb +12 -1
- data/app/components/solidus_admin/layout/navigation/account/component.rb +4 -4
- data/app/components/solidus_admin/layout/page_helpers.rb +3 -9
- data/app/components/solidus_admin/layout/skip_link/component.rb +3 -3
- data/app/components/solidus_admin/option_types/edit/component.html.erb +44 -0
- data/app/components/solidus_admin/option_types/edit/component.rb +5 -0
- data/app/components/solidus_admin/option_types/edit/component.yml +10 -0
- data/app/components/solidus_admin/option_types/index/component.rb +22 -22
- data/app/components/solidus_admin/option_types/new/component.html.erb +16 -0
- data/app/components/solidus_admin/option_types/new/component.rb +4 -0
- data/app/components/solidus_admin/option_types/new/component.yml +4 -0
- data/app/components/solidus_admin/option_values/edit/component.html.erb +16 -0
- data/app/components/solidus_admin/option_values/edit/component.rb +4 -0
- data/app/components/solidus_admin/option_values/edit/component.yml +4 -0
- data/app/components/solidus_admin/option_values/new/component.html.erb +16 -0
- data/app/components/solidus_admin/option_values/new/component.rb +7 -0
- data/app/components/solidus_admin/option_values/new/component.yml +4 -0
- data/app/components/solidus_admin/option_values/table/component.rb +53 -0
- data/app/components/solidus_admin/option_values/table/component.yml +3 -0
- data/app/components/solidus_admin/orders/cart/component.html.erb +5 -7
- data/app/components/solidus_admin/orders/cart/result/component.html.erb +2 -2
- data/app/components/solidus_admin/orders/index/component.rb +26 -26
- data/app/components/solidus_admin/orders/show/address/component.html.erb +8 -20
- data/app/components/solidus_admin/orders/show/address/component.rb +7 -7
- data/app/components/solidus_admin/orders/show/address/component.yml +0 -1
- data/app/components/solidus_admin/orders/show/adjustments/index/adjustable/spree_shipment/component.rb +1 -1
- data/app/components/solidus_admin/orders/show/adjustments/index/component.rb +24 -21
- data/app/components/solidus_admin/orders/show/component.html.erb +2 -2
- data/app/components/solidus_admin/orders/show/component.rb +1 -1
- data/app/components/solidus_admin/orders/show/component.yml +0 -3
- data/app/components/solidus_admin/orders/show/customer_search/result/component.html.erb +2 -2
- data/app/components/solidus_admin/orders/show/email/component.html.erb +2 -2
- data/app/components/solidus_admin/payment_methods/edit/component.html.erb +13 -0
- data/app/components/solidus_admin/payment_methods/edit/component.rb +7 -0
- data/app/components/solidus_admin/payment_methods/edit/component.yml +2 -0
- data/app/components/solidus_admin/payment_methods/form/component.html.erb +29 -0
- data/app/components/solidus_admin/payment_methods/form/component.rb +34 -0
- data/app/components/solidus_admin/payment_methods/form/component.yml +15 -0
- data/app/components/solidus_admin/payment_methods/index/component.rb +24 -23
- data/app/components/solidus_admin/payment_methods/new/component.html.erb +12 -0
- data/app/components/solidus_admin/payment_methods/new/component.rb +7 -0
- data/app/components/solidus_admin/payment_methods/new/component.yml +2 -0
- data/app/components/solidus_admin/products/index/component.rb +26 -26
- data/app/components/solidus_admin/products/show/categories/new/component.html.erb +17 -0
- data/app/components/solidus_admin/products/show/categories/new/component.rb +17 -0
- data/app/components/solidus_admin/products/show/categories/new/component.yml +5 -0
- data/app/components/solidus_admin/products/show/component.html.erb +90 -66
- data/app/components/solidus_admin/products/show/component.rb +2 -2
- data/app/components/solidus_admin/products/show/component.yml +23 -11
- data/app/components/solidus_admin/products/status/component.rb +1 -1
- data/app/components/solidus_admin/products/stock/component.rb +7 -7
- data/app/components/solidus_admin/properties/edit/component.html.erb +5 -5
- data/app/components/solidus_admin/properties/index/component.rb +13 -13
- data/app/components/solidus_admin/properties/new/component.html.erb +5 -5
- data/app/components/solidus_admin/refund_reasons/edit/component.html.erb +6 -15
- data/app/components/solidus_admin/refund_reasons/edit/component.yml +0 -1
- data/app/components/solidus_admin/refund_reasons/index/component.rb +13 -13
- data/app/components/solidus_admin/refund_reasons/new/component.html.erb +6 -14
- data/app/components/solidus_admin/refund_reasons/new/component.yml +0 -1
- data/app/components/solidus_admin/refunds_and_returns/component.rb +7 -7
- data/app/components/solidus_admin/reimbursement_types/index/component.rb +2 -2
- data/app/components/solidus_admin/return_reasons/edit/component.html.erb +5 -14
- data/app/components/solidus_admin/return_reasons/index/component.rb +11 -11
- data/app/components/solidus_admin/return_reasons/new/component.html.erb +5 -14
- data/app/components/solidus_admin/roles/edit/component.html.erb +12 -12
- data/app/components/solidus_admin/roles/edit/component.yml +0 -1
- data/app/components/solidus_admin/roles/index/component.rb +12 -12
- data/app/components/solidus_admin/roles/new/component.html.erb +12 -12
- data/app/components/solidus_admin/roles/new/component.yml +0 -1
- data/app/components/solidus_admin/shipping/component.rb +5 -5
- data/app/components/solidus_admin/shipping_categories/edit/component.html.erb +4 -4
- data/app/components/solidus_admin/shipping_categories/edit/component.yml +0 -1
- data/app/components/solidus_admin/shipping_categories/index/component.rb +9 -9
- data/app/components/solidus_admin/shipping_categories/new/component.html.erb +4 -4
- data/app/components/solidus_admin/shipping_categories/new/component.yml +0 -1
- data/app/components/solidus_admin/shipping_methods/index/component.rb +10 -10
- data/app/components/solidus_admin/stock_items/edit/component.html.erb +5 -8
- data/app/components/solidus_admin/stock_items/edit/component.rb +2 -2
- data/app/components/solidus_admin/stock_items/index/component.rb +25 -25
- data/app/components/solidus_admin/stock_locations/edit/component.html.erb +16 -0
- data/app/components/solidus_admin/stock_locations/edit/component.rb +5 -0
- data/app/components/solidus_admin/stock_locations/edit/component.yml +2 -0
- data/app/components/solidus_admin/stock_locations/form/component.html.erb +65 -0
- data/app/components/solidus_admin/stock_locations/form/component.rb +11 -0
- data/app/components/solidus_admin/stock_locations/form/component.yml +19 -0
- data/app/components/solidus_admin/stock_locations/index/component.rb +94 -47
- data/app/components/solidus_admin/stock_locations/new/component.html.erb +16 -0
- data/app/components/solidus_admin/stock_locations/new/component.rb +16 -0
- data/app/components/solidus_admin/stock_locations/new/component.yml +2 -0
- data/app/components/solidus_admin/store_credit_reasons/edit/component.html.erb +5 -14
- data/app/components/solidus_admin/store_credit_reasons/edit/component.yml +0 -1
- data/app/components/solidus_admin/store_credit_reasons/index/component.rb +11 -11
- data/app/components/solidus_admin/store_credit_reasons/new/component.html.erb +5 -14
- data/app/components/solidus_admin/store_credit_reasons/new/component.yml +0 -1
- data/app/components/solidus_admin/stores/edit/component.html.erb +27 -0
- data/app/components/solidus_admin/stores/edit/component.rb +5 -0
- data/app/components/solidus_admin/stores/form/component.html.erb +102 -0
- data/app/components/solidus_admin/stores/form/component.rb +27 -0
- data/app/components/solidus_admin/stores/form/component.yml +17 -0
- data/app/components/solidus_admin/stores/index/component.rb +51 -22
- data/app/components/solidus_admin/stores/new/component.html.erb +16 -0
- data/app/components/solidus_admin/stores/new/component.rb +5 -0
- data/app/components/solidus_admin/stores/new/component.yml +2 -0
- data/app/components/solidus_admin/tax_categories/edit/component.html.erb +7 -15
- data/app/components/solidus_admin/tax_categories/edit/component.yml +0 -1
- data/app/components/solidus_admin/tax_categories/index/component.rb +17 -17
- data/app/components/solidus_admin/tax_categories/new/component.html.erb +7 -15
- data/app/components/solidus_admin/tax_categories/new/component.yml +0 -1
- data/app/components/solidus_admin/tax_rates/edit/component.html.erb +12 -0
- data/app/components/solidus_admin/tax_rates/edit/component.rb +5 -0
- data/app/components/solidus_admin/tax_rates/edit/component.yml +4 -0
- data/app/components/solidus_admin/tax_rates/form/component.html.erb +25 -0
- data/app/components/solidus_admin/tax_rates/form/component.rb +29 -0
- data/app/components/solidus_admin/tax_rates/form/component.yml +9 -0
- data/app/components/solidus_admin/tax_rates/index/component.rb +38 -20
- data/app/components/solidus_admin/tax_rates/new/component.html.erb +12 -0
- data/app/components/solidus_admin/tax_rates/new/component.rb +5 -0
- data/app/components/solidus_admin/tax_rates/new/component.yml +4 -0
- data/app/components/solidus_admin/taxes/component.rb +4 -4
- data/app/components/solidus_admin/taxonomies/index/component.rb +7 -7
- data/app/components/solidus_admin/turbo/target_frame/component.html.erb +5 -0
- data/app/components/solidus_admin/turbo/target_frame/component.rb +8 -0
- data/app/components/solidus_admin/ui/alert/component.html.erb +35 -0
- data/app/components/solidus_admin/ui/alert/component.rb +51 -0
- data/app/components/solidus_admin/ui/alert/component.yml +8 -0
- data/app/components/solidus_admin/ui/badge/component.rb +11 -11
- data/app/components/solidus_admin/ui/button/component.rb +84 -27
- data/app/components/solidus_admin/ui/button/component.yml +10 -0
- data/app/components/solidus_admin/ui/checkbox/component.rb +42 -0
- data/app/components/solidus_admin/ui/dropdown/component.rb +3 -3
- data/app/components/solidus_admin/ui/forms/address/component.html.erb +1 -48
- data/app/components/solidus_admin/ui/forms/address/component.rb +29 -6
- data/app/components/solidus_admin/ui/forms/address/fields/city_and_zipcode/component.html.erb +4 -0
- data/app/components/solidus_admin/ui/forms/address/fields/city_and_zipcode/component.rb +8 -0
- data/app/components/solidus_admin/ui/forms/address/fields/country_and_state/component.html.erb +39 -0
- data/app/components/solidus_admin/ui/forms/address/{component.js → fields/country_and_state/component.js} +2 -0
- data/app/components/solidus_admin/ui/forms/address/fields/country_and_state/component.rb +15 -0
- data/app/components/solidus_admin/ui/forms/address/fields/reverse_charge_fields/component.html.erb +7 -0
- data/app/components/solidus_admin/ui/forms/address/fields/reverse_charge_fields/component.rb +12 -0
- data/app/components/solidus_admin/ui/forms/address/fieldsets/base.rb +54 -0
- data/app/components/solidus_admin/ui/forms/address/fieldsets/contact/component.rb +16 -0
- data/app/components/solidus_admin/ui/forms/address/fieldsets/contact_info/component.rb +10 -0
- data/app/components/solidus_admin/ui/forms/address/fieldsets/location/component.rb +14 -0
- data/app/components/solidus_admin/ui/forms/checkbox/component.html.erb +14 -0
- data/app/components/solidus_admin/ui/forms/checkbox/component.rb +24 -31
- data/app/components/solidus_admin/ui/forms/field/component.html.erb +4 -4
- data/app/components/solidus_admin/ui/forms/field/component.rb +14 -18
- data/app/components/solidus_admin/ui/forms/input/component.rb +9 -18
- data/app/components/solidus_admin/ui/forms/search/result/component.rb +2 -2
- data/app/components/solidus_admin/ui/forms/select/component.html.erb +21 -0
- data/app/components/solidus_admin/ui/forms/select/component.rb +157 -0
- data/app/components/solidus_admin/ui/forms/switch/component.rb +4 -4
- data/app/components/solidus_admin/ui/icon/component.rb +4 -4
- data/app/components/solidus_admin/ui/icon/names.txt +973 -238
- data/app/components/solidus_admin/ui/modal/component.html.erb +2 -4
- data/app/components/solidus_admin/ui/modal/component.js +7 -1
- data/app/components/solidus_admin/ui/modal/component.rb +2 -2
- data/app/components/solidus_admin/ui/pages/index/component.rb +50 -19
- data/app/components/solidus_admin/ui/panel/component.rb +5 -9
- data/app/components/solidus_admin/ui/radio/component.rb +29 -0
- data/app/components/solidus_admin/ui/tab/component.rb +4 -4
- data/app/components/solidus_admin/ui/table/component.html.erb +11 -10
- data/app/components/solidus_admin/ui/table/component.js +18 -26
- data/app/components/solidus_admin/ui/table/component.rb +24 -18
- data/app/components/solidus_admin/ui/table/component.yml +1 -0
- data/app/components/solidus_admin/ui/table/ransack_filter/component.html.erb +1 -1
- data/app/components/solidus_admin/ui/table/ransack_filter/component.rb +7 -7
- data/app/components/solidus_admin/ui/thumbnail/component.rb +5 -5
- data/app/components/solidus_admin/ui/toast/component.html.erb +6 -6
- data/app/components/solidus_admin/ui/toast/component.rb +1 -1
- data/app/components/solidus_admin/ui/toggletip/component.rb +1 -1
- data/app/components/solidus_admin/users/addresses/component.html.erb +3 -5
- data/app/components/solidus_admin/users/addresses/component.rb +0 -30
- data/app/components/solidus_admin/users/addresses/component.yml +0 -7
- data/app/components/solidus_admin/users/edit/api_access/component.html.erb +6 -4
- data/app/components/solidus_admin/users/edit/api_access/component.yml +8 -2
- data/app/components/solidus_admin/users/edit/component.html.erb +15 -12
- data/app/components/solidus_admin/users/edit/component.rb +1 -33
- data/app/components/solidus_admin/users/edit/component.yml +0 -7
- data/app/components/solidus_admin/users/edit/tabs/component.rb +46 -0
- data/app/components/solidus_admin/users/edit/tabs/component.yml +6 -0
- data/app/components/solidus_admin/users/index/component.rb +20 -20
- data/app/components/solidus_admin/users/items/component.html.erb +1 -3
- data/app/components/solidus_admin/users/items/component.rb +18 -51
- data/app/components/solidus_admin/users/items/component.yml +0 -7
- data/app/components/solidus_admin/users/orders/component.html.erb +1 -3
- data/app/components/solidus_admin/users/orders/component.rb +9 -39
- data/app/components/solidus_admin/users/orders/component.yml +0 -6
- data/app/components/solidus_admin/users/store_credits/edit_amount/component.html.erb +7 -8
- data/app/components/solidus_admin/users/store_credits/edit_amount/component.rb +0 -5
- data/app/components/solidus_admin/users/store_credits/edit_amount/component.yml +0 -1
- data/app/components/solidus_admin/users/store_credits/edit_memo/component.html.erb +4 -4
- data/app/components/solidus_admin/users/store_credits/edit_memo/component.yml +0 -1
- data/app/components/solidus_admin/users/store_credits/edit_validity/component.html.erb +6 -7
- data/app/components/solidus_admin/users/store_credits/edit_validity/component.rb +0 -5
- data/app/components/solidus_admin/users/store_credits/index/component.html.erb +4 -6
- data/app/components/solidus_admin/users/store_credits/index/component.rb +10 -40
- data/app/components/solidus_admin/users/store_credits/index/component.yml +0 -6
- data/app/components/solidus_admin/users/store_credits/new/component.html.erb +12 -13
- data/app/components/solidus_admin/users/store_credits/new/component.rb +0 -9
- data/app/components/solidus_admin/users/store_credits/new/component.yml +0 -1
- data/app/components/solidus_admin/users/store_credits/show/component.html.erb +5 -7
- data/app/components/solidus_admin/users/store_credits/show/component.rb +8 -38
- data/app/components/solidus_admin/users/store_credits/show/component.yml +0 -6
- data/app/components/solidus_admin/users_and_roles/component.rb +4 -4
- data/app/components/solidus_admin/zones/edit/component.html.erb +1 -0
- data/app/components/solidus_admin/zones/edit/component.rb +4 -0
- data/app/components/solidus_admin/zones/form/component.html.erb +47 -0
- data/app/components/solidus_admin/zones/form/component.js +32 -0
- data/app/components/solidus_admin/zones/form/component.rb +23 -0
- data/app/components/solidus_admin/zones/form/component.yml +7 -0
- data/app/components/solidus_admin/zones/index/component.rb +57 -18
- data/app/components/solidus_admin/zones/new/component.html.erb +1 -0
- data/app/components/solidus_admin/zones/new/component.rb +4 -0
- data/app/controllers/concerns/solidus_admin/moveable.rb +31 -0
- data/app/controllers/solidus_admin/addresses_controller.rb +9 -11
- data/app/controllers/solidus_admin/adjustments_controller.rb +5 -6
- data/app/controllers/solidus_admin/base_controller.rb +8 -7
- data/app/controllers/solidus_admin/controller_helpers/authorization.rb +1 -1
- data/app/controllers/solidus_admin/controller_helpers/locale.rb +1 -1
- data/app/controllers/solidus_admin/controller_helpers/pagination.rb +37 -0
- data/app/controllers/solidus_admin/controller_helpers/search.rb +5 -5
- data/app/controllers/solidus_admin/controller_helpers/theme.rb +2 -2
- data/app/controllers/solidus_admin/customers_controller.rb +3 -3
- data/app/controllers/solidus_admin/line_items_controller.rb +3 -3
- data/app/controllers/solidus_admin/option_types_controller.rb +11 -32
- data/app/controllers/solidus_admin/option_values_controller.rb +54 -0
- data/app/controllers/solidus_admin/orders_controller.rb +25 -19
- data/app/controllers/solidus_admin/payment_methods_controller.rb +23 -28
- data/app/controllers/solidus_admin/product_option_types_controller.rb +5 -0
- data/app/controllers/solidus_admin/product_taxons_controller.rb +58 -0
- data/app/controllers/solidus_admin/products_controller.rb +24 -28
- data/app/controllers/solidus_admin/reimbursement_types_controller.rb +3 -3
- data/app/controllers/solidus_admin/resources_controller.rb +59 -20
- data/app/controllers/solidus_admin/shipping_methods_controller.rb +4 -4
- data/app/controllers/solidus_admin/states_controller.rb +30 -0
- data/app/controllers/solidus_admin/stock_items_controller.rb +11 -6
- data/app/controllers/solidus_admin/stock_locations_controller.rb +25 -26
- data/app/controllers/solidus_admin/store_credits_controller.rb +9 -9
- data/app/controllers/solidus_admin/stores_controller.rb +43 -9
- data/app/controllers/solidus_admin/tax_rates_controller.rb +9 -22
- data/app/controllers/solidus_admin/taxonomies_controller.rb +5 -21
- data/app/controllers/solidus_admin/users_controller.rb +16 -16
- data/app/controllers/solidus_admin/zones_controller.rb +6 -26
- data/app/helpers/solidus_admin/flash_helper.rb +14 -0
- data/app/helpers/solidus_admin/last_login_helper.rb +2 -2
- data/app/helpers/solidus_admin/permission_sets_helper.rb +3 -3
- data/app/helpers/solidus_admin/solidus_form_helper.rb +9 -0
- data/app/helpers/solidus_admin/stimulus_helper.rb +29 -0
- data/app/helpers/solidus_admin/void_elements_helper.rb +1 -1
- data/app/javascript/solidus_admin/application.js +10 -1
- data/app/javascript/solidus_admin/confirm_modal.js +24 -0
- data/app/javascript/solidus_admin/controllers/custom_validity_controller.js +12 -0
- data/app/javascript/solidus_admin/controllers/sortable_controller.js +9 -2
- data/app/javascript/solidus_admin/tom-select/plugins/patch_scroll.js +19 -0
- data/app/javascript/solidus_admin/tom-select/plugins/remote_with_pagination.js +67 -0
- data/app/javascript/solidus_admin/tom-select/plugins/stash_on_search.js +68 -0
- data/app/javascript/solidus_admin/tom-select/tom-select.js +11 -0
- data/app/javascript/solidus_admin/utils.js +40 -0
- data/app/javascript/solidus_admin/web_components/solidus_select.js +90 -0
- data/app/javascript/vendor/custom_elements.js +3 -0
- data/app/lib/solidus_admin/form_builder.rb +58 -0
- data/app/views/layouts/solidus_admin/application.html.erb +6 -8
- data/app/views/layouts/solidus_admin/preview.html.erb +1 -1
- data/app/views/solidus_admin/option_values/create.turbo_stream.erb +3 -0
- data/app/views/solidus_admin/option_values/destroy.turbo_stream.erb +3 -0
- data/app/views/solidus_admin/option_values/update.turbo_stream.erb +3 -0
- data/config/importmap.rb +9 -0
- data/config/initializers/view_component.rb +1 -1
- data/config/locales/option_types.en.yml +5 -1
- data/config/locales/option_values.en.yml +9 -0
- data/config/locales/payment_methods.en.yml +5 -1
- data/config/locales/product_taxons.en.yml +6 -0
- data/config/locales/products.en.yml +2 -0
- data/config/locales/solidus_select.yml +6 -0
- data/config/locales/stock_locations.en.yml +4 -0
- data/config/locales/stores.en.yml +22 -0
- data/config/locales/tax_rates.en.yml +4 -0
- data/config/locales/zones.en.yml +4 -0
- data/config/routes.rb +21 -9
- data/config/tailwind.config.js +6 -2
- data/docs/components.md +2 -2
- data/docs/index_pages.md +11 -5
- data/docs/stimulusjs.md +1 -1
- data/eslint.config.mjs +25 -0
- data/lib/generators/solidus_admin/component/component_generator.rb +10 -6
- data/lib/generators/solidus_admin/install/install_generator.rb +24 -5
- data/lib/generators/solidus_admin/install/templates/config/initializers/solidus_admin.rb.tt +6 -0
- data/lib/solidus_admin/admin_resources.rb +1 -1
- data/lib/solidus_admin/configuration.rb +14 -14
- data/lib/solidus_admin/engine.rb +3 -2
- data/lib/solidus_admin/importmap.rb +1 -1
- data/lib/solidus_admin/menu_item.rb +1 -1
- data/lib/solidus_admin/preview.rb +1 -0
- data/lib/solidus_admin/testing_support/admin_assets.rb +1 -1
- data/lib/solidus_admin/testing_support/feature_helpers.rb +77 -3
- data/lib/solidus_admin/testing_support/shared_examples/crud_resource_requests.rb +43 -36
- data/lib/solidus_admin/testing_support/shared_examples/moveable.rb +48 -0
- data/lib/solidus_admin/testing_support/shared_examples/promotion_categories_features.rb +5 -11
- data/lib/solidus_admin/version.rb +1 -1
- data/lib/tasks/tailwind.rake +1 -1
- data/solidus_admin.gemspec +24 -21
- metadata +173 -29
- data/.eslintrc.json +0 -7
- data/app/components/solidus_admin/products/show/component.js +0 -9
- data/app/components/solidus_admin/ui/forms/input/component.js +0 -15
- data/app/components/solidus_admin/users/edit/api_access/component.js +0 -9
- data/app/javascript/solidus_admin/controllers/confirm_controller.js +0 -21
- data/lib/solidus_admin/testing_support/shared_examples/bulk_delete_resources.rb +0 -20
- /data/app/{components/solidus_admin/ui/toast/component.js → javascript/solidus_admin/controllers/alert_animation_controller.js} +0 -0
|
@@ -2,67 +2,112 @@
|
|
|
2
2
|
|
|
3
3
|
class SolidusAdmin::UI::Button::Component < SolidusAdmin::BaseComponent
|
|
4
4
|
SIZES = {
|
|
5
|
-
s: %
|
|
5
|
+
s: %(
|
|
6
6
|
h-7 w-7 p-1
|
|
7
7
|
text-xs font-semibold leading-none
|
|
8
|
-
|
|
9
|
-
m: %
|
|
8
|
+
),
|
|
9
|
+
m: %(
|
|
10
10
|
h-9 w-9 p-1.5
|
|
11
11
|
text-sm font-semibold leading-none
|
|
12
|
-
|
|
13
|
-
l: %
|
|
12
|
+
),
|
|
13
|
+
l: %(
|
|
14
14
|
h-12 w-12 p-2
|
|
15
15
|
text-base font-semibold leading-none
|
|
16
|
-
|
|
16
|
+
)
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
TEXT_PADDINGS = {
|
|
20
|
-
s: %
|
|
21
|
-
m: %
|
|
22
|
-
l: %
|
|
20
|
+
s: %(px-1.5 w-auto),
|
|
21
|
+
m: %(px-3 w-auto),
|
|
22
|
+
l: %(px-4 w-auto)
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
ICON_SIZES = {
|
|
26
|
-
s: %
|
|
27
|
-
m: %
|
|
28
|
-
l: %
|
|
26
|
+
s: %(w-[1.4em] h-[1.4em]),
|
|
27
|
+
m: %(w-[1.35em] h-[1.35em]),
|
|
28
|
+
l: %(w-[1.5em] h-[1.5em])
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
SCHEMES = {
|
|
32
|
-
primary: %
|
|
32
|
+
primary: %(
|
|
33
33
|
text-white bg-black
|
|
34
34
|
hover:text-white hover:bg-gray-600
|
|
35
35
|
active:text-white active:bg-gray-800 aria-current:text-white aria-current:bg-gray-800
|
|
36
36
|
focus:text-white focus:bg-gray-700
|
|
37
37
|
disabled:text-gray-400 disabled:bg-gray-100
|
|
38
38
|
aria-disabled:text-gray-400 aria-disabled:bg-gray-100
|
|
39
|
-
|
|
40
|
-
secondary: %
|
|
39
|
+
),
|
|
40
|
+
secondary: %(
|
|
41
41
|
text-gray-700 bg-white border border-1 border-gray-200
|
|
42
42
|
hover:bg-gray-50
|
|
43
43
|
active:bg-gray-100 aria-current:bg-gray-100
|
|
44
44
|
focus:bg-gray-50
|
|
45
45
|
disabled:text-gray-300 disabled:bg-white
|
|
46
46
|
aria-disabled:text-gray-300 aria-disabled:bg-white
|
|
47
|
-
|
|
48
|
-
danger: %
|
|
47
|
+
),
|
|
48
|
+
danger: %(
|
|
49
49
|
text-red-500 bg-white border border-1 border-red-500
|
|
50
50
|
hover:bg-red-500 hover:border-red-600 hover:text-white
|
|
51
51
|
active:bg-red-600 active:border-red-700 active:text-white aria-current:bg-red-600 aria-current:border-red-700 aria-current:text-white
|
|
52
52
|
focus:bg-red-50 focus:bg-red-500 focus:border-red-600 focus:text-white
|
|
53
53
|
disabled:text-red-300 disabled:bg-white disabled:border-red-200
|
|
54
54
|
aria-disabled:text-red-300 aria-disabled:bg-white aria-disabled:border-red-200
|
|
55
|
-
|
|
56
|
-
ghost: %
|
|
55
|
+
),
|
|
56
|
+
ghost: %(
|
|
57
57
|
text-gray-700 bg-transparent
|
|
58
58
|
hover:bg-gray-50
|
|
59
59
|
active:bg-gray-100 aria-current:bg-gray-100
|
|
60
60
|
focus:bg-gray-50 focus:ring-gray-300 focus:ring-2
|
|
61
61
|
disabled:text-gray-300 disabled:bg-transparent disabled:border-gray-300
|
|
62
62
|
aria-disabled:text-gray-300 aria-disabled:bg-transparent aria-disabled:border-gray-300
|
|
63
|
-
|
|
63
|
+
)
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
+
def self.add(path:, **options)
|
|
67
|
+
new(
|
|
68
|
+
tag: :a,
|
|
69
|
+
text: t(".add"),
|
|
70
|
+
icon: "add-line",
|
|
71
|
+
scheme: :primary,
|
|
72
|
+
href: path,
|
|
73
|
+
**options
|
|
74
|
+
)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def self.back(path:, **options)
|
|
78
|
+
new(
|
|
79
|
+
tag: :a,
|
|
80
|
+
title: t(".back"),
|
|
81
|
+
icon: "arrow-left-line",
|
|
82
|
+
scheme: :secondary,
|
|
83
|
+
href: path,
|
|
84
|
+
**options
|
|
85
|
+
)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def self.delete(**options)
|
|
89
|
+
new(
|
|
90
|
+
tag: :button,
|
|
91
|
+
text: t(".delete"),
|
|
92
|
+
scheme: :danger,
|
|
93
|
+
**options
|
|
94
|
+
)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def self.discard(path:, **options)
|
|
98
|
+
new(
|
|
99
|
+
tag: :a,
|
|
100
|
+
text: t(".discard"),
|
|
101
|
+
scheme: :secondary,
|
|
102
|
+
href: path,
|
|
103
|
+
**options
|
|
104
|
+
)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def self.save(**options)
|
|
108
|
+
new(text: t(".save"), **options)
|
|
109
|
+
end
|
|
110
|
+
|
|
66
111
|
def initialize(
|
|
67
112
|
tag: :button,
|
|
68
113
|
text: nil,
|
|
@@ -77,23 +122,35 @@ class SolidusAdmin::UI::Button::Component < SolidusAdmin::BaseComponent
|
|
|
77
122
|
@attributes = attributes
|
|
78
123
|
|
|
79
124
|
@attributes[:class] = [
|
|
80
|
-
|
|
81
|
-
|
|
125
|
+
"justify-start items-center justify-center gap-1 inline-flex rounded",
|
|
126
|
+
"focus:ring focus:ring-gray-300 focus:ring-0.5 focus:ring-offset-0 [&:focus-visible]:outline-none",
|
|
82
127
|
SIZES.fetch(size.to_sym),
|
|
83
128
|
(TEXT_PADDINGS.fetch(size.to_sym) if @text),
|
|
84
129
|
SCHEMES.fetch(scheme.to_sym),
|
|
85
|
-
@attributes[:class]
|
|
86
|
-
].join(
|
|
130
|
+
@attributes[:class]
|
|
131
|
+
].join(" ")
|
|
87
132
|
|
|
88
133
|
@icon_classes = [
|
|
89
|
-
|
|
90
|
-
ICON_SIZES.fetch(size.to_sym)
|
|
134
|
+
"fill-current",
|
|
135
|
+
ICON_SIZES.fetch(size.to_sym)
|
|
91
136
|
]
|
|
92
137
|
end
|
|
93
138
|
|
|
139
|
+
def self.submit(resource:, **attrs)
|
|
140
|
+
unless (text = attrs.delete(:text))
|
|
141
|
+
resource_name = resource.model_name.human
|
|
142
|
+
text = resource.new_record? ? t(".submit.create", resource_name:) : t(".submit.update", resource_name:)
|
|
143
|
+
end
|
|
144
|
+
new(text:, type: :submit, **attrs)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def self.cancel
|
|
148
|
+
new(scheme: :secondary, text: t(".cancel"))
|
|
149
|
+
end
|
|
150
|
+
|
|
94
151
|
def call
|
|
95
152
|
content = []
|
|
96
|
-
content << render(component(
|
|
153
|
+
content << render(component("ui/icon").new(name: @icon, class: @icon_classes)) if @icon
|
|
97
154
|
content << @text if @text
|
|
98
155
|
|
|
99
156
|
content_tag(@tag, safe_join(content), **@attributes)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class SolidusAdmin::UI::Checkbox::Component < SolidusAdmin::BaseComponent
|
|
4
|
+
SIZES = {
|
|
5
|
+
s: "w-4 h-4",
|
|
6
|
+
m: "w-5 h-5"
|
|
7
|
+
}.freeze
|
|
8
|
+
|
|
9
|
+
def initialize(size: :m, **attributes)
|
|
10
|
+
@size = size
|
|
11
|
+
@attributes = attributes
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def call
|
|
15
|
+
tag.input(
|
|
16
|
+
type: "checkbox",
|
|
17
|
+
class: "
|
|
18
|
+
#{SIZES.fetch(@size)}
|
|
19
|
+
form-checkbox
|
|
20
|
+
cursor-pointer
|
|
21
|
+
disabled:cursor-not-allowed
|
|
22
|
+
|
|
23
|
+
bg-white rounded border border-2 border-gray-300
|
|
24
|
+
hover:border-gray-700
|
|
25
|
+
focus:ring focus:ring-gray-300 focus:ring-0.5 focus:bg-white focus:ring-offset-0
|
|
26
|
+
active:ring active:ring-gray-300 active:ring-0.5
|
|
27
|
+
disabled:border-gray-300
|
|
28
|
+
|
|
29
|
+
indeterminate:border-gray-700 indeterminate:bg-gray-700 indeterminate:text-white
|
|
30
|
+
indeterminate:hover:border-gray-500 indeterminate:hover:bg-gray-500
|
|
31
|
+
indeterminate:focus:bg-gray-700
|
|
32
|
+
indeterminate:disabled:border-gray-300 indeterminate:disabled:bg-gray-300
|
|
33
|
+
|
|
34
|
+
checked:border-gray-700 checked:bg-gray-700 checked:text-white
|
|
35
|
+
checked:hover:border-gray-500 checked:hover:bg-gray-500
|
|
36
|
+
checked:focus:bg-gray-700
|
|
37
|
+
checked:disabled:border-gray-300 checked:disabled:bg-gray-300
|
|
38
|
+
",
|
|
39
|
+
**@attributes
|
|
40
|
+
)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
class SolidusAdmin::UI::Dropdown::Component < SolidusAdmin::BaseComponent
|
|
4
4
|
DIRECTIONS = {
|
|
5
5
|
left: "right-0",
|
|
6
|
-
right: "left-0"
|
|
6
|
+
right: "left-0"
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
SIZES = {
|
|
10
10
|
s: "w-5 h-5",
|
|
11
|
-
m: "w-[22px] h-[22px]"
|
|
11
|
+
m: "w-[22px] h-[22px]"
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
def initialize(text: nil, size: :m, direction: :left, **attributes)
|
|
@@ -21,7 +21,7 @@ class SolidusAdmin::UI::Dropdown::Component < SolidusAdmin::BaseComponent
|
|
|
21
21
|
@attributes[:"data-action"] = "turbo:before-cache@window->#{stimulus_id}#close #{attributes[:"data-action"]}"
|
|
22
22
|
@attributes[:class] = "
|
|
23
23
|
font-normal
|
|
24
|
-
#{@size == :m ?
|
|
24
|
+
#{(@size == :m) ? "text-base" : "text-sm"}
|
|
25
25
|
#{@attributes[:class]}
|
|
26
26
|
"
|
|
27
27
|
end
|
|
@@ -1,54 +1,7 @@
|
|
|
1
1
|
<fieldset class="<%= stimulus_id %>"
|
|
2
|
-
data-controller="<%= stimulus_id %>"
|
|
3
2
|
<%= :disabled if @disabled %>
|
|
4
3
|
>
|
|
5
4
|
<div class="<%= stimulus_id %>--address-form flex flex-wrap gap-4 pb-4">
|
|
6
|
-
<%=
|
|
7
|
-
<%= render component("ui/forms/field").text_field(@name, :address1, object: @address) %>
|
|
8
|
-
<%= render component("ui/forms/field").text_field(@name, :address2, object: @address) %>
|
|
9
|
-
<div class="flex gap-4 w-full">
|
|
10
|
-
<%= render component("ui/forms/field").text_field(@name, :city, object: @address) %>
|
|
11
|
-
<%= render component("ui/forms/field").text_field(@name, :zipcode, object: @address) %>
|
|
12
|
-
</div>
|
|
13
|
-
|
|
14
|
-
<%= render component("ui/forms/field").select(
|
|
15
|
-
@name,
|
|
16
|
-
:country_id,
|
|
17
|
-
Spree::Country.all.map { |c| [c.name, c.id] },
|
|
18
|
-
object: @address,
|
|
19
|
-
value: @address.try(:country_id),
|
|
20
|
-
"data-#{stimulus_id}-target": "country",
|
|
21
|
-
"data-action": "change->#{stimulus_id}#loadStates"
|
|
22
|
-
) %>
|
|
23
|
-
|
|
24
|
-
<%= content_tag(:div,
|
|
25
|
-
data: { "#{stimulus_id}-target": "stateNameWrapper" },
|
|
26
|
-
class: (@address.country&.states&.empty? ? "flex flex-col gap-2 w-full" : "hidden flex flex-col gap-2 w-full")
|
|
27
|
-
) do %>
|
|
28
|
-
<%= render component("ui/forms/field").text_field(
|
|
29
|
-
@name,
|
|
30
|
-
:state_name,
|
|
31
|
-
object: @address,
|
|
32
|
-
value: @address.try(:state_name),
|
|
33
|
-
"data-#{stimulus_id}-target": "stateName"
|
|
34
|
-
) %>
|
|
35
|
-
<% end %>
|
|
36
|
-
<input autocomplete="off" type="hidden" name=<%= "#{@name}[state_id]" %>>
|
|
37
|
-
|
|
38
|
-
<%= content_tag(:div,
|
|
39
|
-
data: { "#{stimulus_id}-target": "stateWrapper" },
|
|
40
|
-
class: (@address.country&.states&.empty? ? "hidden flex flex-col gap-2 w-full" : "flex flex-col gap-2 w-full")
|
|
41
|
-
) do %>
|
|
42
|
-
<%= render component("ui/forms/field").select(
|
|
43
|
-
@name,
|
|
44
|
-
:state_id,
|
|
45
|
-
state_options,
|
|
46
|
-
object: @address,
|
|
47
|
-
value: @address.try(:state_id),
|
|
48
|
-
"data-#{stimulus_id}-target": "state"
|
|
49
|
-
) %>
|
|
50
|
-
<% end %>
|
|
51
|
-
|
|
52
|
-
<%= render component("ui/forms/field").text_field(@name, :phone, object: @address) %>
|
|
5
|
+
<%= fieldset %>
|
|
53
6
|
</div>
|
|
54
7
|
</fieldset>
|
|
@@ -1,14 +1,37 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
class SolidusAdmin::UI::Forms::Address::Component < SolidusAdmin::BaseComponent
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
DefaultNamedFieldsetNotFound = Class.new(NameError)
|
|
5
|
+
|
|
6
|
+
include SolidusAdmin::SlotableDefault
|
|
7
|
+
|
|
8
|
+
renders_one :fieldset
|
|
9
|
+
|
|
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: [])
|
|
7
18
|
@disabled = disabled
|
|
19
|
+
@default_fieldset = fieldset_component(fieldset).new(
|
|
20
|
+
addressable:,
|
|
21
|
+
form_field_name:,
|
|
22
|
+
extends:,
|
|
23
|
+
excludes:
|
|
24
|
+
)
|
|
8
25
|
end
|
|
9
26
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
27
|
+
attr_reader :default_fieldset
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
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}'"
|
|
13
36
|
end
|
|
14
37
|
end
|
data/app/components/solidus_admin/ui/forms/address/fields/country_and_state/component.html.erb
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<div class="flex flex-col gap-4 w-full" data-controller="<%= stimulus_id %>">
|
|
2
|
+
<%= render component("ui/forms/field").select(
|
|
3
|
+
@form_field_name,
|
|
4
|
+
:country_id,
|
|
5
|
+
Spree::Country.all.map { |c| [c.name, c.id] },
|
|
6
|
+
object: @addressable,
|
|
7
|
+
value: @addressable.try(:country_id),
|
|
8
|
+
"data-#{stimulus_id}-target": "country",
|
|
9
|
+
"data-action": "change->#{stimulus_id}#loadStates"
|
|
10
|
+
) %>
|
|
11
|
+
|
|
12
|
+
<%= content_tag(:div,
|
|
13
|
+
data: { "#{stimulus_id}-target": "stateNameWrapper" },
|
|
14
|
+
class: (@addressable.country&.states&.empty? ? "flex flex-col gap-2 w-full" : "hidden flex flex-col gap-2 w-full")
|
|
15
|
+
) do %>
|
|
16
|
+
<%= render component("ui/forms/field").text_field(
|
|
17
|
+
@form_field_name,
|
|
18
|
+
:state_name,
|
|
19
|
+
object: @addressable,
|
|
20
|
+
value: @addressable.try(:state_name),
|
|
21
|
+
"data-#{stimulus_id}-target": "stateName"
|
|
22
|
+
) %>
|
|
23
|
+
<% end %>
|
|
24
|
+
<input autocomplete="off" type="hidden" name=<%= "#{@form_field_name}[state_id]" %>>
|
|
25
|
+
|
|
26
|
+
<%= content_tag(:div,
|
|
27
|
+
data: { "#{stimulus_id}-target": "stateWrapper" },
|
|
28
|
+
class: (@addressable.country&.states&.empty? ? "hidden flex flex-col gap-2 w-full" : "flex flex-col gap-2 w-full")
|
|
29
|
+
) do %>
|
|
30
|
+
<%= render component("ui/forms/field").select(
|
|
31
|
+
@form_field_name,
|
|
32
|
+
:state_id,
|
|
33
|
+
state_options,
|
|
34
|
+
object: @addressable,
|
|
35
|
+
value: @addressable.try(:state_id),
|
|
36
|
+
"data-#{stimulus_id}-target": "state"
|
|
37
|
+
) %>
|
|
38
|
+
<% end %>
|
|
39
|
+
</div>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class SolidusAdmin::UI::Forms::Address::Fields::CountryAndState::Component < SolidusAdmin::BaseComponent
|
|
4
|
+
def initialize(addressable:, form_field_name:)
|
|
5
|
+
@addressable = addressable
|
|
6
|
+
@form_field_name = form_field_name
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
def state_options
|
|
12
|
+
return [] unless @addressable.country
|
|
13
|
+
@addressable.country.states.map { |s| [s.name, s.id] }
|
|
14
|
+
end
|
|
15
|
+
end
|
data/app/components/solidus_admin/ui/forms/address/fields/reverse_charge_fields/component.html.erb
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<%= render component("ui/forms/field").text_field(@form_field_name, :vat_id, object: @addressable) %>
|
|
2
|
+
<%= render component("ui/forms/field").select(
|
|
3
|
+
@form_field_name,
|
|
4
|
+
:reverse_charge_status,
|
|
5
|
+
Spree::Address.reverse_charge_statuses.keys.map { |key| [I18n.t("spree.reverse_charge_statuses.#{key}"), key] },
|
|
6
|
+
object: @addressable
|
|
7
|
+
) %>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class SolidusAdmin::UI::Forms::Address::Fields::ReverseChargeFields::Component < SolidusAdmin::BaseComponent
|
|
4
|
+
def initialize(addressable:, form_field_name:)
|
|
5
|
+
@addressable = addressable
|
|
6
|
+
@form_field_name = form_field_name
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def render?
|
|
10
|
+
Spree::Backend::Config.show_reverse_charge_fields
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class SolidusAdmin::UI::Forms::Address::Fieldsets::Base < SolidusAdmin::BaseComponent
|
|
4
|
+
renders_many :fields
|
|
5
|
+
|
|
6
|
+
# @param extends [Array<Hash{Symbol => #call}, Symbol>] Pass an array of extensions to modify existing default
|
|
7
|
+
# fieldset with custom fields or override existing fields.
|
|
8
|
+
# If extension is a Hash, its key should be the name of the field and its value should be an object that responds
|
|
9
|
+
# to #call (e.g. proc or lambda) and returns a ViewComponent instance (or any object that responds to #render_in).
|
|
10
|
+
#
|
|
11
|
+
# Since text inputs are often used as form fields, pass your field name as a Symbol and the component will render
|
|
12
|
+
# a text input for that field.
|
|
13
|
+
# @example
|
|
14
|
+
# component("ui/forms/address/fieldsets/contact").new(
|
|
15
|
+
# extends: [
|
|
16
|
+
# title: -> { component("ui/forms/field").select(...) }, # this will add a custom :title select field
|
|
17
|
+
# name: -> { component("path/to/component").new }, # this will override existing default :name field
|
|
18
|
+
# :company, # this will add a text field for :company
|
|
19
|
+
# ],
|
|
20
|
+
# excludes: %i[phone reverse_charge], # this will exclude :phone and :reverse_charge from the fieldset
|
|
21
|
+
# )
|
|
22
|
+
def initialize(addressable:, form_field_name:, extends: [], excludes: [])
|
|
23
|
+
@addressable = addressable
|
|
24
|
+
@form_field_name = form_field_name
|
|
25
|
+
excludes = Array.wrap(excludes).map(&:to_sym)
|
|
26
|
+
|
|
27
|
+
extended_fields_map = extends.reduce({}) do |acc, extension|
|
|
28
|
+
if extension.is_a?(Hash)
|
|
29
|
+
acc.merge!(extension)
|
|
30
|
+
else
|
|
31
|
+
acc[extension.to_sym] = -> { text_field_component(extension) }
|
|
32
|
+
acc
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
fields_map.merge(extended_fields_map).each do |field_name, renderable|
|
|
37
|
+
with_field { render renderable.call } unless field_name.in?(excludes)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def fields_map
|
|
42
|
+
raise NotImplementedError, "fields_map must be implemented in #{self.class}"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def call
|
|
46
|
+
safe_join(fields)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private
|
|
50
|
+
|
|
51
|
+
def text_field_component(field_name)
|
|
52
|
+
component("ui/forms/field").text_field(@form_field_name, field_name.to_sym, object: @addressable)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class SolidusAdmin::UI::Forms::Address::Fieldsets::Contact::Component < SolidusAdmin::UI::Forms::Address::Fieldsets::Base
|
|
4
|
+
def fields_map
|
|
5
|
+
{
|
|
6
|
+
name: -> { component("ui/forms/field").text_field(@form_field_name, :name, object: @addressable) },
|
|
7
|
+
street: -> { component("ui/forms/field").text_field(@form_field_name, :address1, object: @addressable) },
|
|
8
|
+
street_contd: -> { component("ui/forms/field").text_field(@form_field_name, :address2, object: @addressable) },
|
|
9
|
+
city_and_zipcode: -> { component("ui/forms/address/fields/city_and_zipcode").new(form_field_name: @form_field_name, addressable: @addressable) },
|
|
10
|
+
country_and_state: -> { component("ui/forms/address/fields/country_and_state").new(form_field_name: @form_field_name, addressable: @addressable) },
|
|
11
|
+
phone: -> { component("ui/forms/field").text_field(@form_field_name, :phone, object: @addressable) },
|
|
12
|
+
email: -> { component("ui/forms/field").text_field(@form_field_name, :email, object: @addressable) },
|
|
13
|
+
reverse_charge: -> { component("ui/forms/address/fields/reverse_charge_fields").new(form_field_name: @form_field_name, addressable: @addressable) }
|
|
14
|
+
}
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class SolidusAdmin::UI::Forms::Address::Fieldsets::ContactInfo::Component < SolidusAdmin::UI::Forms::Address::Fieldsets::Base
|
|
4
|
+
def fields_map
|
|
5
|
+
{
|
|
6
|
+
phone: -> { component("ui/forms/field").text_field(@form_field_name, :phone, object: @addressable) },
|
|
7
|
+
email: -> { component("ui/forms/field").text_field(@form_field_name, :email, object: @addressable) }
|
|
8
|
+
}
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class SolidusAdmin::UI::Forms::Address::Fieldsets::Location::Component < SolidusAdmin::UI::Forms::Address::Fieldsets::Base
|
|
4
|
+
def fields_map
|
|
5
|
+
{
|
|
6
|
+
street: -> { component("ui/forms/field").text_field(@form_field_name, :address1, object: @addressable) },
|
|
7
|
+
street_contd: -> { component("ui/forms/field").text_field(@form_field_name, :address2, object: @addressable) },
|
|
8
|
+
city_and_zipcode: -> { component("ui/forms/address/fields/city_and_zipcode").new(form_field_name: @form_field_name, addressable: @addressable) },
|
|
9
|
+
country_and_state: -> { component("ui/forms/address/fields/country_and_state").new(form_field_name: @form_field_name, addressable: @addressable) },
|
|
10
|
+
phone: -> { component("ui/forms/field").text_field(@form_field_name, :phone, object: @addressable) },
|
|
11
|
+
email: -> { component("ui/forms/field").text_field(@form_field_name, :email, object: @addressable) }
|
|
12
|
+
}
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<div class="flex gap-2 items-center">
|
|
2
|
+
<label class="flex gap-2 items-center">
|
|
3
|
+
<%= hidden_field_tag @name, "0" %>
|
|
4
|
+
<%= render component("ui/checkbox").new(
|
|
5
|
+
name: @name,
|
|
6
|
+
value: "1",
|
|
7
|
+
checked: @checked,
|
|
8
|
+
**@attributes
|
|
9
|
+
) %>
|
|
10
|
+
<%= label %>
|
|
11
|
+
</label>
|
|
12
|
+
|
|
13
|
+
<%= hint if hint? %>
|
|
14
|
+
</div>
|
|
@@ -1,42 +1,35 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
class SolidusAdmin::UI::Forms::Checkbox::Component < SolidusAdmin::BaseComponent
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
FONT_WEIGHTS = {
|
|
5
|
+
normal: "font-normal",
|
|
6
|
+
semibold: "font-semibold"
|
|
7
7
|
}.freeze
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
FONT_SIZES = {
|
|
10
|
+
xs: "text-xs",
|
|
11
|
+
s: "text-sm"
|
|
12
|
+
}.freeze
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
tag.
|
|
16
|
-
|
|
14
|
+
renders_one :label, ->(text:, weight: :normal, size: :s, **options) do
|
|
15
|
+
tag.span(
|
|
16
|
+
text,
|
|
17
17
|
class: "
|
|
18
|
-
#{
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
disabled:cursor-not-allowed
|
|
22
|
-
|
|
23
|
-
bg-white rounded border border-2 border-gray-300
|
|
24
|
-
hover:border-gray-700
|
|
25
|
-
focus:ring focus:ring-gray-300 focus:ring-0.5 focus:bg-white focus:ring-offset-0
|
|
26
|
-
active:ring active:ring-gray-300 active:ring-0.5
|
|
27
|
-
disabled:border-gray-300
|
|
28
|
-
|
|
29
|
-
indeterminate:border-gray-700 indeterminate:bg-gray-700 indeterminate:text-white
|
|
30
|
-
indeterminate:hover:border-gray-500 indeterminate:hover:bg-gray-500
|
|
31
|
-
indeterminate:focus:bg-gray-700
|
|
32
|
-
indeterminate:disabled:border-gray-300 indeterminate:disabled:bg-gray-300
|
|
33
|
-
|
|
34
|
-
checked:border-gray-700 checked:bg-gray-700 checked:text-white
|
|
35
|
-
checked:hover:border-gray-500 checked:hover:bg-gray-500
|
|
36
|
-
checked:focus:bg-gray-700
|
|
37
|
-
checked:disabled:border-gray-300 checked:disabled:bg-gray-300
|
|
18
|
+
#{FONT_WEIGHTS.fetch(weight)}
|
|
19
|
+
#{FONT_SIZES.fetch(size)}
|
|
20
|
+
#{options.delete(:classes)}
|
|
38
21
|
",
|
|
39
|
-
|
|
22
|
+
**options
|
|
40
23
|
)
|
|
41
24
|
end
|
|
25
|
+
|
|
26
|
+
renders_one :hint, ->(text:, position: :above) do
|
|
27
|
+
render component("ui/toggletip").new(text:, position:)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def initialize(object_name:, method:, checked:, **attributes)
|
|
31
|
+
@name = "#{object_name}[#{method}]"
|
|
32
|
+
@checked = !!checked
|
|
33
|
+
@attributes = attributes
|
|
34
|
+
end
|
|
42
35
|
end
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<div class="flex gap-1 items-center">
|
|
3
3
|
<span class="
|
|
4
4
|
text-gray-700
|
|
5
|
-
font-semibold
|
|
5
|
+
font-semibold
|
|
6
6
|
"><%= @label %></span>
|
|
7
7
|
|
|
8
8
|
<%= render component('ui/toggletip').new(text: @tip) if @tip.present? %>
|
|
@@ -18,12 +18,12 @@
|
|
|
18
18
|
|
|
19
19
|
<% if @hint.present? || @error.present? %>
|
|
20
20
|
<div class="
|
|
21
|
-
font-normal
|
|
21
|
+
font-normal
|
|
22
22
|
[:disabled~&]:text-gray-300 text-gray-500
|
|
23
|
-
flex gap-1 flex-col
|
|
23
|
+
flex gap-1 flex-col [&>.error]:hidden [&>.error]:peer-invalid:block
|
|
24
24
|
">
|
|
25
25
|
<%= tag.span @hint if @hint.present? %>
|
|
26
|
-
<%= tag.span safe_join(@error, tag.br), class: "text-red-600" if @error.present? %>
|
|
26
|
+
<%= tag.span safe_join(@error, tag.br), class: "error text-red-600" if @error.present? %>
|
|
27
27
|
</div>
|
|
28
28
|
<% end %>
|
|
29
29
|
</label>
|