Improving checkout experience Fixes #103
							parent
							
								
									588fdddb75
								
							
						
					
					
						commit
						b48b2237ee
					
				|  | @ -67,15 +67,6 @@ const convertBool = (value) => { | ||||||
|     return false; |     return false; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| const showCartCloseBtn = (page) => { |  | ||||||
|     let showCartCloseButton = true; |  | ||||||
|     if(page === 'checkout' || page === 'pay'){ |  | ||||||
|         showCartCloseButton = false; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return showCartCloseButton; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| // adds products to sitemap.xml
 | // adds products to sitemap.xml
 | ||||||
| const addSitemapProducts = (req, res, cb) => { | const addSitemapProducts = (req, res, cb) => { | ||||||
|     const db = req.app.db; |     const db = req.app.db; | ||||||
|  | @ -587,7 +578,6 @@ module.exports = { | ||||||
|     safeParseInt, |     safeParseInt, | ||||||
|     checkboxBool, |     checkboxBool, | ||||||
|     convertBool, |     convertBool, | ||||||
|     showCartCloseBtn, |  | ||||||
|     addSitemapProducts, |     addSitemapProducts, | ||||||
|     clearSessionValue, |     clearSessionValue, | ||||||
|     updateTotalCartAmount, |     updateTotalCartAmount, | ||||||
|  |  | ||||||
|  | @ -0,0 +1,51 @@ | ||||||
|  | { | ||||||
|  |     "$id": "saveCustomer", | ||||||
|  |     "type": "object", | ||||||
|  |     "properties": { | ||||||
|  |         "email": { | ||||||
|  |             "type": "string", | ||||||
|  |             "format": "emailAddress" | ||||||
|  |         }, | ||||||
|  |         "firstName": { | ||||||
|  |             "type": "string", | ||||||
|  |             "isNotEmpty": true | ||||||
|  |         }, | ||||||
|  |         "lastName": { | ||||||
|  |             "type": "string", | ||||||
|  |             "isNotEmpty": true | ||||||
|  |         }, | ||||||
|  |         "address1": { | ||||||
|  |             "type": "string", | ||||||
|  |             "isNotEmpty": true | ||||||
|  |         }, | ||||||
|  |         "address2": { | ||||||
|  |             "type": "string" | ||||||
|  |         }, | ||||||
|  |         "country": { | ||||||
|  |             "type": "string", | ||||||
|  |             "isNotEmpty": true | ||||||
|  |         }, | ||||||
|  |         "state": { | ||||||
|  |             "type": "string", | ||||||
|  |             "isNotEmpty": true | ||||||
|  |         }, | ||||||
|  |         "postcode": { | ||||||
|  |             "type": "string", | ||||||
|  |             "isNotEmpty": true | ||||||
|  |         }, | ||||||
|  |         "phone": { | ||||||
|  |             "type": "string", | ||||||
|  |             "isNotEmpty": true | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  |     "required": [ | ||||||
|  |         "email", | ||||||
|  |         "firstName", | ||||||
|  |         "lastName", | ||||||
|  |         "address1", | ||||||
|  |         "country", | ||||||
|  |         "state", | ||||||
|  |         "postcode", | ||||||
|  |         "phone" | ||||||
|  |     ] | ||||||
|  | } | ||||||
|  | @ -166,5 +166,9 @@ | ||||||
| 	"Payment ID": "Payment ID", | 	"Payment ID": "Payment ID", | ||||||
| 	"Payment Message": "Payment Message", | 	"Payment Message": "Payment Message", | ||||||
| 	"Password": "Password", | 	"Password": "Password", | ||||||
| 	"Cart Email": "Cart Email" | 	"Cart Email": "Cart Email", | ||||||
|  | 	"Information": "Information", | ||||||
|  | 	"Shipping options": "Shipping options", | ||||||
|  | 	"Proceed to payment": "Proceed to payment", | ||||||
|  | 	"Return to information": "Return to information" | ||||||
| } | } | ||||||
|  | @ -58,8 +58,9 @@ $(document).ready(function (){ | ||||||
|         } |         } | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     $('.menu-btn').on('click', function(e){ |     $(document).on('click', '.menu-btn', function(e){ | ||||||
|         e.preventDefault(); |         e.preventDefault(); | ||||||
|  |         $('body').addClass('pushy-open-right'); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
| 	// add the table class to all tables
 | 	// add the table class to all tables
 | ||||||
|  | @ -75,9 +76,11 @@ $(document).ready(function (){ | ||||||
|         $(this).toggleClass('hover'); |         $(this).toggleClass('hover'); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|  |     if($('.product-title').length){ | ||||||
|         $('.product-title').dotdotdot({ |         $('.product-title').dotdotdot({ | ||||||
|             ellipsis: '...' |             ellipsis: '...' | ||||||
|         }); |         }); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     $(document).on('click', '.btn-qty-minus', function(e){ |     $(document).on('click', '.btn-qty-minus', function(e){ | ||||||
|         var qtyElement = $(e.target).parent().parent().find('.cart-product-quantity'); |         var qtyElement = $(e.target).parent().parent().find('.cart-product-quantity'); | ||||||
|  | @ -161,12 +164,21 @@ $(document).ready(function (){ | ||||||
|         } |         } | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     $('#createCustomerAccount').validator().on('click', function(e){ |     $(document).on('click', '#createAccountCheckbox', function(e){ | ||||||
|  |         $('#newCustomerPassword').prop('required', $('#createAccountCheckbox').prop('checked')); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     $('#checkoutInformation').validator().on('click', function(e){ | ||||||
|         e.preventDefault(); |         e.preventDefault(); | ||||||
|         if($('#shipping-form').validator('validate').has('.has-error').length === 0){ |         if($('#shipping-form').validator('validate').has('.has-error').length === 0){ | ||||||
|  |             // Change route if customer to be saved for later
 | ||||||
|  |             var route = '/customer/save'; | ||||||
|  |             if($('#createAccountCheckbox').prop('checked')){ | ||||||
|  |                 route = '/customer/create'; | ||||||
|  |             } | ||||||
|             $.ajax({ |             $.ajax({ | ||||||
|                 method: 'POST', |                 method: 'POST', | ||||||
|                 url: '/customer/create', |                 url: route, | ||||||
|                 data: { |                 data: { | ||||||
|                     email: $('#shipEmail').val(), |                     email: $('#shipEmail').val(), | ||||||
|                     firstName: $('#shipFirstname').val(), |                     firstName: $('#shipFirstname').val(), | ||||||
|  | @ -177,11 +189,12 @@ $(document).ready(function (){ | ||||||
|                     state: $('#shipState').val(), |                     state: $('#shipState').val(), | ||||||
|                     postcode: $('#shipPostcode').val(), |                     postcode: $('#shipPostcode').val(), | ||||||
|                     phone: $('#shipPhoneNumber').val(), |                     phone: $('#shipPhoneNumber').val(), | ||||||
|                     password: $('#newCustomerPassword').val() |                     password: $('#newCustomerPassword').val(), | ||||||
|  |                     orderComment: $('#orderComment').val() | ||||||
|                 } |                 } | ||||||
|             }) |             }) | ||||||
|             .done(function(){ |             .done(function(){ | ||||||
|                 showNotification('Customer created successfully', 'success', true); |                 window.location = '/checkout/shipping'; | ||||||
|             }) |             }) | ||||||
|             .fail(function(msg){ |             .fail(function(msg){ | ||||||
|                 showNotification(msg.responseJSON.message, 'danger'); |                 showNotification(msg.responseJSON.message, 'danger'); | ||||||
|  |  | ||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							|  | @ -51,10 +51,24 @@ router.post('/customer/create', async (req, res) => { | ||||||
|         const newCustomer = await db.customers.insertOne(customerObj); |         const newCustomer = await db.customers.insertOne(customerObj); | ||||||
|         indexCustomers(req.app) |         indexCustomers(req.app) | ||||||
|         .then(() => { |         .then(() => { | ||||||
|             // Customer creation successful
 |             // Return the new customer
 | ||||||
|             const customerReturn = newCustomer.ops[0]; |             const customerReturn = newCustomer.ops[0]; | ||||||
|             delete customerReturn.password; |             delete customerReturn.password; | ||||||
|             req.session.customer = customerReturn; | 
 | ||||||
|  |             // Set the customer into the session
 | ||||||
|  |             req.session.customerPresent = true; | ||||||
|  |             req.session.customerEmail = customerReturn.email; | ||||||
|  |             req.session.customerFirstname = customerReturn.firstName; | ||||||
|  |             req.session.customerLastname = customerReturn.lastName; | ||||||
|  |             req.session.customerAddress1 = customerReturn.address1; | ||||||
|  |             req.session.customerAddress2 = customerReturn.address2; | ||||||
|  |             req.session.customerCountry = customerReturn.country; | ||||||
|  |             req.session.customerState = customerReturn.state; | ||||||
|  |             req.session.customerPostcode = customerReturn.postcode; | ||||||
|  |             req.session.customerPhone = customerReturn.phone; | ||||||
|  |             req.session.orderComment = req.body.orderComment; | ||||||
|  | 
 | ||||||
|  |             // Return customer oject
 | ||||||
|             res.status(200).json(customerReturn); |             res.status(200).json(customerReturn); | ||||||
|         }); |         }); | ||||||
|     }catch(ex){ |     }catch(ex){ | ||||||
|  | @ -65,6 +79,41 @@ router.post('/customer/create', async (req, res) => { | ||||||
|     } |     } | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
|  | router.post('/customer/save', async (req, res) => { | ||||||
|  |     const customerObj = { | ||||||
|  |         email: req.body.email, | ||||||
|  |         firstName: req.body.firstName, | ||||||
|  |         lastName: req.body.lastName, | ||||||
|  |         address1: req.body.address1, | ||||||
|  |         address2: req.body.address2, | ||||||
|  |         country: req.body.country, | ||||||
|  |         state: req.body.state, | ||||||
|  |         postcode: req.body.postcode, | ||||||
|  |         phone: req.body.phone | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     const schemaResult = validateJson('saveCustomer', customerObj); | ||||||
|  |     if(!schemaResult.result){ | ||||||
|  |         res.status(400).json(schemaResult.errors); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // Set the customer into the session
 | ||||||
|  |     req.session.customerPresent = true; | ||||||
|  |     req.session.customerEmail = customerObj.email; | ||||||
|  |     req.session.customerFirstname = customerObj.firstName; | ||||||
|  |     req.session.customerLastname = customerObj.lastName; | ||||||
|  |     req.session.customerAddress1 = customerObj.address1; | ||||||
|  |     req.session.customerAddress2 = customerObj.address2; | ||||||
|  |     req.session.customerCountry = customerObj.country; | ||||||
|  |     req.session.customerState = customerObj.state; | ||||||
|  |     req.session.customerPostcode = customerObj.postcode; | ||||||
|  |     req.session.customerPhone = customerObj.phone; | ||||||
|  |     req.session.orderComment = req.body.orderComment; | ||||||
|  | 
 | ||||||
|  |     res.status(200).json(customerObj); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
| // Update a customer
 | // Update a customer
 | ||||||
| router.post('/admin/customer/update', restrict, async (req, res) => { | router.post('/admin/customer/update', restrict, async (req, res) => { | ||||||
|     const db = req.app.db; |     const db = req.app.db; | ||||||
|  | @ -259,7 +308,17 @@ router.post('/customer/login_action', async (req, res) => { | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         // Customer login successful
 |         // Customer login successful
 | ||||||
|         req.session.customer = customer; |         req.session.customerPresent = true; | ||||||
|  |         req.session.customerEmail = customer.email; | ||||||
|  |         req.session.customerFirstname = customer.firstName; | ||||||
|  |         req.session.customerLastname = customer.lastName; | ||||||
|  |         req.session.customerAddress1 = customer.address1; | ||||||
|  |         req.session.customerAddress2 = customer.address2; | ||||||
|  |         req.session.customerCountry = customer.country; | ||||||
|  |         req.session.customerState = customer.state; | ||||||
|  |         req.session.customerPostcode = customer.postcode; | ||||||
|  |         req.session.customerPhone = customer.phone; | ||||||
|  | 
 | ||||||
|         res.status(200).json({ |         res.status(200).json({ | ||||||
|             message: 'Successfully logged in', |             message: 'Successfully logged in', | ||||||
|             customer: customer |             customer: customer | ||||||
|  | @ -379,7 +438,7 @@ router.post('/customer/reset/:token', async (req, res) => { | ||||||
|         common.sendEmail(mailOpts.to, mailOpts.subject, mailOpts.body); |         common.sendEmail(mailOpts.to, mailOpts.subject, mailOpts.body); | ||||||
|         req.session.message = 'Password successfully updated'; |         req.session.message = 'Password successfully updated'; | ||||||
|         req.session.message_type = 'success'; |         req.session.message_type = 'success'; | ||||||
|         return res.redirect('/pay'); |         return res.redirect('/checkout/payment'); | ||||||
|     }catch(ex){ |     }catch(ex){ | ||||||
|         console.log('Unable to reset password', ex); |         console.log('Unable to reset password', ex); | ||||||
|         req.session.message = 'Unable to reset password'; |         req.session.message = 'Unable to reset password'; | ||||||
|  | @ -390,7 +449,19 @@ router.post('/customer/reset/:token', async (req, res) => { | ||||||
| 
 | 
 | ||||||
| // logout the customer
 | // logout the customer
 | ||||||
| router.post('/customer/logout', (req, res) => { | router.post('/customer/logout', (req, res) => { | ||||||
|     req.session.customer = null; |     // Clear our session
 | ||||||
|  |     req.session.customerPresent = null; | ||||||
|  |     req.session.customerEmail = null; | ||||||
|  |     req.session.customerFirstname = null; | ||||||
|  |     req.session.customerLastname = null; | ||||||
|  |     req.session.customerAddress1 = null; | ||||||
|  |     req.session.customerAddress2 = null; | ||||||
|  |     req.session.customerCountry = null; | ||||||
|  |     req.session.customerState = null; | ||||||
|  |     req.session.customerPostcode = null; | ||||||
|  |     req.session.customerPhone = null; | ||||||
|  |     req.session.orderComment = null; | ||||||
|  | 
 | ||||||
|     res.status(200).json({}); |     res.status(200).json({}); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										175
									
								
								routes/index.js
								
								
								
								
							
							
						
						
									
										175
									
								
								routes/index.js
								
								
								
								
							|  | @ -6,7 +6,6 @@ const _ = require('lodash'); | ||||||
| const { | const { | ||||||
|     getId, |     getId, | ||||||
|     hooker, |     hooker, | ||||||
|     showCartCloseBtn, |  | ||||||
|     clearSessionValue, |     clearSessionValue, | ||||||
|     sortMenu, |     sortMenu, | ||||||
|     getMenu, |     getMenu, | ||||||
|  | @ -61,7 +60,6 @@ router.get('/payment/:orderId', async (req, res, next) => { | ||||||
|         title: 'Payment complete', |         title: 'Payment complete', | ||||||
|         config: req.app.config, |         config: req.app.config, | ||||||
|         session: req.session, |         session: req.session, | ||||||
|         pageCloseBtn: showCartCloseBtn('payment'), |  | ||||||
|         result: order, |         result: order, | ||||||
|         message: clearSessionValue(req.session, 'message'), |         message: clearSessionValue(req.session, 'message'), | ||||||
|         messageType: clearSessionValue(req.session, 'messageType'), |         messageType: clearSessionValue(req.session, 'messageType'), | ||||||
|  | @ -75,7 +73,32 @@ router.get('/emptycart', async (req, res, next) => { | ||||||
|     emptyCart(req, res, ''); |     emptyCart(req, res, ''); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| router.get('/checkout', async (req, res, next) => { | // router.get('/checkout', async (req, res, next) => {
 | ||||||
|  | //     const config = req.app.config;
 | ||||||
|  | 
 | ||||||
|  | //     // if there is no items in the cart then render a failure
 | ||||||
|  | //     if(!req.session.cart){
 | ||||||
|  | //         req.session.message = 'The are no items in your cart. Please add some items before checking out';
 | ||||||
|  | //         req.session.messageType = 'danger';
 | ||||||
|  | //         res.redirect('/');
 | ||||||
|  | //         return;
 | ||||||
|  | //     }
 | ||||||
|  | 
 | ||||||
|  | //     // render the checkout
 | ||||||
|  | //     res.render(`${config.themeViews}checkout`, {
 | ||||||
|  | //         title: 'Checkout',
 | ||||||
|  | //         config: req.app.config,
 | ||||||
|  | //         session: req.session,
 | ||||||
|  | //         checkout: 'hidden',
 | ||||||
|  | //         page: 'checkout',
 | ||||||
|  | //         message: clearSessionValue(req.session, 'message'),
 | ||||||
|  | //         messageType: clearSessionValue(req.session, 'messageType'),
 | ||||||
|  | //         helpers: req.handlebars.helpers,
 | ||||||
|  | //         showFooter: 'showFooter'
 | ||||||
|  | //     });
 | ||||||
|  | // });
 | ||||||
|  | 
 | ||||||
|  | router.get('/checkout/information', async (req, res, next) => { | ||||||
|     const config = req.app.config; |     const config = req.app.config; | ||||||
| 
 | 
 | ||||||
|     // if there is no items in the cart then render a failure
 |     // if there is no items in the cart then render a failure
 | ||||||
|  | @ -86,47 +109,20 @@ router.get('/checkout', async (req, res, next) => { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // render the checkout
 |  | ||||||
|     res.render(`${config.themeViews}checkout`, { |  | ||||||
|         title: 'Checkout', |  | ||||||
|         config: req.app.config, |  | ||||||
|         session: req.session, |  | ||||||
|         pageCloseBtn: showCartCloseBtn('checkout'), |  | ||||||
|         checkout: 'hidden', |  | ||||||
|         page: 'checkout', |  | ||||||
|         message: clearSessionValue(req.session, 'message'), |  | ||||||
|         messageType: clearSessionValue(req.session, 'messageType'), |  | ||||||
|         helpers: req.handlebars.helpers, |  | ||||||
|         showFooter: 'showFooter' |  | ||||||
|     }); |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| router.get('/pay', async (req, res, next) => { |  | ||||||
|     const config = req.app.config; |  | ||||||
| 
 |  | ||||||
|     // if there is no items in the cart then render a failure
 |  | ||||||
|     if(!req.session.cart){ |  | ||||||
|         req.session.message = 'The are no items in your cart. Please add some items before checking out'; |  | ||||||
|         req.session.messageType = 'danger'; |  | ||||||
|         res.redirect('/checkout'); |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     let paymentType = ''; |     let paymentType = ''; | ||||||
|     if(req.session.cartSubscription){ |     if(req.session.cartSubscription){ | ||||||
|         paymentType = '_subscription'; |         paymentType = '_subscription'; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // render the payment page
 |     // render the payment page
 | ||||||
|     res.render(`${config.themeViews}pay`, { |     res.render(`${config.themeViews}checkout-information`, { | ||||||
|         title: 'Pay', |         title: 'Checkout', | ||||||
|         config: req.app.config, |         config: req.app.config, | ||||||
|         paymentConfig: getPaymentConfig(), |  | ||||||
|         pageCloseBtn: showCartCloseBtn('pay'), |  | ||||||
|         session: req.session, |         session: req.session, | ||||||
|         paymentPage: true, |  | ||||||
|         paymentType, |         paymentType, | ||||||
|         page: 'pay', |         cartSize: 'part', | ||||||
|  |         cartClose: false, | ||||||
|  |         page: 'checkout-information', | ||||||
|         countryList, |         countryList, | ||||||
|         message: clearSessionValue(req.session, 'message'), |         message: clearSessionValue(req.session, 'message'), | ||||||
|         messageType: clearSessionValue(req.session, 'messageType'), |         messageType: clearSessionValue(req.session, 'messageType'), | ||||||
|  | @ -135,16 +131,86 @@ router.get('/pay', async (req, res, next) => { | ||||||
|     }); |     }); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| router.get('/cartPartial', (req, res) => { | router.get('/checkout/shipping', async (req, res, next) => { | ||||||
|     const config = req.app.config; |     const config = req.app.config; | ||||||
| 
 | 
 | ||||||
|     res.render(`${config.themeViews}cart`, { |     // if there is no items in the cart then render a failure
 | ||||||
|         pageCloseBtn: showCartCloseBtn(req.query.path), |     if(!req.session.cart){ | ||||||
|         page: req.query.path, |         req.session.message = 'The are no items in your cart. Please add some items before checking out'; | ||||||
|         layout: false, |         req.session.messageType = 'danger'; | ||||||
|         helpers: req.handlebars.helpers, |         res.redirect('/'); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if(!req.session.customerEmail){ | ||||||
|  |         req.session.message = 'Cannot proceed to shipping without customer information'; | ||||||
|  |         req.session.messageType = 'danger'; | ||||||
|  |         res.redirect('/checkout/information'); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // render the payment page
 | ||||||
|  |     res.render(`${config.themeViews}checkout-shipping`, { | ||||||
|  |         title: 'Checkout', | ||||||
|         config: req.app.config, |         config: req.app.config, | ||||||
|         session: req.session |         session: req.session, | ||||||
|  |         cartSize: 'part', | ||||||
|  |         cartClose: false, | ||||||
|  |         page: 'checkout-shipping', | ||||||
|  |         countryList, | ||||||
|  |         message: clearSessionValue(req.session, 'message'), | ||||||
|  |         messageType: clearSessionValue(req.session, 'messageType'), | ||||||
|  |         helpers: req.handlebars.helpers, | ||||||
|  |         showFooter: 'showFooter' | ||||||
|  |     }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | router.get('/checkout/cart', (req, res) => { | ||||||
|  |     const config = req.app.config; | ||||||
|  | 
 | ||||||
|  |     res.render(`${config.themeViews}checkout-cart`, { | ||||||
|  |         page: req.query.path, | ||||||
|  |         cartSize: 'full', | ||||||
|  |         config: req.app.config, | ||||||
|  |         session: req.session, | ||||||
|  |         message: clearSessionValue(req.session, 'message'), | ||||||
|  |         messageType: clearSessionValue(req.session, 'messageType'), | ||||||
|  |         helpers: req.handlebars.helpers, | ||||||
|  |         showFooter: 'showFooter' | ||||||
|  |     }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | router.get('/checkout/payment', (req, res) => { | ||||||
|  |     const config = req.app.config; | ||||||
|  | 
 | ||||||
|  |     // if there is no items in the cart then render a failure
 | ||||||
|  |     if(!req.session.cart){ | ||||||
|  |         req.session.message = 'The are no items in your cart. Please add some items before checking out'; | ||||||
|  |         req.session.messageType = 'danger'; | ||||||
|  |         res.redirect('/'); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     let paymentType = ''; | ||||||
|  |     if(req.session.cartSubscription){ | ||||||
|  |         paymentType = '_subscription'; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     res.render(`${config.themeViews}checkout-payment`, { | ||||||
|  |         title: 'Checkout', | ||||||
|  |         config: req.app.config, | ||||||
|  |         paymentConfig: getPaymentConfig(), | ||||||
|  |         session: req.session, | ||||||
|  |         paymentPage: true, | ||||||
|  |         paymentType, | ||||||
|  |         cartSize: 'part', | ||||||
|  |         cartClose: true, | ||||||
|  |         page: 'checkout-information', | ||||||
|  |         countryList, | ||||||
|  |         message: clearSessionValue(req.session, 'message'), | ||||||
|  |         messageType: clearSessionValue(req.session, 'messageType'), | ||||||
|  |         helpers: req.handlebars.helpers, | ||||||
|  |         showFooter: 'showFooter' | ||||||
|     }); |     }); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
|  | @ -180,7 +246,6 @@ router.get('/product/:id', async (req, res) => { | ||||||
|         images: images, |         images: images, | ||||||
|         productDescription: product.productDescription, |         productDescription: product.productDescription, | ||||||
|         metaDescription: config.cartTitle + ' - ' + product.productTitle, |         metaDescription: config.cartTitle + ' - ' + product.productTitle, | ||||||
|         pageCloseBtn: showCartCloseBtn('product'), |  | ||||||
|         config: config, |         config: config, | ||||||
|         session: req.session, |         session: req.session, | ||||||
|         pageUrl: config.baseUrl + req.originalUrl, |         pageUrl: config.baseUrl + req.originalUrl, | ||||||
|  | @ -210,6 +275,12 @@ router.post('/product/updatecart', (req, res, next) => { | ||||||
|     let hasError = false; |     let hasError = false; | ||||||
|     let stockError = false; |     let stockError = false; | ||||||
| 
 | 
 | ||||||
|  |     // Check cart exists
 | ||||||
|  |     if(!req.session.cart){ | ||||||
|  |         emptyCart(req, res, 'json', 'There are no items if your cart or your cart is expired'); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     async.eachSeries(cartItems, async (cartItem, callback) => { |     async.eachSeries(cartItems, async (cartItem, callback) => { | ||||||
|         // Find index in cart
 |         // Find index in cart
 | ||||||
|         const cartIndex = _.findIndex(req.session.cart, { productId: cartItem.productId }); |         const cartIndex = _.findIndex(req.session.cart, { productId: cartItem.productId }); | ||||||
|  | @ -308,11 +379,12 @@ router.post('/product/emptycart', async (req, res, next) => { | ||||||
|     emptyCart(req, res, 'json'); |     emptyCart(req, res, 'json'); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| const emptyCart = async (req, res, type) => { | const emptyCart = async (req, res, type, customMessage) => { | ||||||
|     const db = req.app.db; |     const db = req.app.db; | ||||||
| 
 | 
 | ||||||
|     // Remove from session
 |     // Remove from session
 | ||||||
|     delete req.session.cart; |     delete req.session.cart; | ||||||
|  |     delete req.session.shippingAmount; | ||||||
|     delete req.session.orderId; |     delete req.session.orderId; | ||||||
| 
 | 
 | ||||||
|     // Remove cart from DB
 |     // Remove cart from DB
 | ||||||
|  | @ -324,13 +396,19 @@ const emptyCart = async (req, res, type) => { | ||||||
|     // Update checking cart for subscription
 |     // Update checking cart for subscription
 | ||||||
|     updateSubscriptionCheck(req, res); |     updateSubscriptionCheck(req, res); | ||||||
| 
 | 
 | ||||||
|  |     // Set returned message
 | ||||||
|  |     let message = 'Cart successfully emptied'; | ||||||
|  |     if(customMessage){ | ||||||
|  |         message = customMessage; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     // If POST, return JSON else redirect nome
 |     // If POST, return JSON else redirect nome
 | ||||||
|     if(type === 'json'){ |     if(type === 'json'){ | ||||||
|         res.status(200).json({ message: 'Cart successfully emptied', totalCartItems: 0 }); |         res.status(200).json({ message: message, totalCartItems: 0 }); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     req.session.message = 'Cart successfully emptied.'; |     req.session.message = message; | ||||||
|     req.session.messageType = 'success'; |     req.session.messageType = 'success'; | ||||||
|     res.redirect('/'); |     res.redirect('/'); | ||||||
| }; | }; | ||||||
|  | @ -513,7 +591,6 @@ router.get('/search/:searchTerm/:pageNum?', (req, res) => { | ||||||
|                 session: req.session, |                 session: req.session, | ||||||
|                 metaDescription: req.app.config.cartTitle + ' - Search term: ' + searchTerm, |                 metaDescription: req.app.config.cartTitle + ' - Search term: ' + searchTerm, | ||||||
|                 searchTerm: searchTerm, |                 searchTerm: searchTerm, | ||||||
|                 pageCloseBtn: showCartCloseBtn('search'), |  | ||||||
|                 message: clearSessionValue(req.session, 'message'), |                 message: clearSessionValue(req.session, 'message'), | ||||||
|                 messageType: clearSessionValue(req.session, 'messageType'), |                 messageType: clearSessionValue(req.session, 'messageType'), | ||||||
|                 productsPerPage: numberProducts, |                 productsPerPage: numberProducts, | ||||||
|  | @ -569,7 +646,6 @@ router.get('/category/:cat/:pageNum?', (req, res) => { | ||||||
|                 session: req.session, |                 session: req.session, | ||||||
|                 searchTerm: searchTerm, |                 searchTerm: searchTerm, | ||||||
|                 metaDescription: `${req.app.config.cartTitle} - Category: ${searchTerm}`, |                 metaDescription: `${req.app.config.cartTitle} - Category: ${searchTerm}`, | ||||||
|                 pageCloseBtn: showCartCloseBtn('category'), |  | ||||||
|                 message: clearSessionValue(req.session, 'message'), |                 message: clearSessionValue(req.session, 'message'), | ||||||
|                 messageType: clearSessionValue(req.session, 'messageType'), |                 messageType: clearSessionValue(req.session, 'messageType'), | ||||||
|                 productsPerPage: numberProducts, |                 productsPerPage: numberProducts, | ||||||
|  | @ -650,7 +726,6 @@ router.get('/page/:pageNum', (req, res, next) => { | ||||||
|                 message: clearSessionValue(req.session, 'message'), |                 message: clearSessionValue(req.session, 'message'), | ||||||
|                 messageType: clearSessionValue(req.session, 'messageType'), |                 messageType: clearSessionValue(req.session, 'messageType'), | ||||||
|                 metaDescription: req.app.config.cartTitle + ' - Products page: ' + req.params.pageNum, |                 metaDescription: req.app.config.cartTitle + ' - Products page: ' + req.params.pageNum, | ||||||
|                 pageCloseBtn: showCartCloseBtn('page'), |  | ||||||
|                 config: req.app.config, |                 config: req.app.config, | ||||||
|                 productsPerPage: numberProducts, |                 productsPerPage: numberProducts, | ||||||
|                 totalProductCount: results.totalProducts, |                 totalProductCount: results.totalProducts, | ||||||
|  | @ -692,7 +767,6 @@ router.get('/:page?', async (req, res, next) => { | ||||||
|                     session: req.session, |                     session: req.session, | ||||||
|                     message: clearSessionValue(req.session, 'message'), |                     message: clearSessionValue(req.session, 'message'), | ||||||
|                     messageType: clearSessionValue(req.session, 'messageType'), |                     messageType: clearSessionValue(req.session, 'messageType'), | ||||||
|                     pageCloseBtn: showCartCloseBtn('page'), |  | ||||||
|                     config, |                     config, | ||||||
|                     productsPerPage: numberProducts, |                     productsPerPage: numberProducts, | ||||||
|                     totalProductCount: results.totalProducts, |                     totalProductCount: results.totalProducts, | ||||||
|  | @ -722,7 +796,6 @@ router.get('/:page?', async (req, res, next) => { | ||||||
|                 session: req.session, |                 session: req.session, | ||||||
|                 message: clearSessionValue(req.session, 'message'), |                 message: clearSessionValue(req.session, 'message'), | ||||||
|                 messageType: clearSessionValue(req.session, 'messageType'), |                 messageType: clearSessionValue(req.session, 'messageType'), | ||||||
|                 pageCloseBtn: showCartCloseBtn('page'), |  | ||||||
|                 config: req.app.config, |                 config: req.app.config, | ||||||
|                 metaDescription: req.app.config.cartTitle + ' - ' + page, |                 metaDescription: req.app.config.cartTitle + ' - ' + page, | ||||||
|                 helpers: req.handlebars.helpers, |                 helpers: req.handlebars.helpers, | ||||||
|  |  | ||||||
|  | @ -77,16 +77,16 @@ router.post('/checkout_action', async (req, res, next) => { | ||||||
|         orderPaymentGateway: 'Adyen', |         orderPaymentGateway: 'Adyen', | ||||||
|         orderPaymentMessage: response.refusalReason, |         orderPaymentMessage: response.refusalReason, | ||||||
|         orderTotal: req.session.totalCartAmount, |         orderTotal: req.session.totalCartAmount, | ||||||
|         orderEmail: req.body.shipEmail, |         orderEmail: req.session.customerEmail, | ||||||
|         orderFirstname: req.body.shipFirstname, |         orderFirstname: req.session.customerFirstname, | ||||||
|         orderLastname: req.body.shipLastname, |         orderLastname: req.session.customerLastname, | ||||||
|         orderAddr1: req.body.shipAddr1, |         orderAddr1: req.session.customerAddress1, | ||||||
|         orderAddr2: req.body.shipAddr2, |         orderAddr2: req.session.customerAddress2, | ||||||
|         orderCountry: req.body.shipCountry, |         orderCountry: req.session.customerCountry, | ||||||
|         orderState: req.body.shipState, |         orderState: req.session.customerState, | ||||||
|         orderPostcode: req.body.shipPostcode, |         orderPostcode: req.session.customerPostcode, | ||||||
|         orderPhoneNumber: req.body.shipPhoneNumber, |         orderPhoneNumber: req.session.customerPhone, | ||||||
|         orderComment: req.body.orderComment, |         orderComment: req.session.orderComment, | ||||||
|         orderStatus: paymentStatus, |         orderStatus: paymentStatus, | ||||||
|         orderDate: new Date(), |         orderDate: new Date(), | ||||||
|         orderProducts: req.session.cart, |         orderProducts: req.session.cart, | ||||||
|  |  | ||||||
|  | @ -60,16 +60,16 @@ router.post('/checkout_action', (req, res, next) => { | ||||||
|             orderPaymentGateway: 'AuthorizeNet', |             orderPaymentGateway: 'AuthorizeNet', | ||||||
|             orderPaymentMessage: 'Your payment was successfully completed', |             orderPaymentMessage: 'Your payment was successfully completed', | ||||||
|             orderTotal: req.session.totalCartAmount, |             orderTotal: req.session.totalCartAmount, | ||||||
|             orderEmail: req.body.shipEmail, |             orderEmail: req.session.customerEmail, | ||||||
|             orderFirstname: req.body.shipFirstname, |             orderFirstname: req.session.customerFirstname, | ||||||
|             orderLastname: req.body.shipLastname, |             orderLastname: req.session.customerLastname, | ||||||
|             orderAddr1: req.body.shipAddr1, |             orderAddr1: req.session.customerAddress1, | ||||||
|             orderAddr2: req.body.shipAddr2, |             orderAddr2: req.session.customerAddress2, | ||||||
|             orderCountry: req.body.shipCountry, |             orderCountry: req.session.customerCountry, | ||||||
|             orderState: req.body.shipState, |             orderState: req.session.customerState, | ||||||
|             orderPostcode: req.body.shipPostcode, |             orderPostcode: req.session.customerPostcode, | ||||||
|             orderPhoneNumber: req.body.shipPhoneNumber, |             orderPhoneNumber: req.session.customerPhone, | ||||||
|             orderComment: req.body.orderComment, |             orderComment: req.session.orderComment, | ||||||
|             orderStatus: orderStatus, |             orderStatus: orderStatus, | ||||||
|             orderDate: new Date(), |             orderDate: new Date(), | ||||||
|             orderProducts: req.session.cart |             orderProducts: req.session.cart | ||||||
|  |  | ||||||
|  | @ -138,7 +138,7 @@ router.post('/checkout_action', (req, res, next) => { | ||||||
|         if(error){ |         if(error){ | ||||||
|             req.session.message = 'There was an error processing your payment. You have not been changed and can try again.'; |             req.session.message = 'There was an error processing your payment. You have not been changed and can try again.'; | ||||||
|             req.session.messageType = 'danger'; |             req.session.messageType = 'danger'; | ||||||
|             res.redirect('/pay'); |             res.redirect('/checkout/payment'); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         if(payment.payer.payment_method === 'paypal'){ |         if(payment.payer.payment_method === 'paypal'){ | ||||||
|  | @ -164,16 +164,16 @@ router.post('/checkout_action', (req, res, next) => { | ||||||
|                 orderPaymentId: payment.id, |                 orderPaymentId: payment.id, | ||||||
|                 orderPaymentGateway: 'Paypal', |                 orderPaymentGateway: 'Paypal', | ||||||
|                 orderTotal: req.session.totalCartAmount, |                 orderTotal: req.session.totalCartAmount, | ||||||
|                 orderEmail: req.body.shipEmail, |                 orderEmail: req.session.customerEmail, | ||||||
|                 orderFirstname: req.body.shipFirstname, |                 orderFirstname: req.session.customerFirstname, | ||||||
|                 orderLastname: req.body.shipLastname, |                 orderLastname: req.session.customerLastname, | ||||||
|                 orderAddr1: req.body.shipAddr1, |                 orderAddr1: req.session.customerAddress1, | ||||||
|                 orderAddr2: req.body.shipAddr2, |                 orderAddr2: req.session.customerAddress2, | ||||||
|                 orderCountry: req.body.shipCountry, |                 orderCountry: req.session.customerCountry, | ||||||
|                 orderState: req.body.shipState, |                 orderState: req.session.customerState, | ||||||
|                 orderPostcode: req.body.shipPostcode, |                 orderPostcode: req.session.customerPostcode, | ||||||
|                 orderPhoneNumber: req.body.shipPhoneNumber, |                 orderPhoneNumber: req.session.customerPhone, | ||||||
|                 orderComment: req.body.orderComment, |                 orderComment: req.session.orderComment, | ||||||
|                 orderStatus: payment.state, |                 orderStatus: payment.state, | ||||||
|                 orderDate: new Date(), |                 orderDate: new Date(), | ||||||
|                 orderProducts: req.session.cart |                 orderProducts: req.session.cart | ||||||
|  |  | ||||||
|  | @ -18,13 +18,13 @@ router.post('/checkout_action', (req, res, next) => { | ||||||
|         source: req.body.stripeToken, |         source: req.body.stripeToken, | ||||||
|         description: stripeConfig.stripeDescription, |         description: stripeConfig.stripeDescription, | ||||||
|         shipping: { |         shipping: { | ||||||
|             name: `${req.body.shipFirstname} ${req.body.shipLastname}`, |             name: `${req.session.customerFirstname} ${req.session.customerFirstname}`, | ||||||
|             address: { |             address: { | ||||||
|                 line1: req.body.shipAddr1, |                 line1: req.session.customerAddress1, | ||||||
|                 line2: req.body.shipAddr2, |                 line2: req.session.customerAddress2, | ||||||
|                 postal_code: req.body.shipPostcode, |                 postal_code: req.session.customerPostcode, | ||||||
|                 state: req.body.shipState, |                 state: req.session.customerState, | ||||||
|                 country: req.body.shipCountry |                 country: req.session.customerCountry | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
|  | @ -37,7 +37,7 @@ router.post('/checkout_action', (req, res, next) => { | ||||||
|             req.session.message = 'Your payment has declined. Please try again'; |             req.session.message = 'Your payment has declined. Please try again'; | ||||||
|             req.session.paymentApproved = false; |             req.session.paymentApproved = false; | ||||||
|             req.session.paymentDetails = ''; |             req.session.paymentDetails = ''; | ||||||
|             res.redirect('/pay'); |             res.redirect('/checkout/payment'); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | @ -53,16 +53,16 @@ router.post('/checkout_action', (req, res, next) => { | ||||||
|             orderPaymentGateway: 'Stripe', |             orderPaymentGateway: 'Stripe', | ||||||
|             orderPaymentMessage: charge.outcome.seller_message, |             orderPaymentMessage: charge.outcome.seller_message, | ||||||
|             orderTotal: req.session.totalCartAmount, |             orderTotal: req.session.totalCartAmount, | ||||||
|             orderEmail: req.body.shipEmail, |             orderEmail: req.session.customerEmail, | ||||||
|             orderFirstname: req.body.shipFirstname, |             orderFirstname: req.session.customerFirstname, | ||||||
|             orderLastname: req.body.shipLastname, |             orderLastname: req.session.customerLastname, | ||||||
|             orderAddr1: req.body.shipAddr1, |             orderAddr1: req.session.customerAddress1, | ||||||
|             orderAddr2: req.body.shipAddr2, |             orderAddr2: req.session.customerAddress2, | ||||||
|             orderCountry: req.body.shipCountry, |             orderCountry: req.session.customerCountry, | ||||||
|             orderState: req.body.shipState, |             orderState: req.session.customerState, | ||||||
|             orderPostcode: req.body.shipPostcode, |             orderPostcode: req.session.customerPostcode, | ||||||
|             orderPhoneNumber: req.body.shipPhoneNumber, |             orderPhoneNumber: req.session.customerPhone, | ||||||
|             orderComment: req.body.orderComment, |             orderComment: req.session.orderComment, | ||||||
|             orderStatus: paymentStatus, |             orderStatus: paymentStatus, | ||||||
|             orderDate: new Date(), |             orderDate: new Date(), | ||||||
|             orderProducts: req.session.cart, |             orderProducts: req.session.cart, | ||||||
|  | @ -183,13 +183,13 @@ router.post('/checkout_action_subscription', async (req, res, next) => { | ||||||
|         if(!plan){ |         if(!plan){ | ||||||
|             req.session.messageType = 'danger'; |             req.session.messageType = 'danger'; | ||||||
|             req.session.message = 'The plan connected to this product doesn\'t exist'; |             req.session.message = 'The plan connected to this product doesn\'t exist'; | ||||||
|             res.redirect('/pay/'); |             res.redirect('/checkout/payment'); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|     }catch(ex){ |     }catch(ex){ | ||||||
|         req.session.messageType = 'danger'; |         req.session.messageType = 'danger'; | ||||||
|         req.session.message = 'The plan connected to this product doesn\'t exist'; |         req.session.message = 'The plan connected to this product doesn\'t exist'; | ||||||
|         res.redirect('/pay/'); |         res.redirect('/checkout/payment'); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -207,7 +207,7 @@ router.post('/checkout_action_subscription', async (req, res, next) => { | ||||||
|         req.session.message = 'Your subscripton has declined. Please try again'; |         req.session.message = 'Your subscripton has declined. Please try again'; | ||||||
|         req.session.paymentApproved = false; |         req.session.paymentApproved = false; | ||||||
|         req.session.paymentDetails = ''; |         req.session.paymentDetails = ''; | ||||||
|         res.redirect('/pay'); |         res.redirect('/checkout/payment'); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -217,7 +217,7 @@ router.post('/checkout_action_subscription', async (req, res, next) => { | ||||||
|         req.session.message = 'Your subscripton has declined. Please try again'; |         req.session.message = 'Your subscripton has declined. Please try again'; | ||||||
|         req.session.paymentApproved = false; |         req.session.paymentApproved = false; | ||||||
|         req.session.paymentDetails = ''; |         req.session.paymentDetails = ''; | ||||||
|         res.redirect('/pay'); |         res.redirect('/checkout/payment'); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -229,16 +229,16 @@ router.post('/checkout_action_subscription', async (req, res, next) => { | ||||||
|         orderPaymentGateway: 'Stripe', |         orderPaymentGateway: 'Stripe', | ||||||
|         orderPaymentMessage: subscription.collection_method, |         orderPaymentMessage: subscription.collection_method, | ||||||
|         orderTotal: req.session.totalCartAmount, |         orderTotal: req.session.totalCartAmount, | ||||||
|         orderEmail: req.body.shipEmail, |         orderEmail: req.session.customerEmail, | ||||||
|         orderFirstname: req.body.shipFirstname, |         orderFirstname: req.session.customerFirstname, | ||||||
|         orderLastname: req.body.shipLastname, |         orderLastname: req.session.customerLastname, | ||||||
|         orderAddr1: req.body.shipAddr1, |         orderAddr1: req.session.customerAddress1, | ||||||
|         orderAddr2: req.body.shipAddr2, |         orderAddr2: req.session.customerAddress2, | ||||||
|         orderCountry: req.body.shipCountry, |         orderCountry: req.session.customerCountry, | ||||||
|         orderState: req.body.shipState, |         orderState: req.session.customerState, | ||||||
|         orderPostcode: req.body.shipPostcode, |         orderPostcode: req.session.customerPostcode, | ||||||
|         orderPhoneNumber: req.body.shipPhoneNumber, |         orderPhoneNumber: req.session.customerPhone, | ||||||
|         orderComment: req.body.orderComment, |         orderComment: req.session.orderComment, | ||||||
|         orderStatus: 'Pending', |         orderStatus: 'Pending', | ||||||
|         orderDate: new Date(), |         orderDate: new Date(), | ||||||
|         orderProducts: req.session.cart, |         orderProducts: req.session.cart, | ||||||
|  |  | ||||||
|  | @ -121,19 +121,17 @@ | ||||||
|                         </li> |                         </li> | ||||||
|                         {{/ifCond}} |                         {{/ifCond}} | ||||||
|                         {{#unless admin}} |                         {{#unless admin}} | ||||||
|                         {{#ifCond page '!=' 'checkout'}} |  | ||||||
|                         {{#ifCond page '!=' 'pay'}} |  | ||||||
|                             {{#if @root.session.cart}} |                             {{#if @root.session.cart}} | ||||||
|                                 <li><a href="/cart" class="menu-btn"><i class="fa fa-shopping-cart" aria-hidden="true"></i> {{ @root.__ "Cart" }} <span class="badge" id="cart-count">{{@root.session.cartTotalItems}}</span></a></li> |                                 <li><a href="/checkout/cart" class="menu-btn"><i class="fa fa-shopping-cart" aria-hidden="true"></i> {{ @root.__ "Cart" }} <span class="badge" id="cart-count">{{@root.session.cartTotalItems}}</span></a></li> | ||||||
|                                 {{else}} |                                 {{else}} | ||||||
|                                 <li><a href="/cart" class="menu-btn"><i class="fa fa-shopping-cart" aria-hidden="true"></i>  {{ @root.__ "Cart" }} <span class="badge" id="cart-count">0</span></a></li> |                                 <li><a href="/checkout/cart" class="menu-btn"><i class="fa fa-shopping-cart" aria-hidden="true"></i> {{ @root.__ "Cart" }} <span class="badge" id="cart-count">0</span></a></li> | ||||||
|                             {{/if}} |                             {{/if}} | ||||||
|                         {{/ifCond}} |  | ||||||
|                         {{/ifCond}} |  | ||||||
|                         {{/unless}} |                         {{/unless}} | ||||||
|  |                         {{#if admin}} | ||||||
|                         {{#if @root.session.user}} |                         {{#if @root.session.user}} | ||||||
| 							<li><a href="/admin/logout"><i class="fa fa-sign-out" aria-hidden="true"> </i>Logout</a></li> | 							<li><a href="/admin/logout"><i class="fa fa-sign-out" aria-hidden="true"> </i>Logout</a></li> | ||||||
| 						{{/if}} | 						{{/if}} | ||||||
|  |                         {{/if}} | ||||||
| 					</ul> | 					</ul> | ||||||
| 				</div> | 				</div> | ||||||
| 	        </div> | 	        </div> | ||||||
|  | @ -142,8 +140,25 @@ | ||||||
|         {{#unless admin}} |         {{#unless admin}} | ||||||
|             {{#ifCond page '!=' 'checkout'}} |             {{#ifCond page '!=' 'checkout'}} | ||||||
|             {{#ifCond page '!=' 'pay'}} |             {{#ifCond page '!=' 'pay'}} | ||||||
|                 <div id="cart" class="col-md-12 pushy pushy-right"> |                 <div id="cart" class="col-md-12 pad-left-12 pushy pushy-right"> | ||||||
|  |                     <div class="row {{checkout}}"> | ||||||
|  |                         <div class="col-lg-12 col l12 text-right"> | ||||||
|  |                             <button class="pushy-link btn btn-primary" type="button">X</button> | ||||||
|  |                         </div> | ||||||
|  |                     </div> | ||||||
|  |                     <div class="row"> | ||||||
|  |                         <div id="cart" class="col-md-12"> | ||||||
|                         {{> (getTheme 'cart')}} |                         {{> (getTheme 'cart')}} | ||||||
|  |                         <div class="row"> | ||||||
|  |                         {{#if @root.session.cart}} | ||||||
|  |                         <div class="col-xs-12 col s12"> | ||||||
|  |                             <button class="btn btn-danger pull-left" id="empty-cart" type="button">{{ @root.__ "Empty cart" }}</button> | ||||||
|  |                             <a href="/checkout/information" class="btn btn-primary pull-right">Checkout</a> | ||||||
|  |                         </div> | ||||||
|  |                         {{/if}} | ||||||
|  |                     </div> | ||||||
|  |                         </div> | ||||||
|  |                     </div> | ||||||
|                 </div> |                 </div> | ||||||
|             {{/ifCond}} |             {{/ifCond}} | ||||||
|             {{/ifCond}} |             {{/ifCond}} | ||||||
|  |  | ||||||
|  | @ -52,7 +52,7 @@ | ||||||
|             data-clientKey="{{@root.paymentConfig.clientKey}}" |             data-clientKey="{{@root.paymentConfig.clientKey}}" | ||||||
|             data-acceptUIFormBtnTxt="Submit" |             data-acceptUIFormBtnTxt="Submit" | ||||||
|             data-acceptUIFormHeaderTxt="Card Information" |             data-acceptUIFormHeaderTxt="Card Information" | ||||||
|             data-responseHandler="responseHandler">Process payment |             data-responseHandler="responseHandler">Pay Now | ||||||
|         </button> |         </button> | ||||||
|     </form> |     </form> | ||||||
| </div> | </div> | ||||||
|  | @ -11,14 +11,14 @@ | ||||||
|             data-name="{{@root.config.cartTitle}}" |             data-name="{{@root.config.cartTitle}}" | ||||||
|             data-description="{{@root.config.cartTitle}} Payment" |             data-description="{{@root.config.cartTitle}} Payment" | ||||||
|             data-image="{{@root.paymentConfig.stripeLogoURL}}" |             data-image="{{@root.paymentConfig.stripeLogoURL}}" | ||||||
|             data-email="{{@root.session.customer.email}}" |             data-email="{{@root.session.customerEmail}}" | ||||||
|             {{#if @root.session.cartSubscription}} |             {{#if @root.session.cartSubscription}} | ||||||
|             data-subscription="{{@root.session.cartSubscription}}" |             data-subscription="{{@root.session.cartSubscription}}" | ||||||
|             {{/if}} |             {{/if}} | ||||||
|             data-locale="auto" |             data-locale="auto" | ||||||
|             data-zip-code="false" |             data-zip-code="false" | ||||||
|             data-currency="{{@root.paymentConfig.stripeCurrency}}"> |             data-currency="{{@root.paymentConfig.stripeCurrency}}"> | ||||||
|             <i class="fa fa-cc-stripe fa-lg" aria-hidden="true"></i> Process payment <i class="fa fa-cc-stripe fa-lg" aria-hidden="true"></i> |             <i class="fa fa-cc-stripe fa-lg" aria-hidden="true"></i> Pay Now <i class="fa fa-cc-stripe fa-lg" aria-hidden="true"></i> | ||||||
|         </button> |         </button> | ||||||
|         <script src="https://checkout.stripe.com/v2/checkout.js"></script> |         <script src="https://checkout.stripe.com/v2/checkout.js"></script> | ||||||
|     </form> |     </form> | ||||||
|  |  | ||||||
|  | @ -1,12 +1,4 @@ | ||||||
| <div class="row"> | 
 | ||||||
|     <div class="col-xs-12 col s12"> |  | ||||||
|         {{#if pageCloseBtn}} |  | ||||||
|         <div class="row {{checkout}}"> |  | ||||||
|             <div class="col-lg-12 col l12 text-right"> |  | ||||||
|                 <button class="pushy-link btn btn-primary" type="button">X</button> |  | ||||||
|             </div> |  | ||||||
|         </div> |  | ||||||
|         {{/if}} |  | ||||||
| <div class="panel panel-default" style="margin-top: 30px;"> | <div class="panel panel-default" style="margin-top: 30px;"> | ||||||
|     <div class="panel-heading">{{ @root.__ "Cart contents" }}</div> |     <div class="panel-heading">{{ @root.__ "Cart contents" }}</div> | ||||||
|     <div class="panel-body cart-body"> |     <div class="panel-body cart-body"> | ||||||
|  | @ -39,7 +31,7 @@ | ||||||
|                                     <span class="input-group-btn"> |                                     <span class="input-group-btn"> | ||||||
|                                         <button class="btn btn-sm btn-primary btn-qty-minus" type="button">-</button> |                                         <button class="btn btn-sm btn-primary btn-qty-minus" type="button">-</button> | ||||||
|                                     </span> |                                     </span> | ||||||
|                                             <input type="number" class="form-control cart-product-quantity input-sm text-center" data-id="{{this.productId}}" id="{{@key}}" |                                     <input type="number" class="form-control cart-product-quantity input-sm text-center" data-id="{{this.productId}}" data-index="{{@key}}" | ||||||
|                                         maxlength="2" value="{{this.quantity}}"> |                                         maxlength="2" value="{{this.quantity}}"> | ||||||
|                                     <span class="input-group-btn"> |                                     <span class="input-group-btn"> | ||||||
|                                         <button class="btn btn-sm btn-primary btn-qty-add" type="button">+</button> |                                         <button class="btn btn-sm btn-primary btn-qty-add" type="button">+</button> | ||||||
|  | @ -89,20 +81,3 @@ | ||||||
|         </div> |         </div> | ||||||
|     </div> |     </div> | ||||||
| </div> | </div> | ||||||
|         <div class="row"> |  | ||||||
|             {{#if @root.session.cart}} |  | ||||||
|             <div class="col-xs-6 col s6 text-left align-right"> |  | ||||||
|                 <button class="btn btn-danger" id="empty-cart" type="button">{{ @root.__ "Empty cart" }}</button> |  | ||||||
|             </div> |  | ||||||
|             {{#ifCond page '!=' 'pay'}} |  | ||||||
|             <div class="text-right align-right col-xs-6 col s6"> |  | ||||||
|                 {{#ifCond @root.page '==' 'checkout'}} |  | ||||||
|                 <a href="/pay" class="btn btn-default">{{ @root.__ "Pay now" }}</a> |  | ||||||
|                 {{else}} |  | ||||||
|                 <a href="/checkout" class="btn btn-default">Checkout</a> |  | ||||||
|                 {{/ifCond}} |  | ||||||
|             </div> |  | ||||||
|             {{/ifCond}} {{/if}} |  | ||||||
|         </div> |  | ||||||
|     </div> |  | ||||||
| </div> |  | ||||||
|  |  | ||||||
|  | @ -0,0 +1,15 @@ | ||||||
|  | <div class="col-xl-8 col-xl-offset-2 col-xs-12"> | ||||||
|  |     <div class="row"> | ||||||
|  |         <div id="cart" class="col-md-12"> | ||||||
|  |             {{> (getTheme 'cart')}} | ||||||
|  |             <div class="row"> | ||||||
|  |                 {{#if @root.session.cart}} | ||||||
|  |                 <div class="col-xs-12 col s12"> | ||||||
|  |                     <button class="btn btn-danger pull-left" id="empty-cart" type="button">{{ @root.__ "Empty cart" }}</button> | ||||||
|  |                     <a href="/checkout/information" class="btn btn-danger pull-right">Checkout</a> | ||||||
|  |                 </div> | ||||||
|  |                 {{/if}} | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  | </div> | ||||||
|  | @ -2,8 +2,14 @@ | ||||||
|     <nav aria-label="breadcrumb"> |     <nav aria-label="breadcrumb"> | ||||||
|         <ol class="breadcrumb"> |         <ol class="breadcrumb"> | ||||||
|             <li class="breadcrumb-item"><a href="/">Home</a></li> |             <li class="breadcrumb-item"><a href="/">Home</a></li> | ||||||
|             <li class="breadcrumb-item active" aria-current="page"><a href="/checkout">Checkout</a></li> |             <li class="breadcrumb-item active" aria-current="page"><a href="/checkout/information">Information</a></li> | ||||||
|             <li class="breadcrumb-item active" aria-current="page">{{ @root.__ "Pay now" }}</li> |             {{#if @root.session.customerPresent}} | ||||||
|  |             <li class="breadcrumb-item" aria-current="page"><a href="/checkout/shipping">Shipping</a></li> | ||||||
|  |             <li class="breadcrumb-item" aria-current="page"><a href="/checkout/payment">Payment</a></li> | ||||||
|  |             {{else}} | ||||||
|  |             <li class="breadcrumb-item text-muted" aria-current="page">Shipping</li> | ||||||
|  |             <li class="breadcrumb-item text-muted" aria-current="page">Payment</li> | ||||||
|  |             {{/if}} | ||||||
|         </ol> |         </ol> | ||||||
|     </nav> |     </nav> | ||||||
|     <div class="row"> |     <div class="row"> | ||||||
|  | @ -13,7 +19,7 @@ | ||||||
|         <div class="col-md-5"> |         <div class="col-md-5"> | ||||||
|             <div class="panel panel-default" style="margin-top: 30px;"> |             <div class="panel panel-default" style="margin-top: 30px;"> | ||||||
|                 <div class="panel-heading">{{ @root.__ "Customer details" }}</div> |                 <div class="panel-heading">{{ @root.__ "Customer details" }}</div> | ||||||
|                 {{#unless session.customer}} |                 {{#unless @root.session.customerPresent}} | ||||||
|                 <div class="panel-body customer-details-login"> |                 <div class="panel-body customer-details-login"> | ||||||
|                     <p>{{ @root.__ "Existing customer" }}</p> |                     <p>{{ @root.__ "Existing customer" }}</p> | ||||||
|                     <div class="form-group"> |                     <div class="form-group"> | ||||||
|  | @ -26,49 +32,52 @@ | ||||||
|                         <a href="/customer/forgotten" class="btn btn-default pull-left">{{ @root.__ "Forgotten" }}</a> |                         <a href="/customer/forgotten" class="btn btn-default pull-left">{{ @root.__ "Forgotten" }}</a> | ||||||
|                     </div> |                     </div> | ||||||
|                     <div class="form-group"> |                     <div class="form-group"> | ||||||
|                         <button id="customerLogin" class="btn btn-success pull-right" type="submit">Login</button> |                         <button id="customerLogin" class="btn btn-primary pull-right" type="submit">Login</button> | ||||||
|                     </div> |                     </div> | ||||||
|                 </div> |                 </div> | ||||||
|                 {{/unless}} |                 {{/unless}} | ||||||
|                 <div class="panel-body customer-details"> |                 <div class="panel-body customer-details"> | ||||||
|                     {{#if session.customer}} |                     {{#if @root.session.customerPresent}} | ||||||
|                     <div class="col-xs-12 col-md-12"> |                     <div class="col-xs-12 col-md-12"> | ||||||
|                         <button id="customerLogout" class="btn btn-sm btn-success pull-right">{{ @root.__ "Change customer" }}</button> |                         <button id="customerLogout" class="btn btn-sm btn-primary pull-right">{{ @root.__ "Change customer" }}</button> | ||||||
|                     </div> |                     </div> | ||||||
|                     {{/if}} |                     {{/if}} | ||||||
|                     <form id="shipping-form" class="shipping-form" action="/{{config.paymentGateway}}/checkout_action{{@root.paymentType}}" method="post" role="form" data-toggle="validator" novalidate="false"> |                     <form id="shipping-form" class="shipping-form" role="form" data-toggle="validator" novalidate="false"> | ||||||
|                         {{> themes/Cloth/shipping-form}} |                         {{> themes/Cloth/shipping-form}} | ||||||
|                         {{#if session.customer}} |                         {{#unless @root.session.customerPresent}} | ||||||
|                         {{#ifCond config.paymentGateway '==' 'paypal'}} |  | ||||||
|                             {{> partials/payments/paypal}} |  | ||||||
|                         {{/ifCond}} |  | ||||||
|                         {{/if}} |  | ||||||
|                         {{#unless session.customer}} |  | ||||||
|                         <div class="col-xs-12 col-md-12"> |                         <div class="col-xs-12 col-md-12"> | ||||||
|                             <p class="text-muted">{{ @root.__ "Enter a password to create an account for next time" }}</p> |                             <p class="text-muted">{{ @root.__ "Enter a password to create an account for next time" }}</p> | ||||||
|                             <div class="form-group"> |  | ||||||
|                                 <input type="password" class="form-control customerDetails" id="newCustomerPassword" name="newCustomerPassword" placeholder="Password" required> |  | ||||||
|                         </div> |                         </div> | ||||||
|                             <a id="createCustomerAccount" class="btn btn-success pull-right">{{ @root.__ "Create account" }}</a> |                         <div class="col-xs-6 col-md-6">   | ||||||
|  |                             <div class="form-group"> | ||||||
|  |                                 <input type="password" class="form-control customerDetails" id="newCustomerPassword" name="newCustomerPassword" placeholder="Password"> | ||||||
|  |                             </div> | ||||||
|  |                         </div> | ||||||
|  |                         <div class="col-xs-6 col-md-6"> | ||||||
|  |                             <div class="checkbox"> | ||||||
|  |                                 <label> | ||||||
|  |                                     <input type="checkbox" id="createAccountCheckbox"> Create an account | ||||||
|  |                                 </label> | ||||||
|  |                             </div> | ||||||
|                         </div> |                         </div> | ||||||
|                         {{/unless}} |                         {{/unless}} | ||||||
|  |                         <div class="col-xs-12 col-md-12"> | ||||||
|  |                             <a href="/checkout/cart" class="btn btn-primary pull-left">Return to cart</a> | ||||||
|  |                             <a href="/checkout/shipping" id="checkoutInformation" class="btn btn-primary pull-right">Continue to shipping</a> | ||||||
|  |                         </div> | ||||||
|                     </form> |                     </form> | ||||||
|                     {{#if session.customer}} |  | ||||||
|                     {{#ifCond config.paymentGateway '==' 'stripe'}} |  | ||||||
|                         {{> partials/payments/stripe}} |  | ||||||
|                     {{/ifCond}} |  | ||||||
|                     {{#ifCond config.paymentGateway '==' 'authorizenet'}} |  | ||||||
|                         {{> partials/payments/authorizenet}} |  | ||||||
|                     {{/ifCond}} |  | ||||||
|                     {{#ifCond config.paymentGateway '==' 'adyen'}} |  | ||||||
|                         {{> partials/payments/adyen}} |  | ||||||
|                     {{/ifCond}} |  | ||||||
|                     {{/if}} |  | ||||||
|                 </div> |                 </div> | ||||||
|             </div> |             </div> | ||||||
|         </div> |         </div> | ||||||
|         <div id="cart" class="col-md-7"> |         <div id="cart" class="col-md-7"> | ||||||
|             {{> (getTheme 'cart')}} |             {{> (getTheme 'cart')}} | ||||||
|  |             <div class="row"> | ||||||
|  |                 {{#if @root.session.cart}} | ||||||
|  |                 <div class="col-xs-12 col s12"> | ||||||
|  |                     <button class="btn btn-danger pull-right" id="empty-cart" type="button">{{ @root.__ "Empty cart" }}</button> | ||||||
|  |                 </div> | ||||||
|  |                 {{/if}} | ||||||
|  |             </div> | ||||||
|         </div> |         </div> | ||||||
|     </div> |     </div> | ||||||
| </div> | </div> | ||||||
|  | @ -0,0 +1,65 @@ | ||||||
|  | <div class="col-xl-8 col-xl-offset-2 col-xs-12"> | ||||||
|  |     <nav aria-label="breadcrumb"> | ||||||
|  |         <ol class="breadcrumb"> | ||||||
|  |             <li class="breadcrumb-item"><a href="/">Home</a></li> | ||||||
|  |             <li class="breadcrumb-item" aria-current="page"><a href="/checkout/information">Information</a></li> | ||||||
|  |             <li class="breadcrumb-item" aria-current="page"><a href="/checkout/shipping">Shipping</a></li> | ||||||
|  |             <li class="breadcrumb-item active" aria-current="page"><a href="/checkout/payment">Payment</a></li> | ||||||
|  |         </ol> | ||||||
|  |     </nav> | ||||||
|  |     <div class="row"> | ||||||
|  |         {{#if paymentMessage}} | ||||||
|  |             <p class="text-danger text-center">{{paymentMessage}}</p> | ||||||
|  |         {{/if}} | ||||||
|  |         <div class="col-md-5"> | ||||||
|  |             <div class="panel panel-default" style="margin-top: 30px;"> | ||||||
|  |                 <div class="panel-heading">{{ @root.__ "Customer details" }}</div> | ||||||
|  |                 <div class="panel-body"> | ||||||
|  |                     <ul class="list-group"> | ||||||
|  |                         <li class="list-group-item"> | ||||||
|  |                             {{@root.session.customerFirstname}} {{@root.session.customerLastname}} -  | ||||||
|  |                             {{@root.session.customerEmail}} | ||||||
|  |                             <span class="pull-right"><a href="/checkout/information">Change</a></span> | ||||||
|  |                         </li> | ||||||
|  |                     </ul> | ||||||
|  |                     <ul class="list-group"> | ||||||
|  |                         {{#if @root.session.shippingCostApplied}} | ||||||
|  |                         <li class="list-group-item"> | ||||||
|  |                             <div class="row"> | ||||||
|  |                                 <div class="col-md-6"> | ||||||
|  |                                     Standard shipping  | ||||||
|  |                                 </div> | ||||||
|  |                                 <div class="col-md-6"> | ||||||
|  |                                     <span><strong>{{currencySymbol @root.config.currencySymbol}}{{formatAmount @root.config.flatShipping}}</strong></span> | ||||||
|  |                                     <span class="pull-right"><a href="/checkout/shipping">Change</a></span> | ||||||
|  |                                 </div> | ||||||
|  |                             </div> | ||||||
|  |                         </li> | ||||||
|  |                         {{else}} | ||||||
|  |                         <li class="list-group-item">FREE shipping <span class="pull-right"><a href="/checkout/shipping">Change</a></span></li> | ||||||
|  |                         {{/if}} | ||||||
|  |                     </ul> | ||||||
|  |                     <form id="shipping-form" class="shipping-form" action="/{{config.paymentGateway}}/checkout_action{{@root.paymentType}}" method="post" role="form" data-toggle="validator" novalidate="false"> | ||||||
|  |                     {{#if session.customerPresent}} | ||||||
|  |                     {{#ifCond config.paymentGateway '==' 'paypal'}} | ||||||
|  |                         {{> partials/payments/paypal}} | ||||||
|  |                     {{/ifCond}} | ||||||
|  |                     {{#ifCond config.paymentGateway '==' 'stripe'}} | ||||||
|  |                         {{> partials/payments/stripe}} | ||||||
|  |                     {{/ifCond}} | ||||||
|  |                     {{#ifCond config.paymentGateway '==' 'authorizenet'}} | ||||||
|  |                         {{> partials/payments/authorizenet}} | ||||||
|  |                     {{/ifCond}} | ||||||
|  |                     {{#ifCond config.paymentGateway '==' 'adyen'}} | ||||||
|  |                         {{> partials/payments/adyen}} | ||||||
|  |                     {{/ifCond}} | ||||||
|  |                     {{/if}} | ||||||
|  |                     </form> | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |         <div id="cart" class="col-md-7"> | ||||||
|  |             {{> (getTheme 'cart')}} | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  | </div> | ||||||
|  | @ -0,0 +1,40 @@ | ||||||
|  | <div class="col-xl-8 col-xl-offset-2 col-xs-12"> | ||||||
|  |     <nav aria-label="breadcrumb"> | ||||||
|  |         <ol class="breadcrumb"> | ||||||
|  |             <li class="breadcrumb-item"><a href="/">Home</a></li> | ||||||
|  |             <li class="breadcrumb-item" aria-current="page"><a href="/checkout/information">Information</a></li> | ||||||
|  |             <li class="breadcrumb-item active" aria-current="page"><a href="/checkout/shipping">Shipping</a></li> | ||||||
|  |             <li class="breadcrumb-item" aria-current="page"><a href="/checkout/payment">Payment</a></li> | ||||||
|  |         </ol> | ||||||
|  |     </nav> | ||||||
|  |     <div class="row"> | ||||||
|  |         <div class="col-md-5"> | ||||||
|  |             <div class="panel panel-default" style="margin-top: 30px;"> | ||||||
|  |                 <div class="panel-heading">{{ @root.__ "Shipping options" }}</div> | ||||||
|  |                 <div class="panel-body cart-body"> | ||||||
|  |                 {{#unless @root.session.shippingOptions}} | ||||||
|  |                     <ul class="list-group"> | ||||||
|  |                         {{#if @root.session.shippingCostApplied}} | ||||||
|  |                         <li class="list-group-item">Standard shipping <span class="pull-right"><strong>{{currencySymbol @root.config.currencySymbol}}{{formatAmount @root.config.flatShipping}}</strong></span></li> | ||||||
|  |                         {{else}} | ||||||
|  |                         <li class="list-group-item">FREE shipping <span class="pull-right"></li> | ||||||
|  |                         {{/if}} | ||||||
|  |                     </ul> | ||||||
|  |                 {{/unless}} | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  |             <a href="/checkout/information" class="btn btn-primary pull-left">{{ @root.__ "Return to information" }}</a> | ||||||
|  |             <a href="/checkout/payment" class="btn btn-primary pull-right">{{ @root.__ "Proceed to payment" }}</a> | ||||||
|  |         </div> | ||||||
|  |         <div id="cart" class="col-md-7"> | ||||||
|  |             {{> (getTheme 'cart')}} | ||||||
|  |             <div class="row"> | ||||||
|  |                 {{#if @root.session.cart}} | ||||||
|  |                 <div class="col-xs-12 col s12"> | ||||||
|  |                     <button class="btn btn-danger pull-right" id="empty-cart" type="button">{{ @root.__ "Empty cart" }}</button> | ||||||
|  |                 </div> | ||||||
|  |                 {{/if}} | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  | </div> | ||||||
|  | @ -1,11 +0,0 @@ | ||||||
| <div class="col-xl-8 col-xl-offset-2 col-xs-12"> |  | ||||||
|     <nav aria-label="breadcrumb"> |  | ||||||
|         <ol class="breadcrumb"> |  | ||||||
|             <li class="breadcrumb-item"><a href="/">Home</a></li> |  | ||||||
|             <li class="breadcrumb-item active" aria-current="page">Checkout</li> |  | ||||||
|         </ol> |  | ||||||
|     </nav> |  | ||||||
|     <div id="cart"> |  | ||||||
|         {{> (getTheme 'cart')}} |  | ||||||
|     </div> |  | ||||||
| </div> |  | ||||||
|  | @ -1,26 +1,26 @@ | ||||||
| <div class="col-xs-12 col-md-12"> | <div class="col-xs-12 col-md-12"> | ||||||
|     <div class="form-group"> |     <div class="form-group"> | ||||||
|         <input type="email" class="form-control customerDetails" id="shipEmail" name="shipEmail" minlength="5" placeholder="Email address" value="{{session.customer.email}}" required> |         <input type="email" class="form-control customerDetails" id="shipEmail" name="shipEmail" minlength="5" placeholder="Email address" value="{{@root.session.customerEmail}}" required> | ||||||
|     </div> |     </div> | ||||||
| </div> | </div> | ||||||
| <div class="col-xs-12 col-md-6"> | <div class="col-xs-12 col-md-6"> | ||||||
|     <div class="form-group"> |     <div class="form-group"> | ||||||
|         <input type="text" class="form-control customerDetails" id="shipFirstname" name="shipFirstname" placeholder="First name" value="{{session.customer.firstName}}" required> |         <input type="text" class="form-control customerDetails" id="shipFirstname" name="shipFirstname" placeholder="First name" value="{{@root.session.customerFirstname}}" required> | ||||||
|     </div> |     </div> | ||||||
| </div> | </div> | ||||||
| <div class="col-xs-12 col-md-6"> | <div class="col-xs-12 col-md-6"> | ||||||
|     <div class="form-group"> |     <div class="form-group"> | ||||||
|         <input type="text" class="form-control customerDetails" id="shipLastname" name="shipLastname" placeholder="Last name" value="{{@root.session.customer.lastName}}" required> |         <input type="text" class="form-control customerDetails" id="shipLastname" name="shipLastname" placeholder="Last name" value="{{@root.session.customerLastname}}" required> | ||||||
|     </div> |     </div> | ||||||
| </div> | </div> | ||||||
| <div class="col-xs-12 col-md-12"> | <div class="col-xs-12 col-md-12"> | ||||||
|     <div class="form-group"> |     <div class="form-group"> | ||||||
|         <input type="text" class="form-control customerDetails" id="shipAddr1" name="shipAddr1" placeholder="Address 1" value="{{session.customer.address1}}" required> |         <input type="text" class="form-control customerDetails" id="shipAddr1" name="shipAddr1" placeholder="Address 1" value="{{@root.session.customerAddress1}}" required> | ||||||
|     </div> |     </div> | ||||||
| </div> | </div> | ||||||
| <div class="col-xs-12 col-md-12"> | <div class="col-xs-12 col-md-12"> | ||||||
|     <div class="form-group"> |     <div class="form-group"> | ||||||
|         <input type="text" class="form-control customerDetails" id="shipAddr2" name="shipAddr2" placeholder="Address 2 (optional)" value="{{session.customer.address2}}"> |         <input type="text" class="form-control customerDetails" id="shipAddr2" name="shipAddr2" placeholder="Address 2 (optional)" value="{{@root.session.customerAddress2}}"> | ||||||
|     </div> |     </div> | ||||||
| </div> | </div> | ||||||
| <div class="col-xs-12"> | <div class="col-xs-12"> | ||||||
|  | @ -28,28 +28,28 @@ | ||||||
|         <select class="form-control" id="shipCountry" name="shipCountry" required> |         <select class="form-control" id="shipCountry" name="shipCountry" required> | ||||||
|             <option value="" disabled selected>Select Country</option> |             <option value="" disabled selected>Select Country</option> | ||||||
|             {{#each countryList}} |             {{#each countryList}} | ||||||
|             <option {{selectState this @root.session.customer.country}} value="{{this}}">{{this}}</option> |             <option {{selectState this @root.session.customerCountry}} value="{{this}}">{{this}}</option> | ||||||
|             {{/each}} |             {{/each}} | ||||||
|         </select> |         </select> | ||||||
|     </div> |     </div> | ||||||
| </div> | </div> | ||||||
| <div class="col-xs-12 col-md-6"> | <div class="col-xs-12 col-md-6"> | ||||||
|     <div class="form-group"> |     <div class="form-group"> | ||||||
|         <input type="text" class="form-control customerDetails" id="shipState" name="shipState" placeholder="State" value="{{session.customer.state}}" required> |         <input type="text" class="form-control customerDetails" id="shipState" name="shipState" placeholder="State" value="{{@root.session.customerState}}" required> | ||||||
|     </div> |     </div> | ||||||
| </div> | </div> | ||||||
| <div class="col-xs-12 col-md-6"> | <div class="col-xs-12 col-md-6"> | ||||||
|     <div class="form-group"> |     <div class="form-group"> | ||||||
|         <input type="text" class="form-control customerDetails" id="shipPostcode" name="shipPostcode" placeholder="Post code" value="{{session.customer.postcode}}" required> |         <input type="text" class="form-control customerDetails" id="shipPostcode" name="shipPostcode" placeholder="Post code" value="{{@root.session.customerPostcode}}" required> | ||||||
|     </div> |     </div> | ||||||
| </div> | </div> | ||||||
| <div class="col-xs-12 col-md-12"> | <div class="col-xs-12 col-md-12"> | ||||||
|     <div class="form-group"> |     <div class="form-group"> | ||||||
|         <input type="number" class="form-control customerDetails" id="shipPhoneNumber" name="shipPhoneNumber" placeholder="Phone number" value="{{session.customer.phone}}" required> |         <input type="number" class="form-control customerDetails" id="shipPhoneNumber" name="shipPhoneNumber" placeholder="Phone number" value="{{@root.session.customerPhone}}" required> | ||||||
|     </div> |     </div> | ||||||
| </div> | </div> | ||||||
| <div class="col-xs-12 col-md-12"> | <div class="col-xs-12 col-md-12"> | ||||||
|     <div class="form-group"> |     <div class="form-group"> | ||||||
|         <textarea class="form-control customerDetails" placeholder="Order comment" id="orderComment" name="orderComment"></textarea> |         <textarea class="form-control customerDetails" placeholder="Order comment" id="orderComment" name="orderComment">{{@root.session.orderComment}}</textarea> | ||||||
|     </div> |     </div> | ||||||
| </div> | </div> | ||||||
		Loading…
	
		Reference in New Issue