(function () { 'use strict'; angular .module('LyncPix.ShoppingCartModule') .controller('GalleryStoreController', GalleryStoreController); /** @ngInject */ function GalleryStoreController($log, $rootScope, $timeout, toastr, ProductCategories, Products, ShoppingCart, Currency, Client, Config) { var vm = this; var UGUID = 'C1A04F82-FD4B-4BD4-8BD4-CCFB58A3AAD2'; $log.debug('GalleryStoreController Activated'); activate(); function activate() { vm.data = { count: 1, options: {} }; vm.photos_pagination = { current_page: 1, pages: 1, total: 1 }; vm.productOptionsMap = {}; loadProductCategories(); loadCurrency(); loadPhotos(); loadManager(); vm.selectCategory = selectCategory; vm.selectProduct = selectProduct; vm.loadProducts = loadProducts; vm.loadProduct = loadProduct; vm.optionChanged = optionChanged; vm.addToCart = addToCart; vm.imageAdded = imageAdded; vm.removeImage = removeImage; vm.fileUploadValidate = fileUploadValidate; vm.closeCroppingMode = closeCroppingMode; vm.aspectRatioChanged = aspectRatioChanged; vm.loadPhotos = loadPhotos; vm.selectPhoto = selectPhoto; vm.minPhotosSelected = minPhotosSelected; vm.minSelected = minPhotosSelected; vm.remaining = remaining; vm.selected = []; } vm.epocaManagers = Config.epocaManagers; vm.isEpocaManager = function () { return vm.manager && vm.epocaManagers.indexOf(vm.manager.id) > -1; } //pagination specific functions vm.currentPage = function () { return vm.photos_pagination.current_page; }; vm.totalPages = function () { return vm.photos_pagination.total; } vm.firstPage = function () { return 1; } vm.lastPage = function () { return vm.photos_pagination.pages; } vm.needsPaging = function () { return vm.photos_pagination.pages > 1; }; vm.hasPrevPage = function () { return vm.photos_pagination.current_page - 1 > 0; }; vm.hasNextPage = function () { return (vm.photos_pagination.current_page + 1) <= vm.photos_pagination.pages; }; vm.prevPage = function () { return vm.photos_pagination.current_page - 1; }; vm.nextPage = function () { return vm.photos_pagination.current_page + 1; }; vm.getCircularPages = function () { vm.pagination_size = 10;//10 links on each page vm.step_size = parseInt(vm.pagination_size / 2); vm.start = vm.photos_pagination.current_page > vm.step_size ? vm.photos_pagination.current_page - vm.step_size : 1; let end = vm.start + vm.pagination_size - 1; vm.end = end > vm.photos_pagination.pages ? vm.photos_pagination.pages : end; vm.pages = []; for (let i = vm.start; i <= vm.end; i++) { vm.pages.push(i); } return vm.pages; }; vm.loadPage = function (page) { loadPhotos(page); } function loadManager() { Client.loadSapakManager(UGUID).then(function (manager) { vm.manager = manager; }); } function loadPhotos(page) { /* 15/11/2023 - not sure why it needed, images loaded in php console.log("function started loadPhotos"); ShoppingCart.getPhotosPaginated(UGUID, page, 100) .then(function (res) { let photos = res vm.selectedPhotos = []; vm.photos = photos.data; vm.photos_pagination = { current_page: photos.page, pages: photos.pages, total: photos.total }; }) */ } function getMaxPhotoSelectionAllowed() { if (!vm.data.product) { return 1; } let max = vm.data.product.maxImages; return max <= 1 ? 1 : max; } function canSelectPhoto() { let max = vm.data.product.maxImages; let sel = vm.selected.length; max = max <= 1 ? 1 : max; return sel < max; } function selectPhoto(photo, index) { if (vm.selectedPhotos[index] == undefined) { if (!canSelectPhoto()) { toastr.error('You are allowed to select only ' + getMaxPhotoSelectionAllowed() + ' images for this product.', 'Error'); return false; } vm.selectedPhotos[index] = { photo: photo, curentIndex: vm.selected.length } vm.selected.push(photo) } else { vm.selected.splice(vm.selectedPhotos[index].curentIndex, 1); vm.selectedPhotos[index] = undefined; } } var modal = $('#modal_customize_photographer_store'); modal.on("shown.bs.modal", function (e) { modal.find('.customize-image').hide(); if (vm.productCategories.length == 1) { selectCategory(vm.productCategories[0]); loadProducts(vm.productCategories[0].id); $('#CurrentPhotographerStoreImage_2').show(); } else { $('#CurrentPhotographerStoreImage_1').show(); } }) vm.categories = []; function filterCategoriesWithoutProducts(categories) { /* 15/11/2023 - looks like dummy code that create recursive for ajax to get catefories console.log("bbbbbbbbbbbbbbbb"); console.log(categories); function getNext() { if (categories.length) { return categories.shift(); } return ''; } let category = getNext(); if (category == '') { vm.productCategories = vm.categories; vm.showFourProductCategoties = 'false'; if (vm.productCategories.length <= 4) { vm.showFourProductCategoties = 'true'; } if (vm.productCategories.length && !vm.data.category) { selectCategory(vm.productCategories[0]); } modal.find('.customize-image').hide(); if (vm.productCategories.length == 1) { selectCategory(vm.productCategories[0]); loadProducts(vm.productCategories[0].id); $('#CurrentPhotographerStoreImage_2').show(); } else { $('#CurrentPhotographerStoreImage_1').show(); } return false; } Products.getAllSimple(category.id, undefined, UGUID) .then(function (products) { console.log("mmmmmmmmmmmm"); if (products.length > 0) { vm.categories.push(category); } filterCategoriesWithoutProducts(categories); }); */ } function loadProductCategories() { ProductCategories.getAll(undefined, UGUID) .then(function (productCategories) { filterCategoriesWithoutProducts(productCategories); }); } function loadCurrency() { Currency.get(undefined, UGUID) .then(function (currency) { vm.currency = currency; }); } function loadProducts(categoryID, event) { vm.products = []; Products.getAllSimple(categoryID, undefined, UGUID) .then(function (products) { vm.products = products; vm.showFourProducts = 'false'; if (vm.products.length == 1) { vm.product = vm.products[0]; loadProduct(vm.product.id); var target = $('#CurrentPhotographerStoreImage_3'); if (typeof event == typeof undefined && vm.productCategories.length == 1) { var cur = $('#CurrentPhotographerStoreImage_2'); target.find('.btn-back').hide(); cur.hide(); } else { let btn = $(event.target); let back_btn = target.find('.btn-back'); var common = btn.attr("data-common"); //jump directly to step 3 $("." + common).hide(); //config the back button back_btn.data('traget', 'CurrentPhotographerStoreImage_1').attr('data-traget', 'CurrentPhotographerStoreImage_1'); } target.show(); return false; } else { let back_btn = $('#CurrentPhotographerStoreImage_3').find('.btn-back'); back_btn.data('traget', 'CurrentPhotographerStoreImage_2').attr('data-traget', 'CurrentPhotographerStoreImage_2'); } if (vm.products.length <= 4) { vm.showFourProducts = 'true'; } if (vm.products.length && !vm.data.product) { selectProduct(vm.products[0]); } }); } function loadProduct(id) { vm.submitted = false; closeCroppingMode(); Products.get(id, undefined, UGUID) .then(function (product) { vm.data.product = product; vm.selected = []; vm.data.product.properties.options = vm.data.product.properties.options.map(function (e) { if (e.hidden) { var parts = String(e.hidden).split(' -> '); e.parentName = String(parts[0]).trim(); e.parentValue = String(parts[1]).trim(); } return e; }); vm.productOptionsMap = vm.data.product.properties.options.reduce(function (prev, cur) { prev[cur.name] = cur; return prev; }, {}); vm.productOptionsMap.color = {type: 'combo'}; $timeout(optionChanged, 100); }); } function selectCategory(category) { if (vm.data.category && vm.data.category.id !== category.id) { vm.data.product = undefined; } vm.data.category = category; } function selectProduct(product) { closeCroppingMode(); if (!vm.data.product || (vm.data.product && vm.data.product.id !== product.id)) { vm.data.options = {}; } vm.selected = []; vm.data.price = 0; vm.submitted = false; vm.data.product = product; } vm.gotoPhotoSelection = function (form) { ///data-traget="CurrentPhotographerStoreImage_4" data-common="kjhyug_store" class="btnNextStep prodBuyNow tab-switch" ng-disabled="vm.propertiesForm.$invalid" vm.submitted = true; if (form.$invalid || (vm.data.product.colors.values.length && !vm.data.options.color)) { toastr.error('The highlighted properties of the product must be selected. Please select proper values for these properties to continue.', 'Error'); return false; } $('#CurrentPhotographerStoreImage_3').hide(); $('#CurrentPhotographerStoreImage_4').show(); } vm.optionHasImages = function (option) { let ret = option.values.filter(function (row) { return row.hasOwnProperty('image') && (row.image != null || row.images != ''); }).length > 0; return ret; } vm.needsAllSpace = function (option) { return option.name.length > 35 || (['radio', 'checkbox'].indexOf(option.type.toLowerCase()) > -1 && vm.optionHasImages(option)); } vm.isOptionVisible = function (option) { return isParentVisible(option); /*if (!option.hasOwnProperty('hidden') || false == option.hidden) { return true; } return !option.hidden || (option.parentName && vm.data.options[option.parentName] && option.parentValue && vm.data.options[option.parentName] === option.parentValue);*/ } function getColorPrice(color) { let prices = vm.data.product.properties.values; for (let i in prices) { let price = prices[i]; if (price.hasOwnProperty('color') && price.color.toLowerCase() == color.toLowerCase()) { return price.price - (price.discountPrice || 0); } } return 0; } function getOption(name) { let options = vm.data.product.properties.options; for (let i in options) { let opt = options[i]; if (opt.name.toLowerCase() === name.toLowerCase()) { return opt; } } return ''; } function isParentVisible(option) { if (!option.hasOwnProperty('hidden') || option.hidden == false) { // console.log(option); //option does not have parent // console.log('howdy!'); return true; } let options = vm.data.options; if (options[option.parentName] != option.parentValue) { //different parent selected // console.log('Different parent selected.'); return false; } let parent = getOption(option.parentName); if (!parent.hasOwnProperty('parentName')) { //not a case but to be sure return true; } //see if parent of parent is visible or not let visible = isParentVisible(parent); // console.log('parent visibility: ',visible); return visible; } function getPriceFromOptionValue(option, value) { let val = option.values; return val.reduce(function (sum, row) { if (row.title.toLowerCase() == value.toLowerCase() && row.hasOwnProperty('fixedPrice')) { sum += row.fixedPrice; } return sum; }, 0); } function getSelectedOptionPrice(value, option) { if (option.hasOwnProperty('hidden') && option.hidden != false) { //check if parent is visible if (vm.data.options[option.parentName] == option.parentValue && isParentVisible(option)) { let opt = angular.copy(option, {}); opt.hidden = false; return getSelectedOptionPrice(value, opt); } //if parent is not visible the price of the selected option should be 0 return 0; } if (!option.hasOwnProperty('values')) { return 0; } let prices = option.values; for (let i in prices) { let price = prices[i]; let title = price.hasOwnProperty('title') ? price.title.toLowerCase() : ''; if (angular.isObject(value)) { let p = 0; for (let k in value) { let l = value[k]; if (l == true) { let sum = getPriceFromOptionValue(option, k); p += (sum || price.fixedPrice || 0); } } return p; } else if (title == value.toLowerCase()) { return price.fixedPrice || 0; } } return 0; } function optionChanged(opt) { vm.data.price = vm.data.product.price; let sum = 0; for (let i in vm.data.options) { let v = vm.data.options[i]; if (i.toLowerCase() == 'color') { sum += getColorPrice(v); } else { //not really necessary, since the data is already present in the function argument //but just to be sure let option = getOption(i); if (option != '') { sum += getSelectedOptionPrice(v, option); } } } vm.data.price += sum; //dont want to mess up with variant. // i dont really know what variant is. //but we dont need this part for price calculation //so uncommented it var result = vm.data.product.properties.values; for (var i in vm.data.options) { if ( typeof vm.productOptionsMap[i] !== typeof undefined && ['combo', 'radio'].indexOf(vm.productOptionsMap[i].type) !== -1 && ( (!vm.productOptionsMap[i].parentName && !vm.productOptionsMap[i].parentValue) || (vm.data.options[vm.productOptionsMap[i].parentName] === vm.productOptionsMap[i].parentValue) ) ) { result = result.filter(function (e) { return e[i] === vm.data.options[i]; }); } } vm.data.variant = result[0]; /*var fixedPrice = 0; for (var i in vm.data.options) { if (vm.data.options[i]) { if (typeof vm.productOptionsMap[i] !== typeof undefined && vm.productOptionsMap[i].type === 'combo' && vm.productOptionsMap[i].values) { for (var j = 0; j < vm.productOptionsMap[i].values.length; j++) { if (vm.productOptionsMap[i].values[j].title !== vm.data.options[i]) { delete vm.data.options[vm.productOptionsMap[i].values[j].childOption]; } else if (vm.productOptionsMap[i].values[j].fixedPrice) { fixedPrice += vm.productOptionsMap[i].values[j].fixedPrice; } } } } }*/ /*vm.data.price = typeof vm.data.variant !== typeof undefined && typeof vm.data.variant.price !== typeof undefined ? vm.data.variant.price : vm.data.product.price; vm.data.price += fixedPrice;*/ } function imageAdded($file, $message, optionName) { if ($message) { var msg = angular.fromJson($message); if (msg.success) { $timeout(function () { if (!vm.data.options[optionName]) { vm.data.options[optionName] = []; } vm.data.options[optionName].push(msg.filename); $file.cancel(); }, 0); } } } function removeImage(idx, option) { vm.data.options[option.name].splice(idx, 1); } function fileUploadValidate($file) { var isValid = !!{png: 1, gif: 1, jpg: 1, jpeg: 1}[$file.getExtension()]; if (!isValid) { toastr.error('Please upload image in format PNG, JPEG or GIF.', 'Error'); } isValid = isValid && ($file.size <= 3 * 1024 * 1024); if (!isValid) { toastr.error('Uploaded image size must be less than 3MB.', 'Error'); } return isValid; } vm.needsCropping = function () { return getMaxPhotoSelectionAllowed() == 1 && vm.data.product && vm.data.options && vm.data.product.croppingProperty && vm.data.options[vm.data.product.croppingProperty]; } vm.goToCropping = function () { if (getMaxPhotoSelectionAllowed() > 1) { toastr.error('Cropping is disabled for this product.', 'Error'); return false; } if (!minPhotosSelected()) { toastr.error('Please selected at least ' + minPhotosRequired() + ' images to continue.', 'Error'); return false; } vm.isCroppingMode = true; vm.picture = getPicture(); $('#CurrentPhotographerStoreImage_4').hide(); $('#CurrentPhotographerStoreImage_5').show(); cropperInitialize(); } function remaining() { return minPhotosRequired() - vm.selected.length; } function minPhotosRequired() { if (!vm.data.product) { return 1; } let min = vm.data.product.numberOfImages; return min <= 1 ? 1 : min; } function minPhotosSelected() { return vm.selected.length >= minPhotosRequired(); } function getPicture() { let def = $('#hiddenCurrentCustomizeImageURL').val(); if (getMaxPhotoSelectionAllowed() == 1) { def = vm.selected[0]; } return def; } function addToCart() { if (!minPhotosSelected()) { toastr.error('Please selected at least ' + minPhotosRequired() + ' images to continue.', 'Error'); return false; } vm.picture = getPicture(); if (vm.needsCropping() && !vm.isCroppingMode) { vm.isCroppingMode = true; cropperInitialize(); } else { saveToCart().then(function () { let modal = $('#modal_customize_photographer_store'); modal.modal('hide'); }); } } vm.getSelectedPhotos = function () { return vm.selected.map(function (row) { row = decodeURIComponent(row.split('/').pop()); return row; }); } vm.addHiddenProperties = function () { let props = vm.data.product.properties; if (typeof props === typeof undefined || !props.options) { return false; } for (let i in props.options) { let prop = props.options[i]; if (prop.type != 'hidden') { continue; } vm.data.options[prop.name] = prop.value; } } function saveToCart() { vm.addHiddenProperties(); let save = { productID: vm.data.product.id, count: vm.data.count, totalPrice: vm.data.price, variant: (angular.isArray(vm.data.variant) ? vm.data.variant[0] : vm.data.variant) || {}, options: (angular.isArray(vm.data.options) ? vm.data.options[0] : vm.data.options) || {}, croppingData: vm.croppingData, uguid: UGUID }; /* picture: vm.picture, pictures: pictures, */ let method = vm.isCroppingMode ? 'saveOne' : 'saveWithPicArr'; save.picture = vm.isCroppingMode ? vm.picture : vm.getSelectedPhotos(); return ShoppingCart[method](save).then(function (res) { vm.data = { count: 1, options: {} }; vm.productOptionsMap = {}; if (vm.productCategories.length) { selectCategory(vm.productCategories[0]); } if (vm.isCroppingMode) { closeCroppingMode(); } $rootScope.$emit('ShoppingCartRefreshed', true); var image = $('') $('body').append(image); var target = $('#dropdown_ddCart'); image.animate({ 'top': target.position().top + 10, 'left': target.offset().left + 100, 'width': 30, 'height': 30 }, 1000, 'easeInOutExpo'); setTimeout(function () { image.animate({ 'opacity': 0, height: 0, width: 0 }, 500, 'easeInOutExpo'); }, 1000); setTimeout(function () { target.effect('shake', {times: 2}, 200); }, 1500); }); } function closeCroppingMode() { vm.isCroppingMode = false; } function cropperInitialize() { $('#shop-custom-image').cropper('destroy'); vm.optionChanged(); $.fn.cropper.setDefaults({ checkCrossOrigin: false, scalable: false, zoomable: false, responsive: true }); $timeout(function () { $('#shop-custom-image').cropper({ maximize: true, responsive: true, aspectRatio: vm.aspectRatio, crop: function (e) { // Output the result data for cropping image. vm.croppingData = { x: e.x, y: e.y, width: e.width, height: e.height }; var $preview = $('.shop-image-preview'); var imageData = $(this).cropper('getImageData'); var previewAspectRatio = e.width / e.height; var previewWidth = $preview.width(); var previewHeight = previewWidth / previewAspectRatio; var imageScaledRatio = e.width / previewWidth; $preview.height(previewHeight).find('img').css({ width: imageData.naturalWidth / imageScaledRatio, height: imageData.naturalHeight / imageScaledRatio, left: -e.x / imageScaledRatio, top: -e.y / imageScaledRatio }); } }); aspectRatioChanged(); }, 100); } function aspectRatioChanged() { var size = vm.data.options[vm.data.product.croppingProperty]; if (size) { var parts = []; if (size.indexOf('x') !== -1) { parts = size.split('x'); } else { parts = size.split('X'); } if (parts.length === 2) { var width = +parts[0]; var height = +parts[1]; vm.aspectRatio = width / height; $('#shop-custom-image').cropper('setAspectRatio', vm.aspectRatio); } else { vm.data.options[vm.data.product.croppingProperty] = vm.productOptionsMap[vm.data.product.croppingProperty].values[0].croppingProperty; size = vm.data.options[vm.data.product.croppingProperty].toLowerCase().split('x'); if(size.length == 2){ var height = size.pop(); var width = size.pop(); vm.aspectRatio = width / height; $('#shop-custom-image').cropper('setAspectRatio', vm.aspectRatio); } } } } } })();