comable-frontend 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +97 -0
- data/app/assets/images/comable/frontend/home-one.jpg +0 -0
- data/app/assets/images/comable/frontend/home-top.jpg +0 -0
- data/app/assets/javascripts/comable/frontend/application.coffee +5 -0
- data/app/assets/stylesheets/comable/frontend/application.scss +527 -0
- data/app/assets/stylesheets/comable/frontend/products.scss +0 -0
- data/app/assets/stylesheets/comable/products.scss +0 -0
- data/app/controllers/comable/application_controller.rb +12 -0
- data/app/controllers/comable/carts_controller.rb +66 -0
- data/app/controllers/comable/home_controller.rb +14 -0
- data/app/controllers/comable/orders_controller.rb +97 -0
- data/app/controllers/comable/pages_controller.rb +19 -0
- data/app/controllers/comable/products_controller.rb +25 -0
- data/app/controllers/comable/users_controller.rb +29 -0
- data/app/controllers/concerns/comable/payment_action.rb +17 -0
- data/app/controllers/concerns/comable/shipment_action.rb +17 -0
- data/app/controllers/concerns/comable/signin_action.rb +55 -0
- data/app/views/comable/carts/show.slim +67 -0
- data/app/views/comable/home/show.slim +24 -0
- data/app/views/comable/orders/confirm.slim +83 -0
- data/app/views/comable/orders/create.slim +7 -0
- data/app/views/comable/orders/delivery.slim +48 -0
- data/app/views/comable/orders/orderer.slim +64 -0
- data/app/views/comable/orders/payment.slim +15 -0
- data/app/views/comable/orders/shipment.slim +15 -0
- data/app/views/comable/orders/signin.slim +22 -0
- data/app/views/comable/pages/show.slim +7 -0
- data/app/views/comable/products/index.slim +20 -0
- data/app/views/comable/products/show.slim +89 -0
- data/app/views/comable/shared/_address.slim +13 -0
- data/app/views/comable/shared/_address_form.slim +39 -0
- data/app/views/comable/shared/_footer.slim +39 -0
- data/app/views/comable/shared/_header.slim +74 -0
- data/app/views/comable/shared/_header_for_checkout.slim +18 -0
- data/app/views/comable/shared/_products.slim +23 -0
- data/app/views/comable/shared/_tracker.slim +2 -0
- data/app/views/comable/users/_address.slim +14 -0
- data/app/views/comable/users/addresses.slim +54 -0
- data/app/views/comable/users/show.slim +60 -0
- data/app/views/kaminari/comable_frontend/_gap.html.slim +2 -0
- data/app/views/kaminari/comable_frontend/_next_page.html.slim +7 -0
- data/app/views/kaminari/comable_frontend/_page.html.slim +3 -0
- data/app/views/kaminari/comable_frontend/_paginator.html.slim +11 -0
- data/app/views/kaminari/comable_frontend/_prev_page.html.slim +7 -0
- data/app/views/layouts/comable/application.slim +35 -0
- data/config/routes.rb +34 -0
- data/lib/comable/frontend/engine.rb +29 -0
- data/lib/comable/frontend.rb +1 -0
- data/lib/tasks/comable_backend_tasks.rake +4 -0
- metadata +295 -0
@@ -0,0 +1,22 @@
|
|
1
|
+
#comable-order
|
2
|
+
.comable-signin
|
3
|
+
/ TODO: Standardize
|
4
|
+
- if @order.errors.any?
|
5
|
+
.error_messages
|
6
|
+
ul
|
7
|
+
- @order.errors.full_messages.each do |full_message|
|
8
|
+
li = full_message
|
9
|
+
|
10
|
+
section.col-sm-6
|
11
|
+
= render file: 'devise/sessions/new'
|
12
|
+
|
13
|
+
section.col-sm-6
|
14
|
+
h2
|
15
|
+
= Comable.t('guest')
|
16
|
+
= form_for @order, as: :order, url: comable.guest_order_path, method: :put do |f|
|
17
|
+
.form-group
|
18
|
+
.col-sm-2.control-label
|
19
|
+
= f.label :email
|
20
|
+
.col-sm-10
|
21
|
+
= f.email_field :email, placeholder: @order.class.human_attribute_name(:email)
|
22
|
+
= f.submit Comable.t('guest_order'), class: 'btn btn-default'
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#comable-product
|
2
|
+
- if @category
|
3
|
+
.row
|
4
|
+
= listed_categories @category.path, tag: :ol, class: 'breadcrumb'
|
5
|
+
|
6
|
+
.row
|
7
|
+
.category.col-sm-2
|
8
|
+
h2
|
9
|
+
= Comable.t('category')
|
10
|
+
- if @category
|
11
|
+
= listed_categories @category.path, class: 'category-path'
|
12
|
+
= listed_categories @category.children
|
13
|
+
- else
|
14
|
+
= listed_categories Comable::Category.roots
|
15
|
+
|
16
|
+
.products.col-sm-10
|
17
|
+
= render 'comable/shared/products'
|
18
|
+
|
19
|
+
.text-center
|
20
|
+
= paginate @products, theme: :comable_frontend
|
@@ -0,0 +1,89 @@
|
|
1
|
+
#comable-product
|
2
|
+
.row
|
3
|
+
ol.breadcrumb
|
4
|
+
- if @product.categories.any?
|
5
|
+
- @product.categories.first.path.each do |category|
|
6
|
+
li = link_to category.name, comable.products_path(category_id: category.id)
|
7
|
+
li.active
|
8
|
+
= @product.name
|
9
|
+
|
10
|
+
.row
|
11
|
+
.images.col-sm-6
|
12
|
+
- if @product.images.any?
|
13
|
+
.image
|
14
|
+
= link_to @product.image_url, class: 'thumbnail' do
|
15
|
+
= image_tag @product.image_url, width: '100%'
|
16
|
+
.row
|
17
|
+
- (@product.images - [@product.images.first]).each do |image|
|
18
|
+
.image.col-sm-4
|
19
|
+
= link_to image.url, class: 'thumbnail' do
|
20
|
+
= image_tag image.url, width: '100%'
|
21
|
+
- else
|
22
|
+
.thumbnail
|
23
|
+
.image = image_tag @product.image_url, width: '100%'
|
24
|
+
|
25
|
+
.text.col-sm-6
|
26
|
+
h1.name
|
27
|
+
= @product.name
|
28
|
+
small< = @product.code
|
29
|
+
.caption
|
30
|
+
= @product.caption
|
31
|
+
.price
|
32
|
+
= number_to_currency @product.price
|
33
|
+
|
34
|
+
= form_tag comable.add_cart_path do
|
35
|
+
- if @product.sku?
|
36
|
+
.sku
|
37
|
+
= sku_table @product
|
38
|
+
|
39
|
+
- if @product.stocked?
|
40
|
+
.add_cart.form-inline.form-group
|
41
|
+
= hidden_field_tag :product_id, @product.id
|
42
|
+
= select_tag :quantity, options_for_select(1.upto(10).to_a)
|
43
|
+
= submit_tag Comable.t('add_to_cart')
|
44
|
+
- else
|
45
|
+
.soldout
|
46
|
+
= Comable.t('soldout')
|
47
|
+
|
48
|
+
- if @product.categories.any?
|
49
|
+
.row
|
50
|
+
h2
|
51
|
+
= Comable.t('browse_related_products')
|
52
|
+
ul
|
53
|
+
- @product.categories.each do |category|
|
54
|
+
li = listed_categories category.path, class: 'category-breadcrumb'
|
55
|
+
|
56
|
+
#comable-image-dialog
|
57
|
+
coffee:
|
58
|
+
jQuery( ->
|
59
|
+
$('#comable-product .images .image a').click((event) ->
|
60
|
+
# Disable this event on smartphone
|
61
|
+
return if $(window).width() <= 768
|
62
|
+
|
63
|
+
event.preventDefault()
|
64
|
+
|
65
|
+
image = $(this).find('img')[0]
|
66
|
+
return if image.length == 0
|
67
|
+
|
68
|
+
$('body').addClass('stop-scrolling')
|
69
|
+
|
70
|
+
image_clone = $(image).clone().css(width: 'auto', height: 'auto')
|
71
|
+
|
72
|
+
$('#comable-image-dialog').html(image_clone).dialog(
|
73
|
+
modal: true,
|
74
|
+
resizable: false,
|
75
|
+
width: $(window).width(),
|
76
|
+
height: $(window).height(),
|
77
|
+
dialogClass: 'without-titlebar',
|
78
|
+
close: -> $('body').removeClass('stop-scrolling')
|
79
|
+
)
|
80
|
+
)
|
81
|
+
|
82
|
+
$('#comable-image-dialog').click( ->
|
83
|
+
$(this).dialog('close')
|
84
|
+
);
|
85
|
+
|
86
|
+
$(document).on('click', '.ui-widget-overlay', ->
|
87
|
+
$('#comable-image-dialog').dialog('close')
|
88
|
+
);
|
89
|
+
)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
.comable-full_name
|
2
|
+
strong
|
3
|
+
= address.full_name
|
4
|
+
.comable-zip_code
|
5
|
+
= address.zip_code
|
6
|
+
.comable-address1
|
7
|
+
= address.state_name
|
8
|
+
= address.city
|
9
|
+
.comable-address2
|
10
|
+
= address.detail
|
11
|
+
.comable-phone_number
|
12
|
+
= "#{address.class.human_attribute_name(:phone_number)}: "
|
13
|
+
= address.phone_number
|
@@ -0,0 +1,39 @@
|
|
1
|
+
.form-group.comable-name
|
2
|
+
.col-sm-2.control-label
|
3
|
+
= address.label :full_name
|
4
|
+
.col-sm-10
|
5
|
+
.row
|
6
|
+
.col-sm-6
|
7
|
+
= address.text_field :family_name, placeholder: address.object.class.human_attribute_name(:family_name)
|
8
|
+
.col-sm-6
|
9
|
+
= address.text_field :first_name, placeholder: address.object.class.human_attribute_name(:first_name)
|
10
|
+
|
11
|
+
.form-group.comable-state_name
|
12
|
+
.col-sm-2.control-label
|
13
|
+
= address.label :state_name
|
14
|
+
.col-sm-10
|
15
|
+
= address.text_field :state_name, placeholder: address.object.class.human_attribute_name(:state_name)
|
16
|
+
|
17
|
+
.form-group.comable-zip_code
|
18
|
+
.col-sm-2.control-label
|
19
|
+
= address.label :zip_code
|
20
|
+
.col-sm-10
|
21
|
+
= address.text_field :zip_code, max_length: 8, placeholder: address.object.class.human_attribute_name(:zip_code)
|
22
|
+
|
23
|
+
.form-group.comable-city
|
24
|
+
.col-sm-2.control-label
|
25
|
+
= address.label :city
|
26
|
+
.col-sm-10
|
27
|
+
= address.text_field :city, placeholder: address.object.class.human_attribute_name(:city)
|
28
|
+
|
29
|
+
.form-group.comable-detail
|
30
|
+
.col-sm-2.control-label
|
31
|
+
= address.label :detail
|
32
|
+
.col-sm-10
|
33
|
+
= address.text_field :detail, placeholder: address.object.class.human_attribute_name(:detail)
|
34
|
+
|
35
|
+
.form-group.phone_number
|
36
|
+
.col-sm-2.control-label
|
37
|
+
= address.label :phone_number
|
38
|
+
.col-sm-10
|
39
|
+
= address.text_field :phone_number, max_length: 18, placeholder: address.object.class.human_attribute_name(:phone_number)
|
@@ -0,0 +1,39 @@
|
|
1
|
+
footer
|
2
|
+
.container
|
3
|
+
.row
|
4
|
+
.col-md-4
|
5
|
+
h3
|
6
|
+
= Comable.t('support')
|
7
|
+
ul.list-unstyled
|
8
|
+
li
|
9
|
+
i.glyphicon.glyphicon-earphone>
|
10
|
+
| 0123-XX-XXXX
|
11
|
+
li
|
12
|
+
i.glyphicon.glyphicon-envelope>
|
13
|
+
| comable@example.com
|
14
|
+
.col-md-4
|
15
|
+
h3
|
16
|
+
= Comable.t('pages')
|
17
|
+
ul.list-unstyled
|
18
|
+
li
|
19
|
+
= link_to Comable.t('home'), comable.root_path
|
20
|
+
li
|
21
|
+
= link_to Comable.t('products'), comable.products_path
|
22
|
+
li
|
23
|
+
= link_to Comable.t('cart'), comable.cart_path
|
24
|
+
li
|
25
|
+
= link_to Comable.t('my_account'), comable.user_path
|
26
|
+
.col-md-4
|
27
|
+
h3
|
28
|
+
= Comable.t('my_account')
|
29
|
+
ul.list-unstyled
|
30
|
+
li
|
31
|
+
= link_to Comable.t('sign_in'), comable.new_user_session_path
|
32
|
+
li
|
33
|
+
= link_to Comable.t('my_account'), comable.user_path
|
34
|
+
li
|
35
|
+
= link_to Comable.t('change_email_or_password'), comable.edit_user_path
|
36
|
+
li
|
37
|
+
= link_to Comable.t('edit_your_address_book'), comable.addresses_user_path
|
38
|
+
.credit
|
39
|
+
| Powered by #{link_to Comable.app_name, Comable.homepage}
|
@@ -0,0 +1,74 @@
|
|
1
|
+
header
|
2
|
+
nav.navbar.navbar-default role="navigation"
|
3
|
+
.comable-navbar-top
|
4
|
+
.container
|
5
|
+
/! Collect the nav links, forms, and other content for toggling
|
6
|
+
#bs-example-navbar-collapse-1.collapse.navbar-collapse
|
7
|
+
ul.nav.navbar-nav
|
8
|
+
li
|
9
|
+
p.navbar-text
|
10
|
+
| descriptions
|
11
|
+
ul.nav.navbar-nav.navbar-right
|
12
|
+
li
|
13
|
+
= link_to Comable.t('my_account'), comable.user_path
|
14
|
+
li
|
15
|
+
- if current_comable_user.signed_in?
|
16
|
+
= link_to comable.destroy_user_session_path, method: :delete do
|
17
|
+
i.glyphicon.glyphicon-log-out>
|
18
|
+
= Comable.t('sign_out')
|
19
|
+
- else
|
20
|
+
= link_to comable.new_user_session_path do
|
21
|
+
i.glyphicon.glyphicon-log-in>
|
22
|
+
= Comable.t('sign_in')
|
23
|
+
.container
|
24
|
+
/! Brand and toggle get grouped for better mobile display
|
25
|
+
.navbar-header
|
26
|
+
button.navbar-toggle.collapsed data-target="#bs-example-navbar-collapse-1" data-toggle="collapse" type="button"
|
27
|
+
span.sr-only Toggle navigation
|
28
|
+
span.icon-bar
|
29
|
+
span.icon-bar
|
30
|
+
span.icon-bar
|
31
|
+
= link_to current_store.name, comable.root_path, class: 'navbar-brand'
|
32
|
+
/! Collect the nav links, forms, and other content for toggling
|
33
|
+
#bs-example-navbar-collapse-1.collapse.navbar-collapse
|
34
|
+
ul.nav.navbar-nav
|
35
|
+
li.dropdown.menu-large
|
36
|
+
= link_to comable.products_path, class: 'dropdown-toggle', role: 'button', 'aria-expanded' => 'false' do
|
37
|
+
= Comable.t('category')
|
38
|
+
span.caret<
|
39
|
+
ul.dropdown-menu.megamenu.row
|
40
|
+
- Comable::Category.roots.each do |category|
|
41
|
+
li.col-sm-3
|
42
|
+
ul
|
43
|
+
li.dropdown-header
|
44
|
+
= category.name
|
45
|
+
- category.children.each do |child|
|
46
|
+
li = link_to_category child, force_link: true
|
47
|
+
ul.nav.navbar-nav.navbar-right
|
48
|
+
li.dropdown
|
49
|
+
= link_to comable.cart_path, class: 'dropdown-toggle', role: 'button', 'aria-expanded' => 'false' do
|
50
|
+
i.glyphicon.glyphicon-shopping-cart>
|
51
|
+
span
|
52
|
+
= Comable.t('cart')
|
53
|
+
span<
|
54
|
+
| (#{current_comable_user.cart.size})
|
55
|
+
span.caret<
|
56
|
+
ul.dropdown-menu.comable-mini-cart role="menu"
|
57
|
+
- current_comable_user.cart.take(5).each do |cart_item|
|
58
|
+
li
|
59
|
+
= link_to comable.product_path(cart_item.product) do
|
60
|
+
.comable-image
|
61
|
+
= image_tag cart_item.product.image_url, width: '100%'
|
62
|
+
.comable-name
|
63
|
+
= cart_item.name_with_sku
|
64
|
+
.comable-quantity
|
65
|
+
= "#{cart_item.class.human_attribute_name(:quantity)}: "
|
66
|
+
= cart_item.quantity
|
67
|
+
li.comable-show-cart
|
68
|
+
= link_to Comable.t('show_cart'), comable.cart_path
|
69
|
+
= form_tag comable.products_path, method: :get, class: 'navbar-form' do
|
70
|
+
.form-group
|
71
|
+
.input-group
|
72
|
+
= text_field_tag :q, params[:q], class: 'form-control'
|
73
|
+
span.input-group-btn
|
74
|
+
= button_tag Comable.t('search'), class: 'btn btn-default', type: 'button'
|
@@ -0,0 +1,18 @@
|
|
1
|
+
header
|
2
|
+
nav.navbar.navbar-default role="navigation"
|
3
|
+
.container
|
4
|
+
/! Brand and toggle get grouped for better mobile display
|
5
|
+
.navbar-header
|
6
|
+
= link_to current_store.name, comable.root_path, class: 'navbar-brand'
|
7
|
+
- unless devise_controller?
|
8
|
+
/! Collect the nav links, forms, and other content for toggling
|
9
|
+
.navbar-collapse
|
10
|
+
ol.nav.navbar-nav.navbar-right.comable-checkout-flow
|
11
|
+
li.signin class="#{'active' if action_name == 'signin'}"
|
12
|
+
= Comable.t('checkout_flow.sign_in')
|
13
|
+
li.addresses class="#{'active' if params[:state].in? %w( orderer delivery payment shipment )}"
|
14
|
+
= Comable.t('checkout_flow.address_and_payment')
|
15
|
+
li.confirm class="#{'active' if params[:state] == 'confirm'}"
|
16
|
+
= Comable.t('checkout_flow.confirm')
|
17
|
+
li.complete class="#{'active' if action_name == 'create'}"
|
18
|
+
= Comable.t('checkout_flow.complete')
|
@@ -0,0 +1,23 @@
|
|
1
|
+
ul.row
|
2
|
+
- @products.each do |product|
|
3
|
+
li.col-xs-6.col-sm-3
|
4
|
+
.thumbnail.text-center
|
5
|
+
= link_to comable.product_path(product) do
|
6
|
+
= image_tag product.image_url, width: '100%'
|
7
|
+
h5
|
8
|
+
= link_to product.name, comable.product_path(product)
|
9
|
+
- if product.caption.present?
|
10
|
+
p
|
11
|
+
= product.caption
|
12
|
+
strong
|
13
|
+
= number_to_currency product.price
|
14
|
+
p
|
15
|
+
= form_tag comable.add_cart_path do
|
16
|
+
- stock = product.stocks.first
|
17
|
+
- if stock && stock.stocked?
|
18
|
+
.add_cart.form-inline.form-group
|
19
|
+
= hidden_field_tag :stock_id, stock.id
|
20
|
+
= submit_tag Comable.t('add_to_cart'), class: 'btn btn-default'
|
21
|
+
- else
|
22
|
+
.soldout
|
23
|
+
= submit_tag Comable.t('soldout'), class: 'btn btn-default', disabled: true
|
@@ -0,0 +1,14 @@
|
|
1
|
+
= render 'comable/shared/address', address: address
|
2
|
+
|
3
|
+
ul.buttons.list-inline
|
4
|
+
- if address != address.user.bill_address
|
5
|
+
li.use_bill_address
|
6
|
+
= form_for current_comable_user, as: :user, url: comable.addresses_user_url, method: :put do |f|
|
7
|
+
= f.hidden_field :bill_address_id, value: address.id
|
8
|
+
= f.submit Comable.t('use_as_billing_address'), class: 'btn btn-default'
|
9
|
+
|
10
|
+
- if address != address.user.ship_address
|
11
|
+
li.use_ship_address
|
12
|
+
= form_for current_comable_user, as: :user, url: comable.addresses_user_url, method: :put do |f|
|
13
|
+
= f.hidden_field :ship_address_id, value: address.id
|
14
|
+
= f.submit Comable.t('use_as_shipping_address'), class: 'btn btn-default'
|
@@ -0,0 +1,54 @@
|
|
1
|
+
.user
|
2
|
+
.addresses
|
3
|
+
h1
|
4
|
+
= Comable.t('address_book')
|
5
|
+
|
6
|
+
- if current_comable_user.errors.any?
|
7
|
+
.errors
|
8
|
+
ul
|
9
|
+
- current_comable_user.errors.full_messages.each do |full_message|
|
10
|
+
li = full_message
|
11
|
+
|
12
|
+
- if current_comable_user.addresses.empty?
|
13
|
+
.not_found
|
14
|
+
p
|
15
|
+
= Comable.t('not_found')
|
16
|
+
- else
|
17
|
+
.row
|
18
|
+
.bill_address.col-sm-6
|
19
|
+
h2
|
20
|
+
= current_comable_user.class.human_attribute_name(:bill_address)
|
21
|
+
- if current_comable_user.bill_address
|
22
|
+
= render 'address', address: current_comable_user.bill_address
|
23
|
+
- else
|
24
|
+
.not_found
|
25
|
+
p
|
26
|
+
= Comable.t('not_found')
|
27
|
+
|
28
|
+
.ship_address.col-sm-6
|
29
|
+
h2
|
30
|
+
= current_comable_user.class.human_attribute_name(:ship_address)
|
31
|
+
- if current_comable_user.ship_address
|
32
|
+
= render 'address', address: current_comable_user.ship_address
|
33
|
+
- else
|
34
|
+
.not_found
|
35
|
+
p
|
36
|
+
= Comable.t('not_found')
|
37
|
+
|
38
|
+
.row
|
39
|
+
.other_addresses
|
40
|
+
h2
|
41
|
+
= Comable.t('other_addresses')
|
42
|
+
ul.list-unstyled
|
43
|
+
- current_comable_user.other_addresses.each do |address|
|
44
|
+
li.col-sm-4
|
45
|
+
= render 'address', address: address
|
46
|
+
|
47
|
+
.new_address
|
48
|
+
h2
|
49
|
+
= Comable.t('new_address')
|
50
|
+
= form_for current_comable_user, as: :user, url: comable.addresses_user_url, method: :put do |f|
|
51
|
+
= f.fields_for :addresses, current_comable_user.addresses.build do |ff|
|
52
|
+
= render 'comable/shared/address_form', address: ff
|
53
|
+
.submit
|
54
|
+
= f.submit Comable.t('actions.create')
|
@@ -0,0 +1,60 @@
|
|
1
|
+
#comable-user
|
2
|
+
h1
|
3
|
+
= Comable.t('my_account')
|
4
|
+
|
5
|
+
.comable-name
|
6
|
+
= current_comable_user.email
|
7
|
+
|
8
|
+
.comable-member-menu
|
9
|
+
ul
|
10
|
+
li
|
11
|
+
= link_to Comable.t('change_email_or_password'), comable.edit_user_path
|
12
|
+
li
|
13
|
+
= link_to Comable.t('edit_your_address_book'), comable.addresses_user_path
|
14
|
+
|
15
|
+
.coamble-orders
|
16
|
+
h2
|
17
|
+
= Comable.t('order_history')
|
18
|
+
- @orders.each do |order|
|
19
|
+
table
|
20
|
+
thead
|
21
|
+
tr
|
22
|
+
th
|
23
|
+
= order.class.human_attribute_name(:completed_at)
|
24
|
+
th
|
25
|
+
= order.class.human_attribute_name(:total_price)
|
26
|
+
th
|
27
|
+
= order.class.human_attribute_name(:bill_address)
|
28
|
+
th
|
29
|
+
= order.class.human_attribute_name(:code)
|
30
|
+
tbody
|
31
|
+
tr
|
32
|
+
td
|
33
|
+
= l order.completed_at.to_date, format: :long
|
34
|
+
td
|
35
|
+
= number_to_currency order.total_price
|
36
|
+
td
|
37
|
+
= order.bill_address.full_name
|
38
|
+
td
|
39
|
+
= order.code
|
40
|
+
- order.order_items.each do |order_item|
|
41
|
+
tr
|
42
|
+
td colspan="4"
|
43
|
+
.comable-detail
|
44
|
+
.row
|
45
|
+
.col-sm-2.comable-image
|
46
|
+
= link_to comable.product_path(order_item.product), class: 'thumbnail' do
|
47
|
+
= image_tag order_item.product.image_url, width: '100%'
|
48
|
+
.col-sm-10
|
49
|
+
.comable-name
|
50
|
+
= link_to order_item.name_with_sku, comable.product_path(order_item.product)
|
51
|
+
.comable-repeat
|
52
|
+
= form_tag comable.add_cart_path do
|
53
|
+
- if order_item.stock.stocked?
|
54
|
+
.add_cart.form-inline.form-group
|
55
|
+
= hidden_field_tag :stock_id, order_item.stock_id
|
56
|
+
= hidden_field_tag :quantity, order_item.quantity
|
57
|
+
= submit_tag Comable.t('reorder'), class: 'btn btn-default'
|
58
|
+
|
59
|
+
.text-center
|
60
|
+
= paginate @orders, theme: :comable_frontend
|
@@ -0,0 +1,35 @@
|
|
1
|
+
doctype html
|
2
|
+
html
|
3
|
+
head
|
4
|
+
= display_meta_tags site: current_store.name, description: current_store.meta_description, keywords: current_store.meta_keywords
|
5
|
+
|
6
|
+
= stylesheet_link_tag "comable/frontend/application", media: "all"
|
7
|
+
= javascript_include_tag "comable/frontend/application"
|
8
|
+
= csrf_meta_tags
|
9
|
+
|
10
|
+
css:
|
11
|
+
.hidden { display: none; }
|
12
|
+
|
13
|
+
javascript:
|
14
|
+
jQuery(document).ready(function() {
|
15
|
+
$(".dropdown").hover(
|
16
|
+
function() { $('.dropdown-menu', this).stop().delay(500).queue(function() { $(this).show().parent().addClass('open').dequeue(); }) },
|
17
|
+
function() { $('.dropdown-menu', this).stop().hide().parent().removeClass('open'); });
|
18
|
+
});
|
19
|
+
|
20
|
+
- mini_header_flag = controller_name == 'orders' || devise_controller?
|
21
|
+
body class="#{'comable-checkout-layout' if mini_header_flag}"
|
22
|
+
= render 'comable/shared/tracker'
|
23
|
+
|
24
|
+
- if mini_header_flag
|
25
|
+
= render 'comable/shared/header_for_checkout'
|
26
|
+
- else
|
27
|
+
= render 'comable/shared/header'
|
28
|
+
|
29
|
+
main class="#{'container' if controller_name != 'home'}"
|
30
|
+
- flash.each do |name, msg|
|
31
|
+
= content_tag(:div, msg, id: "flash_#{name}")
|
32
|
+
|
33
|
+
== yield
|
34
|
+
|
35
|
+
= render 'comable/shared/footer'
|
data/config/routes.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
Comable::Core::Engine.routes.draw do
|
2
|
+
root to: 'home#show'
|
3
|
+
|
4
|
+
resource :home, only: :show
|
5
|
+
resources :products
|
6
|
+
|
7
|
+
resource :cart do
|
8
|
+
collection do
|
9
|
+
# TODO: post => put
|
10
|
+
post :add
|
11
|
+
put :checkout
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
resource :order, only: [:create] do
|
16
|
+
collection do
|
17
|
+
get 'signin', as: :signin
|
18
|
+
put 'guest', as: :guest
|
19
|
+
get ':state', action: :edit, as: :next
|
20
|
+
put ':state', action: :update
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
resources :pages, only: [:show]
|
25
|
+
|
26
|
+
devise_for :user, path: :member, class_name: Comable::User.name, module: :devise
|
27
|
+
|
28
|
+
resource :user, path: :member do
|
29
|
+
member do
|
30
|
+
get :addresses
|
31
|
+
put :addresses, action: :update_addresses
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'comable/core'
|
2
|
+
|
3
|
+
require 'slim'
|
4
|
+
require 'bootstrap-sass'
|
5
|
+
require 'sass-rails'
|
6
|
+
require 'compass-rails'
|
7
|
+
require 'kaminari'
|
8
|
+
|
9
|
+
require 'jquery-rails'
|
10
|
+
require 'jquery-ui-rails'
|
11
|
+
|
12
|
+
require 'meta-tags'
|
13
|
+
|
14
|
+
module Comable
|
15
|
+
module Frontend
|
16
|
+
class Engine < ::Rails::Engine
|
17
|
+
config.generators do |g|
|
18
|
+
g.template_engine :slim
|
19
|
+
g.test_framework :rspec, fixture: true
|
20
|
+
g.fixture_replacement :factory_girl, dir: 'spec/factories'
|
21
|
+
end
|
22
|
+
|
23
|
+
# XXX: a code below to delegate comable:install:migrations to comable-core
|
24
|
+
config.paths['db/migrate'] = []
|
25
|
+
|
26
|
+
config.autoload_paths << "#{config.root}/app/controllers/concerns" if Rails::VERSION::MAJOR == 3
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'comable/frontend/engine'
|