spree_size_chart 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. data/.gitignore +14 -0
  2. data/Gemfile +9 -0
  3. data/LICENSE +26 -0
  4. data/README.md +77 -0
  5. data/Rakefile +29 -0
  6. data/Versionfile +11 -0
  7. data/app/assets/javascripts/admin/spree_size_chart.js +1 -0
  8. data/app/assets/javascripts/spree/admin/size_charts.js +2 -0
  9. data/app/assets/javascripts/spree/admin/size_types.js +2 -0
  10. data/app/assets/javascripts/store/spree_size_chart.js +1 -0
  11. data/app/assets/stylesheets/admin/spree_size_chart.css +3 -0
  12. data/app/assets/stylesheets/spree/admin/size_charts.css.scss +3 -0
  13. data/app/assets/stylesheets/spree/admin/size_types.css.scss +3 -0
  14. data/app/assets/stylesheets/store/spree_size_chart.css +16 -0
  15. data/app/controllers/spree/admin/size_charts_controller.rb +24 -0
  16. data/app/controllers/spree/admin/size_types_controller.rb +12 -0
  17. data/app/helpers/spree/admin/size_charts_helper.rb +2 -0
  18. data/app/helpers/spree/admin/size_types_helper.rb +2 -0
  19. data/app/models/spree.rb +5 -0
  20. data/app/models/spree/product_decorator.rb +3 -0
  21. data/app/models/spree/size_chart.rb +72 -0
  22. data/app/models/spree/size_type.rb +11 -0
  23. data/app/models/spree/size_value.rb +7 -0
  24. data/app/overrides/add_product_tab.rb +6 -0
  25. data/app/overrides/add_to_show_product.rb +4 -0
  26. data/app/overrides/admin_configuration.rb +18 -0
  27. data/app/views/spree/admin/size_charts/_form.html.erb +28 -0
  28. data/app/views/spree/admin/size_charts/edit.html.erb +24 -0
  29. data/app/views/spree/admin/size_types/_form.html.erb +4 -0
  30. data/app/views/spree/admin/size_types/edit.html.erb +10 -0
  31. data/app/views/spree/admin/size_types/index.html.erb +30 -0
  32. data/app/views/spree/admin/size_types/new.html.erb +10 -0
  33. data/app/views/spree/shared/_size_chart.html.erb +31 -0
  34. data/config/locales/en.yml +6 -0
  35. data/config/routes.rb +9 -0
  36. data/db/migrate/20120416191149_create_spree_size_charts.rb +11 -0
  37. data/db/migrate/20120416191216_create_spree_size_types.rb +15 -0
  38. data/db/migrate/20120416191257_create_spree_size_values.rb +12 -0
  39. data/db/migrate/20120421093828_add_unit_to_spree_size_charts.rb +5 -0
  40. data/lib/generators/spree_size_chart/install/install_generator.rb +29 -0
  41. data/lib/spree_size_chart.rb +2 -0
  42. data/lib/spree_size_chart/engine.rb +20 -0
  43. data/lib/spree_size_chart/version.rb +3 -0
  44. data/script/rails +5 -0
  45. data/spec/controllers/spree/admin/size_charts_controller_spec.rb +5 -0
  46. data/spec/controllers/spree/admin/size_types_controller_spec.rb +5 -0
  47. data/spec/factories.rb +15 -0
  48. data/spec/helpers/spree/admin/size_charts_helper_spec.rb +15 -0
  49. data/spec/helpers/spree/admin/size_types_helper_spec.rb +15 -0
  50. data/spec/models/spree/size_chart_spec.rb +78 -0
  51. data/spec/models/spree/size_type_spec.rb +5 -0
  52. data/spec/models/spree/size_value_spec.rb +5 -0
  53. data/spec/requests/spree_size_chart_spec.rb +69 -0
  54. data/spec/spec_helper.rb +36 -0
  55. data/spec/support/shared_connection.rb +12 -0
  56. data/spec/support/url_helpers.rb +7 -0
  57. data/spree_size_chart.gemspec +32 -0
  58. metadata +215 -0
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ \#*
2
+ *~
3
+ .#*
4
+ .DS_Store
5
+ .idea
6
+ .project
7
+ tmp
8
+ nbproject
9
+ *.swp
10
+ spec/dummy
11
+ Gemfile.lock
12
+ .rvmrc
13
+ .bundle
14
+ .rspec
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'http://rubygems.org'
2
+
3
+ # TODO : spree 1.0.4 still have bug with current user, so we test against 1.0.1 until is is fixed
4
+ group :test do
5
+ gem 'spree_core', '1.0.1'
6
+ gem 'spree_sample', '1.0.1'
7
+ end
8
+
9
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,26 @@
1
+ Copyright (c) 2012 [name of plugin creator]
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification,
5
+ are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+ * Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+ * Neither the name Spree nor the names of its contributors may be used to
13
+ endorse or promote products derived from this software without specific
14
+ prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,77 @@
1
+ SpreeSizeChart
2
+ ==============
3
+
4
+ SpreeSizeChart feature extracted from [http://www.hallyustyle.com](http://www.hallyustyle.com).
5
+
6
+ SpreeSizeChart is a spree extension helping your store to provide pertinent product information.
7
+
8
+ Example
9
+ -------
10
+
11
+ ![Spree SizeChart Admin](http://i49.tinypic.com/27ybj8x.png)
12
+
13
+ ![Spree SizeChart Store](http://i50.tinypic.com/wk2fs.png)
14
+
15
+ Installation
16
+ ------------
17
+
18
+ To install SpreeSizeChart, just add the following to your Gemfile:
19
+
20
+ ```ruby
21
+ gem 'spree_size_chart', '~> 1.0.0'
22
+ ```
23
+
24
+ Now, bundle up and run the generator:
25
+
26
+ ```ruby
27
+ bundle
28
+ rails g spree_minicart:install
29
+ ```
30
+
31
+ Customization
32
+ -------------
33
+
34
+ The SizeChart markup should let you customize the way you want your SizeChart by using Deface or overriding views/spree/shared/_size_chart_.html.erb in your spree app.
35
+
36
+ If you want to display yourself the size chart, just disable the deface :
37
+
38
+ ```ruby
39
+ # disable size_chart, explicitly put in the view
40
+ Deface::Override.new( :virtual_path => "spree/products/show",
41
+ :name => "add_size_chart_to_show_product",
42
+ :replace => '',
43
+ :disabled => true)
44
+ ```
45
+
46
+ See [Spree Guide](http://guides.spreecommerce.com/view_customization.html) for more information.
47
+
48
+
49
+ Todo
50
+ -------
51
+
52
+ - Better html markup and HTML test for customization
53
+ - Add translation to size type.
54
+ - Compatibilty Spree 1.1.X
55
+
56
+ Compatibility
57
+ ------------
58
+
59
+ Tested under Spree 1.0.4
60
+
61
+
62
+ Testing
63
+ -------
64
+
65
+ Be sure to bundle your dependencies and then create a dummy test app for the specs to run against.
66
+
67
+ $ bundle
68
+ $ bundle exec rake test_app
69
+ $ bundle exec rspec spec
70
+
71
+
72
+ Contribute
73
+ ----------
74
+
75
+ Pull requests for features and bug fix with tests are welcome.
76
+
77
+ Copyright (c) 2012 [Stephane BOUNMY], released under the New BSD License
data/Rakefile ADDED
@@ -0,0 +1,29 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/packagetask'
4
+ require 'rubygems/package_task'
5
+ require 'rspec/core/rake_task'
6
+ require 'spree/core/testing_support/common_rake'
7
+
8
+ RSpec::Core::RakeTask.new
9
+
10
+ task :default => [:spec]
11
+
12
+ spec = eval(File.read('spree_size_chart.gemspec'))
13
+
14
+ Gem::PackageTask.new(spec) do |p|
15
+ p.gem_spec = spec
16
+ end
17
+
18
+ desc "Release to gemcutter"
19
+ task :release => :package do
20
+ require 'rake/gemcutter'
21
+ Rake::Gemcutter::Tasks.new(spec).define
22
+ Rake::Task['gem:push'].invoke
23
+ end
24
+
25
+ desc "Generates a dummy app for testing"
26
+ task :test_app do
27
+ ENV['LIB_NAME'] = 'spree_size_chart'
28
+ Rake::Task['common:test_app'].invoke
29
+ end
data/Versionfile ADDED
@@ -0,0 +1,11 @@
1
+ # This file is used to designate compatibilty with different versions of Spree
2
+ # Please see http://spreecommerce.com/documentation/extensions.html#versionfile for details
3
+
4
+ # Examples
5
+ #
6
+ # "0.70.x" => { :branch => "master"}
7
+ # "0.60.x" => { :branch => "0-60-stable" }
8
+ # "0.40.x" => { :tag => "v1.0.0", :version => "1.0.0" }
9
+
10
+ "1.0.x" => { :branch => "1-0-stable" }
11
+ "1.1.x" => { :branch => "master" }
@@ -0,0 +1 @@
1
+ //= require admin/spree_core
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1 @@
1
+ //= require store/spree_core
@@ -0,0 +1,3 @@
1
+ /*
2
+ *= require admin/spree_core
3
+ */
@@ -0,0 +1,3 @@
1
+ // Place all the styles related to the spree/admin/size_charts controller here.
2
+ // They will automatically be included in application.css.
3
+ // You can use Sass (SCSS) here: http://sass-lang.com/
@@ -0,0 +1,3 @@
1
+ // Place all the styles related to the spree/admin/size_types controller here.
2
+ // They will automatically be included in application.css.
3
+ // You can use Sass (SCSS) here: http://sass-lang.com/
@@ -0,0 +1,16 @@
1
+ /*
2
+ *= require store/spree_core
3
+ */
4
+
5
+ div#product-size-chart table tbody th {
6
+ text-align: left;
7
+ padding-left: 10px;
8
+ }
9
+
10
+ div#product-size-chart table tbody td {
11
+ text-align: center;
12
+ }
13
+
14
+ div#product-size-chart table tbody td, div#product-size-chart table tbody th {
15
+ vertical-align: middle;
16
+ }
@@ -0,0 +1,24 @@
1
+ module Spree
2
+ module Admin
3
+ class SizeChartsController < ResourceController
4
+
5
+ def edit
6
+ @product = Product.find_by_permalink params[:product_id]
7
+ @size_chart = @product.size_chart || @product.build_size_chart
8
+ end
9
+
10
+ def update
11
+ @product = Product.find_by_permalink params[:product_id]
12
+ if (@product.size_chart || @product.build_size_chart).update_attributes params[:size_chart]
13
+ flash[:notice] = "Size Chart successfully updated"
14
+ else
15
+ end
16
+ redirect_to edit_admin_product_size_chart_path(@product)
17
+ end
18
+
19
+ def collection_url
20
+ admin_product_size_chart_url(@product)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,12 @@
1
+ module Spree
2
+ module Admin
3
+ class SizeTypesController < ResourceController
4
+ def index
5
+ respond_with(collection) do |format|
6
+ format.html
7
+ format.json { render :json => json_data }
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,2 @@
1
+ module Spree::Admin::SizeChartsHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ module Spree::Admin::SizeTypesHelper
2
+ end
@@ -0,0 +1,5 @@
1
+ module Spree
2
+ def self.table_name_prefix
3
+ 'spree_'
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ Spree::Product.class_eval do
2
+ has_one :size_chart
3
+ end
@@ -0,0 +1,72 @@
1
+ module Spree
2
+ class SizeChart < ActiveRecord::Base
3
+ UNITS = ['cm', 'inch']
4
+
5
+ belongs_to :option_type, :class_name => "Spree::OptionType"
6
+ belongs_to :product
7
+ has_many :option_values, :through => :option_type
8
+ has_and_belongs_to_many :size_types, :class_name => "Spree::SizeType", :join_table => "spree_size_charts_size_types"
9
+ has_many :size_values, :class_name => "Spree::SizeValue"
10
+
11
+ accepts_nested_attributes_for :size_values, :allow_destroy => true
12
+ attr_accessible :size_values_attributes, :size_type_ids, :unit, :option_type_id
13
+
14
+ def size_values_attributes_with_sanity_check=(attributes)
15
+ attributes.each_value do |attrs|
16
+ if attrs['value'].blank?
17
+ attrs.merge!('_destroy' => true)
18
+ end
19
+ end
20
+ self.size_values_attributes_without_sanity_check = attributes
21
+ end
22
+
23
+ alias_method_chain :size_values_attributes=, :sanity_check
24
+
25
+ def find_size_values
26
+ @size_values = []
27
+ option_value_ids.each do |opt_value_id|
28
+ size_type_ids.each do |size_type_id|
29
+ if _size_value = find_or_initialize_size_value(opt_value_id, size_type_id) and !_size_value.new_record?
30
+ @size_values << _size_value
31
+ end
32
+ end
33
+ end
34
+
35
+ @size_values
36
+ end
37
+
38
+
39
+ def find_or_initialize_size_values
40
+ @size_values = []
41
+ option_value_ids.each do |opt_value_id|
42
+ size_type_ids.each do |size_type_id|
43
+ @size_values << find_or_initialize_size_value(opt_value_id, size_type_id)
44
+ end
45
+ end
46
+
47
+ @size_values
48
+ end
49
+
50
+ def find_or_initialize_size_value(opt_value_id, size_type_id)
51
+ (hash_size_values[opt_value_id] and hash_size_values[opt_value_id][size_type_id]) || size_values.build(:size_type_id => size_type_id, :option_value_id => opt_value_id)
52
+ end
53
+
54
+ def hash_size_values
55
+ return @hsize_values if @hsize_values
56
+ @hsize_values = {}
57
+ size_values(true).each do |size_val|
58
+ if @hsize_values[size_val.option_value_id]
59
+ @hsize_values[size_val.option_value_id].merge!(size_val.size_type_id => size_val)
60
+ else
61
+ @hsize_values[size_val.option_value_id] = { size_val.size_type_id => size_val }
62
+ end
63
+ end
64
+ @hsize_values
65
+ end
66
+
67
+ def option_type_with_unit
68
+ "#{option_type.try(:presentation)} (#{unit})"
69
+ end
70
+ end
71
+
72
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ class SizeType < ActiveRecord::Base
3
+ def name_with_unit(unit)
4
+ if unit and !unit.blank?
5
+ "#{name} (#{unit})"
6
+ else
7
+ name
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ module Spree
2
+ class SizeValue < ActiveRecord::Base
3
+ belongs_to :size_type
4
+ belongs_to :size_chart
5
+ belongs_to :option_value
6
+ end
7
+ end
@@ -0,0 +1,6 @@
1
+ Deface::Override.new( :virtual_path => "spree/admin/shared/_product_tabs",
2
+ :name => "add_size_chart_product_tabs",
3
+ :insert_bottom => 'ul[data-hook="admin_product_tabs"].sidebar.product-menu',
4
+ :text => %Q{<li<%== ' class="active"' if current == 'Size Chart' %>>
5
+ <%= link_to t(:size_chart), edit_admin_product_size_chart_url(@product) %>
6
+ </li>})
@@ -0,0 +1,4 @@
1
+ Deface::Override.new( :virtual_path => "spree/products/show",
2
+ :name => "add_size_chart_to_show_product",
3
+ :insert_bottom => '[data-hook="product_left_part_wrap"]',
4
+ :partial => "spree/shared/size_chart")
@@ -0,0 +1,18 @@
1
+ Deface::Override.new(:virtual_path => "spree/admin/shared/_configuration_menu",
2
+ :name => "add_size_chart_type_link_configuration_menu",
3
+ :insert_bottom => "[data-hook='admin_configurations_sidebar_menu']",
4
+ :text => %q{<%= configurations_sidebar_menu_item t("size_types"), admin_size_types_path %>},
5
+ :disabled => false)
6
+
7
+
8
+ Deface::Override.new(:virtual_path => "spree/admin/configurations/index",
9
+ :name => "add_size_types_to_configuration_menu",
10
+ :insert_bottom => "[data-hook='admin_configurations_menu']",
11
+ :text => %q{
12
+ <tr>
13
+ <td><%= link_to t("size_types"), admin_size_types_path %></td>
14
+ <td><%= t("size_types_description") %></td>
15
+ </tr>
16
+ },
17
+ :original => '2645fce66adc090d7ce0aa34f7cdfcaabf1be9f0',
18
+ :disabled => false)
@@ -0,0 +1,28 @@
1
+ <%= form.field_container :name do %>
2
+ <table>
3
+ <% unless form.object.new_record? %>
4
+ <% @i = 0 %>
5
+ <% @size_type_count = form.object.size_types.count %>
6
+ <tr>
7
+ <th><%= form.object.option_type.try(:presentation) %></th>
8
+ <% form.object.size_types.each do |type| %>
9
+ <th><%= type.name %></th>
10
+ <% end %>
11
+ </tr>
12
+ <%= form.fields_for :size_values, form.object.find_or_initialize_size_values do |value_form| %>
13
+ <% if @i == 0 %>
14
+ <%= "<tr>".html_safe %>
15
+ <th><%= form.object.option_values.find(value_form.object.option_value_id).name %></th>
16
+ <% end %>
17
+ <td>
18
+ <%= value_form.hidden_field :size_type_id %>
19
+ <%= value_form.hidden_field :option_value_id %>
20
+ <%= value_form.text_field :value %>
21
+ </td>
22
+ <%= "</tr>".html_safe if @i == @size_type_count - 1 %>
23
+ <% @i += 1 %>
24
+ <% @i = 0 if @i == @size_type_count %>
25
+ <% end %>
26
+ <% end %>
27
+ </table>
28
+ <% end %>