From 03444d76cffb55002c97f1ce8629cd703a3b7b8e Mon Sep 17 00:00:00 2001 From: Gustavo Luigi Date: Sun, 4 Sep 2022 21:41:13 +0200 Subject: [PATCH] refactor scripts --- assets/js/checkout.js | 80 +++++++++++++ assets/js/data.js | 4 + assets/js/methods.js | 148 +++++++++++++++++++++++ assets/js/script.js | 127 ++++++++++++++++++++ content/master.blade.php | 195 +------------------------------ content/pages/checkout.blade.php | 85 +------------- 6 files changed, 363 insertions(+), 276 deletions(-) create mode 100644 assets/js/checkout.js create mode 100644 assets/js/data.js create mode 100644 assets/js/methods.js create mode 100644 assets/js/script.js diff --git a/assets/js/checkout.js b/assets/js/checkout.js new file mode 100644 index 0000000..216209e --- /dev/null +++ b/assets/js/checkout.js @@ -0,0 +1,80 @@ +function clearAddressFields() { + $('#address-components').hide(); + $('#street-number').val(''); + $('#street-number').prop('disabled', true); + $('#route').val(''); + $('#locality').val(''); + $('#postal-code').val(''); +} +function getAddressFiedlValue(addressComponents, $field){ + let field = addressComponents.find(obj => obj.types.indexOf($field) > -1); + return field != undefined?field.long_name:''; +} +function initialize() { + let input = document.getElementById('field_location'); + let options = { + types: ['address'], + componentRestrictions: { country: "de" } + }; + var autocomplete = new google.maps.places.Autocomplete(input, options); + autocomplete.addListener("place_changed", () => { + clearAddressFields(); + const place = autocomplete.getPlace(); + if (!place.geometry) return; + var componentMap = { + country: 'country', + locality: 'locality', + administrative_area_level_1 : 'administrative_area_level_1', + administrative_area_level_2 : 'administrative_area_level_2', + postal_code: 'postal_code', + route: 'route', + street_number : 'street_number', + }; + $('#address-components').show(); + let addressComponents = autocomplete.getPlace().address_components; + let streetNumber = getAddressFiedlValue(addressComponents, 'street_number'); + if(streetNumber == '') { + $('#street-number').prop('disabled', false); + $('#street-number').focus(); + } + else { + $('#street-number').prop('disabled', true); + $('#street-number').val(streetNumber); + } + let country = getAddressFiedlValue(addressComponents, 'country'); + let route = getAddressFiedlValue(addressComponents, 'route'); + $('#route').val(route); + let locality = getAddressFiedlValue(addressComponents, 'locality'); + $('#locality').val(locality); + let postalCode = getAddressFiedlValue(addressComponents, 'postal_code'); + $('#postal-code').val(postalCode); + $('#street-number').blur(function(){ + if($('#street-number').val() == '') $('#street-number').focus(); + else{ + $('#street-number').prop('disabled', true); + $('#field_location').val(route+' '+$('#street-number').val()+', '+locality+', '+country); + } + }); + }); +} +$(window).on('load', google.maps.event, initialize); +let input = document.querySelector("#ctelefon"); +let iti = window.intlTelInput(input, { + initialCountry: "de", + preferredCountries: ["de"], + geoIpLookup: function(callback) { + $.get('https://ipinfo.io', function() {}, "jsonp").always(function(resp) { + let countryCode = (resp && resp.country)?resp.country:"us"; + callback(countryCode); + }); + }, + utilsScript: "{{storage('assets/libs/intl-tel-input/js/utils.min.js')}}", +}); +// iti.getNumber(); +function updateProducts(){} +$(window).on('load', function(){ + $('#anfrage').submit(function(){ + objProducts = []; + localStorage.setItem("products", JSON.stringify(objProducts)); + }); +}); \ No newline at end of file diff --git a/assets/js/data.js b/assets/js/data.js new file mode 100644 index 0000000..40164a7 --- /dev/null +++ b/assets/js/data.js @@ -0,0 +1,4 @@ +let objProducts = []; +let totalPrice = 0; +let cartLink = null; +let shareData = []; \ No newline at end of file diff --git a/assets/js/methods.js b/assets/js/methods.js new file mode 100644 index 0000000..167f5db --- /dev/null +++ b/assets/js/methods.js @@ -0,0 +1,148 @@ +function getInfoFromSelectedProduct(){ + let ids = objProducts.map(obj => obj.id); + return $.get($('meta[name="get-contents"]').attr('content')+"/"+ids.join(",")); +} + +function numberToEuroFormat(number){ + let formatter = new Intl.NumberFormat('de', {style: 'currency', currency: 'EUR'}); + return formatter.format(number); +} + +function getQuantityOfProducts(){ + let quantitys = objProducts.map(obj => obj.quantity); + let quantityOfProducts = 0; + for(let i = 0; i < quantitys.length; i++) { if(Number.isInteger(Number(quantitys[i]))) quantityOfProducts += Number(quantitys[i]); } + return quantityOfProducts; +} + +function getProductInfo(productInfo){ + let objProduct = objProducts.find(obj => obj.id == productInfo.id); + return jQuery.extend(objProduct, productInfo); +} + +function createProductElement(objProduct){ + let elementProduct = ` + + + + + + ${objProduct.title} +
+ sofort verfügbar +
+ + + + ${numberToEuroFormat(objProduct.preis)} + `; + return elementProduct; +} + +function addToBag(productId){ + let objProductInfo = objProducts.find(obj => obj.id == productId); + let index = objProducts.indexOf(objProductInfo); + if(index == -1) objProducts.push({id: productId, quantity: 1}); + updateProductsInLocalStorage(); +} + +function isJson(str) { + try { JSON.parse(str); } + catch(e) { return false; } + return true; +} + +function isEncoded(str){ + try { atob(str); } + catch(e) { return false; } + return true; +} + +function hasCartCode(){ + let urlPath = window.location.pathname; + let code = urlPath.split("/"); + code = code[code.length-1]; + if(isEncoded(code)){ + let productLink = atob(code); + if(isJson(productLink)) return true; + } + return false; +} + +function updateProductsInLocalStorage(){ + localStorage.setItem("products", JSON.stringify(objProducts)); + $('#count-products-in-bag').text(getQuantityOfProducts()); + $('#list-products-in-bag').html(''); + if(typeof updateProducts === "function") $('#list-products').html(''); + totalPrice = 0; + if(objProducts.length > 0){ + getInfoFromSelectedProduct().done(function(response, status){ + response.contents.forEach(function(product){ + let objProduct = getProductInfo(product); + totalPrice += objProduct.preis*objProduct.quantity; + let elementProduct = createProductElement(objProduct); + $('#list-products-in-bag').append(elementProduct); + if(typeof updateProducts === "function") $('#list-products').append(elementProduct); + }); + $('#total-price').text(numberToEuroFormat(totalPrice)); + if(typeof updateProducts === "function") $('#total-checkout-price').text(numberToEuroFormat(totalPrice)); + }); + $('.cart-link').show(); + $(".btn-share").show(); + $('#count-products-in-bag').show(); + $('#list-products-in-bag').parent().parent().parent().parent().parent().find('.modal-footer').show(); + $('#total-price').parent().parent().parent().show(); + $('#no-products').hide(); + if(typeof updateProducts === "function"){ + $('#form-section').show(); + $('#list-products').parent().parent().parent().parent().parent().find('.modal-footer').show(); + $('#total-checkout-price').parent().parent().parent().show(); + $('#no-products-in-checkout').hide(); + } + + if(window.location.origin == 'http://localhost') cartLink = window.location.origin+'/areya-energy/public/'+btoa(JSON.stringify(objProducts)); + else cartLink = window.location.origin+'/'+btoa(JSON.stringify(objProducts)); + $('.cart-link').val(cartLink); + shareData = { + title: "Share cart list", + text: 'share cart list', + url: cartLink, + }; + + }else{ + $('.cart-link').hide(); + $(".btn-share").hide(); + $('#count-products-in-bag').hide(); + $('#list-products-in-bag').parent().parent().parent().parent().parent().find('.modal-footer').hide(); + $('#total-price').parent().parent().parent().hide(); + $('#no-products').show(); + if(typeof updateProducts === "function"){ + $('#form-section').hide(); + $('#list-products').parent().parent().parent().parent().parent().find('.modal-footer').hide(); + $('#total-checkout-price').parent().parent().parent().hide(); + $('#no-products-in-checkout').show(); + } + } + let productId = $('meta[name="product-id"]').attr('content'); + if(productId != undefined){ + let objProduct = objProducts.find(obj => obj.id == productId); + if(objProduct == undefined) { + $('#btn-add-to-bag').show(); + $('#btn-show-bag').hide(); + if(objProducts.length > 0) $('#btn-check-out').parent().hide(); + else $('#btn-check-out').parent().show(); + } + else { + $('#btn-add-to-bag').hide(); + $('#btn-show-bag').show(); + $('#btn-check-out').parent().hide(); + $('#count-items-in-bag').html(objProduct.quantity+``); + } + } +} \ No newline at end of file diff --git a/assets/js/script.js b/assets/js/script.js new file mode 100644 index 0000000..1ab97d5 --- /dev/null +++ b/assets/js/script.js @@ -0,0 +1,127 @@ +$(window).on('load', function(){ + if(localStorage.getItem("dismiss-message") == 1) $('.alert-dismissible').remove(); + else $('.alert-dismissible').show(); + $('#btn-close-message').click(function(){ localStorage.setItem("dismiss-message", 1); }); + if(localStorage.getItem("products") != null) objProducts = JSON.parse(localStorage.getItem("products")); + updateProductsInLocalStorage(); + if(hasCartCode()){ + if(objProducts.length > 0) $('#modal-confirm-product-replacement').modal('show'); + else $('#modal-confirm-addition-of-products').modal('show'); + $('.btn-confirm-product-link').click(function(){ + objProducts = JSON.parse(productLink); + updateProductsInLocalStorage(); + window.location.replace($('meta[name="checkout"]').attr('content')); + }); + } + $(document).on('click', '.btn-remove-product', function(){ + let productId = $(this).attr('data-id'); + let objProductInfo = objProducts.find(obj => obj.id == productId); + let index = objProducts.indexOf(objProductInfo); + if(index != -1) objProducts.splice(index, 1); + localStorage.setItem("products", JSON.stringify(objProducts)); + $(this).parent().parent().remove(); + + $('#count-products-in-bag').text(getQuantityOfProducts()); + if(objProducts.length > 0){ + $('.cart-link').show(); + $(".btn-share").show(); + $('#count-products-in-bag').show(); + $('#list-products-in-bag').parent().parent().parent().parent().parent().find('.modal-footer').show(); + $('#total-price').parent().parent().parent().show(); + $('#no-products').hide(); + if(typeof updateProducts === "function"){ + $('#form-section').show(); + $('#list-products').parent().parent().parent().parent().parent().find('.modal-footer').show(); + $('#total-checkout-price').parent().parent().parent().show(); + $('#no-products-in-checkout').hide(); + } + }else{ + $('.cart-link').hide(); + $(".btn-share").hide(); + $('#count-products-in-bag').hide(); + $('#list-products-in-bag').parent().parent().parent().parent().parent().find('.modal-footer').hide(); + $('#total-price').parent().parent().parent().hide(); + $('#no-products').show(); + if(typeof updateProducts === "function"){ + $('#form-section').hide(); + $('#list-products').parent().parent().parent().parent().parent().find('.modal-footer').hide(); + $('#total-checkout-price').parent().parent().parent().hide(); + $('#no-products-in-checkout').show(); + } + } + + getInfoFromSelectedProduct().done(function(response, status){ + totalPrice = 0; + if(response.contents != undefined) response.contents.forEach(function(product){ + let objProduct = getProductInfo(product); + totalPrice += objProduct.preis*objProduct.quantity; + }); + $('#total-price').text(numberToEuroFormat(totalPrice)); + if(typeof updateProducts === "function") $('#total-checkout-price').text(numberToEuroFormat(totalPrice)); + }); + + productId = $('meta[name="product-id"]').attr('content'); + if(productId != undefined){ + let objProduct = objProducts.find(obj => obj.id == productId); + if(objProduct == undefined) { + $('#btn-add-to-bag').show(); + $('#btn-show-bag').hide(); + if(objProducts.length > 0) $('#btn-check-out').parent().hide(); + else $('#btn-check-out').parent().show(); + } + else { + $('#btn-add-to-bag').hide(); + $('#btn-show-bag').show(); + $('#btn-check-out').parent().hide(); + $('#count-items-in-bag').html(objProduct.quantity+``); + } + } + + }); + $(document).on('change', '.select-quantity', function(){ + let quantity = $(this).val(); + let productId = $(this).attr('data-id'); + let objProductInfo = objProducts.find(obj => obj.id == productId); + let index = objProducts.indexOf(objProductInfo); + objProducts[index].quantity = quantity; + localStorage.setItem("products", JSON.stringify(objProducts)); + + $('#count-products-in-bag').text(getQuantityOfProducts()); + getInfoFromSelectedProduct().done(function(response, status){ + totalPrice = 0; + response.contents.forEach(function(product){ + let objProduct = getProductInfo(product); + totalPrice += objProduct.preis*objProduct.quantity; + }); + $('#total-price').text(numberToEuroFormat(totalPrice)); + if(typeof updateProducts === "function") $('#total-checkout-price').text(numberToEuroFormat(totalPrice)); + }); + + productId = $('meta[name="product-id"]').attr('content'); + if(productId != undefined){ + let objProduct = objProducts.find(obj => obj.id == productId); + if(objProduct == undefined) { + $('#btn-add-to-bag').show(); + $('#btn-show-bag').hide(); + if(objProducts.length > 0) $('#btn-check-out').parent().hide(); + else $('#btn-check-out').parent().show(); + } + else { + $('#btn-add-to-bag').hide(); + $('#btn-show-bag').show(); + $('#btn-check-out').parent().hide(); + $('#count-items-in-bag').html(objProduct.quantity+``); + } + } + + }); + $('#btn-copy-cart-link').click(function(){ + $('.cart-link').select(); + document.execCommand("copy"); + $(this).html(``); + }); + $(".btn-share").click(async function() { + if(navigator.share) { try { await navigator.share(shareData); } catch(err) { console.warn(err); } } + else { console.warn('Native Web Sharing not supported'); } + }); +}); \ No newline at end of file diff --git a/content/master.blade.php b/content/master.blade.php index af8e40d..136edc2 100644 --- a/content/master.blade.php +++ b/content/master.blade.php @@ -273,198 +273,9 @@ @yield('content') @insert("content.includes.footer") @insert("content.includes.scripts") - + + + @yield('scripts') diff --git a/content/pages/checkout.blade.php b/content/pages/checkout.blade.php index 9c04834..cdf7ab9 100644 --- a/content/pages/checkout.blade.php +++ b/content/pages/checkout.blade.php @@ -269,88 +269,5 @@ @stop @section('scripts') - + @stop