344 lines
22 KiB
JavaScript
344 lines
22 KiB
JavaScript
"use strict";
|
|
/**
|
|
* Created by viktor.shevchenko on 7/9/15.
|
|
*/
|
|
angular.module('resourceModule')
|
|
.directive('rs', ['$state', '$q', '$filter', '$timeout', 'relationModel', 'ticketModel', '$templateCache', 'attachmentService', 'systemAlertService', 'events', '$http', '$compile', 'knowledgeArticleModel', 'objectValueMapperService',
|
|
function ($state, $q, $filter, $timeout, relationModel, ticketModel, $templateCache, attachmentService, systemAlertService, events, $http, $compile, knowledgeArticleModel, objectValueMapperService) {
|
|
return {
|
|
restrict: 'E',
|
|
templateUrl: 'views/resource/rs.html',
|
|
transclude: true,
|
|
scope: {
|
|
context: '=',
|
|
savedTemplate: '=',
|
|
kcsAssessMode: '='
|
|
},
|
|
controller: ['$scope', '$rootScope', function ($scope, $rootScope) {
|
|
$scope.state = {
|
|
savingResource: false,
|
|
kaSearchEnabled: false,
|
|
isPreviewInjected: false,
|
|
watcherOn: false
|
|
};
|
|
function versionChangeWatch() {
|
|
if (!$scope.state.watcherOn) {
|
|
$scope.state.watcherOn = true;
|
|
$scope.$on(events.SET_PREVIEW_ITEM, function (event, previewItem) {
|
|
if (previewItem && previewItem.id && previewItem.type) {
|
|
$scope.resourcePreviewItem = previewItem;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
this.isKaSearchEnabled = function () {
|
|
return $scope.state.kaSearchEnabled;
|
|
};
|
|
this.isResourceRelated = function (resource) {
|
|
var contextRelations = relationModel.cache[$scope.context.id];
|
|
if (!contextRelations) {
|
|
return false;
|
|
}
|
|
return _.find(contextRelations, { id: resource.id });
|
|
};
|
|
this.handleKeydown = function ($event, resource) {
|
|
if ($event.keyCode === 32) { // space key
|
|
this.toggleRelation(resource);
|
|
$event.preventDefault();
|
|
$event.stopPropagation();
|
|
}
|
|
};
|
|
this.toggleRelation = function (resource) {
|
|
if ($scope.context.accessMappings.relationsEditAllowed) {
|
|
this.isResourceRelated(resource) ? this.deleteFromTicket(resource) : this.saveToTicket(resource);
|
|
}
|
|
};
|
|
this.saveToTicket = function (resourceItem, options) {
|
|
if ($scope.context.type === EntityVO.TYPE_SMARTRECORDER || $scope.context.isDraft) { //smart recorder of draft ticket
|
|
$scope.$emit(events.SAVE_TO_TICKET_FROM_RS, resourceItem);
|
|
return;
|
|
}
|
|
if ($scope.kcsAssessMode) {
|
|
resourceItem.relationshipType = RelationItemVO.TYPE_DUPLICATEOF;
|
|
}
|
|
else if ($scope.context.type === EntityVO.TYPE_KNOWLEDGE && resourceItem.type === EntityVO.TYPE_KNOWLEDGE) {
|
|
resourceItem.relationshipType = RelationItemVO.TYPE_REFERENCES;
|
|
}
|
|
$scope.state.savingResource = true;
|
|
var parent = {
|
|
type: $scope.context.type,
|
|
uuid: $scope.context.id
|
|
}, data = {
|
|
id: resourceItem.id,
|
|
desc: resourceItem.title ? resourceItem.title : resourceItem.desc,
|
|
type: resourceItem.type,
|
|
tag: EntityVO.TYPE_RESOURCE,
|
|
relationshipType: resourceItem.relationshipType ? resourceItem.relationshipType : EntityVO.TYPE_RELATEDTO
|
|
};
|
|
if (options && _.isObject(options)) {
|
|
angular.extend(data, options);
|
|
}
|
|
return relationModel.addRelation(parent, [data]).then(function () {
|
|
resourceItem.tag = data.tag; //set tag to indicate that it's already related on the UI
|
|
if (data.type === EntityVO.TYPE_KNOWLEDGE) {
|
|
delete relationModel.cache[data.id]; //Delete cache entry for the knowledge-ticket relation to fetch it fresh from backend.
|
|
}
|
|
}).catch(notifyOnErrorDuringRelation).finally(function () {
|
|
$scope.state.savingResource = false;
|
|
});
|
|
};
|
|
this.deleteFromTicket = function (resourceItem) {
|
|
if (($scope.context.type === EntityVO.TYPE_SMARTRECORDER || $scope.context.isDraft)) {
|
|
$scope.$emit(events.REMOVE_FROM_TICKET_FROM_RS, resourceItem);
|
|
return;
|
|
}
|
|
$scope.state.savingResource = true;
|
|
var parent = {
|
|
parentType: $scope.context.type,
|
|
parentId: $scope.context.id
|
|
}, data = {
|
|
id: (resourceItem.type === EntityVO.TYPE_OUTAGE) ? resourceItem.displayId : resourceItem.id,
|
|
type: resourceItem.type,
|
|
tag: resourceItem.tag ? resourceItem.tag : EntityVO.TYPE_RESOURCE,
|
|
relationshipType: resourceItem.relationshipType ? resourceItem.relationshipType : EntityVO.TYPE_RELATEDTO
|
|
};
|
|
relationModel.removeRelation(parent, [data]).finally(function () {
|
|
$scope.state.savingResource = false;
|
|
delete resourceItem.tag;
|
|
if (data.type === EntityVO.TYPE_KNOWLEDGE) {
|
|
delete relationModel.cache[data.id];
|
|
}
|
|
});
|
|
};
|
|
this.deleteMultipleFromTicket = function (resourceItems) {
|
|
$scope.state.savingResource = true;
|
|
var parent = {
|
|
parentType: $scope.context.type,
|
|
parentId: $scope.context.id
|
|
}, data = [];
|
|
_.forEach(resourceItems, function (item) {
|
|
var resObj = {
|
|
id: item.id,
|
|
type: item.type,
|
|
tag: item.tag ? item.tag : EntityVO.TYPE_RESOURCE,
|
|
relationshipType: item.relationshipType
|
|
};
|
|
data.push(resObj);
|
|
});
|
|
relationModel.removeRelation(parent, data).catch(notifyOnErrorDuringRelation).finally(function () {
|
|
$scope.state.savingResource = false;
|
|
_.forEach(resourceItems, function (resourceItem) {
|
|
delete resourceItem.tag;
|
|
});
|
|
});
|
|
};
|
|
this.saveAndResolve = function (resourceItem) {
|
|
$scope.resourcePreviewItem = null; //close preview if opened
|
|
var updateCategories = {
|
|
resolution: false,
|
|
resolutionProduct: false
|
|
}, showMessage, modalInstance, knowledgeCategory, allCategories;
|
|
if (resourceItem.relationshipType !== EntityVO.TYPE_RESOLVED) {
|
|
resourceItem.relationshipType = EntityVO.TYPE_RESOLVED;
|
|
}
|
|
if ($scope.context.type === EntityVO.TYPE_SMARTRECORDER || $scope.context.isDraft) {
|
|
allCategories = $scope.context.categorizations;
|
|
}
|
|
else {
|
|
allCategories = $scope.context.resCategorizations;
|
|
}
|
|
knowledgeArticleModel.getKnowledgeArticleById(resourceItem.id, false, true).then(function (knowledgeDetails) {
|
|
_.forEach(allCategories, function (ticketCategory) {
|
|
if (ticketCategory.name === 'resolutionProduct') {
|
|
knowledgeCategory = _.find(knowledgeDetails.categorizations, { name: 'product' });
|
|
if (knowledgeCategory && knowledgeCategory.tiers) {
|
|
if (knowledgeCategory.tiers.productCategoryTier1 == null) {
|
|
knowledgeCategory.tiers.productCategoryTier1 = '';
|
|
}
|
|
if (knowledgeCategory.tiers.productCategoryTier2 == null) {
|
|
knowledgeCategory.tiers.productCategoryTier2 = '';
|
|
}
|
|
if (knowledgeCategory.tiers.productCategoryTier3 == null) {
|
|
knowledgeCategory.tiers.productCategoryTier3 = '';
|
|
}
|
|
if (knowledgeCategory.tiers.productName == null) {
|
|
knowledgeCategory.tiers.productName = '';
|
|
}
|
|
if (knowledgeCategory.tiers.productModelVersion == null) {
|
|
knowledgeCategory.tiers.productModelVersion = '';
|
|
}
|
|
}
|
|
if (!(knowledgeCategory && knowledgeCategory.tiers && knowledgeCategory.tiers.productCategoryTier1)) {
|
|
updateCategories.resolutionProduct = false;
|
|
showMessage = false;
|
|
}
|
|
else if (!(ticketCategory.tiers && ticketCategory.tiers.resProductCategoryTier1)) {
|
|
updateCategories.resolutionProduct = true;
|
|
showMessage = showMessage ? showMessage : false;
|
|
}
|
|
else if (ticketCategory.tiers.resProductCategoryTier1 == knowledgeCategory.tiers.productCategoryTier1
|
|
&& ticketCategory.tiers.resProductCategoryTier2 == knowledgeCategory.tiers.productCategoryTier2
|
|
&& ticketCategory.tiers.resProductCategoryTier3 == knowledgeCategory.tiers.productCategoryTier3
|
|
&& ticketCategory.tiers.resProductName == knowledgeCategory.tiers.productName
|
|
&& ticketCategory.tiers.resProductModelVersion == knowledgeCategory.tiers.productModelVersion) {
|
|
updateCategories.resolutionProduct = false;
|
|
showMessage = showMessage ? showMessage : false;
|
|
}
|
|
else {
|
|
updateCategories.resolutionProduct = true;
|
|
showMessage = true;
|
|
}
|
|
}
|
|
if (ticketCategory.name === 'resolution') {
|
|
knowledgeCategory = _.find(knowledgeDetails.categorizations, { name: EntityVO.CATEGORY_OPERATIONAL });
|
|
if (knowledgeCategory && knowledgeCategory.tiers) {
|
|
if (knowledgeCategory.tiers.operationCategoryTier1 == null) {
|
|
knowledgeCategory.tiers.operationCategoryTier1 = '';
|
|
}
|
|
if (knowledgeCategory.tiers.operationCategoryTier2 == null) {
|
|
knowledgeCategory.tiers.operationCategoryTier2 = '';
|
|
}
|
|
if (knowledgeCategory.tiers.operationCategoryTier3 == null) {
|
|
knowledgeCategory.tiers.operationCategoryTier3 = '';
|
|
}
|
|
}
|
|
if (!(knowledgeCategory && knowledgeCategory.tiers && knowledgeCategory.tiers.operationCategoryTier1) ||
|
|
(ticketCategory.tiers && ticketCategory.tiers.resOperationCategoryTier1 == knowledgeCategory.tiers.operationCategoryTier1
|
|
&& ticketCategory.tiers.resOperationCategoryTier2 == knowledgeCategory.tiers.operationCategoryTier2
|
|
&& ticketCategory.tiers.resOperationCategoryTier3 == knowledgeCategory.tiers.operationCategoryTier3)) {
|
|
updateCategories.resolution = false;
|
|
showMessage = showMessage ? showMessage : false;
|
|
}
|
|
else if (!(ticketCategory.tiers && ticketCategory.tiers.resOperationCategoryTier1)) {
|
|
updateCategories.resolution = true;
|
|
showMessage = showMessage ? showMessage : false;
|
|
}
|
|
else {
|
|
updateCategories.resolution = true;
|
|
showMessage = true;
|
|
}
|
|
}
|
|
});
|
|
if (showMessage) {
|
|
modalInstance = systemAlertService.modal({
|
|
type: 'info',
|
|
title: 'Warning',
|
|
text: $filter('i18n')('resourceSlice.categoryMismatch.message'),
|
|
buttons: [
|
|
{
|
|
text: $filter('i18n')('common.button.yes'),
|
|
data: true
|
|
},
|
|
{
|
|
text: $filter('i18n')('common.button.no'),
|
|
data: false
|
|
}
|
|
]
|
|
});
|
|
modalInstance.result.then(function (result) {
|
|
if (result) {
|
|
knowledgeDetails.updateCategories = true;
|
|
}
|
|
else {
|
|
knowledgeDetails.updateCategories = false;
|
|
}
|
|
$scope.saveToTicket(resourceItem);
|
|
if ($scope.context.type === EntityVO.TYPE_SMARTRECORDER || $scope.context.isDraft) {
|
|
$scope.$emit(events.RESOLVE_TICKET_FROM_RS, resourceItem, knowledgeDetails); //told draft ticket to be created with Resolved status
|
|
}
|
|
else {
|
|
$scope.$emit(events.TICKET_PROFILE_RESEND_EVENT, {
|
|
eventName: events.RESOLVE_TICKET_FROM_RS,
|
|
//data: resourceItem.title || resourceItem.desc
|
|
data: knowledgeDetails
|
|
}); //told ticket to update its status to Resolved
|
|
}
|
|
});
|
|
}
|
|
else {
|
|
resourceItem.updateCategories = updateCategories.resolution || updateCategories.resolutionProduct;
|
|
knowledgeDetails.updateCategories = resourceItem.updateCategories;
|
|
$scope.saveToTicket(resourceItem);
|
|
if ($scope.context.type === EntityVO.TYPE_SMARTRECORDER || $scope.context.isDraft) {
|
|
$scope.$emit(events.RESOLVE_TICKET_FROM_RS, resourceItem, knowledgeDetails); //told draft ticket to be created with Resolved status
|
|
}
|
|
else {
|
|
$scope.$emit(events.TICKET_PROFILE_RESEND_EVENT, {
|
|
eventName: events.RESOLVE_TICKET_FROM_RS,
|
|
//data: resourceItem.title || resourceItem.desc
|
|
data: knowledgeDetails
|
|
}); //told ticket to update its status to Resolved
|
|
}
|
|
}
|
|
});
|
|
};
|
|
this.linkAsDuplicateOf = function (resourceItem) {
|
|
$scope.resourcePreviewItem = null; //close preview if opened
|
|
if ($scope.context.type === EntityVO.TYPE_SMARTRECORDER || $scope.context.isDraft) {
|
|
$scope.$emit(events.MARK_AS_DUPLICATE_OF_FROM_RS, resourceItem);
|
|
}
|
|
else {
|
|
$scope.resourcePreviewItem = null;
|
|
$scope.saveToTicket(resourceItem, {
|
|
tag: EntityVO.TYPE_LINKEDITEM,
|
|
relationshipType: EntityVO.TYPE_DUPLICATEOF
|
|
}).then(function () {
|
|
$scope.$emit(events.TICKET_PROFILE_RESEND_EVENT, { eventName: events.MARK_AS_DUPLICATE_OF_FROM_RS });
|
|
});
|
|
}
|
|
};
|
|
this.setPreviewItem = function (resource) {
|
|
if (objectValueMapperService.isShelvedParentEmpty() && resource.type !== EntityVO.TYPE_KNOWLEDGE && $scope.context.type !== EntityVO.TYPE_KNOWLEDGE) {
|
|
objectValueMapperService.shelveAsParent();
|
|
}
|
|
if (resource.type === EntityVO.TYPE_KNOWLEDGE) {
|
|
versionChangeWatch();
|
|
markArticleVisited(resource);
|
|
}
|
|
if (!$scope.state.isPreviewInjected) {
|
|
$scope.showResourcePreviewElement(resource);
|
|
}
|
|
else {
|
|
$scope.resourcePreviewItem = resource;
|
|
}
|
|
$rootScope.$broadcast(events.DISMISS_NOTE_FORM, {});
|
|
};
|
|
function markArticleVisited(searchItem) {
|
|
if (!searchItem.visited) {
|
|
knowledgeArticleModel.markArticleVisited(searchItem.id, $scope.context.id);
|
|
searchItem.visited = true;
|
|
}
|
|
}
|
|
this.isResourcePreview = function (resource) {
|
|
if (!$scope.resourcePreviewItem) {
|
|
return false;
|
|
}
|
|
return $scope.resourcePreviewItem.id === resource.id;
|
|
};
|
|
this.toggleSearchKa = function () {
|
|
if ($scope.state.kaSearchEnabled) {
|
|
$scope.$broadcast(events.REFRESH_RECOMMENDED_KNOWLEDGE);
|
|
}
|
|
$scope.state.kaSearchEnabled = !$scope.state.kaSearchEnabled;
|
|
};
|
|
function notifyOnErrorDuringRelation(error) {
|
|
systemAlertService.error({
|
|
text: error.data.errorCode ? $filter('i18n')('error.unknown') : (error.data.error || error.data.results.error)
|
|
});
|
|
}
|
|
this.context = $scope.context;
|
|
$scope.toggleSearchKa = this.toggleSearchKa;
|
|
$scope.saveToTicket = this.saveToTicket;
|
|
$scope.deleteFromTicket = this.deleteFromTicket;
|
|
$scope.saveAndResolve = this.saveAndResolve;
|
|
$scope.linkAsDuplicateOf = this.linkAsDuplicateOf;
|
|
}],
|
|
link: function (scope) {
|
|
scope.showResourcePreviewElement = function (resource) {
|
|
scope.state.isPreviewInjected = true;
|
|
scope.resourcePreviewItem = resource;
|
|
};
|
|
}
|
|
};
|
|
}]);
|