caboose-cms 0.5.15 → 0.5.16

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.
Files changed (40) hide show
  1. checksums.yaml +9 -9
  2. data/app/assets/javascripts/caboose/cart2.js +98 -0
  3. data/app/assets/javascripts/caboose/model/index_table.js +82 -30
  4. data/app/assets/javascripts/caboose/model/model_binder.js +4 -4
  5. data/app/assets/stylesheets/caboose/admin.css +1 -0
  6. data/app/assets/stylesheets/caboose/admin_main.css +0 -42
  7. data/app/assets/stylesheets/caboose/cart.scss +41 -0
  8. data/app/assets/stylesheets/caboose/checkout.css.scss +2 -3
  9. data/app/assets/stylesheets/caboose/message_boxes.scss +49 -0
  10. data/app/assets/templates/caboose/cart/add_to_cart.jst.ejs +1 -1
  11. data/app/controllers/caboose/block_types_controller.rb +3 -1
  12. data/app/controllers/caboose/cart_controller.rb +30 -23
  13. data/app/controllers/caboose/checkout_controller.rb +11 -1
  14. data/app/controllers/caboose/products_controller.rb +28 -14
  15. data/app/controllers/caboose/stackable_groups_controller.rb +107 -0
  16. data/app/models/caboose/line_item.rb +20 -6
  17. data/app/models/caboose/order.rb +2 -1
  18. data/app/models/caboose/order_package.rb +103 -0
  19. data/app/models/caboose/product.rb +2 -1
  20. data/app/models/caboose/schema.rb +45 -3
  21. data/app/models/caboose/shipping_calculator.rb +101 -60
  22. data/app/models/caboose/shipping_package.rb +80 -0
  23. data/app/models/caboose/site.rb +3 -1
  24. data/app/models/caboose/stackable_group.rb +17 -0
  25. data/app/models/caboose/tax_calculator.rb +1 -2
  26. data/app/models/caboose/variant.rb +2 -5
  27. data/app/views/caboose/cart/index.html.erb +19 -6
  28. data/app/views/caboose/checkout/_cart.html.erb +49 -52
  29. data/app/views/caboose/checkout/empty.html.erb +9 -2
  30. data/app/views/caboose/checkout/step_one.html.erb +2 -3
  31. data/app/views/caboose/checkout/step_three.html.erb +28 -10
  32. data/app/views/caboose/checkout/step_two.html.erb +2 -4
  33. data/app/views/caboose/pages/admin_edit_content.html.erb +1 -1
  34. data/app/views/caboose/products/admin_index.html.erb +12 -11
  35. data/app/views/caboose/sites/admin_edit.html.erb +33 -6
  36. data/app/views/caboose/stackable_groups/admin_index.html.erb +43 -0
  37. data/config/routes.rb +15 -6
  38. data/lib/caboose/version.rb +1 -1
  39. data/lib/tasks/caboose.rake +7 -1
  40. metadata +36 -14
@@ -1,52 +1,49 @@
1
- <table id="cart">
2
- <tr>
3
- <th>Item</th>
4
- <th>Quantity</th>
5
- <th>Subtotal</th>
6
- </tr>
7
-
8
- <% @order.line_items.each do |line_item| %>
9
- <tr>
10
- <td>
11
- <%= line_item.variant.product.title %> - <%= line_item.variant.title %>
12
-
13
- <% line_item.customizations.each do |customization| %>
14
- <p><%= "- #{customization.variant.product.custom_input}: #{customization.custom_input}"%></p>
15
- <% end %>
16
- </td>
17
- <td align="right"><%= line_item.quantity %></td>
18
- <td align="right"><%= number_to_currency(line_item.subtotal) %></td>
19
- </tr>
20
- <% end %>
21
-
22
- <tr>
23
- <td colspan="2" align="right">Subtotal</td>
24
- <td align="right"><%= number_to_currency(@order.subtotal) %></td>
25
- </tr>
26
-
27
- <% if @order.tax and @order.tax > 0 %>
28
- <tr>
29
- <td colspan="2" align="right">Tax <span class="float: right">+</span></td>
30
- <td align="right"><%= number_to_currency(@order.tax) %></td>
31
- </tr>
32
- <% end %>
33
-
34
- <% if @order.shipping and @order.handling %>
35
- <tr>
36
- <td colspan="2" align="right">Shipping &amp; Handling <span class="float: right">+</span></td>
37
- <td align="right"><%= number_to_currency(@order.shipping + @order.handling) %></td>
38
- </tr>
39
- <% end %>
40
-
41
- <% if @order.discounts.any? %>
42
- <tr>
43
- <td colspan="2" align="right">Gift Card <span class="float: right">-</span></td>
44
- <td align="right"><%= number_to_currency(@order.discounts.first.amount_current) %></td>
45
- </tr>
46
- <% end %>
47
-
48
- <tr>
49
- <td colspan="2" align="right">Total <span class="float: right">=</span></td>
50
- <td align="right"><%= number_to_currency(@order.total) %></td>
51
- </tr>
52
- </table>
1
+
2
+ <div class='constrain'>
3
+ <table id="cart">
4
+ <tr>
5
+ <th>Item</th>
6
+ <th>Quantity</th>
7
+ <th>Subtotal</th>
8
+ </tr>
9
+ <% @order.line_items.each do |line_item| %>
10
+ <tr>
11
+ <td>
12
+ <%= line_item.variant.product.title %> - <%= line_item.variant.title %>
13
+
14
+ <% line_item.customizations.each do |customization| %>
15
+ <p><%= "- #{customization.variant.product.custom_input}: #{customization.custom_input}"%></p>
16
+ <% end %>
17
+ </td>
18
+ <td align="right"><%= line_item.quantity %></td>
19
+ <td align="right"><%= number_to_currency(line_item.subtotal) %></td>
20
+ </tr>
21
+ <% end %>
22
+ <tr>
23
+ <td colspan="2" align="right">Subtotal</td>
24
+ <td align="right"><%= number_to_currency(@order.subtotal) %></td>
25
+ </tr>
26
+ <% if @order.tax and @order.tax > 0 %>
27
+ <tr>
28
+ <td colspan="2" align="right">Tax <span class="float: right">+</span></td>
29
+ <td align="right"><%= number_to_currency(@order.tax) %></td>
30
+ </tr>
31
+ <% end %>
32
+ <% if @order.shipping and @order.handling %>
33
+ <tr>
34
+ <td colspan="2" align="right">Shipping &amp; Handling <span class="float: right">+</span></td>
35
+ <td align="right"><%= number_to_currency(@order.shipping + @order.handling) %></td>
36
+ </tr>
37
+ <% end %>
38
+ <% if @order.discounts.any? %>
39
+ <tr>
40
+ <td colspan="2" align="right">Gift Card <span class="float: right">-</span></td>
41
+ <td align="right"><%= number_to_currency(@order.discounts.first.amount_current) %></td>
42
+ </tr>
43
+ <% end %>
44
+ <tr>
45
+ <td colspan="2" align="right">Total <span class="float: right">=</span></td>
46
+ <td align="right"><%= number_to_currency(@order.total) %></td>
47
+ </tr>
48
+ </table>
49
+ </div>
@@ -1,2 +1,9 @@
1
- <h3>Your cart is empty.</h3>
2
- <p><a href="/">Back to Store</a></p>
1
+
2
+ <div id='checkout' class='constrain'>
3
+ <p>&nbsp;</p>
4
+ <p class='note'>Your cart is empty. <a href="/products">Go back to the store</a></p>
5
+ </div>
6
+
7
+ <% content_for :caboose_css do %>
8
+ <%= stylesheet_link_tag 'caboose/message_boxes' %>
9
+ <% end %>
@@ -1,7 +1,5 @@
1
1
  <div id="checkout">
2
- <h2>Checkout</h2>
3
- <%= raw checkout_nav(1) %>
4
-
2
+
5
3
  <% if @logged_in_user.id == 1 %>
6
4
  <p class='note error'>You are logged in as the admin user. Please <a href='/logout'>logout</a> and complete your order as a different user.</p>
7
5
  <% else %>
@@ -48,5 +46,6 @@
48
46
  <%= javascript_include_tag 'caboose/checkout_step1' %>
49
47
  <% end %>
50
48
  <%= content_for :caboose_css do %>
49
+ <%= stylesheet_link_tag 'caboose/message_boxes' %>
51
50
  <%= stylesheet_link_tag 'caboose/checkout' %>
52
51
  <% end %>
@@ -1,15 +1,32 @@
1
- <div id="checkout">
2
- <h2>Checkout</h2>
3
- <%= raw checkout_nav(3) %>
1
+ <div id="checkout" class='constrain'>
4
2
  <section id="checkout-shipping">
5
- <div class="wrapper">
6
- <p>Please select how you would like your products to be delivered</p>
7
- <% @rates.each do |rate| %>
8
- <button class="blue" data-shipping-code="<%= rate[:service_code] %>" data-shipping-method="<%= rate[:service_name] %>">
9
- <%= number_to_currency(rate[:total_price], :precision => 2) %><br /><%= rate[:service_name] %>
10
- </button>
3
+ <div class="wrapper">
4
+ <% if @rates.count > 1 %>
5
+ <p>Your package must be shipped in multiple packages. Please select
6
+ how you would like each package to be delivered.</p>
7
+ <% end %>
8
+ <table>
9
+ <tr>
10
+ <th>Package</th>
11
+ <th>Shipping Options</th>
12
+ </tr>
13
+ <% @rates.each_with_index do |arr, i| %>
14
+ <% op = arr[0] %>
15
+ <% sp = op.shipping_package %>
16
+ <tr>
17
+ <td valign='top'>
18
+ <ul><% op.line_items.each do |li| %><li><%= li.variant.product.title %> (<%= li.variant.title %>)<% end %></ul>
19
+ </td>
20
+ <td valign='top'>
21
+ <% arr[1].each do |rate| %>
22
+ <button class="blue" data-shipping-code="<%= rate[:service_code] %>" data-shipping-method="<%= rate[:service_name] %>">
23
+ <%= number_to_currency(rate[:total_price], :precision => 2) %><br /><%= rate[:service_name] %>
24
+ </button>
25
+ <% end %>
26
+ </td>
27
+ </tr>
11
28
  <% end %>
12
- </select>
29
+ </table>
13
30
  </div>
14
31
  </section>
15
32
  <section id="checkout-continue">
@@ -22,5 +39,6 @@
22
39
  <%= javascript_include_tag 'caboose/checkout_step3' %>
23
40
  <% end %>
24
41
  <%= content_for :caboose_css do %>
42
+ <%= stylesheet_link_tag 'caboose/message_boxes' %>
25
43
  <%= stylesheet_link_tag 'caboose/checkout' %>
26
44
  <% end %>
@@ -2,10 +2,7 @@
2
2
  sa = @order.shipping_address
3
3
  ba = @order.billing_address
4
4
  %>
5
-
6
- <div id="checkout" class='constrain'>
7
- <h2>Checkout</h2>
8
- <%= raw checkout_nav(2) %>
5
+ <div id="checkout" class='constrain'>
9
6
  <% if @logged_in_user.id == 1 %>
10
7
  <p class='note error'>You are logged in as the admin user. Please <a href='/logout'>logout</a> and complete your order as a different user.</p>
11
8
  <% else %>
@@ -55,6 +52,7 @@ ba = @order.billing_address
55
52
  <%= javascript_include_tag 'caboose/checkout_step2' %>
56
53
  <% end %>
57
54
  <%= content_for :caboose_css do %>
55
+ <%= stylesheet_link_tag 'caboose/message_boxes' %>
58
56
  <%= stylesheet_link_tag 'caboose/checkout' %>
59
57
  <% end %>
60
58
 
@@ -61,7 +61,7 @@ $(document).ready(function() {
61
61
  .attr('id', 'tiny_header')
62
62
  .append($('<a/>').attr('href', '/admin/pages').html("< Back"))
63
63
  .append($('<a/>').attr('href', '/admin/pages/<%= @page.id %>/layout').html("Page Layout"))
64
- .append($('<a/>').attr('href', '/admin/pages/<%= @page.id %>/edit').html("Page Settings"))
64
+ .append($('<a/>').attr('href', '/admin/pages/<%= @page.id %>').html("Page Settings"))
65
65
  );
66
66
  });
67
67
 
@@ -30,17 +30,18 @@ $(document).ready(function() {
30
30
  allow_duplicate: false,
31
31
  allow_advanced_edit: true,
32
32
  fields: [
33
- { show: true , name: 'id' , nice_name: 'ID' , sort: 'id' , type: 'text' , value: function(p) { return p.id }, width: 500, editable: false },
34
- { show: true , name: 'title' , nice_name: 'Title' , sort: 'title' , type: 'text' , value: function(p) { return p.title }, width: 200 },
35
- { show: true , name: 'caption' , nice_name: 'Caption' , sort: 'caption' , type: 'text' , value: function(p) { return p.caption }, width: 200 },
36
- { 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' },
37
- { show: true , name: 'handle' , nice_name: 'URL Handle' , sort: 'handle' , type: 'text' , value: function(p) { return p.handle }, width: 200 },
38
- { show: true , name: 'seo_title' , nice_name: 'SEO Page Title' , sort: 'seo_title' , type: 'text' , value: function(p) { return p.seo_title }, width: 200 },
39
- { show: false, name: 'seo_description' , nice_name: 'SEO Meta Description' , sort: 'seo_description' , type: 'textarea' , value: function(p) { return p.seo_description }, width: 200, height: 150 },
40
- { show: true , name: 'alternate_id' , nice_name: 'Alternate ID' , sort: 'alternate_id' , type: 'text' , value: function(p) { return p.alternate_id }, width: 200 },
41
- { show: true , name: 'date_available' , nice_name: 'Date Available' , sort: 'date_available' , type: 'date' , value: function(p) { return p.date_available }, width: 200 },
42
- { show: false, name: 'featured' , nice_name: 'Featured' , sort: 'featured' , type: 'checkbox' , value: function(p) { return p.featured }, width: 200 },
43
- { show: false, name: 'category_id' , nice_name: 'Categories' , sort: 'categories.name' , type: 'checkbox-multiple' , value: function(p) { return p.categories ? p.categories.map(function(c) { return c.id }) : []; }, text: function(p) { return p.categories ? p.categories.map(function(c) { return c.name }).join(', ') : ''; }, width: 200, height: 200, options_url: '/admin/categories/options' },
33
+ { show: true , name: 'id' , nice_name: 'ID' , sort: 'id' , type: 'text' , value: function(p) { return p.id }, width: 500, editable: false },
34
+ { show: true , name: 'title' , nice_name: 'Title' , sort: 'title' , type: 'text' , value: function(p) { return p.title }, width: 200 },
35
+ { show: true , name: 'caption' , nice_name: 'Caption' , sort: 'caption' , type: 'text' , value: function(p) { return p.caption }, width: 200 },
36
+ { 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' },
37
+ { show: true , name: 'handle' , nice_name: 'URL Handle' , sort: 'handle' , type: 'text' , value: function(p) { return p.handle }, width: 200 },
38
+ { show: true , name: 'seo_title' , nice_name: 'SEO Page Title' , sort: 'seo_title' , type: 'text' , value: function(p) { return p.seo_title }, width: 200 },
39
+ { show: false, name: 'seo_description' , nice_name: 'SEO Meta Description' , sort: 'seo_description' , type: 'textarea' , value: function(p) { return p.seo_description }, width: 200, height: 150 },
40
+ { show: true , name: 'alternate_id' , nice_name: 'Alternate ID' , sort: 'alternate_id' , type: 'text' , value: function(p) { return p.alternate_id }, width: 200 },
41
+ { show: true , name: 'date_available' , nice_name: 'Date Available' , sort: 'date_available' , type: 'date' , value: function(p) { return p.date_available }, width: 200 },
42
+ { show: false, name: 'featured' , nice_name: 'Featured' , sort: 'featured' , type: 'checkbox' , value: function(p) { return p.featured }, width: 200 },
43
+ { show: false, name: 'category_id' , nice_name: 'Categories' , sort: 'categories.name' , type: 'checkbox-multiple' , value: function(p) { return p.categories ? p.categories.map(function(c) { return c.id }) : []; }, text: function(p) { return p.categories ? p.categories.map(function(c) { return c.name }).join(', ') : ''; }, width: 200, height: 200, options_url: '/admin/categories/options' },
44
+ { show: true , name: 'stackable_group_id' , nice_name: 'Stackable Group' , sort: 'stackable_group_id' , type: 'select' , value: function(p) { return p.stackable_group_id }, width: 200, options_url: '/admin/stackable-groups/options' },
44
45
  ],
45
46
  new_model_text: 'New Product',
46
47
  new_model_fields: [
@@ -41,16 +41,31 @@ user_ids = [] if user_ids.nil?
41
41
  <table class='data'>
42
42
  <tr><th>User</th><th>None</th><th>User</th><th>Admin</th></tr>
43
43
  <% Caboose::User.reorder('last_name, first_name').all.each do |u| %>
44
- <tr>
45
- <td><%= u.first_name %> <%= u.last_name %> (<%= u.email %>)</td>
46
- <td align='center'><input type='radio' name='user<%= u.id %>' <%= !admin_ids.include?(u.id) && !user_ids.include?(u.id) ? "checked='true'" : '' %> onclick="remove_site_membership(<%= s.id %>, <%= u.id %>);" /></td>
47
- <td align='center'><input type='radio' name='user<%= u.id %>' <%= user_ids.include?(u.id) ? "checked='true'" : '' %> onclick="add_site_membership(<%= s.id %>, <%= u.id %>, 'User');" /></td>
48
- <td align='center'><input type='radio' name='user<%= u.id %>' <%= admin_ids.include?(u.id) ? "checked='true'" : '' %> onclick="add_site_membership(<%= s.id %>, <%= u.id %>, 'Admin');" /></td>
49
- </tr>
44
+ <tr>
45
+ <td><%= u.first_name %> <%= u.last_name %> (<%= u.email %>)</td>
46
+ <td align='center'><input type='radio' name='user<%= u.id %>' <%= !admin_ids.include?(u.id) && !user_ids.include?(u.id) ? "checked='true'" : '' %> onclick="remove_site_membership(<%= s.id %>, <%= u.id %>);" /></td>
47
+ <td align='center'><input type='radio' name='user<%= u.id %>' <%= user_ids.include?(u.id) ? "checked='true'" : '' %> onclick="add_site_membership(<%= s.id %>, <%= u.id %>, 'User');" /></td>
48
+ <td align='center'><input type='radio' name='user<%= u.id %>' <%= admin_ids.include?(u.id) ? "checked='true'" : '' %> onclick="add_site_membership(<%= s.id %>, <%= u.id %>, 'Admin');" /></td>
49
+ </tr>
50
50
  <% end %>
51
51
  </table>
52
52
  </div>
53
53
 
54
+ <h2>Block Types</h2>
55
+ <div id='block_types'>
56
+ <table class='data'>
57
+ <tr><th>&nbsp;</th><th>Name</th><th>Description</th></tr>
58
+ <% bt_ids = @site.block_type_site_memberships.collect{ |bt| bt.block_type_id } %>
59
+ <% Caboose::BlockType.where("parent_id is null").reorder('name').all.each do |bt| %>
60
+ <tr>
61
+ <td align='center'><input type='checkbox' name='block_type_id_<%= bt.id %>' <%= bt_ids.include?(bt.id) ? "checked='true'" : '' %> onclick="toggle_block_type_site_membership(<%= @site.id %>, <%= bt.id %>, $(this).prop('checked'));" /></td>
62
+ <td><%= bt.name %></td>
63
+ <td><%= bt.description %></td>
64
+ </tr>
65
+ <% end %>
66
+ </table><br/>
67
+ </div>
68
+
54
69
  <div id='message'></div>
55
70
  <div id='controls'>
56
71
  <input type='button' value='Back' onclick="window.location='/admin/sites';" />
@@ -134,6 +149,18 @@ function remove_site_membership(site_id, user_id)
134
149
  });
135
150
  }
136
151
 
152
+ function toggle_block_type_site_membership(site_id, block_type_id, checked)
153
+ {
154
+ $.ajax({
155
+ url: '/admin/block-types/' + block_type_id,
156
+ type: 'put',
157
+ data: {
158
+ site_id: [site_id, checked ? 1 : 0]
159
+ },
160
+ succes: function(resp) {}
161
+ });
162
+ }
163
+
137
164
  function add_domain(site_id, domain)
138
165
  {
139
166
  if (!domain)
@@ -0,0 +1,43 @@
1
+ <h1>Stackable Groups</h1>
2
+
3
+ <div id='stackable_groups'></div>
4
+
5
+ <% content_for :caboose_js do %>
6
+ <%= javascript_include_tag 'caboose/model/all' %>
7
+ <script type='text/javascript'>
8
+
9
+ $(document).ready(function() {
10
+ var that = this;
11
+ var table = new IndexTable({
12
+ form_authenticity_token: '<%= form_authenticity_token %>',
13
+ container: 'stackable_groups',
14
+ base_url: '/admin/stackable-groups',
15
+ delete_url: function(sg_id) { '/admin/stackable-groups/' + sg_id; },
16
+ allow_bulk_edit: false,
17
+ allow_bulk_delete: true,
18
+ allow_duplicate: false,
19
+ allow_advanced_edit: true,
20
+ fields: [
21
+ { show: true, name: 'name' , nice_name: 'Name' , sort: 'name' , type: 'text', value: function(sg) { return sg.name }, width: 100 },
22
+ { show: true, name: 'extra_length' , nice_name: 'Extra length (in)' , sort: 'extra_length' , type: 'text', value: function(sg) { return sg.extra_length }, width: 100 },
23
+ { show: true, name: 'extra_width' , nice_name: 'Extra width (in)' , sort: 'extra_width' , type: 'text', value: function(sg) { return sg.extra_width }, width: 100 },
24
+ { show: true, name: 'extra_height' , nice_name: 'Extra height (in)' , sort: 'extra_height' , type: 'text', value: function(sg) { return sg.extra_height }, width: 100 },
25
+ { show: true, name: 'max_length' , nice_name: 'Max length (in)' , sort: 'max_length' , type: 'text', value: function(sg) { return sg.max_length }, width: 100 },
26
+ { show: true, name: 'max_width' , nice_name: 'Max width (in)' , sort: 'max_width' , type: 'text', value: function(sg) { return sg.max_width }, width: 100 },
27
+ { show: true, name: 'max_height' , nice_name: 'Max height (in)' , sort: 'max_height' , type: 'text', value: function(sg) { return sg.max_height }, width: 100 }
28
+ ],
29
+ new_model_text: 'New Stackable Group',
30
+ new_model_fields: [
31
+ { name: 'name', nice_name: 'Name', type: 'text', width: 400 }
32
+ ],
33
+ });
34
+ });
35
+
36
+ </script>
37
+ <% end %>
38
+
39
+ <% content_for :caboose_css do %>
40
+ <style>
41
+
42
+ </style>
43
+ <% end %>
data/config/routes.rb CHANGED
@@ -243,12 +243,12 @@ Caboose::Engine.routes.draw do
243
243
  delete "admin/ab-options/:id" => "ab_options#admin_delete"
244
244
 
245
245
  # Cart
246
- get '/cart' => 'cart#index'
247
- get '/cart/items' => 'cart#list'
248
- get '/cart/item-count' => 'cart#item_count'
249
- post '/cart/items' => 'cart#add'
250
- put '/cart/items/:id' => 'cart#update'
251
- delete '/cart/items/:id' => 'cart#remove'
246
+ get '/cart' => 'cart#index'
247
+ get '/cart/items' => 'cart#list'
248
+ get '/cart/item-count' => 'cart#item_count'
249
+ post '/cart' => 'cart#add'
250
+ put '/cart/:line_item_id' => 'cart#update'
251
+ delete '/cart/:line_item_id' => 'cart#remove'
252
252
 
253
253
  # Checkout
254
254
  get '/checkout' => 'checkout#index'
@@ -341,6 +341,15 @@ Caboose::Engine.routes.draw do
341
341
  post "/admin/products/:id/variants" => "variants#admin_add"
342
342
  delete "/admin/variants/:id" => "variants#admin_delete"
343
343
 
344
+ get "/admin/stackable-groups/options" => "stackable_groups#admin_options"
345
+ get "/admin/stackable-groups/json" => "stackable_groups#admin_json"
346
+ get "/admin/stackable-groups/:id/json" => "stackable_groups#admin_json_single"
347
+ get "/admin/stackable-groups" => "stackable_groups#admin_index"
348
+ put "/admin/stackable-groups/:id" => "stackable_groups#admin_update"
349
+ post "/admin/stackable-groups" => "stackable_groups#admin_add"
350
+ delete "/admin/stackable-groups/bulk" => "stackable_groups#admin_bulk_delete"
351
+ delete "/admin/stackable-groups/:id" => "stackable_groups#admin_delete"
352
+
344
353
  get "/admin/categories" => "categories#admin_index"
345
354
  get "/admin/categories/new" => "categories#admin_new"
346
355
  get "/admin/categories/options" => "categories#admin_options"
@@ -1,3 +1,3 @@
1
1
  module Caboose
2
- VERSION = '0.5.15'
2
+ VERSION = '0.5.16'
3
3
  end
@@ -92,7 +92,13 @@ namespace :caboose do
92
92
  max = rows[0]['max']
93
93
  max = max.to_i if !max.nil?
94
94
 
95
- rows = c.execute("select nextval('#{tbl}_id_seq')")
95
+ rows = nil
96
+ begin
97
+ rows = c.execute("select nextval('#{tbl}_id_seq')")
98
+ rescue
99
+ next
100
+ end
101
+
96
102
  nextval = rows[0]['nextval']
97
103
  nextval = nextval.to_i if !nextval.nil?
98
104
 
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.5.15
4
+ version: 0.5.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - William Barry
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-16 00:00:00.000000000 Z
11
+ date: 2014-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -220,6 +220,20 @@ dependencies:
220
220
  - - ! '>='
221
221
  - !ruby/object:Gem::Version
222
222
  version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: box_packer
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ! '>='
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ type: :runtime
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ! '>='
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
223
237
  description: CMS built on rails with love.
224
238
  email:
225
239
  - william@nine.is
@@ -228,6 +242,9 @@ executables:
228
242
  extensions: []
229
243
  extra_rdoc_files: []
230
244
  files:
245
+ - MIT-LICENSE
246
+ - README.md
247
+ - Rakefile
231
248
  - app/assets/fonts/avenir-medium.eot
232
249
  - app/assets/fonts/avenir-medium.ttf
233
250
  - app/assets/fonts/icomoon.eot
@@ -256,6 +273,7 @@ files:
256
273
  - app/assets/javascripts/caboose/admin_products.js
257
274
  - app/assets/javascripts/caboose/application.js
258
275
  - app/assets/javascripts/caboose/cart.js
276
+ - app/assets/javascripts/caboose/cart2.js
259
277
  - app/assets/javascripts/caboose/checkout.js
260
278
  - app/assets/javascripts/caboose/checkout_module.js
261
279
  - app/assets/javascripts/caboose/checkout_step1.js
@@ -270,6 +288,8 @@ files:
270
288
  - app/assets/javascripts/caboose/main.js
271
289
  - app/assets/javascripts/caboose/modal.js
272
290
  - app/assets/javascripts/caboose/modal_integration.js
291
+ - app/assets/javascripts/caboose/model.form.page.js
292
+ - app/assets/javascripts/caboose/model.form.user.js
273
293
  - app/assets/javascripts/caboose/model/all.js
274
294
  - app/assets/javascripts/caboose/model/attribute.js
275
295
  - app/assets/javascripts/caboose/model/bound_checkbox.js
@@ -292,8 +312,6 @@ files:
292
312
  - app/assets/javascripts/caboose/model/model_binder.js
293
313
  - app/assets/javascripts/caboose/model/pager.js
294
314
  - app/assets/javascripts/caboose/model/s3.js
295
- - app/assets/javascripts/caboose/model.form.page.js
296
- - app/assets/javascripts/caboose/model.form.user.js
297
315
  - app/assets/javascripts/caboose/product.js
298
316
  - app/assets/javascripts/caboose/s3upload.js
299
317
  - app/assets/javascripts/caboose/shortcut.js
@@ -309,15 +327,17 @@ files:
309
327
  - app/assets/stylesheets/caboose/application.css
310
328
  - app/assets/stylesheets/caboose/bound_input.css
311
329
  - app/assets/stylesheets/caboose/caboose.css
330
+ - app/assets/stylesheets/caboose/cart.scss
312
331
  - app/assets/stylesheets/caboose/checkout.css.scss
332
+ - app/assets/stylesheets/caboose/fonts.css
313
333
  - app/assets/stylesheets/caboose/fonts/avenir-medium.eot
314
334
  - app/assets/stylesheets/caboose/fonts/avenir-medium.ttf
315
335
  - app/assets/stylesheets/caboose/fonts/big_noodle_titling.ttf
316
336
  - app/assets/stylesheets/caboose/fonts/big_noodle_titling_oblique.ttf
317
- - app/assets/stylesheets/caboose/fonts.css
318
337
  - app/assets/stylesheets/caboose/icomoon_fonts.css
319
338
  - app/assets/stylesheets/caboose/icons.txt
320
339
  - app/assets/stylesheets/caboose/login.css
340
+ - app/assets/stylesheets/caboose/message_boxes.scss
321
341
  - app/assets/stylesheets/caboose/modal.css
322
342
  - app/assets/stylesheets/caboose/model_binder.css
323
343
  - app/assets/stylesheets/caboose/page_bar_generator.css
@@ -374,6 +394,7 @@ files:
374
394
  - app/controllers/caboose/roles_controller.rb
375
395
  - app/controllers/caboose/settings_controller.rb
376
396
  - app/controllers/caboose/sites_controller.rb
397
+ - app/controllers/caboose/stackable_groups_controller.rb
377
398
  - app/controllers/caboose/station_controller.rb
378
399
  - app/controllers/caboose/users_controller.rb
379
400
  - app/controllers/caboose/variants_controller.rb
@@ -421,6 +442,7 @@ files:
421
442
  - app/models/caboose/message.rb
422
443
  - app/models/caboose/order.rb
423
444
  - app/models/caboose/order_discount.rb
445
+ - app/models/caboose/order_package.rb
424
446
  - app/models/caboose/order_pdf.rb
425
447
  - app/models/caboose/page.rb
426
448
  - app/models/caboose/page_bar_generator.rb
@@ -447,9 +469,11 @@ files:
447
469
  - app/models/caboose/search_filter.rb
448
470
  - app/models/caboose/setting.rb
449
471
  - app/models/caboose/shipping_calculator.rb
472
+ - app/models/caboose/shipping_package.rb
450
473
  - app/models/caboose/site.rb
451
474
  - app/models/caboose/site_membership.rb
452
475
  - app/models/caboose/smtp_config.rb
476
+ - app/models/caboose/stackable_group.rb
453
477
  - app/models/caboose/states.rb
454
478
  - app/models/caboose/std_class.rb
455
479
  - app/models/caboose/tax_calculator.rb
@@ -641,6 +665,7 @@ files:
641
665
  - app/views/caboose/sites/admin_edit.html.erb
642
666
  - app/views/caboose/sites/admin_index.html.erb
643
667
  - app/views/caboose/sites/admin_new.html.erb
668
+ - app/views/caboose/stackable_groups/admin_index.html.erb
644
669
  - app/views/caboose/station/index.html.erb
645
670
  - app/views/caboose/users/edit.html.erb
646
671
  - app/views/caboose/users/edit_password.html.erb
@@ -688,10 +713,11 @@ files:
688
713
  - config/routes.rb
689
714
  - config/tinymce.yml
690
715
  - db/migrate/000_add_linked_resources_to_page.rb
716
+ - lib/caboose.rb
691
717
  - lib/caboose/caboose_helper.rb
692
718
  - lib/caboose/engine.rb
693
719
  - lib/caboose/version.rb
694
- - lib/caboose.rb
720
+ - lib/sample_files/Gemfile
695
721
  - lib/sample_files/app/assets/stylesheets/login.css
696
722
  - lib/sample_files/app/controllers/application_controller.rb
697
723
  - lib/sample_files/app/views/layouts/layout_default.html.erb
@@ -706,18 +732,17 @@ files:
706
732
  - lib/sample_files/config/initializers/session_store.rb
707
733
  - lib/sample_files/config/routes.rb
708
734
  - lib/sample_files/config/tinymce.yml
709
- - lib/sample_files/Gemfile
710
735
  - lib/sample_files/timezone_abbreviations.csv
711
736
  - lib/tasks/caboose.rake
712
- - MIT-LICENSE
713
- - Rakefile
714
- - README.md
715
737
  - test/caboose_test.rb
738
+ - test/dummy/README.rdoc
739
+ - test/dummy/Rakefile
716
740
  - test/dummy/app/assets/javascripts/application.js
717
741
  - test/dummy/app/assets/stylesheets/application.css
718
742
  - test/dummy/app/controllers/application_controller.rb
719
743
  - test/dummy/app/helpers/application_helper.rb
720
744
  - test/dummy/app/views/layouts/application.html.erb
745
+ - test/dummy/config.ru
721
746
  - test/dummy/config/application.rb
722
747
  - test/dummy/config/boot.rb
723
748
  - test/dummy/config/database.yml
@@ -733,15 +758,12 @@ files:
733
758
  - test/dummy/config/initializers/wrap_parameters.rb
734
759
  - test/dummy/config/locales/en.yml
735
760
  - test/dummy/config/routes.rb
736
- - test/dummy/config.ru
737
761
  - test/dummy/db/test.sqlite3
738
762
  - test/dummy/log/test.log
739
763
  - test/dummy/public/404.html
740
764
  - test/dummy/public/422.html
741
765
  - test/dummy/public/500.html
742
766
  - test/dummy/public/favicon.ico
743
- - test/dummy/Rakefile
744
- - test/dummy/README.rdoc
745
767
  - test/dummy/script/rails
746
768
  - test/integration/navigation_test.rb
747
769
  - test/test_helper.rb
@@ -764,7 +786,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
764
786
  version: '0'
765
787
  requirements: []
766
788
  rubyforge_project:
767
- rubygems_version: 2.0.6
789
+ rubygems_version: 2.2.2
768
790
  signing_key:
769
791
  specification_version: 4
770
792
  summary: CMS built on rails.