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