spree_favorite_products 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,7 +5,7 @@ module Spree
5
5
  before_filter :find_favorite_product, :only => :destroy
6
6
 
7
7
  def index
8
- @favorite_products = spree_current_user.favorite_products
8
+ @favorite_products = spree_current_user.favorite_products.page(params[:page]).per(Spree::Config.favorite_products_per_page)
9
9
  end
10
10
 
11
11
  def create
@@ -28,7 +28,7 @@ module Spree
28
28
 
29
29
  private
30
30
  def find_favorite_product
31
- @favorite = spree_current_user.favorites.joins(:product).readonly(false).where(:spree_products => {:permalink => params[:id]}).first
31
+ @favorite = spree_current_user.favorites.joins(:product).readonly(false).where(:spree_products => {:id => params[:id]}).first
32
32
  end
33
33
  end
34
34
  end
@@ -0,0 +1,3 @@
1
+ Spree::AppConfiguration.class_eval do
2
+ preference :favorite_products_per_page, :integer, default: 10
3
+ end
@@ -1,4 +1,8 @@
1
1
  Spree::User.class_eval do
2
2
  has_many :favorites
3
3
  has_many :favorite_products, :through => :favorites, :class_name => 'Spree::Product', :source => 'product'
4
+
5
+ def has_favorite_product?(product_id)
6
+ favorites.exists? :product_id => product_id
7
+ end
4
8
  end
@@ -0,0 +1,16 @@
1
+ Deface::Override.new(
2
+ :virtual_path => 'spree/admin/general_settings/edit',
3
+ :name => 'add_favorite_products_per_page_configuration',
4
+ :insert_after => "#preferences .row",
5
+ :text => %Q{
6
+ <div class="row">
7
+ <fieldset class="no-border-bottom">
8
+ <legend align="center"><%= Spree.t(:favorite_products_settings) %></legend>
9
+ <div class="field">
10
+ <%= label_tag :favorite_products_per_page, Spree.t(:favorite_products_per_page) %><br>
11
+ <%= text_field_tag :favorite_products_per_page, Spree::Config[:favorite_products_per_page], :size => 3 %>
12
+ </div>
13
+ </fieldset>
14
+ </div>
15
+ }
16
+ )
@@ -2,5 +2,11 @@ Deface::Override.new(
2
2
  :virtual_path => 'spree/products/show',
3
3
  :name => 'add_link_to_mark_product_as_favorite',
4
4
  :insert_after => "div[itemprop='description']",
5
- :text => "<%= link_to 'Mark as favorite', favorite_products_path(:id => @product.id), :method => :post, :remote => spree_user_signed_in? %>"
5
+ :text => %Q{
6
+ <% if spree_user_signed_in? && spree_current_user.has_favorite_product?(@product.id) %>
7
+ <%= link_to Spree.t(:unmark_as_favorite), favorite_product_path(:id => @product.id), :method => :delete, :remote => true, :class => 'favorite_link' %>
8
+ <% else %>
9
+ <%= link_to Spree.t(:mark_as_favorite), favorite_products_path(:id => @product.id), :method => :post, :remote => spree_user_signed_in?, :class => 'favorite_link' %>
10
+ <% end %>
11
+ }
6
12
  )
@@ -1 +1,4 @@
1
+ <% if @success %>
2
+ $('.favorite_link').attr('href', '<%= favorite_product_path(:id => params[:id]) %>').data('method', 'delete').text('<%= Spree.t(:unmark_as_favorite) %>')
3
+ <% end %>
1
4
  alert("<%=j @message%>");
@@ -1,6 +1,11 @@
1
1
  <% if @success %>
2
- $("#favorite_product_<%= @favorite.product_id%>").remove();
3
- alert("Successfully removed favorite product from your list")
2
+ if($('.favorite_link').length) {
3
+ $('.favorite_link').attr('href', '<%= favorite_products_path(:id => @favorite.product_id) %>').data('method', 'post').text('<%= Spree.t(:mark_as_favorite) %>')
4
+ alert('Successfully unmarked as favorite');
5
+ } else {
6
+ $("#favorite_product_<%= @favorite.product_id%>").remove();
7
+ alert("Successfully removed favorite product from your list");
8
+ }
4
9
  <% else %>
5
10
  alert("Could not remove product form your list")
6
11
  <% end %>
@@ -14,7 +14,7 @@
14
14
  <tr class="<%= cycle('even', 'odd') %>" id="favorite_product_<%= product.id %>">
15
15
  <td class="favorite-product-image"><%= link_to small_image(product), product_path(product) %></td>
16
16
  <td class="favorite-product-name"><%= product.name %></td>
17
- <td class="favorite-product-remove"><%= link_to 'Remove', favorite_product_path(product), :method => :delete, :remote => true %>
17
+ <td class="favorite-product-remove"><%= link_to 'Remove', favorite_product_path(:id => product.id), :method => :delete, :remote => true %>
18
18
  </tr>
19
19
  <% end %>
20
20
  </tbody>
@@ -22,4 +22,6 @@
22
22
  <% else %>
23
23
  <p><%= Spree.t(:you_have_no_favorite_products_yet) %></p>
24
24
  <% end %>
25
+
26
+ <%= paginate @favorite_products %>
25
27
  </div>
@@ -3,3 +3,8 @@
3
3
 
4
4
  en:
5
5
  hello: "Hello world"
6
+ spree:
7
+ favorite_products_settings: "Favorite Products Settings"
8
+ favorite_products_per_page: "Per Page"
9
+ mark_as_favorite: "Mark as favorite"
10
+ unmark_as_favorite: "Unmark as favorite"
@@ -11,7 +11,7 @@ describe Spree::FavoriteProductsController do
11
11
 
12
12
  shared_examples_for "request which finds favorite product" do
13
13
  it "finds favorite product" do
14
- @current_user_favorites.should_receive(:where).with(:spree_products => {:permalink => 'permalink'})
14
+ @current_user_favorites.should_receive(:where).with(:spree_products => {:id => 'id'})
15
15
  send_request
16
16
  end
17
17
 
@@ -84,12 +84,15 @@ describe Spree::FavoriteProductsController do
84
84
 
85
85
  describe 'GET index' do
86
86
  def send_request
87
- get :index, :use_route => 'spree'
87
+ get :index, :page => 'current_page', :use_route => 'spree'
88
88
  end
89
89
 
90
90
  before(:each) do
91
- @favorite_product = mock_model(Spree::Product)
92
- @user = mock_model(Spree::User, :favorite_products => [@favorite_product], :generate_spree_api_key! => false, :last_incomplete_spree_order => nil)
91
+ @favorite_products = double('favorite_products')
92
+ @favorite_products.stub(:page).and_return(@favorite_products)
93
+ @favorite_products.stub(:per).and_return(@favorite_products)
94
+ Spree::Config.stub(:favorite_products_per_page).and_return('favorite_products_per_page')
95
+ @user = mock_model(Spree::User, :favorite_products => @favorite_products, :generate_spree_api_key! => false, :last_incomplete_spree_order => nil)
93
96
  controller.stub(:authenticate_spree_user!).and_return(true)
94
97
  controller.stub(:spree_current_user).and_return(@user)
95
98
  end
@@ -104,15 +107,25 @@ describe Spree::FavoriteProductsController do
104
107
  send_request
105
108
  end
106
109
 
110
+ it "paginates favorite products" do
111
+ @favorite_products.should_receive(:page).with('current_page')
112
+ send_request
113
+ end
114
+
115
+ it "shows Spree::Config.favorite_products_per_page" do
116
+ @favorite_products.should_receive(:per).with('favorite_products_per_page')
117
+ send_request
118
+ end
119
+
107
120
  it "assigns @favorite_products" do
108
121
  send_request
109
- assigns(:favorite_products).should eq([@favorite_product])
122
+ assigns(:favorite_products).should eq(@favorite_products)
110
123
  end
111
124
  end
112
125
 
113
126
  describe 'destroy' do
114
127
  def send_request(params = {})
115
- post :destroy, params.merge({:use_route => 'spree', :method => :delete, :format => :js, :id => 'permalink'})
128
+ post :destroy, params.merge({:use_route => 'spree', :method => :delete, :format => :js, :id => 'id'})
116
129
  end
117
130
 
118
131
  before do
@@ -0,0 +1,3 @@
1
+ describe Spree::AppConfiguration do
2
+ it { Spree::Config.favorite_products_per_page.should eq 10 }
3
+ end
@@ -1,6 +1,26 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Spree::User do
4
+ before(:each) do
5
+ @user = Spree::User.create! :email => 'test@example.com', :password => 'spree123'
6
+ @product1 = Spree::Product.create! :name => 'product1', :price => 100, :shipping_category_id => 1
7
+ @product2 = Spree::Product.create! :name => 'product2', :price => 100, :shipping_category_id => 1
8
+ favorite = Spree::Favorite.new
9
+ favorite.product_id = @product1.id
10
+ favorite.user_id = @user.id
11
+ favorite.save!
12
+ end
13
+
4
14
  it { should have_many(:favorites) }
5
15
  it { should have_many(:favorite_products).through(:favorites).class_name('Spree::Product') }
16
+
17
+ describe "has_favorite_product?" do
18
+ context "when product in user's favorite products" do
19
+ it { @user.has_favorite_product?(@product1.id).should be_true }
20
+ end
21
+
22
+ context 'when product is not in users favorite products' do
23
+ it { @user.has_favorite_product?(@product2.id).should be_false }
24
+ end
25
+ end
6
26
  end
@@ -2,7 +2,7 @@
2
2
  Gem::Specification.new do |s|
3
3
  s.platform = Gem::Platform::RUBY
4
4
  s.name = 'spree_favorite_products'
5
- s.version = '2.0.0'
5
+ s.version = '2.0.1'
6
6
  s.summary = 'users can mark product as favorite'
7
7
  s.description = 'This extension adds the following features: 1. Adds a link Mark as favorite on product detail page. 2. Favorite Products tab on header 3. Favorite Products tab in admin section'
8
8
  s.required_ruby_version = '>= 1.9.3'
metadata CHANGED
@@ -1,40 +1,47 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: spree_favorite_products
3
- version: !ruby/object:Gem::Version
4
- version: 2.0.0
3
+ version: !ruby/object:Gem::Version
4
+ hash: 13
5
5
  prerelease:
6
+ segments:
7
+ - 2
8
+ - 0
9
+ - 1
10
+ version: 2.0.1
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Mohit Bansal
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2014-02-24 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
17
+
18
+ date: 2014-03-07 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
15
21
  name: spree_core
16
- requirement: !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ~>
20
- - !ruby/object:Gem::Version
21
- version: 2.1.0
22
- type: :runtime
23
22
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
23
+ requirement: &id001 !ruby/object:Gem::Requirement
25
24
  none: false
26
- requirements:
25
+ requirements:
27
26
  - - ~>
28
- - !ruby/object:Gem::Version
27
+ - !ruby/object:Gem::Version
28
+ hash: 11
29
+ segments:
30
+ - 2
31
+ - 1
32
+ - 0
29
33
  version: 2.1.0
30
- description: ! 'This extension adds the following features: 1. Adds a link Mark as
31
- favorite on product detail page. 2. Favorite Products tab on header 3. Favorite
32
- Products tab in admin section'
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ description: "This extension adds the following features: 1. Adds a link Mark as favorite on product detail page. 2. Favorite Products tab on header 3. Favorite Products tab in admin section"
33
37
  email: info@vinsol.com
34
38
  executables: []
39
+
35
40
  extensions: []
41
+
36
42
  extra_rdoc_files: []
37
- files:
43
+
44
+ files:
38
45
  - .rspec
39
46
  - .travis.yml
40
47
  - Gemfile
@@ -49,10 +56,12 @@ files:
49
56
  - app/assets/stylesheets/store/spree_favorite_products.css
50
57
  - app/controllers/spree/admin/favorite_products_controller.rb
51
58
  - app/controllers/spree/favorite_products_controller.rb
59
+ - app/models/spree/app_configuration_decorator.rb
52
60
  - app/models/spree/favorite.rb
53
61
  - app/models/spree/product_decorator.rb
54
62
  - app/models/spree/user_decorator.rb
55
63
  - app/overrides/.DS_Store
64
+ - app/overrides/add_favorite_products_per_page_configuration.rb
56
65
  - app/overrides/add_favorite_products_tab.rb
57
66
  - app/overrides/add_link_to_mark_product_as_favorite.rb
58
67
  - app/overrides/add_link_to_users_favorite_products.rb
@@ -73,35 +82,46 @@ files:
73
82
  - script/rails
74
83
  - spec/controllers/spree/admin/favorite_products_controller_spec.rb
75
84
  - spec/controllers/spree/favorite_products_controller_spec.rb
85
+ - spec/models/spree/app_configuration_decorator_spec.rb
76
86
  - spec/models/spree/favorite_spec.rb
77
87
  - spec/models/spree/product_decorator_spec.rb
78
88
  - spec/models/spree/user_decorator_spec.rb
79
89
  - spec/spec_helper.rb
80
90
  - spree_favorite_products.gemspec
81
91
  homepage: http://vinsol.com
82
- licenses:
92
+ licenses:
83
93
  - MIT
84
94
  post_install_message:
85
95
  rdoc_options: []
86
- require_paths:
96
+
97
+ require_paths:
87
98
  - lib
88
- required_ruby_version: !ruby/object:Gem::Requirement
99
+ required_ruby_version: !ruby/object:Gem::Requirement
89
100
  none: false
90
- requirements:
91
- - - ! '>='
92
- - !ruby/object:Gem::Version
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ hash: 53
105
+ segments:
106
+ - 1
107
+ - 9
108
+ - 3
93
109
  version: 1.9.3
94
- required_rubygems_version: !ruby/object:Gem::Requirement
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
111
  none: false
96
- requirements:
97
- - - ! '>='
98
- - !ruby/object:Gem::Version
99
- version: '0'
100
- requirements:
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ hash: 3
116
+ segments:
117
+ - 0
118
+ version: "0"
119
+ requirements:
101
120
  - none
102
121
  rubyforge_project:
103
- rubygems_version: 1.8.25
122
+ rubygems_version: 1.8.24
104
123
  signing_key:
105
124
  specification_version: 3
106
125
  summary: users can mark product as favorite
107
126
  test_files: []
127
+