piggybak_variants 0.0.17 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 21f091a2e1ce6be384810b86e9d320f0d6789aca
4
+ data.tar.gz: cf94b7a11ed463e3d5199319ce3c91e9bb85eb38
5
+ SHA512:
6
+ metadata.gz: ef38a0103338568ca28187fd5d585f7059b86cb82a7e2e372caec305c92d313abd2bc7344222b626e1a0b525fae567f9ae098b88d03e0e77c24231bec5fb2626
7
+ data.tar.gz: 029fdff18768f7254eff52decfc0546f44206bdb1cd3b0345d82d83b2f3b64e385cf88599a2c58f3d8c488edb125b6ec820865750e068ba06fee412b558e086a
data/README.md CHANGED
@@ -10,26 +10,18 @@ In your Gemfile add `gem "piggybak_variants"`
10
10
 
11
11
  Run `bundle install`
12
12
 
13
- Run `rake piggybak_variants:install:migrations`
13
+ Run `rake piggybak_variants:install:migrations` in your main Rails application.
14
14
  Migrate the DB `rake db:migrate`
15
15
 
16
+ Add //= require piggybak_variants/piggybak_variants-application to your application.js
17
+
16
18
  Add `acts_as_sellable_with_variants` to any model that should have variants. You may need to add appropriate attr_accessible settings in your model as well, depending on your attribute accessibility settings.
17
19
 
18
20
  In the admin, define option configurations and option values for each option, then create variants for your sellable instances.
19
21
 
20
- Finally, add `<%= variant_cart_form(@instance) %>` to your sellable item's show page to render the cart form.
21
-
22
- OPTION: `<%= variant_cart_form(@instance, :controls => 'dropdowns') %>` to render dropdowns instead of radio buttons.
23
-
24
- So either add that line, or if you already have it enabled just add `piggybak_variants/piggybak_variants.js` to the array of values.
25
-
26
- TODO
27
- ========
28
-
29
- * Notes specified in variant.rb
30
-
22
+ Finally, add `<%= variant_cart_form(@instance) %>` to your sellable item's show page to render the cart form. To use dropdowns instead of radio buttons, call `<%= variant_cart_form(@instance, :controls => 'dropdowns') %>`
31
23
 
32
24
  Copyright
33
25
  ========
34
26
 
35
- Copyright (c) 2012 End Point. See LICENSE for further details.
27
+ Copyright (c) 2014 End Point. See LICENSE for further details.
@@ -0,0 +1 @@
1
+ //= require piggybak_variants/piggybak_variants
@@ -1,7 +1,68 @@
1
- // This is a manifest file that'll be compiled into including all the files listed below.
2
- // Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
3
- // be included in the compiled file accessible from http://example.com/assets/application.js
4
- // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
5
- // the compiled file.
6
- //
7
- //= require_tree .
1
+ var piggybak_variants = {
2
+ refreshControls : function(data) {
3
+ if(data.all_selected) { // if all selected
4
+ var selected_key = data.selected.sort().join('_');
5
+ if(variant_map[selected_key]) {
6
+ $('.variant_options form').show();
7
+ $('#sellable_id').val(variant_map[selected_key].id);
8
+ $('#variant_price span').html(variant_map[selected_key].price);
9
+ } else { // if variant not available
10
+ $('.variant_options form').hide();
11
+ $('.unavailable').show();
12
+ }
13
+ } else { // if not all selected
14
+ $('.all_selected').show();
15
+ $('.variant_options form').hide();
16
+ }
17
+ },
18
+ extractRadioButtonValues: function() {
19
+ var all_selected = true;
20
+ var selected = new Array();
21
+ $.each($('.option'), function(i, j) {
22
+ var option_id = $(j).attr('id');
23
+ if($('input[name=' + option_id + ']:checked').length) {
24
+ selected.push($('input[name=' + option_id + ']:checked').val());
25
+ } else {
26
+ all_selected = false;
27
+ }
28
+ });
29
+ return { all_selected: all_selected, selected: selected };
30
+ },
31
+ extractDropdownValues: function() {
32
+ var all_selected = true;
33
+ // TODO: Nice to see if easier way to select by value, but select[value=""] doesn't work
34
+ $('.variant_options select').each(function() {
35
+ if ($(this).val() == '') {
36
+ all_selected = false;
37
+ }
38
+ });
39
+ if(!all_selected) {
40
+ return { all_selected: false, selected: '' };
41
+ }
42
+
43
+ var selected = new Array();
44
+ $.each($('.variant_options .option select'), function(i, j) {
45
+ selected.push($(this).val());
46
+ });
47
+ return { all_selected: true, selected: selected};
48
+ },
49
+ toggleVariantForm: function() {
50
+ $('.unavailable, .all_selected').hide();
51
+ var data;
52
+ if ($('.variant_options input[type=radio]').length > 0){
53
+ data = piggybak_variants.extractRadioButtonValues();
54
+ } else {
55
+ data = piggybak_variants.extractDropdownValues();
56
+ };
57
+ piggybak_variants.refreshControls(data);
58
+ }
59
+ }
60
+
61
+ $(function() {
62
+ $('.variant_options input[type=radio]').click(function() { piggybak_variants.toggleVariantForm(); });
63
+ $('.variant_options select').change(function() { piggybak_variants.toggleVariantForm(); });
64
+ if($('.variant_options').size() > 0) {
65
+ piggybak_variants.toggleVariantForm();
66
+ }
67
+ });
68
+
@@ -1,17 +1,12 @@
1
1
  module PiggybakVariants
2
2
  class Option < ActiveRecord::Base
3
- self.table_name = "options"
4
-
5
- attr_accessible :name, :position
6
- has_many :option_values, :dependent => :destroy
3
+ has_many :option_values, :dependent => :destroy, order: 'position ASC'
7
4
  has_many :option_configurations, :dependent => :destroy
8
5
 
9
6
  default_scope :order => "position ASC"
10
7
 
11
8
  accepts_nested_attributes_for :option_values, :allow_destroy => true
12
- attr_accessible :option_values_attributes, :allow_destroy => true
13
9
 
14
10
  accepts_nested_attributes_for :option_configurations, :allow_destroy => true
15
- attr_accessible :option_configurations_attributes, :allow_destroy => true
16
11
  end
17
12
  end
@@ -1,10 +1,7 @@
1
1
  module PiggybakVariants
2
2
  class OptionConfiguration < ActiveRecord::Base
3
- self.table_name = "option_configurations"
4
-
5
3
  VARIANT_CLASSES = []
6
4
 
7
- attr_accessible :klass, :option_id
8
5
  belongs_to :option
9
6
 
10
7
  def klass_enum
@@ -1,13 +1,9 @@
1
1
  module PiggybakVariants
2
2
  class OptionValue < ActiveRecord::Base
3
- self.table_name = "option_values"
4
-
5
- attr_accessible :name, :position
6
3
  has_and_belongs_to_many :variants
7
4
  belongs_to :option, :inverse_of => :option_values
8
5
 
9
- scope :ordered, :order => "position ASC"
10
- scope :hash_ordered, :include => :option, :order => "options.position ASC, option_values.position ASC"
6
+ scope :hash_ordered, -> { includes(:option).order("piggybak_variants_options.position ASC, piggybak_variants_option_values.position ASC") }
11
7
 
12
8
  def admin_label
13
9
  "#{self.option.name}: #{self.name}"
@@ -1,22 +1,22 @@
1
1
  module PiggybakVariants
2
2
  class Variant < ActiveRecord::Base
3
- self.table_name = "variants"
4
-
5
3
  acts_as_sellable
6
4
  belongs_to :item, :polymorphic => true
7
5
  has_and_belongs_to_many :option_values
8
6
 
9
- attr_accessible :option_value_ids, :piggybak_sellable_attributes
10
-
11
- scope :available, joins(:piggybak_sellable).where(["sellables.active = ? AND (sellables.quantity > 0 OR sellables.unlimited_inventory = ?)",true,true])
7
+ scope :available, joins(:piggybak_sellable).where(["piggybak_sellables.active = ? AND (piggybak_sellables.quantity > 0 OR piggybak_sellables.unlimited_inventory = ?)",true,true])
12
8
  validate :option_value_validation
9
+ validate :require_item
13
10
 
14
11
  def admin_label
15
12
  "#{self.piggybak_sellable.sku}: #{self.piggybak_sellable.price}"
16
13
  end
17
14
 
15
+ def require_item
16
+ self.errors.add(:piggybak_sellable, "You must have foo") if self.piggybak_sellable.nil?
17
+ end
18
+
18
19
  def option_value_validation
19
- # TODO: Figure out why this validation is only being called sometime
20
20
  # TODO: Add verification to prevent duplicate option value sets
21
21
 
22
22
  klass = self.item.class
@@ -1,6 +1,4 @@
1
1
  <% if object.reflections.keys.include?(:variants) -%>
2
- <%= javascript_include_tag "piggybak_variants/piggybak_variants" %>
3
-
4
2
  <script type="text/javascript">
5
3
  var variant_map = <%= raw variant_map(object) %>;
6
4
  </script>
@@ -1,6 +1,4 @@
1
1
  <% if object.reflections.keys.include?(:variants) -%>
2
- <%= javascript_include_tag "piggybak_variants/piggybak_variants" %>
3
-
4
2
  <script type="text/javascript">
5
3
  var variant_map = <%= raw variant_map(object) %>;
6
4
  </script>
@@ -9,7 +7,7 @@
9
7
  <% options_for_klass(object.class).each do |option| -%>
10
8
  <div class="option" id="option_<%= option.id %>">
11
9
  <h4><%= option.name %></h4>
12
- <% option.option_values.ordered.each do |option_value| -%>
10
+ <% option.option_values.each do |option_value| -%>
13
11
  <input type="radio" name="option_<%= option.id %>" value="<%= option_value.id %>" />
14
12
  <%= option_value.name %><br />
15
13
  <% end -%>
@@ -0,0 +1,9 @@
1
+ class UpgradePiggybakVariantsTables < ActiveRecord::Migration
2
+ def change
3
+ rename_table :variants, :piggybak_variants_variants
4
+ rename_table :options, :piggybak_variants_options
5
+ rename_table :option_values, :piggybak_variants_option_values
6
+ rename_table :option_values_variants, :piggybak_variants_option_values_variants
7
+ rename_table :option_configurations, :piggybak_variants_option_configurations
8
+ end
9
+ end
@@ -7,8 +7,6 @@ module Piggybak
7
7
  has_many :variants, :dependent => :destroy, :class_name => "::PiggybakVariants::Variant", :as => :item
8
8
 
9
9
  accepts_nested_attributes_for :variants, :allow_destroy => true
10
- attr_accessible :variants_attributes #, :allow_destroy => true
11
- validates_associated_bubbling :variants
12
10
 
13
11
  ::PiggybakVariants::OptionConfiguration::VARIANT_CLASSES << self.to_s
14
12
  end
@@ -19,10 +19,10 @@ module PiggybakVariants
19
19
  end
20
20
  end
21
21
 
22
- initializer "piggybak_variants.precompile_hook", :group => :all do |app|
23
- app.config.assets.precompile += ['piggybak_variants/piggybak_variants.js']
22
+ initializer "piggybak_variants.assets.precompile" do |app|
23
+ app.config.assets.precompile += ['piggybak_variants/piggybak_variants-application.js']
24
24
  end
25
-
25
+
26
26
  # TODO: Figure out of we can have this only in to_prepare or here
27
27
  initializer "piggybak_variants.add_helper" do |app|
28
28
  ApplicationController.class_eval do
@@ -1,3 +1,3 @@
1
1
  module PiggybakVariants
2
- VERSION = "0.0.17"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -1,5 +1,4 @@
1
1
  require "piggybak_variants/engine"
2
- require 'associated_bubbling_validator'
3
2
  require "acts_as_sellable_with_variants"
4
3
 
5
4
  module PiggybakVariants
metadata CHANGED
@@ -1,44 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: piggybak_variants
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.17
5
- prerelease:
4
+ version: 0.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Tim Case, Steph Skardal
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-04-16 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: rails
16
- requirement: !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ~>
20
- - !ruby/object:Gem::Version
21
- version: 3.2.3
22
- type: :runtime
23
- prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ~>
28
- - !ruby/object:Gem::Version
29
- version: 3.2.3
30
- description: ! 'Adds variant support to Piggybak. Variants are options for a product
31
- (i.e. small, medium, large, red, blue, green) variants can be configured to display
32
- as either radio btns or selects '
11
+ date: 2014-03-27 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Advanced variant support for Piggybak.
33
14
  email:
34
15
  - piggybak@endpoint.com
35
16
  executables: []
36
17
  extensions: []
37
18
  extra_rdoc_files: []
38
19
  files:
20
+ - MIT-LICENSE
21
+ - README.md
22
+ - Rakefile
23
+ - app/assets/javascripts/piggybak_variants/piggybak_variants-application.js
39
24
  - app/assets/javascripts/piggybak_variants/piggybak_variants.js
40
- - app/assets/javascripts/piggybak_variants/product_show.js
41
- - app/assets/stylesheets/piggybak_variants/application.css
42
25
  - app/controllers/piggybak_variants/application_controller.rb
43
26
  - app/helpers/piggybak_variants_helper.rb
44
27
  - app/models/piggybak_variants/option.rb
@@ -54,19 +37,19 @@ files:
54
37
  - db/migrate/20121016153016_create_option_values.rb
55
38
  - db/migrate/20121016161156_create_option_values_variants.rb
56
39
  - db/migrate/20121022205428_create_option_configurations.rb
40
+ - db/migrate/20140325195831_upgrade_piggybak_variants_tables.rb
57
41
  - lib/acts_as_sellable_with_variants.rb
58
- - lib/associated_bubbling_validator.rb
42
+ - lib/piggybak_variants.rb
59
43
  - lib/piggybak_variants/engine.rb
60
44
  - lib/piggybak_variants/version.rb
61
- - lib/piggybak_variants.rb
62
- - MIT-LICENSE
63
- - Rakefile
64
- - README.md
45
+ - test/dummy/README.rdoc
46
+ - test/dummy/Rakefile
65
47
  - test/dummy/app/assets/javascripts/application.js
66
48
  - test/dummy/app/assets/stylesheets/application.css
67
49
  - test/dummy/app/controllers/application_controller.rb
68
50
  - test/dummy/app/helpers/application_helper.rb
69
51
  - test/dummy/app/views/layouts/application.html.erb
52
+ - test/dummy/config.ru
70
53
  - test/dummy/config/application.rb
71
54
  - test/dummy/config/boot.rb
72
55
  - test/dummy/config/database.yml
@@ -82,70 +65,66 @@ files:
82
65
  - test/dummy/config/initializers/wrap_parameters.rb
83
66
  - test/dummy/config/locales/en.yml
84
67
  - test/dummy/config/routes.rb
85
- - test/dummy/config.ru
86
68
  - test/dummy/public/404.html
87
69
  - test/dummy/public/422.html
88
70
  - test/dummy/public/500.html
89
71
  - test/dummy/public/favicon.ico
90
- - test/dummy/Rakefile
91
- - test/dummy/README.rdoc
92
72
  - test/dummy/script/rails
93
73
  - test/integration/navigation_test.rb
94
74
  - test/piggybak_variants_test.rb
95
75
  - test/test_helper.rb
96
76
  homepage: http://www.piggybak.org
97
77
  licenses: []
78
+ metadata: {}
98
79
  post_install_message:
99
80
  rdoc_options: []
100
81
  require_paths:
101
82
  - lib
102
83
  required_ruby_version: !ruby/object:Gem::Requirement
103
- none: false
104
84
  requirements:
105
- - - ! '>='
85
+ - - ">="
106
86
  - !ruby/object:Gem::Version
107
87
  version: '0'
108
88
  required_rubygems_version: !ruby/object:Gem::Requirement
109
- none: false
110
89
  requirements:
111
- - - ! '>='
90
+ - - ">="
112
91
  - !ruby/object:Gem::Version
113
92
  version: '0'
114
93
  requirements: []
115
94
  rubyforge_project:
116
- rubygems_version: 1.8.24
95
+ rubygems_version: 2.2.2
117
96
  signing_key:
118
- specification_version: 3
97
+ specification_version: 4
119
98
  summary: Advanced variant support for Piggybak.
120
99
  test_files:
121
- - test/dummy/app/assets/javascripts/application.js
122
- - test/dummy/app/assets/stylesheets/application.css
100
+ - test/integration/navigation_test.rb
101
+ - test/piggybak_variants_test.rb
102
+ - test/test_helper.rb
103
+ - test/dummy/script/rails
104
+ - test/dummy/Rakefile
105
+ - test/dummy/README.rdoc
123
106
  - test/dummy/app/controllers/application_controller.rb
107
+ - test/dummy/app/assets/stylesheets/application.css
108
+ - test/dummy/app/assets/javascripts/application.js
124
109
  - test/dummy/app/helpers/application_helper.rb
125
110
  - test/dummy/app/views/layouts/application.html.erb
126
- - test/dummy/config/application.rb
127
- - test/dummy/config/boot.rb
128
- - test/dummy/config/database.yml
111
+ - test/dummy/config/locales/en.yml
129
112
  - test/dummy/config/environment.rb
130
- - test/dummy/config/environments/development.rb
113
+ - test/dummy/config/routes.rb
131
114
  - test/dummy/config/environments/production.rb
132
115
  - test/dummy/config/environments/test.rb
133
- - test/dummy/config/initializers/backtrace_silencers.rb
134
- - test/dummy/config/initializers/inflections.rb
135
- - test/dummy/config/initializers/mime_types.rb
116
+ - test/dummy/config/environments/development.rb
117
+ - test/dummy/config/initializers/wrap_parameters.rb
136
118
  - test/dummy/config/initializers/secret_token.rb
119
+ - test/dummy/config/initializers/mime_types.rb
137
120
  - test/dummy/config/initializers/session_store.rb
138
- - test/dummy/config/initializers/wrap_parameters.rb
139
- - test/dummy/config/locales/en.yml
140
- - test/dummy/config/routes.rb
141
- - test/dummy/config.ru
142
- - test/dummy/public/404.html
143
- - test/dummy/public/422.html
121
+ - test/dummy/config/initializers/backtrace_silencers.rb
122
+ - test/dummy/config/initializers/inflections.rb
123
+ - test/dummy/config/boot.rb
124
+ - test/dummy/config/application.rb
125
+ - test/dummy/config/database.yml
144
126
  - test/dummy/public/500.html
127
+ - test/dummy/public/422.html
145
128
  - test/dummy/public/favicon.ico
146
- - test/dummy/Rakefile
147
- - test/dummy/README.rdoc
148
- - test/dummy/script/rails
149
- - test/integration/navigation_test.rb
150
- - test/piggybak_variants_test.rb
151
- - test/test_helper.rb
129
+ - test/dummy/public/404.html
130
+ - test/dummy/config.ru
@@ -1,66 +0,0 @@
1
- var piggybak_variants = {
2
- refreshControls : function(data) {
3
- if(data.all_selected) { // if all selected
4
- var selected_key = data.selected.sort().join('_');
5
- if(variant_map[selected_key]) {
6
- $('.variant_options form').show();
7
- $('#sellable_id').val(variant_map[selected_key].id);
8
- $('#variant_price span').html(variant_map[selected_key].price);
9
- } else { // if variant not available
10
- $('.variant_options form').hide();
11
- $('.unavailable').show();
12
- }
13
- } else { // if not all selected
14
- $('.all_selected').show();
15
- $('.variant_options form').hide();
16
- }
17
- },
18
- extractRadioButtonValues: function() {
19
- var all_selected = true;
20
- var selected = new Array();
21
- $.each($('.option'), function(i, j) {
22
- var option_id = $(j).attr('id');
23
- if($('input[name=' + option_id + ']:checked').length) {
24
- selected.push($('input[name=' + option_id + ']:checked').val());
25
- } else {
26
- all_selected = false;
27
- }
28
- });
29
- return { all_selected: all_selected, selected: selected };
30
- },
31
- extractDropdownValues: function() {
32
- var all_selected = true;
33
- // TODO: Nice to see if easier way to select by value, but select[value=""] doesn't work
34
- $('.variant_options select').each(function() {
35
- if ($(this).val() == '') {
36
- all_selected = false;
37
- }
38
- });
39
- if(!all_selected) {
40
- return { all_selected: false, selected: '' };
41
- }
42
-
43
- var selected = new Array();
44
- $.each($('.variant_options .option select'), function(i, j) {
45
- selected.push($(this).val());
46
- });
47
- return { all_selected: true, selected: selected};
48
- },
49
- toggleVariantForm : function() {
50
- $('.unavailable, .all_selected').hide();
51
- var data;
52
- if ($('.variant_options input[type=radio]').length > 0){
53
- data = piggybak_variants.extractRadioButtonValues();
54
- } else {
55
- data = piggybak_variants.extractDropdownValues();
56
- };
57
- piggybak_variants.refreshControls(data);
58
- }
59
- }
60
-
61
- $(function() {
62
- $('.variant_options input[type=radio]').click(function() { piggybak_variants.toggleVariantForm(); });
63
- $('.variant_options select').change(function() { piggybak_variants.toggleVariantForm(); });
64
- piggybak_variants.toggleVariantForm();
65
- });
66
-
@@ -1,13 +0,0 @@
1
- /*
2
- * This is a manifest file that'll be compiled into application.css, which will include all the files
3
- * listed below.
4
- *
5
- * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
- * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
- *
8
- * You're free to add application-wide styles to this file and they'll appear at the top of the
9
- * compiled file, but it's generally better to create a new file per style scope.
10
- *
11
- *= require_self
12
- *= require_tree .
13
- */
@@ -1,21 +0,0 @@
1
- module ActiveRecord
2
- module Validations
3
- class AssociatedBubblingValidator < ActiveModel::EachValidator
4
- def validate_each(record, attribute, value)
5
- (value.is_a?(Array) ? value : [value]).each do |v|
6
- unless v.valid?
7
- v.errors.full_messages.each do |msg|
8
- record.errors.add(attribute, msg, options.merge(:value => value))
9
- end
10
- end
11
- end
12
- end
13
- end
14
-
15
- module ClassMethods
16
- def validates_associated_bubbling(*attr_names)
17
- validates_with AssociatedBubblingValidator, _merge_attributes(attr_names)
18
- end
19
- end
20
- end
21
- end