222 lines
9.8 KiB
JavaScript
222 lines
9.8 KiB
JavaScript
"use strict";
|
|
(function () {
|
|
'use strict';
|
|
angular.module('assetModule')
|
|
.factory('ciExplorerModel', ['assetConsoleModel', '$q', 'ciExplorerCache', '$filter',
|
|
function (assetConsoleModel, $q, ciExplorerCache, $filter) {
|
|
var model = {
|
|
currentCi: null,
|
|
totalCount: 0,
|
|
relatedCis: [],
|
|
navigationCis: [],
|
|
ciCache: ciExplorerCache,
|
|
filters: {
|
|
selected: []
|
|
},
|
|
displayCi: function (asset) {
|
|
this.currentCi = asset;
|
|
this.relatedCis = [asset];
|
|
loadRelatedCis();
|
|
updateNavigation();
|
|
},
|
|
displayRelations: function (asset) {
|
|
this.currentCi = asset;
|
|
this.totalCount = 0;
|
|
this.relatedCis = [];
|
|
return loadRelatedCis();
|
|
},
|
|
displayMoreRelations: function () {
|
|
return loadRelatedCis();
|
|
},
|
|
reset: function (resetFilters) {
|
|
this.currentCi = null;
|
|
this.ciCache.reset();
|
|
navigation.reset();
|
|
if (resetFilters) {
|
|
resetRelationshipType();
|
|
this.filters.selected = [];
|
|
}
|
|
},
|
|
getAssetDisplayName: function (asset) {
|
|
var name = this.getAssetName(asset);
|
|
return this.getShortGraphLabel(name);
|
|
},
|
|
getAssetName: function (asset) {
|
|
return addNewLines(asset ? asset.name || (asset.realObject && asset.realObject.name) || "" : "");
|
|
},
|
|
getShortGraphLabel: function (label) {
|
|
var maxShortLabelLength = 60;
|
|
var shortLabel = label.length > maxShortLabelLength ? label.substring(0, maxShortLabelLength) + "..." : label;
|
|
return addNewLines(shortLabel);
|
|
},
|
|
getGraphLabel: function (label) {
|
|
return addNewLines(label);
|
|
},
|
|
getRelationshipTypeLabel: function (value) {
|
|
var resourceKey = 'common.relationship.type.' + value, label = $filter('i18n')(resourceKey);
|
|
if (label !== resourceKey) {
|
|
return label;
|
|
}
|
|
if (this.relationshipTypes) {
|
|
var relationshipType = _.head(_.filter(this.relationshipTypes, {
|
|
value: value
|
|
}));
|
|
return relationshipType ? relationshipType.label : value;
|
|
}
|
|
return value;
|
|
}
|
|
}, navigation = {
|
|
all: [],
|
|
update: function (ci) {
|
|
if (!ci || !getInstanceId(ci)) {
|
|
return;
|
|
}
|
|
var existingCi = _.filter(this.all, function (item) {
|
|
return getInstanceId(item) === getInstanceId(ci);
|
|
});
|
|
if (existingCi.length > 0) {
|
|
existingCi = existingCi[0];
|
|
var index = this.all.indexOf(existingCi);
|
|
this.all.splice(index + 1, this.all.length); // retain current ci in the nav
|
|
}
|
|
else {
|
|
this.all.push(ci);
|
|
}
|
|
},
|
|
reset: function () {
|
|
this.all = [];
|
|
}
|
|
};
|
|
loadRelationshipTypes();
|
|
function loadRelationshipTypes() {
|
|
model.relationshipTypesLoading = true;
|
|
assetConsoleModel.getRelationshipTypes({
|
|
"classId1": "BMC_SYSTEM",
|
|
"classId2": null
|
|
}).then(function (relationshipTypes) {
|
|
model.relationshipTypesLoading = false;
|
|
model.relationshipTypes = relationshipTypes;
|
|
resetRelationshipType();
|
|
});
|
|
}
|
|
function resetRelationshipType() {
|
|
model.relationshipType = null;
|
|
}
|
|
function loadRelatedCis() {
|
|
if (!model.currentCi || !getInstanceId(model.currentCi)) {
|
|
return $q.when(buildResult([], 0));
|
|
}
|
|
if (model.totalCount && model.totalCount <= model.relatedCis.length) {
|
|
return $q.when(buildResult(model.relatedCis, model.totalCount));
|
|
}
|
|
var defaultRelationshipClassName = "BMC.CORE:BMC_BASERELATIONSHIP", criteria = {
|
|
filterCriteria: {
|
|
id: getInstanceId(model.currentCi),
|
|
relationshipTypes: [
|
|
((model.relationshipType && model.relationshipType.relationshipClassName) || defaultRelationshipClassName)
|
|
]
|
|
},
|
|
chunkInfo: {
|
|
"startIndex": model.relatedCis.length,
|
|
"chunkSize": 100
|
|
},
|
|
sortInfo: {}
|
|
};
|
|
angular.merge(criteria.filterCriteria, buildFilterCriteria());
|
|
var cacheEntry = model.ciCache.get(criteria);
|
|
if (cacheEntry) {
|
|
model.totalCount = cacheEntry.totalCount;
|
|
model.relatedCis = model.relatedCis.concat(cacheEntry.relatedCis);
|
|
updateNavigation();
|
|
return $q.when(buildResult(model.relatedCis, model.totalCount));
|
|
}
|
|
model.loading = true;
|
|
return assetConsoleModel.getRelatives(criteria).then(function (result) {
|
|
model.loading = false;
|
|
model.relatedCis = model.relatedCis.concat(result.relatives);
|
|
model.totalCount = result.totalCount;
|
|
updateNavigation();
|
|
model.ciCache.put(criteria, buildResult(result.relatives, model.totalCount));
|
|
return $q.when(buildResult(model.relatedCis, model.totalCount));
|
|
});
|
|
}
|
|
function buildFilterCriteria() {
|
|
var filters = angular.copy(model.filters.selected);
|
|
var filterCriteria = {}, regionKey, siteGroupKey, siteKey, sitesKey = 'sites', sites = [], regionValueObj = {}, siteGroupValueObj = {}, siteValueObj = {};
|
|
_.forEach(filters, function (filter) {
|
|
var criteria = filter.criteria, isMultiSelect = _.isArray(criteria.value), name = criteria.name;
|
|
if (filterCriteria[name]) {
|
|
if (isMultiSelect) {
|
|
filterCriteria[name] = _.union(filterCriteria[name], criteria.value);
|
|
}
|
|
else {
|
|
filters.splice(_.findIndex(filters, { name: filter.name }), 1);
|
|
filterCriteria[name] = criteria.value;
|
|
}
|
|
}
|
|
else {
|
|
if (criteria.name === 'region' || criteria.name === 'siteGroup' || criteria.name === 'sites') {
|
|
if (criteria.name === 'region') {
|
|
regionKey = criteria.name;
|
|
regionValueObj = criteria.value[0];
|
|
regionValueObj.id = regionKey;
|
|
sites.push(regionValueObj);
|
|
}
|
|
else if (criteria.name === 'siteGroup') {
|
|
siteGroupKey = criteria.name;
|
|
siteGroupValueObj = criteria.value[0];
|
|
siteGroupValueObj.id = siteGroupKey;
|
|
sites.push(siteGroupValueObj);
|
|
}
|
|
else if (criteria.name === 'sites') {
|
|
siteKey = criteria.name;
|
|
siteValueObj = criteria.value[0];
|
|
siteValueObj.id = siteKey;
|
|
sites.push(siteValueObj);
|
|
}
|
|
filterCriteria[sitesKey] = sites;
|
|
}
|
|
else {
|
|
filterCriteria[name] = criteria.value;
|
|
}
|
|
}
|
|
});
|
|
return filterCriteria;
|
|
}
|
|
function getInstanceId(ci) {
|
|
return ci.instanceId || (ci.realObject && ci.realObject.instanceId);
|
|
}
|
|
function buildResult(cis, totalCount) {
|
|
return {
|
|
totalCount: totalCount,
|
|
relatedCis: cis
|
|
};
|
|
}
|
|
function updateNavigation() {
|
|
navigation.update(model.currentCi);
|
|
model.navigationCis = navigation.all;
|
|
}
|
|
function addNewLines(s) {
|
|
if (hasWhiteSpace(s)) {
|
|
return s;
|
|
}
|
|
var newLineInterval = 14;
|
|
for (var i = 1;; i++) {
|
|
var pos = i * newLineInterval + (i - 1);
|
|
if (s.length > pos) {
|
|
s = s.substring(0, pos) + '\n' + s.substring(pos);
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
return s;
|
|
}
|
|
function hasWhiteSpace(s) {
|
|
return /\s/.test(s);
|
|
}
|
|
return model;
|
|
}
|
|
]);
|
|
}());
|