Files
old-wiaas-legacy/api-wiaas/client/js/components/packages/package-options.directive.js
2018-06-11 11:09:35 +02:00

274 lines
10 KiB
JavaScript

(function () {
global.dashModule
.directive('packageOptions', packageOptionsDirective)
.controller('packageOptionsCtrl', ['$scope', '$', '$http', '$translate', 'utilsService', packageOptionsCtrl]);
function packageOptionsDirective() {
return {
restrict: 'E',
templateUrl: 'packages/html/packageOptionsTemplate'
};
}
function packageOptionsCtrl($scope, $, $http, $translate, utilsService) {
let groupCounter = 0;
$scope.getOptionsAndPackages = getOptionsAndPackages;
$scope.selectPackage = selectPackage;
$scope.getPackageClass = getPackageClass;
$scope.isDefault = isDefault;
$scope.addGroup = addGroup;
$scope.removeGroup = removeGroup;
$scope.packageDragStart = packageDragStart;
$scope.packageDragStop = packageDragStop;
$scope.packageOptionAdded = packageOptionAdded;
$scope.packageOptionRemoved = packageOptionRemoved;
$scope.setDefaultOption = setDefaultOption;
$scope.updatePackageOptions = updatePackageOptions;
$scope.packageAdditionalAdded = packageAdditionalAdded;
$scope.packageAdditionalRemoved = packageAdditionalRemoved;
$scope.getPackageWarningClass = getPackageWarningClass;
$scope.options = [];
$scope.standardPackages = [];
$scope.selectedPackage = {};
function getOptionsAndPackages() {
$http({
method: 'POST',
url: 'packages/api/getOptionsAndPackages'
}).then(setDocumentsAndPackages, utilsService.onHttpError);
}
function setDocumentsAndPackages(response) {
if (response.data && response.data.option && response.data.standard && response.data.additional) {
const selectedKey = Object.keys(response.data.standard)[0];
$scope.options = response.data.options;
$scope.selectedPackage = response.data.standard[selectedKey] || {};
$scope.standardPackages = response.data.standard;
$scope.options = response.data.option;
$scope.additionalPackages = response.data.additional;
if(selectedKey){
chekPricesForSelectedPackage();
}
$scope.options.forEach(hideOptionPackages);
$scope.additionalPackages.forEach(hideOptionPackages);
} else {
$scope.options = [];
$scope.standardPackages = [];
$scope.additionalPackages = [];
}
}
function chekPricesForSelectedPackage(){
$scope.selectedPackage.groups.forEach((group) => {
group.options.forEach((option) => {
option.hasAllPrices = $scope.selectedPackage.prices.length === option.prices.length &&
$scope.selectedPackage.prices.every((value, i) => value === option.prices[i]);
});
});
$scope.selectedPackage.additionalPackages.forEach((additionalPackage) => {
additionalPackage.hasAllPrices = $scope.selectedPackage.prices.length === additionalPackage.prices.length &&
$scope.selectedPackage.prices.every((value, i) => value === additionalPackage.prices[i]);
});
}
function hideOptionPackages(currentPackage) {
const ID_OPTION_TYPE = 2;
const ID_ADDITIONAL_TYPE = 3;
let iscurrentPackageInArray = false;
if (currentPackage.countryCode !== $scope.selectedPackage.countryCode) {
currentPackage.isAvailable = false;
return;
}
currentPackage.hasAllPrices = $scope.selectedPackage.prices.length === currentPackage.prices.length &&
$scope.selectedPackage.prices.every((value, i) => value === currentPackage.prices[i]);
if ($scope.selectedPackage.groups && parseInt(currentPackage.idPackageType) === ID_OPTION_TYPE) {
$scope.selectedPackage.groups.forEach((group) => {
iscurrentPackageInArray = iscurrentPackageInArray || findOptionPackage(group, currentPackage);
});
}
if ($scope.selectedPackage.additionalPackages && parseInt(currentPackage.idPackageType) === ID_ADDITIONAL_TYPE) {
iscurrentPackageInArray = $scope.selectedPackage.additionalPackages.find((additional) => {
return additional.idPackage === currentPackage.idPackage;
});
}
currentPackage.isAvailable = !iscurrentPackageInArray;
}
function findOptionPackage(group, currentPackage) {
return group.options.find((option) => {
return option.idPackage === currentPackage.idPackage;
});
}
function selectPackage(selected) {
$scope.selectedPackage = selected;
chekPricesForSelectedPackage();
$scope.options.forEach(hideOptionPackages);
$scope.additionalPackages.forEach(hideOptionPackages);
}
function getPackageClass(curent) {
return curent === $scope.selectedPackage ? 'selected-package' : '';
}
function isDefault(option) {
return parseInt(option.isDefault) === 1;
}
function generateGroup() {
groupCounter++;
return {
groupName: '',
idGroup: 'new-' + groupCounter,
isNewGroup: 1,
options: []
};
}
function addGroup() {
$scope.selectedPackage.groups.push(generateGroup());
}
function removeGroup(index) {
$scope.selectedPackage.groups.splice(index, 1);
$scope.options.forEach(hideOptionPackages);
}
function packageDragStart(event, ui, selector) {
$('#' + selector).css({
overflow: 'visible',
});
$('.' + $(ui.helper).attr('drop-to')).css({
background: 'rgba(92, 184, 92, 0.3)'
});
}
function packageDragStop(event, ui, selector) {
$('#' + selector).css({
'overflow': 'auto'
});
$('.' + $(ui.helper).attr('drop-to')).css({
background: 'none'
});
}
function packageOptionRemoved(event, ui, dropContainer) {
const dropToSelector = $(ui.helper).attr('drop-to');
const idPackage = $(ui.helper).attr('id-option-package');
const idGroup = $(ui.helper).attr('id-group');
if (dropContainer !== dropToSelector) {
return;
}
const group = $scope.selectedPackage.groups.find((group) => {
return group.idGroup === idGroup;
});
const dragedPackageIndex = group.options.findIndex((pkg) => {
return pkg.idPackage === idPackage;
});
const wasDefault = parseInt(group.options[dragedPackageIndex].isDefault) === 1;
group.options.splice(dragedPackageIndex, 1);
if (wasDefault && group.options.length) {
setDefaultOption(group, group.options[0]);
}
$scope.options.forEach(hideOptionPackages);
}
function packageOptionAdded(event, ui, dropContainer, group) {
const dropToSelector = $(ui.helper).attr('drop-to');
const idPackage = $(ui.helper).attr('id-option-package');
if (dropContainer !== dropToSelector) {
return;
}
const dragedPackage = $scope.options.find((pkg) => {
return pkg.idPackage === idPackage;
});
dragedPackage.isDefault = group.options.length ? 0 : 1;
group.options.push(dragedPackage);
$scope.options.forEach(hideOptionPackages);
}
function packageAdditionalRemoved(event, ui, dropContainer) {
const dropToSelector = $(ui.helper).attr('drop-to');
const idPackage = $(ui.helper).attr('id-additional-package');
const additionalList = $scope.selectedPackage.additionalPackages;
if (dropContainer !== dropToSelector) {
return;
}
const dragedPackageIndex = additionalList.findIndex((pkg) => {
return pkg.idPackage === idPackage;
});
additionalList.splice(dragedPackageIndex, 1);
$scope.additionalPackages.forEach(hideOptionPackages);
}
function packageAdditionalAdded(event, ui, dropContainer) {
const dropToSelector = $(ui.helper).attr('drop-to');
const idPackage = $(ui.helper).attr('id-additional-package');
if (dropContainer !== dropToSelector) {
return;
}
const dragedPackage = $scope.additionalPackages.find((pkg) => {
return pkg.idPackage === idPackage;
});
$scope.selectedPackage.additionalPackages.push(dragedPackage);
$scope.additionalPackages.forEach(hideOptionPackages);
}
function setDefaultOption(group, option) {
group.options.forEach((opt) => {
opt.isDefault = 0;
});
option.isDefault = 1;
}
function updatePackageOptions() {
const params = $.param({
idPackage: $scope.selectedPackage.idPackage,
groups: JSON.stringify($scope.selectedPackage.groups),
additionalPackages: JSON.stringify($scope.selectedPackage.additionalPackages)
});
$http({
method: 'POST',
url: 'packages/api/updatePackageOptions',
data: params
}).then(updateMessage, utilsService.onHttpError);
}
function updateMessage(response) {
if (typeof response.data.messages !== 'undefined') {
response.data.messages.forEach((messageObj) => {
const key = messageObj.key ? messageObj.key : '';
let translatedMessage = $translate.instant('packages.messages.' + messageObj.message);
translatedMessage = key !== '' ? key + ': ' + translatedMessage : translatedMessage;
utilsService.displayMessage(messageObj.code, translatedMessage);
});
}
}
function getPackageWarningClass(arePricesAvailable) {
return arePricesAvailable ? '' : 'alert-warning';
}
}
})();