caboose-cms 0.6.11 → 0.6.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YWVlNDZhOWUyYjhjNDhmNmQ5NGEzZGVjMGZlNmJlOGQ5MDdiMTE1Yg==
4
+ MmZmZjJjMjE2ZTgyZjc3ZjEwYjVkODMxNzA2ODY2NjBmY2M1NmU5ZA==
5
5
  data.tar.gz: !binary |-
6
- Mjg5ZGRhZTMzNjNiZTVhMDRjNWMyODU5NWVhMmNhYTc5MmEzN2Q5MA==
6
+ YmUxZjQ5ZTc3YmJlZWRiZGE2MjY2OTFhY2I4Y2IxYzJhNzNiMjVlMw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZGZkMGNjMDc4NTAzMjU0Yjc2ZjQ3M2Y5MTgyNDBhODQ1MTZlN2YxMjM2NjUy
10
- ZTU0MTAyNjc2MDkzNTFkNGQ3MzFiZGM4YWQyZjY1Yzg2MjkzYjUzNzJmM2Nm
11
- MTRkYzZmZDgxNTQ4NGUzOTljOTFjMzIzYjFiNDUxNTljZDQwYWU=
9
+ MTU4NTM4YTY2MDVkOWU1MTMzYzIwYWY1YzNmMDZmZDc2YzVhODdmMmM0Njgx
10
+ ZTAyZDg0Yzg4YmUxMmQ4MTVlZDI1YzQxNzM0NmRjMTQ2ODE0YzE3ZGIyMjJi
11
+ NjUyMzBhZjZkYTNhMTNiZTI4NDY1NzBjMDQ2MzkzMzVlZjUwMmY=
12
12
  data.tar.gz: !binary |-
13
- OGQwMGRlMjFmMjgyNTUzZDliOTMzN2RjZmFhYzEwMWI4MjUwYzcxYTBhNmU5
14
- MjQ5N2IzZDRkNGFiODg1YWY1YThiNmJmNzc3YzdkYzJmNDg0MWU3ZWY3ZWRl
15
- ZmYwMDY5NGEwYjBjNjFjODQxMTgxMTgzZmRiZjRjMTU0YmE3OWM=
13
+ OTEwNjAzN2YyMDgwNGI4YTkyZDk2M2RjYmVlZmQyOGUwYmExOTQ2ODk3MmRl
14
+ OGIwNjMxZTBiYzJjZDQzYzFmNTEyNTE3YjQzYzY4MDVlNmU4Y2RjYWU4YTE3
15
+ MTgxNDBhODQyNjQ0N2M5ZTM5ZDVkMWYwZGVmMjBlNTE0MGUxZWY=
@@ -40,7 +40,7 @@ IndexTable.prototype = {
40
40
  // fixed_placeholder: false,
41
41
  // width: 200,
42
42
  // }]
43
- fields: [],
43
+ fields: [],
44
44
 
45
45
  //============================================================================
46
46
  // Additional parameters
@@ -84,7 +84,9 @@ IndexTable.prototype = {
84
84
  bulk_import_fields: false,
85
85
  no_models_text: "There are no models right now.",
86
86
  new_model_text: 'New',
87
- new_model_fields: [{ name: 'name', nice_name: 'Name', type: 'text', width: 400 }],
87
+ new_model_fields: [{ name: 'name', nice_name: 'Name', type: 'text', width: 400 }],
88
+ search_fields: false,
89
+ custom_row_controls: false,
88
90
 
89
91
  //============================================================================
90
92
  // End of parameters
@@ -113,7 +115,7 @@ IndexTable.prototype = {
113
115
  if (f.editable == null) f.editable = true;
114
116
  });
115
117
  this.init_local_storage();
116
- this.get_visible_columns();
118
+ this.get_visible_columns();
117
119
 
118
120
  $(window).on('hashchange', function() { that.refresh(); });
119
121
  this.refresh();
@@ -123,8 +125,8 @@ IndexTable.prototype = {
123
125
  {
124
126
  var b = {};
125
127
 
126
- // Get the hash values
127
- var a = window.location.hash;
128
+ // Get the querystring values
129
+ a = window.location.search;
128
130
  if (a.length > 0)
129
131
  {
130
132
  a = a.substr(1).split('&');
@@ -134,10 +136,21 @@ IndexTable.prototype = {
134
136
  if (p.length == 1) b[p[0]] = "";
135
137
  else b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " "));
136
138
  }
137
- }
139
+ }
138
140
 
139
- // Get the querystring values
140
- a = window.location.search;
141
+ // Redirect to the hash page if we have a querystring
142
+ if (!$.isEmptyObject(b))
143
+ {
144
+ var qs = [];
145
+ for (var i in b)
146
+ qs[qs.length] = '' + i + '=' + b[i];
147
+ var uri = window.location.pathname + '#' + qs.join('&');
148
+ window.location = uri;
149
+ return;
150
+ };
151
+
152
+ // Get the hash values
153
+ var a = window.location.hash;
141
154
  if (a.length > 0)
142
155
  {
143
156
  a = a.substr(1).split('&');
@@ -147,7 +160,7 @@ IndexTable.prototype = {
147
160
  if (p.length == 1) b[p[0]] = "";
148
161
  else b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " "));
149
162
  }
150
- }
163
+ }
151
164
 
152
165
  // Set both hash and querystring values in the pager
153
166
  for (var i in b)
@@ -166,13 +179,17 @@ IndexTable.prototype = {
166
179
  //}
167
180
  },
168
181
 
169
- refresh: function()
182
+ refresh: function(skip_parse_querystring)
170
183
  {
171
- this.pager = { options: { page: 1 }, params: {}};
172
- this.parse_querystring();
173
-
174
184
  var that = this;
175
- var $el = $('#' + this.container + '_table_container').length > 0 ? $('#' + this.container + '_table_container') : $('#' + this.container);
185
+
186
+ if (!skip_parse_querystring)
187
+ {
188
+ that.pager = { options: { page: 1 }, params: {}};
189
+ that.parse_querystring();
190
+ }
191
+
192
+ var $el = $('#' + that.container + '_table_container').length > 0 ? $('#' + that.container + '_table_container') : $('#' + that.container);
176
193
  $el.html("<p class='loading'>Refreshing...</p>");
177
194
  $.ajax({
178
195
  url: that.refresh_url,
@@ -187,8 +204,7 @@ IndexTable.prototype = {
187
204
  var m = that.models[i];
188
205
  m.id = parseInt(m.id);
189
206
  }
190
- that.print();
191
- that.populate_search_form();
207
+ that.print();
192
208
  },
193
209
  error: function() { $('#' + this.container).html("<p class='note error'>Error retrieving data.</p>"); }
194
210
  });
@@ -252,19 +268,22 @@ IndexTable.prototype = {
252
268
  else
253
269
  {
254
270
  var controls = $('<p/>');
255
- if (this.allow_add ) controls.append($('<input/>').attr('type', 'button').attr('id', this.container + '_new' ).val(that.new_model_text ).click(function(e) { that.new_form(); })).append(' ');
256
- controls.append($('<input/>').attr('type', 'button').attr('id', this.container + '_toggle_columns' ).val('Show/Hide Columns' ).click(function(e) { that.toggle_columns(); })).append(' ');
257
- if (this.allow_bulk_edit ) controls.append($('<input/>').attr('type', 'button').attr('id', this.container + '_bulk_edit' ).val('Bulk Edit' ).click(function(e) { that.bulk_edit(); })).append(' ');
258
- if (this.allow_bulk_import ) controls.append($('<input/>').attr('type', 'button').attr('id', this.container + '_bulk_import' ).val('Import' ).click(function(e) { that.bulk_import(); })).append(' ');
259
- if (this.allow_duplicate ) controls.append($('<input/>').attr('type', 'button').attr('id', this.container + '_duplicate' ).val('Duplicate' ).click(function(e) { that.duplicate(); })).append(' ');
260
- if (this.allow_bulk_delete ) controls.append($('<input/>').attr('type', 'button').attr('id', this.container + '_bulk_delete' ).val('Delete' ).click(function(e) { that.bulk_delete(); })).append(' ');
271
+ if (this.allow_add ) controls.append($('<input/>').attr('type', 'button').attr('id', this.container + '_new' ).val(that.new_model_text ).click(function(e) { that.new_form(); })).append(' ');
272
+ controls.append($('<input/>').attr('type', 'button').attr('id', this.container + '_toggle_columns' ).val('Show/Hide Columns' ).click(function(e) { that.toggle_columns(); })).append(' ');
273
+ if (this.search_fields ) controls.append($('<input/>').attr('type', 'button').attr('id', this.container + '_toggle_search' ).val('Show/Hide Search Form' ).click(function(e) { that.toggle_search_form(); })).append(' ');
274
+ if (this.allow_bulk_edit ) controls.append($('<input/>').attr('type', 'button').attr('id', this.container + '_bulk_edit' ).val('Bulk Edit' ).click(function(e) { that.bulk_edit(); })).append(' ');
275
+ if (this.allow_bulk_import ) controls.append($('<input/>').attr('type', 'button').attr('id', this.container + '_bulk_import' ).val('Import' ).click(function(e) { that.bulk_import(); })).append(' ');
276
+ if (this.allow_duplicate ) controls.append($('<input/>').attr('type', 'button').attr('id', this.container + '_duplicate' ).val('Duplicate' ).click(function(e) { that.duplicate(); })).append(' ');
277
+ if (this.allow_bulk_delete ) controls.append($('<input/>').attr('type', 'button').attr('id', this.container + '_bulk_delete' ).val('Delete' ).click(function(e) { that.bulk_delete(); })).append(' ');
261
278
 
262
279
  var c = $('#' + that.container);
263
- c.empty()
264
- .append($('<div/>').attr('id', that.container + '_controls').append(controls))
265
- .append($('<div/>').attr('id', that.container + '_message'))
266
- .append($('<div/>').attr('id', that.container + '_table_container').append(table))
267
- .append($('<div/>').attr('id', that.container + '_pager').append(pager_div));
280
+ c.empty();
281
+ c.append($('<div/>').attr('id', that.container + '_controls').append(controls));
282
+ //if (this.search_fields)
283
+ // c.append(that.search_form());
284
+ c.append($('<div/>').attr('id', that.container + '_message'));
285
+ c.append($('<div/>').attr('id', that.container + '_table_container').append(table));
286
+ c.append($('<div/>').attr('id', that.container + '_pager').append(pager_div));
268
287
 
269
288
  if (model_count == 0)
270
289
  {
@@ -298,14 +317,6 @@ IndexTable.prototype = {
298
317
  }
299
318
  },
300
319
 
301
- populate_search_form: function()
302
- {
303
- var pp = this.pager_params();
304
- $.each(this.search_form_fields, function(i, f) {
305
- $('#' + f).val(pp[f]);
306
- });
307
- },
308
-
309
320
  all_models_selected: function()
310
321
  {
311
322
  var that = this;
@@ -492,7 +503,7 @@ IndexTable.prototype = {
492
503
  cols[col] = checked;
493
504
  localStorage.setItem(this.container + '_cols', JSON.stringify(cols));
494
505
  },
495
-
506
+
496
507
  toggle_columns: function()
497
508
  {
498
509
  var that = this;
@@ -762,7 +773,9 @@ IndexTable.prototype = {
762
773
  {
763
774
  var p = this.pager_params(h);
764
775
  var qs = [];
765
- $.each(p, function(k,v) { qs.push('' + k + '=' + encodeURIComponent(v)); });
776
+ $.each(p, function(k,v) {
777
+ if (k != '[object Object]') qs.push('' + k + '=' + encodeURIComponent(v));
778
+ });
766
779
  return '#' + qs.join('&');
767
780
  },
768
781
 
@@ -842,5 +855,78 @@ IndexTable.prototype = {
842
855
  });
843
856
  },
844
857
 
858
+ //============================================================================
859
+ // Seach Form
860
+ //============================================================================
861
+
862
+ toggle_search_form: function()
863
+ {
864
+ var that = this;
865
+ var form = that.search_form();
866
+ that.show_message(form, 'toggle_search_form');
867
+ },
868
+
869
+ search_form: function()
870
+ {
871
+ var that = this;
872
+
873
+ var pp = that.pager_params();
874
+ var tbody = $('<tbody/>');
875
+ $.each(that.search_fields, function(i, f) {
876
+ var tr = $('<tr/>').append($('<td/>').attr('align', 'right').html(f.nice_name));
877
+ var td = $('<td/>');
878
+ if (f.type == 'text')
879
+ {
880
+ td.append($('<input/>').attr('name', f.name).attr('id', f.name).val(pp[f.name]));
881
+ }
882
+ else if (f.type == 'select')
883
+ {
884
+ var options = false;
885
+ if (!f.options && f.options_url)
886
+ {
887
+ $.ajax({
888
+ url: f.options_url,
889
+ type: 'get',
890
+ success: function(resp) { f.options = resp; },
891
+ async: false
892
+ });
893
+ }
894
+ var select = $('<select/>').attr('name', f.name).attr('id', f.name);
895
+ if (f.empty_option_text)
896
+ select.append($('<option/>').val('').html(f.empty_option_text));
897
+ $.each(f.options, function(j, option) {
898
+ var opt = $('<option/>').val(option.value).html(option.text);
899
+ if (pp[f.name] == option.value)
900
+ opt.attr('selected', true);
901
+ select.append(opt);
902
+ });
903
+ td.append(select);
904
+ }
905
+ tr.append(td);
906
+ tbody.append(tr);
907
+ });
908
+ var form = $('<form/>')
909
+ .attr('id', 'search_form')
910
+ .append($('<table/>').append(tbody))
911
+ .append($('<p/>').append($('<input/>').attr('type', 'submit').val('Search').click(function(e) { e.preventDefault(); that.search(); })));
912
+ return form;
913
+ },
914
+
915
+ populate_search_form: function()
916
+ {
917
+ var pp = this.pager_params();
918
+ $.each(this.search_form_fields, function(i, f) {
919
+ $('#' + f).val(pp[f]);
920
+ });
921
+ },
845
922
 
923
+ search: function()
924
+ {
925
+ var that = this;
926
+ $.each(that.search_fields, function(i, f) {
927
+ that.pager.params[f.name] = $('#'+f.name).val();
928
+ });
929
+ window.location.hash = that.pager_hash();
930
+ that.refresh(true);
931
+ }
846
932
  };
@@ -16,11 +16,12 @@ module Caboose
16
16
  config = YAML.load(File.read(Rails.root.join('config', 'aws.yml')))[Rails.env]
17
17
  access_key = config['access_key_id']
18
18
  secret_key = config['secret_access_key']
19
- bucket = config['bucket']
19
+ bucket = config['bucket']
20
+ bucket = Caboose::uploads_bucket && Caboose::uploads_bucket.strip.length > 0 ? Caboose::uploads_bucket : "#{bucket}-uploads"
20
21
  policy = {
21
22
  "expiration" => 1.hour.from_now.utc.xmlschema,
22
23
  "conditions" => [
23
- { "bucket" => "#{bucket}-uploads" },
24
+ { "bucket" => bucket },
24
25
  { "acl" => "public-read" },
25
26
  [ "starts-with", "$key", '' ],
26
27
  #[ "starts-with", "$Content-Type", 'image/' ],
@@ -65,7 +65,7 @@ module Caboose
65
65
  })
66
66
  render :json => {
67
67
  :pager => pager,
68
- :models => pager.items
68
+ :models => pager.items.as_json(:include => [:flat_rate_shipping_package, :flat_rate_shipping_method])
69
69
  }
70
70
  end
71
71
 
@@ -116,25 +116,34 @@ module Caboose
116
116
  save = true
117
117
  params.each do |name,value|
118
118
  case name
119
- when 'alternate_id' then v.alternate_id = value
120
- when 'sku' then v.sku = value
121
- when 'barcode' then v.barcode = value
122
- when 'price' then v.price = value
123
- when 'quantity_in_stock' then v.quantity_in_stock = value
124
- when 'ignore_quantity' then v.ignore_quantity = value
125
- when 'allow_backorder' then v.allow_backorder = value
126
- when 'status' then v.status = value
127
- when 'weight' then v.weight = value
128
- when 'length' then v.length = value
129
- when 'width' then v.width = value
130
- when 'height' then v.height = value
131
- when 'option1' then v.option1 = value
132
- when 'option2' then v.option2 = value
133
- when 'option3' then v.option3 = value
134
- when 'requires_shipping' then v.requires_shipping = value
135
- when 'taxable' then v.taxable = value
136
- when 'downloadable' then v.downloadable = value
137
- when 'download_path' then v.download_path = value
119
+ when 'alternate_id' then v.alternate_id = value
120
+ when 'sku' then v.sku = value
121
+ when 'barcode' then v.barcode = value
122
+ when 'price' then v.price = value
123
+ when 'quantity_in_stock' then v.quantity_in_stock = value
124
+ when 'ignore_quantity' then v.ignore_quantity = value
125
+ when 'allow_backorder' then v.allow_backorder = value
126
+ when 'status' then v.status = value
127
+ when 'weight' then v.weight = value
128
+ when 'length' then v.length = value
129
+ when 'width' then v.width = value
130
+ when 'height' then v.height = value
131
+ when 'option1' then v.option1 = value
132
+ when 'option2' then v.option2 = value
133
+ when 'option3' then v.option3 = value
134
+ when 'requires_shipping' then v.requires_shipping = value
135
+ when 'taxable' then v.taxable = value
136
+ when 'flat_rate_shipping' then v.flat_rate_shipping = value
137
+ when 'flat_rate_shipping_single' then v.flat_rate_shipping_single = value
138
+ when 'flat_rate_shipping_combined' then v.flat_rate_shipping_combined = value
139
+ when 'flat_rate_shipping_package_id' then v.flat_rate_shipping_package_id = value
140
+ when 'flat_rate_shipping_method_id' then v.flat_rate_shipping_method_id = value
141
+ when 'flat_rate_shipping_package_method_id' then
142
+ arr = value.split('_')
143
+ v.flat_rate_shipping_package_id = arr[0].to_i
144
+ v.flat_rate_shipping_method_id = arr[1].to_i
145
+ when 'downloadable' then v.downloadable = value
146
+ when 'download_path' then v.download_path = value
138
147
 
139
148
  when 'sale_price'
140
149
  v.sale_price = value
@@ -0,0 +1,56 @@
1
+ ================================================================================
2
+ Order packages
3
+ ================================================================================
4
+
5
+ # Create a single order package for the order
6
+ sp = ShippingPackage.where(:site_id => order.site_id).first
7
+ op = OrderPackage.create(:order_id => order.id, :shipping_package_id => sp.id)
8
+
9
+ # Assign the line items to the order package
10
+ order.line_items.each do |li|
11
+ li.order_package_id = op.id
12
+ li.save
13
+ end
14
+
15
+ ================================================================================
16
+ Shipping
17
+ ================================================================================
18
+
19
+ sc = store_config
20
+ sa = order.shipping_address
21
+ origin = ActiveShipping::Location.new(:country => sc.origin_country, :state => sc.origin_state, :city => sc.origin_city, :zip => sc.origin_zip)
22
+ destination = ActiveShipping::Location.new(:country => sc.origin_country, :state => sa.state, :city => sa.city, :postal_code => sa.zip)
23
+ carriers = {}
24
+ carriers['UPS'] = ActiveShipping::UPS.new(:login => sc.ups_username, :password => sc.ups_password, :key => sc.ups_key, :origin_account => sc.ups_origin_account)
25
+ carriers['USPS'] = ActiveShipping::USPS.new( :login => sc.usps_username) if order.total < 150
26
+
27
+ all_rates = []
28
+ order.order_packages.all.each do |op|
29
+
30
+ flat_rate = true
31
+ op.line_items do |li|
32
+ flat_rate = false if !li.variant.flat_rate_shipping
33
+ end
34
+ if flat_rate
35
+ v = op.line_items.first.variant
36
+ all_rates << { :order_package => op, :rates => [{ :shipping_method => v.flat_rate_shipping_method, :total_price => (v.flat_rate_shipping_single/100) }] }
37
+ else
38
+ sp = op.shipping_package
39
+ package = op.activemerchant_package
40
+ rates = []
41
+ carriers.each do |name, carrier|
42
+ resp = carrier.find_rates(origin, destination, package)
43
+ resp.rates.sort_by(&:price).each do |rate|
44
+ sm = ShippingMethod.where( :carrier => name, :service_code => rate.service_code).first
45
+ sm = ShippingMethod.create(:carrier => name, :service_code => rate.service_code, :service_name => rate.service_name) if sm.nil?
46
+ next if !sp.uses_shipping_method(sm)
47
+ price = rate.total_price
48
+ price = rate.package_rates[0].rate if price.nil? && rate.package_rates && rate.package_rates.count > 0
49
+ rates << { :shipping_method => sm, :total_price => (price.to_d/100) }
50
+ end
51
+ end
52
+ all_rates << { :order_package => op, :rates => rates }
53
+ end
54
+
55
+ end
56
+ return all_rates
@@ -734,38 +734,43 @@ class Caboose::Schema < Caboose::Utilities::Schema
734
734
  [ :payment_profile_id , :string ]
735
735
  ],
736
736
  Caboose::Variant => [
737
- [ :product_id , :integer ],
738
- [ :alternate_id , :string ],
739
- [ :sku , :string ],
740
- [ :barcode , :string ],
741
- [ :price , :decimal , { :precision => 8, :scale => 2 }],
742
- [ :sale_price , :decimal , { :precision => 8, :scale => 2 }],
743
- [ :date_sale_starts , :datetime ],
744
- [ :date_sale_ends , :datetime ],
745
- [ :date_sale_end , :datetime ],
746
- [ :available , :boolean ],
747
- [ :quantity_in_stock , :integer , :default => 0 ],
748
- [ :ignore_quantity , :boolean ],
749
- [ :allow_backorder , :boolean ],
750
- [ :weight , :decimal ],
751
- [ :length , :decimal ],
752
- [ :width , :decimal ],
753
- [ :height , :decimal ],
754
- [ :volume , :decimal ],
755
- [ :cylinder , :boolean ],
756
- [ :option1 , :string ],
757
- [ :option2 , :string ],
758
- [ :option3 , :string ],
759
- [ :requires_shipping , :boolean ],
760
- [ :taxable , :boolean ],
761
- [ :shipping_unit_value , :numeric ],
762
- [ :status , :string ],
763
- [ :option1_sort_order , :integer , { :default => 0 }],
764
- [ :option2_sort_order , :integer , { :default => 0 }],
765
- [ :option3_sort_order , :integer , { :default => 0 }],
766
- [ :sort_order , :integer , { :default => 0 }],
767
- [ :downloadable , :boolean , { :default => false }],
768
- [ :download_path , :string ]
737
+ [ :product_id , :integer ],
738
+ [ :alternate_id , :string ],
739
+ [ :sku , :string ],
740
+ [ :barcode , :string ],
741
+ [ :price , :decimal , { :precision => 8, :scale => 2 }],
742
+ [ :sale_price , :decimal , { :precision => 8, :scale => 2 }],
743
+ [ :date_sale_starts , :datetime ],
744
+ [ :date_sale_ends , :datetime ],
745
+ [ :date_sale_end , :datetime ],
746
+ [ :available , :boolean ],
747
+ [ :quantity_in_stock , :integer , :default => 0 ],
748
+ [ :ignore_quantity , :boolean ],
749
+ [ :allow_backorder , :boolean ],
750
+ [ :weight , :decimal ],
751
+ [ :length , :decimal ],
752
+ [ :width , :decimal ],
753
+ [ :height , :decimal ],
754
+ [ :volume , :decimal ],
755
+ [ :cylinder , :boolean ],
756
+ [ :option1 , :string ],
757
+ [ :option2 , :string ],
758
+ [ :option3 , :string ],
759
+ [ :requires_shipping , :boolean ],
760
+ [ :taxable , :boolean ],
761
+ [ :shipping_unit_value , :numeric ],
762
+ [ :flat_rate_shipping , :boolean , { :default => false }],
763
+ [ :flat_rate_shipping_package_id , :integer ],
764
+ [ :flat_rate_shipping_method_id , :integer ],
765
+ [ :flat_rate_shipping_single , :decimal , { :precision => 8, :scale => 2, :default => 0.0 }],
766
+ [ :flat_rate_shipping_combined , :decimal , { :precision => 8, :scale => 2, :default => 0.0 }],
767
+ [ :status , :string ],
768
+ [ :option1_sort_order , :integer , { :default => 0 }],
769
+ [ :option2_sort_order , :integer , { :default => 0 }],
770
+ [ :option3_sort_order , :integer , { :default => 0 }],
771
+ [ :sort_order , :integer , { :default => 0 }],
772
+ [ :downloadable , :boolean , { :default => false }],
773
+ [ :download_path , :string ]
769
774
  ],
770
775
  Caboose::Vendor => [
771
776
  [ :site_id , :integer ],
@@ -54,7 +54,8 @@ module Caboose
54
54
  :origin => origin,
55
55
  :destination => destination
56
56
  )
57
- order.line_items.each_with_index do |li, i|
57
+ order.line_items.each_with_index do |li, i|
58
+ next if !li.variant.taxable # Skip any non-taxable items
58
59
  transaction.cart_items << TaxCloud::CartItem.new(
59
60
  :index => i,
60
61
  :item_id => li.variant.id,
@@ -11,6 +11,8 @@ module Caboose
11
11
  belongs_to :product
12
12
  has_many :product_image_variants
13
13
  has_many :product_images, :through => :product_image_variants
14
+ belongs_to :flat_rate_shipping_method, :class_name => 'Caboose::ShippingMethod'
15
+ belongs_to :flat_rate_shipping_package, :class_name => 'Caboose::ShippingPackage'
14
16
 
15
17
  attr_accessible :id,
16
18
  :alternate_id,
@@ -37,7 +39,12 @@ module Caboose
37
39
  :sku,
38
40
  :available,
39
41
  :cylinder,
40
- :shipping_unit_value
42
+ :shipping_unit_value,
43
+ :flat_rate_shipping,
44
+ :flat_rate_shipping_single,
45
+ :flat_rate_shipping_combined,
46
+ :flat_rate_shipping_method_id,
47
+ :flat_rate_shipping_package_id
41
48
 
42
49
  after_initialize do |v|
43
50
  v.price = 0.00 if v.price.nil?
@@ -85,7 +92,9 @@ module Caboose
85
92
  def as_json(options={})
86
93
  self.attributes.merge({
87
94
  :images => self.product_images.any? ? self.product_images : [self.product.product_images.first],
88
- :title => "#{self.product.title} (#{self.options.join(', ')})"
95
+ :title => "#{self.product.title} (#{self.options.join(', ')})",
96
+ :flat_rate_shipping_package => self.flat_rate_shipping_package,
97
+ :flat_rate_shipping_method => self.flat_rate_shipping_method
89
98
  })
90
99
  end
91
100
 
@@ -5,6 +5,7 @@
5
5
  <h2>Order Details</h2>
6
6
 
7
7
  <p>Order #<%= @order.order_number %></p>
8
+ <p>Status: <%= @order.status %></p>
8
9
 
9
10
  <table border='1' style='border-collapse: collapse;'>
10
11
  <tr>
@@ -12,10 +12,10 @@ v = @variant
12
12
  <% if p.option2 %><div id='variant_<%= v.id %>_option2'></div><% end %>
13
13
  <% if p.option3 %><div id='variant_<%= v.id %>_option3'></div><% end %>
14
14
  <div id='variant_<%= v.id %>_status' ></div>
15
- <div id='variant_<%= v.id %>_requires_shipping' ></div>
16
15
  <div id='variant_<%= v.id %>_allow_backorder' ></div>
17
16
  <div id='variant_<%= v.id %>_taxable' ></div>
18
17
  <div id='variant_<%= v.id %>_downloadable' ></div>
18
+ <div id='variant_<%= v.id %>_requires_shipping' ></div>
19
19
  </td><td valign='top'>
20
20
  <h2>Inventory</h2>
21
21
  <div id='variant_<%= v.id %>_alternate_id' ></div>
@@ -37,7 +37,14 @@ v = @variant
37
37
  <div id='variant_<%= v.id %>_date_sale_starts' ></div>
38
38
  <div id='variant_<%= v.id %>_time_sale_starts' ></div>
39
39
  <div id='variant_<%= v.id %>_date_sale_ends' ></div>
40
- <div id='variant_<%= v.id %>_time_sale_ends' ></div>
40
+ <div id='variant_<%= v.id %>_time_sale_ends' ></div>
41
+ </td>
42
+ <td valign='top' colspan='4'4>
43
+ <h2>Flat Rate Shipping</h2>
44
+ <div id='variant_<%= v.id %>_flat_rate_shipping' ></div>
45
+ <div id='variant_<%= v.id %>_flat_rate_shipping_single' ></div>
46
+ <div id='variant_<%= v.id %>_flat_rate_shipping_combined' ></div>
47
+ <div id='variant_<%= v.id %>_flat_rate_shipping_package_method_id'></div>
41
48
  </td>
42
49
  </tr>
43
50
  </table>
@@ -63,29 +70,36 @@ $(document).ready(function() {
63
70
  update_url: '/admin/products/<%= v.product_id %>/variants/<%= v.id %>',
64
71
  authenticity_token: '<%= form_authenticity_token %>',
65
72
  attributes: [
66
- <% if p.option1 %>{ name: 'option1' , nice_name: <%= raw Caboose.json(p.option1) %> , type: 'text' , align: 'right' , value: <%= raw Caboose.json(v.option1 ) %>, width: 250 },<% end %>
67
- <% if p.option2 %>{ name: 'option2' , nice_name: <%= raw Caboose.json(p.option2) %> , type: 'text' , align: 'right' , value: <%= raw Caboose.json(v.option2 ) %>, width: 250 },<% end %>
68
- <% if p.option3 %>{ name: 'option3' , nice_name: <%= raw Caboose.json(p.option3) %> , type: 'text' , align: 'right' , value: <%= raw Caboose.json(v.option3 ) %>, width: 250 },<% end %>
69
- { name: 'alternate_id' , nice_name: 'Alternate ID' , type: 'text' , align: 'right' , value: <%= raw Caboose.json(v.alternate_id ) %>, width: 250 },
70
- { name: 'sku' , nice_name: 'SKU' , type: 'text' , align: 'right' , value: <%= raw Caboose.json(v.sku ) %>, width: 250 },
71
- { name: 'barcode' , nice_name: 'Barcode' , type: 'text' , align: 'right' , value: <%= raw Caboose.json(v.barcode ) %>, width: 250 },
72
- { name: 'price' , nice_name: 'Price' , type: 'text' , align: 'right' , value: <%= raw Caboose.json(sprintf("%.2f", v.price) ) %>, width: 250 },
73
- { name: 'sale_price' , nice_name: 'Sale price' , type: 'text' , align: 'right' , value: <%= raw Caboose.json(v.sale_price ) %>, width: 275 },
74
- { name: 'date_sale_starts' , nice_name: 'Sale starts' , type: 'datetime' , align: 'right' , value: <%= raw Caboose.json(v.date_sale_starts ? v.date_sale_starts.in_time_zone(@logged_in_user.timezone).strftime('%m/%d/%Y %I:%M %P') : '') %>, width: 275 },
75
- { name: 'date_sale_ends' , nice_name: 'Sale ends' , type: 'datetime' , align: 'right' , value: <%= raw Caboose.json(v.date_sale_ends ? v.date_sale_ends.in_time_zone(@logged_in_user.timezone).strftime('%m/%d/%Y %I:%M %P') : '') %>, width: 275 },
76
- { name: 'quantity_in_stock' , nice_name: 'Quantity' , type: 'text' , align: 'right' , value: <%= raw Caboose.json(v.quantity_in_stock ) %>, width: 250 },
77
- { name: 'ignore_quantity' , nice_name: 'Ignore Quantity' , type: 'checkbox' , align: 'right' , value: <%= raw Caboose.json(v.ignore_quantity ) %>, width: 250 },
78
- { name: 'weight' , nice_name: 'Weight (<%= sc.weight_unit %>)' , type: 'text' , align: 'right' , value: <%= raw Caboose.json(v.weight ) %>, width: 250 },
79
- { name: 'length' , nice_name: 'Length (<%= sc.length_unit %>)' , type: 'text' , align: 'right' , value: <%= raw Caboose.json(v.length ) %>, width: 250 },
80
- { name: 'width' , nice_name: 'Width (<%= sc.length_unit %>)' , type: 'text' , align: 'right' , value: <%= raw Caboose.json(v.width ) %>, width: 250 },
81
- { name: 'height' , nice_name: 'Height (<%= sc.length_unit %>)' , type: 'text' , align: 'right' , value: <%= raw Caboose.json(v.height ) %>, width: 250 },
82
- { name: 'cylinder' , nice_name: 'Cylinder' , type: 'checkbox' , align: 'right' , value: <%= raw Caboose.json(v.cylinder ) %>, width: 250 },
83
- { name: 'requires_shipping' , nice_name: 'Requires shipping' , type: 'checkbox' , align: 'right' , value: <%= raw Caboose.json(v.requires_shipping ) %>, width: 250 },
84
- { name: 'taxable' , nice_name: 'Taxable' , type: 'checkbox' , align: 'right' , value: <%= raw Caboose.json(v.taxable ) %>, width: 250 },
85
- { name: 'allow_backorder' , nice_name: 'Allow backorder' , type: 'checkbox' , align: 'right' , value: <%= raw Caboose.json(v.allow_backorder ) %>, width: 250 },
86
- { name: 'status' , nice_name: 'Status' , type: 'select' , align: 'right' , value: <%= raw Caboose.json(v.status ) %>, width: 250, options_url: '/admin/variants/status-options' },
87
- { name: 'downloadable' , nice_name: 'Downloadable' , type: 'checkbox' , align: 'right' , value: <%= raw Caboose.json(v.downloadable ) %>, width: 250 },
88
- { name: 'download_path' , nice_name: 'Download path' , type: 'text' , align: 'right' , value: <%= raw Caboose.json(v.download_path ) %>, width: 800 }
73
+ <% if p.option1 %>{ name: 'option1' , nice_name: <%= raw Caboose.json(p.option1) %> , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.option1 ) %> },<% end %>
74
+ <% if p.option2 %>{ name: 'option2' , nice_name: <%= raw Caboose.json(p.option2) %> , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.option2 ) %> },<% end %>
75
+ <% if p.option3 %>{ name: 'option3' , nice_name: <%= raw Caboose.json(p.option3) %> , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.option3 ) %> },<% end %>
76
+ { name: 'alternate_id' , nice_name: 'Alternate ID' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.alternate_id ) %> },
77
+ { name: 'sku' , nice_name: 'SKU' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.sku ) %> },
78
+ { name: 'barcode' , nice_name: 'Barcode' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.barcode ) %> },
79
+ { name: 'price' , nice_name: 'Price' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(sprintf("%.2f", v.price) ) %> },
80
+ { name: 'sale_price' , nice_name: 'Sale price' , type: 'text' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.sale_price ) %> },
81
+ { name: 'date_sale_starts' , nice_name: 'Sale starts' , type: 'datetime' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.date_sale_starts ? v.date_sale_starts.in_time_zone(@logged_in_user.timezone).strftime('%m/%d/%Y %I:%M %P') : '') %> },
82
+ { name: 'date_sale_ends' , nice_name: 'Sale ends' , type: 'datetime' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.date_sale_ends ? v.date_sale_ends.in_time_zone(@logged_in_user.timezone).strftime('%m/%d/%Y %I:%M %P') : '') %> },
83
+ { name: 'quantity_in_stock' , nice_name: 'Quantity' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.quantity_in_stock ) %> },
84
+ { name: 'ignore_quantity' , nice_name: 'Ignore Quantity' , type: 'checkbox' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.ignore_quantity ) %> },
85
+ { name: 'weight' , nice_name: 'Weight (<%= sc.weight_unit %>)' , type: 'text' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.weight ) %> },
86
+ { name: 'length' , nice_name: 'Length (<%= sc.length_unit %>)' , type: 'text' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.length ) %> },
87
+ { name: 'width' , nice_name: 'Width (<%= sc.length_unit %>)' , type: 'text' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.width ) %> },
88
+ { name: 'height' , nice_name: 'Height (<%= sc.length_unit %>)' , type: 'text' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.height ) %> },
89
+ { name: 'cylinder' , nice_name: 'Cylinder' , type: 'checkbox' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.cylinder ) %> },
90
+ { name: 'requires_shipping' , nice_name: 'Requires shipping' , type: 'checkbox' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.requires_shipping ) %> },
91
+ { name: 'taxable' , nice_name: 'Taxable' , type: 'checkbox' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.taxable ) %> },
92
+ { name: 'allow_backorder' , nice_name: 'Allow backorder' , type: 'checkbox' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.allow_backorder ) %> },
93
+ { name: 'status' , nice_name: 'Status' , type: 'select' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.status ) %>, options_url: '/admin/variants/status-options' },
94
+ { name: 'downloadable' , nice_name: 'Downloadable' , type: 'checkbox' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.downloadable ) %> },
95
+ { name: 'download_path' , nice_name: 'Download path' , type: 'text' , align: 'right' , width: 800, value: <%= raw Caboose.json(v.download_path ) %> },
96
+ { name: 'flat_rate_shipping' , nice_name: 'Use flat rate shipping' , type: 'checkbox' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.flat_rate_shipping ) %> },
97
+ { name: 'flat_rate_shipping_single' , nice_name: 'Amount (single)' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.flat_rate_shipping_single ) %> },
98
+ { name: 'flat_rate_shipping_combined' , nice_name: 'Amount (combined)' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.flat_rate_shipping_combined ) %> },
99
+ { name: 'flat_rate_shipping_package_method_id' , nice_name: 'Package method' , type: 'select' , align: 'right' , width: 250, options_url: '/admin/shipping-packages/package-method-options',
100
+ value: <%= raw Caboose.json("#{v.flat_rate_shipping_package_id}_#{v.flat_rate_shipping_method_id}") %>,
101
+ text: <%= raw Caboose.json(v.flat_rate_shipping_package && v.flat_rate_shipping_method ? "#{v.flat_rate_shipping_package.name} - #{v.flat_rate_shipping_method.service_name}" : '') %>
102
+ }
89
103
  ]
90
104
  });
91
105
  });
@@ -66,28 +66,39 @@ $(document).ready(function() {
66
66
  allow_duplicate: false,
67
67
  allow_advanced_edit: true,
68
68
  fields: [
69
- <% if p.option1 %>{ show: true , name: 'option1' , nice_name: <%= raw Caboose.json(p.option1) %> , sort: 'option1' , type: 'text' , value: function(v) { return v.option1 }, width: 75, align: 'left' , bulk_edit: true },<% end %>
70
- <% if p.option2 %>{ show: true , name: 'option2' , nice_name: <%= raw Caboose.json(p.option2) %> , sort: 'option2' , type: 'text' , value: function(v) { return v.option2 }, width: 75, align: 'left' , bulk_edit: true },<% end %>
71
- <% if p.option3 %>{ show: true , name: 'option3' , nice_name: <%= raw Caboose.json(p.option3) %> , sort: 'option3' , type: 'text' , value: function(v) { return v.option3 }, width: 75, align: 'left' , bulk_edit: true },<% end %>
72
- { show: true , name: 'status' , nice_name: 'Status' , sort: 'status' , type: 'text' , value: function(v) { return v.status }, width: 75, align: 'left' , bulk_edit: true },
73
- { show: true , name: 'alternate_id' , nice_name: 'Alternate ID' , sort: 'alternate_id' , type: 'text' , value: function(v) { return v.alternate_id }, width: 75, align: 'left' , bulk_edit: true },
74
- { show: true , name: 'sku' , nice_name: 'SKU' , sort: 'sku' , type: 'text' , value: function(v) { return v.sku }, width: 75, align: 'left' , bulk_edit: true },
75
- { show: false , name: 'barcode' , nice_name: 'Barcode' , sort: 'barcode' , type: 'text' , value: function(v) { return v.barcode }, width: 75, align: 'left' , bulk_edit: true },
76
- { show: true , name: 'price' , nice_name: 'Price' , sort: 'price' , type: 'text' , value: function(v) { return v.price }, width: 75, align: 'right' , bulk_edit: true },
77
- { show: true , name: 'sale_price' , nice_name: 'Sale price' , sort: 'sale_price' , type: 'text' , value: function(v) { return v.sale_price }, width: 75, align: 'right' , bulk_edit: true },
78
- { show: false , name: 'date_sale_starts' , nice_name: 'Sale starts' , sort: 'date_sale_starts' , type: 'datetime' , value: function(v) { return v.date_sale_starts }, width: 75, align: 'left' , bulk_edit: true },
79
- { show: false , name: 'date_sale_ends' , nice_name: 'Sale ends' , sort: 'date_sale_ends' , type: 'datetime' , value: function(v) { return v.date_sale_ends }, width: 75, align: 'left' , bulk_edit: true },
80
- { show: true , name: 'quantity_in_stock' , nice_name: 'Quantity' , sort: 'quantity_in_stock' , type: 'text' , value: function(v) { return v.quantity_in_stock }, width: 50, align: 'right' , bulk_edit: true },
81
- { show: false , name: 'weight' , nice_name: 'Weight (<%= sc.weight_unit %>)' , sort: 'weight' , type: 'text' , value: function(v) { return v.weight }, width: 50, align: 'right' , bulk_edit: true },
82
- { show: false , name: 'length' , nice_name: 'Length (<%= sc.length_unit %>)' , sort: 'length' , type: 'text' , value: function(v) { return v.length }, width: 50, align: 'right' , bulk_edit: true },
83
- { show: false , name: 'width' , nice_name: 'Width (<%= sc.length_unit %>)' , sort: 'width' , type: 'text' , value: function(v) { return v.width }, width: 50, align: 'right' , bulk_edit: true },
84
- { show: false , name: 'height' , nice_name: 'Height (<%= sc.length_unit %>)' , sort: 'height' , type: 'text' , value: function(v) { return v.height }, width: 50, align: 'right' , bulk_edit: true },
85
- { show: false , name: 'cylinder' , nice_name: 'Cylinder' , sort: 'cylinder' , type: 'checkbox' , value: function(v) { return v.cylinder }, text: function(v) { return v.cylinder ? 'Yes' : 'No' }, width: 50, align: 'center' , bulk_edit: true },
86
- { show: false , name: 'requires_shipping' , nice_name: 'Requires shipping' , sort: 'requires_shipping' , type: 'checkbox' , value: function(v) { return v.requires_shipping }, text: function(v) { return v.requires_shipping ? 'Yes' : 'No' }, width: 50, align: 'center' , bulk_edit: true },
87
- { show: false , name: 'taxable' , nice_name: 'Taxable' , sort: 'taxable' , type: 'checkbox' , value: function(v) { return v.taxable }, text: function(v) { return v.taxable ? 'Yes' : 'No' }, width: 50, align: 'center' , bulk_edit: true },
88
- { show: false , name: 'allow_backorder' , nice_name: 'Allow backorder' , sort: 'allow_backorder' , type: 'checkbox' , value: function(v) { return v.allow_backorder }, text: function(v) { return v.allow_backorder ? 'Yes' : 'No' }, width: 50, align: 'center' , bulk_edit: true },
89
- { show: false , name: 'downloadable' , nice_name: 'Downloadable' , sort: 'downloadable' , type: 'checkbox' , value: function(v) { return v.downloadable }, text: function(v) { return v.downloadable ? 'Yes' : 'No' }, width: 50, align: 'center' , bulk_edit: true },
90
- { show: false , name: 'download_path' , nice_name: 'Download path' , sort: 'download_path' , type: 'text' , value: function(v) { return v.download_path }, width: 50, align: 'left' , bulk_edit: true }
69
+ <% if p.option1 %>{ show: true , name: 'option1' , nice_name: <%= raw Caboose.json(p.option1) %> , sort: 'option1' , type: 'text' , value: function(v) { return v.option1 }, width: 75, align: 'left' , bulk_edit: true },<% end %>
70
+ <% if p.option2 %>{ show: true , name: 'option2' , nice_name: <%= raw Caboose.json(p.option2) %> , sort: 'option2' , type: 'text' , value: function(v) { return v.option2 }, width: 75, align: 'left' , bulk_edit: true },<% end %>
71
+ <% if p.option3 %>{ show: true , name: 'option3' , nice_name: <%= raw Caboose.json(p.option3) %> , sort: 'option3' , type: 'text' , value: function(v) { return v.option3 }, width: 75, align: 'left' , bulk_edit: true },<% end %>
72
+ { show: true , name: 'status' , nice_name: 'Status' , sort: 'status' , type: 'text' , value: function(v) { return v.status }, width: 75, align: 'left' , bulk_edit: true },
73
+ { show: true , name: 'alternate_id' , nice_name: 'Alternate ID' , sort: 'alternate_id' , type: 'text' , value: function(v) { return v.alternate_id }, width: 75, align: 'left' , bulk_edit: true },
74
+ { show: true , name: 'sku' , nice_name: 'SKU' , sort: 'sku' , type: 'text' , value: function(v) { return v.sku }, width: 75, align: 'left' , bulk_edit: true },
75
+ { show: false , name: 'barcode' , nice_name: 'Barcode' , sort: 'barcode' , type: 'text' , value: function(v) { return v.barcode }, width: 75, align: 'left' , bulk_edit: true },
76
+ { show: true , name: 'price' , nice_name: 'Price' , sort: 'price' , type: 'text' , value: function(v) { return v.price }, width: 75, align: 'right' , bulk_edit: true },
77
+ { show: true , name: 'sale_price' , nice_name: 'Sale price' , sort: 'sale_price' , type: 'text' , value: function(v) { return v.sale_price }, width: 75, align: 'right' , bulk_edit: true },
78
+ { show: false , name: 'date_sale_starts' , nice_name: 'Sale starts' , sort: 'date_sale_starts' , type: 'datetime' , value: function(v) { return v.date_sale_starts }, width: 75, align: 'left' , bulk_edit: true },
79
+ { show: false , name: 'date_sale_ends' , nice_name: 'Sale ends' , sort: 'date_sale_ends' , type: 'datetime' , value: function(v) { return v.date_sale_ends }, width: 75, align: 'left' , bulk_edit: true },
80
+ { show: true , name: 'quantity_in_stock' , nice_name: 'Quantity' , sort: 'quantity_in_stock' , type: 'text' , value: function(v) { return v.quantity_in_stock }, width: 50, align: 'right' , bulk_edit: true },
81
+ { show: false , name: 'weight' , nice_name: 'Weight (<%= sc.weight_unit %>)' , sort: 'weight' , type: 'text' , value: function(v) { return v.weight }, width: 50, align: 'right' , bulk_edit: true },
82
+ { show: false , name: 'length' , nice_name: 'Length (<%= sc.length_unit %>)' , sort: 'length' , type: 'text' , value: function(v) { return v.length }, width: 50, align: 'right' , bulk_edit: true },
83
+ { show: false , name: 'width' , nice_name: 'Width (<%= sc.length_unit %>)' , sort: 'width' , type: 'text' , value: function(v) { return v.width }, width: 50, align: 'right' , bulk_edit: true },
84
+ { show: false , name: 'height' , nice_name: 'Height (<%= sc.length_unit %>)' , sort: 'height' , type: 'text' , value: function(v) { return v.height }, width: 50, align: 'right' , bulk_edit: true },
85
+ { show: false , name: 'cylinder' , nice_name: 'Cylinder' , sort: 'cylinder' , type: 'checkbox' , value: function(v) { return v.cylinder }, text: function(v) { return v.cylinder ? 'Yes' : 'No' }, width: 50, align: 'center' , bulk_edit: true },
86
+ { show: false , name: 'requires_shipping' , nice_name: 'Requires shipping' , sort: 'requires_shipping' , type: 'checkbox' , value: function(v) { return v.requires_shipping }, text: function(v) { return v.requires_shipping ? 'Yes' : 'No' }, width: 50, align: 'center' , bulk_edit: true },
87
+ { show: false , name: 'taxable' , nice_name: 'Taxable' , sort: 'taxable' , type: 'checkbox' , value: function(v) { return v.taxable }, text: function(v) { return v.taxable ? 'Yes' : 'No' }, width: 50, align: 'center' , bulk_edit: true },
88
+ { show: false , name: 'allow_backorder' , nice_name: 'Allow backorder' , sort: 'allow_backorder' , type: 'checkbox' , value: function(v) { return v.allow_backorder }, text: function(v) { return v.allow_backorder ? 'Yes' : 'No' }, width: 50, align: 'center' , bulk_edit: true },
89
+ { show: false , name: 'downloadable' , nice_name: 'Downloadable' , sort: 'downloadable' , type: 'checkbox' , value: function(v) { return v.downloadable }, text: function(v) { return v.downloadable ? 'Yes' : 'No' }, width: 50, align: 'center' , bulk_edit: true },
90
+ { show: false , name: 'download_path' , nice_name: 'Download path' , sort: 'download_path' , type: 'text' , value: function(v) { return v.download_path }, width: 50, align: 'left' , bulk_edit: true },
91
+ { show: false , name: 'flat_rate_shipping' , nice_name: 'Flat rate shipping' , sort: 'flat_rate_shipping' , type: 'checkbox' , value: function(v) { return v.flat_rate_shipping }, text: function(v) { return v.flat_rate_shipping ? 'Yes' : 'No' }, width: 50, align: 'center' , bulk_edit: true },
92
+ { show: false , name: 'flat_rate_shipping_single' , nice_name: 'Amount (single)' , sort: 'flat_rate_shipping_single' , type: 'text' , value: function(v) { return v.flat_rate_shipping_single }, width: 50, align: 'right' , bulk_edit: true },
93
+ { show: false , name: 'flat_rate_shipping_combined' , nice_name: 'Amount (combined)' , sort: 'flat_rate_shipping_combined' , type: 'text' , value: function(v) { return v.flat_rate_shipping_combined }, width: 50, align: 'right' , bulk_edit: true },
94
+ { show: false , name: 'flat_rate_shipping_package_method_id' , nice_name: 'Package and method' , sort: 'flat_rate_shipping_package_id' , type: 'select' ,
95
+ value: function(v) { return v.flat_rate_shipping_package_id + '_' + v.flat_rate_shipping_method_id },
96
+ text: function(v) { return v.flat_rate_shipping_package && v.flat_rate_shipping_method ? v.flat_rate_shipping_package.name + ' - ' + v.flat_rate_shipping_method.service_name : '' },
97
+ width: 150,
98
+ align: 'right' ,
99
+ bulk_edit: true ,
100
+ options_url: '/admin/shipping-packages/package-method-options'
101
+ }
91
102
  ],
92
103
  <% if @highlight_variant_id %>highlight_id: <%= @highlight_variant_id %>,<% end %>
93
104
  new_model_text: 'New Variant',
@@ -124,6 +124,9 @@ module Caboose
124
124
  mattr_accessor :from_address
125
125
  @@from_address = ''
126
126
 
127
+ mattr_accessor :uploads_bucket
128
+ @@uploads_bucket = ''
129
+
127
130
  end
128
131
 
129
132
  # These are used so that both local filestorage and S3 can work without having to change paperclip paths in models
@@ -1,3 +1,3 @@
1
1
  module Caboose
2
- VERSION = '0.6.11'
2
+ VERSION = '0.6.12'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: caboose-cms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.11
4
+ version: 0.6.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - William Barry
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-17 00:00:00.000000000 Z
11
+ date: 2015-07-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pg
@@ -660,6 +660,7 @@ files:
660
660
  - app/mailers/caboose/caboose_mailer.rb
661
661
  - app/mailers/caboose/login_mailer.rb
662
662
  - app/mailers/caboose/orders_mailer.rb
663
+ - app/models/caboose/#Untitled-1#
663
664
  - app/models/caboose/ab_option.rb
664
665
  - app/models/caboose/ab_testing.rb
665
666
  - app/models/caboose/ab_value.rb