SmartIT_Extensions/BMC/smart-it-full-helix/scripts/app/common/edit-affected-assets.js

320 lines
18 KiB
JavaScript

"use strict";
/**
* Created by igor.samulenko on 7/24/2014.
*/
(function () {
'use strict';
angular.module('myitsmApp')
.directive('editAffectedAssets', ['events', function (events) {
return {
restrict: 'E',
templateUrl: 'views/common/edit-affected-assets.html',
replace: true,
scope: {
ticket: '=',
metaData: '=',
isDraft: '=',
updateIsHandledByParent: '='
},
controller: ['$scope', '$state', 'assetService', 'ticketModel', 'categoriesService', '$timeout',
function ($scope, $state, assetService, ticketModel, categoriesService, $timeout) {
$scope.type = $scope.ticket.type;
var ticket = $scope.ticket;
var metaData = $scope.metaData;
var editedData = {};
if ($scope.type !== EntityVO.TYPE_WORKORDER && $scope.type !== EntityVO.TYPE_CHANGE && $scope.type !== EntityVO.TYPE_RELEASE && ticket.causalCI) {
if (ticket.causalCI) {
editedData.selectedAsset = ticket.causalCI && ticket.causalCI.name ? ticket.causalCI : '';
}
}
if ($scope.type !== EntityVO.TYPE_CHANGE || $scope.type !== EntityVO.TYPE_RELEASE && ticket.impactedService) {
if (ticket.impactedService) {
editedData.selectedService = ticket.impactedService.name;
}
}
if (editedData.selectedAsset) {
editedData.oldAssetValue = editedData.selectedAsset;
if (editedData.oldAssetValue !== null) {
editedData.isAssetRetained = true;
}
}
var state = {
pendingAffectedServiceChange: false,
pendingAffectedAssetChange: false
};
$scope.state = state;
$scope.onAffectedServiceChange = function () {
state.pendingAffectedServiceChange = true;
$scope.state.isServiceTooltipOpen = false;
};
$scope.$watch('editedData.selectedService', function () {
if (editedData && _.isObject(editedData.selectedService)) {
$scope.onAffectedServiceChange();
if ($scope.ticket.type === EntityVO.TYPE_PROBLEM || $scope.ticket.type === EntityVO.TYPE_KNOWNERROR) {
ticket.oldImpactedService = ticket.impactedService;
ticket.impactedService = editedData.selectedService;
}
$scope.$emit(events.AFFECTED_SERVICE_UPDATED, editedData.selectedService);
}
}, true);
$scope.onAffectedAssetChange = function () {
state.pendingAffectedAssetChange = true;
$scope.state.isAssetTooltipOpen = false;
};
$scope.$watch('editedData.selectedAsset', function () {
if (editedData && _.isObject(editedData.selectedAsset)) {
if (!editedData.selectedAsset.name) {
editedData.selectedAsset = '';
return;
}
$scope.onAffectedAssetChange();
$scope.$emit(events.AFFECTED_ASSET_UPDATED, editedData.selectedAsset);
}
});
/**
* Handle successful affected assets update
*
* @param response
*/
function handleSuccessAffectedAssetsUpdate(response) {
if (_.isEmpty(response)) {
return;
}
ticket.impactedService = response.impactedService && response.impactedService.name ? response.impactedService : {};
ticket.causalCI = response.causalCI && response.causalCI.name ? response.causalCI : {};
//On categories edit update
ticket.categorizations = angular.copy(response.categorizations);
var allEntityCategories = ticket.categorizations;
if (!!ticket.resCategorizations && ticket.isClosed()) {
allEntityCategories = ticket.categorizations.concat(response.resCategorizations);
}
else if (ticket.type === EntityVO.TYPE_INCIDENT) {
ticket.categorizations.push(_.find(response.resCategorizations, { 'name': 'resolutionProduct' }));
ticket.categorizations.push(_.find(response.resCategorizations, { 'name': 'resolution' }));
allEntityCategories = ticket.categorizations;
}
ticket.allCategories = categoriesService.populateCategories(allEntityCategories, metaData);
ticket.noCategories = (_.filter(ticket.allCategories, 'valueToShow')).length;
}
/**
* Handle successful affected service update
*
* @param response
*/
function handleSuccessAffectedServiceUpdate(response) {
if (_.isEmpty(response)) {
return;
}
if (state.pendingAffectedServiceChange) {
$scope.$emit(events.AFFECTED_SERVICE_UPDATE_SAVED);
}
}
$scope.editedData = editedData;
/**
* Collect changes
* @returns {Object}
*/
function collectChanges() {
var changes = {};
var selectedService = editedData.selectedService;
if (state.pendingAffectedServiceChange) {
if (angular.isObject(selectedService)) {
changes.impactedService = selectedService.name;
changes.impactedServiceReconId = selectedService.reconciliationId;
}
else {
changes.impactedService = '';
changes.impactedServiceReconId = '';
}
}
if ($scope.type !== EntityVO.TYPE_WORKORDER && state.pendingAffectedAssetChange) {
var selectedAsset = editedData.selectedAsset;
if (angular.isObject(selectedAsset)) {
changes.causalCI = selectedAsset.name;
changes.causalCIreconId = selectedAsset.reconciliationId;
if (!editedData.isAssetRetained && editedData.oldAssetValue) {
changes.previousCausalCI = editedData.oldAssetValue.name;
changes.previousCausalCIreconId = editedData.oldAssetValue.reconciliationId;
}
editedData.oldAssetValue = selectedAsset;
}
else {
changes.causalCI = '';
changes.causalCIreconId = '';
editedData.oldAssetValue = null;
}
editedData.isAssetRetained = true;
}
return changes;
}
/**
* Update affected service and asset
* @param changes
* @returns {*}
*/
function updateAffectedAssets(changes) {
return ticketModel.update(ticket.id, ticket.type, changes);
}
function applyChanges() {
ticket = $scope.ticket; //ticket value gets updated in case of status change.
if (angular.isObject(editedData.selectedService)) {
ticket.impactedService = editedData.selectedService;
}
else if (editedData.selectedService === '') {
ticket.impactedService = {};
}
if (angular.isObject(editedData.selectedAsset)) {
ticket.causalCI = editedData.selectedAsset;
}
else if (editedData.selectedAsset === '') {
ticket.causalCI = {};
}
}
/**
* Save changes
* @returns {*}
*/
$scope.save = function () {
var changes = collectChanges();
var isDraft = $scope.isDraft;
var singleMode = !$scope.updateIsHandledByParent;
$scope.$emit(events.SAVE_CHANGES_REQUEST, changes, singleMode || isDraft);
if (_.size(changes)) {
if (isDraft) {
applyChanges();
closeEditor();
}
else {
if (singleMode) {
updateAffectedAssets(changes)
.then(function (response) {
handleSuccessAffectedAssetsUpdate(response);
closeEditor();
});
}
}
}
else {
closeEditor();
}
};
/**
* Cancel pending changes
*/
$scope.cancel = function () {
if ($scope.type !== EntityVO.TYPE_WORKORDER && $scope.type !== EntityVO.TYPE_CHANGE && $scope.type !== EntityVO.TYPE_RELEASE && ticket.causalCI) {
editedData.selectedAsset = (!_.isEmpty(ticket.causalCI) && ticket.causalCI) || "";
}
if ($scope.type !== EntityVO.TYPE_CHANGE && ticket.impactedService) {
editedData.selectedService = ticket.impactedService.name || "";
}
if (($scope.type === EntityVO.TYPE_PROBLEM || $scope.type === EntityVO.TYPE_KNOWNERROR) && (ticket.impactedService || ticket.oldImpactedService)) {
editedData.selectedService = ticket.oldImpactedService.name || ticket.impactedService.name || "";
ticket.impactedService = ticket.oldImpactedService;
}
clearPendingChangeFlags();
};
$scope.getListOfAffectedAssets = function (term) {
var company = (([EntityVO.TYPE_CHANGE, EntityVO.TYPE_RELEASE, EntityVO.TYPE_PROBLEM, EntityVO.TYPE_KNOWNERROR].indexOf(ticket.type) >= 0) ? ticket.company.name : ticket.customer.company.name);
$scope.affectedAssetDataLoading = true;
return assetService.getListOfAssetsForCompany(term, company, ticket.type, ticket.customer && ticket.customer.id)
.then(function (response) {
$scope.state.exceedsAssetChunkSize = response[0].items[0].exceedsChunkSize;
$scope.state.isAssetTooltipOpen = $scope.state.exceedsAssetChunkSize;
$timeout(function () {
$scope.state.isAssetTooltipOpen = false;
}, 10000);
return response[0].items[0].objects;
})
.finally(function () {
$scope.affectedAssetDataLoading = false;
});
};
$scope.getListOfAffectedServices = function (term) {
var company = ([EntityVO.TYPE_CHANGE, EntityVO.TYPE_RELEASE,
$scope.getListOfAffec, EntityVO.TYPE_PROBLEM, EntityVO.TYPE_KNOWNERROR].indexOf(ticket.type) >= 0 ? ticket.company.name : ticket.customer.company.name);
$scope.affectedServiceDataLoading = true;
return assetService.getListOfAssetsByTypeForCompany(term, 'Business Service', company, ticket.type, ticket.customer && ticket.customer.id)
.then(function (response) {
$scope.state.exceedsServiceChunkSize = response[0].items[0].exceedsChunkSize;
$scope.state.isServiceTooltipOpen = $scope.state.exceedsServiceChunkSize;
$timeout(function () {
$scope.state.isServiceTooltipOpen = false;
}, 10000);
return response[0].items[0].objects;
})
.finally(function () {
$scope.affectedServiceDataLoading = false;
});
};
$scope.clearSelectedService = function () {
editedData.selectedService = '';
$scope.onAffectedServiceChange();
};
$scope.clearSelectedAsset = function () {
editedData.selectedAsset = '';
$scope.onAffectedAssetChange();
};
function clearPendingChangeFlags() {
state.pendingAffectedAssetChange = false;
state.pendingAffectedServiceChange = false;
}
/**
* Handle toggle to edit mode event
*/
function handleToggleEditMode() {
// prepare edit data
editedData.selectedService = ticket.impactedService && ticket.impactedService.name || '';
editedData.selectedAsset = (!_.isEmpty(ticket.causalCI) && ticket.causalCI) || '';
clearPendingChangeFlags();
}
/**
* Handle save changes event
*/
function handleSaveChanges() {
$scope.save();
}
function closeEditor() {
if (!$scope.updateIsHandledByParent || $scope.isDraft) {
$scope.$emit(events.SAVE_CHANGES_COMPLETE);
}
clearPendingChangeFlags();
}
/**
* Handle save all changes event
* @param event
* @param eventData
*/
function handleSaveAllChangesComplete(event, eventData) {
handleSuccessAffectedAssetsUpdate(eventData);
handleSuccessAffectedServiceUpdate(eventData);
clearPendingChangeFlags();
}
/**
* Handle discard changes
*/
function handleDiscardChanges() {
$scope.cancel();
}
function refreshFields(event, company) {
if (ticket.company !== company) {
editedData.selectedService = '';
editedData.selectedAsset = '';
state.pendingAffectedAssetChange = true;
state.pendingAffectedServiceChange = true;
ticket.company = company;
}
else {
handleToggleEditMode();
}
}
$scope.$on(events.CLEAR_AFFECTED_SERVICE, refreshFields);
$scope.$on(events.TOGGLE_EDIT_MODE, handleToggleEditMode);
$scope.$on(events.SAVE_CHANGES, handleSaveChanges);
$scope.$on(events.SAVE_ALL_CHANGES_COMPLETE, handleSaveAllChangesComplete);
$scope.$on(events.DISCARD_CHANGES, handleDiscardChanges);
}]
};
}]);
}());