SmartIT_Extensions/BMC/smart-it-full/scripts/app/resource/rs-directive.js

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;
};
}
};
}]);