caboose-store 0.0.10 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/app/assets/javascripts/caboose/main.js +8 -0
- data/app/assets/javascripts/caboose_store/admin.js +0 -19
- data/app/assets/javascripts/caboose_store/admin_products.js +3 -4
- data/app/assets/javascripts/caboose_store/application.js +6 -5
- data/app/assets/javascripts/caboose_store/cart.js.bak +258 -0
- data/app/assets/javascripts/caboose_store/checkout.js +151 -0
- data/app/assets/javascripts/caboose_store/config.js +83 -0
- data/app/assets/javascripts/caboose_store/jquery-ui-multisortable.js +254 -0
- data/app/assets/javascripts/caboose_store/jquery-ui.js +3572 -0
- data/app/assets/javascripts/caboose_store/main.js +20 -0
- data/app/assets/javascripts/caboose_store/modules/cart.js +167 -0
- data/app/assets/javascripts/caboose_store/modules/checkout.js +313 -0
- data/app/assets/javascripts/caboose_store/modules/product.js +282 -0
- data/app/assets/stylesheets/caboose_store/admin.css +3 -3
- data/app/assets/stylesheets/caboose_store/application.css +2 -2
- data/app/assets/stylesheets/caboose_store/modal.css +1 -0
- data/app/assets/templates/caboose_store/cart/add_to_cart.jst.ejs +7 -0
- data/app/assets/templates/caboose_store/cart/line_items.jst.ejs +41 -0
- data/app/assets/templates/caboose_store/checkout/address.jst.ejs +53 -0
- data/app/assets/templates/caboose_store/checkout/forms/guest.jst.ejs +8 -0
- data/app/assets/templates/caboose_store/checkout/forms/register.jst.ejs +11 -0
- data/app/assets/templates/caboose_store/checkout/forms/signin.jst.ejs +7 -0
- data/app/assets/templates/caboose_store/checkout/line_items.jst.ejs +32 -0
- data/app/assets/templates/caboose_store/checkout/login.jst.ejs +21 -0
- data/app/assets/templates/caboose_store/checkout/payment.jst.ejs +5 -0
- data/app/assets/templates/caboose_store/checkout/shipping.jst.ejs +18 -0
- data/app/assets/templates/caboose_store/product/images.jst.ejs +8 -0
- data/app/assets/templates/caboose_store/product/options.jst.ejs +19 -0
- data/app/controllers/caboose_store/application_controller.rb +1 -11
- data/app/controllers/caboose_store/cart_controller.rb +36 -44
- data/app/controllers/caboose_store/cart_controller.rb.bak +169 -0
- data/app/controllers/caboose_store/categories_controller.rb +72 -92
- data/app/controllers/caboose_store/checkout_controller.rb +231 -151
- data/app/controllers/caboose_store/orders_controller.rb +235 -95
- data/app/controllers/caboose_store/product_images_controller.rb +1 -1
- data/app/controllers/caboose_store/products_controller.rb +275 -84
- data/app/controllers/caboose_store/reviews_controller.rb +1 -1
- data/app/controllers/caboose_store/variants_controller.rb +86 -20
- data/app/controllers/caboose_store/vendors_controller.rb +73 -0
- data/app/helpers/caboose_store/application_helper.rb +3 -41
- data/app/helpers/caboose_store/cart_helper.rb +0 -24
- data/app/helpers/caboose_store/categories_helper.rb +69 -25
- data/app/helpers/caboose_store/checkout_helper.rb +31 -0
- data/app/helpers/caboose_store/products_helper.rb +4 -80
- data/app/mailers/caboose_store/orders_mailer.rb +6 -13
- data/app/models/caboose_store/address.rb +5 -9
- data/app/models/caboose_store/caboose_store_plugin.rb +18 -7
- data/app/models/caboose_store/category.rb +66 -41
- data/app/models/caboose_store/category_membership.rb +1 -2
- data/app/models/caboose_store/customization_membership.rb +10 -0
- data/app/models/caboose_store/discount.rb +4 -2
- data/app/models/caboose_store/line_item.rb +77 -0
- data/app/models/caboose_store/message.rb +3 -5
- data/app/models/caboose_store/order.rb +153 -63
- data/app/models/caboose_store/order_discount.rb +1 -2
- data/app/models/caboose_store/order_pdf.rb +2 -4
- data/app/models/caboose_store/payment_processors/authorizenet.rb +20 -2
- data/app/models/caboose_store/payment_processors/base.rb +0 -2
- data/app/models/caboose_store/payment_processors/payscape.rb +91 -1
- data/app/models/caboose_store/product.rb +86 -30
- data/app/models/caboose_store/product_image.rb +50 -15
- data/app/models/caboose_store/product_image_variant.rb +3 -3
- data/app/models/caboose_store/review.rb +8 -8
- data/app/models/caboose_store/schema.rb +174 -119
- data/app/models/caboose_store/search_filter.rb +110 -115
- data/app/models/caboose_store/shipping_calculator.rb +51 -49
- data/app/models/caboose_store/tax_calculator.rb +2 -6
- data/app/models/caboose_store/tax_line.rb +1 -4
- data/app/models/caboose_store/variant.rb +77 -21
- data/app/models/caboose_store/vendor.rb +17 -2
- data/app/views/caboose_store/cart/index.html.erb +3 -18
- data/app/views/caboose_store/categories/admin_edit.html.erb +64 -67
- data/app/views/caboose_store/categories/admin_index.html.erb +7 -9
- data/app/views/caboose_store/categories/admin_new.html.erb +56 -39
- data/app/views/caboose_store/checkout/_address_form.html.erb +111 -0
- data/app/views/caboose_store/checkout/_billing_form.html.erb +47 -0
- data/app/views/caboose_store/checkout/_cart.html.erb +52 -0
- data/app/views/caboose_store/checkout/_order_discount.html.erb +40 -0
- data/app/views/caboose_store/checkout/_shipping_address.html.erb +10 -0
- data/app/views/caboose_store/checkout/_shipping_method.html.erb +2 -0
- data/app/views/caboose_store/checkout/_shipping_method_form.html.erb +21 -0
- data/app/views/caboose_store/checkout/billing.html.erb +4 -161
- data/app/views/caboose_store/checkout/discount.html.erb +5 -160
- data/app/views/caboose_store/checkout/empty.html.erb +2 -0
- data/app/views/caboose_store/checkout/error.html.erb +2 -0
- data/app/views/caboose_store/checkout/index.html.erb +30 -100
- data/app/views/caboose_store/checkout/login.html.erb +2 -0
- data/app/views/caboose_store/checkout/payment.html.erb +79 -0
- data/app/views/caboose_store/checkout/relay.html.erb +12 -0
- data/app/views/caboose_store/checkout/relay_postMessage.html.erb +19 -0
- data/app/views/caboose_store/checkout/shipping.html.erb +8 -83
- data/app/views/caboose_store/checkout/step_one.html.erb +15 -0
- data/app/views/caboose_store/checkout/step_two.html.erb +15 -0
- data/app/views/caboose_store/checkout/thanks.html.erb +5 -0
- data/app/views/caboose_store/layouts/_footer.html.erb +1 -1
- data/app/views/caboose_store/orders/admin_edit.html.erb +101 -7
- data/app/views/caboose_store/orders/admin_index.html.erb +8 -8
- data/app/views/caboose_store/orders_mailer/customer_new_order.html.erb +0 -46
- data/app/views/caboose_store/orders_mailer/customer_status_updated.html.erb +0 -48
- data/app/views/caboose_store/orders_mailer/fulfillment_new_order.html.erb +0 -42
- data/app/views/caboose_store/orders_mailer/shipping_order_ready.html.erb +0 -45
- data/app/views/caboose_store/products/_admin_header.html.erb +7 -6
- data/app/views/caboose_store/products/_sort_options.html.erb +19 -0
- data/app/views/caboose_store/products/admin_add_upcs.html.erb +58 -0
- data/app/views/caboose_store/products/admin_edit_categories.html.erb +1 -1
- data/app/views/caboose_store/products/admin_edit_description.html.erb +2 -5
- data/app/views/caboose_store/products/admin_edit_general.html.erb +58 -1
- data/app/views/caboose_store/products/admin_edit_images.html.erb +3 -1
- data/app/views/caboose_store/products/admin_edit_variants.html.erb +13 -2
- data/app/views/caboose_store/products/admin_edit_variants_single.html.erb +14 -14
- data/app/views/caboose_store/products/admin_group_variants.html.erb +433 -0
- data/app/views/caboose_store/products/admin_index.html.erb +87 -39
- data/app/views/caboose_store/products/admin_sort.html copy.erb +155 -0
- data/app/views/caboose_store/products/admin_sort.html.erb +254 -0
- data/app/views/caboose_store/products/details.html.erb +1 -2
- data/app/views/caboose_store/variants/admin_edit.html.erb +18 -16
- data/app/views/caboose_store/variants/admin_group.html.erb +184 -0
- data/app/views/caboose_store/vendors/admin_edit.html.erb +24 -0
- data/app/views/caboose_store/vendors/admin_index.html.erb +30 -0
- data/app/views/caboose_store/vendors/admin_new.html.erb +34 -0
- data/config/routes.rb +65 -27
- data/lib/caboose-store/caboose_store_helper.rb +29 -30
- data/lib/caboose-store/engine.rb +73 -28
- data/lib/caboose-store/version.rb +1 -1
- data/lib/caboose-store.rb +16 -7
- data/lib/tasks/caboose-store.rake +0 -2
- metadata +54 -17
- data/app/assets/javascripts/caboose_store/modal.js +0 -52
- data/app/assets/javascripts/caboose_store/modal_integration.js +0 -25
- data/app/assets/javascripts/caboose_store/model.form.page.js +0 -30
- data/app/assets/javascripts/caboose_store/model.form.user.js +0 -36
- data/app/assets/javascripts/caboose_store/payment_processors/authorizenet.js +0 -21
- data/app/assets/javascripts/caboose_store/payment_processors/base.js +0 -21
- data/app/assets/javascripts/caboose_store/payment_processors/payscape.js +0 -21
- data/app/assets/javascripts/caboose_store/shortcut.js +0 -11
- data/app/assets/javascripts/caboose_store/station.js +0 -60
- data/app/models/caboose_store/order_line_item.rb +0 -13
- data/app/models/caboose_store/states.rb +0 -60
- data/app/views/caboose_store/application/_category_thumb.html.erb +0 -6
- data/app/views/caboose_store/application/_product_thumb.html.erb +0 -13
- data/app/views/caboose_store/checkout/quantity_box.html.erb +0 -39
- data/app/views/caboose_store/checkout/thank_you.html.erb +0 -36
@@ -0,0 +1,73 @@
|
|
1
|
+
module CabooseStore
|
2
|
+
class VendorsController < CabooseStore::ApplicationController
|
3
|
+
|
4
|
+
# GET /admin/vendors/status-options
|
5
|
+
def status_options
|
6
|
+
options = Array.new
|
7
|
+
|
8
|
+
['Active', 'Inactive', 'Deleted'].each do |status|
|
9
|
+
options << {
|
10
|
+
:text => status,
|
11
|
+
:value => status
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
render :json => options
|
16
|
+
end
|
17
|
+
|
18
|
+
# GET /admin/vendors/new
|
19
|
+
def admin_new
|
20
|
+
render :layout => 'caboose/admin'
|
21
|
+
end
|
22
|
+
|
23
|
+
# POST /admin/vendors/create
|
24
|
+
def admin_create
|
25
|
+
render :json => { :success => false, :message => 'Must define a name' } and return if params[:name].nil? || params[:name].empty?
|
26
|
+
|
27
|
+
vendor = Vendor.new
|
28
|
+
vendor.name = params[:name]
|
29
|
+
vendor.status = 'Inactive'
|
30
|
+
|
31
|
+
render :json => { :success => vendor.save, :redirect => "/admin/vendors/#{vendor.id}/edit" }
|
32
|
+
end
|
33
|
+
|
34
|
+
# GET /admin/vendors
|
35
|
+
def admin_index
|
36
|
+
@pager = Caboose::Pager.new(params, {
|
37
|
+
'name_like' => ''
|
38
|
+
}, {
|
39
|
+
'model' => 'CabooseStore::Vendor',
|
40
|
+
'sort' => 'name',
|
41
|
+
'desc' => false,
|
42
|
+
'base_url' => '/admin/vendors',
|
43
|
+
'items_per_page' => 25,
|
44
|
+
'use_url_params' => false
|
45
|
+
});
|
46
|
+
|
47
|
+
@vendors = @pager.items
|
48
|
+
|
49
|
+
render :layout => 'caboose/admin'
|
50
|
+
end
|
51
|
+
|
52
|
+
# GET /admin/vendors/:id/edit
|
53
|
+
def admin_edit
|
54
|
+
@vendor = Vendor.find(params[:id])
|
55
|
+
render :layout => 'caboose/admin'
|
56
|
+
end
|
57
|
+
|
58
|
+
# PUT /admin/vendors/:id/update
|
59
|
+
def admin_update
|
60
|
+
vendor = Vendor.find(params[:id])
|
61
|
+
|
62
|
+
params.each do |name, value|
|
63
|
+
case name
|
64
|
+
when 'name' then vendor.name = value
|
65
|
+
when 'status' then vendor.status = value
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
render :json => { :success => vendor.save }
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
@@ -1,46 +1,8 @@
|
|
1
1
|
module CabooseStore
|
2
2
|
module ApplicationHelper
|
3
|
-
|
4
|
-
|
5
|
-
"foobar"
|
6
|
-
end
|
7
|
-
|
8
|
-
def all_categories()
|
9
|
-
list = ""
|
10
|
-
top_cats = Category.where(:parent_id => 1).where("id != ?", 32).where("id != ?", 3).reorder('name').limit(3)
|
11
|
-
accessories = Category.find(3)
|
12
|
-
top_cats << accessories
|
13
|
-
top_cats.each do |cat|
|
14
|
-
list << "<li><a href='#{cat.url}'>#{cat.name}</a>"
|
15
|
-
list << "<ul>"
|
16
|
-
|
17
|
-
links = {}
|
18
|
-
bottom_cats = Category.where(:parent_id => cat.id).reorder("name").all
|
19
|
-
bottom_cats.each do |bcat|
|
20
|
-
if bcat.products != []
|
21
|
-
links[bcat.name] = "<li><a href='#{bcat.url}'>#{bcat.name}</a></li>"
|
22
|
-
end
|
23
|
-
end
|
24
|
-
cat.products.where(:status => 'active').each do |p|
|
25
|
-
links[p.title] = "<li><a href='/products/#{p.id}'>#{p.title}</a></li>"
|
26
|
-
end
|
27
|
-
links.sort.each { |key,val| list << val }
|
28
|
-
|
29
|
-
list << "</ul>"
|
30
|
-
list << "</li>"
|
31
|
-
end
|
32
|
-
return list
|
33
|
-
end
|
34
|
-
|
35
|
-
def square_image(img)
|
36
|
-
style = ""
|
37
|
-
if img
|
38
|
-
style = "background-image: url(#{img.url(:thumb)});"
|
39
|
-
style << "background-position: #{img.square_offset_x.to_s}px #{img.square_offset_y.to_s}px;"
|
40
|
-
else
|
41
|
-
style = 'background-image: url(https://dmwwflw4i3miv.cloudfront.net/placeholder.jpg);'
|
42
|
-
end
|
43
|
-
return style
|
3
|
+
def parent_categories
|
4
|
+
CabooseStore::Category.find(1).children.where(:status => 'Active')
|
44
5
|
end
|
45
6
|
end
|
46
7
|
end
|
8
|
+
|
@@ -1,28 +1,4 @@
|
|
1
1
|
module CabooseStore
|
2
2
|
module CartHelper
|
3
|
-
|
4
|
-
def line_items(order)
|
5
|
-
arr = []
|
6
|
-
order.line_items.each do |li|
|
7
|
-
v = li.variant
|
8
|
-
p = v.product
|
9
|
-
|
10
|
-
img = false
|
11
|
-
if v.product_images && v.product_images.count > 0
|
12
|
-
# img = v.product_images[0].image.url(:tiny)
|
13
|
-
#elsif p.product_images && p.product_images.count > 0
|
14
|
-
# img = p.product_images[0].image.url(:tiny)
|
15
|
-
end
|
16
|
-
|
17
|
-
arr << {
|
18
|
-
'quantity' => li.quantity,
|
19
|
-
'variant' => v,
|
20
|
-
'variant_title' => "#{p.title}<br />#{v.title}",
|
21
|
-
'variant_image' => img
|
22
|
-
}
|
23
|
-
end
|
24
|
-
return arr
|
25
|
-
end
|
26
|
-
|
27
3
|
end
|
28
4
|
end
|
@@ -1,38 +1,82 @@
|
|
1
1
|
module CabooseStore
|
2
2
|
module CategoriesHelper
|
3
|
-
|
4
|
-
|
5
|
-
str = "<ul>"
|
6
|
-
str << categories_tree_helper(cat)
|
7
|
-
str << "</ul>"
|
8
|
-
return str
|
3
|
+
def root_category
|
4
|
+
CabooseStore::Category.root
|
9
5
|
end
|
10
6
|
|
11
|
-
def
|
12
|
-
|
13
|
-
if cat.children && cat.children.count > 0
|
14
|
-
str << "<ul>"
|
15
|
-
cat.children.each { |kid| str << categories_tree_helper(kid) }
|
16
|
-
str << "</ul>"
|
17
|
-
end
|
18
|
-
str << "</li>\n"
|
19
|
-
return str
|
7
|
+
def top_level_categories
|
8
|
+
CabooseStore::Category.top_level
|
20
9
|
end
|
21
10
|
|
22
|
-
def
|
23
|
-
|
24
|
-
|
11
|
+
def category_list(category=root_category)
|
12
|
+
content_tag :ul, category_list_items(category)
|
13
|
+
end
|
14
|
+
|
15
|
+
def category_list_items(category)
|
16
|
+
|
17
|
+
# Link to category
|
18
|
+
link = link_to(category.name, "/admin/categories/#{category.id}/edit")
|
19
|
+
|
20
|
+
# Recursively find category children
|
21
|
+
children = content_tag :ul, category.children.collect { |child| category_list_items(child) }.join.to_s.html_safe if category.children.any?
|
22
|
+
|
23
|
+
# Return the list item
|
24
|
+
content_tag :li, link.concat(children)
|
25
|
+
end
|
26
|
+
|
27
|
+
def category_select(form_name, category=root_category, selected_id=nil)
|
28
|
+
|
29
|
+
# Collect all recursive options from specified category down
|
30
|
+
options = category_options(category, selected_id)
|
31
|
+
|
32
|
+
# Prepend the root category
|
33
|
+
options.unshift([category.name, category.id])
|
34
|
+
|
35
|
+
# Create select tag
|
36
|
+
select_tag form_name, options_for_select(options)
|
37
|
+
end
|
38
|
+
|
39
|
+
def category_options(category, selected_id, prefix="")
|
40
|
+
|
41
|
+
# Array to hold options
|
42
|
+
options = Array.new
|
43
|
+
|
44
|
+
# Recusively tterate over all child categories
|
45
|
+
category.children.collect do |child|
|
46
|
+
options << ["#{prefix} - #{child.name}", child.id]
|
47
|
+
options.concat category_options(child, selected_id, "#{prefix} -")
|
48
|
+
end
|
49
|
+
|
50
|
+
# Return the options array
|
51
|
+
return options
|
25
52
|
end
|
26
53
|
|
27
|
-
def
|
28
|
-
str = "<
|
29
|
-
|
30
|
-
|
31
|
-
if cat.children
|
32
|
-
cat.children.each { |kid| str << categories_options_helper(kid, "#{prefix} - ", selected_id) }
|
54
|
+
def category_checkboxes(top_categories, selected_ids = nil)
|
55
|
+
str = "<ul>"
|
56
|
+
top_categories.each do |cat|
|
57
|
+
category_checkboxes_helper(cat, selected_ids, str)
|
33
58
|
end
|
59
|
+
str << "</ul>"
|
34
60
|
return str
|
35
61
|
end
|
36
62
|
|
63
|
+
def category_checkboxes_helper(cat, selected_ids, str, prefix = "")
|
64
|
+
str << "<li>"
|
65
|
+
if cat.children && cat.children.count > 0
|
66
|
+
str << "<input type='checkbox' id='cat_#{cat.id}' value='#{cat.id}'"
|
67
|
+
str << " checked='true'" if selected_ids && selected_ids.include?(cat.id)
|
68
|
+
str << "> <label for='#{cat.id}'><h3>#{cat.name}</h3></label>"
|
69
|
+
else
|
70
|
+
str << "<input type='checkbox' id='cat_#{cat.id}' value='#{cat.id}'"
|
71
|
+
str << " checked='true'" if selected_ids && selected_ids.include?(cat.id)
|
72
|
+
str << "> <label for='#{cat.id}'>#{cat.name}</label>"
|
73
|
+
end
|
74
|
+
cat.children.each do |cat2|
|
75
|
+
str << "<ul>"
|
76
|
+
category_checkboxes_helper(cat2, selected_ids, str, "#{prefix} ")
|
77
|
+
str << "</ul>"
|
78
|
+
end
|
79
|
+
str << "</li>"
|
80
|
+
end
|
37
81
|
end
|
38
|
-
end
|
82
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module CabooseStore
|
2
|
+
module CheckoutHelper
|
3
|
+
def caboose_store_cart
|
4
|
+
render :partial => '/caboose_store/checkout/cart'
|
5
|
+
end
|
6
|
+
|
7
|
+
def caboose_store_address_form
|
8
|
+
render :partial => '/caboose_store/checkout/address_form'
|
9
|
+
end
|
10
|
+
|
11
|
+
def caboose_store_shipping_address
|
12
|
+
render :partial => '/caboose_store/checkout/shipping_address'
|
13
|
+
end
|
14
|
+
|
15
|
+
def caboose_store_shipping_method_form
|
16
|
+
render :partial => '/caboose_store/checkout/shipping_method_form'
|
17
|
+
end
|
18
|
+
|
19
|
+
def caboose_store_shipping_method
|
20
|
+
render :partial => '/caboose_store/checkout/shipping_method'
|
21
|
+
end
|
22
|
+
|
23
|
+
def caboose_store_discount
|
24
|
+
render :partial => '/caboose_store/checkout/order_discount'
|
25
|
+
end
|
26
|
+
|
27
|
+
def caboose_store_billing_form
|
28
|
+
render :partial => '/caboose_store/checkout/billing_form'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -1,87 +1,11 @@
|
|
1
1
|
module CabooseStore
|
2
2
|
module ProductsHelper
|
3
|
-
|
4
|
-
|
5
|
-
arr = []
|
6
|
-
top_categories.each do |cat|
|
7
|
-
category_options_helper(cat, selected_id, arr)
|
8
|
-
end
|
9
|
-
return arr.join("\n")
|
10
|
-
end
|
11
|
-
|
12
|
-
def category_options_helper(cat, selected_id, arr, prefix = "")
|
13
|
-
opt = "<option value='#{cat.id}'"
|
14
|
-
opt << " selected='true'" if !selected_id.nil? && selected_id == cat.id
|
15
|
-
opt << ">#{prefix}#{cat.name}</option>"
|
16
|
-
arr << opt
|
17
|
-
cat.children.each do |cat2|
|
18
|
-
category_options_helper(cat2, selected_id, arr, "#{prefix} - ")
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def category_checkboxes(top_categories, selected_ids = nil)
|
23
|
-
str = "<ul>"
|
24
|
-
top_categories.each do |cat|
|
25
|
-
category_checkboxes_helper(cat, selected_ids, str)
|
26
|
-
end
|
27
|
-
str << "</ul>"
|
28
|
-
return str
|
3
|
+
def active_products
|
4
|
+
CabooseStore::Product.active
|
29
5
|
end
|
30
6
|
|
31
|
-
def
|
32
|
-
|
33
|
-
if cat.children && cat.children.count > 0
|
34
|
-
str << "<input type='checkbox' id='cat_#{cat.id}' value='#{cat.id}'"
|
35
|
-
str << " checked='true'" if selected_ids && selected_ids.include?(cat.id)
|
36
|
-
str << "> <label for='#{cat.id}'><h2>#{cat.name}</h2></label>"
|
37
|
-
else
|
38
|
-
str << "<input type='checkbox' id='cat_#{cat.id}' value='#{cat.id}'"
|
39
|
-
str << " checked='true'" if selected_ids && selected_ids.include?(cat.id)
|
40
|
-
str << "> <label for='#{cat.id}'>#{cat.name}</label>"
|
41
|
-
end
|
42
|
-
cat.children.each do |cat2|
|
43
|
-
str << "<ul>"
|
44
|
-
category_checkboxes_helper(cat2, selected_ids, str, "#{prefix} ")
|
45
|
-
str << "</ul>"
|
46
|
-
end
|
47
|
-
str << "</li>"
|
7
|
+
def caboose_sort_options
|
8
|
+
render :partial => '/caboose_store/products/sort_options'
|
48
9
|
end
|
49
|
-
|
50
|
-
def product_price(p)
|
51
|
-
price = ""
|
52
|
-
if p.price_varies
|
53
|
-
arr = p.price_range
|
54
|
-
min = number_to_currency(arr[0], :precision => 2)
|
55
|
-
max = number_to_currency(arr[1], :precision => 2)
|
56
|
-
if min.eql? max
|
57
|
-
price = "#{min}"
|
58
|
-
else
|
59
|
-
price = "#{min}-#{max}"
|
60
|
-
end
|
61
|
-
else
|
62
|
-
price = p.variants[0].price
|
63
|
-
price = number_to_currency(price, :precision => 2)
|
64
|
-
end
|
65
|
-
return price
|
66
|
-
end
|
67
|
-
|
68
|
-
def breadcrumb(p)
|
69
|
-
return p.category.ancestry.collect{|cat| "<li><a href='/products/#{cat.id}'>#{cat.name}</a></li>"}.join("<span class='divider'>/</span>")
|
70
|
-
end
|
71
|
-
|
72
|
-
#def product_thumb(product, price)
|
73
|
-
# style = square_image(product.featured_image)
|
74
|
-
# price = product.most_popular_variant.price if price.nil?
|
75
|
-
#
|
76
|
-
# str = "<li class='thumb'>"
|
77
|
-
# str << "<a href='/products/#{product.id}'>"
|
78
|
-
# str << "<figure class='thumb-image' style='<%= style %>"></figure>"
|
79
|
-
# str << "<div class="thumb-title"><%= product.title %></div>"
|
80
|
-
# str << " <div class="thumb-price"><%= price %></div>"
|
81
|
-
# str << "</a>"
|
82
|
-
# str << "</li><!-- .thumb -->"
|
83
|
-
#
|
84
|
-
#end
|
85
|
-
|
86
10
|
end
|
87
11
|
end
|
@@ -1,36 +1,29 @@
|
|
1
1
|
module CabooseStore
|
2
2
|
class OrdersMailer < ActionMailer::Base
|
3
|
-
default :from =>
|
3
|
+
default :from => 'woodsnwater.actionmailer@gmail.com'
|
4
4
|
|
5
5
|
# Sends a confirmation email to the customer about a new order
|
6
6
|
def customer_new_order(order)
|
7
7
|
@order = order
|
8
|
-
mail(:to => order.customer.email, :subject =>
|
8
|
+
mail(:to => order.customer ? order.customer.email : order.email, :subject => 'Thank you for your order!')
|
9
9
|
end
|
10
10
|
|
11
11
|
# Sends a notification email to the fulfillment dept about a new order
|
12
12
|
def fulfillment_new_order(order)
|
13
13
|
@order = order
|
14
|
-
|
15
|
-
#fulfillment_email = config[Rails.env]['order_fulfillment_email']
|
16
|
-
#mail(:to => fulfillment_email, :subject => "New Order")
|
17
|
-
mail(:to => 'info@tuskwearcollection.com', :subject => "New Order")
|
18
|
-
#mail(:to => 'william@nine.is', :subject => "New Order")
|
14
|
+
mail(:to => CabooseStore::fulfillment_email, :subject => 'New Order')
|
19
15
|
end
|
20
16
|
|
21
17
|
# Sends a notification email to the shipping dept that an order is ready to be shipped
|
22
18
|
def shipping_order_ready(order)
|
23
19
|
@order = order
|
24
|
-
|
25
|
-
#shipping_email = config[Rails.env]['order_shipping_email']
|
26
|
-
#mail(:to => shipping_email, :subject => "Order ready for shipping")
|
27
|
-
mail(:to => 'info@tuskwearcollection.com', :subject => "Order ready for shipping")
|
20
|
+
mail(:to => CabooseStore::shipping_email, :subject => 'Order ready for shipping')
|
28
21
|
end
|
29
22
|
|
30
23
|
# Sends a notification email to the customer that the status of the order has been changed
|
31
24
|
def customer_status_updated(order)
|
32
25
|
@order = order
|
33
|
-
mail(:to => order.customer.email, :subject =>
|
26
|
+
mail(:to => order.customer ? order.customer.email : order.email, :subject => 'Order status update')
|
34
27
|
end
|
35
28
|
end
|
36
|
-
end
|
29
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module CabooseStore
|
2
2
|
class Address < ActiveRecord::Base
|
3
|
-
self.table_name =
|
3
|
+
self.table_name = 'store_addresses'
|
4
4
|
|
5
5
|
attr_accessible :id,
|
6
6
|
:name,
|
@@ -18,13 +18,9 @@ module CabooseStore
|
|
18
18
|
:country,
|
19
19
|
:country_code,
|
20
20
|
:phone
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
#validates :city, presence: true
|
25
|
-
#validates :zip, numericality: true
|
26
|
-
#validates :phone, uniqueness: true
|
27
|
-
#validates :company, presence: true
|
28
|
-
|
21
|
+
|
22
|
+
validates :first_name, :last_name, :address1, :city, :state, :zip, :presence => true
|
23
|
+
validates :zip, :format => { :with => /^\d{5}(-\d{4})?$/, :message => 'Invalid zip code' }
|
29
24
|
end
|
30
25
|
end
|
26
|
+
|
@@ -1,22 +1,33 @@
|
|
1
1
|
module CabooseStore
|
2
2
|
class CabooseStorePlugin < Caboose::CaboosePlugin
|
3
|
-
|
4
|
-
def self.admin_nav(nav, user = nil, page = nil)
|
3
|
+
def self.admin_nav(nav, user=nil, page=nil)
|
5
4
|
return nav if user.nil?
|
6
5
|
|
7
6
|
item = {
|
8
|
-
'id'
|
9
|
-
'text'
|
7
|
+
'id' => 'general-store',
|
8
|
+
'text' => 'General Store',
|
10
9
|
'children' => []
|
11
10
|
}
|
12
|
-
|
11
|
+
|
13
12
|
item['children'] << { 'id' => 'categories', 'href' => '/admin/categories' , 'text' => 'Categories' , 'modal' => false } if user.is_allowed('categories' , 'view')
|
13
|
+
item['children'] << { 'id' => 'vendors' , 'href' => '/admin/vendors' , 'text' => 'Vendors' , 'modal' => false } if user.is_allowed('vendors' , 'view')
|
14
14
|
item['children'] << { 'id' => 'products' , 'href' => '/admin/products' , 'text' => 'Products' , 'modal' => false } if user.is_allowed('products' , 'view')
|
15
15
|
item['children'] << { 'id' => 'orders' , 'href' => '/admin/orders' , 'text' => 'Orders' , 'modal' => false } if user.is_allowed('orders' , 'view')
|
16
|
-
|
17
|
-
nav << item
|
16
|
+
|
17
|
+
nav << item
|
18
|
+
|
18
19
|
return nav
|
19
20
|
end
|
20
21
|
|
22
|
+
def self.javascripts(scripts)
|
23
|
+
scripts << 'caboose_store/application'
|
24
|
+
|
25
|
+
return scripts
|
26
|
+
end
|
27
|
+
|
28
|
+
#def self.login_success
|
29
|
+
# @order.update_attribute(:customer_id, session['app_user'].id)
|
30
|
+
#end
|
21
31
|
end
|
22
32
|
end
|
33
|
+
|
@@ -1,63 +1,88 @@
|
|
1
|
+
#
|
2
|
+
# Category
|
3
|
+
#
|
4
|
+
# :: Class Methods
|
5
|
+
# :: Instance Methods
|
6
|
+
|
1
7
|
module CabooseStore
|
2
8
|
class Category < ActiveRecord::Base
|
3
|
-
self.table_name =
|
9
|
+
self.table_name = 'store_categories'
|
4
10
|
|
5
11
|
belongs_to :parent, :class_name => 'Category', :foreign_key => 'parent_id'
|
6
|
-
has_many :children, :class_name => 'Category', :foreign_key => 'parent_id', :order => 'name'
|
12
|
+
has_many :children, :class_name => 'Category', :foreign_key => 'parent_id', :order => 'name'
|
7
13
|
has_many :products, :through => :category_memberships, :order => 'title'
|
8
14
|
has_many :category_memberships
|
15
|
+
|
9
16
|
has_attached_file :image,
|
10
|
-
:path =>
|
17
|
+
:path => 'categories/:id_:style.jpg',
|
11
18
|
:default_url => '/categories/:id_:style.jpg',
|
12
19
|
:styles => {
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
16
|
-
:
|
17
|
-
:
|
20
|
+
tiny: '100x100>',
|
21
|
+
thumb: '250x250>',
|
22
|
+
medium: '400x400>',
|
23
|
+
large: '800x800>',
|
24
|
+
huge: '1200x1200>'
|
18
25
|
}
|
26
|
+
|
27
|
+
validates_attachment_content_type :image, :content_type => %w(image/jpeg image/jpg image/png)
|
19
28
|
|
20
|
-
attr_accessible :id,
|
29
|
+
attr_accessible :id,
|
30
|
+
:parent_id,
|
31
|
+
:name,
|
32
|
+
:url,
|
33
|
+
:slug,
|
34
|
+
:sort_order,
|
35
|
+
:status,
|
36
|
+
:image_file_name,
|
37
|
+
:image_content_type,
|
38
|
+
:image_file_size,
|
39
|
+
:image_updated_at,
|
40
|
+
:square_offset_x,
|
41
|
+
:square_offset_y,
|
42
|
+
:square_scale_factor
|
21
43
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
44
|
+
#
|
45
|
+
# Class Methods
|
46
|
+
#
|
47
|
+
|
48
|
+
def self.root
|
49
|
+
self.find_by_url('/products')
|
27
50
|
end
|
28
|
-
|
29
|
-
def self.
|
30
|
-
|
31
|
-
self.where(:parent_id => nil).reorder('name').all.each do |cat|
|
32
|
-
self.options_helper(cat, selected_id, arr)
|
33
|
-
end
|
34
|
-
return arr
|
51
|
+
|
52
|
+
def self.top_level
|
53
|
+
self.root.children
|
35
54
|
end
|
36
55
|
|
37
|
-
def self.
|
38
|
-
|
39
|
-
:value => cat.id,
|
40
|
-
:text => "#{prefix}#{cat.name}"
|
41
|
-
}
|
42
|
-
cat.children.each do |cat2|
|
43
|
-
self.options_helper(cat2, selected_id, arr, "#{prefix} - ")
|
44
|
-
end
|
56
|
+
def self.sample(number)
|
57
|
+
CabooseStore::Category.top_level.collect { |category| category if category.active_products.any? }.compact.sample(number)
|
45
58
|
end
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
59
|
+
|
60
|
+
#
|
61
|
+
# Instance Methods
|
62
|
+
#
|
63
|
+
|
64
|
+
def generate_slug
|
65
|
+
self.name.gsub(' ', '-').downcase
|
66
|
+
end
|
67
|
+
|
68
|
+
def update_child_slugs
|
69
|
+
return if self.children.nil? or self.children.empty?
|
70
|
+
|
71
|
+
self.children.each do |child|
|
72
|
+
child.update_attribute(:url, "#{self.url}/#{child.slug}")
|
73
|
+
child.update_child_slugs
|
74
|
+
end
|
56
75
|
end
|
57
76
|
|
58
|
-
def
|
59
|
-
|
77
|
+
def active_products
|
78
|
+
self.products.where(:status => 'Active')
|
60
79
|
end
|
61
80
|
|
81
|
+
def ancestry
|
82
|
+
return [self] if self.parent.nil?
|
83
|
+
ancestors = self.parent.ancestry
|
84
|
+
ancestors << self
|
85
|
+
return ancestors
|
86
|
+
end
|
62
87
|
end
|
63
88
|
end
|
@@ -1,11 +1,10 @@
|
|
1
1
|
module CabooseStore
|
2
2
|
class CategoryMembership < ActiveRecord::Base
|
3
|
-
self.table_name =
|
3
|
+
self.table_name = 'store_category_memberships'
|
4
4
|
|
5
5
|
belongs_to :category
|
6
6
|
belongs_to :product
|
7
7
|
|
8
8
|
attr_accessible :category_id, :product_id
|
9
|
-
|
10
9
|
end
|
11
10
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module CabooseStore
|
2
|
+
class CustomizationMembership < ActiveRecord::Base
|
3
|
+
self.table_name = 'store_customization_memberships'
|
4
|
+
|
5
|
+
belongs_to :product
|
6
|
+
belongs_to :customization, :class_name => 'CabooseStore::Product'
|
7
|
+
|
8
|
+
attr_accessible :product_id, :customization_id
|
9
|
+
end
|
10
|
+
end
|
@@ -1,14 +1,16 @@
|
|
1
1
|
module CabooseStore
|
2
2
|
class Discount < ActiveRecord::Base
|
3
|
-
self.table_name
|
3
|
+
self.table_name = 'store_discounts'
|
4
|
+
self.primary_key = 'id'
|
4
5
|
|
5
6
|
attr_accessible :id,
|
6
7
|
:name, # The name of this discount
|
7
8
|
:code, # The code the customer has to input to apply for this discount
|
9
|
+
:amount_current,
|
10
|
+
:amount_total,
|
8
11
|
:amount_flat, # Amount of the savings flat off the total
|
9
12
|
:amount_percentage, # Amount of savings as a percentage off the total
|
10
13
|
:no_shipping, # Whether or not it's a free shipping discount
|
11
14
|
:no_tax # Whether or not it's a free shipping discount
|
12
|
-
|
13
15
|
end
|
14
16
|
end
|