196 lines
9.8 KiB
JavaScript
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();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
]);
|
|
})();
|