357 lines
15 KiB
JavaScript
357 lines
15 KiB
JavaScript
(function () {
|
|
global.dashModule
|
|
.directive('createPackagesFromTemplate', createPackagesFromTemplateDirective)
|
|
.controller('createPackagesFromTemplateController', ['$scope', '$http', '$', '$translate', '$timeout', 'utilsService', 'packagesUtilsService', createPackagesFromTemplateCtrl]);
|
|
|
|
function createPackagesFromTemplateDirective() {
|
|
return {
|
|
restrict: 'E',
|
|
templateUrl: 'packages/html/createPackagesFromTemplateTemplate'
|
|
};
|
|
}
|
|
|
|
function createPackagesFromTemplateCtrl($scope, $http, $, $translate, $timeout, utilsService, packagesUtilsService) {
|
|
const virtualCategoryNonExisting = [];
|
|
const categories = [];
|
|
const hasMultipleProducts = {};
|
|
let droppedRealPackage;
|
|
let realProductKeyReturned;
|
|
let virtualProductKeyReturned;
|
|
let elementDragged = '';
|
|
$scope.isCountryAndPackageSelected = false;
|
|
$scope.getTitle = packagesUtilsService.getTitle;
|
|
$scope.productUnit = {};
|
|
$scope.updateProducts = updateProducts;
|
|
$scope.updateVirtualProducts = updateVirtualProducts;
|
|
$scope.createPackageFromTemplate = createPackageFromTemplate;
|
|
$scope.countrySelected = '';
|
|
$scope.onDragStartFromProducts = onDragStartFromProducts;
|
|
$scope.onDragStop = onDragStop;
|
|
$scope.onDragStartFromPackage = onDragStartFromPackage;
|
|
$scope.productDropped = productDropped;
|
|
$scope.areTemplateAndCountrySelected = areTemplateAndCountrySelected;
|
|
$scope.getCountryTranslationKey = getCountryTranslationKey;
|
|
$scope.checkQuantityAmount = utilsService.verifyAmountAdded;
|
|
$scope.initializeCreatePackages = initializeCreatePackages;
|
|
$scope.packages = [];
|
|
$scope.isCategoryInTemplate = isCategoryInTemplate;
|
|
$scope.isAdditionalVirtualProductVisible = isAdditionalVirtualProductVisible;
|
|
// default value for additional bussiness days for installation
|
|
$scope.additionalInstallationDays = 5;
|
|
$scope.selectedPackageTypeId = 1;
|
|
$scope.getTemplateDescription = getTemplateDescription;
|
|
$scope.tinymceOptions = utilsService.getTynimceOptions();
|
|
$scope.uploadParams = {};
|
|
|
|
function initializeCreatePackages() {
|
|
const params = {getArray: true};
|
|
httpCall('countries/api/getAllCountries', getCountries, params);
|
|
httpCall('packages/api/getTemplatePackages', getTemplatePackages);
|
|
getPackageTypes();
|
|
}
|
|
|
|
function getTemplateDescription() {
|
|
const selectedTemplate = searchTemplateSelected() || {};
|
|
return selectedTemplate.templateDescription || '';
|
|
}
|
|
|
|
function getTemplatePackages(response) {
|
|
$scope.templates = response.data;
|
|
}
|
|
|
|
function getPackageTypes(){
|
|
const params = {
|
|
idPackage: $scope.packageSelected ? $scope.packageSelected.id : 0
|
|
};
|
|
httpCall('packages/api/getPackageTypes', setPackageTypes, params);
|
|
}
|
|
|
|
function setPackageTypes(response){
|
|
if(response.data && response.data.packageTypes){
|
|
$scope.packageTypes = response.data.packageTypes;
|
|
}
|
|
}
|
|
|
|
function httpCall(httpUrl, successCallback, params) {
|
|
const urlParams = params ? $.param(params) : {};
|
|
$http({
|
|
method: 'POST',
|
|
url: httpUrl,
|
|
data: urlParams
|
|
}).then(successCallback, utilsService.onHttpError);
|
|
}
|
|
|
|
function areTemplateAndCountrySelected() {
|
|
return typeof $scope.selectedCountryId !== 'undefined' && $scope.selectedCountryId !== 0 &&
|
|
typeof $scope.idSelectedPackageTemplate !== 'undefined' && $scope.idSelectedPackageTemplate;
|
|
}
|
|
|
|
function getCountryTranslationKey() {
|
|
return $scope.countrySelected === '' ? 'SELECT_COUNTRY' : 'SELECTED_COUNTRY';
|
|
}
|
|
|
|
function getProductsForPackages(response) {
|
|
$scope.productsByCategories = typeof response.data !== 'undefined' ? response.data : [];
|
|
getProductAndPackageCategories();
|
|
setHeights();
|
|
}
|
|
|
|
function getCountries(response) {
|
|
if (response.data) {
|
|
$scope.countries = response.data;
|
|
}
|
|
}
|
|
|
|
function onDragStartFromProducts(event, ui, product) {
|
|
$('#products-list-' + product.category).css({
|
|
overflow: 'visible'
|
|
});
|
|
$('.real-product-' + product.category).addClass('allowed-drop-zone');
|
|
|
|
droppedRealPackage = product;
|
|
realProductKeyReturned = '';
|
|
virtualProductKeyReturned = '';
|
|
elementDragged = 'product';
|
|
}
|
|
|
|
function onDragStartFromPackage(event, ui, virtualProductKey, realProductKey, category) {
|
|
$('#packages-list-' + category).css({
|
|
overflow: 'visible'
|
|
});
|
|
|
|
virtualProductKeyReturned = virtualProductKey;
|
|
realProductKeyReturned = realProductKey;
|
|
elementDragged = 'package';
|
|
}
|
|
|
|
function onDragStop(event, ui, product) {
|
|
$('.package-list-' + product.category).css({
|
|
'overflow-y': 'scroll'
|
|
});
|
|
$('.real-product-' + product.category).removeClass('allowed-drop-zone');
|
|
|
|
$scope.productUnit[product.idProduct] = $scope.productUnit[product.idProduct] || 1;
|
|
}
|
|
|
|
function productDropped(event, ui, placeToDrop, productKey, productCategory) {
|
|
const packageProduct = $scope.packagesByCategories[productCategory];
|
|
|
|
if (placeToDrop === 'package') {
|
|
if (elementDragged !== placeToDrop && packageProduct[productKey]) {
|
|
if (!packageProduct[productKey].real) {
|
|
packageProduct[productKey].real = [];
|
|
}
|
|
|
|
const productExists = packageProduct[productKey].real.some(product => {
|
|
return product.idProduct === droppedRealPackage.idProduct;
|
|
});
|
|
if(!productExists){
|
|
packageProduct[productKey].real.push(droppedRealPackage);
|
|
}
|
|
|
|
}
|
|
} else if (placeToDrop === 'product') {
|
|
if (elementDragged !== placeToDrop) {
|
|
if ((virtualProductKeyReturned in packageProduct) &&
|
|
packageProduct[virtualProductKeyReturned].hasOwnProperty('real')) {
|
|
|
|
delete packageProduct[virtualProductKeyReturned].real;
|
|
} else if (packageProduct[realProductKeyReturned] &&
|
|
packageProduct[realProductKeyReturned].hasOwnProperty('real')) {
|
|
|
|
delete packageProduct[realProductKeyReturned].real;
|
|
}
|
|
}
|
|
}
|
|
|
|
$(ui.helper).css({
|
|
position: 'relative',
|
|
left: 0,
|
|
top: 0
|
|
});
|
|
elementDragged = '';
|
|
}
|
|
|
|
function getProductAndPackageCategories() {
|
|
if ($scope.productsByCategories) {
|
|
Object.keys($scope.productsByCategories).forEach((category, productKey) => {
|
|
virtualCategoryNonExisting[category] = $scope.packagesByCategories.hasOwnProperty(category);
|
|
categories.push(category);
|
|
if ($scope.productsByCategories[category][productKey]) {
|
|
hasMultipleProducts[category] = $scope.productsByCategories[category][productKey].hasMultiple;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
function isCategoryInTemplate(category) {
|
|
return virtualCategoryNonExisting[category];
|
|
}
|
|
|
|
function setHeights() {
|
|
$timeout(function () {
|
|
categories.forEach(category => {
|
|
const packagesHeight = $('#packages-list-' + category).height() + 3;
|
|
|
|
$('#products-list-' + category).css({
|
|
height: packagesHeight,
|
|
'overflow-y': 'overlay'
|
|
});
|
|
|
|
$('#pack-' + category + '-from-template-container').css({
|
|
height: packagesHeight
|
|
});
|
|
});
|
|
}, 10);
|
|
}
|
|
|
|
function isAdditionalVirtualProductVisible(category) {
|
|
return hasMultipleProducts && hasMultipleProducts[category] ? parseInt(hasMultipleProducts[category]) : 0;
|
|
}
|
|
|
|
function updateProducts() {
|
|
const idCountry = $scope.selectedCountryId;
|
|
const params = {
|
|
idCountry
|
|
};
|
|
const countryInfoSelected = $scope.countries.find(countryInfo => {
|
|
return countryInfo.id === idCountry;
|
|
});
|
|
|
|
$scope.countrySelected = countryInfoSelected.name;
|
|
$scope.translationData = {
|
|
country: $scope.countrySelected
|
|
};
|
|
$scope.isString = false;
|
|
let productsPerType;
|
|
for (productsPerType in $scope.packagesByCategories) {
|
|
$scope.packagesByCategories[productsPerType].forEach(packageDetails => {
|
|
if (packageDetails.hasOwnProperty('real')) {
|
|
delete packageDetails.real;
|
|
}
|
|
});
|
|
}
|
|
utilsService.executeRegisteredFunction('saveCoverImage', $scope.uploadParams);
|
|
|
|
httpCall('packages/api/getProductsByCategory', getProductsForPackages, params);
|
|
}
|
|
|
|
function updateVirtualProducts(afterCreate = false) {
|
|
let virtualProducts = [];
|
|
let productsByCategory;
|
|
|
|
if (areTemplateAndCountrySelected()) {
|
|
$.extend(virtualProducts, searchTemplateSelected().products);
|
|
updateProducts();
|
|
|
|
for (productsByCategory in virtualProducts) {
|
|
virtualProducts[productsByCategory].forEach(virtualProduct => {
|
|
$scope.productUnit[virtualProduct.idProduct] = parseInt(virtualProduct.quantity);
|
|
if (afterCreate) {
|
|
delete virtualProduct.real;
|
|
}
|
|
});
|
|
}
|
|
$scope.packagesByCategories = virtualProducts;
|
|
setHeights();
|
|
}
|
|
|
|
$scope.uploadParams = {
|
|
shouldShowBox: false,
|
|
idCountry: $scope.selectedCountryId || 0,
|
|
idPackage: $scope.idSelectedPackageTemplate || 0
|
|
};
|
|
}
|
|
|
|
function createPackageFromTemplate() {
|
|
const productsList = [];
|
|
let packageHasRealProducts = true;
|
|
let productsPerType;
|
|
for (productsPerType in $scope.packagesByCategories) {
|
|
if (!$scope.packagesByCategories[productsPerType].every(checkIfPackageHasRealProducts)) {
|
|
packageHasRealProducts = false;
|
|
}
|
|
}
|
|
|
|
if (packageHasRealProducts) {
|
|
let productsPerType;
|
|
for (productsPerType in $scope.packagesByCategories) {
|
|
$scope.packagesByCategories[productsPerType].forEach(product => {
|
|
product.real.forEach(realProduct => {
|
|
realProduct.productUnit = $scope.productUnit[product.idProduct] ? $scope.productUnit[product.idProduct] : 1;
|
|
productsList.push(realProduct);
|
|
});
|
|
});
|
|
}
|
|
|
|
if (productsList) {
|
|
const packageInfo = {
|
|
packageName: $scope.packageName || '',
|
|
packageReference: $scope.packageReference || '',
|
|
packageDescription: $scope.packageDescription || '',
|
|
additionalInstallationDays: $scope.additionalInstallationDays || 0,
|
|
idCountry: $scope.selectedCountryId,
|
|
idPackageType: $scope.selectedPackageTypeId ? $scope.selectedPackageTypeId : 0,
|
|
idTemplate: $scope.idSelectedPackageTemplate
|
|
};
|
|
|
|
const params = {
|
|
packageData: JSON.stringify(productsList),
|
|
packageInfo: JSON.stringify(packageInfo),
|
|
shouldShowBox: false
|
|
};
|
|
|
|
httpCall('packages/api/createPackagesData', displayMessageConfirmation, params);
|
|
} else {
|
|
utilsService.displayMessage('error', $translate.instant('packages.forms.messages.NO_PRODUCTS'));
|
|
}
|
|
} else {
|
|
utilsService.displayMessage('error', $translate.instant('packages.forms.messages.NO_REAL_PRODUCTS'));
|
|
}
|
|
|
|
function checkIfPackageHasRealProducts(product) {
|
|
return product.hasOwnProperty('real');
|
|
}
|
|
}
|
|
|
|
function displayMessageConfirmation(response) {
|
|
if (response.data.messageData) {
|
|
const translationDataMessages = {
|
|
country: $scope.countrySelected,
|
|
packageName: $scope.packageName,
|
|
packageReference: $scope.packageReference,
|
|
productsNumber: response.data.productsNumber,
|
|
field: response.data.messageData.field || ''
|
|
};
|
|
response.data.messageData.forEach(messageObj => {
|
|
if (messageObj.code === 'success') {
|
|
$scope.packageName = '';
|
|
$scope.packageReference = '';
|
|
$scope.packageDescription = '';
|
|
updateVirtualProducts(true);
|
|
} else {
|
|
translationDataMessages.field = messageObj.field || '';
|
|
translationDataMessages.limit = messageObj.limit || '';
|
|
}
|
|
|
|
if (messageObj.message === 'PACKAGE_NAME_EXISTS') {
|
|
$('#package-name').focus();
|
|
}
|
|
|
|
const message = $translate.instant('packages.forms.messages.' + messageObj.message, translationDataMessages);
|
|
utilsService.displayMessage(messageObj.code, message);
|
|
});
|
|
} else {
|
|
const errorMessage = $translate.instant('packages.forms.messages.SERVER_ERROR');
|
|
utilsService.displayMessage('error', errorMessage);
|
|
}
|
|
}
|
|
|
|
function searchTemplateSelected() {
|
|
return $scope.templates.find(info => {
|
|
return info.idTemplate === $scope.idSelectedPackageTemplate;
|
|
});
|
|
}
|
|
}
|
|
})();
|