Skip to content

Commit

Permalink
Catalog should not allow to pass multiple product descriptions with s…
Browse files Browse the repository at this point in the history
…ame both language & type #152
  • Loading branch information
anton-abyzov committed Aug 20, 2018
1 parent 4ee78a2 commit f8e2937
Show file tree
Hide file tree
Showing 6 changed files with 174 additions and 196 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,8 @@
"validations": {
"name-required": "Erforderlich",
"value-required": "Erforderlich",
"name-duplicate": "Doppelte Namen gefunden"
"name-duplicate": "Doppelte Namen gefunden",
"desc-duplicate": "Doppelte Beschreibung gefunden"
},
"placeholders": {
"name": "Bitte Namen eingeben",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,8 @@
"validations": {
"name-required": "Required",
"value-required": "Required",
"name-duplicate": "Duplicate name found"
"name-duplicate": "Duplicate name found",
"desc-duplicate": "Duplicate description found"
},
"placeholders": {
"name": "Please enter name",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,8 @@
"validations": {
"name-required": "Обязательное поле",
"value-required": "Обязательное поле",
"name-duplicate": "Найдено повторяющееся название"
"name-duplicate": "Найдено повторяющееся название",
"desc-duplicate": "Найдено повторяющееся описание"
},
"placeholders": {
"name": "Пожалуйста, введите название",
Expand Down
199 changes: 85 additions & 114 deletions VirtoCommerce.CatalogModule.Web/Scripts/blades/editorialReview-detail.js
Original file line number Diff line number Diff line change
@@ -1,131 +1,102 @@
angular.module('virtoCommerce.catalogModule')
.controller('virtoCommerce.catalogModule.editorialReviewDetailController', ['$scope', 'platformWebApp.bladeNavigationService', 'FileUploader', 'platformWebApp.settings', '$timeout',
function ($scope, bladeNavigationService, FileUploader, settings, $timeout) {
var blade = $scope.blade;

function initilize() {
if (!blade.item.reviews) {
blade.item.reviews = [];
};
if (!blade.currentEntity) {
blade.currentEntity = {};
};
.controller('virtoCommerce.catalogModule.editorialReviewDetailController', ['$scope', 'platformWebApp.bladeNavigationService', 'FileUploader', 'platformWebApp.settings', '$timeout',
function ($scope, bladeNavigationService, FileUploader, settings, $timeout) {
var blade = $scope.blade;

function initilize() {
if (!blade.item.reviews) {
blade.item.reviews = [];
};
if (!blade.currentEntity) {
blade.currentEntity = {};
};

blade.origEntity = blade.currentEntity;
blade.currentEntity = angular.copy(blade.currentEntity);
if (!blade.currentEntity.languageCode) {
blade.currentEntity.languageCode = blade.catalog.defaultLanguage.languageCode;
}

blade.origEntity = blade.currentEntity;
blade.currentEntity = angular.copy(blade.currentEntity);
if (!blade.currentEntity.languageCode) {
blade.currentEntity.languageCode = blade.catalog.defaultLanguage.languageCode;
$timeout(function () {
$scope.$broadcast('resetContent', { body: blade.currentEntity.content });
blade.isLoading = false;
});
}

$timeout(function () {
$scope.$broadcast('resetContent', { body: blade.currentEntity.content });
blade.isLoading = false;
});
}

$scope.isValid = true;

$scope.saveChanges = function () {
var existReview = _.find(blade.item.reviews, function (x) { return x == blade.origEntity; });
if (!existReview) {
blade.item.reviews.push(blade.origEntity);
};
angular.copy(blade.currentEntity, blade.origEntity);
$scope.bladeClose();
};

blade.headIcon = 'fa-comments';
blade.title = 'catalog.blades.editorialReview-detail.title';
blade.subtitle = 'catalog.blades.editorialReview-detail.subtitle';
blade.editAsMarkdown = true;
blade.hasAssetCreatePermission = bladeNavigationService.checkPermission('platform:asset:create');

if (blade.hasAssetCreatePermission) {
$scope.fileUploader = new FileUploader({
url: 'api/platform/assets?folderUrl=catalog/' + blade.item.code,
headers: { Accept: 'application/json' },
autoUpload: true,
removeAfterUpload: true,
onBeforeUploadItem: function (fileItem) {
blade.isLoading = true;
},
onSuccessItem: function (fileItem, response) {
$scope.$broadcast('filesUploaded', { items: response });
},
onErrorItem: function (fileItem, response, status) {
bladeNavigationService.setError(fileItem._file.name + ' failed: ' + (response.message ? response.message : status), blade);
},
onCompleteAll: function () {
blade.isLoading = false;
$scope.saveChanges = function () {

var isValid = $scope.isValid();
if (isValid) {
if (!blade.currentEntity.id)
blade.item.reviews.push(blade.currentEntity);
else {
_.extend(_.findWhere(blade.item.reviews, { id: blade.currentEntity.id }), blade.currentEntity);
}
angular.copy(blade.currentEntity, blade.origEntity);
$scope.bladeClose();
}
});
}

settings.getValues({ id: 'Catalog.EditorialReviewTypes' }, function (data) {
$scope.types = data;
if (!blade.currentEntity.reviewType) {
blade.currentEntity.reviewType = $scope.types[0];
}
});

$scope.openDictionarySettingManagement = function () {
var newBlade = new DictionarySettingDetailBlade('Catalog.EditorialReviewTypes');
newBlade.parentRefresh = function (data) {
$scope.types = data;
};
bladeNavigationService.showBlade(newBlade, blade);
};
$scope.isValid = function () {
var result = formScope && formScope.$valid;

var formScope;
$scope.setForm = function (form) { formScope = form; }
//Check duplicates for new editorial reviews
result = !_.any(blade.item.reviews, function (x) {
return (x.id !== blade.currentEntity.id || (!x.id && !blade.currentEntity.id)) // 1st check is for edit mode, 2nd is for adding to prevent multiple same descs to be added
&& x.reviewType === blade.currentEntity.reviewType && x.languageCode === blade.currentEntity.languageCode;
});

blade.toolbarCommands = [
{
name: "platform.commands.save", icon: 'fa fa-save',
executeMethod: saveChanges,
canExecuteMethod: canSave
},
{
name: "platform.commands.reset", icon: 'fa fa-undo',
executeMethod: function () {
angular.copy(blade.origEntity, blade.currentEntity);
$scope.$broadcast('resetContent', { body: blade.currentEntity.content });
},
canExecuteMethod: isDirty
return result;
}
];

function saveChanges() {
var existReview = _.find(blade.item.reviews, function (x) { return x === blade.origEntity; });
if (!existReview) {
blade.item.reviews.push(blade.origEntity);
};

angular.copy(blade.currentEntity, blade.origEntity);
}

function isDirty() {
return !angular.equals(blade.currentEntity, blade.origEntity);
};
blade.headIcon = 'fa-comments';
blade.title = 'catalog.blades.editorialReview-detail.title';
blade.subtitle = 'catalog.blades.editorialReview-detail.subtitle';
blade.editAsMarkdown = true;
blade.hasAssetCreatePermission = bladeNavigationService.checkPermission('platform:asset:create');

if (blade.hasAssetCreatePermission) {
$scope.fileUploader = new FileUploader({
url: 'api/platform/assets?folderUrl=catalog/' + blade.item.code,
headers: { Accept: 'application/json' },
autoUpload: true,
removeAfterUpload: true,
onBeforeUploadItem: function (fileItem) {
blade.isLoading = true;
},
onSuccessItem: function (fileItem, response) {
$scope.$broadcast('filesUploaded', { items: response });
},
onErrorItem: function (fileItem, response, status) {
bladeNavigationService.setError(fileItem._file.name + ' failed: ' + (response.message ? response.message : status), blade);
},
onCompleteAll: function () {
blade.isLoading = false;
}
});
}

function canSave() {
var thisBlade = blade;

var existing = blade.item.reviews.filter(function (x) {
return x.id && thisBlade.currentEntity && x.languageCode === thisBlade.currentEntity.languageCode && x.reviewType === thisBlade.currentEntity.reviewType;
settings.getValues({ id: 'Catalog.EditorialReviewTypes' }, function (data) {
$scope.types = data;
if (!blade.currentEntity.reviewType) {
blade.currentEntity.reviewType = $scope.types[0];
}
});

var justAdded = blade.item.reviews.filter(function (x) { return !x.id });
var existingInJustAdded = justAdded.filter(function (x) {
return thisBlade.currentEntity && x.languageCode === thisBlade.currentEntity.languageCode && x.reviewType === thisBlade.currentEntity.reviewType;
});
$scope.openDictionarySettingManagement = function () {
var newBlade = new DictionarySettingDetailBlade('Catalog.EditorialReviewTypes');
newBlade.parentRefresh = function (data) {
$scope.types = data;
};
bladeNavigationService.showBlade(newBlade, blade);
};

return isDirty() && formScope && formScope.$valid && existing.length === 0 && existingInJustAdded.length === 0;
}
var formScope;
$scope.setForm = function (form) { formScope = form; }

blade.onClose = function (closeCallback) {
bladeNavigationService.showConfirmationIfNeeded(isDirty(), canSave(), blade, saveChanges, closeCallback, "catalog.dialogs.review-save.title", "catalog.dialogs.review-save.message");
};
function isDirty() {
return !angular.equals(blade.currentEntity, blade.origEntity);
};

initilize();
}]);
initilize();
}]);
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
<div class="blade-content __xxlarge-wide">
<div class="blade-static __bottom" ng-include="'Modules/$(VirtoCommerce.Catalog)/Scripts/blades/common/templates/ok-cancel.tpl.html'"></div>
<div class="blade-content __xxlarge-wide">
<div class="blade-inner">
<div class="inner-block">
<form class="form" name="editorialReviewsForm">
<div class="form-error" ng-if="!isValid()">
<span>{{ 'catalog.blades.property-attributes.validations.desc-duplicate' | translate }}</span>
</div>
<div class="form-group" ng-init="setForm(editorialReviewsForm)">
<label class="form-label">{{ 'catalog.blades.editorialReview-detail.labels.type' | translate }} <a href="" ng-click="openDictionarySettingManagement()" class="form-edit" va-permission="platform:setting:update"><i class="form-ico fa fa-pencil"></i></a></label>
<div class="form-input">
<ui-select ng-model="blade.currentEntity.reviewType" ng-disabled="disabled">
<ui-select required ng-model="blade.currentEntity.reviewType" ng-disabled="disabled">
<ui-select-match placeholder="{{'catalog.blades.editorialReview-detail.placeholders.type' | translate}}">{{$select.selected}}</ui-select-match>
<ui-select-choices repeat="x in types | filter: $select.search">
<span ng-bind-html="x | highlight: $select.search"></span>
Expand All @@ -32,4 +36,4 @@
</form>
</div>
</div>
</div>
</div>
Loading

0 comments on commit f8e2937

Please sign in to comment.