radiant-shop_variants-extension 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/.gitignore +1 -0
  2. data/README +3 -0
  3. data/Rakefile +138 -0
  4. data/VERSION +1 -0
  5. data/app/controllers/admin/shop/products/variant_templates_controller.rb +27 -0
  6. data/app/controllers/admin/shop/products/variants_controller.rb +60 -0
  7. data/app/controllers/admin/shop/variants_controller.rb +48 -0
  8. data/app/models/shop_product_variant.rb +36 -0
  9. data/app/models/shop_variant.rb +23 -0
  10. data/app/views/admin/shop/products/edit/buttons/_browse_templates.html.haml +1 -0
  11. data/app/views/admin/shop/products/edit/buttons/_new_variant.html.haml +1 -0
  12. data/app/views/admin/shop/products/edit/parts/_variants.html.haml +3 -0
  13. data/app/views/admin/shop/products/edit/popups/_browse_templates.html.haml +6 -0
  14. data/app/views/admin/shop/products/edit/popups/_new_variant.html.haml +16 -0
  15. data/app/views/admin/shop/products/edit/shared/_variant.html.haml +10 -0
  16. data/app/views/admin/shop/products/index/buttons/_variants.html.haml +1 -0
  17. data/app/views/admin/shop/variants/edit/_foot.html.haml +9 -0
  18. data/app/views/admin/shop/variants/edit/_form.html.haml +13 -0
  19. data/app/views/admin/shop/variants/edit/_head.html.haml +4 -0
  20. data/app/views/admin/shop/variants/edit/_inputs.html.haml +2 -0
  21. data/app/views/admin/shop/variants/edit/_meta.html.haml +8 -0
  22. data/app/views/admin/shop/variants/edit/_parts.html.haml +9 -0
  23. data/app/views/admin/shop/variants/edit/_popups.html.haml +4 -0
  24. data/app/views/admin/shop/variants/edit/inputs/_name.html.haml +3 -0
  25. data/app/views/admin/shop/variants/edit/inputs/_options.html.haml +3 -0
  26. data/app/views/admin/shop/variants/edit.html.haml +11 -0
  27. data/app/views/admin/shop/variants/index/_foot.html.haml +5 -0
  28. data/app/views/admin/shop/variants/index/_head.html.haml +2 -0
  29. data/app/views/admin/shop/variants/index/_variant.html.haml +9 -0
  30. data/app/views/admin/shop/variants/index/buttons/_add_variant.html.haml +1 -0
  31. data/app/views/admin/shop/variants/index/buttons/_categories.html.haml +1 -0
  32. data/app/views/admin/shop/variants/index.html.haml +13 -0
  33. data/app/views/admin/shop/variants/new.html.haml +11 -0
  34. data/app/views/admin/shop/variants/remove.html.haml +12 -0
  35. data/config/locales/en.yml +14 -0
  36. data/config/routes.rb +16 -0
  37. data/cucumber.yml +1 -0
  38. data/db/migrate/20101015162238_setup_shop_variants.rb +21 -0
  39. data/features/support/env.rb +16 -0
  40. data/features/support/paths.rb +14 -0
  41. data/lib/shop_variants/controllers/products_controller.rb +44 -0
  42. data/lib/shop_variants/interface/variants.rb +34 -0
  43. data/lib/shop_variants/models/product.rb +15 -0
  44. data/lib/shop_variants/tags/helpers.rb +29 -0
  45. data/lib/shop_variants/tags/product_variant.rb +52 -0
  46. data/lib/tasks/shop_variants_extension_tasks.rake +55 -0
  47. data/public/javascripts/admin/extensions/shop/variants/edit.js +38 -0
  48. data/public/stylesheets/sass/admin/extensions/shop/variants/edit.sass +0 -0
  49. data/radiant-shop_variants-extension.gemspec +114 -0
  50. data/shop_variants_extension.rb +21 -0
  51. data/spec/controllers/admin/shop/products/variant_templates_controller_spec.rb +53 -0
  52. data/spec/controllers/admin/shop/products/variants_controller_spec.rb +116 -0
  53. data/spec/controllers/admin/shop/variants_controller_spec.rb +67 -0
  54. data/spec/datasets/shop_product_variants.rb +22 -0
  55. data/spec/datasets/shop_variants.rb +17 -0
  56. data/spec/lib/shop_variants/tags/helpers_spec.rb +59 -0
  57. data/spec/lib/shop_variants/tags/product_variant_spec.rb +175 -0
  58. data/spec/models/shop_product_spec.rb +15 -0
  59. data/spec/models/shop_product_variant_spec.rb +92 -0
  60. data/spec/models/shop_variant_spec.rb +32 -0
  61. data/spec/spec.opts +4 -0
  62. data/spec/spec_helper.rb +23 -0
  63. metadata +151 -0
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ pkg
data/README ADDED
@@ -0,0 +1,3 @@
1
+ = Shop Variants
2
+
3
+ Description goes here
data/Rakefile ADDED
@@ -0,0 +1,138 @@
1
+ begin
2
+ require 'jeweler'
3
+ Jeweler::Tasks.new do |gem|
4
+ gem.name = "radiant-shop_variants-extension"
5
+ gem.summary = %Q{Shop Variants Extension for Radiant CMS}
6
+ gem.description = %Q{RadiantShop: Create variants of products, with alternative prices}
7
+ gem.email = "dk@dirkkelly.com"
8
+ gem.homepage = "http://github.com/thefrontiergroup/shop_variants"
9
+ gem.authors = ["Dirk Kelly"]
10
+ gem.add_dependency 'radiant-shop-extension'
11
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
12
+ end
13
+ Jeweler::GemcutterTasks.new
14
+ rescue LoadError
15
+ puts "Jeweler (or a dependency) not available. This is only required if you plan to package shop_variants as a gem."
16
+ end
17
+
18
+ # In rails 1.2, plugins aren't available in the path until they're loaded.
19
+ # Check to see if the rspec plugin is installed first and require
20
+ # it if it is. If not, use the gem version.
21
+
22
+ # Determine where the RSpec plugin is by loading the boot
23
+ unless defined? RADIANT_ROOT
24
+ ENV["RAILS_ENV"] = "test"
25
+ case
26
+ when ENV["RADIANT_ENV_FILE"]
27
+ require File.dirname(ENV["RADIANT_ENV_FILE"]) + "/boot"
28
+ when File.dirname(__FILE__) =~ %r{vendor/radiant/vendor/extensions}
29
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../")}/config/boot"
30
+ else
31
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../")}/config/boot"
32
+ end
33
+ end
34
+
35
+ require 'rake'
36
+ require 'rake/rdoctask'
37
+ require 'rake/testtask'
38
+
39
+ rspec_base = File.expand_path(RADIANT_ROOT + '/vendor/plugins/rspec/lib')
40
+ $LOAD_PATH.unshift(rspec_base) if File.exist?(rspec_base)
41
+ require 'spec/rake/spectask'
42
+ require 'cucumber'
43
+ require 'cucumber/rake/task'
44
+
45
+ # Cleanup the RADIANT_ROOT constant so specs will load the environment
46
+ Object.send(:remove_const, :RADIANT_ROOT)
47
+
48
+ extension_root = File.expand_path(File.dirname(__FILE__))
49
+
50
+ task :default => :spec
51
+ task :stats => "spec:statsetup"
52
+
53
+ desc "Run all specs in spec directory"
54
+ Spec::Rake::SpecTask.new(:spec) do |t|
55
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
56
+ t.spec_files = FileList['spec/**/*_spec.rb']
57
+ end
58
+
59
+ task :features => 'spec:integration'
60
+
61
+ namespace :spec do
62
+ desc "Run all specs in spec directory with RCov"
63
+ Spec::Rake::SpecTask.new(:rcov) do |t|
64
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
65
+ t.spec_files = FileList['spec/**/*_spec.rb']
66
+ t.rcov = true
67
+ t.rcov_opts = ['--exclude', 'spec', '--rails']
68
+ end
69
+
70
+ desc "Print Specdoc for all specs"
71
+ Spec::Rake::SpecTask.new(:doc) do |t|
72
+ t.spec_opts = ["--format", "specdoc", "--dry-run"]
73
+ t.spec_files = FileList['spec/**/*_spec.rb']
74
+ end
75
+
76
+ [:models, :controllers, :views, :helpers].each do |sub|
77
+ desc "Run the specs under spec/#{sub}"
78
+ Spec::Rake::SpecTask.new(sub) do |t|
79
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
80
+ t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"]
81
+ end
82
+ end
83
+
84
+ desc "Run the Cucumber features"
85
+ Cucumber::Rake::Task.new(:integration) do |t|
86
+ t.fork = true
87
+ t.cucumber_opts = ['--format', (ENV['CUCUMBER_FORMAT'] || 'pretty')]
88
+ # t.feature_pattern = "#{extension_root}/features/**/*.feature"
89
+ t.profile = "default"
90
+ end
91
+
92
+ # Setup specs for stats
93
+ task :statsetup do
94
+ require 'code_statistics'
95
+ ::STATS_DIRECTORIES << %w(Model\ specs spec/models)
96
+ ::STATS_DIRECTORIES << %w(View\ specs spec/views)
97
+ ::STATS_DIRECTORIES << %w(Controller\ specs spec/controllers)
98
+ ::STATS_DIRECTORIES << %w(Helper\ specs spec/views)
99
+ ::CodeStatistics::TEST_TYPES << "Model specs"
100
+ ::CodeStatistics::TEST_TYPES << "View specs"
101
+ ::CodeStatistics::TEST_TYPES << "Controller specs"
102
+ ::CodeStatistics::TEST_TYPES << "Helper specs"
103
+ ::STATS_DIRECTORIES.delete_if {|a| a[0] =~ /test/}
104
+ end
105
+
106
+ namespace :db do
107
+ namespace :fixtures do
108
+ desc "Load fixtures (from spec/fixtures) into the current environment's database. Load specific fixtures using FIXTURES=x,y"
109
+ task :load => :environment do
110
+ require 'active_record/fixtures'
111
+ ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym)
112
+ (ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) : Dir.glob(File.join(RAILS_ROOT, 'spec', 'fixtures', '*.{yml,csv}'))).each do |fixture_file|
113
+ Fixtures.create_fixtures('spec/fixtures', File.basename(fixture_file, '.*'))
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
119
+
120
+ desc 'Generate documentation for the shop_variants extension.'
121
+ Rake::RDocTask.new(:rdoc) do |rdoc|
122
+ rdoc.rdoc_dir = 'rdoc'
123
+ rdoc.title = 'ShopVariantsExtension'
124
+ rdoc.options << '--line-numbers' << '--inline-source'
125
+ rdoc.rdoc_files.include('README')
126
+ rdoc.rdoc_files.include('lib/**/*.rb')
127
+ end
128
+
129
+ # For extensions that are in transition
130
+ desc 'Test the shop_variants extension.'
131
+ Rake::TestTask.new(:test) do |t|
132
+ t.libs << 'lib'
133
+ t.pattern = 'test/**/*_test.rb'
134
+ t.verbose = true
135
+ end
136
+
137
+ # Load any custom rakefiles for extension
138
+ Dir[File.dirname(__FILE__) + '/tasks/*.rake'].sort.each { |f| require f }
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,27 @@
1
+ class Admin::Shop::Products::VariantTemplatesController < Admin::ResourceController
2
+
3
+ model_class ShopVariant
4
+
5
+ def update
6
+ error = 'Could not attach all Variants to Product.'
7
+
8
+ @shop_product = ShopProduct.find(params[:product_id])
9
+
10
+ if @shop_product.apply_variant_template(@shop_variant)
11
+ respond_to do |format|
12
+ format.html {
13
+ redirect_to [ :edit_admin, @shop_product ]
14
+ }
15
+ end
16
+ else
17
+ respond_to do |format|
18
+ format.html {
19
+ flash[:error] = error
20
+ redirect_to [ :edit_admin, @shop_product ]
21
+ }
22
+ end
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,60 @@
1
+ class Admin::Shop::Products::VariantsController < Admin::ResourceController
2
+
3
+ model_class ShopProductVariant
4
+
5
+ before_filter :find_product
6
+
7
+ def create
8
+ notice = 'Successfully created variant.'
9
+ error = 'Could not create variant.'
10
+
11
+ begin
12
+ @shop_product_variant.attributes = params[:shop_product_variant]
13
+ @shop_product_variant.save!
14
+
15
+ respond_to do |format|
16
+ format.html {
17
+ redirect_to edit_admin_shop_product_path(@shop_product)
18
+ }
19
+ format.js { render :partial => '/admin/shop/products/edit/shared/variant', :locals => { :variant => @shop_product_variant } }
20
+ end
21
+ rescue
22
+ respond_to do |format|
23
+ format.html {
24
+ flash[:error] = error
25
+ redirect_to edit_admin_shop_product_path(@shop_product)
26
+ }
27
+ format.js { render :text => error, :status => :unprocessable_entity }
28
+ end
29
+ end
30
+ end
31
+
32
+ def destroy
33
+ notice = 'Successfully destroyed variant.'
34
+ error = 'Could not destroy variant.'
35
+
36
+ if @shop_product_variant.destroy
37
+ respond_to do |format|
38
+ format.html {
39
+ redirect_to edit_admin_shop_product_path(@shop_product)
40
+ }
41
+ format.js { render :text => notice, :status => :ok }
42
+ end
43
+ else
44
+ respond_to do |format|
45
+ format.html {
46
+ flash[:error] = error
47
+ redirect_to edit_admin_shop_product_path(@shop_product)
48
+ }
49
+ format.js { render :text => error, :status => :unprocessable_entity }
50
+ end
51
+ end
52
+ end
53
+
54
+ private
55
+
56
+ def find_product
57
+ @shop_product = @shop_product_variant.product || ShopProduct.find(params[:product_id])
58
+ end
59
+
60
+ end
@@ -0,0 +1,48 @@
1
+ class Admin::Shop::VariantsController < Admin::ResourceController
2
+
3
+ model_class ShopVariant
4
+
5
+ before_filter :config_global
6
+ before_filter :config_index, :only => [ :index ]
7
+ before_filter :config_new, :only => [ :new, :create ]
8
+ before_filter :config_edit, :only => [ :edit, :update ]
9
+ before_filter :assets_global
10
+ before_filter :assets_index, :only => [ :index ]
11
+ before_filter :assets_edit, :only => [ :edit, :update ]
12
+
13
+ private
14
+
15
+ def config_global
16
+ @inputs ||= []
17
+ @meta ||= []
18
+ @buttons ||= []
19
+ @parts ||= []
20
+ @popups ||= []
21
+
22
+ @inputs << 'name'
23
+ @inputs << 'options'
24
+ end
25
+
26
+ def config_index
27
+ @buttons << 'add_variant'
28
+ @buttons << 'categories'
29
+ end
30
+
31
+ def config_new
32
+ end
33
+
34
+ def config_edit
35
+ end
36
+
37
+ def assets_global
38
+ include_stylesheet 'admin/extensions/shop/edit'
39
+ include_stylesheet 'admin/extensions/shop/index'
40
+ end
41
+
42
+ def assets_index
43
+ end
44
+
45
+ def assets_edit
46
+ end
47
+
48
+ end
@@ -0,0 +1,36 @@
1
+ class ShopProductVariant < ActiveRecord::Base
2
+
3
+ belongs_to :product, :class_name => 'ShopProduct', :foreign_key => :product_id
4
+
5
+ validates_presence_of :product
6
+ validates_presence_of :name
7
+ validates_uniqueness_of :name, :scope => :product_id
8
+
9
+ belongs_to :created_by, :class_name => 'User'
10
+ belongs_to :updated_by, :class_name => 'User'
11
+
12
+ has_many :line_items, :class_name => 'ShopLineItem', :foreign_key => :item_id, :dependent => :destroy
13
+ has_many :orders, :class_name => 'ShopOrder', :through => :line_items, :uniq => true
14
+ has_many :discountables, :class_name => 'ShopDiscountable', :foreign_key => :discounted_id
15
+ has_many :discounts, :class_name => 'ShopDiscount', :through => :discountables
16
+
17
+ # Returns the price of the variant plus the product price
18
+ def price
19
+ price = product.price
20
+ if read_attribute(:price).present?
21
+ price = read_attribute(:price) + product.price
22
+ end
23
+ price
24
+ end
25
+
26
+ # Returns a mixed sku of product and variant name
27
+ def sku
28
+ %{#{product.sku}-#{ShopProduct.to_sku(name)}}
29
+ end
30
+
31
+ # Returns slug of the product
32
+ def slug
33
+ product.slug
34
+ end
35
+
36
+ end
@@ -0,0 +1,23 @@
1
+ class ShopVariant < ActiveRecord::Base
2
+
3
+ belongs_to :created_by, :class_name => 'User'
4
+ belongs_to :updated_by, :class_name => 'User'
5
+
6
+ validates_presence_of :name
7
+ validates_uniqueness_of :name
8
+ validates_presence_of :options_json
9
+
10
+ def options
11
+ options = {}
12
+ if self.options_json.present?
13
+ options = ActiveSupport::JSON.decode(self.options_json)
14
+ options = Forms::Config.deep_symbolize_keys(options)
15
+ end
16
+ options
17
+ end
18
+
19
+ def options=(options)
20
+ self.options_json = ActiveSupport::JSON.encode(options)
21
+ end
22
+
23
+ end
@@ -0,0 +1 @@
1
+ = link_to t('apply_template'), '#browse_templates_popup', :class => 'popup button'
@@ -0,0 +1 @@
1
+ = link_to "#{image('plus')} #{t('new_variant')}", '#new_variant_popup', :class => 'popup button'
@@ -0,0 +1,3 @@
1
+ %ul#variants
2
+ - f.fields_for :variants do |vf|
3
+ = render :partial => 'admin/shop/products/edit/shared/variant', :locals => { :vf => vf }
@@ -0,0 +1,6 @@
1
+ %h3.title Variant Templates
2
+
3
+ %ul#templates
4
+ = render :partial => '/admin/shop/products/edit/shared/template', :collection => ShopVariant.all
5
+
6
+ %a#browse_templates_popup_close.close{ :href => '#browse_templates_popup_close' }
@@ -0,0 +1,16 @@
1
+ %h3.title New Variant
2
+
3
+ .popup_content
4
+ - form_for :shop_product_variant, :url => admin_shop_product_variants_path(@shop_product.id) do |f|
5
+ = f.hidden_field :product_id, :value => @shop_product.id
6
+ %ol
7
+ %li.name
8
+ = f.label :name
9
+ = f.text_field :name
10
+ %li.price
11
+ = f.label :price, t('price_variation')
12
+ = f.text_field :price
13
+ %li.submit
14
+ = f.submit 'Create'
15
+
16
+ %a#new_variant_popup.close{ :href => '#new_variant_popup' }
@@ -0,0 +1,10 @@
1
+ %li.variant{ :id => "product_#{@shop_product.id}_variant_#{vf.object.id}", :'data-variant_id' => vf.object.id }
2
+ %span.name
3
+ = vf.text_field :name
4
+ %span.price
5
+ = vf.label :price, '$'
6
+ = vf.text_field :price, :value => input_currency(vf.object.read_attribute(:price))
7
+ %span.value
8
+ = number_to_currency(vf.object.price)
9
+ %span.actions
10
+ %span.delete
@@ -0,0 +1 @@
1
+ = link_to t("variants"), admin_shop_variants_path
@@ -0,0 +1,9 @@
1
+ - render_region :foot do |foot|
2
+ - foot.buttons do
3
+ %p.buttons
4
+ = save_model_button(@shop_variant)
5
+ = save_model_and_continue_editing_button(@shop_variant)
6
+ = t('or')
7
+ = link_to t('cancel'), admin_shop_variants_path
8
+ - foot.timestamp do
9
+ = updated_stamp @shop_variant
@@ -0,0 +1,13 @@
1
+ - form_for [:admin, @shop_variant], :html => {'data-onsubmit_status'=>"Saving Changes&#8230;"} do |f|
2
+ - render_region :form do |form|
3
+ - form.inputs do
4
+ = render :partial => '/admin/shop/variants/edit/inputs', :locals => { :f => f }
5
+
6
+ - form.meta do
7
+ = render :partial => '/admin/shop/variants/edit/meta', :locals => { :f => f }
8
+
9
+ - form.parts do
10
+ = render :partial => '/admin/shop/variants/edit/parts', :locals => { :f => f }
11
+
12
+ - form.foot do
13
+ = render :partial => 'admin/shop/variants/edit/foot', :locals => { :f => f }
@@ -0,0 +1,4 @@
1
+ %h1
2
+ = @page_title
3
+ - @buttons.each do |button|
4
+ = render :partial => "admin/shop/variants/edit/buttons/#{button}"
@@ -0,0 +1,2 @@
1
+ - @inputs.each do |input|
2
+ = render :partial => "admin/shop/variants/edit/inputs/#{input}", :locals => { :f => f }
@@ -0,0 +1,8 @@
1
+ - if @meta.present?
2
+ .drawer
3
+ .drawer_contents#attributes
4
+ %table.fieldset
5
+ - @meta.each do |meta|
6
+ = render :partial => "admin/shop/variants/edit/meta/#{meta}", :locals => { :f => f }
7
+ .drawer_handle
8
+ %a.toggle{:href=>'#attributes', :rel=>"toggle[attributes]", :class=>"#{(meta_errors? ? 'less' : 'more')}"}= meta_label
@@ -0,0 +1,9 @@
1
+ #tab_control
2
+ #tabs.tabs
3
+ #tab_toolbar
4
+ #pages.pages
5
+ = hidden_field_tag 'page_part_index_field' #important
6
+ - @parts.each do |part|
7
+ .page{:id => "variant_page_#{part}", 'data-caption'=>h(part)}
8
+ .part{:id => "variant_part_#{part}"}
9
+ = render :partial => "admin/shop/variants/edit/parts/#{part}", :locals => { :f => f }
@@ -0,0 +1,4 @@
1
+ #popups
2
+ - @popups.each do |popup|
3
+ .popup{ :id => "#{popup}_popup"}
4
+ = render :partial => "admin/shop/variants/edit/popups/#{popup}"
@@ -0,0 +1,3 @@
1
+ %p.title
2
+ %label{:for => 'shop_variant_name'}= t('name')
3
+ = f.text_field :name, :class => 'textbox', :maxlenth => 255
@@ -0,0 +1,3 @@
1
+ %p.title
2
+ %label{:for => 'shop_variant_options'}= t('options')
3
+ = f.text_field :options_json, :class => 'textbox', :maxlenth => 255
@@ -0,0 +1,11 @@
1
+ - @page_title = @shop_variant.name
2
+
3
+ - render_region :main do |main|
4
+ - main.head do
5
+ = render 'admin/shop/variants/edit/head'
6
+
7
+ - main.popups do
8
+ = render 'admin/shop/variants/edit/popups'
9
+
10
+ - main.form do
11
+ = render 'admin/shop/variants/edit/form'
@@ -0,0 +1,5 @@
1
+ %ul
2
+ - render_region :foot do |foot|
3
+ - foot.buttons do
4
+ - @buttons.each do |button|
5
+ %li= render :partial => "admin/shop/variants/index/buttons/#{button}"
@@ -0,0 +1,2 @@
1
+ - render_region :head do |head|
2
+ - nil
@@ -0,0 +1,9 @@
1
+ %li.variant.object{:id => "variant_#{variant.id}", :'data-id' => variant.id}
2
+ .attributes
3
+ %span.name.attribute
4
+ - render_region :body do |body|
5
+ - body.name do
6
+ %span.name.attribute= link_to variant.name, edit_admin_shop_variant_path(variant)
7
+ - body.modify do
8
+ .modify
9
+ %span.remove= link_to t('remove'), remove_admin_shop_variant_path(variant)
@@ -0,0 +1 @@
1
+ = link_to image('plus') + " " + t("add_variant"), new_admin_shop_variant_path
@@ -0,0 +1 @@
1
+ = link_to t("products"), admin_shop_products_path
@@ -0,0 +1,13 @@
1
+ - @page_title = t('variants') + ' - ' + default_page_title
2
+
3
+ .outset
4
+
5
+ #head.min
6
+ = render :partial => '/admin/shop/variants/index/head'
7
+
8
+ #variants_map.map
9
+ %ul#variants
10
+ = render :partial => '/admin/shop/variants/index/variant', :collection => @shop_variants
11
+
12
+ #actions
13
+ = render :partial => '/admin/shop/variants/index/foot'
@@ -0,0 +1,11 @@
1
+ - @page_title = t('new_variant')
2
+
3
+ - render_region :main do |main|
4
+ - main.head do
5
+ = render 'admin/shop/variants/edit/head'
6
+
7
+ - main.popups do
8
+ = render 'admin/shop/variants/edit/popups'
9
+
10
+ - main.form do
11
+ = render 'admin/shop/variants/edit/form'
@@ -0,0 +1,12 @@
1
+ %h1
2
+ = t('remove_variant')
3
+
4
+ %p
5
+ = t('text.remove_variant.warning')
6
+
7
+ - form_for [:admin, @shop_variant.becomes(ShopVariant)], :html => {:method => :delete, 'data-onsubmit_status'=>"Removing Variant&#8230;"} do
8
+
9
+ %p.buttons
10
+ %input.button{:type=>"submit", :value => t('delete_variant') }/
11
+ = t('or')
12
+ = link_to t('cancel'), admin_shop_variants_path
@@ -0,0 +1,14 @@
1
+ ---
2
+ en:
3
+ shop variants: Shop Variants
4
+ variants: Variants
5
+ add_variant: Add Variant
6
+ new_variant: New Variant
7
+ options: Options
8
+ remove_variant: Remove Variant
9
+ text:
10
+ remove_variant:
11
+ warning: Removing a variant is irreversible
12
+ delete_variant: Delete Variant
13
+ price_variation: Price Variant
14
+ apply_template: Apply Template
data/config/routes.rb ADDED
@@ -0,0 +1,16 @@
1
+ ActionController::Routing::Routes.draw do |map|
2
+
3
+
4
+ map.namespace :admin do |admin|
5
+ admin.namespace :shop, :member => { :remove => :get } do |shop|
6
+
7
+ shop.resources :products, :except => :new, :collection => { :sort => :put } do |product|
8
+ product.resources :variants, :controller => 'products/variants', :only => [ :create, :destroy]
9
+ product.resources :variant_templates, :controller => 'products/variant_templates', :only => [ :update ]
10
+ end
11
+ shop.resources :variants
12
+
13
+ end
14
+ end
15
+
16
+ end
data/cucumber.yml ADDED
@@ -0,0 +1 @@
1
+ default: --format progress features --tags ~@proposed,~@in_progress
@@ -0,0 +1,21 @@
1
+ class SetupShopVariants < ActiveRecord::Migration
2
+ def self.up
3
+ create_table "shop_variants", :force => true do |t|
4
+ t.string "name"
5
+ t.text "options_json"
6
+ t.integer "created_by_id"
7
+ t.integer "updated_by_id"
8
+ t.datetime "created_at"
9
+ t.datetime "updated_at"
10
+ end
11
+
12
+ create_table "shop_product_variants", :force => true do |t|
13
+ t.string "name"
14
+ t.decimal "price"
15
+ t.integer "product_id"
16
+ end
17
+ end
18
+
19
+ def self.down
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ # Sets up the Rails environment for Cucumber
2
+ ENV["RAILS_ENV"] = "test"
3
+ # Extension root
4
+ extension_env = File.expand_path(File.dirname(__FILE__) + '/../../../../../config/environment')
5
+ require extension_env+'.rb'
6
+
7
+ Dir.glob(File.join(RADIANT_ROOT, "features", "**", "*.rb")).each {|step| require step}
8
+
9
+ Cucumber::Rails::World.class_eval do
10
+ include Dataset
11
+ datasets_directory "#{RADIANT_ROOT}/spec/datasets"
12
+ Dataset::Resolver.default = Dataset::DirectoryResolver.new("#{RADIANT_ROOT}/spec/datasets", File.dirname(__FILE__) + '/../../spec/datasets', File.dirname(__FILE__) + '/../datasets')
13
+ self.datasets_database_dump_path = "#{Rails.root}/tmp/dataset"
14
+
15
+ # dataset :shop_variants
16
+ end
@@ -0,0 +1,14 @@
1
+ def path_to(page_name)
2
+ case page_name
3
+
4
+ when /the homepage/i
5
+ root_path
6
+
7
+ when /login/i
8
+ login_path
9
+ # Add more page name => path mappings here
10
+
11
+ else
12
+ raise "Can't find mapping from \"#{page_name}\" to a path."
13
+ end
14
+ end