SmartIT_Extensions/BMC/smart-it-full/scripts/app/ticket/link-CI-controller.js

196 lines
9.8 KiB
JavaScript

"use strict";
(function () {
'use strict';
angular.module('ticketModule').controller('LinkCIController', ['$scope', '$modalInstance', 'linkParams', 'ticketModel', 'events', '$q', 'i18nService', '$state', 'systemAlertService', 'relationModel', '$rootScope',
function ($scope, $modalInstance, linkParams, ticketModel, events, $q, i18nService, $state, systemAlertService, relationModel, $rootScope) {
$scope.company = linkParams.selectedItem.company;
$scope.data = {
searches: linkParams.searches || []
};
$scope.linkedCount = 0;
$scope.state = {
processing: false
};
var parent = ticketModel.linkCIsParent;
if (parent) {
$scope.parentName = parent.type;
$scope.parentId = parent.id;
$scope.parentDisplayId = parent.displayId;
}
else {
$state.go('dashboard');
}
initAlertForDirtyForm();
$scope.$on(events.LINKED_COUNT, function (e, searches) {
$scope.linkedCount = 0;
var totalRelatedItems = [];
_.forEach(searches, function (search) {
if (search.results && search.results.length > 0) {
var itemsList = search.results;
for (var i = 0; i < itemsList.length; i++) {
if (itemsList[i].relations && itemsList[i].relations.length > 0) {
if (!(search.allQueryItemsRelation && search.allQueryItemsRelation.length > 0)) {
$scope.linkedCount++;
}
if (totalRelatedItems.indexOf(itemsList[i].instanceId) < 0) {
totalRelatedItems.push(itemsList[i].instanceId);
}
}
}
if (search.allQueryItemsRelation && search.allQueryItemsRelation.length > 0) {
$scope.linkedCount += search.totalMatchCount;
}
}
});
});
function getLinkedCIs() {
var linkedCIs = [], bulkCIsLinked = [];
_.forEach($scope.data.searches, function (search) {
if (search.allQueryItemsRelation && search.allQueryItemsRelation.length > 0) {
bulkCIsLinked = bulkCIsLinked.concat(search.allQueryItemsRelation);
}
_.forEach(search.results, function (item) {
_.forEach(item.relations, function (relation) {
if (search.allQueryItemsRelation && search.allQueryItemsRelation.length > 0) {
if (_.findWhere(search.allQueryItemsRelation, { relationshipType: relation })) {
return;
}
}
linkedCIs.push({
relationshipType: relation,
tag: EntityVO.TYPE_LINKEDITEM,
id: item.reconciliationId,
type: EntityVO.TYPE_ASSET,
desc: item.name
});
});
});
});
return { linkedCIs: linkedCIs, bulkCIsLinked: bulkCIsLinked };
}
$scope.hasNotRelatedCIs = function () {
if ($scope.linkedCount > 0) {
return ($scope.data.searches || []).some(function (search) {
return search.selectedCount > 0 && search.selectedCount > search.linkedCount;
});
}
return true;
};
$scope.startLinkProcess = function () {
var allLinkedCIs = getLinkedCIs(), linkedCIs = allLinkedCIs.linkedCIs, bulkCIsLinked = allLinkedCIs.bulkCIsLinked;
if (linkedCIs.length >= 80 || bulkCIsLinked && bulkCIsLinked.length > 0) {
return systemAlertService.modal({
type: 'info',
title: i18nService.getLocalizedString('create.change.wizard.ci.confirmCIRelation.title'),
text: i18nService.getLocalizedString('create.change.wizard.ci.confirmCIRelation.text'),
buttons: [
{
text: i18nService.getLocalizedString('common.button.continue'),
data: true
},
{
text: i18nService.getLocalizedString('common.button.returnToScreen'),
data: false
}
]
}).result.then(function (data) {
if (data) {
return $scope.link();
}
});
}
else {
return $scope.link();
}
};
$scope.link = function () {
var allLinkedCIs = getLinkedCIs(), linkedCIs = allLinkedCIs.linkedCIs, bulkCIsLinked = allLinkedCIs.bulkCIsLinked, promisesList = [];
if (linkedCIs.length > 0) {
var linkedCisPromise = relationModel.addRelation({
uuid: linkParams.selectedItem.id,
type: EntityVO.TYPE_CHANGE
}, linkedCIs);
promisesList.push(linkedCisPromise);
}
if (bulkCIsLinked.length > 0) {
_.forEach(bulkCIsLinked, function (relationInfo) {
var ticket = { id: linkParams.selectedItem.id, type: EntityVO.TYPE_CHANGE };
if (relationInfo.matchesCount > 100) {
var searchCriteria = relationInfo.searchCriteria;
searchCriteria.chunkInfo = { startIndex: 0, chunkSize: 50 };
var bulkRelatePromise = relationModel.relateBulkCI(ticket, relationInfo, searchCriteria)
.then(function () {
return onBulkRequestComplete(ticket, relationInfo);
});
promisesList.push(bulkRelatePromise);
}
});
}
if (promisesList.length > 0) {
$scope.state.processing = true;
var relationsPromise = $q.all(promisesList);
if (bulkCIsLinked.length > 0 || $scope.linkedCount >= 80) {
$modalInstance.close({
linkedItems: allLinkedCIs,
relationPromise: relationsPromise,
linkedCount: $scope.linkedCount
});
}
else {
relationsPromise.finally(function () {
$rootScope.$broadcast(events.LINKED_CI_SAVE_COMPLETE);
$modalInstance.close({ linkedItems: allLinkedCIs, linkedCount: $scope.linkedCount });
$scope.state.processing = false;
});
}
}
};
function onBulkRequestComplete(ticket, relationInfo) {
var searchCriteria = relationInfo.searchCriteria;
searchCriteria.chunkInfo.startIndex += searchCriteria.chunkInfo.chunkSize;
if (relationInfo.matchesCount >= searchCriteria.chunkInfo.startIndex) {
return relationModel.relateBulkCI(ticket, relationInfo, searchCriteria).then(function () {
return onBulkRequestComplete(ticket, relationInfo);
});
}
else {
return $q.when(1);
}
}
function initAlertForDirtyForm() {
$scope.$on('$stateChangeStart', function (event, toState, toParams) {
if ($scope.linkedCount > 0 && toState.name !== parent.type) {
event.preventDefault();
var modalInstance = systemAlertService.modal({
title: i18nService.getLocalizedString('common.notification.dirty.title'),
text: i18nService.getLocalizedString('common.notification.dirty.message'),
buttons: [
{
text: i18nService.getLocalizedString('common.labels.yes'),
data: {
stateName: toState.name,
stateParams: toParams
}
},
{
text: i18nService.getLocalizedString('common.labels.no')
}
]
});
modalInstance.result.then(function (data) {
if (!_.isEmpty(data)) {
$scope.linkedCount = 0;
$scope.$dismiss();
$state.transitionTo(data.stateName, data.stateParams);
}
});
}
else {
$scope.$dismiss();
}
});
}
}
]);
})();