"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 = _.first(_.where(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; } ]); }());