caboose-cms 0.5.68 → 0.5.69

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MDdiMzBlZWU2NWJmMGY0NGE4YjA2MDE5NDQ0NWRjYWMxNTI1N2IxYQ==
4
+ MTIzZWY3YjU1ZjI3NWUxNDU1ZjllNmY5OWYxOTllYzdjMGRhYWFlMw==
5
5
  data.tar.gz: !binary |-
6
- ZTU0N2YyMWZhYzY2ZmZmYzkxMjg2ODE1YjYwYTA4NWY3OThkOTM2ZQ==
6
+ OTdiNzNmMzBmN2QzM2Q5ZmY5ZTcwYjU0NTg3ZmYzYTVkNTRiYTBjZQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YWVlODIxMTE2ZTE2ZDFhYWJmZjRlYWM2MTIwZTA3MTI5ODhmNDg2YjU2OGJm
10
- OWEyMzM0ZTUzYzdkYjk4MjZkMGQzZDc5NzkzNTU1OTkyNDY4YTNhZjcxMmI0
11
- M2RlMDEzNzQxMjc4NTRiYWNiNGE3MzYxN2RhMTgyYjQ1ODRjNzQ=
9
+ OTllMjU1YzUwZTFmYzIyMWI2YTJlNjk5OTZmZGRhODBhZTI3MzZjMjYyNWE3
10
+ MDQ3NWIyMGZjOTJlYWI2MTcwYWY5NTNhMmQ1ZTJhMzAyY2JmNjM0ZDhhODRi
11
+ ZTE0ZGMwYThhMjFjMWM4MDI3MzZiOGQzY2FiNjViYmViNWVlMmY=
12
12
  data.tar.gz: !binary |-
13
- MTVlY2M1ZTAyMWMxMGI2NzU4YTY5OWU3ODIxZWE2MzYzYWVhN2FjZmNhMDkz
14
- Yzg3ZTM2MWMzZjUwNTJlYmE0MzY0MTMxMmE3OGYyMGMyZGJlMjhjM2Y4M2E2
15
- OTIxMTc3NmMyNGVhNjljMzRiNDJhNTBiOTkyOTc3MjQ1Y2U3MjY=
13
+ NTE0Y2U1NzE2NmIwYmY0ZjZjNGU3MDgwY2U1Mjk4MzZmNzI2MjJhZGYyODA2
14
+ MTk4MzNmN2M1NjM4ODNlZDJiMzZiZjFmMjM3YjVjYTg2ZjBlOGM2MDU0M2Uz
15
+ NWZhOGMzNjI0ZGFhNDRiZjIxMmQxMmI5NDMzNmNhMGJmN2FlM2I=
@@ -25,6 +25,7 @@ IndexTable.prototype = {
25
25
 
26
26
  // Where to post new models
27
27
  add_url: false,
28
+ after_add: 'refresh', // or 'redirect'
28
29
 
29
30
  // Array of fields you want to show in the table (given as model binder attributes with additional text and value functions)
30
31
  // [{
@@ -818,10 +819,12 @@ IndexTable.prototype = {
818
819
  data: $('#new_form').serialize(),
819
820
  success: function(resp) {
820
821
  if (resp.error) $('#' + that.container + '_new_message').html("<p class='note error'>" + resp.error + "</p>");
821
- if (resp.redirect || resp.refresh || resp.success)
822
- {
822
+ if (resp.redirect && that.after_add == 'redirect')
823
+ window.location = resp.redirect;
824
+ else if (resp.redirect || resp.refresh || resp.success)
825
+ {
823
826
  that.hide_message();
824
- that.refresh();
827
+ that.refresh();
825
828
  }
826
829
  }
827
830
  });
@@ -186,14 +186,20 @@ module Caboose
186
186
 
187
187
  # GET /admin/orders/:id/print
188
188
  def admin_print
189
- return if !user_is_allowed('orders', 'edit')
190
-
189
+ return if !user_is_allowed('orders', 'edit')
190
+
191
191
  pdf = OrderPdf.new
192
192
  pdf.order = Order.find(params[:id])
193
- send_data pdf.to_pdf, :filename => "order_#{pdf.order.id}.pdf", :type => "application/pdf", :disposition => "inline"
193
+ send_data pdf.to_pdf, :filename => "order_#{pdf.order.id}.pdf", :type => "application/pdf", :disposition => "inline"
194
+ end
195
+
196
+ # GET /admin/orders/print-pending
197
+ def admin_print_pending
198
+ return if !user_is_allowed('orders', 'edit')
194
199
 
195
- #@order = Order.find(params[:id])
196
- #render :layout => 'caboose/admin'
200
+ pdf = PendingOrdersPdf.new
201
+ pdf.orders = Order.where(:status => 'pending').all
202
+ send_data pdf.to_pdf, :filename => "pending_orders.pdf", :type => "application/pdf", :disposition => "inline"
197
203
  end
198
204
 
199
205
  # PUT /admin/orders/:id
@@ -169,7 +169,7 @@ module Caboose
169
169
  })
170
170
 
171
171
  # Make a copy of all the items; so it can be filtered more
172
- @all_products = @gen.all_records
172
+ @all_products = @gen.all_records
173
173
 
174
174
  # Apply any extra filters
175
175
  if params[:filters]
@@ -177,6 +177,7 @@ module Caboose
177
177
  @all_products = @all_products.where('vendor_id IS NULL') if params[:filters][:no_vendor]
178
178
  end
179
179
 
180
+
180
181
  # Get the correct page of the results
181
182
  @products = @all_products.limit(@gen.limit).offset(@gen.offset)
182
183
  @category_options = Category.options(@site.id)
@@ -194,7 +195,8 @@ module Caboose
194
195
  pager = Caboose::PageBarGenerator.new(params, {
195
196
  'site_id' => @site.id,
196
197
  'vendor_name' => '',
197
- 'search_like' => '',
198
+ 'search_like' => '',
199
+ 'category_id' => '',
198
200
  'price' => params[:filters] && params[:filters][:missing_prices] ? 0 : ''
199
201
  }, {
200
202
  'model' => 'Caboose::Product',
@@ -207,8 +209,9 @@ module Caboose
207
209
  'search_like' => 'store_products.title_concat_vendor_name_like'
208
210
  },
209
211
  'includes' => {
210
- 'vendor_name' => [ 'vendor' , 'name' ],
211
- 'price' => [ 'variants' , 'price' ]
212
+ 'category_id' => [ 'categories' , 'id' ],
213
+ 'vendor_name' => [ 'vendor' , 'name' ],
214
+ 'price' => [ 'variants' , 'price' ]
212
215
  }
213
216
  })
214
217
  render :json => {
@@ -293,7 +293,8 @@ module Caboose
293
293
  v.price = '%.2f' % params[:price].strip.to_f
294
294
  v.option1 = params[:option1] if p.option1
295
295
  v.option2 = params[:option2] if p.option2
296
- v.option3 = params[:option3] if p.option3
296
+ v.option3 = params[:option3] if p.option3
297
+ v.status = 'Active'
297
298
  v.save
298
299
 
299
300
  resp.success = true
@@ -328,7 +329,8 @@ module Caboose
328
329
  v.price = '%.2f' % row[2].strip.to_f
329
330
  v.option1 = row[3] if p.option1
330
331
  v.option2 = row[4] if p.option2
331
- v.option3 = row[5] if p.option3
332
+ v.option3 = row[5] if p.option3
333
+ v.status = 'Active'
332
334
  v.save
333
335
  end
334
336
  resp.success = true
@@ -337,6 +339,41 @@ module Caboose
337
339
  render :json => resp
338
340
  end
339
341
 
342
+ # PUT /admin/products/:product_id/variants/bulk
343
+ def admin_bulk_update
344
+ return unless user_is_allowed_to 'edit', 'sites'
345
+
346
+ resp = Caboose::StdClass.new
347
+ variants = params[:model_ids].collect{ |variant_id| Variant.find(variant_id) }
348
+
349
+ save = true
350
+ params.each do |k,value|
351
+ case k
352
+ when 'alternate_id' then variants.each { |v| v.alternate_id = value }
353
+ when 'sku' then variants.each { |v| v.sku = value }
354
+ when 'barcode' then variants.each { |v| v.barcode = value }
355
+ when 'price' then variants.each { |v| v.price = value }
356
+ when 'quantity_in_stock' then variants.each { |v| v.quantity_in_stock = value }
357
+ when 'ignore_quantity' then variants.each { |v| v.ignore_quantity = value }
358
+ when 'allow_backorder' then variants.each { |v| v.allow_backorder = value }
359
+ when 'status' then variants.each { |v| v.status = value }
360
+ when 'weight' then variants.each { |v| v.weight = value }
361
+ when 'length' then variants.each { |v| v.length = value }
362
+ when 'width' then variants.each { |v| v.width = value }
363
+ when 'height' then variants.each { |v| v.height = value }
364
+ when 'option1' then variants.each { |v| v.option1 = value }
365
+ when 'option2' then variants.each { |v| v.option2 = value }
366
+ when 'option3' then variants.each { |v| v.option3 = value }
367
+ when 'requires_shipping' then variants.each { |v| v.requires_shipping = value }
368
+ when 'taxable' then variants.each { |v| v.taxable = value }
369
+ end
370
+ end
371
+ variants.each{ |v| v.save }
372
+
373
+ resp.success = true
374
+ render :json => resp
375
+ end
376
+
340
377
  # POST /admin/products/:product_id/variants/remove
341
378
  def admin_remove_variants
342
379
  params[:variant_ids].each do |variant_id|
@@ -6,7 +6,7 @@ module Caboose
6
6
  attr_accessor :order
7
7
 
8
8
  def to_pdf
9
- image open("https://dmwwflw4i3miv.cloudfront.net/logo.png"), :position => :center
9
+ #image open("https://dmwwflw4i3miv.cloudfront.net/logo.png"), :position => :center
10
10
  text " "
11
11
  customer_info
12
12
  text " "
@@ -68,7 +68,7 @@ module Caboose
68
68
  end
69
69
  tbl << [{ :content => "Subtotal" , :colspan => 4, :align => :right }, { :content => sprintf("%.2f", order.subtotal ) , :align => :right }]
70
70
  tbl << [{ :content => "Tax" , :colspan => 4, :align => :right }, { :content => sprintf("%.2f", order.tax ? order.tax : 0.0 ) , :align => :right }]
71
- tbl << [{ :content => "#{order.shipping_method} Shipping & Handling" , :colspan => 4, :align => :right }, { :content => sprintf("%.2f", order.shipping_and_handling ) , :align => :right }]
71
+ #tbl << [{ :content => "#{order.shipping_method} Shipping & Handling" , :colspan => 4, :align => :right }, { :content => sprintf("%.2f", order.shipping_and_handling ) , :align => :right }]
72
72
  tbl << [{ :content => "Discount" , :colspan => 4, :align => :right }, { :content => sprintf("%.2f", order.discount ? order.discount : 0.0 ) , :align => :right }]
73
73
  tbl << [{ :content => "Total" , :colspan => 4, :align => :right }, { :content => sprintf("%.2f", order.total ) , :align => :right }]
74
74
 
@@ -0,0 +1,83 @@
1
+ require 'prawn'
2
+
3
+ module Caboose
4
+ class PendingOrdersPdf < Prawn::Document
5
+
6
+ attr_accessor :orders
7
+ attr_accessor :order
8
+
9
+ def to_pdf
10
+ #image open("https://dmwwflw4i3miv.cloudfront.net/logo.png"), :position => :center
11
+ text " "
12
+ self.orders.each_with_index do |o, i|
13
+ start_new_page if i > 0
14
+ self.order = o
15
+ customer_info
16
+ text " "
17
+ order_table
18
+ end
19
+ render
20
+ end
21
+
22
+ def customer_info
23
+
24
+ order_info = "Order ##{self.order.id}\n"
25
+ order_info << "Status: #{self.order.status.capitalize}\n"
26
+ order_info << "Received: #{self.order.date_created ? self.order.date_created.strftime("%m/%d/%Y") : ''}\n"
27
+ if order.status == 'shipped' && self.order.date_shipped
28
+ order_info << "Shipped: #{self.order.date_shipped.strftime("%m/%d/%Y")}"
29
+ end
30
+
31
+ c = self.order.customer
32
+ billed_to = c ? "#{c.first_name} #{c.last_name}\n#{c.email}\n#{c.phone}" : ''
33
+
34
+ sa = self.order.shipping_address
35
+ shipped_to = "#{sa.name}\n#{sa.address1}\n"
36
+ shipped_to << "#{sa.address2}\n" if sa.address2 && sa.address2.strip.length > 0
37
+ shipped_to << "#{sa.city}, #{sa.state} #{sa.zip}"
38
+
39
+ tbl = []
40
+ tbl << [
41
+ { :content => "Order Info" , :align => :center, :valign => :bottom, :width => 180 },
42
+ { :content => "Billed To" , :align => :center, :valign => :bottom, :width => 180 },
43
+ { :content => "Shipped To" , :align => :center, :valign => :bottom, :width => 180 }
44
+ ]
45
+ tbl << [
46
+ { :content => order_info, :valign => :top, :height => 75 },
47
+ { :content => billed_to , :valign => :top, :height => 75 },
48
+ { :content => shipped_to, :valign => :top, :height => 75 }
49
+ ]
50
+ table tbl
51
+
52
+ end
53
+
54
+ def order_table
55
+
56
+ tbl = []
57
+ tbl << [
58
+ { :content => "Item" , :align => :center, :valign => :bottom },
59
+ { :content => "Tracking Number" , :align => :center, :valign => :bottom },
60
+ { :content => "Unit Price" , :align => :center, :valign => :bottom },
61
+ { :content => "Quantity" , :align => :center, :valign => :bottom },
62
+ { :content => "Subtotal" , :align => :center, :valign => :bottom, :width => 60 }
63
+ ]
64
+
65
+ order.line_items.each do |li|
66
+ tbl << [
67
+ "#{li.variant.product.title}\n#{li.variant.sku}\n#{li.variant.title}",
68
+ { :content => li.tracking_number },
69
+ { :content => sprintf("%.2f", li.variant.price) , :align => :right },
70
+ { :content => "#{li.quantity}" , :align => :right },
71
+ { :content => sprintf("%.2f", li.subtotal) , :align => :right }
72
+ ]
73
+ end
74
+ tbl << [{ :content => "Subtotal" , :colspan => 4, :align => :right }, { :content => sprintf("%.2f", order.subtotal ) , :align => :right }]
75
+ tbl << [{ :content => "Tax" , :colspan => 4, :align => :right }, { :content => sprintf("%.2f", order.tax ? order.tax : 0.0 ) , :align => :right }]
76
+ #tbl << [{ :content => "#{order.shipping_method} Shipping & Handling" , :colspan => 4, :align => :right }, { :content => sprintf("%.2f", order.shipping_and_handling ) , :align => :right }]
77
+ tbl << [{ :content => "Discount" , :colspan => 4, :align => :right }, { :content => sprintf("%.2f", order.discount ? order.discount : 0.0 ) , :align => :right }]
78
+ tbl << [{ :content => "Total" , :colspan => 4, :align => :right }, { :content => sprintf("%.2f", order.total ) , :align => :right }]
79
+
80
+ table tbl
81
+ end
82
+ end
83
+ end
@@ -87,6 +87,11 @@ module Caboose
87
87
  self.variants.where('price > ? AND status != ?', 0, 'Deleted').order('price ASC').first
88
88
  end
89
89
 
90
+ def first_tiny_image_url
91
+ return '' if self.product_images.count == 0
92
+ return self.product_images.first.image.url(:tiny)
93
+ end
94
+
90
95
  def featured_image
91
96
  self.product_images.reject{|p| p.nil?}.first
92
97
  end
@@ -29,6 +29,7 @@
29
29
  <p><input name="phone" type="text" placeholder="Phone" /></p>
30
30
  <p><input name="pass1" type="password" placeholder="Password" /></p>
31
31
  <p><input name="pass2" type="password" placeholder="Confirm Password" /></p>
32
+ <p><input name='newsletter' id='newsletter' type='checkbox' value='1' /> <label for='newsletter'>Send me updates on new products and special deals</label></p>
32
33
  <p><input type="submit" value="Continue" /></p>
33
34
  </form>
34
35
  </div>
@@ -18,7 +18,7 @@
18
18
  <% end %>
19
19
  <input type='button' value='Resend Confirmation' onclick="resend_confirmation(<%= @order.id %>)" />
20
20
  <input type='button' value='Add Item' onclick="controller.add_variant();" />
21
- <input type='button' value='Print Order' onclick="print_order(<%= @order.id %>);" />
21
+ <input type='button' value='Print Order' onclick="controller.print_order(<%= @order.id %>);" />
22
22
 
23
23
  <% str = Caboose.plugin_hook('admin_edit_order_buttons', "", @order) %>
24
24
  <% if str %><%= raw str %><% end %>
@@ -6,7 +6,8 @@
6
6
 
7
7
  <p>
8
8
  <a href='#' onclick="$('#search_form').toggle(400, function() { modal.autosize(); });">Show/hide search form</a> |
9
- <a href='/admin/orders/new'>New Manual Order</a>
9
+ <a href='/admin/orders/new'>New Manual Order</a> |
10
+ <a href='/admin/orders/print-pending' target='_blank'>Print Pending Orders</a>
10
11
  </p>
11
12
  <form action='/admin/orders' method='get' id='search_form' style='display: none;'>
12
13
  <p><input type='text' name='id' placeholder='Order ID' value="<%= @pager.params['id'] %>" style='width: 100px;' /></p>
@@ -3,16 +3,27 @@
3
3
  <% if @posts && @posts.count > 0 %>
4
4
  <ul>
5
5
  <% @posts.each do |p| %>
6
- <li>
7
- <figure><a href="/posts/<%= p.id %>"><img src="<%= p.image.url(:thumb) %>" /></a></figure>
8
- <h5><strong><%= raw a[:title] %></strong></h5>
9
- <p class="h-space-mvt"><%= a[:created_at].strftime("%m/%d/%Y") %></p>
10
- <p class="h-space-mbt"><%= truncate(strip_tags(a[:body]), :length => 175) %></p>
11
- <a class="m-btn-red h-space-mts" href="/news/<%= a.id %>">Read More</a>
6
+ <li class='clearfix'>
7
+ <% if p.image && !p.image.url.include?('placehold.it') %>
8
+ <figure><a href="/posts/<%= p.id %>"><img src="<%= p.image.url(:thumb) %>" /></a></figure>
9
+ <% end %>
10
+ <h5><strong><%= raw p[:title] %></strong></h5>
11
+ <p class="h-space-mvt"><%= p[:created_at].strftime("%m/%d/%Y") %></p>
12
+ <p class="h-space-mbt"><%= raw Caboose.teaser_text(p[:body], 200) %></p>
13
+ <a class="m-btn-red h-space-mts" href="/posts/<%= p.id %>">Read More</a>
12
14
  </li>
13
15
  <% end %>
14
16
  </ul>
15
17
  <% else %>
16
18
  <p>There are no posts right now.</p>
17
19
  <% end %>
18
- </div>
20
+ </div>
21
+
22
+ <% content_for :caboose_css do %>
23
+ <style type='text/css'>
24
+
25
+ .posts li { min-height: 200px; }
26
+ .posts li figure { float: right; margin: 0 0 20px 10px; }
27
+
28
+ </style>
29
+ <% end %>
@@ -9,12 +9,9 @@ p = @product
9
9
 
10
10
  <% content_for :caboose_css do %>
11
11
  <style type='text/css'>
12
- #categories input[type='checkbox'] { position: relative; }
13
- #categories ul { list-style: none; margin: 0; padding: 0; }
14
- #categories ul ul ul { margin-left: 20px; }
15
- #categories li { list-style: none; }
16
- #categories h3 { margin: 0; padding: 0; font-weight: bold; display: inline; }
17
- #categories td { padding: 10px; }
12
+ #content table.data input[type='checkbox'] { position: relative; margin: 0; padding: 0; }
13
+ #content table.data td { padding: 0 10px !important; }
14
+ label span.prefix { display: inline-block; margin: 0 8px; }
18
15
  </style>
19
16
  <% end %>
20
17
  <% content_for :caboose_js do %>
@@ -33,11 +30,18 @@ $(document).ready(function() {
33
30
  nice_name: 'Categories',
34
31
  type: 'checkbox-multiple',
35
32
  options_url: '/admin/categories/options',
36
- value: <%= raw Caboose.json(p.categories.collect{ |cat| cat.id }) %>,
33
+ value: <%= raw Caboose.json(p.categories.collect{ |cat| cat.id }) %>,
37
34
  fixed_placeholder: false,
38
- width: 400
39
- }
40
- ]
35
+ width: 400
36
+ }
37
+ ],
38
+ on_load: function() {
39
+ setTimeout(function() {
40
+ $('label').each(function(i, el) {
41
+ $(el).html($(el).html().replace(/-/g, "<span class='prefix'>-</span>"));
42
+ });
43
+ }, 400);
44
+ }
41
45
  });
42
46
  });
43
47
 
@@ -8,9 +8,9 @@
8
8
 
9
9
  <form action="/admin/products" method="get" id="search_form" style="margin: 0 0 12px">
10
10
  <p><input type="text" name="search_like" placeholder="Title or Vendor Name" value="<%= params[:search_like] %>" style="width: 350px" /></p>
11
- <p><select type="text" name="category_id" placeholder="Category" value="<%= params[:search_like] %>" style="width: 350px">
11
+ <p><select type="text" name="category_id" placeholder="Category" style="width: 350px">
12
12
  <option value=''>-- Category --</option>
13
- <% @category_options.each do |cat| %><option value="<%= cat[:value] %>"<% if cat[:value] == params[:category_id] %> selected='true'<% end %>><%= cat[:text] %></option><% end %>
13
+ <% @category_options.each do |cat| %><option value="<%= cat[:value] %>"<% if cat[:value].to_i == params[:category_id].to_i %> selected='true'<% end %>><%= cat[:text] %></option><% end %>
14
14
  </select></p>
15
15
  <p>
16
16
  <input type="submit" value="Search" />
@@ -24,6 +24,12 @@
24
24
  <%= javascript_include_tag 'caboose/model/all' %>
25
25
  <script type='text/javascript'>
26
26
 
27
+ function tiny_product_image(p) {
28
+ if (p.images.length == 0) return '';
29
+ if (p.images[0].urls.length == 0) return '';
30
+ return "<img src='" + p.images[0].urls['tiny'] + "' />";
31
+ }
32
+
27
33
  $(document).ready(function() {
28
34
  var that = this;
29
35
  var table = new IndexTable({
@@ -34,8 +40,10 @@ $(document).ready(function() {
34
40
  allow_bulk_delete: true,
35
41
  allow_duplicate: false,
36
42
  allow_advanced_edit: true,
37
- fields: [
43
+ after_add: 'redirect',
44
+ fields: [
38
45
  { show: true , name: 'id' , nice_name: 'ID' , sort: 'id' , type: 'text' , value: function(p) { return p.id }, width: 500, editable: false },
46
+ { show: true , name: 'image' , nice_name: 'Image' , sort: 'id' , type: 'image' , value: tiny_product_image, width: 500, editable: false },
39
47
  { show: true , name: 'title' , nice_name: 'Title' , sort: 'title' , type: 'text' , value: function(p) { return p.title }, width: 200 },
40
48
  { show: true , name: 'caption' , nice_name: 'Caption' , sort: 'caption' , type: 'text' , value: function(p) { return p.caption }, width: 200 },
41
49
  { show: true , name: 'status' , nice_name: 'Status' , sort: 'status' , type: 'select' , value: function(p) { return p.status }, width: 200, options_url: '/admin/products/status-options' },
@@ -60,28 +60,28 @@ $(document).ready(function() {
60
60
  form_authenticity_token: '<%= form_authenticity_token %>',
61
61
  container: 'variants',
62
62
  base_url: '/admin/products/<%= p.id %>/variants',
63
- allow_bulk_edit: false,
63
+ allow_bulk_edit: true,
64
64
  allow_bulk_delete: true,
65
65
  allow_duplicate: false,
66
66
  allow_advanced_edit: true,
67
67
  fields: [
68
- <% 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' },<% end %>
69
- <% 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' },<% end %>
70
- <% 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' },<% end %>
71
- { show: true , name: 'status' , nice_name: 'Status' , sort: 'status' , type: 'text' , value: function(v) { return v.status }, width: 75, align: 'left' },
72
- { 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' },
73
- { show: true , name: 'sku' , nice_name: 'SKU' , sort: 'sku' , type: 'text' , value: function(v) { return v.sku }, width: 75, align: 'left' },
74
- { show: false , name: 'barcode' , nice_name: 'Barcode' , sort: 'barcode' , type: 'text' , value: function(v) { return v.barcode }, width: 75, align: 'left' },
75
- { show: true , name: 'price' , nice_name: 'Price' , sort: 'price' , type: 'text' , value: function(v) { return v.price }, width: 75, align: 'right' },
76
- { 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' },
77
- { show: false , name: 'weight' , nice_name: 'Weight (grams)' , sort: 'weight' , type: 'text' , value: function(v) { return v.weight }, width: 50, align: 'right' },
78
- { show: false , name: 'length' , nice_name: 'Length (in)' , sort: 'length' , type: 'text' , value: function(v) { return v.length }, width: 50, align: 'right' },
79
- { show: false , name: 'width' , nice_name: 'Width (in)' , sort: 'width' , type: 'text' , value: function(v) { return v.width }, width: 50, align: 'right' },
80
- { show: false , name: 'height' , nice_name: 'Height (in)' , sort: 'height' , type: 'text' , value: function(v) { return v.height }, width: 50, align: 'right' },
81
- { show: false , name: 'cylinder' , nice_name: 'Cylinder' , sort: 'cylinder' , type: 'checkbox' , value: function(v) { return v.cylinder }, width: 50, align: 'center' },
82
- { show: false , name: 'requires_shipping' , nice_name: 'Requires shipping' , sort: 'requires_shipping' , type: 'checkbox' , value: function(v) { return v.requires_shipping }, width: 50, align: 'center' },
83
- { show: false , name: 'taxable' , nice_name: 'Taxable' , sort: 'taxable' , type: 'checkbox' , value: function(v) { return v.taxable }, width: 50, align: 'center' },
84
- { show: false , name: 'allow_backorder' , nice_name: 'Allow backorder' , sort: 'allow_backorder' , type: 'checkbox' , value: function(v) { return v.allow_backorder }, width: 50, align: 'center' }
68
+ <% 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 %>
69
+ <% 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 %>
70
+ <% 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 %>
71
+ { show: true , name: 'status' , nice_name: 'Status' , sort: 'status' , type: 'text' , value: function(v) { return v.status }, width: 75, align: 'left' , bulk_edit: true },
72
+ { 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 },
73
+ { show: true , name: 'sku' , nice_name: 'SKU' , sort: 'sku' , type: 'text' , value: function(v) { return v.sku }, width: 75, align: 'left' , bulk_edit: true },
74
+ { show: false , name: 'barcode' , nice_name: 'Barcode' , sort: 'barcode' , type: 'text' , value: function(v) { return v.barcode }, width: 75, align: 'left' , bulk_edit: true },
75
+ { show: true , name: 'price' , nice_name: 'Price' , sort: 'price' , type: 'text' , value: function(v) { return v.price }, width: 75, align: 'right' , bulk_edit: true },
76
+ { 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 },
77
+ { show: false , name: 'weight' , nice_name: 'Weight (grams)' , sort: 'weight' , type: 'text' , value: function(v) { return v.weight }, width: 50, align: 'right' , bulk_edit: true },
78
+ { show: false , name: 'length' , nice_name: 'Length (in)' , sort: 'length' , type: 'text' , value: function(v) { return v.length }, width: 50, align: 'right' , bulk_edit: true },
79
+ { show: false , name: 'width' , nice_name: 'Width (in)' , sort: 'width' , type: 'text' , value: function(v) { return v.width }, width: 50, align: 'right' , bulk_edit: true },
80
+ { show: false , name: 'height' , nice_name: 'Height (in)' , sort: 'height' , type: 'text' , value: function(v) { return v.height }, width: 50, align: 'right' , bulk_edit: true },
81
+ { show: false , name: 'cylinder' , nice_name: 'Cylinder' , sort: 'cylinder' , type: 'checkbox' , value: function(v) { return v.cylinder }, width: 50, align: 'center' , bulk_edit: true },
82
+ { show: false , name: 'requires_shipping' , nice_name: 'Requires shipping' , sort: 'requires_shipping' , type: 'checkbox' , value: function(v) { return v.requires_shipping }, width: 50, align: 'center' , bulk_edit: true },
83
+ { show: false , name: 'taxable' , nice_name: 'Taxable' , sort: 'taxable' , type: 'checkbox' , value: function(v) { return v.taxable }, width: 50, align: 'center' , bulk_edit: true },
84
+ { show: false , name: 'allow_backorder' , nice_name: 'Allow backorder' , sort: 'allow_backorder' , type: 'checkbox' , value: function(v) { return v.allow_backorder }, width: 50, align: 'center' , bulk_edit: true }
85
85
  ],
86
86
  new_model_text: 'New Variant',
87
87
  new_model_fields: [
@@ -8,20 +8,24 @@
8
8
  </form>
9
9
 
10
10
  <% if @vendors.count > 0 %>
11
- <table class="data" style="width: 350px">
11
+ <table class="data">
12
12
  <tr>
13
13
  <%= raw @pager.sortable_table_headings({
14
- 'id' => 'ID',
15
- 'name' => 'Name',
16
- 'status' => 'Status'
14
+ 'id' => 'ID',
15
+ 'id,name' => 'Image',
16
+ 'name' => 'Name',
17
+ 'status' => 'Status',
18
+ 'featured' => 'Featured',
17
19
  }) %>
18
20
  </tr>
19
21
 
20
22
  <% @vendors.each do |vendor| %>
21
23
  <tr onclick="window.location='/admin/vendors/<%= vendor.id %>';">
22
24
  <td style="text-align: center"><%= raw vendor.id %></td>
25
+ <td><% if vendor.image %><img src='<%= raw vendor.image.url(:tiny) %>' /><% else %>&nbsp;<% end %></td>
23
26
  <td><%= raw vendor.name %></td>
24
27
  <td><%= raw vendor.status %></td>
28
+ <td><%= vendor.featured ? 'Yes' : 'No' %></td>
25
29
  </tr>
26
30
  <% end %>
27
31
  </table>
data/config/routes.rb CHANGED
@@ -403,10 +403,11 @@ Caboose::Engine.routes.draw do
403
403
  put "/admin/products/:product_id/variants/:id/attach-to-image" => "variants#admin_attach_to_image"
404
404
  put "/admin/products/:product_id/variants/:id/unattach-from-image" => "variants#admin_unattach_from_image"
405
405
  get "/admin/products/:product_id/variants/:id" => "variants#admin_edit"
406
+ put '/admin/products/:product_id/variants/bulk' => 'variants#admin_bulk_update'
406
407
  put "/admin/products/:product_id/variants/:id" => "variants#admin_update"
407
408
  get "/admin/products/:product_id/variants/new" => "variants#admin_new"
408
409
  post '/admin/products/:product_id/variants/bulk' => 'variants#admin_bulk_add'
409
- post "/admin/products/:product_id/variants" => "variants#admin_add"
410
+ post "/admin/products/:product_id/variants" => "variants#admin_add"
410
411
  delete '/admin/products/:product_id/variants/bulk' => 'variants#admin_bulk_delete'
411
412
  delete "/admin/products/:product_id/variants/:id" => "variants#admin_delete"
412
413
  get "/admin/variants/status-options" => "variants#admin_status_options"
@@ -467,6 +468,7 @@ Caboose::Engine.routes.draw do
467
468
  get "/admin/orders/test-gmail" => "orders#admin_mail_test_gmail"
468
469
  get "/admin/orders/status-options" => "orders#admin_status_options"
469
470
  get "/admin/orders/new" => "orders#admin_new"
471
+ get "/admin/orders/print-pending" => "orders#admin_print_pending"
470
472
  get "/admin/orders/:id/capture" => "orders#capture_funds"
471
473
  get "/admin/orders/:id/json" => "orders#admin_json"
472
474
  get "/admin/orders/:id/print" => "orders#admin_print"
@@ -1,3 +1,3 @@
1
1
  module Caboose
2
- VERSION = '0.5.68'
2
+ VERSION = '0.5.69'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: caboose-cms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.68
4
+ version: 0.5.69
5
5
  platform: ruby
6
6
  authors:
7
7
  - William Barry
@@ -586,6 +586,7 @@ files:
586
586
  - app/models/caboose/payment_processors/authorizenet.rb
587
587
  - app/models/caboose/payment_processors/base.rb
588
588
  - app/models/caboose/payment_processors/payscape.rb
589
+ - app/models/caboose/pending_orders_pdf.rb
589
590
  - app/models/caboose/permanent_redirect.rb
590
591
  - app/models/caboose/permission.rb
591
592
  - app/models/caboose/post.rb