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