spree_admin 5.0.4 → 5.1.0.beta
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/app/assets/images/login_sidebar_background.png +0 -0
- data/app/assets/stylesheets/spree/admin/components/_bulk_panel.scss +8 -1
- data/app/assets/stylesheets/spree/admin/components/_buttons.scss +12 -20
- data/app/assets/stylesheets/spree/admin/components/_cards.scss +9 -3
- data/app/assets/stylesheets/spree/admin/components/_dropdowns.scss +13 -40
- data/app/assets/stylesheets/spree/admin/components/_filters.scss +32 -3
- data/app/assets/stylesheets/spree/admin/components/_main.scss +107 -31
- data/app/assets/stylesheets/spree/admin/components/_media_form.scss +21 -9
- data/app/assets/stylesheets/spree/admin/components/_modals.scss +4 -3
- data/app/assets/stylesheets/spree/admin/components/_navbar.scss +5 -9
- data/app/assets/stylesheets/spree/admin/components/_navigation.scss +0 -1
- data/app/assets/stylesheets/spree/admin/components/_sortable_tree.scss +6 -2
- data/app/assets/stylesheets/spree/admin/components/_tables.scss +35 -5
- data/app/assets/stylesheets/spree/admin/global/_variables.scss +37 -17
- data/app/assets/stylesheets/spree/admin/plugins/tom-select.bootstrap4.scss +5 -4
- data/app/assets/stylesheets/spree/admin/shared/_base.scss +50 -17
- data/app/assets/stylesheets/spree/admin/shared/_forms.scss +6 -2
- data/app/assets/stylesheets/spree/admin/views/_page_builder.scss +30 -21
- data/app/controllers/concerns/spree/admin/breadcrumb_concern.rb +22 -0
- data/app/controllers/concerns/spree/admin/preferences_concern.rb +22 -0
- data/app/controllers/concerns/spree/admin/products_breadcrumb_concern.rb +22 -0
- data/app/controllers/concerns/spree/admin/promotions_breadcrumb_concern.rb +23 -0
- data/app/controllers/concerns/spree/admin/storefront_breadcrumb_concern.rb +12 -0
- data/app/controllers/spree/admin/addresses_controller.rb +4 -0
- data/app/controllers/spree/admin/admin_users_controller.rb +112 -0
- data/app/controllers/spree/admin/assets_controller.rb +7 -9
- data/app/controllers/spree/admin/base_controller.rb +21 -10
- data/app/controllers/spree/admin/checkouts_controller.rb +4 -0
- data/app/controllers/spree/admin/classifications_controller.rb +4 -0
- data/app/controllers/spree/admin/coupon_codes_controller.rb +2 -0
- data/app/controllers/spree/admin/custom_domains_controller.rb +6 -0
- data/app/controllers/spree/admin/customer_returns_controller.rb +4 -0
- data/app/controllers/spree/admin/dashboard_controller.rb +8 -2
- data/app/controllers/spree/admin/digital_assets_controller.rb +8 -0
- data/app/controllers/spree/admin/exports_controller.rb +6 -2
- data/app/controllers/spree/admin/integrations_controller.rb +61 -0
- data/app/controllers/spree/admin/invitations_controller.rb +128 -0
- data/app/controllers/spree/admin/line_items_controller.rb +4 -0
- data/app/controllers/spree/admin/oauth_applications_controller.rb +6 -0
- data/app/controllers/spree/admin/option_types_controller.rb +15 -0
- data/app/controllers/spree/admin/option_values_controller.rb +4 -0
- data/app/controllers/spree/admin/orders/return_authorizations_controller.rb +4 -0
- data/app/controllers/spree/admin/orders_controller.rb +11 -0
- data/app/controllers/spree/admin/page_blocks_controller.rb +3 -2
- data/app/controllers/spree/admin/page_links_controller.rb +9 -0
- data/app/controllers/spree/admin/page_sections_controller.rb +13 -4
- data/app/controllers/spree/admin/pages_controller.rb +7 -0
- data/app/controllers/spree/admin/payment_methods_controller.rb +23 -12
- data/app/controllers/spree/admin/post_categories_controller.rb +3 -0
- data/app/controllers/spree/admin/posts_controller.rb +11 -0
- data/app/controllers/spree/admin/products_controller.rb +11 -8
- data/app/controllers/spree/admin/promotion_actions_controller.rb +10 -2
- data/app/controllers/spree/admin/promotion_rules_controller.rb +10 -2
- data/app/controllers/spree/admin/promotions_controller.rb +6 -0
- data/app/controllers/spree/admin/properties_controller.rb +15 -0
- data/app/controllers/spree/admin/refund_reasons_controller.rb +7 -0
- data/app/controllers/spree/admin/refunds_controller.rb +4 -0
- data/app/controllers/spree/admin/reimbursement_types_controller.rb +7 -0
- data/app/controllers/spree/admin/reimbursements_controller.rb +4 -0
- data/app/controllers/spree/admin/reports_controller.rb +12 -2
- data/app/controllers/spree/admin/resource_controller.rb +1 -1
- data/app/controllers/spree/admin/return_authorization_reasons_controller.rb +7 -0
- data/app/controllers/spree/admin/return_authorizations_controller.rb +4 -0
- data/app/controllers/spree/admin/return_items_controller.rb +6 -0
- data/app/controllers/spree/admin/role_users_controller.rb +36 -0
- data/app/controllers/spree/admin/roles_controller.rb +8 -0
- data/app/controllers/spree/admin/shipments_controller.rb +2 -2
- data/app/controllers/spree/admin/shipping_categories_controller.rb +7 -0
- data/app/controllers/spree/admin/shipping_methods_controller.rb +6 -0
- data/app/controllers/spree/admin/stock_items_controller.rb +13 -0
- data/app/controllers/spree/admin/stock_locations_controller.rb +7 -0
- data/app/controllers/spree/admin/stock_transfers_controller.rb +14 -2
- data/app/controllers/spree/admin/store_credit_categories_controller.rb +5 -0
- data/app/controllers/spree/admin/store_credits_controller.rb +4 -0
- data/app/controllers/spree/admin/storefront_controller.rb +3 -0
- data/app/controllers/spree/admin/stores_controller.rb +17 -2
- data/app/controllers/spree/admin/tax_categories_controller.rb +7 -0
- data/app/controllers/spree/admin/tax_rates_controller.rb +6 -0
- data/app/controllers/spree/admin/taxonomies_controller.rb +15 -0
- data/app/controllers/spree/admin/taxons_controller.rb +24 -1
- data/app/controllers/spree/admin/themes_controller.rb +7 -0
- data/app/controllers/spree/admin/translations_controller.rb +9 -1
- data/app/controllers/spree/admin/user_passwords_controller.rb +22 -0
- data/app/controllers/spree/admin/user_sessions_controller.rb +23 -0
- data/app/controllers/spree/admin/users_controller.rb +11 -2
- data/app/controllers/spree/admin/variants_controller.rb +13 -0
- data/app/controllers/spree/admin/webhooks_subscribers_controller.rb +3 -0
- data/app/controllers/spree/admin/zones_controller.rb +5 -0
- data/app/helpers/spree/admin/base_helper.rb +32 -31
- data/app/helpers/spree/admin/bulk_operations_helper.rb +8 -2
- data/app/helpers/spree/admin/modal_helper.rb +1 -1
- data/app/helpers/spree/admin/navigation_helper.rb +11 -5
- data/app/helpers/spree/admin/orders_helper.rb +1 -3
- data/app/helpers/spree/admin/posts_helper.rb +1 -1
- data/app/helpers/spree/admin/session_assets_helper.rb +1 -1
- data/app/helpers/spree/admin/stores_helper.rb +1 -18
- data/app/helpers/spree/admin/tags_helper.rb +2 -2
- data/app/javascript/spree/admin/application.js +2 -0
- data/app/javascript/spree/admin/helpers/bootstrap.js +3 -3
- data/app/views/active_storage/_upload_form.html.erb +1 -1
- data/app/views/layouts/spree/minimal.html.erb +22 -0
- data/app/views/spree/admin/admin_users/_admin_user.html.erb +19 -0
- data/app/views/spree/admin/admin_users/_audit_log.html.erb +5 -0
- data/app/views/spree/admin/admin_users/_form.html.erb +12 -0
- data/app/views/spree/admin/admin_users/edit.html.erb +35 -0
- data/app/views/spree/admin/admin_users/index.html.erb +18 -0
- data/app/views/spree/admin/admin_users/new.html.erb +21 -0
- data/app/views/spree/admin/admin_users/show.html.erb +113 -0
- data/app/views/spree/admin/coupon_codes/index.html.erb +6 -6
- data/app/views/spree/admin/custom_domains/_custom_domains.html.erb +1 -1
- data/app/views/spree/admin/customer_returns/index.html.erb +1 -1
- data/app/views/spree/admin/dashboard/_store_preview.html.erb +1 -1
- data/app/views/spree/admin/dashboard/_top_products.html.erb +4 -2
- data/app/views/spree/admin/digital_assets/_table.html.erb +1 -1
- data/app/views/spree/admin/digital_assets/index.html.erb +0 -1
- data/app/views/spree/admin/exports/index.html.erb +1 -1
- data/app/views/spree/admin/integrations/_integration.html.erb +36 -0
- data/app/views/spree/admin/integrations/edit.html.erb +11 -0
- data/app/views/spree/admin/integrations/index.html.erb +23 -0
- data/app/views/spree/admin/integrations/new.html.erb +14 -0
- data/app/views/spree/admin/invitations/_invitation.html.erb +52 -0
- data/app/views/spree/admin/invitations/create.turbo_stream.erb +4 -0
- data/app/views/spree/admin/invitations/index.html.erb +21 -0
- data/app/views/spree/admin/invitations/new.html.erb +32 -0
- data/app/views/spree/admin/invitations/show.html.erb +9 -0
- data/app/views/spree/admin/line_items/new.html.erb +2 -2
- data/app/views/spree/admin/oauth_applications/index.html.erb +1 -1
- data/app/views/spree/admin/option_types/edit.html.erb +1 -1
- data/app/views/spree/admin/option_types/index.html.erb +1 -1
- data/app/views/spree/admin/orders/_customer.html.erb +1 -2
- data/app/views/spree/admin/orders/_filters.html.erb +17 -21
- data/app/views/spree/admin/orders/_list.html.erb +1 -1
- data/app/views/spree/admin/orders/_refunds.html.erb +1 -1
- data/app/views/spree/admin/orders/_shipment.html.erb +1 -1
- data/app/views/spree/admin/orders/_table_filter_dropdown.html.erb +2 -2
- data/app/views/spree/admin/orders/customer_returns/_customer_return.html.erb +1 -1
- data/app/views/spree/admin/orders/customer_returns/_return_item_decision.html.erb +1 -1
- data/app/views/spree/admin/orders/return_authorizations/_form.html.erb +1 -1
- data/app/views/spree/admin/orders/return_authorizations/show.html.erb +2 -2
- data/app/views/spree/admin/page_blocks/_form_tab_buttons.html.erb +5 -7
- data/app/views/spree/admin/page_blocks/edit.html.erb +3 -5
- data/app/views/spree/admin/page_builder/_add_block.html.erb +1 -1
- data/app/views/spree/admin/page_builder/_header.html.erb +35 -28
- data/app/views/spree/admin/page_builder/_pages_dropdown.html.erb +15 -21
- data/app/views/spree/admin/page_builder/_sidebar.html.erb +1 -1
- data/app/views/spree/admin/page_builder/_sidebar_block.html.erb +1 -1
- data/app/views/spree/admin/page_links/_list.html.erb +2 -2
- data/app/views/spree/admin/page_links/edit.html.erb +2 -4
- data/app/views/spree/admin/page_sections/_form_tab_buttons.html.erb +6 -10
- data/app/views/spree/admin/page_sections/new.html.erb +1 -1
- data/app/views/spree/admin/pages/edit.html.erb +2 -2
- data/app/views/spree/admin/payment_methods/index.html.erb +16 -15
- data/app/views/spree/admin/payments/_payment.html.erb +1 -1
- data/app/views/spree/admin/post_categories/index.html.erb +1 -1
- data/app/views/spree/admin/posts/index.html.erb +1 -1
- data/app/views/spree/admin/products/_bulk_operations.html.erb +1 -1
- data/app/views/spree/admin/products/_filters.html.erb +2 -5
- data/app/views/spree/admin/products/_list.html.erb +1 -1
- data/app/views/spree/admin/products/_table_filter_dropdown.html.erb +2 -2
- data/app/views/spree/admin/products/form/_categorization.html.erb +34 -30
- data/app/views/spree/admin/promotion_actions/_promotion_action.html.erb +1 -1
- data/app/views/spree/admin/promotion_rules/_promotion_rule.html.erb +1 -1
- data/app/views/spree/admin/promotions/_filters.html.erb +2 -6
- data/app/views/spree/admin/promotions/_header.html.erb +1 -3
- data/app/views/spree/admin/promotions/_sidebar.html.erb +18 -0
- data/app/views/spree/admin/promotions/_table_filter_dropdown.html.erb +2 -2
- data/app/views/spree/admin/promotions/index.html.erb +1 -1
- data/app/views/spree/admin/properties/edit.html.erb +1 -1
- data/app/views/spree/admin/properties/index.html.erb +1 -1
- data/app/views/spree/admin/refund_reasons/index.html.erb +1 -1
- data/app/views/spree/admin/reimbursement_types/index.html.erb +1 -1
- data/app/views/spree/admin/reimbursements/edit.html.erb +2 -2
- data/app/views/spree/admin/reimbursements/show.html.erb +1 -1
- data/app/views/spree/admin/reports/_report.html.erb +1 -1
- data/app/views/spree/admin/return_authorization_reasons/index.html.erb +1 -1
- data/app/views/spree/admin/return_authorizations/_filters.html.erb +2 -2
- data/app/views/spree/admin/return_authorizations/_list.html.erb +1 -1
- data/app/views/spree/admin/roles/edit.html.erb +6 -4
- data/app/views/spree/admin/roles/index.html.erb +11 -7
- data/app/views/spree/admin/shared/_alerts.html.erb +1 -1
- data/app/views/spree/admin/shared/_breadcrumbs.html.erb +13 -0
- data/app/views/spree/admin/shared/_calendar_range_picker.html.erb +1 -1
- data/app/views/spree/admin/shared/_content_header.html.erb +3 -3
- data/app/views/spree/admin/shared/_filters_button.html.erb +1 -1
- data/app/views/spree/admin/shared/_filters_search_bar.html.erb +1 -1
- data/app/views/spree/admin/shared/_head.html.erb +4 -0
- data/app/views/spree/admin/shared/_header.html.erb +26 -17
- data/app/views/spree/admin/shared/_index_table_options.html.erb +1 -1
- data/app/views/spree/admin/shared/_multi_product_picker.html.erb +1 -1
- data/app/views/spree/admin/shared/_new_item_dropdown.html.erb +32 -0
- data/app/views/spree/admin/shared/_no_resource_found.html.erb +6 -3
- data/app/views/spree/admin/shared/_offcanvas_nav.html.erb +1 -14
- data/app/views/spree/admin/shared/_refunds.html.erb +1 -1
- data/app/views/spree/admin/shared/_sidebar.html.erb +0 -8
- data/app/views/spree/admin/shared/_team_nav.html.erb +13 -0
- data/app/views/spree/admin/shared/_user_dropdown.html.erb +25 -20
- data/app/views/spree/admin/shared/devise/_links.html.erb +18 -0
- data/app/views/spree/admin/shared/sidebar/_enterprise_edition_notice.html.erb +7 -5
- data/app/views/spree/admin/shared/sidebar/_integrations_nav.html.erb +5 -7
- data/app/views/spree/admin/shared/sidebar/_orders_nav.html.erb +2 -2
- data/app/views/spree/admin/shared/sidebar/_products_nav.html.erb +2 -2
- data/app/views/spree/admin/shared/sidebar/_promotions_nav.html.erb +17 -0
- data/app/views/spree/admin/shared/sidebar/_returns_nav.html.erb +1 -1
- data/app/views/spree/admin/shared/sidebar/_store_dropdown.html.erb +33 -75
- data/app/views/spree/admin/shared/sidebar/_store_nav.html.erb +14 -34
- data/app/views/spree/admin/shared/sidebar/_storefront_nav.html.erb +4 -2
- data/app/views/spree/admin/shared/sidebar/_vendors_nav.html.erb +9 -7
- data/app/views/spree/admin/shared/sortable_tree/_taxonomy.html.erb +1 -1
- data/app/views/spree/admin/shipping_categories/index.html.erb +1 -1
- data/app/views/spree/admin/shipping_methods/_form.html.erb +7 -134
- data/app/views/spree/admin/shipping_methods/form/_display.html.erb +25 -0
- data/app/views/spree/admin/shipping_methods/form/_estimated_transit_business_days.html.erb +23 -0
- data/app/views/spree/admin/shipping_methods/form/_shipping_categories.html.erb +21 -0
- data/app/views/spree/admin/shipping_methods/form/_tax_category.html.erb +16 -0
- data/app/views/spree/admin/shipping_methods/form/_tracking_url.html.erb +18 -0
- data/app/views/spree/admin/shipping_methods/form/_zones.html.erb +26 -0
- data/app/views/spree/admin/shipping_methods/index.html.erb +1 -1
- data/app/views/spree/admin/stock_items/index.html.erb +1 -1
- data/app/views/spree/admin/stock_locations/_stock_location.html.erb +5 -3
- data/app/views/spree/admin/stock_locations/index.html.erb +4 -2
- data/app/views/spree/admin/stock_transfers/index.html.erb +1 -1
- data/app/views/spree/admin/store_credit_categories/index.html.erb +1 -1
- data/app/views/spree/admin/store_credits/_list.html.erb +1 -1
- data/app/views/spree/admin/stores/edit_emails.html.erb +1 -1
- data/app/views/spree/admin/stores/form/_emails.html.erb +1 -1
- data/app/views/spree/admin/tax_categories/index.html.erb +1 -1
- data/app/views/spree/admin/tax_rates/index.html.erb +1 -1
- data/app/views/spree/admin/taxonomies/index.html.erb +1 -1
- data/app/views/spree/admin/themes/_theme.html.erb +6 -4
- data/app/views/spree/admin/themes/_theme_preview_image.html.erb +6 -4
- data/app/views/spree/admin/themes/index.html.erb +1 -1
- data/app/views/spree/admin/translations/edit.html.erb +1 -1
- data/app/views/spree/admin/user_passwords/edit.html.erb +21 -0
- data/app/views/spree/admin/user_passwords/new.html.erb +12 -0
- data/app/views/spree/admin/user_sessions/new.html.erb +16 -0
- data/app/views/spree/admin/users/_form.html.erb +9 -7
- data/app/views/spree/admin/users/_user.html.erb +4 -4
- data/app/views/spree/admin/users/index.html.erb +1 -1
- data/app/views/spree/admin/users/new.html.erb +1 -1
- data/app/views/spree/admin/variants/_search_result.html.erb +1 -1
- data/app/views/spree/admin/variants/form/_media_asset.html.erb +1 -1
- data/app/views/spree/admin/webhooks_subscribers/index.html.erb +1 -1
- data/app/views/spree/admin/zones/_form.html.erb +11 -15
- data/app/views/spree/admin/zones/index.html.erb +1 -1
- data/config/locales/en.yml +3 -0
- data/config/routes.rb +13 -1
- data/lib/spree/admin/engine.rb +2 -0
- data/lib/spree/admin.rb +1 -0
- metadata +65 -8
@@ -3,6 +3,9 @@ module Spree
|
|
3
3
|
class ThemesController < ResourceController
|
4
4
|
layout :choose_layout
|
5
5
|
|
6
|
+
include StorefrontBreadcrumbConcern
|
7
|
+
add_breadcrumb Spree.t(:themes), :admin_themes_path
|
8
|
+
|
6
9
|
def edit
|
7
10
|
@theme_preview = params[:theme_preview_id].present? ? @theme.previews.find(params[:theme_preview_id]) : @theme.create_preview
|
8
11
|
@page = if params[:page_id].present?
|
@@ -70,6 +73,10 @@ module Spree
|
|
70
73
|
def collection
|
71
74
|
super.without_previews.order(default: :desc).includes(screenshot_attachment: :blob)
|
72
75
|
end
|
76
|
+
|
77
|
+
def permitted_resource_params
|
78
|
+
params.require(:theme).permit(permitted_theme_attributes + @object.preferences.keys.map { |key| "preferred_#{key}" })
|
79
|
+
end
|
73
80
|
end
|
74
81
|
end
|
75
82
|
end
|
@@ -36,7 +36,15 @@ module Spree
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def resource_class
|
39
|
-
@resource_class ||=
|
39
|
+
@resource_class ||= begin
|
40
|
+
klass = params[:resource_type]
|
41
|
+
allowed_resource_class.find { |allowed_class| allowed_class.to_s == klass } ||
|
42
|
+
raise(ActiveRecord::RecordNotFound, "Resource type not found")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def allowed_resource_class
|
47
|
+
Rails.application.config.spree.translatable_resources
|
40
48
|
end
|
41
49
|
|
42
50
|
def set_resource
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Spree
|
2
|
+
module Admin
|
3
|
+
class UserPasswordsController < defined?(Devise::PasswordsController) ? Devise::PasswordsController : Spree::Admin::BaseController
|
4
|
+
layout 'spree/minimal'
|
5
|
+
|
6
|
+
def create
|
7
|
+
self.resource = resource_class.send_reset_password_instructions(resource_params)
|
8
|
+
yield resource if block_given?
|
9
|
+
|
10
|
+
set_flash_message(:notice, :send_instructions) if is_navigational_format?
|
11
|
+
# Don't not show error message that the email was not found
|
12
|
+
respond_with({}, location: after_sending_reset_password_instructions_path_for(resource_name))
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def translation_scope
|
18
|
+
'devise.user_passwords'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Spree
|
2
|
+
module Admin
|
3
|
+
class UserSessionsController < defined?(Devise::SessionsController) ? Devise::SessionsController : Spree::Admin::BaseController
|
4
|
+
layout 'spree/minimal'
|
5
|
+
|
6
|
+
# We need to overwrite this action because `return_to` url may be in a different domain
|
7
|
+
# So we need to pass `allow_other_host` option to `redirect_to` method
|
8
|
+
def create
|
9
|
+
self.resource = warden.authenticate!(auth_options)
|
10
|
+
set_flash_message!(:notice, :signed_in)
|
11
|
+
sign_in(resource_name, resource)
|
12
|
+
yield resource if block_given?
|
13
|
+
redirect_to after_sign_in_path_for(resource), allow_other_host: true
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
|
18
|
+
def translation_scope
|
19
|
+
'devise.user_sessions'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -10,7 +10,12 @@ module Spree
|
|
10
10
|
before_action :load_last_order_data, only: :show
|
11
11
|
before_action :remove_empty_params, only: :update
|
12
12
|
|
13
|
-
|
13
|
+
add_breadcrumb_icon 'users'
|
14
|
+
add_breadcrumb Spree.t(:customers), :admin_users_path
|
15
|
+
|
16
|
+
def show
|
17
|
+
add_breadcrumb @user.name, spree.admin_user_path(@user)
|
18
|
+
end
|
14
19
|
|
15
20
|
def create
|
16
21
|
@user = Spree.user_class.new(user_params)
|
@@ -52,7 +57,7 @@ module Spree
|
|
52
57
|
params[:q][:s] ||= 'created_at desc'
|
53
58
|
params[:q][:created_at_not_null] ||= 1
|
54
59
|
|
55
|
-
@collection =
|
60
|
+
@collection = model_class.accessible_by(current_ability, :index)
|
56
61
|
@search = @collection.ransack(params[:q])
|
57
62
|
@collection = @search.result(distinct: true).
|
58
63
|
includes(
|
@@ -64,6 +69,10 @@ module Spree
|
|
64
69
|
page(params[:page]).per(params[:per_page])
|
65
70
|
end
|
66
71
|
|
72
|
+
def find_resource
|
73
|
+
model_class.accessible_by(current_ability, :show).find(params[:id])
|
74
|
+
end
|
75
|
+
|
67
76
|
private
|
68
77
|
|
69
78
|
def user_params
|
@@ -3,9 +3,12 @@ module Spree
|
|
3
3
|
class VariantsController < ResourceController
|
4
4
|
include StockLocationsHelper
|
5
5
|
|
6
|
+
include ProductsBreadcrumbConcern
|
7
|
+
|
6
8
|
belongs_to 'spree/product', find_by: :slug
|
7
9
|
before_action :load_data, only: [:edit, :update]
|
8
10
|
before_action :strip_attributes, only: [:update]
|
11
|
+
before_action :add_breadcrumbs
|
9
12
|
|
10
13
|
edit_action.before :build_prices
|
11
14
|
edit_action.before :build_stock_items
|
@@ -85,6 +88,16 @@ module Spree
|
|
85
88
|
params[:variant].delete(:prices_attributes) unless can?(:manage, @variant.prices.first)
|
86
89
|
params[:variant].delete(:stock_items_attributes) unless can?(:manage, @variant.stock_items.first)
|
87
90
|
end
|
91
|
+
|
92
|
+
def add_breadcrumbs
|
93
|
+
if @variant.present? && @variant.persisted?
|
94
|
+
add_breadcrumb @variant.human_name, spree.edit_admin_product_variant_path(@product, @variant)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def permitted_resource_params
|
99
|
+
params.require(:variant).permit(permitted_variant_attributes)
|
100
|
+
end
|
88
101
|
end
|
89
102
|
end
|
90
103
|
end
|
@@ -6,6 +6,9 @@ module Spree
|
|
6
6
|
create.before :process_subscriptions
|
7
7
|
update.before :process_subscriptions
|
8
8
|
|
9
|
+
add_breadcrumb Spree.t(:developers), :admin_oauth_applications_path
|
10
|
+
add_breadcrumb Spree.t(:webhooks), :admin_webhooks_subscribers_path
|
11
|
+
|
9
12
|
def show
|
10
13
|
@webhooks_subscriber = Webhooks::Subscriber.find(params[:id])
|
11
14
|
@events = @webhooks_subscriber.events.order(created_at: :desc).page(params[:page]).per(params[:per_page])
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module Spree
|
2
2
|
module Admin
|
3
3
|
class ZonesController < ResourceController
|
4
|
+
add_breadcrumb Spree.t(:zones), :admin_zones_path
|
4
5
|
before_action :load_data, except: :index
|
5
6
|
|
6
7
|
def new
|
@@ -32,6 +33,10 @@ module Spree
|
|
32
33
|
@states = @selected_country&.states&.order(:name) || Spree::State.none
|
33
34
|
@zones = Zone.order(:name)
|
34
35
|
end
|
36
|
+
|
37
|
+
def permitted_resource_params
|
38
|
+
params.require(:zone).permit(permitted_zone_attributes)
|
39
|
+
end
|
35
40
|
end
|
36
41
|
end
|
37
42
|
end
|
@@ -25,12 +25,10 @@ module Spree
|
|
25
25
|
# this is used to display different sidebar navigation for settings pages
|
26
26
|
# @return [Boolean]
|
27
27
|
def settings_active?
|
28
|
-
@settings_active || %w[
|
29
|
-
payment_methods refund_reasons reimbursement_types
|
30
|
-
shipping_categories store_credit_categories
|
31
|
-
|
32
|
-
custom_domains audits exports imports return_authorization_reasons
|
33
|
-
documents stripe_tax_registrations members subscriptions stock_locations webhooks_subscribers].include?(controller_name)
|
28
|
+
@settings_active || %w[admin_users audits custom_domains exports imports invitations oauth_applications
|
29
|
+
payment_methods refund_reasons reimbursement_types return_authorization_reasons roles
|
30
|
+
shipping_categories shipping_methods stock_locations store_credit_categories
|
31
|
+
stores tax_categories tax_rates webhooks webhooks_subscribers zones].include?(controller_name)
|
34
32
|
end
|
35
33
|
|
36
34
|
# @return [Array<String>] the available countries for checkout
|
@@ -199,37 +197,40 @@ module Spree
|
|
199
197
|
# renders all the preference fields for an object
|
200
198
|
# @param object [Spree::TaxRate, Spree::Calculator, Spree::PaymentMethod, Spree::ShippingMethod, Spree::Store] the object to render the preference fields for
|
201
199
|
# @param form [ActionView::Helpers::FormBuilder] the form builder
|
200
|
+
# @param i18n_scope [String] the i18n scope for the preference fields
|
202
201
|
# @return [String] the preference fields
|
203
|
-
def preference_fields(object, form)
|
202
|
+
def preference_fields(object, form, i18n_scope: '')
|
204
203
|
return unless object.respond_to?(:preferences)
|
205
204
|
|
206
|
-
fields = object.preferences.keys.map
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
end
|
205
|
+
fields = object.preferences.keys.map { |key| preference_field(object, form, key, i18n_scope: i18n_scope) }
|
206
|
+
safe_join(fields)
|
207
|
+
end
|
208
|
+
|
209
|
+
def preference_field(object, form, key, i18n_scope: '')
|
210
|
+
return unless object.has_preference?(key)
|
211
|
+
|
212
|
+
case key
|
213
|
+
when :currency
|
214
|
+
content_tag(:div, form.label("preferred_#{key}", Spree.t(key, scope: i18n_scope)) +
|
215
|
+
form.currency_select("preferred_#{key}", current_store.supported_currencies.split(','), {}, { class: 'custom-select', disabled: current_store.supported_currencies.split(',').count == 1 }),
|
216
|
+
class: 'form-group', id: [object.class.to_s.parameterize, 'preference', key].join('-'))
|
217
|
+
else
|
218
|
+
if object.preference_type(key).to_sym == :boolean
|
219
|
+
content_tag(:div, class: 'form-group custom-control custom-checkbox') do
|
220
|
+
preference_field_for(form, "preferred_#{key}", type: object.preference_type(key)) +
|
221
|
+
form.label(
|
222
|
+
"preferred_#{key}",
|
223
|
+
Spree.t(key, scope: i18n_scope),
|
224
|
+
class: 'custom-control-label',
|
225
|
+
id: [object.class.to_s.parameterize, 'preference', key].join('-')
|
226
|
+
)
|
229
227
|
end
|
228
|
+
else
|
229
|
+
content_tag(:div, form.label("preferred_#{key}", Spree.t(key, scope: i18n_scope)) +
|
230
|
+
preference_field_for(form, "preferred_#{key}", type: object.preference_type(key)),
|
231
|
+
class: 'form-group', id: [object.class.to_s.parameterize, 'preference', key].join('-'))
|
230
232
|
end
|
231
233
|
end
|
232
|
-
safe_join(fields)
|
233
234
|
end
|
234
235
|
|
235
236
|
def spree_dom_id(record)
|
@@ -51,7 +51,13 @@ module Spree
|
|
51
51
|
options[:class] ||= 'btn btn-light'
|
52
52
|
|
53
53
|
if options[:icon]
|
54
|
-
|
54
|
+
if options[:only_icon]
|
55
|
+
options[:title] = text
|
56
|
+
text = icon(options[:icon], class: 'mr-0')
|
57
|
+
options[:class] += ' with-tip'
|
58
|
+
else
|
59
|
+
text = icon(options[:icon]) + ' ' + text
|
60
|
+
end
|
55
61
|
end
|
56
62
|
|
57
63
|
content_tag :span, data: { toggle: 'modal', target: '#bulk-modal' } do
|
@@ -76,7 +82,7 @@ module Spree
|
|
76
82
|
# render a counter for the bulk operations
|
77
83
|
# @return [String]
|
78
84
|
def bulk_operations_counter
|
79
|
-
content_tag(:span, class: 'bulk-operations-counter
|
85
|
+
content_tag(:span, class: 'bulk-operations-counter') do
|
80
86
|
content_tag(:strong, '', data: { bulk_operation_target: 'counter' }) +
|
81
87
|
Spree.t("admin.selected")
|
82
88
|
end
|
@@ -20,7 +20,7 @@ module Spree
|
|
20
20
|
# render a discard button for the modal
|
21
21
|
# @return [String]
|
22
22
|
def modal_discard_button
|
23
|
-
button_tag(type: 'button', class: 'btn btn-light', data: { dismiss: 'modal' }) do
|
23
|
+
button_tag(type: 'button', class: 'btn btn-light mr-auto', data: { dismiss: 'modal' }) do
|
24
24
|
Spree.t('actions.discard')
|
25
25
|
end.html_safe
|
26
26
|
end
|
@@ -52,11 +52,9 @@ module Spree
|
|
52
52
|
# @param per_page [Integer] the number of items per page
|
53
53
|
# @return [Hash] the params to apply per page
|
54
54
|
def per_page_dropdown_params(per_page)
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
args.merge!(per_page: per_page)
|
59
|
-
args
|
55
|
+
# Keep only safe query params that should survive pagination changes
|
56
|
+
safe_params = request.query_parameters.slice(:q)
|
57
|
+
safe_params.merge(per_page: per_page, page: nil)
|
60
58
|
end
|
61
59
|
|
62
60
|
# render a button link to edit a resource
|
@@ -268,6 +266,14 @@ module Spree
|
|
268
266
|
css ||= 'text-muted'
|
269
267
|
content_tag :small, icon('info-square-rounded', class: css), data: { placement: placement }, class: "with-tip #{css}", title: text
|
270
268
|
end
|
269
|
+
|
270
|
+
def render_breadcrumb_icon
|
271
|
+
if settings_active?
|
272
|
+
icon('settings')
|
273
|
+
elsif @breadcrumb_icon
|
274
|
+
icon(@breadcrumb_icon)
|
275
|
+
end
|
276
|
+
end
|
271
277
|
end
|
272
278
|
end
|
273
279
|
end
|
@@ -25,10 +25,8 @@ module Spree
|
|
25
25
|
icon('credit-card-refund') + Spree.t('payment_states.refunded')
|
26
26
|
elsif order.partially_refunded?
|
27
27
|
icon('credit-card-refund') + Spree.t('payment_states.partially_refunded')
|
28
|
-
elsif order.payment_state == 'failed'
|
28
|
+
elsif order.payment_state == 'failed' || order.payment_state == 'void'
|
29
29
|
icon('cancel') + Spree.t('payment_states.failed')
|
30
|
-
elsif order.payment_state == 'void'
|
31
|
-
icon('cancel') + Spree.t('payment_states.void')
|
32
30
|
elsif order.payment_state == 'paid'
|
33
31
|
icon('check') + Spree.t('payment_states.paid')
|
34
32
|
else
|
@@ -7,7 +7,7 @@ module Spree
|
|
7
7
|
|
8
8
|
def store_uploaded_asset_in_session(asset)
|
9
9
|
ensure_session_uploaded_assets_uuid
|
10
|
-
asset.update(
|
10
|
+
asset.update(session_id: session['spree.admin.uploaded_assets.uuid'])
|
11
11
|
end
|
12
12
|
|
13
13
|
def session_uploaded_assets
|
@@ -4,7 +4,7 @@ module Spree
|
|
4
4
|
include Spree::ImagesHelper
|
5
5
|
|
6
6
|
def available_stores
|
7
|
-
@available_stores ||= Spree::Store.accessible_by(current_ability)
|
7
|
+
@available_stores ||= Spree::Store.accessible_by(current_ability).includes(:logo_attachment, :favicon_image_attachment, :default_custom_domain)
|
8
8
|
end
|
9
9
|
|
10
10
|
DEFAULT_ICON_SIZE = 40
|
@@ -36,23 +36,6 @@ module Spree
|
|
36
36
|
opts[:class] += ' rounded text-dark d-flex align-items-center justify-content-center bg-gray-200'
|
37
37
|
content_tag(:span, name[0].upcase, class: opts[:class], style: "height: #{opts[:height]}px; width: #{opts[:width]}px;")
|
38
38
|
end
|
39
|
-
|
40
|
-
def store_logo(store = nil, options = {})
|
41
|
-
store ||= current_store
|
42
|
-
return unless store
|
43
|
-
|
44
|
-
opts = { width: 30, height: 30, crop: :fit, quality: :auto, fetch_format: :auto, alt: store.name, title: store.name, class: 'with-tip' }
|
45
|
-
opts.merge!(options)
|
46
|
-
|
47
|
-
if store.is_a?(Spree::Store) && store.logo&.attached? && store.logo&.variable?
|
48
|
-
spree_image_tag(store.logo, class: opts[:class], width: opts[:width], height: opts[:height])
|
49
|
-
else
|
50
|
-
initials = store.name.split.map(&:first).join.upcase
|
51
|
-
content_tag(:div, initials, class: "avatar rounded with-tip bg-light",
|
52
|
-
style: "width: #{opts[:height]}px; height: #{opts[:height]}px;",
|
53
|
-
title: store.name)
|
54
|
-
end
|
55
|
-
end
|
56
39
|
end
|
57
40
|
end
|
58
41
|
end
|
@@ -12,7 +12,7 @@ module Spree
|
|
12
12
|
def post_tags_scope
|
13
13
|
@post_tags_scope ||= ActsAsTaggableOn::Tag.
|
14
14
|
joins(:taggings).
|
15
|
-
where(
|
15
|
+
where(ActsAsTaggableOn.taggings_table => { taggable_type: 'Spree::Post' }).
|
16
16
|
for_context(:tags).for_tenant(current_store.id)
|
17
17
|
end
|
18
18
|
|
@@ -23,7 +23,7 @@ module Spree
|
|
23
23
|
def user_tags_scope
|
24
24
|
@user_tags_scope ||= ActsAsTaggableOn::Tag.
|
25
25
|
joins(:taggings).
|
26
|
-
where(
|
26
|
+
where(ActsAsTaggableOn.taggings_table => { taggable_type: Spree.user_class.to_s }).
|
27
27
|
for_context(:tags)
|
28
28
|
end
|
29
29
|
|
@@ -80,6 +80,7 @@ import UnitSystemController from 'spree/admin/controllers/unit_system_controller
|
|
80
80
|
import VariantsFormController from 'spree/admin/controllers/variants_form_controller'
|
81
81
|
import AddressAutocompleteController from 'spree/core/controllers/address_autocomplete_controller'
|
82
82
|
import AddressFormController from 'spree/core/controllers/address_form_controller'
|
83
|
+
import DisableSubmitButtonController from 'spree/core/controllers/disable_submit_button_controller'
|
83
84
|
import EnableButtonController from 'spree/core/controllers/enable_button_controller'
|
84
85
|
|
85
86
|
application.register('active-storage-upload', ActiveStorageUpload)
|
@@ -98,6 +99,7 @@ application.register('checkbox-select-all', CheckboxSelectAll)
|
|
98
99
|
application.register('clipboard', Clipboard)
|
99
100
|
application.register('color-palette', ColorPaletteController)
|
100
101
|
application.register('color-picker', ColorPickerController)
|
102
|
+
application.register('disable-submit-button', DisableSubmitButtonController)
|
101
103
|
application.register('enable-button', EnableButtonController)
|
102
104
|
application.register('filters', FiltersController)
|
103
105
|
application.register('font-picker', FontPickerController)
|
@@ -4,11 +4,11 @@ import { lockScroll, unlockScroll } from 'spree/core/helpers/scroll_lock'
|
|
4
4
|
|
5
5
|
|
6
6
|
const initTooltips = () => {
|
7
|
-
$('.with-tip, .trix-button').each(function() {
|
7
|
+
$('.with-tip, .trix-button, .uppy-Dashboard-close, time').each(function() {
|
8
8
|
$(this).tooltip()
|
9
9
|
})
|
10
10
|
|
11
|
-
$('.with-tip, .trix-button').on('show.bs.tooltip', function(event) {
|
11
|
+
$('.with-tip, .trix-button, .uppy-Dashboard-close, time').on('show.bs.tooltip', function(event) {
|
12
12
|
if (('ontouchstart' in window)) {
|
13
13
|
event.preventDefault()
|
14
14
|
}
|
@@ -16,7 +16,7 @@ const initTooltips = () => {
|
|
16
16
|
}
|
17
17
|
|
18
18
|
const removeTooltips = () => {
|
19
|
-
$('.with-tip, .trix-button').each(function() {
|
19
|
+
$('.with-tip, .trix-button, .uppy-Dashboard-close, time').each(function() {
|
20
20
|
$(this).tooltip('dispose')
|
21
21
|
})
|
22
22
|
}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="<%= I18n.locale %>">
|
3
|
+
<head>
|
4
|
+
<%= render "spree/admin/shared/head" %>
|
5
|
+
</head>
|
6
|
+
<body class="admin min-vh-100 <%= controller_name %> <%= action_name %>">
|
7
|
+
<div class="container-fluid">
|
8
|
+
<div class="row bg-white">
|
9
|
+
<div
|
10
|
+
class="col-lg-5 d-none d-lg-flex bg-light min-vh-100"
|
11
|
+
style="background-image: url('<%= asset_path('login_sidebar_background.png') %>');background-repeat: no-repeat;background-size: cover;background-position: center')"
|
12
|
+
>
|
13
|
+
</div>
|
14
|
+
<div class="col-lg-6 col-xl-4 offset-xl-1 py-3 d-flex flex-column justify-content-center vh-100">
|
15
|
+
<%= yield %>
|
16
|
+
</div>
|
17
|
+
</div>
|
18
|
+
</div>
|
19
|
+
<%= render "spree/admin/shared/modal" %>
|
20
|
+
<%= render "spree/admin/shared/alerts" %>
|
21
|
+
</body>
|
22
|
+
</html>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<tr id="<%= spree_dom_id admin_user %>" class="cursor-pointer" data-controller="row-link">
|
2
|
+
<td class="w-50" data-action="click->row-link#openLink">
|
3
|
+
<%= link_to spree.admin_admin_user_path(admin_user), data: { row_link_target: :link }, class: 'd-flex align-items-center' do %>
|
4
|
+
<%= render_avatar(admin_user, width: 48, height: 48, class: 'mr-3 avatar') %>
|
5
|
+
<div class="d-flex flex-column">
|
6
|
+
<%= admin_user.name %>
|
7
|
+
<span class="text-muted"><%= admin_user.email %></span>
|
8
|
+
</div>
|
9
|
+
<% end %>
|
10
|
+
</td>
|
11
|
+
<td class="w-30" data-action="click->row-link#openLink">
|
12
|
+
<% admin_user.role_users.each do |role_user| %>
|
13
|
+
<span class="badge badge-light"><%= role_user.role.name %></span>
|
14
|
+
<% end %>
|
15
|
+
</td>
|
16
|
+
<td class="w-20">
|
17
|
+
<%= local_time(admin_user.created_at) %>
|
18
|
+
</td>
|
19
|
+
</tr>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<div class="form-group">
|
2
|
+
<%= f.label :email %>
|
3
|
+
<%= f.email_field :email, class: 'form-control', required: true, autofocus: true %>
|
4
|
+
</div>
|
5
|
+
<div class="form-group">
|
6
|
+
<%= f.label :first_name %>
|
7
|
+
<%= f.text_field :first_name, class: 'form-control', required: true %>
|
8
|
+
</div>
|
9
|
+
<div class="form-group">
|
10
|
+
<%= f.label :last_name %>
|
11
|
+
<%= f.text_field :last_name, class: 'form-control', required: true %>
|
12
|
+
</div>
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<% content_for :page_title do %>
|
2
|
+
<%= page_header_back_button spree.admin_admin_users_path %>
|
3
|
+
<%= @admin_user.name %>
|
4
|
+
<% end %>
|
5
|
+
|
6
|
+
<%= content_for :title do %>
|
7
|
+
<%= @admin_user.name %>
|
8
|
+
<% end %>
|
9
|
+
|
10
|
+
<%= turbo_frame_tag :edit_user do %>
|
11
|
+
<div class="card-header d-flex align-items-center justify-content-between">
|
12
|
+
<h5 class="card-title">
|
13
|
+
<%= Spree.t(:details) %>
|
14
|
+
</h5>
|
15
|
+
<%= link_to Spree.t('actions.discard'), spree.admin_admin_user_path(@admin_user), class: 'btn btn-light btn-sm' %>
|
16
|
+
</div>
|
17
|
+
<%= form_for [:admin, @admin_user], as: :admin_user, url: spree.admin_admin_user_path(@admin_user), method: :put do |f| %>
|
18
|
+
<div class="card-body">
|
19
|
+
<%= render'spree/admin/shared/error_messages', target: @admin_user %>
|
20
|
+
<%= render 'form', f: f %>
|
21
|
+
<% if can?(:manage, Spree::Role) && @roles.any? %>
|
22
|
+
<div class="form-group">
|
23
|
+
<%= f.label :spree_role_ids, Spree.t(:roles) %>
|
24
|
+
<%= f.select :spree_role_ids,
|
25
|
+
options_from_collection_for_select(@roles, 'id', 'name', @admin_user.spree_roles.pluck(:id)),
|
26
|
+
{ prompt: false },
|
27
|
+
{ multiple: true, data: { controller: 'autocomplete-select' } } %>
|
28
|
+
</div>
|
29
|
+
<% end %>
|
30
|
+
</div>
|
31
|
+
<div class="card-footer">
|
32
|
+
<%= turbo_save_button_tag Spree.t('actions.update') %>
|
33
|
+
</div>
|
34
|
+
<% end %>
|
35
|
+
<% end%>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<%= render 'spree/admin/shared/team_nav' %>
|
2
|
+
|
3
|
+
<div class="card-lg">
|
4
|
+
<div class="table-responsive">
|
5
|
+
<table class="table">
|
6
|
+
<thead>
|
7
|
+
<tr>
|
8
|
+
<th class="rounded-lg-top-left"><%= Spree.t(:user) %></th>
|
9
|
+
<th><%= Spree.t(:roles) %></th>
|
10
|
+
<th class="rounded-lg-top-right"><%= sort_link @search, :created_at, Spree.t(:created_at) %></th>
|
11
|
+
</tr>
|
12
|
+
</thead>
|
13
|
+
<tbody>
|
14
|
+
<%= render partial: 'spree/admin/admin_users/admin_user', collection: @collection %>
|
15
|
+
</tbody>
|
16
|
+
</table>
|
17
|
+
</div>
|
18
|
+
</div>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<%= form_with model: @admin_user, url: spree.admin_admin_users_path(token: @invitation.token), method: :post, scope: :admin_user do |f| %>
|
2
|
+
<%= render partial: 'spree/admin/shared/error_messages', locals: { target: @admin_user } %>
|
3
|
+
|
4
|
+
<div class="rounded border p-3 mb-3 d-flex align-items-center gap-2">
|
5
|
+
<%= render_avatar(@invitation.inviter, height: 32, width: 32) %>
|
6
|
+
<%= @invitation.inviter.name %> has invited you to join <strong><%= @invitation.resource.name %></strong>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<%= render 'form', f: f %>
|
10
|
+
<div class="form-group">
|
11
|
+
<%= f.label :password %>
|
12
|
+
<%= f.password_field :password, class: 'form-control', required: true %>
|
13
|
+
</div>
|
14
|
+
<div class="form-group">
|
15
|
+
<%= f.label :password_confirmation %>
|
16
|
+
<%= f.password_field :password_confirmation, class: 'form-control', required: true %>
|
17
|
+
</div>
|
18
|
+
|
19
|
+
<%= turbo_save_button_tag(Spree.t('create_a_new_account')) %>
|
20
|
+
<% end %>
|
21
|
+
|