diff --git a/app/controllers/spree/admin/products_controller.rb b/app/controllers/spree/admin/products_controller.rb index 406c997fdb..81a561f94d 100644 --- a/app/controllers/spree/admin/products_controller.rb +++ b/app/controllers/spree/admin/products_controller.rb @@ -9,16 +9,13 @@ module Spree include OpenFoodNetwork::SpreeApiKeyLoader include OrderCyclesHelper include EnterprisesHelper + include ProductFilterHelper before_action :load_data before_action :load_form_data, only: [:index, :new, :create, :edit, :update] before_action :load_spree_api_key, only: [:index, :variant_overrides] before_action :strip_new_properties, only: [:create, :update] - PRODUCT_FILTER = [ - 'query', 'producerFilter', 'categoryFilter', 'sorting', 'importDateFilter' - ].freeze - def new @object.shipping_category = DefaultShippingCategory.find_or_create super @@ -58,9 +55,7 @@ module Spree end def edit - filters = product_filters(params) - @url_filters = filters.empty? ? "" : "?#{filters.to_query}" - + @url_filters = product_filters(params) super end @@ -259,10 +254,6 @@ module Spree def set_product_master_variant_price_to_zero @product.price = 0 if @product.price.nil? end - - def product_filters(params) - params.select { |k, _v| PRODUCT_FILTER.include?(k) } - end end end end diff --git a/app/helpers/spree/admin/product_filter_helper.rb b/app/helpers/spree/admin/product_filter_helper.rb new file mode 100644 index 0000000000..644cdc1d56 --- /dev/null +++ b/app/helpers/spree/admin/product_filter_helper.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module Spree + module Admin + module ProductFilterHelper + PRODUCT_FILTER = [ + 'query', 'producerFilter', 'categoryFilter', 'sorting', 'importDateFilter' + ].freeze + + def product_filters(params) + params.select { |k, _v| PRODUCT_FILTER.include?(k) } + end + end + end +end diff --git a/app/views/spree/admin/products/edit.html.haml b/app/views/spree/admin/products/edit.html.haml index 8967233715..70dad9be28 100644 --- a/app/views/spree/admin/products/edit.html.haml +++ b/app/views/spree/admin/products/edit.html.haml @@ -1,5 +1,5 @@ - content_for :page_actions do - %li= button_link_to t('admin.products.back_to_products_list'), "#{admin_products_path}##{@url_filters}", :icon => 'icon-arrow-left' + %li= button_link_to t('admin.products.back_to_products_list'), "#{admin_products_path}#{(@url_filters.empty? ? "" : "#?#{@url_filters.to_query}")}", :icon => 'icon-arrow-left' %li#new_product_link = button_link_to t(:new_product), new_object_url, { :icon => 'icon-plus', :id => 'admin_new_product' } @@ -8,10 +8,10 @@ = render :partial => 'spree/admin/shared/product_tabs', :locals => { :current => 'Product Details' } = render :partial => 'spree/shared/error_messages', :locals => { :target => @product } -= form_for [:admin, @product], :url => "#{admin_product_path(@product)}#{@url_filters}", :method => :put, :html => { :multipart => true } do |f| += form_for [:admin, @product], :url => admin_product_path(@product, @url_filters), :method => :put, :html => { :multipart => true } do |f| %fieldset.no-border-top{'ng-app' => 'admin.products'} = render :partial => 'form', :locals => { :f => f } .form-buttons.filter-actions.actions = button t(:update), 'icon-refresh' %span.or= t(:or) - = button_link_to t(:cancel), "#{collection_url}##{@url_filters}", icon: 'icon-remove' + = button_link_to t(:cancel), "#{collection_url}#{(@url_filters.empty? ? "" : "#?#{@url_filters.to_query}")}", icon: 'icon-remove' diff --git a/app/views/spree/admin/shared/_product_tabs.html.haml b/app/views/spree/admin/shared/_product_tabs.html.haml index a16dad80d4..406b8a550c 100644 --- a/app/views/spree/admin/shared/_product_tabs.html.haml +++ b/app/views/spree/admin/shared/_product_tabs.html.haml @@ -12,22 +12,22 @@ - if can?(:admin, Spree::Product) - klass = current == 'Product Details' ? 'active' : '' %li{:class => klass} - = link_to_with_icon 'icon-edit', t('admin.products.tabs.product_details'), edit_admin_product_url(@product) + = link_to_with_icon 'icon-edit', t('admin.products.tabs.product_details'), edit_admin_product_url(@product, @url_filters) - if can?(:admin, Spree::Image) - klass = current == 'Images' ? 'active' : '' %li{:class => klass} - = link_to_with_icon 'icon-picture', t('admin.products.tabs.images'), admin_product_images_url(@product) + = link_to_with_icon 'icon-picture', t('admin.products.tabs.images'), admin_product_images_url(@product, @url_filters) - if can?(:admin, Spree::Variant) - klass = current == 'Variants' ? 'active' : '' %li{:class => klass} - = link_to_with_icon 'icon-th-large', t('admin.products.tabs.variants'), admin_product_variants_url(@product) + = link_to_with_icon 'icon-th-large', t('admin.products.tabs.variants'), admin_product_variants_url(@product, @url_filters) - if can?(:admin, Spree::ProductProperty) - klass = current == 'Product Properties' ? 'active' : '' %li{:class => klass} - = link_to_with_icon 'icon-tasks', t('admin.products.tabs.product_properties'), admin_product_product_properties_url(@product) + = link_to_with_icon 'icon-tasks', t('admin.products.tabs.product_properties'), admin_product_product_properties_url(@product, @url_filters) - klass = current == 'Group Buy Options' ? 'active' : '' %li{:class => klass} - = link_to_with_icon 'icon-tasks', t('admin.products.tabs.group_buy_options'), group_buy_options_admin_product_url(@product) + = link_to_with_icon 'icon-tasks', t('admin.products.tabs.group_buy_options'), group_buy_options_admin_product_url(@product, @url_filters) - klass = current == t(:search) ? 'active' : '' %li{:class => klass} - = link_to_with_icon 'icon-tasks', t(:search), seo_admin_product_url(@product) + = link_to_with_icon 'icon-tasks', t(:search), seo_admin_product_url(@product, @url_filters) diff --git a/spec/features/admin/products_spec.rb b/spec/features/admin/products_spec.rb index 78b0c2f9e2..06914be930 100644 --- a/spec/features/admin/products_spec.rb +++ b/spec/features/admin/products_spec.rb @@ -167,6 +167,14 @@ feature ' # Link back to the bulk product update page should include the filters expect(page).to have_link(I18n.t('admin.products.back_to_products_list'), href: %r{admin\/products#\?#{filter_query}}) expect(page).to have_link(I18n.t(:cancel), href: %r{admin\/products#\?#{filter_query}}) + + # Sidebar link should include the filters + expect(page).to have_link(I18n.t('admin.products.tabs.product_details'), href: %r{admin\/products\/#{product.permalink}\/edit\?#{filter_query}}) + expect(page).to have_link(I18n.t('admin.products.tabs.images'), href: %r{admin\/products\/#{product.permalink}\/images\?#{filter_query}}) + expect(page).to have_link(I18n.t('admin.products.tabs.variants'), href: %r{admin\/products\/#{product.permalink}\/variants\?#{filter_query}}) + expect(page).to have_link(I18n.t('admin.products.tabs.product_properties'), href: %r{admin\/products\/#{product.permalink}\/product_properties\?#{filter_query}}) + expect(page).to have_link(I18n.t('admin.products.tabs.group_buy_options'), href: %r{admin\/products\/#{product.permalink}\/group_buy_options\?#{filter_query}}) + expect(page).to have_link(I18n.t(:search), href: %r{admin\/products\/#{product.permalink}\/seo\?#{filter_query}}) end scenario "editing product group buy options" do diff --git a/spec/helpers/spree/admin/product_filter_helper_spec.rb b/spec/helpers/spree/admin/product_filter_helper_spec.rb new file mode 100644 index 0000000000..d9177b9da0 --- /dev/null +++ b/spec/helpers/spree/admin/product_filter_helper_spec.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Spree::Admin::ProductFilterHelper, type: :helper do + describe 'product_filters' do + it 'should return only parameters included in PRODUCT_FILTER' do + parameters = { 'query' => 'test', 'categoryFilter' => 2, 'randomFilter' => 5 } + + filters = helper.product_filters(parameters) + + puts filters.inspect + expect(filters.key?('query')).to be true + expect(filters.key?('categoryFilter')).to be true + expect(filters.key?('randomFilter')).to be false + end + end +end