SmartIT_Extensions/BMC/smart-it-full-helix/scripts/app/asset/ci-explorer-model.js

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;
}
]);
}());