diff options
author | Koren Lev <korenlev@gmail.com> | 2017-07-27 16:42:15 +0300 |
---|---|---|
committer | Koren Lev <korenlev@gmail.com> | 2017-07-27 16:42:15 +0300 |
commit | b88c78e3cf2bef22aa2f1c4d0bf305e303bc15f0 (patch) | |
tree | ffa30a6e1511d72562d8772b8700cda52b2752a1 /ui/imports/ui/components/environment-dashboard/environment-dashboard.js | |
parent | b70483739d1f6f4f0d31987ed2e4d1e30d71d579 (diff) |
adding calipso ui
Change-Id: Ifa6f63daebb07f45580f747341960e898fdb00c4
Signed-off-by: Koren Lev <korenlev@gmail.com>
Diffstat (limited to 'ui/imports/ui/components/environment-dashboard/environment-dashboard.js')
-rw-r--r-- | ui/imports/ui/components/environment-dashboard/environment-dashboard.js | 380 |
1 files changed, 380 insertions, 0 deletions
diff --git a/ui/imports/ui/components/environment-dashboard/environment-dashboard.js b/ui/imports/ui/components/environment-dashboard/environment-dashboard.js new file mode 100644 index 0000000..433096e --- /dev/null +++ b/ui/imports/ui/components/environment-dashboard/environment-dashboard.js @@ -0,0 +1,380 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others / +// / +// All rights reserved. This program and the accompanying materials / +// are made available under the terms of the Apache License, Version 2.0 / +// which accompanies this distribution, and is available at / +// http://www.apache.org/licenses/LICENSE-2.0 / +///////////////////////////////////////////////////////////////////////////////////////// +/* + * Template Component: EnvironmentDashboard + */ + +//import { Meteor } from 'meteor/meteor'; +import * as R from 'ramda'; +import * as _ from 'lodash'; +import { Template } from 'meteor/templating'; +import { ReactiveDict } from 'meteor/reactive-dict'; +import { SimpleSchema } from 'meteor/aldeed:simple-schema'; +import { remove } from '/imports/api/environments/methods'; +import { Icon } from '/imports/lib/icon'; +import { store } from '/imports/ui/store/store'; +import { Environments } from '/imports/api/environments/environments'; +import { Inventory } from '/imports/api/inventories/inventories'; +import { calcIconForMessageLevel, lastMessageTimestamp, calcColorClassForMessagesInfoBox } + from '/imports/api/messages/messages'; +import { Counts } from 'meteor/tmeasday:publish-counts'; +import { Roles } from 'meteor/alanning:roles'; +//import { idToStr } from '/imports/lib/utilities'; + +import '/imports/ui/components/data-cubic/data-cubic'; +import '/imports/ui/components/icon/icon'; +import '/imports/ui/components/list-info-box/list-info-box'; +import './environment-dashboard.html'; +import '/imports/ui/components/messages-info-box/messages-info-box'; +import '/imports/ui/components/messages-modal/messages-modal'; + +let briefInfoList = [{ + header: ['components', 'environment', 'briefInfos', 'instancesNum', 'header'], + dataSource: 'infoInstancesCount', + icon: new Icon({ type: 'fa', name: 'desktop' }), +}, { + header: ['components', 'environment', 'briefInfos', 'vServicesNum', 'header'], + dataSource: 'infoVServicesCount', + icon: new Icon({ type: 'fa', name: 'object-group' }), +}, { + header: ['components', 'environment', 'briefInfos', 'hostsNum', 'header'], + dataSource: 'infoHostsCount', + icon: new Icon({ type: 'fa', name: 'server' }), +}, { + header: ['components', 'environment', 'briefInfos', 'vConnectorsNum', 'header'], + dataSource: 'infoVConnectorsCount', + icon: new Icon({ type: 'fa', name: 'compress' }), +}, { + header: ['components', 'environment', 'briefInfos', 'lastScanning', 'header'], + dataSource: 'infoLastScanning', + icon: new Icon({ type: 'fa', name: 'search' }), +}]; + +let listInfoBoxes = [{ + header: ['components', 'environment', 'listInfoBoxes', 'regions', 'header'], + listName: 'regions', + listItemFormat: { + getLabelFn: (item) => { return item.name; }, + getValueFn: (item) => { return item._id._str; }, + }, + icon: { type: 'material', name: 'public' }, +}, { + header: ['components', 'environment', 'listInfoBoxes', 'projects', 'header'], + listName: 'projects', + listItemFormat: { + getLabelFn: (item) => { return item.name; }, + getValueFn: (item) => { return item._id._str; }, + }, + icon: { type: 'material', name: 'folder' }, +}]; + +/* + * Lifecycles + */ + +Template.EnvironmentDashboard.onCreated(function() { + var instance = this; + + instance.state = new ReactiveDict(); + instance.state.setDefault({ + _id: null, + envName: null, + allowEdit: false, + }); + + instance.autorun(function () { + let data = Template.currentData(); + new SimpleSchema({ + _id: { type: { _str: { type: String, regEx: SimpleSchema.RegEx.Id } } }, + onNodeSelected: { type: Function }, + }).validate(data); + + instance.state.set('_id', data._id); + }); + + instance.autorun(function () { + let _id = instance.state.get('_id'); + + instance.subscribe('environments?_id', _id); + Environments.find({ _id: _id }).forEach((env) => { + instance.state.set('envName', env.name); + instance.state.set('infoLastScanning', env.last_scanned); + + let allowEdit = false; + let auth = R.path(['auth', 'edit-env'], env); + if (auth && R.contains(Meteor.userId(), auth)) { + allowEdit = true; + } + if (Roles.userIsInRole(Meteor.userId(), 'edit-env', 'default-group')) { + allowEdit = true; + } + + instance.state.set('allowEdit', allowEdit ); + + instance.subscribe('inventory?env+type', env.name, 'instance'); + instance.subscribe('inventory?env+type', env.name, 'vservice'); + instance.subscribe('inventory?env+type', env.name, 'host'); + instance.subscribe('inventory?env+type', env.name, 'vconnector'); + instance.subscribe('inventory?env+type', env.name, 'project'); + instance.subscribe('inventory?env+type', env.name, 'region'); + instance.subscribe('messages?env+level', env.name, 'info'); + instance.subscribe('messages?env+level', env.name, 'warning'); + instance.subscribe('messages?env+level', env.name, 'error'); + + let vConnectorCounterName = 'inventory?env+type!counter?env=' + + env.name + '&type=' + 'vconnector'; + let infoVConnectorsCount = Counts.get(vConnectorCounterName); + instance.state.set('infoVConnectorsCount', infoVConnectorsCount); + + let hostsCounterName = 'inventory?env+type!counter?env=' + + env.name + '&type=' + 'host'; + let infoHostsCount = Counts.get(hostsCounterName); + instance.state.set('infoHostsCount', infoHostsCount); + + let vServicesCounterName = 'inventory?env+type!counter?env=' + + env.name + '&type=' + 'vservice'; + let infoVServicesCount = Counts.get(vServicesCounterName); + instance.state.set('infoVServicesCount', infoVServicesCount); + + let instancesCounterName = 'inventory?env+type!counter?env=' + + env.name + '&type=' + 'instance'; + let infoInstancesCount = Counts.get(instancesCounterName); + instance.state.set('infoInstancesCount', infoInstancesCount); + + let projectsCounterName = 'inventory?env+type!counter?env=' + + env.name + '&type=' + 'project'; + let projectsCount = Counts.get(projectsCounterName); + instance.state.set('projectsCount', projectsCount); + + let regionsCounterName = 'inventory?env+type!counter?env=' + + env.name + '&type=' + 'region'; + let regionsCount = Counts.get(regionsCounterName); + instance.state.set('regionsCount', regionsCount); + }); + + }); +}); + +/* +Template.EnvironmentDashboard.rendered = function() { +}; +*/ + +/* + * Events + */ + +Template.EnvironmentDashboard.events({ + 'click .sm-edit-button': function (event, instance) { + let envName = instance.state.get('envName'); + let allowEdit = instance.state.get('allowEdit'); + if (! allowEdit) { return; } + + Router.go('/wizard/' + envName,{},{}); + }, + + 'click .sm-scan-button': function (event, instance) { + let envName = instance.state.get('envName'); + + Router.go('new-scanning',{},{ query: { env: envName } }); + }, + + 'click .sm-delete-button': function (event, instance) { + let allowEdit = instance.state.get('allowEdit'); + if (! allowEdit) { return; } + + let $deleteModal = instance.$('#env-delete-modal'); + $deleteModal.modal({ show: true }); + } +}); + +/* + * Helpers + */ + +Template.EnvironmentDashboard.helpers({ + getState: function (key) { + let instance = Template.instance(); + return instance.state.get(key); + }, + + getListInfoBoxes: function () { + return listInfoBoxes; + }, + + getBriefInfoList: function () { + return briefInfoList; + }, + + infoMessagesCount: function(){ + let instance = Template.instance(); + let envName = instance.state.get('envName'); + if (R.isNil(envName)) { return; } + + return Counts.get('messages?env+level!counter?env=' + + envName + '&level=' + 'info'); + }, + + warningsCount: function(){ + let instance = Template.instance(); + let envName = instance.state.get('envName'); + if (R.isNil(envName)) { return; } + + return Counts.get('messages?env+level!counter?env=' + + envName + '&level=' + 'warn'); + }, + + errorsCount: function(){ + let instance = Template.instance(); + let envName = instance.state.get('envName'); + if (R.isNil(envName)) { return; } + + return Counts.get('messages?env+level!counter?env=' + + envName + '&level=' + 'error'); + }, + + argsEnvDeleteModal: function () { + let instance = Template.instance(); + return { + onDeleteReq: function () { + instance.$('#env-delete-modal').modal('hide'); + let _id = instance.state.get('_id'); + remove.call({ _id: _id }, function (error, _res) { + if (R.isNil(error)) { + setTimeout(() => { + Router.go('/dashboard'); + }, 700); + } else { + alert('error removing environment. ' + error.message); + } + }); + console.log('delete req performed'); + } + }; + }, + + argsBriefInfo: function (briefInfo) { + let instance = Template.instance(); + return { + header: R.path(briefInfo.header, store.getState().api.i18n), + dataInfo: R.toString(instance.state.get(briefInfo.dataSource)), + icon: new Icon(briefInfo.icon) + }; + }, + + argsListInfoBox: function (listInfoBox) { + let instance = Template.instance(); + let data = Template.currentData(); + let envName = instance.state.get('envName'); + + //let lastScanned = calcLastScanned(listInfoBox.listName, envName); + + return { + header: R.path(listInfoBox.header, store.getState().api.i18n), + list: getList(listInfoBox.listName, envName), + icon: new Icon(listInfoBox.icon), + listItemFormat: listInfoBox.listItemFormat, + //lastScanning: lastScanned, + onItemSelected: function (itemKey) { + data.onNodeSelected(new Mongo.ObjectID(itemKey)); + } + }; + }, + + notAllowEdit: function () { + let instance = Template.instance(); + let allowEdit = instance.state.get('allowEdit'); + return ! allowEdit; + }, + + getListMessagesInfoBox: function () { + return [ + { + level: 'info' + }, + { + level: 'warning' + }, + { + level: 'error' + }, + ]; + }, + + argsMessagesInfoBox: function(boxDef, env) { + let instance = Template.instance(); + let envName = instance.state.get('envName'); + if (R.isNil(envName)) { + return { + title: '', count: 0, lastScanTimestamp: '', onMoreDetailsReq: function () {} + }; + } + + let count = Counts.get('messages?env+level!counter?env=' + + envName + '&level=' + boxDef.level); + + let title = _.capitalize(boxDef.level); + + return { + title: title, + count: count, + lastScanTimestamp: lastMessageTimestamp(boxDef.level, env), + icon: calcIconForMessageLevel(boxDef.level), + colorClass: calcColorClassForMessagesInfoBox(boxDef.level), + onMoreDetailsReq: function () { + $('#messagesModalGlobal').modal('show', { + dataset: { + messageLevel: boxDef.level, + envName: env, + } + }); + } + }; + }, +}); // end: helpers + +function getList(listName, envName) { + switch (listName) { + case 'regions': + return Inventory.find({ + environment: envName, + type: 'region' + }); + + case 'projects': + return Inventory.find({ + environment: envName, + type: 'project' + }); + + default: + throw 'unknowned list type'; + } +} + +/* +function calcLastScanned(listName, envName) { + switch (listName) { + case 'regions': + return R.path(['last_scanned'], Inventory.findOne({ + environment: envName, + type:'region' + })); + + case 'projects': + return R.path(['last_scanned'], Inventory.findOne({ + environment: envName, + type:'project' + })); + + default: + throw 'unknown'; + } +} +*/ |