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
|
@@ -6,3 +6,43 @@ export const debounce = (func, wait) => {
|
|
|
6
6
|
timeout = setTimeout(func, wait)
|
|
7
7
|
}
|
|
8
8
|
}
|
|
9
|
+
|
|
10
|
+
export const setValidity = (element, error) => {
|
|
11
|
+
if (!error) return;
|
|
12
|
+
|
|
13
|
+
element.setCustomValidity(error);
|
|
14
|
+
|
|
15
|
+
const clearValidity = () => {
|
|
16
|
+
element.setCustomValidity("");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let clearOn;
|
|
20
|
+
|
|
21
|
+
switch (element.tagName) {
|
|
22
|
+
case "INPUT":
|
|
23
|
+
case "TEXTAREA":
|
|
24
|
+
clearOn = "input";
|
|
25
|
+
break;
|
|
26
|
+
case "SELECT":
|
|
27
|
+
clearOn = "change";
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
element.addEventListener(clearOn, clearValidity, { once: true });
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export function parseLinkHeader(header) {
|
|
35
|
+
if (!header) return {};
|
|
36
|
+
|
|
37
|
+
const links = {};
|
|
38
|
+
header.split(",").forEach((link) => {
|
|
39
|
+
// match against something like this '<https://example.com>; rel="next"'
|
|
40
|
+
const match = link.match(/<([^>]+)>\s*;\s*rel="([^"]+)"/);
|
|
41
|
+
if (match) {
|
|
42
|
+
const [, url, rel] = match;
|
|
43
|
+
links[rel] = url;
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
return links;
|
|
48
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import TomSelect from "solidus_admin/tom-select";
|
|
2
|
+
import { setValidity } from "solidus_admin/utils";
|
|
3
|
+
|
|
4
|
+
class SolidusSelect extends HTMLSelectElement {
|
|
5
|
+
static observedAttributes = ["synced"];
|
|
6
|
+
|
|
7
|
+
connectedCallback() {
|
|
8
|
+
const tomselect = new TomSelect(this, this.tomSelectSettings);
|
|
9
|
+
|
|
10
|
+
this.setAttribute("synced", "true");
|
|
11
|
+
|
|
12
|
+
// set default style for inner input field
|
|
13
|
+
tomselect.control_input.style =
|
|
14
|
+
"flex: 1 1 auto;\n" +
|
|
15
|
+
"line-height: inherit !important;\n" +
|
|
16
|
+
"max-height: none !important;\n" +
|
|
17
|
+
"max-width: 100% !important;\n" +
|
|
18
|
+
"min-height: 0 !important;\n" +
|
|
19
|
+
"min-width: 7rem;\n" +
|
|
20
|
+
"outline: none !important;"
|
|
21
|
+
|
|
22
|
+
this.setAttribute("hidden", "true");
|
|
23
|
+
this.setAttribute("aria-hidden", "true");
|
|
24
|
+
setValidity(this, this.dataset.errorMessage);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
28
|
+
switch (name) {
|
|
29
|
+
case "synced":
|
|
30
|
+
if (newValue === "false") {
|
|
31
|
+
const keepNone = function() { return false; }
|
|
32
|
+
this.tomselect.clearOptions(keepNone);
|
|
33
|
+
this.tomselect.sync();
|
|
34
|
+
this.setAttribute("synced", "true");
|
|
35
|
+
}
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
get tomSelectSettings() {
|
|
41
|
+
const settings = {
|
|
42
|
+
controlClass: "control",
|
|
43
|
+
dropdownClass: "dropdown",
|
|
44
|
+
dropdownContentClass: "dropdown-content",
|
|
45
|
+
optionClass: "option",
|
|
46
|
+
wrapperClass: "wrapper",
|
|
47
|
+
allowEmptyOption: true,
|
|
48
|
+
maxOptions: null,
|
|
49
|
+
refreshThrottle: 0,
|
|
50
|
+
itemLabelField: "itemLabel",
|
|
51
|
+
plugins: {
|
|
52
|
+
no_active_items: true,
|
|
53
|
+
remove_button: {
|
|
54
|
+
append: this.multiple,
|
|
55
|
+
className: "remove-button"
|
|
56
|
+
},
|
|
57
|
+
patch_scroll: true,
|
|
58
|
+
stash_on_search: true,
|
|
59
|
+
},
|
|
60
|
+
render: {
|
|
61
|
+
no_results: function() {
|
|
62
|
+
const message = this.input.getAttribute("data-no-results-message");
|
|
63
|
+
return `<div class='no-results'>${message}</div>`;
|
|
64
|
+
},
|
|
65
|
+
item: function(data, escape) {
|
|
66
|
+
const itemLabel = data[this.settings.itemLabelField] || data[this.settings.labelField];
|
|
67
|
+
return `<div>${escape(itemLabel)}</div>`;
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
if (this.getAttribute("data-src")) {
|
|
73
|
+
settings.valueField = this.getAttribute("data-option-value-field") || "id";
|
|
74
|
+
settings.labelField = this.getAttribute("data-option-label-field") || "name";
|
|
75
|
+
|
|
76
|
+
settings.plugins.remote_with_pagination = {
|
|
77
|
+
src: this.getAttribute("data-src"),
|
|
78
|
+
preload: this.getAttribute("data-no-preload") !== "true",
|
|
79
|
+
jsonPath: this.getAttribute("data-json-path"),
|
|
80
|
+
queryParam: this.getAttribute("data-query-param"),
|
|
81
|
+
loadingMessage: this.getAttribute("data-loading-message"),
|
|
82
|
+
loadingMoreMessage: this.getAttribute("data-loading-more-message"),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return settings;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
customElements.define("solidus-select", SolidusSelect, { extends: "select" });
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/*! (c) Andrea Giammarchi @webreflection ISC */
|
|
2
|
+
!function(){"use strict";var e=function(e,t){var n=function(e){for(var t=0,n=e.length;t<n;t++)r(e[t])},r=function(e){var t=e.target,n=e.attributeName,r=e.oldValue;t.attributeChangedCallback(n,r,t.getAttribute(n))};return function(o,a){var l=o.constructor.observedAttributes;return l&&e(a).then((function(){new t(n).observe(o,{attributes:!0,attributeOldValue:!0,attributeFilter:l});for(var e=0,a=l.length;e<a;e++)o.hasAttribute(l[e])&&r({target:o,attributeName:l[e],oldValue:null})})),o}};function t(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function n(e,n){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=function(e,n){if(e){if("string"==typeof e)return t(e,n);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?t(e,n):void 0}}(e))||n&&e&&"number"==typeof e.length){r&&(e=r);var o=0,a=function(){};return{s:a,n:function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var l,i=!0,c=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return i=e.done,e},e:function(e){c=!0,l=e},f:function(){try{i||null==r.return||r.return()}finally{if(c)throw l}}}}
|
|
3
|
+
/*! (c) Andrea Giammarchi - ISC */var r=!0,o=!1,a="querySelectorAll",l="querySelectorAll",i=self,c=i.document,u=i.Element,s=i.MutationObserver,f=i.Set,d=i.WeakMap,h=function(e){return l in e},v=[].filter,p=function(e){var t=new d,i=function(n,r){var o;if(r)for(var a,l=function(e){return e.matches||e.webkitMatchesSelector||e.msMatchesSelector}(n),i=0,c=y.length;i<c;i++)l.call(n,a=y[i])&&(t.has(n)||t.set(n,new f),(o=t.get(n)).has(a)||(o.add(a),e.handle(n,r,a)));else t.has(n)&&(o=t.get(n),t.delete(n),o.forEach((function(t){e.handle(n,r,t)})))},p=function(e){for(var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=0,r=e.length;n<r;n++)i(e[n],t)},y=e.query,g=e.root||c,m=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:document,l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:MutationObserver,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:["*"],c=function t(o,l,i,c,u,s){var f,d=n(o);try{for(d.s();!(f=d.n()).done;){var h=f.value;(s||a in h)&&(u?i.has(h)||(i.add(h),c.delete(h),e(h,u)):c.has(h)||(c.add(h),i.delete(h),e(h,u)),s||t(h[a](l),l,i,c,u,r))}}catch(e){d.e(e)}finally{d.f()}},u=new l((function(e){if(i.length){var t,a=i.join(","),l=new Set,u=new Set,s=n(e);try{for(s.s();!(t=s.n()).done;){var f=t.value,d=f.addedNodes,h=f.removedNodes;c(h,a,l,u,o,o),c(d,a,l,u,r,o)}}catch(e){s.e(e)}finally{s.f()}}})),s=u.observe;return(u.observe=function(e){return s.call(u,e,{subtree:r,childList:r})})(t),u}(i,g,s,y),w=u.prototype.attachShadow;return w&&(u.prototype.attachShadow=function(e){var t=w.call(this,e);return m.observe(t),t}),y.length&&p(g[l](y)),{drop:function(e){for(var n=0,r=e.length;n<r;n++)t.delete(e[n])},flush:function(){for(var e=m.takeRecords(),t=0,n=e.length;t<n;t++)p(v.call(e[t].removedNodes,h),!1),p(v.call(e[t].addedNodes,h),!0)},observer:m,parse:p}},y=self,g=y.document,m=y.Map,w=y.MutationObserver,b=y.Object,E=y.Set,S=y.WeakMap,A=y.Element,M=y.HTMLElement,O=y.Node,N=y.Error,C=y.TypeError,T=y.Reflect,q=b.defineProperty,D=b.keys,I=b.getOwnPropertyNames,P=b.setPrototypeOf,k=!self.customElements,L=function(e){for(var t=D(e),n=[],r=new E,o=t.length,a=0;a<o;a++){n[a]=e[t[a]];try{delete e[t[a]]}catch(e){r.add(a)}}return function(){for(var a=0;a<o;a++)r.has(a)||(e[t[a]]=n[a])}};if(k){var x=function(){var e=this.constructor;if(!$.has(e))throw new C("Illegal constructor");var t=$.get(e);if(W)return F(W,t);var n=H.call(g,t);return F(P(n,e.prototype),t)},H=g.createElement,$=new m,_=new m,j=new m,R=new m,V=[],U=p({query:V,handle:function(e,t,n){var r=j.get(n);if(t&&!r.isPrototypeOf(e)){var o=L(e);W=P(e,r);try{new r.constructor}finally{W=null,o()}}var a="".concat(t?"":"dis","connectedCallback");a in r&&e[a]()}}).parse,W=null,B=function(e){if(!_.has(e)){var t,n=new Promise((function(e){t=e}));_.set(e,{$:n,_:t})}return _.get(e).$},F=e(B,w);self.customElements={define:function(e,t){if(R.has(e))throw new N('the name "'.concat(e,'" has already been used with this registry'));$.set(t,e),j.set(e,t.prototype),R.set(e,t),V.push(e),B(e).then((function(){U(g.querySelectorAll(e))})),_.get(e)._(t)},get:function(e){return R.get(e)},whenDefined:B},q(x.prototype=M.prototype,"constructor",{value:x}),self.HTMLElement=x,g.createElement=function(e,t){var n=t&&t.is,r=n?R.get(n):R.get(e);return r?new r:H.call(g,e)},"isConnected"in O.prototype||q(O.prototype,"isConnected",{configurable:!0,get:function(){return!(this.ownerDocument.compareDocumentPosition(this)&this.DOCUMENT_POSITION_DISCONNECTED)}})}else if(k=!self.customElements.get("extends-br"))try{var z=function e(){return self.Reflect.construct(HTMLBRElement,[],e)};z.prototype=HTMLLIElement.prototype;var G="extends-br";self.customElements.define("extends-br",z,{extends:"br"}),k=g.createElement("br",{is:G}).outerHTML.indexOf(G)<0;var J=self.customElements,K=J.get,Q=J.whenDefined;self.customElements.whenDefined=function(e){var t=this;return Q.call(this,e).then((function(n){return n||K.call(t,e)}))}}catch(e){}if(k){var X=function(e){var t=ae.get(e);ve(t.querySelectorAll(this),e.isConnected)},Y=self.customElements,Z=g.createElement,ee=Y.define,te=Y.get,ne=Y.upgrade,re=T||{construct:function(e){return e.call(this)}},oe=re.construct,ae=new S,le=new E,ie=new m,ce=new m,ue=new m,se=new m,fe=[],de=[],he=function(e){return se.get(e)||te.call(Y,e)},ve=p({query:de,handle:function(e,t,n){var r=ue.get(n);if(t&&!r.isPrototypeOf(e)){var o=L(e);we=P(e,r);try{new r.constructor}finally{we=null,o()}}var a="".concat(t?"":"dis","connectedCallback");a in r&&e[a]()}}).parse,pe=p({query:fe,handle:function(e,t){ae.has(e)&&(t?le.add(e):le.delete(e),de.length&&X.call(de,e))}}).parse,ye=A.prototype.attachShadow;ye&&(A.prototype.attachShadow=function(e){var t=ye.call(this,e);return ae.set(this,t),t});var ge=function(e){if(!ce.has(e)){var t,n=new Promise((function(e){t=e}));ce.set(e,{$:n,_:t})}return ce.get(e).$},me=e(ge,w),we=null;I(self).filter((function(e){return/^HTML.*Element$/.test(e)})).forEach((function(e){var t=self[e];function n(){var e=this.constructor;if(!ie.has(e))throw new C("Illegal constructor");var n=ie.get(e),r=n.is,o=n.tag;if(r){if(we)return me(we,r);var a=Z.call(g,o);return a.setAttribute("is",r),me(P(a,e.prototype),r)}return oe.call(this,t,[],e)}q(n.prototype=t.prototype,"constructor",{value:n}),q(self,e,{value:n})})),g.createElement=function(e,t){var n=t&&t.is;if(n){var r=se.get(n);if(r&&ie.get(r).tag===e)return new r}var o=Z.call(g,e);return n&&o.setAttribute("is",n),o},Y.get=he,Y.whenDefined=ge,Y.upgrade=function(e){var t=e.getAttribute("is");if(t){var n=se.get(t);if(n)return void me(P(e,n.prototype),t)}ne.call(Y,e)},Y.define=function(e,t,n){if(he(e))throw new N("'".concat(e,"' has already been defined as a custom element"));var r,o=n&&n.extends;ie.set(t,o?{is:e,tag:o}:{is:"",tag:e}),o?(r="".concat(o,'[is="').concat(e,'"]'),ue.set(r,t.prototype),se.set(e,t),de.push(r)):(ee.apply(Y,arguments),fe.push(r=e)),ge(e).then((function(){o?(ve(g.querySelectorAll(r)),le.forEach(X,[r])):pe(g.querySelectorAll(r))})),ce.get(e)._(t)}}}();
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class SolidusAdmin::FormBuilder < ActionView::Helpers::FormBuilder
|
|
4
|
+
include SolidusAdmin::ComponentsHelper
|
|
5
|
+
|
|
6
|
+
delegate :render, to: :@template
|
|
7
|
+
|
|
8
|
+
def text_field(method, **options)
|
|
9
|
+
render component("ui/forms/field").text_field(self, method, **options)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def text_area(method, **options)
|
|
13
|
+
render component("ui/forms/field").text_area(self, method, **options)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def select(method, choices, **options)
|
|
17
|
+
render component("ui/forms/field").select(self, method, choices, **options)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def checkbox(method, label: nil, checked: nil, hint: nil, **options)
|
|
21
|
+
label = @object.class.human_attribute_name(method) if label.nil?
|
|
22
|
+
label_options = options.delete(:label_options) || {}
|
|
23
|
+
checked = @object.public_send(method) if checked.nil?
|
|
24
|
+
hint_options = options.delete(:hint_options) || {}
|
|
25
|
+
|
|
26
|
+
component_instance = component("ui/forms/checkbox").new(object_name: @object_name, checked:, method:, **options)
|
|
27
|
+
render component_instance do |checkbox|
|
|
28
|
+
checkbox.with_label(text: label, **label_options)
|
|
29
|
+
checkbox.with_hint(text: hint, **hint_options) if hint
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def checkbox_row(method, options:, row_title:, **attrs)
|
|
34
|
+
render component("ui/checkbox_row").new(form: self, method:, options:, row_title:, **attrs)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def input(method, **options)
|
|
38
|
+
name = "#{@object_name}[#{method}]"
|
|
39
|
+
value = @object.public_send(method) if options[:value].nil?
|
|
40
|
+
render component("ui/forms/input").new(name:, value:, **options)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def hidden_field(method, **options)
|
|
44
|
+
input(method, type: :hidden, autocomplete: "off", **options)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def switch_field(method, label: nil, include_hidden: true, **options)
|
|
48
|
+
label = @object.class.human_attribute_name(method) if label.nil?
|
|
49
|
+
name = "#{@object_name}[#{method}]"
|
|
50
|
+
error = @object.errors[method]
|
|
51
|
+
checked = @object.public_send(method)
|
|
52
|
+
render component("ui/forms/switch_field").new(label:, name:, error:, checked:, include_hidden:, **options)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def submit(**options)
|
|
56
|
+
render component("ui/button").submit(resource: @object, form: id, **options)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -13,11 +13,11 @@
|
|
|
13
13
|
|
|
14
14
|
<%= stylesheet_link_tag SolidusAdmin::Config.theme_path(session[:admin_light_theme]), media: '(prefers-color-scheme: light)', "data-turbo-track": "reload" %>
|
|
15
15
|
<%= stylesheet_link_tag SolidusAdmin::Config.theme_path(session[:admin_dark_theme]), media: '(prefers-color-scheme: dark)', "data-turbo-track": "reload" %>
|
|
16
|
-
<%= javascript_importmap_tags "solidus_admin/application",
|
|
17
|
-
<meta name="turbo-refresh-scroll"
|
|
16
|
+
<%= javascript_importmap_tags "solidus_admin/application", importmap: SolidusAdmin.importmap %>
|
|
17
|
+
<meta name="turbo-refresh-scroll" content="preserve">
|
|
18
18
|
</head>
|
|
19
19
|
|
|
20
|
-
<body class="bg-gray-15 font-sans">
|
|
20
|
+
<body class="bg-gray-15 font-sans text-sm">
|
|
21
21
|
<%= render component("layout/skip_link").new(href: "#main") %>
|
|
22
22
|
<div class="flex gap-0">
|
|
23
23
|
<div class="min-w-[240px] border-r border-r-gray-100 relative">
|
|
@@ -31,10 +31,8 @@
|
|
|
31
31
|
</main>
|
|
32
32
|
</div>
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
<% end %>
|
|
38
|
-
</div>
|
|
34
|
+
<%= render component("layout/flashes/alerts").new(alerts:) %>
|
|
35
|
+
<%= render component("layout/flashes/toasts").new(toasts:) %>
|
|
36
|
+
<%= render component("layout/confirm").new %>
|
|
39
37
|
</body>
|
|
40
38
|
</html>
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<%= stylesheet_link_tag SolidusAdmin::Config.theme_path(session[:admin_light_theme]), media: '(prefers-color-scheme: light)', "data-turbo-track": "reload" %>
|
|
5
5
|
<%= stylesheet_link_tag SolidusAdmin::Config.theme_path(session[:admin_dark_theme]), media: '(prefers-color-scheme: dark)', "data-turbo-track": "reload" %>
|
|
6
|
-
<%= javascript_importmap_tags "solidus_admin/application",
|
|
6
|
+
<%= javascript_importmap_tags "solidus_admin/application", importmap: SolidusAdmin.importmap %>
|
|
7
7
|
</head>
|
|
8
8
|
<body class="p-3">
|
|
9
9
|
<%= yield %>
|
data/config/importmap.rb
CHANGED
|
@@ -10,6 +10,15 @@ pin "sortablejs", to: "https://cdn.jsdelivr.net/npm/sortablejs@1.15.0/+esm"
|
|
|
10
10
|
pin "@rails/request.js", to: "https://cdn.jsdelivr.net/npm/@rails/request.js@0.0.9/+esm"
|
|
11
11
|
|
|
12
12
|
pin "solidus_admin/application", preload: true
|
|
13
|
+
pin "solidus_admin/confirm_modal"
|
|
13
14
|
pin "solidus_admin/utils"
|
|
15
|
+
pin "solidus_admin/tom-select", to: "solidus_admin/tom-select/tom-select.js"
|
|
16
|
+
pin "vendor/custom_elements", preload: true
|
|
17
|
+
|
|
14
18
|
pin_all_from SolidusAdmin::Engine.root.join("app/javascript/solidus_admin/controllers"), under: "solidus_admin/controllers"
|
|
15
19
|
pin_all_from SolidusAdmin::Engine.root.join("app/components")
|
|
20
|
+
pin_all_from SolidusAdmin::Engine.root.join("app/javascript/solidus_admin/web_components"), under: "solidus_admin/web_components"
|
|
21
|
+
|
|
22
|
+
pin "tom-select", to: "https://ga.jspm.io/npm:tom-select@2.4.3/dist/esm/tom-select.complete.js"
|
|
23
|
+
pin "@orchidjs/sifter", to: "https://ga.jspm.io/npm:@orchidjs/sifter@1.1.0/dist/esm/sifter.js"
|
|
24
|
+
pin "@orchidjs/unicode-variants", to: "https://ga.jspm.io/npm:@orchidjs/unicode-variants@1.1.2/dist/esm/index.js"
|
|
@@ -6,7 +6,7 @@ if Rails.env.development? || Rails.env.test?
|
|
|
6
6
|
Rails.application.config.view_component.instrumentation_enabled = true
|
|
7
7
|
Rails.application.config.view_component.use_deprecated_instrumentation_name = false
|
|
8
8
|
|
|
9
|
-
bold
|
|
9
|
+
bold = "\e[1m"
|
|
10
10
|
clear = "\e[0m"
|
|
11
11
|
|
|
12
12
|
ActiveSupport::Notifications.subscribe("render.view_component") do |*args|
|
|
@@ -2,5 +2,9 @@ en:
|
|
|
2
2
|
solidus_admin:
|
|
3
3
|
option_types:
|
|
4
4
|
title: "Option Types"
|
|
5
|
+
create:
|
|
6
|
+
success: "Option type was successfully created."
|
|
5
7
|
destroy:
|
|
6
|
-
success: "Option
|
|
8
|
+
success: "Option types were successfully removed."
|
|
9
|
+
update:
|
|
10
|
+
success: "Option type was successfully updated."
|
|
@@ -2,5 +2,9 @@ en:
|
|
|
2
2
|
solidus_admin:
|
|
3
3
|
payment_methods:
|
|
4
4
|
title: "Payment Methods"
|
|
5
|
+
create:
|
|
6
|
+
success: "Payment method was successfully created."
|
|
5
7
|
destroy:
|
|
6
|
-
success: "Payment
|
|
8
|
+
success: "Payment methods were successfully removed."
|
|
9
|
+
update:
|
|
10
|
+
success: "Payment method was successfully updated."
|
|
@@ -1,6 +1,28 @@
|
|
|
1
1
|
en:
|
|
2
|
+
activerecord:
|
|
3
|
+
attributes:
|
|
4
|
+
spree/store:
|
|
5
|
+
available_locales: Storefront Languages
|
|
6
|
+
bcc_email: BCC Email
|
|
7
|
+
cart_tax_country_iso: Tax Country
|
|
8
|
+
code: Slug
|
|
9
|
+
default: Default
|
|
10
|
+
default_currency: Default Currency
|
|
11
|
+
mail_from_address: Store Email
|
|
12
|
+
meta_description: Meta Description
|
|
13
|
+
meta_keywords: Meta Keywords
|
|
14
|
+
name: Store Name
|
|
15
|
+
seo_title: Page Title
|
|
16
|
+
url: URL
|
|
2
17
|
solidus_admin:
|
|
3
18
|
stores:
|
|
4
19
|
title: "Stores"
|
|
20
|
+
create:
|
|
21
|
+
success: "Store was successfully created."
|
|
5
22
|
destroy:
|
|
23
|
+
error:
|
|
24
|
+
title: "Some Stores could not be removed"
|
|
25
|
+
description: "%{name}: %{reason}"
|
|
6
26
|
success: "Stores were successfully removed."
|
|
27
|
+
update:
|
|
28
|
+
success: "Store was successfully updated."
|
data/config/locales/zones.en.yml
CHANGED
data/config/routes.rb
CHANGED
|
@@ -6,26 +6,30 @@ SolidusAdmin::Engine.routes.draw do
|
|
|
6
6
|
|
|
7
7
|
resource :account, only: :show
|
|
8
8
|
resources :countries, only: [] do
|
|
9
|
-
get
|
|
9
|
+
get "states", to: "countries#states"
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
+
resources :states, only: [:index], defaults: {format: :json}
|
|
13
|
+
|
|
12
14
|
admin_resources :products, only: [:index, :update, :destroy] do
|
|
13
15
|
collection do
|
|
14
16
|
put :discontinue
|
|
15
17
|
put :activate
|
|
16
18
|
end
|
|
19
|
+
|
|
20
|
+
resources :taxons, only: [:new, :create], controller: :product_taxons
|
|
17
21
|
end
|
|
18
22
|
|
|
19
23
|
# Needs a constraint to avoid interpreting "new" as a product's slug
|
|
20
24
|
admin_resources :products, only: [
|
|
21
25
|
:show, :edit
|
|
22
|
-
], constraints: ->{ SolidusAdmin::Config.enable_alpha_features? && _1.path != "/admin/products/new" }
|
|
26
|
+
], constraints: -> { SolidusAdmin::Config.enable_alpha_features? && _1.path != "/admin/products/new" }
|
|
23
27
|
|
|
24
28
|
admin_resources :orders, only: [:index]
|
|
25
29
|
|
|
26
30
|
admin_resources :orders, except: [
|
|
27
31
|
:destroy, :index
|
|
28
|
-
], constraints: ->{ SolidusAdmin::Config.enable_alpha_features? } do
|
|
32
|
+
], constraints: -> { SolidusAdmin::Config.enable_alpha_features? } do
|
|
29
33
|
resources :adjustments, only: [:index] do
|
|
30
34
|
collection do
|
|
31
35
|
delete :destroy
|
|
@@ -45,6 +49,11 @@ SolidusAdmin::Engine.routes.draw do
|
|
|
45
49
|
end
|
|
46
50
|
end
|
|
47
51
|
|
|
52
|
+
admin_resources :payment_methods,
|
|
53
|
+
constraints: -> { SolidusAdmin::Config.enable_alpha_features? },
|
|
54
|
+
except: [:show],
|
|
55
|
+
sortable: true
|
|
56
|
+
|
|
48
57
|
admin_resources :users, only: [:index, :edit, :destroy] do
|
|
49
58
|
member do
|
|
50
59
|
get :addresses
|
|
@@ -67,22 +76,25 @@ SolidusAdmin::Engine.routes.draw do
|
|
|
67
76
|
|
|
68
77
|
admin_resources :promotions, only: [:index, :destroy]
|
|
69
78
|
admin_resources :properties, except: [:show]
|
|
70
|
-
admin_resources :option_types,
|
|
79
|
+
admin_resources :option_types, except: [:show], sortable: true do
|
|
80
|
+
admin_resources :option_values, only: [:new, :create, :destroy], controller: "option_values", sortable: false
|
|
81
|
+
end
|
|
82
|
+
admin_resources :option_values, only: [:edit, :update], sortable: true
|
|
71
83
|
admin_resources :taxonomies, only: [:index, :destroy], sortable: true
|
|
72
84
|
admin_resources :promotion_categories, only: [:index, :destroy]
|
|
73
85
|
admin_resources :tax_categories, except: [:show]
|
|
74
|
-
admin_resources :tax_rates,
|
|
75
|
-
admin_resources :payment_methods, only: [:index, :destroy], sortable: true
|
|
86
|
+
admin_resources :tax_rates, except: [:show]
|
|
76
87
|
admin_resources :stock_items, only: [:index, :edit, :update]
|
|
77
88
|
admin_resources :shipping_methods, only: [:index, :destroy]
|
|
78
89
|
admin_resources :shipping_categories, except: [:show]
|
|
79
|
-
admin_resources :stock_locations,
|
|
80
|
-
admin_resources :stores,
|
|
81
|
-
admin_resources :zones,
|
|
90
|
+
admin_resources :stock_locations, except: [:show]
|
|
91
|
+
admin_resources :stores, except: [:show]
|
|
92
|
+
admin_resources :zones, except: [:show]
|
|
82
93
|
admin_resources :refund_reasons, except: [:show]
|
|
83
94
|
admin_resources :reimbursement_types, only: [:index]
|
|
84
95
|
admin_resources :return_reasons, except: [:show]
|
|
85
96
|
admin_resources :roles, except: [:show]
|
|
86
97
|
admin_resources :adjustment_reasons, except: [:show]
|
|
87
98
|
admin_resources :store_credit_reasons, except: [:show]
|
|
99
|
+
admin_resources :product_option_types, only: [], sortable: true
|
|
88
100
|
end
|
data/config/tailwind.config.js
CHANGED
|
@@ -29,7 +29,7 @@ module.exports = {
|
|
|
29
29
|
// Secondary palette
|
|
30
30
|
yellow: "#fdc071",
|
|
31
31
|
orange: "#f68050",
|
|
32
|
-
blue: "#2554b1",
|
|
32
|
+
"solidus-blue": "#2554b1",
|
|
33
33
|
moss: "#2d3925",
|
|
34
34
|
forest: "#096756",
|
|
35
35
|
midnight: "#163449",
|
|
@@ -42,6 +42,7 @@ module.exports = {
|
|
|
42
42
|
|
|
43
43
|
// Extra colors (not part of the original palette)
|
|
44
44
|
"papaya-whip": "#f9e3d9",
|
|
45
|
+
sazerac: "#fcf0dd",
|
|
45
46
|
|
|
46
47
|
// UI Red
|
|
47
48
|
red: {
|
|
@@ -83,6 +84,9 @@ module.exports = {
|
|
|
83
84
|
sm: "0px 1px 2px 0px rgba(0, 0, 0, 0.04)",
|
|
84
85
|
base: "0px 4px 8px 0px rgba(0, 0, 0, 0.08), 0px 2px 4px -1px rgba(0, 0, 0, 0.04)",
|
|
85
86
|
},
|
|
87
|
+
height: {
|
|
88
|
+
"5.5": "1.375rem",
|
|
89
|
+
}
|
|
86
90
|
},
|
|
87
91
|
},
|
|
88
92
|
plugins: [
|
|
@@ -108,7 +112,7 @@ module.exports = {
|
|
|
108
112
|
// Add a text style for links
|
|
109
113
|
addComponents({
|
|
110
114
|
".body-link": {
|
|
111
|
-
color: theme("colors.blue"),
|
|
115
|
+
color: theme("colors.solidus-blue"),
|
|
112
116
|
"&:hover": {
|
|
113
117
|
textDecoration: "underline",
|
|
114
118
|
},
|
data/docs/components.md
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
Components are the main building blocks of the admin interface. They are implemented as ViewComponents and are rendered directly by controllers.
|
|
4
4
|
|
|
5
|
-
The following documentation assumes
|
|
5
|
+
The following documentation assumes familiarity with ViewComponents. If you are not please refer to the [ViewComponent documentation](https://viewcomponent.org/guide/).
|
|
6
6
|
|
|
7
7
|
There are two types of components:
|
|
8
8
|
|
|
9
|
-
- **UI components** are the building blocks of the interface.
|
|
9
|
+
- **UI components** are the building blocks of the interface. Typically, they are small components that are used to build more complex components and are generic enough to be reused in various contexts. UI components are located under the `app/components/solidus_admin/ui` folder.
|
|
10
10
|
- **Page components** are the primary components rendered by the controllers. Generally, they are full-page components rendered directly by the controllers. They are located under the `app/components/solidus_admin` directory following the naming convention of the controller and action names they are used in. For example `app/components/solidus_admin/orders/index/component.rb` is the component that is rendered by the `SolidusAdmin::OrdersController#index` action.
|
|
11
11
|
|
|
12
12
|
## Generating components
|
data/docs/index_pages.md
CHANGED
|
@@ -20,21 +20,27 @@ class SolidusAdmin::UsersController < SolidusAdmin::BaseController
|
|
|
20
20
|
# ...
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
For pagination support, the index action should also call the `
|
|
23
|
+
For pagination support, the index action should also call the `paginate` method provided by `SolidusAdmin::ControllerHelpers::Pagination` (included in `SolidusAdmin::BaseController`). It paginates the collection with Kaminari, 20 records per page by default (pass `per_page:` to change it), and returns the page to be displayed. Assign it to `@page`.
|
|
24
24
|
|
|
25
25
|
```ruby
|
|
26
26
|
def index
|
|
27
27
|
users = apply_search_to(Spree.user_class.order(id: :desc), param: :q)
|
|
28
|
-
|
|
28
|
+
@page = paginate(users)
|
|
29
29
|
# ...
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
To sort the records, pass `ordered_by:` with the columns and directions to sort by. The primary key is added as a final sort column when it isn't already included, so records with equal values don't repeat or go missing between pages.
|
|
33
|
+
|
|
34
|
+
```ruby
|
|
35
|
+
@page = paginate(products, ordered_by: {name: :asc}) # ORDER BY name ASC, id ASC
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Finally, the index action should render the `index` component passing the `@page` instance variable as the `page` prop.
|
|
33
39
|
|
|
34
40
|
```ruby
|
|
35
41
|
def index
|
|
36
42
|
users = apply_search_to(Spree.user_class.order(id: :desc), param: :q)
|
|
37
|
-
|
|
43
|
+
@page = paginate(users)
|
|
38
44
|
render component('users/index').new(page: @page)
|
|
39
45
|
end
|
|
40
46
|
```
|
|
@@ -94,7 +100,7 @@ end
|
|
|
94
100
|
def delete
|
|
95
101
|
@users = Spree.user_class.where(id: params[:id])
|
|
96
102
|
@users.destroy_all
|
|
97
|
-
flash[:
|
|
103
|
+
flash[:notice] = "Admin users deleted"
|
|
98
104
|
redirect_to solidus_admin.users_path, status: :see_other
|
|
99
105
|
end
|
|
100
106
|
```
|
data/docs/stimulusjs.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
This project uses [StimulusJS](https://stimulusjs.org) to add interactivity to the admin interface.
|
|
4
4
|
|
|
5
|
-
## Using
|
|
5
|
+
## Using the `stimulus_id` helper
|
|
6
6
|
|
|
7
7
|
All JavaScript files are imported using `import-maps`, eliminating the need for compilation.
|
|
8
8
|
|
data/eslint.config.mjs
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { defineConfig } from "eslint/config";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import js from "@eslint/js";
|
|
5
|
+
import { FlatCompat } from "@eslint/eslintrc";
|
|
6
|
+
import rootConfig from "../eslint.config.mjs";
|
|
7
|
+
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = path.dirname(__filename);
|
|
10
|
+
const compat = new FlatCompat({
|
|
11
|
+
baseDirectory: __dirname,
|
|
12
|
+
recommendedConfig: js.configs.recommended,
|
|
13
|
+
allConfig: js.configs.all
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
export default defineConfig([
|
|
17
|
+
{
|
|
18
|
+
extends: [compat.extends("eslint:recommended"), rootConfig],
|
|
19
|
+
|
|
20
|
+
languageOptions: {
|
|
21
|
+
ecmaVersion: 2023,
|
|
22
|
+
sourceType: "module",
|
|
23
|
+
},
|
|
24
|
+
}
|
|
25
|
+
]);
|