diff --git a/public/javascripts/expressCart.js b/public/javascripts/expressCart.js index 9c737cb..f175ade 100644 --- a/public/javascripts/expressCart.js +++ b/public/javascripts/expressCart.js @@ -428,7 +428,7 @@ $(document).ready(function (){ $.ajax({ method: 'POST', - url: '/admin/product/addtocart', + url: '/product/addtocart', data: {productId: $('#productId').val(), productQuantity: $('#product_quantity').val(), productOptions: JSON.stringify(productOptions)} }) .done(function(msg){ @@ -460,7 +460,7 @@ $(document).ready(function (){ }else{ $.ajax({ method: 'POST', - url: '/admin/product/addtocart', + url: '/product/addtocart', data: {productId: $(this).attr('data-id')} }) .done(function(msg){ @@ -477,7 +477,7 @@ $(document).ready(function (){ $(document).on('click', '#empty-cart', function(e){ $.ajax({ method: 'POST', - url: '/admin/product/emptycart' + url: '/product/emptycart' }) .done(function(msg){ $('#cart-count').text(msg.totalCartItems); @@ -612,7 +612,7 @@ $(document).ready(function (){ function deleteFromCart(element){ $.ajax({ method: 'POST', - url: '/admin/product/removefromcart', + url: '/product/removefromcart', data: {cart_index: element} }) .done(function(msg){ @@ -672,7 +672,7 @@ function updateCart(){ // update cart on server $.ajax({ method: 'POST', - url: '/admin/product/updatecart', + url: '/product/updatecart', data: {items: JSON.stringify(cartItems)} }) .done(function(msg){ diff --git a/public/javascripts/expressCart.min.js b/public/javascripts/expressCart.min.js index c679684..4822d5b 100644 --- a/public/javascripts/expressCart.min.js +++ b/public/javascripts/expressCart.min.js @@ -1 +1 @@ -function deleteFromCart(t){$.ajax({method:"POST",url:"/admin/product/removefromcart",data:{cart_index:t}}).done(function(t){$("#cart-count").text(t.totalCartItems),0===t.totalCartItems?(showNotification(t.message,"success"),setTimeout(function(){window.location="/"},3700)):showNotification(t.message,"success",!0)}).fail(function(t){showNotification(t.responseJSON.message,"danger")})}function slugify(t){return $.trim(t).replace(/[^a-z0-9-æøå]/gi,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").replace(/æ/gi,"ae").replace(/ø/gi,"oe").replace(/å/gi,"a").toLowerCase()}function cartUpdate(t){0===$(t).val()?deleteFromCart($(t).attr("data-id")):""!==$(t).val()&&updateCart()}function updateCart(){var t=[];$(".cart-product-quantity").each(function(){var e={cartIndex:$(this).attr("id"),itemQuantity:$(this).val(),productId:$(this).attr("data-id")};"0"===$(this).val()?deleteFromCart($(this).attr("data-id")):t.push(e)}),$.ajax({method:"POST",url:"/admin/product/updatecart",data:{items:JSON.stringify(t)}}).done(function(t){updateCartDiv(),$("#cart-count").text(t.totalCartItems)}).fail(function(t){showNotification(t.responseJSON.message,"danger")})}function updateCartDiv(){var t=window.location.pathname.split("/").length>0?window.location.pathname.split("/")[1]:"";$.ajax({method:"GET",url:"/cartPartial",data:{path:t}}).done(function(t){$("#cart").html(t)}).fail(function(t){showNotification(t.responseJSON.message,"danger")})}function getSelectedOptions(){var t={};return $(".product-opt").each(function(){t[$(this).attr("name")]=$(this).val()}),t}function showNotification(t,e,a){a=a||!1,$("#notify_message").removeClass(),$("#notify_message").addClass("alert-"+e),$("#notify_message").html(t),$("#notify_message").slideDown(600).delay(2500).slideUp(600,function(){!0===a&&location.reload()})}function searchForm(t){$("form#"+t).submit()}$(document).ready(function(){if($(window).width()<768&&($(".menu-side").on("click",function(t){t.preventDefault(),$('.menu-side li:not(".active")').slideToggle()}),$('.menu-side li:not(".active")').hide(),$(".menu-side>.active").html(''),$(".menu-side>.active").addClass("menu-side-mobile"),0===$("#navbar ul li").length&&$("#navbar").hide(),$("#offcanvasClose").hide()),$(".shipping-form input").each(function(t){$(this).wrap("
");var e=$(this).attr("placeholder");$(this).after('")}),$(".shipping-form input").on("focus",function(){$(this).next().addClass("floatLabel"),$(this).next().removeClass("hidden")}),$(".shipping-form input").on("blur",function(){""===$(this).val()&&($(this).next().addClass("hidden"),$(this).next().removeClass("floatLabel"))}),$(".menu-btn").on("click",function(t){t.preventDefault()}),$("#sendTestEmail").on("click",function(t){t.preventDefault(),$.ajax({method:"POST",url:"/admin/testEmail"}).done(function(t){showNotification(t,"success")}).fail(function(t){showNotification(t.responseText,"danger")})}),$("#footerHtml").length){var t=window.CodeMirror.fromTextArea(document.getElementById("footerHtml"),{mode:"xml",tabMode:"indent",theme:"flatly",lineNumbers:!0,htmlMode:!0,fixedGutter:!1});t.setValue(t.getValue())}if($("#googleAnalytics").length&&window.CodeMirror.fromTextArea(document.getElementById("googleAnalytics"),{mode:"xml",tabMode:"indent",theme:"flatly",lineNumbers:!0,htmlMode:!0,fixedGutter:!1}),$("#customCss").length){var e=window.CodeMirror.fromTextArea(document.getElementById("customCss"),{mode:"text/css",tabMode:"indent",theme:"flatly",lineNumbers:!0}),a=window.cssbeautify(e.getValue(),{indent:" ",autosemicolon:!0});e.setValue(a)}if($("table").each(function(){$(this).addClass("table table-hover")}),$("#frmProductTags").tokenfield(),$(document).on("click",".dashboard_list",function(t){window.document.location=$(this).attr("href")}).hover(function(){$(this).toggleClass("hover")}),$(".product-title").dotdotdot({ellipsis:"..."}),$("input[class='published_state']").change(function(){$.ajax({method:"POST",url:"/admin/product/published_state",data:{id:this.id,state:this.checked}}).done(function(t){showNotification(t,"success")}).fail(function(t){showNotification(t.responseText,"danger")})}),$(document).on("click",".btn-qty-minus",function(t){var e=$(t.target).parent().parent().find(".cart-product-quantity");$(e).val(parseInt(e.val())-1),cartUpdate(e)}),$(document).on("click",".btn-qty-add",function(t){var e=$(t.target).parent().parent().find(".cart-product-quantity");$(e).val(parseInt(e.val())+1),cartUpdate(e)}),$(document).on("click",".orderFilterByStatus",function(t){t.preventDefault(),window.location="/admin/orders/bystatus/"+$("#orderStatusFilter").val()}),$("#pager").length){var o=$("#pageNum").val(),i=$("#productsPerPage").val(),n=$("#totalProductCount").val(),r=$("#paginateUrl").val(),s=$("#searchTerm").val();""!==s&&(s+="/");var c="/"+r+"/"+s+"{{number}}",d=Math.ceil(n/i);parseInt(n)>parseInt(i)&&$("#pager").bootpag({total:d,page:o,maxVisible:5,href:c})}if($(document).on("click","#btnPageUpdate",function(t){t.preventDefault(),$.ajax({method:"POST",url:"/admin/settings/pages/update",data:{page_id:$("#page_id").val(),pageName:$("#pageName").val(),pageSlug:$("#pageSlug").val(),pageEnabled:$("#pageEnabled").is(":checked"),pageContent:$("#pageContent").val()}}).done(function(t){showNotification(t.message,"success",!0)}).fail(function(t){showNotification(t.responseJSON.message,"danger")})}),$(document).on("click",".product_opt_remove",function(t){t.preventDefault();var e=$(this).closest("li").find(".opt-name").html();$.ajax({method:"POST",url:"/admin/settings/option/remove/",data:{productId:$("#frmProductId").val(),optName:e}}).done(function(t){showNotification(t.message,"success",!0)}).fail(function(t){showNotification(t.responseJSON.message,"danger")})}),$(document).on("click","#product_opt_add",function(t){t.preventDefault();var e=$("#product_optName").val(),a=$("#product_optLabel").val(),o=$("#product_optType").val(),i=$("#product_optOptions").val(),n={};""!==$("#productOptJson").val()&&(n=JSON.parse($("#productOptJson").val()));var r='
  • ';r+='
    ',r+='
    '+e+"
    ",r+='
    '+a+"
    ",r+='
    '+o+"
    ",r+='
    '+i+"
    ",r+='
    ',r+='',r+="
  • ",$("#product_opt_wrapper").append(r),n[e]={optName:e,optLabel:a,optType:o,optOptions:$.grep(i.split(","),function(t){return 0===t||t})},$("#productOptJson").val(JSON.stringify(n)),$("#product_optName").val(""),$("#product_optLabel").val(""),$("#product_optOptions").val("")}),$("#stripeButton").validator().on("click",function(t){(t.preventDefault(),0===$("#shipping-form").validator("validate").has(".has-error").length)&&window.StripeCheckout.configure({key:$("#stripeButton").data("key"),image:$("#stripeButton").data("image"),locale:"auto",token:function(t){$("#shipping-form").append(''),$("#shipping-form").submit()}}).open({name:$("#stripeButton").data("name"),description:$("#stripeButton").data("description"),zipCode:$("#stripeButton").data("zipCode"),amount:$("#stripeButton").data("amount"),currency:$("#stripeButton").data("currency")})}),$("#settingsForm").validator().on("submit",function(t){t.isDefaultPrevented()||(t.preventDefault(),$("#footerHtml_input").val($(".CodeMirror")[0].CodeMirror.getValue()),$("#googleAnalytics_input").val($(".CodeMirror")[1].CodeMirror.getValue()),$("#customCss_input").val($(".CodeMirror")[2].CodeMirror.getValue()),$.ajax({method:"POST",url:"/admin/settings/update",data:$("#settingsForm").serialize()}).done(function(t){showNotification(t.message,"success")}).fail(function(t){showNotification(t.responseJSON.message,"danger")}))}),$("#customerLogout").on("click",function(t){$.ajax({method:"POST",url:"/customer/logout",data:{}}).done(function(t){location.reload()})}),$("#createCustomerAccount").validator().on("click",function(t){t.preventDefault(),0===$("#shipping-form").validator("validate").has(".has-error").length&&$.ajax({method:"POST",url:"/customer/create",data:{email:$("#shipEmail").val(),firstName:$("#shipFirstname").val(),lastName:$("#shipLastname").val(),address1:$("#shipAddr1").val(),address2:$("#shipAddr2").val(),country:$("#shipCountry").val(),state:$("#shipState").val(),postcode:$("#shipPostcode").val(),phone:$("#shipPhoneNumber").val(),password:$("#newCustomerPassword").val()}}).done(function(t){location.reload()}).fail(function(t){showNotification(t.responseJSON.err,"danger")})}),$("#customerLogin").on("click",function(t){t.isDefaultPrevented()||(t.preventDefault(),$.ajax({method:"POST",url:"/customer/login_action",data:{loginEmail:$("#customerLoginEmail").val(),loginPassword:$("#customerLoginPassword").val()}}).done(function(t){var e=t.customer;$("#shipEmail").val(e.email),$("#shipFirstname").val(e.firstName),$("#shipLastname").val(e.lastName),$("#shipAddr1").val(e.address1),$("#shipAddr2").val(e.address2),$("#shipCountry").val(e.country),$("#shipState").val(e.state),$("#shipPostcode").val(e.postcode),$("#shipPhoneNumber").val(e.phone),location.reload()}).fail(function(t){showNotification(t.responseJSON.err,"danger")})),t.preventDefault()}),$(document).on("click",".image-next",function(t){var e=$(".thumbnail-image"),a=0,o=0;$(".thumbnail-image").each(function(){$("#product-title-image").attr("src")===$(this).attr("src")&&(o=a+1===e.length||a+1<0?0:a+1),a++}),$("#product-title-image").attr("src",$(e).eq(o).attr("src"))}),$(document).on("click",".image-prev",function(t){var e=$(".thumbnail-image"),a=0,o=0;$(".thumbnail-image").each(function(){$("#product-title-image").attr("src")===$(this).attr("src")&&(o=a-1===e.length||a-1<0?e.length-1:a-1),a++}),$("#product-title-image").attr("src",$(e).eq(o).attr("src"))}),$(document).on("click","#orderStatusUpdate",function(t){$.ajax({method:"POST",url:"/admin/order/statusupdate",data:{order_id:$("#order_id").val(),status:$("#orderStatus").val()}}).done(function(t){showNotification(t.message,"success",!0)}).fail(function(t){showNotification(t.responseJSON.message,"danger")})}),$(document).on("click",".product-add-to-cart",function(t){var e=getSelectedOptions();$.ajax({method:"POST",url:"/admin/product/addtocart",data:{productId:$("#productId").val(),productQuantity:$("#product_quantity").val(),productOptions:JSON.stringify(e)}}).done(function(t){$("#cart-count").text(t.totalCartItems),updateCartDiv(),showNotification(t.message,"success")}).fail(function(t){showNotification(t.responseJSON.message,"danger")})}),$(".cart-product-quantity").on("input",function(){cartUpdate()}),$(document).on("click",".pushy-link",function(t){$("body").removeClass("pushy-open-right")}),$(document).on("click",".add-to-cart",function(t){var e="/product/"+$(this).attr("data-id");$(this).attr("data-link")&&(e="/product/"+$(this).attr("data-link")),"true"===$(this).attr("data-has-options")?window.location=e:$.ajax({method:"POST",url:"/admin/product/addtocart",data:{productId:$(this).attr("data-id")}}).done(function(t){$("#cart-count").text(t.totalCartItems),updateCartDiv(),showNotification(t.message,"success")}).fail(function(t){showNotification(t.responseJSON.message,"danger")})}),$(document).on("click","#empty-cart",function(t){$.ajax({method:"POST",url:"/admin/product/emptycart"}).done(function(t){$("#cart-count").text(t.totalCartItems),updateCartDiv(),showNotification(t.message,"success",!0)})}),$(".qty-btn-minus").on("click",function(){$(this).parent().siblings("input").val(parseInt($(this).parent().siblings("input").val())-1)}),$(".qty-btn-plus").on("click",function(){$(this).parent().siblings("input").val(parseInt($(this).parent().siblings("input").val())+1)}),$(".thumbnail-image").on("click",function(){$("#product-title-image").attr("src",$(this).attr("src"))}),$(".set-as-main-image").on("click",function(){$.ajax({method:"POST",url:"/admin/product/setasmainimage",data:{product_id:$("#frmProductId").val(),productImage:$(this).attr("data-id")}}).done(function(t){showNotification(t.message,"success",!0)}).fail(function(t){showNotification(t.responseJSON.message,"danger")})}),$(".btn-delete-image").on("click",function(){$.ajax({method:"POST",url:"/admin/product/deleteimage",data:{product_id:$("#frmProductId").val(),productImage:$(this).attr("data-id")}}).done(function(t){showNotification(t.message,"success",!0)}).fail(function(t){showNotification(t.responseJSON.message,"danger")})}),$(document).on("click","#validate_permalink",function(t){""!==$("#frmProductPermalink").val()?$.ajax({method:"POST",url:"/admin/api/validate_permalink",data:{permalink:$("#frmProductPermalink").val(),docId:$("#frmProductId").val()}}).done(function(t){showNotification(t,"success")}).fail(function(t){showNotification(t.responseText,"danger")}):showNotification("Please enter a permalink to validate","danger")}),$(document).on("click","#btn_product_filter",function(t){""!==$("#product_filter").val()?window.location.href="/admin/products/filter/"+$("#product_filter").val():showNotification("Please enter a keyword to filter","danger")}),$(document).on("click","#btn_order_filter",function(t){""!==$("#order_filter").val()?window.location.href="/admin/orders/filter/"+$("#order_filter").val():showNotification("Please enter a keyword to filter","danger")}),$(document).on("click","#btn_customer_filter",function(t){""!==$("#customer_filter").val()?window.location.href="/admin/customers/filter/"+$("#customer_filter").val():showNotification("Please enter a keyword to filter","danger")}),$(document).on("click","#btn_search_reset",function(t){window.location.replace("/")}),$(document).on("click","#btn_search",function(t){t.preventDefault(),""===$("#frm_search").val().trim()?showNotification("Please enter a search value","danger"):window.location.href="/search/"+$("#frm_search").val()}),$(document).on("click","#frm_edit_product_save",function(t){""===$("#frmProductPermalink").val()&&""!==$("#frmProductTitle").val()&&$("#frmProductPermalink").val(slugify($("#frmProductTitle").val()))}),""!==$("#input_notify_message").val()){var l=$("#input_notify_message").val(),u=$("#input_notify_messageType").val();$("#input_notify_message").val(""),$("#input_notify_messageType").val(""),showNotification(l,u,!1)}}); \ No newline at end of file +function deleteFromCart(t){$.ajax({method:"POST",url:"/product/removefromcart",data:{cart_index:t}}).done(function(t){$("#cart-count").text(t.totalCartItems),0===t.totalCartItems?(showNotification(t.message,"success"),setTimeout(function(){window.location="/"},3700)):showNotification(t.message,"success",!0)}).fail(function(t){showNotification(t.responseJSON.message,"danger")})}function slugify(t){return $.trim(t).replace(/[^a-z0-9-æøå]/gi,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").replace(/æ/gi,"ae").replace(/ø/gi,"oe").replace(/å/gi,"a").toLowerCase()}function cartUpdate(t){0===$(t).val()?deleteFromCart($(t).attr("data-id")):""!==$(t).val()&&updateCart()}function updateCart(){var t=[];$(".cart-product-quantity").each(function(){var e={cartIndex:$(this).attr("id"),itemQuantity:$(this).val(),productId:$(this).attr("data-id")};"0"===$(this).val()?deleteFromCart($(this).attr("data-id")):t.push(e)}),$.ajax({method:"POST",url:"/product/updatecart",data:{items:JSON.stringify(t)}}).done(function(t){updateCartDiv(),$("#cart-count").text(t.totalCartItems)}).fail(function(t){showNotification(t.responseJSON.message,"danger")})}function updateCartDiv(){var t=window.location.pathname.split("/").length>0?window.location.pathname.split("/")[1]:"";$.ajax({method:"GET",url:"/cartPartial",data:{path:t}}).done(function(t){$("#cart").html(t)}).fail(function(t){showNotification(t.responseJSON.message,"danger")})}function getSelectedOptions(){var t={};return $(".product-opt").each(function(){t[$(this).attr("name")]=$(this).val()}),t}function showNotification(t,e,a){a=a||!1,$("#notify_message").removeClass(),$("#notify_message").addClass("alert-"+e),$("#notify_message").html(t),$("#notify_message").slideDown(600).delay(2500).slideUp(600,function(){!0===a&&location.reload()})}function searchForm(t){$("form#"+t).submit()}$(document).ready(function(){if($(window).width()<768&&($(".menu-side").on("click",function(t){t.preventDefault(),$('.menu-side li:not(".active")').slideToggle()}),$('.menu-side li:not(".active")').hide(),$(".menu-side>.active").html(''),$(".menu-side>.active").addClass("menu-side-mobile"),0===$("#navbar ul li").length&&$("#navbar").hide(),$("#offcanvasClose").hide()),$(".shipping-form input").each(function(t){$(this).wrap("
    ");var e=$(this).attr("placeholder");$(this).after('")}),$(".shipping-form input").on("focus",function(){$(this).next().addClass("floatLabel"),$(this).next().removeClass("hidden")}),$(".shipping-form input").on("blur",function(){""===$(this).val()&&($(this).next().addClass("hidden"),$(this).next().removeClass("floatLabel"))}),$(".menu-btn").on("click",function(t){t.preventDefault()}),$("#sendTestEmail").on("click",function(t){t.preventDefault(),$.ajax({method:"POST",url:"/admin/testEmail"}).done(function(t){showNotification(t,"success")}).fail(function(t){showNotification(t.responseText,"danger")})}),$("#footerHtml").length){var t=window.CodeMirror.fromTextArea(document.getElementById("footerHtml"),{mode:"xml",tabMode:"indent",theme:"flatly",lineNumbers:!0,htmlMode:!0,fixedGutter:!1});t.setValue(t.getValue())}if($("#googleAnalytics").length&&window.CodeMirror.fromTextArea(document.getElementById("googleAnalytics"),{mode:"xml",tabMode:"indent",theme:"flatly",lineNumbers:!0,htmlMode:!0,fixedGutter:!1}),$("#customCss").length){var e=window.CodeMirror.fromTextArea(document.getElementById("customCss"),{mode:"text/css",tabMode:"indent",theme:"flatly",lineNumbers:!0}),a=window.cssbeautify(e.getValue(),{indent:" ",autosemicolon:!0});e.setValue(a)}if($("table").each(function(){$(this).addClass("table table-hover")}),$("#frmProductTags").tokenfield(),$(document).on("click",".dashboard_list",function(t){window.document.location=$(this).attr("href")}).hover(function(){$(this).toggleClass("hover")}),$(".product-title").dotdotdot({ellipsis:"..."}),$("input[class='published_state']").change(function(){$.ajax({method:"POST",url:"/admin/product/published_state",data:{id:this.id,state:this.checked}}).done(function(t){showNotification(t,"success")}).fail(function(t){showNotification(t.responseText,"danger")})}),$(document).on("click",".btn-qty-minus",function(t){var e=$(t.target).parent().parent().find(".cart-product-quantity");$(e).val(parseInt(e.val())-1),cartUpdate(e)}),$(document).on("click",".btn-qty-add",function(t){var e=$(t.target).parent().parent().find(".cart-product-quantity");$(e).val(parseInt(e.val())+1),cartUpdate(e)}),$(document).on("click",".orderFilterByStatus",function(t){t.preventDefault(),window.location="/admin/orders/bystatus/"+$("#orderStatusFilter").val()}),$("#pager").length){var o=$("#pageNum").val(),i=$("#productsPerPage").val(),n=$("#totalProductCount").val(),r=$("#paginateUrl").val(),s=$("#searchTerm").val();""!==s&&(s+="/");var c="/"+r+"/"+s+"{{number}}",d=Math.ceil(n/i);parseInt(n)>parseInt(i)&&$("#pager").bootpag({total:d,page:o,maxVisible:5,href:c})}if($(document).on("click","#btnPageUpdate",function(t){t.preventDefault(),$.ajax({method:"POST",url:"/admin/settings/pages/update",data:{page_id:$("#page_id").val(),pageName:$("#pageName").val(),pageSlug:$("#pageSlug").val(),pageEnabled:$("#pageEnabled").is(":checked"),pageContent:$("#pageContent").val()}}).done(function(t){showNotification(t.message,"success",!0)}).fail(function(t){showNotification(t.responseJSON.message,"danger")})}),$(document).on("click",".product_opt_remove",function(t){t.preventDefault();var e=$(this).closest("li").find(".opt-name").html();$.ajax({method:"POST",url:"/admin/settings/option/remove/",data:{productId:$("#frmProductId").val(),optName:e}}).done(function(t){showNotification(t.message,"success",!0)}).fail(function(t){showNotification(t.responseJSON.message,"danger")})}),$(document).on("click","#product_opt_add",function(t){t.preventDefault();var e=$("#product_optName").val(),a=$("#product_optLabel").val(),o=$("#product_optType").val(),i=$("#product_optOptions").val(),n={};""!==$("#productOptJson").val()&&(n=JSON.parse($("#productOptJson").val()));var r='
  • ';r+='
    ',r+='
    '+e+"
    ",r+='
    '+a+"
    ",r+='
    '+o+"
    ",r+='
    '+i+"
    ",r+='
    ',r+='',r+="
  • ",$("#product_opt_wrapper").append(r),n[e]={optName:e,optLabel:a,optType:o,optOptions:$.grep(i.split(","),function(t){return 0===t||t})},$("#productOptJson").val(JSON.stringify(n)),$("#product_optName").val(""),$("#product_optLabel").val(""),$("#product_optOptions").val("")}),$("#stripeButton").validator().on("click",function(t){(t.preventDefault(),0===$("#shipping-form").validator("validate").has(".has-error").length)&&window.StripeCheckout.configure({key:$("#stripeButton").data("key"),image:$("#stripeButton").data("image"),locale:"auto",token:function(t){$("#shipping-form").append(''),$("#shipping-form").submit()}}).open({name:$("#stripeButton").data("name"),description:$("#stripeButton").data("description"),zipCode:$("#stripeButton").data("zipCode"),amount:$("#stripeButton").data("amount"),currency:$("#stripeButton").data("currency")})}),$("#settingsForm").validator().on("submit",function(t){t.isDefaultPrevented()||(t.preventDefault(),$("#footerHtml_input").val($(".CodeMirror")[0].CodeMirror.getValue()),$("#googleAnalytics_input").val($(".CodeMirror")[1].CodeMirror.getValue()),$("#customCss_input").val($(".CodeMirror")[2].CodeMirror.getValue()),$.ajax({method:"POST",url:"/admin/settings/update",data:$("#settingsForm").serialize()}).done(function(t){showNotification(t.message,"success")}).fail(function(t){showNotification(t.responseJSON.message,"danger")}))}),$("#customerLogout").on("click",function(t){$.ajax({method:"POST",url:"/customer/logout",data:{}}).done(function(t){location.reload()})}),$("#createCustomerAccount").validator().on("click",function(t){t.preventDefault(),0===$("#shipping-form").validator("validate").has(".has-error").length&&$.ajax({method:"POST",url:"/customer/create",data:{email:$("#shipEmail").val(),firstName:$("#shipFirstname").val(),lastName:$("#shipLastname").val(),address1:$("#shipAddr1").val(),address2:$("#shipAddr2").val(),country:$("#shipCountry").val(),state:$("#shipState").val(),postcode:$("#shipPostcode").val(),phone:$("#shipPhoneNumber").val(),password:$("#newCustomerPassword").val()}}).done(function(t){location.reload()}).fail(function(t){showNotification(t.responseJSON.err,"danger")})}),$("#customerLogin").on("click",function(t){t.isDefaultPrevented()||(t.preventDefault(),$.ajax({method:"POST",url:"/customer/login_action",data:{loginEmail:$("#customerLoginEmail").val(),loginPassword:$("#customerLoginPassword").val()}}).done(function(t){var e=t.customer;$("#shipEmail").val(e.email),$("#shipFirstname").val(e.firstName),$("#shipLastname").val(e.lastName),$("#shipAddr1").val(e.address1),$("#shipAddr2").val(e.address2),$("#shipCountry").val(e.country),$("#shipState").val(e.state),$("#shipPostcode").val(e.postcode),$("#shipPhoneNumber").val(e.phone),location.reload()}).fail(function(t){showNotification(t.responseJSON.err,"danger")})),t.preventDefault()}),$(document).on("click",".image-next",function(t){var e=$(".thumbnail-image"),a=0,o=0;$(".thumbnail-image").each(function(){$("#product-title-image").attr("src")===$(this).attr("src")&&(o=a+1===e.length||a+1<0?0:a+1),a++}),$("#product-title-image").attr("src",$(e).eq(o).attr("src"))}),$(document).on("click",".image-prev",function(t){var e=$(".thumbnail-image"),a=0,o=0;$(".thumbnail-image").each(function(){$("#product-title-image").attr("src")===$(this).attr("src")&&(o=a-1===e.length||a-1<0?e.length-1:a-1),a++}),$("#product-title-image").attr("src",$(e).eq(o).attr("src"))}),$(document).on("click","#orderStatusUpdate",function(t){$.ajax({method:"POST",url:"/admin/order/statusupdate",data:{order_id:$("#order_id").val(),status:$("#orderStatus").val()}}).done(function(t){showNotification(t.message,"success",!0)}).fail(function(t){showNotification(t.responseJSON.message,"danger")})}),$(document).on("click",".product-add-to-cart",function(t){var e=getSelectedOptions();$.ajax({method:"POST",url:"/product/addtocart",data:{productId:$("#productId").val(),productQuantity:$("#product_quantity").val(),productOptions:JSON.stringify(e)}}).done(function(t){$("#cart-count").text(t.totalCartItems),updateCartDiv(),showNotification(t.message,"success")}).fail(function(t){showNotification(t.responseJSON.message,"danger")})}),$(".cart-product-quantity").on("input",function(){cartUpdate()}),$(document).on("click",".pushy-link",function(t){$("body").removeClass("pushy-open-right")}),$(document).on("click",".add-to-cart",function(t){var e="/product/"+$(this).attr("data-id");$(this).attr("data-link")&&(e="/product/"+$(this).attr("data-link")),"true"===$(this).attr("data-has-options")?window.location=e:$.ajax({method:"POST",url:"/product/addtocart",data:{productId:$(this).attr("data-id")}}).done(function(t){$("#cart-count").text(t.totalCartItems),updateCartDiv(),showNotification(t.message,"success")}).fail(function(t){showNotification(t.responseJSON.message,"danger")})}),$(document).on("click","#empty-cart",function(t){$.ajax({method:"POST",url:"/product/emptycart"}).done(function(t){$("#cart-count").text(t.totalCartItems),updateCartDiv(),showNotification(t.message,"success",!0)})}),$(".qty-btn-minus").on("click",function(){$(this).parent().siblings("input").val(parseInt($(this).parent().siblings("input").val())-1)}),$(".qty-btn-plus").on("click",function(){$(this).parent().siblings("input").val(parseInt($(this).parent().siblings("input").val())+1)}),$(".thumbnail-image").on("click",function(){$("#product-title-image").attr("src",$(this).attr("src"))}),$(".set-as-main-image").on("click",function(){$.ajax({method:"POST",url:"/admin/product/setasmainimage",data:{product_id:$("#frmProductId").val(),productImage:$(this).attr("data-id")}}).done(function(t){showNotification(t.message,"success",!0)}).fail(function(t){showNotification(t.responseJSON.message,"danger")})}),$(".btn-delete-image").on("click",function(){$.ajax({method:"POST",url:"/admin/product/deleteimage",data:{product_id:$("#frmProductId").val(),productImage:$(this).attr("data-id")}}).done(function(t){showNotification(t.message,"success",!0)}).fail(function(t){showNotification(t.responseJSON.message,"danger")})}),$(document).on("click","#validate_permalink",function(t){""!==$("#frmProductPermalink").val()?$.ajax({method:"POST",url:"/admin/api/validate_permalink",data:{permalink:$("#frmProductPermalink").val(),docId:$("#frmProductId").val()}}).done(function(t){showNotification(t,"success")}).fail(function(t){showNotification(t.responseText,"danger")}):showNotification("Please enter a permalink to validate","danger")}),$(document).on("click","#btn_product_filter",function(t){""!==$("#product_filter").val()?window.location.href="/admin/products/filter/"+$("#product_filter").val():showNotification("Please enter a keyword to filter","danger")}),$(document).on("click","#btn_order_filter",function(t){""!==$("#order_filter").val()?window.location.href="/admin/orders/filter/"+$("#order_filter").val():showNotification("Please enter a keyword to filter","danger")}),$(document).on("click","#btn_customer_filter",function(t){""!==$("#customer_filter").val()?window.location.href="/admin/customers/filter/"+$("#customer_filter").val():showNotification("Please enter a keyword to filter","danger")}),$(document).on("click","#btn_search_reset",function(t){window.location.replace("/")}),$(document).on("click","#btn_search",function(t){t.preventDefault(),""===$("#frm_search").val().trim()?showNotification("Please enter a search value","danger"):window.location.href="/search/"+$("#frm_search").val()}),$(document).on("click","#frm_edit_product_save",function(t){""===$("#frmProductPermalink").val()&&""!==$("#frmProductTitle").val()&&$("#frmProductPermalink").val(slugify($("#frmProductTitle").val()))}),""!==$("#input_notify_message").val()){var l=$("#input_notify_message").val(),u=$("#input_notify_messageType").val();$("#input_notify_message").val(""),$("#input_notify_messageType").val(""),showNotification(l,u,!1)}}); \ No newline at end of file diff --git a/routes/admin.js b/routes/admin.js index 5871fa3..27a0cab 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -1,10 +1,8 @@ -let express = require('express'); -let common = require('./common'); -let escape = require('html-entities').AllHtmlEntities; -let async = require('async'); -let colors = require('colors'); -let _ = require('lodash'); -let router = express.Router(); +const express = require('express'); +const common = require('./common'); +const escape = require('html-entities').AllHtmlEntities; +const colors = require('colors'); +const router = express.Router(); // Admin section router.get('/', common.restrict, (req, res, next) => { @@ -171,141 +169,106 @@ router.get('/products', common.restrict, (req, res, next) => { }); }); -// Admin section -router.post('/product/addtocart', (req, res, next) => { - const db = req.app.db; - let productQuantity = req.body.productQuantity ? parseInt(req.body.productQuantity) : 1; +// logout +router.get('/logout', (req, res) => { + req.session.user = null; + req.session.message = null; + req.session.messageType = null; + res.redirect('/'); +}); - // setup cart object if it doesn't exist - if(!req.session.cart){ - req.session.cart = []; - } +// login form +router.get('/login', (req, res) => { + let db = req.app.db; - db.products.findOne({_id: common.getId(req.body.productId)}, (err, product) => { + db.users.count({}, (err, userCount) => { if(err){ - console.error(colors.red('Error adding to cart', err)); + // if there are no users set the "needsSetup" session + req.session.needsSetup = true; + res.redirect('/admin/setup'); } - - if(product){ - let productPrice = parseFloat(product.productPrice).toFixed(2); - - // doc used to test if existing in the cart with the options. If not found, we add new. - let options = {}; - if(req.body.productOptions){ - options = JSON.parse(req.body.productOptions); - } - let findDoc = { - productId: req.body.productId, - options: options - }; - - // if exists we add to the existing value - let cartIndex = _.findIndex(req.session.cart, findDoc); - if(cartIndex > -1){ - req.session.cart[cartIndex].quantity = parseInt(req.session.cart[cartIndex].quantity) + productQuantity; - req.session.cart[cartIndex].totalItemPrice = productPrice * parseInt(req.session.cart[cartIndex].quantity); - }else{ - // Doesnt exist so we add to the cart session - req.session.cartTotalItems = req.session.cartTotalItems + productQuantity; - - // new product deets - let productObj = {}; - productObj.productId = req.body.productId; - productObj.title = product.productTitle; - productObj.quantity = productQuantity; - productObj.totalItemPrice = productPrice * productQuantity; - productObj.options = options; - productObj.productImage = product.productImage; - if(product.productPermalink){ - productObj.link = product.productPermalink; - }else{ - productObj.link = product._id; - } - - // merge into the current cart - req.session.cart.push(productObj); - } - - // update total cart amount - common.updateTotalCartAmount(req, res); - - // update how many products in the shopping cart - req.session.cartTotalItems = Object.keys(req.session.cart).length; - res.status(200).json({message: 'Cart successfully updated', totalCartItems: Object.keys(req.session.cart).length}); - }else{ - res.status(400).json({message: 'Error updating cart. Please try again.'}); - } - }); -}); - -// Updates a single product quantity -router.post('/product/updatecart', (req, res, next) => { - const db = req.app.db; - let cartItems = JSON.parse(req.body.items); - let hasError = false; - - async.eachSeries(cartItems, (cartItem, callback) => { - let productQuantity = cartItem.itemQuantity ? cartItem.itemQuantity : 1; - if(cartItem.itemQuantity === 0){ - // quantity equals zero so we remove the item - req.session.cart.splice(cartItem.cartIndex, 1); - callback(null); - }else{ - db.products.findOne({_id: common.getId(cartItem.productId)}, (err, product) => { - if(err){ - console.error(colors.red('Error updating cart', err)); - } - if(product){ - let productPrice = parseFloat(product.productPrice).toFixed(2); - if(req.session.cart[cartItem.cartIndex]){ - req.session.cart[cartItem.cartIndex].quantity = productQuantity; - req.session.cart[cartItem.cartIndex].totalItemPrice = productPrice * productQuantity; - callback(null); - } - }else{ - hasError = true; - callback(null); - } + // we check for a user. If one exists, redirect to login form otherwise setup + if(userCount > 0){ + // set needsSetup to false as a user exists + req.session.needsSetup = false; + res.render('login', { + title: 'Login', + referringUrl: req.header('Referer'), + config: common.getConfig(), + message: common.clearSessionValue(req.session, 'message'), + messageType: common.clearSessionValue(req.session, 'messageType'), + helpers: req.handlebars.helpers, + showFooter: 'showFooter' }); - } - }, () => { - // update total cart amount - common.updateTotalCartAmount(req, res); - - // show response - if(hasError === false){ - res.status(200).json({message: 'Cart successfully updated', totalCartItems: Object.keys(req.session.cart).length}); }else{ - res.status(400).json({message: 'There was an error updating the cart', totalCartItems: Object.keys(req.session.cart).length}); + // if there are no users set the "needsSetup" session + req.session.needsSetup = true; + res.redirect('/admin/setup'); } }); }); -// Remove single product from cart -router.post('/product/removefromcart', (req, res, next) => { - // remove item from cart - async.each(req.session.cart, (item, callback) => { - if(item){ - if(item.productId === req.body.cart_index){ - req.session.cart.splice(req.session.cart.indexOf(item), 1); +// login the user and check the password +router.post('/login_action', (req, res) => { + let db = req.app.db; + let bcrypt = req.bcrypt; + + db.users.findOne({userEmail: req.body.email}, (err, user) => { + if(err){ + req.session.message = 'Cannot find user.'; + req.session.messageType = 'danger'; + res.redirect('/admin/login'); + return; + } + + // check if user exists with that email + if(user === undefined || user === null){ + req.session.message = 'A user with that email does not exist.'; + req.session.messageType = 'danger'; + res.redirect('/admin/login'); + }else{ + // we have a user under that email so we compare the password + if(bcrypt.compareSync(req.body.password, user.userPassword) === true){ + req.session.user = req.body.email; + req.session.usersName = user.usersName; + req.session.userId = user._id.toString(); + req.session.isAdmin = user.isAdmin; + res.redirect('/admin'); + }else{ + // password is not correct + req.session.message = 'Access denied. Check password and try again.'; + req.session.messageType = 'danger'; + res.redirect('/admin/login'); } } - callback(); - }, () => { - // update total cart amount - common.updateTotalCartAmount(req, res); - res.status(200).json({message: 'Product successfully removed', totalCartItems: Object.keys(req.session.cart).length}); }); }); -// Totally empty the cart -router.post('/product/emptycart', (req, res, next) => { - delete req.session.cart; - delete req.session.orderId; +// setup form is shown when there are no users setup in the DB +router.get('/setup', (req, res) => { + let db = req.app.db; - // update total cart amount - common.updateTotalCartAmount(req, res); - res.status(200).json({message: 'Cart successfully emptied', totalCartItems: 0}); + db.users.count({}, (err, userCount) => { + if(err){ + console.error(colors.red('Error getting users for setup', err)); + } + // dont allow the user to "re-setup" if a user exists. + // set needsSetup to false as a user exists + req.session.needsSetup = false; + if(userCount === 0){ + req.session.needsSetup = true; + res.render('setup', { + title: 'Setup', + config: common.getConfig(), + helpers: req.handlebars.helpers, + message: common.clearSessionValue(req.session, 'message'), + messageType: common.clearSessionValue(req.session, 'messageType'), + showFooter: 'showFooter' + }); + }else{ + res.redirect('/admin/login'); + } + }); }); // Admin section @@ -689,15 +652,15 @@ router.post('/setup_action', (req, res) => { console.error(colors.red('Failed to insert user: ' + err)); req.session.message = 'Setup failed'; req.session.messageType = 'danger'; - res.redirect('/setup'); + res.redirect('/admin/setup'); }else{ req.session.message = 'User account inserted'; req.session.messageType = 'success'; - res.redirect('/login'); + res.redirect('/admin/login'); } }); }else{ - res.redirect('/login'); + res.redirect('/admin/login'); } }); }); @@ -712,7 +675,7 @@ router.post('/user/insert', common.restrict, (req, res) => { let urlParts = url.parse(req.header('Referer')); let isAdmin = 'false'; - if(urlParts.path === '/setup'){ + if(urlParts.path === '/admin/setup'){ isAdmin = 'true'; } @@ -755,9 +718,9 @@ router.post('/user/insert', common.restrict, (req, res) => { // if from setup we add user to session and redirect to login. // Otherwise we show users screen - if(urlParts.path === '/setup'){ + if(urlParts.path === '/admin/setup'){ req.session.user = req.body.userEmail; - res.redirect('/login'); + res.redirect('/admin/login'); return; } res.redirect('/admin/users'); diff --git a/routes/common.js b/routes/common.js index f5253db..e42d68b 100644 --- a/routes/common.js +++ b/routes/common.js @@ -15,7 +15,7 @@ let ObjectId = require('mongodb').ObjectID; exports.checkLogin = (req, res, next) => { // if not protecting we check for public pages and don't checkLogin if(req.session.needsSetup === true){ - res.redirect('/setup'); + res.redirect('/admin/setup'); return; } @@ -23,7 +23,7 @@ exports.checkLogin = (req, res, next) => { next(); return; } - res.redirect('/login'); + res.redirect('/admin/login'); }; exports.showCartCloseBtn = (page) => { diff --git a/routes/index.js b/routes/index.js index 9abbea2..b5b6815 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,6 +1,7 @@ const express = require('express'); const router = express.Router(); const colors = require('colors'); +const async = require('async'); const _ = require('lodash'); const common = require('./common'); @@ -134,105 +135,142 @@ router.get('/product/:id', (req, res) => { }); }); -// logout -router.get('/logout', (req, res) => { - req.session.user = null; - req.session.message = null; - req.session.messageType = null; - res.redirect('/'); -}); +// Updates a single product quantity +router.post('/product/updatecart', (req, res, next) => { + const db = req.app.db; + let cartItems = JSON.parse(req.body.items); + let hasError = false; -// login form -router.get('/login', (req, res) => { - let db = req.app.db; - - db.users.count({}, (err, userCount) => { - if(err){ - // if there are no users set the "needsSetup" session - req.session.needsSetup = true; - res.redirect('/setup'); - } - // we check for a user. If one exists, redirect to login form otherwise setup - if(userCount > 0){ - // set needsSetup to false as a user exists - req.session.needsSetup = false; - res.render('login', { - title: 'Login', - referringUrl: req.header('Referer'), - config: common.getConfig(), - message: common.clearSessionValue(req.session, 'message'), - messageType: common.clearSessionValue(req.session, 'messageType'), - helpers: req.handlebars.helpers, - showFooter: 'showFooter' - }); + async.eachSeries(cartItems, (cartItem, callback) => { + let productQuantity = cartItem.itemQuantity ? cartItem.itemQuantity : 1; + if(cartItem.itemQuantity === 0){ + // quantity equals zero so we remove the item + req.session.cart.splice(cartItem.cartIndex, 1); + callback(null); }else{ - // if there are no users set the "needsSetup" session - req.session.needsSetup = true; - res.redirect('/setup'); + db.products.findOne({_id: common.getId(cartItem.productId)}, (err, product) => { + if(err){ + console.error(colors.red('Error updating cart', err)); + } + if(product){ + let productPrice = parseFloat(product.productPrice).toFixed(2); + if(req.session.cart[cartItem.cartIndex]){ + req.session.cart[cartItem.cartIndex].quantity = productQuantity; + req.session.cart[cartItem.cartIndex].totalItemPrice = productPrice * productQuantity; + callback(null); + } + }else{ + hasError = true; + callback(null); + } + }); + } + }, () => { + // update total cart amount + common.updateTotalCartAmount(req, res); + + // show response + if(hasError === false){ + res.status(200).json({message: 'Cart successfully updated', totalCartItems: Object.keys(req.session.cart).length}); + }else{ + res.status(400).json({message: 'There was an error updating the cart', totalCartItems: Object.keys(req.session.cart).length}); } }); }); -// setup form is shown when there are no users setup in the DB -router.get('/setup', (req, res) => { - let db = req.app.db; - - db.users.count({}, (err, userCount) => { - if(err){ - console.error(colors.red('Error getting users for setup', err)); - } - // dont allow the user to "re-setup" if a user exists. - // set needsSetup to false as a user exists - req.session.needsSetup = false; - if(userCount === 0){ - req.session.needsSetup = true; - res.render('setup', { - title: 'Setup', - config: common.getConfig(), - helpers: req.handlebars.helpers, - message: common.clearSessionValue(req.session, 'message'), - messageType: common.clearSessionValue(req.session, 'messageType'), - showFooter: 'showFooter' - }); - }else{ - res.redirect('/login'); - } - }); -}); - -// login the user and check the password -router.post('/login_action', (req, res) => { - let db = req.app.db; - let bcrypt = req.bcrypt; - - db.users.findOne({userEmail: req.body.email}, (err, user) => { - if(err){ - req.session.message = 'Cannot find user.'; - req.session.messageType = 'danger'; - res.redirect('/login'); - return; - } - - // check if user exists with that email - if(user === undefined || user === null){ - req.session.message = 'A user with that email does not exist.'; - req.session.messageType = 'danger'; - res.redirect('/login'); - }else{ - // we have a user under that email so we compare the password - if(bcrypt.compareSync(req.body.password, user.userPassword) === true){ - req.session.user = req.body.email; - req.session.usersName = user.usersName; - req.session.userId = user._id.toString(); - req.session.isAdmin = user.isAdmin; - res.redirect('/admin'); - }else{ - // password is not correct - req.session.message = 'Access denied. Check password and try again.'; - req.session.messageType = 'danger'; - res.redirect('/login'); +// Remove single product from cart +router.post('/product/removefromcart', (req, res, next) => { + // remove item from cart + async.each(req.session.cart, (item, callback) => { + if(item){ + if(item.productId === req.body.cart_index){ + req.session.cart.splice(req.session.cart.indexOf(item), 1); } } + callback(); + }, () => { + // update total cart amount + common.updateTotalCartAmount(req, res); + res.status(200).json({message: 'Product successfully removed', totalCartItems: Object.keys(req.session.cart).length}); + }); +}); + +// Totally empty the cart +router.post('/product/emptycart', (req, res, next) => { + delete req.session.cart; + delete req.session.orderId; + + // update total cart amount + common.updateTotalCartAmount(req, res); + res.status(200).json({message: 'Cart successfully emptied', totalCartItems: 0}); +}); + +// Add item to cart +router.post('/product/addtocart', (req, res, next) => { + const db = req.app.db; + let productQuantity = req.body.productQuantity ? parseInt(req.body.productQuantity) : 1; + + // setup cart object if it doesn't exist + if(!req.session.cart){ + req.session.cart = []; + } + + // Get the item from the DB + db.products.findOne({_id: common.getId(req.body.productId)}, (err, product) => { + if(err){ + console.error(colors.red('Error adding to cart', err)); + } + + // We item is found, add it to the cart + if(product){ + let productPrice = parseFloat(product.productPrice).toFixed(2); + + // Doc used to test if existing in the cart with the options. If not found, we add new. + let options = {}; + if(req.body.productOptions){ + options = JSON.parse(req.body.productOptions); + } + let findDoc = { + productId: req.body.productId, + options: options + }; + + // if exists we add to the existing value + let cartIndex = _.findIndex(req.session.cart, findDoc); + if(cartIndex > -1){ + req.session.cart[cartIndex].quantity = parseInt(req.session.cart[cartIndex].quantity) + productQuantity; + req.session.cart[cartIndex].totalItemPrice = productPrice * parseInt(req.session.cart[cartIndex].quantity); + }else{ + // Doesnt exist so we add to the cart session + req.session.cartTotalItems = req.session.cartTotalItems + productQuantity; + + // new product deets + let productObj = {}; + productObj.productId = req.body.productId; + productObj.title = product.productTitle; + productObj.quantity = productQuantity; + productObj.totalItemPrice = productPrice * productQuantity; + productObj.options = options; + productObj.productImage = product.productImage; + if(product.productPermalink){ + productObj.link = product.productPermalink; + }else{ + productObj.link = product._id; + } + + // merge into the current cart + req.session.cart.push(productObj); + } + + // update total cart amount + common.updateTotalCartAmount(req, res); + + // update how many products in the shopping cart + req.session.cartTotalItems = Object.keys(req.session.cart).length; + res.status(200).json({message: 'Cart successfully updated', totalCartItems: Object.keys(req.session.cart).length}); + }else{ + res.status(400).json({message: 'Error updating cart. Please try again.'}); + } }); }); diff --git a/views/layouts/layout.hbs b/views/layouts/layout.hbs index 0be2ea9..a806e81 100644 --- a/views/layouts/layout.hbs +++ b/views/layouts/layout.hbs @@ -107,7 +107,7 @@ {{/ifCond}} {{/unless}} {{#if session.user}} -
  • Logout
  • +
  • Logout
  • {{/if}}