SmartIT_Extensions/BMC/smart-it-full/scripts/app/common/relation/relation-model.js

149 lines
7.8 KiB
JavaScript

"use strict";
/**
* Created by viktor.shevchenko on 7/9/15.
*/
(function () {
'use strict';
angular.module('myitsmApp')
.factory('relationModel', ['relationService', 'systemAlertService', '$filter', '$q',
function (relationService, systemAlertService, $filter, $q) {
var relationModel = {
cache: {},
unlinked: []
};
relationModel.getRelations = function (id, type, displayId, additionalCriteria) {
var criteria = {};
if (displayId) {
criteria = { "criteria": '{"parentDisplayId": ' + displayId + '}' };
}
if (additionalCriteria) {
criteria = _.assign(criteria, additionalCriteria);
return relationService.getRelations(id, type, criteria);
}
if (!relationModel.cache[id]) {
var relationsPromise = relationService.getRelations(id, type, criteria).then(function (relations) {
//Case: when you are in draft mode there chances that relations are found in template and some you have attached via smart-recorder so concat them
if (relations && relations.length > 0) {
if (relationModel.cache[id] && relationModel.cache[id].length) {
relationModel.cache[id].concat(relations);
}
else {
relationModel.cache[id] = relations;
}
}
else {
//Make sure to reset to empty array only if there isn't anything in it as the smart-recorder object pushes relations to same cache even before this promise is fulfilled
if (!(relationModel.cache[id] && relationModel.cache[id].length)) {
relationModel.cache[id] = [];
}
}
return relationModel.cache[id];
});
relationModel.cache[id] = relationsPromise;
return relationsPromise;
}
var isAngularPromise = _.has(relationModel.cache[id], '$$state.status');
return $q.when(isAngularPromise ? relationModel.cache[id] : angular.copy(relationModel.cache[id]));
};
relationModel.refreshRelations = function (id, type) {
return relationService.getRelations(id, type).then(function (relations) {
relationModel.cache[id] = relations;
return relationModel.cache[id];
});
};
/**
* Add Relation to entity
* @param {Object} context - {uuid:'', type:''}
* @param {Array} relations
* @returns {*|Promise}
*/
relationModel.addRelation = function (context, relations) {
if (relations.length) {
_.forEach(relations, function (relation) {
if (angular.isDefined(relation.visited)) {
delete relation.visited;
}
});
}
var params = {
ids: [context],
relationship: relations
};
return relationService.bulkAddRelation(params).then(function (allRelations) {
updateRelationsAfterAdd(allRelations);
});
};
relationModel.markRelationForAdd = function (id, relations) {
if (relations instanceof Array) {
relationModel.cache[id] = relationModel.cache[id].concat(relations);
}
else {
if (relationModel.cache[id] instanceof Array === false) {
relationModel.cache[id] = [];
}
relationModel.cache[id].push(relations);
}
};
relationModel.markRelationForDelete = function (id, relation) {
var removeIdx = _.findIndex(relationModel.cache[id], { id: relation.id });
relationModel.cache[id].splice(removeIdx, 1);
};
//todo: this method is not used yet, move ticketMode.addRelations -> to this method;
relationModel.bulkAddRelation = function (contexts, relations) {
return relationService.bulkAddRelation({ ids: contexts, relationship: relations }).then(function (allRelations) {
updateRelationsAfterAdd(allRelations);
});
};
relationModel.relateBulkCI = function (ticket, relation, searchCriteria) {
return relationService.relateBulkCI(ticket, relation, searchCriteria);
};
relationModel.removeRelation = function (context, relations) {
return relationService.removeRelation(context, relations).then(function (response) {
_.forEach(relations, function (relation) {
var condition = relation.type === EntityVO.TYPE_OUTAGE ? { displayId: relation.id } : (relation.type === EntityVO.TYPE_ASSET ? { "realObject": { "instanceId": relation.id } } : { id: relation.id });
var removeIdx = _.findIndex(relationModel.cache[context.parentId], condition);
relationModel.unlinked = (relationModel.cache[context.parentId] && removeIdx > -1) ? relationModel.cache[context.parentId].splice(removeIdx, 1) : [];
});
if (response && response.data && response.data.additionalInformation
&& response.data.additionalInformation.needsReconciliation) {
systemAlertService.error({
text: $filter('i18n')('asset.actionBlade.assetAction.warning.reconciliation'),
clear: false
});
}
});
};
relationModel.deleteActivity = function (ticket) {
return relationService.deleteActivity(ticket);
};
relationModel.updateTaskSequence = function (tasks) {
return relationService.updateTaskSequence(tasks);
};
relationModel.updateReleasePlanItemsSequence = function (releasePlanItems) {
return relationService.updateReleasePlanItemsSequence(releasePlanItems);
};
relationModel.getRelationsByTag = function (id, type, tag) {
var relationsPromise = relationService.getRelations(id, type, { tags: tag }).then(function (relations) {
return relations;
});
return relationsPromise;
};
function updateRelationsAfterAdd(allRelations) {
_.forEach(allRelations, function (contextRelations, contextID) {
if (relationModel.cache[contextID]) {
relationModel.cache[contextID].length = 0;
Array.prototype.push.apply(relationModel.cache[contextID], contextRelations.relations);
}
else {
relationModel.cache[contextID] = contextRelations.relations;
}
if (contextRelations.relations.length === 1 && relationModel.cache[contextRelations.relations[0].id]) {
relationModel.refreshRelations(contextRelations.relations[0].id, contextRelations.relations[0].type);
}
});
}
return relationModel;
}
]);
})();