From fc2702ba260b7a8705ee9f2d1f606af8dfa768da Mon Sep 17 00:00:00 2001 From: Koren Lev Date: Wed, 6 Sep 2017 19:47:54 +0300 Subject: ui updates Change-Id: I2d3f87e34a74ce21bbb9e3df989b6527337b7228 Signed-off-by: Koren Lev --- .../attributes_for_hover_on_data.js | 24 ++++ ui/imports/api/clique-types/methods.js | 12 +- ui/imports/api/configurations/configurations.js | 29 +++++ ui/imports/api/configurations/methods.js | 39 +++++++ .../api/configurations/server/publications.js | 21 ++++ ui/imports/api/environments/environments.js | 6 +- ui/imports/api/inventories/server/methods.js | 28 +---- ui/imports/api/links/server/methods.js | 31 +++++ ui/imports/api/messages/server/methods.js | 4 +- ui/imports/api/messages/server/publications.js | 19 ++- ui/imports/lib/images-for-node-type.js | 63 ++++++++-- ui/imports/startup/client/index.js | 1 + ui/imports/startup/server/register-api.js | 4 + .../ui/components/alarm-icons/alarm-icons.html | 13 ++- .../ui/components/alarm-icons/alarm-icons.js | 31 ++++- .../ui/components/clique-type/clique-type.js | 6 +- .../ui/components/configuration/configuration.html | 31 +++++ .../ui/components/configuration/configuration.js | 114 ++++++++++++++++++ .../ui/components/configuration/configuration.styl | 38 ++++++ ui/imports/ui/components/dashboard/dashboard.js | 18 +-- .../environment-dashboard/environment-dashboard.js | 15 ++- .../ui/components/environment/environment.js | 1 + .../graph-tooltip-window/graph-tooltip-window.html | 4 +- .../graph-tooltip-window/graph-tooltip-window.js | 19 +++ .../graph-tooltip-window/graph-tooltip-window.styl | 11 +- ui/imports/ui/components/index.styl | 1 + .../ui/components/messages-modal/messages-modal.js | 54 ++++----- .../network-graph-manager/network-graph-manager.js | 48 +++++++- .../ui/components/network-graph/network-graph.js | 130 ++++++++++++++------- .../ui/components/scans-list/scans-list.html | 2 - .../components/top-navbar-menu/top-navbar-menu.js | 2 +- ui/lib/router.js | 15 ++- .../backup - ic_cloud_queue_black_48dp_2x.png | Bin 0 -> 9845 bytes ui/public/ic_cloud_queue_black_48dp_2x-green.png | Bin 0 -> 11727 bytes ui/public/ic_cloud_queue_black_48dp_2x-orange.png | Bin 0 -> 9811 bytes ui/public/ic_cloud_queue_black_48dp_2x-red.png | Bin 0 -> 11334 bytes ui/public/ic_computer_black_48dp_2x-green.png | Bin 0 -> 5357 bytes ui/public/ic_computer_black_48dp_2x-orange.png | Bin 0 -> 4628 bytes ui/public/ic_computer_black_48dp_2x-red.png | Bin 0 -> 5315 bytes ui/public/ic_computer_black_48dp_2x.png | Bin 5171 -> 3365 bytes ui/public/ic_dns_black_48dp_2x-green.png | Bin 0 -> 8043 bytes ui/public/ic_dns_black_48dp_2x-orange.png | Bin 0 -> 7033 bytes ui/public/ic_dns_black_48dp_2x-red.png | Bin 0 -> 7900 bytes ui/public/ic_gamepad_black_48dp_2x-green.png | Bin 0 -> 7635 bytes ui/public/ic_gamepad_black_48dp_2x-orange.png | Bin 0 -> 6807 bytes ui/public/ic_gamepad_black_48dp_2x-red.png | Bin 0 -> 7522 bytes .../ic_keyboard_return_black_48dp_2x-green.png | Bin 0 -> 8306 bytes .../ic_keyboard_return_black_48dp_2x-orange.png | Bin 0 -> 7176 bytes ui/public/ic_keyboard_return_black_48dp_2x-red.png | Bin 0 -> 7963 bytes ui/public/ic_lens_black_48dp_2x-green.png | Bin 0 -> 9527 bytes ui/public/ic_lens_black_48dp_2x-orange.png | Bin 0 -> 8058 bytes ui/public/ic_lens_black_48dp_2x-red.png | Bin 0 -> 9336 bytes ...ettings_input_composite_black_48dp_2x-green.png | Bin 0 -> 7053 bytes ...ttings_input_composite_black_48dp_2x-orange.png | Bin 0 -> 6230 bytes ..._settings_input_composite_black_48dp_2x-red.png | Bin 0 -> 6984 bytes .../ic_settings_input_hdmi_black_48dp_2x-green.png | Bin 0 -> 7507 bytes ...ic_settings_input_hdmi_black_48dp_2x-orange.png | Bin 0 -> 6597 bytes .../ic_settings_input_hdmi_black_48dp_2x-red.png | Bin 0 -> 7463 bytes ui/public/ic_storage_black_48dp_2x-green.png | Bin 0 -> 6732 bytes ui/public/ic_storage_black_48dp_2x-orange.png | Bin 0 -> 5958 bytes ui/public/ic_storage_black_48dp_2x-red.png | Bin 0 -> 6634 bytes ui/run | 1 + 62 files changed, 683 insertions(+), 152 deletions(-) create mode 100644 ui/imports/api/configurations/configurations.js create mode 100644 ui/imports/api/configurations/methods.js create mode 100644 ui/imports/api/configurations/server/publications.js create mode 100644 ui/imports/api/links/server/methods.js create mode 100644 ui/imports/ui/components/configuration/configuration.html create mode 100644 ui/imports/ui/components/configuration/configuration.js create mode 100644 ui/imports/ui/components/configuration/configuration.styl create mode 100644 ui/public/backup - ic_cloud_queue_black_48dp_2x.png create mode 100644 ui/public/ic_cloud_queue_black_48dp_2x-green.png create mode 100644 ui/public/ic_cloud_queue_black_48dp_2x-orange.png create mode 100644 ui/public/ic_cloud_queue_black_48dp_2x-red.png create mode 100644 ui/public/ic_computer_black_48dp_2x-green.png create mode 100644 ui/public/ic_computer_black_48dp_2x-orange.png create mode 100644 ui/public/ic_computer_black_48dp_2x-red.png create mode 100644 ui/public/ic_dns_black_48dp_2x-green.png create mode 100644 ui/public/ic_dns_black_48dp_2x-orange.png create mode 100644 ui/public/ic_dns_black_48dp_2x-red.png create mode 100644 ui/public/ic_gamepad_black_48dp_2x-green.png create mode 100644 ui/public/ic_gamepad_black_48dp_2x-orange.png create mode 100644 ui/public/ic_gamepad_black_48dp_2x-red.png create mode 100644 ui/public/ic_keyboard_return_black_48dp_2x-green.png create mode 100644 ui/public/ic_keyboard_return_black_48dp_2x-orange.png create mode 100644 ui/public/ic_keyboard_return_black_48dp_2x-red.png create mode 100644 ui/public/ic_lens_black_48dp_2x-green.png create mode 100644 ui/public/ic_lens_black_48dp_2x-orange.png create mode 100644 ui/public/ic_lens_black_48dp_2x-red.png create mode 100644 ui/public/ic_settings_input_composite_black_48dp_2x-green.png create mode 100644 ui/public/ic_settings_input_composite_black_48dp_2x-orange.png create mode 100644 ui/public/ic_settings_input_composite_black_48dp_2x-red.png create mode 100644 ui/public/ic_settings_input_hdmi_black_48dp_2x-green.png create mode 100644 ui/public/ic_settings_input_hdmi_black_48dp_2x-orange.png create mode 100644 ui/public/ic_settings_input_hdmi_black_48dp_2x-red.png create mode 100644 ui/public/ic_storage_black_48dp_2x-green.png create mode 100644 ui/public/ic_storage_black_48dp_2x-orange.png create mode 100644 ui/public/ic_storage_black_48dp_2x-red.png diff --git a/ui/imports/api/attributes_for_hover_on_data/attributes_for_hover_on_data.js b/ui/imports/api/attributes_for_hover_on_data/attributes_for_hover_on_data.js index ec2f6cd..13c877a 100644 --- a/ui/imports/api/attributes_for_hover_on_data/attributes_for_hover_on_data.js +++ b/ui/imports/api/attributes_for_hover_on_data/attributes_for_hover_on_data.js @@ -7,6 +7,30 @@ // http://www.apache.org/licenses/LICENSE-2.0 / ///////////////////////////////////////////////////////////////////////////////////////// import { Mongo } from 'meteor/mongo'; +import * as R from 'ramda'; export const NodeHoverAttr = new Mongo.Collection( 'attributes_for_hover_on_data', { idGeneration: 'MONGO' }); + +export const calcAttrsForItem = function (node, attrsDefsRec) { + if (R.isNil(attrsDefsRec)) { + return []; + } + + let attrsDefs = attrsDefsRec.attributes; + + return R.reduce((acc, attrDef) => { + if (R.is(Array, attrDef)) { + let value = R.path(attrDef, node); + if (R.isNil(value)) { return acc; } + let name = R.join('.', attrDef); + return R.append(R.assoc(name, value, {}), acc); + + } else { + return R.ifElse(R.isNil, + R.always(acc), + (attrVal) => R.append(R.assoc(attrDef, attrVal, {}), acc) + )(R.prop(attrDef, node)); + } + }, [], attrsDefs); +}; diff --git a/ui/imports/api/clique-types/methods.js b/ui/imports/api/clique-types/methods.js index a62c22f..4257291 100644 --- a/ui/imports/api/clique-types/methods.js +++ b/ui/imports/api/clique-types/methods.js @@ -96,12 +96,12 @@ export const update = new ValidatedMethod({ 'focal_point_type', 'link_types', 'name', ], - cliqueType), { - environment, - focal_point_type, - link_types, - name, - }); + cliqueType), { + environment, + focal_point_type, + link_types, + name, + }); CliqueTypes.update({ _id: _id }, { $set: cliqueType }); } diff --git a/ui/imports/api/configurations/configurations.js b/ui/imports/api/configurations/configurations.js new file mode 100644 index 0000000..067b69f --- /dev/null +++ b/ui/imports/api/configurations/configurations.js @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// 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 / +///////////////////////////////////////////////////////////////////////////////////////// +import { Mongo } from 'meteor/mongo'; +import { SimpleSchema } from 'meteor/aldeed:simple-schema'; +//import * as R from 'ramda'; + +export const Configurations = new Mongo.Collection('configurations', { idGeneration: 'MONGO' }); + +let schema = { + _id: { type: { _str: { type: String, regEx: SimpleSchema.RegEx.Id } } }, + user_id: { + type: String, + }, + messages_view_backward_delta: { + type: Number, + minCount: 1, + defaultValue: '1209600000', // 2 weeks + } +}; + +let simpleSchema = new SimpleSchema(schema); +Configurations.schema = simpleSchema; +Configurations.attachSchema(Configurations.schema); diff --git a/ui/imports/api/configurations/methods.js b/ui/imports/api/configurations/methods.js new file mode 100644 index 0000000..7366e3e --- /dev/null +++ b/ui/imports/api/configurations/methods.js @@ -0,0 +1,39 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// 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 / +///////////////////////////////////////////////////////////////////////////////////////// +import { ValidatedMethod } from 'meteor/mdg:validated-method'; +import { Configurations } from '/imports/api/configurations/configurations'; +import * as R from 'ramda'; + +export const save = new ValidatedMethod({ + name: 'configurations.save', + validate: Configurations.simpleSchema() + .pick([ + 'messages_view_backward_delta' + ]).validator({ clean: true, filter: false }), + run({ + messages_view_backward_delta + }) { + + let userId = this.userId; + let conf = Configurations.findOne({ user_id: userId }); + + if (conf) { + Configurations.update({ _id: conf._id}, { $set: { + messages_view_backward_delta: messages_view_backward_delta + }}); + } else { + let item = Configurations.schema.clean({}); + item = R.merge(item, { + user_id: userId, + messages_view_backward_delta: messages_view_backward_delta + }); + Configurations.insert(item); + } + } +}); diff --git a/ui/imports/api/configurations/server/publications.js b/ui/imports/api/configurations/server/publications.js new file mode 100644 index 0000000..fe9f6fd --- /dev/null +++ b/ui/imports/api/configurations/server/publications.js @@ -0,0 +1,21 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// 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 / +///////////////////////////////////////////////////////////////////////////////////////// +import { Meteor } from 'meteor/meteor'; + +import { Configurations } from '../configurations.js'; + +Meteor.publish('configurations?user', function () { + console.log('server subscribtion: configurations?user'); + + let userId = this.userId; + + let query = { user_id: userId }; + console.log('-query: ', query); + return Configurations.find(query); +}); diff --git a/ui/imports/api/environments/environments.js b/ui/imports/api/environments/environments.js index 5e3b4b2..22e49cf 100644 --- a/ui/imports/api/environments/environments.js +++ b/ui/imports/api/environments/environments.js @@ -32,7 +32,7 @@ export const requiredConfGroups = [ ]; export const optionalConfGroups = [ - // 'NFV_provider', + // 'NFV_provider', 'AMQP', 'Monitoring', 'ACI', @@ -335,8 +335,8 @@ function getSchemaForGroupName(groupName) { return CLISchema; case 'AMQP': return AMQPSchema; -// case 'NFV_provider': -// return NfvProviderSchema; + // case 'NFV_provider': + // return NfvProviderSchema; case 'ACI': return AciSchema; case 'Monitoring': diff --git a/ui/imports/api/inventories/server/methods.js b/ui/imports/api/inventories/server/methods.js index 3daf570..d7e3648 100644 --- a/ui/imports/api/inventories/server/methods.js +++ b/ui/imports/api/inventories/server/methods.js @@ -11,7 +11,8 @@ import * as R from 'ramda'; import { Inventory } from '../inventories'; import { Environments } from '/imports/api/environments/environments'; import { regexEscape } from '/imports/lib/regex-utils'; -import { NodeHoverAttr } from '/imports/api/attributes_for_hover_on_data/attributes_for_hover_on_data'; +import { NodeHoverAttr, calcAttrsForItem } from '/imports/api/attributes_for_hover_on_data/attributes_for_hover_on_data'; + const AUTO_COMPLETE_RESULTS_LIMIT = 15; Meteor.methods({ @@ -125,7 +126,7 @@ Meteor.methods({ let query = { _id: nodeId }; let node = Inventory.findOne(query); let attrsDefs = NodeHoverAttr.findOne({ 'type': node.type }); - let attributes = calcAttrsForNode(node, attrsDefs); + let attributes = calcAttrsForItem(node, attrsDefs); return { node: node, @@ -134,26 +135,3 @@ Meteor.methods({ }; }, }); - -function calcAttrsForNode(node, attrsDefsRec) { - if (R.isNil(attrsDefsRec)) { - return []; - } - - let attrsDefs = attrsDefsRec.attributes; - - return R.reduce((acc, attrDef) => { - if (R.is(Array, attrDef)) { - let value = R.path(attrDef, node); - if (R.isNil(value)) { return acc; } - let name = R.join('.', attrDef); - return R.append(R.assoc(name, value, {}), acc); - - } else { - return R.ifElse(R.isNil, - R.always(acc), - (attrVal) => R.append(R.assoc(attrDef, attrVal, {}), acc) - )(R.prop(attrDef, node)); - } - }, [], attrsDefs); -} diff --git a/ui/imports/api/links/server/methods.js b/ui/imports/api/links/server/methods.js new file mode 100644 index 0000000..8d3454b --- /dev/null +++ b/ui/imports/api/links/server/methods.js @@ -0,0 +1,31 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// 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 / +///////////////////////////////////////////////////////////////////////////////////////// + +import { Links } from '../links'; +import { NodeHoverAttr, calcAttrsForItem } from '/imports/api/attributes_for_hover_on_data/attributes_for_hover_on_data'; +import * as R from 'ramda'; + +Meteor.methods({ + 'linksFind?DataAndAttrs': function (id) { + console.log(`method server: linksFind?DataAndAttrs. ${R.toString(id)}`); + //check(nodeId, ObjectId); + this.unblock(); + + let query = { _id: id }; + let link = Links.findOne(query); + let attrsDefs = NodeHoverAttr.findOne({ 'type': 'link' }); + let attributes = calcAttrsForItem(link, attrsDefs); + + return { + link: link, + linkName: link.link_name, + attributes: attributes + }; + }, +}); diff --git a/ui/imports/api/messages/server/methods.js b/ui/imports/api/messages/server/methods.js index 119e6b0..540c0a1 100644 --- a/ui/imports/api/messages/server/methods.js +++ b/ui/imports/api/messages/server/methods.js @@ -11,7 +11,7 @@ import { Messages } from '/imports/api/messages/messages'; Meteor.methods({ 'messages/get?level&env&page&amountPerPage&sortField&sortDirection': function ( - level, env, page, amountPerPage, sortField, sortDirection) { + level, env, page, amountPerPage, sortField, sortDirection) { logMethodCall('messages/get?level&env&page&amountPerPage&sortField&sortDirection', {level, env, page, amountPerPage}); @@ -27,7 +27,7 @@ Meteor.methods({ query = R.ifElse(R.isNil, R.always(query),R.assoc('level', R.__, query))(level); sortParams = R.ifElse(R.isNil, R.always(sortParams), - R.assoc(R.__, sortDirection, sortParams))(sortField); + R.assoc(R.__, sortDirection, sortParams))(sortField); console.log('sort params:', sortParams); diff --git a/ui/imports/api/messages/server/publications.js b/ui/imports/api/messages/server/publications.js index 13c7c50..6b147f0 100644 --- a/ui/imports/api/messages/server/publications.js +++ b/ui/imports/api/messages/server/publications.js @@ -88,11 +88,28 @@ Meteor.publish('messages/count?level', function (level) { return new Counter(counterName, Messages.find({ level: level })); }); +Meteor.publish('messages/count?backDelta&level', function (backDelta, level) { + const counterName = `messages/count?backDelta=${backDelta}&level=${level}`; + console.log(`subscribe - counter: ${counterName}`); + + let begining = moment().subtract(backDelta); + let query = { + level: level, + timestamp: { $gte: begining.toDate() } + }; + + console.log(`query: ${R.toString(query)}`); + + return new Counter(counterName, Messages.find(query)); +}); + Meteor.publish('messages/count?level&env', function (level, env) { const counterName = `messages/count?level=${level}&env=${env}`; console.log(`subscribe - counter: ${counterName}`); let query = { level: level }; query = R.ifElse(R.isNil, R.always(query), R.assoc('environment', R.__, query))(env); + console.log(`query: ${R.toString(query)}`); - return new Counter(counterName, Messages.find(query)); }); + return new Counter(counterName, Messages.find(query)); +}); diff --git a/ui/imports/lib/images-for-node-type.js b/ui/imports/lib/images-for-node-type.js index fb8e582..19be6ac 100644 --- a/ui/imports/lib/images-for-node-type.js +++ b/ui/imports/lib/images-for-node-type.js @@ -1,14 +1,59 @@ export let imagesForNodeType = { - 'instance': 'ic_computer_black_48dp_2x.png', - 'pnic': 'ic_dns_black_48dp_2x.png', - 'vconnector': 'ic_settings_input_composite_black_48dp_2x.png', + 'instance': { + default: 'ic_computer_black_48dp_2x.png', + ok: 'ic_computer_black_48dp_2x-green.png', + warning: 'ic_computer_black_48dp_2x-orange.png', + error: 'ic_computer_black_48dp_2x-red.png', + }, + 'pnic': { + default: 'ic_dns_black_48dp_2x.png', + ok: 'ic_dns_black_48dp_2x-green.png', + warning: 'ic_dns_black_48dp_2x-orange.png', + error: 'ic_dns_black_48dp_2x-red.png', + }, + 'vconnector': { + default: 'ic_settings_input_composite_black_48dp_2x.png', + ok: 'ic_settings_input_composite_black_48dp_2x-green.png', + warning: 'ic_settings_input_composite_black_48dp_2x-orange.png', + error: 'ic_settings_input_composite_black_48dp_2x-red.png', + }, // 'network': 'ic_cloud_queue_black_48dp_2x.png', - 'network': 'ic_cloud_queue_black_48dp_2x.png', - 'vedge': 'ic_gamepad_black_48dp_2x.png', - 'vservice': 'ic_storage_black_48dp_2x.png', - 'vnic': 'ic_settings_input_hdmi_black_48dp_2x.png', - 'otep':'ic_keyboard_return_black_48dp_2x.png', + 'network': { + default: 'ic_cloud_queue_black_48dp_2x.png', + ok: 'ic_cloud_queue_black_48dp_2x-green.png', + warning: 'ic_cloud_queue_black_48dp_2x-orange.png', + error: 'ic_cloud_queue_black_48dp_2x-red.png', + }, + 'vedge': { + default: 'ic_gamepad_black_48dp_2x.png', + ok: 'ic_gamepad_black_48dp_2x-green.png', + warning: 'ic_gamepad_black_48dp_2x-orange.png', + error: 'ic_gamepad_black_48dp_2x-red.png', + }, + 'vservice': { + default: 'ic_storage_black_48dp_2x.png', + ok: 'ic_storage_black_48dp_2x-green.png', + warning: 'ic_storage_black_48dp_2x-orange.png', + error: 'ic_storage_black_48dp_2x-red.png', + }, + 'vnic': { + default: 'ic_settings_input_hdmi_black_48dp_2x.png', + ok: 'ic_settings_input_hdmi_black_48dp_2x-green.png', + warning: 'ic_settings_input_hdmi_black_48dp_2x-orange.png', + error: 'ic_settings_input_hdmi_black_48dp_2x-red.png', + }, + 'otep': { + default: 'ic_keyboard_return_black_48dp_2x.png', + ok: 'ic_keyboard_return_black_48dp_2x-green.png', + warning: 'ic_keyboard_return_black_48dp_2x-orange.png', + error: 'ic_keyboard_return_black_48dp_2x-red.png', + }, }; -export let defaultNodeTypeImage = 'ic_lens_black_48dp_2x.png'; +export let defaultNodeTypeImage = { + default: 'ic_lens_black_48dp_2x.png', + ok: 'ic_lens_black_48dp_2x-green.png', + warning: 'ic_lens_black_48dp_2x-orange.png', + error: 'ic_lens_black_48dp_2x-red.png', +}; diff --git a/ui/imports/startup/client/index.js b/ui/imports/startup/client/index.js index 93da904..6ac478c 100644 --- a/ui/imports/startup/client/index.js +++ b/ui/imports/startup/client/index.js @@ -36,3 +36,4 @@ import '/imports/ui/components/messages-list/messages-list'; import '/imports/ui/components/message/message'; import '/imports/ui/components/dashboard/dashboard'; import '/imports/ui/components/new-scanning/new-scanning'; +import '/imports/ui/components/configuration/configuration'; diff --git a/ui/imports/startup/server/register-api.js b/ui/imports/startup/server/register-api.js index 3475c53..71d6887 100644 --- a/ui/imports/startup/server/register-api.js +++ b/ui/imports/startup/server/register-api.js @@ -31,6 +31,7 @@ import '../../api/cliques/methods.js'; import '../../api/links/server/publications'; import '../../api/links/methods.js'; +import '../../api/links/server/methods'; import '../../api/statistics/server/publications'; import '../../api/statistics/methods.js'; @@ -53,4 +54,7 @@ import '../../api/accounts/methods'; import '../../api/supported_environments/server/publications'; import '../../api/supported_environments/methods'; +import '../../api/configurations/server/publications'; +import '../../api/configurations/methods'; + import '../../api/migrations/migrations'; diff --git a/ui/imports/ui/components/alarm-icons/alarm-icons.html b/ui/imports/ui/components/alarm-icons/alarm-icons.html index d584990..e59414e 100644 --- a/ui/imports/ui/components/alarm-icons/alarm-icons.html +++ b/ui/imports/ui/components/alarm-icons/alarm-icons.html @@ -15,34 +15,37 @@ @@ -69,6 +72,10 @@ Users {{/if }} + + diff --git a/ui/imports/ui/components/alarm-icons/alarm-icons.js b/ui/imports/ui/components/alarm-icons/alarm-icons.js index 5c7af31..e86f8d8 100644 --- a/ui/imports/ui/components/alarm-icons/alarm-icons.js +++ b/ui/imports/ui/components/alarm-icons/alarm-icons.js @@ -13,6 +13,9 @@ import '/imports/ui/components/breadcrumb/breadcrumb'; import { Messages } from '/imports/api/messages/messages'; import { Roles } from 'meteor/alanning:roles'; +import { ReactiveDict } from 'meteor/reactive-dict'; + +import { Configurations } from '/imports/api/configurations/configurations'; import './alarm-icons.html'; @@ -23,10 +26,24 @@ import './alarm-icons.html'; Template.alarmIcons.onCreated(function () { let instance = this; + instance.state = new ReactiveDict(); + instance.state.setDefault({ + msgsViewBackDelta: 1 + }); + instance.autorun(function () { - instance.subscribe('messages/count?level', 'info'); - instance.subscribe('messages/count?level', 'warning'); - instance.subscribe('messages/count?level', 'error'); + instance.subscribe('configurations?user'); + Configurations.find({user_id: Meteor.userId()}).forEach((conf) => { + instance.state.set('msgsViewBackDelta', conf.messages_view_backward_delta); + }); + }); + + instance.autorun(function () { + let msgsViewBackDelta = instance.state.get('msgsViewBackDelta'); + + instance.subscribe('messages/count?backDelta&level', msgsViewBackDelta, 'info'); + instance.subscribe('messages/count?backDelta&level', msgsViewBackDelta, 'warning'); + instance.subscribe('messages/count?backDelta&level', msgsViewBackDelta, 'error'); }); }); @@ -50,4 +67,12 @@ Template.alarmIcons.helpers({ errorsCount: function(){ return Messages.find({level:'error'}).count(); }, + + msgCounterName: function (level) { + let instance = Template.instance(); + let msgsViewBackDelta = instance.state.get('msgsViewBackDelta'); + let counterName = `messages/count?backDelta=${msgsViewBackDelta}&level=${level}`; + + return counterName; + } }); diff --git a/ui/imports/ui/components/clique-type/clique-type.js b/ui/imports/ui/components/clique-type/clique-type.js index ae50b94..9b21442 100644 --- a/ui/imports/ui/components/clique-type/clique-type.js +++ b/ui/imports/ui/components/clique-type/clique-type.js @@ -130,7 +130,7 @@ Template.CliqueType.helpers({ objectTypesList: function () { return R.ifElse(R.isNil, R.always([]), R.prop('data') - )(Constants.findOne({ name: 'object_types_for_links' })); + )(Constants.findOne({ name: 'object_types_for_links' })); }, linkTypesList: function () { @@ -280,7 +280,7 @@ function submitItem( focal_point_type, link_types, name - ) { +) { let action = instance.state.get('action'); @@ -316,7 +316,7 @@ function submitItem( break; default: - // todo + // todo break; } } diff --git a/ui/imports/ui/components/configuration/configuration.html b/ui/imports/ui/components/configuration/configuration.html new file mode 100644 index 0000000..f381453 --- /dev/null +++ b/ui/imports/ui/components/configuration/configuration.html @@ -0,0 +1,31 @@ + diff --git a/ui/imports/ui/components/configuration/configuration.js b/ui/imports/ui/components/configuration/configuration.js new file mode 100644 index 0000000..493cc36 --- /dev/null +++ b/ui/imports/ui/components/configuration/configuration.js @@ -0,0 +1,114 @@ +/* + * Template Component: Configuration + */ + +//import { Meteor } from 'meteor/meteor'; +import { Template } from 'meteor/templating'; +import { ReactiveDict } from 'meteor/reactive-dict'; +//import { SimpleSchema } from 'meteor/aldeed:simple-schema'; +import * as R from 'ramda'; + +import { save } from '/imports/api/configurations/methods'; +import { Configurations } from '/imports/api/configurations/configurations'; + +import './configuration.html'; + +/* + * Lifecycles + */ + +Template.Configuration.onCreated(function() { + let instance = this; + instance.state = new ReactiveDict(); + instance.state.setDefault({ + model: Configurations.schema.clean({}), + actionResult: 'none', + message: null, + }); + + /* + instance.autorun(function () { + let data = Template.currentData(); + + new SimpleSchema({ + }).validate(data); + }); + */ + + instance.autorun(function () { + instance.subscribe('configurations?user'); + Configurations.find({user_id: Meteor.userId()}).forEach((conf) => { + instance.state.set('model', conf); + }); + }); +}); + +/* +Template.Configuration.rendered = function() { +}; +*/ + +/* + * Events + */ + +Template.Configuration.events({ + 'click .js-submit-button': function (event, instance) { + event.preventDefault(); + let msgsViewBackDelta = instance.$('.cl-msgs-view-back-delta')[0].value; + saveForm(instance, msgsViewBackDelta); + } +}); + +/* + * Helpers + */ + +Template.Configuration.helpers({ + getModelField: function (fieldName) { + let instance = Template.instance(); + return R.path([fieldName], instance.state.get('model')); + }, + + getState: function (key) { + let instance = Template.instance(); + return instance.state.get(key); + }, + + isActionError: function () { + let instance = Template.instance(); + return instance.state.get('actionResult') === 'error'; + }, + + isActionSuccess: function () { + let instance = Template.instance(); + return instance.state.get('actionResult') === 'success'; + }, + + durationHumanize: function (duration) { + return moment.duration(duration).humanize(); + } +}); // end: helpers + +function saveForm(instance, msgsViewBackDelta) { + instance.state.set('actionResult', 'none'); + instance.state.set('message', null); + + save.call({ + messages_view_backward_delta: msgsViewBackDelta + }, (error) => { + if (error) { + instance.state.set('actionResult', 'error'); + if (typeof error === 'string') { + instance.state.set('message', error); + } else { + instance.state.set('message', error.message); + } + + return; + } + + instance.state.set('actionResult', 'success'); + instance.state.set('message', 'record has been updated succesfuly'); + }); +} diff --git a/ui/imports/ui/components/configuration/configuration.styl b/ui/imports/ui/components/configuration/configuration.styl new file mode 100644 index 0000000..b8be180 --- /dev/null +++ b/ui/imports/ui/components/configuration/configuration.styl @@ -0,0 +1,38 @@ +/* Set the component style here */ +// "Configuration" +.os-configuration + display: flex; + flex-flow: column nowrap; + margin: 20px; + + .cl-field-group + display: flex; + flex-flow: row nowrap; + align-items: center; + padding: 5px 0; + + .cl-field-label + width: 120px; + margin: 0 5px; + + >.cl-input + display: block; + width: 100%; + min-height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + width: 400px; + margin: 0 5px; + + .cl-field-desc + margin: 0 5px; + + .js-message-panel + margin-top: 20px; diff --git a/ui/imports/ui/components/dashboard/dashboard.js b/ui/imports/ui/components/dashboard/dashboard.js index 85cede8..6fdc184 100644 --- a/ui/imports/ui/components/dashboard/dashboard.js +++ b/ui/imports/ui/components/dashboard/dashboard.js @@ -13,8 +13,8 @@ //import * as R from 'ramda'; import * as _ from 'lodash'; import { Environments } from '/imports/api/environments/environments'; -import { //Messages, - calcIconForMessageLevel, lastMessageTimestamp, calcColorClassForMessagesInfoBox +import { //Messages, + calcIconForMessageLevel, lastMessageTimestamp, calcColorClassForMessagesInfoBox } from '/imports/api/messages/messages'; import { Template } from 'meteor/templating'; import { Inventory } from '/imports/api/inventories/inventories'; @@ -27,7 +27,7 @@ import { setMainAppSelectedEnvironment } from '/imports/ui/actions/main-app.acti import '/imports/ui/components/messages-info-box/messages-info-box'; import '/imports/ui/components/environment-box/environment-box'; -import './dashboard.html'; +import './dashboard.html'; /* * Lifecycle methods @@ -212,10 +212,10 @@ Template.Dashboard.helpers({ icon: calcIconForMessageLevel(boxDef.level), colorClass: calcColorClassForMessagesInfoBox(boxDef.level), onMoreDetailsReq: function () { - $('#messagesModalGlobal').modal('show', { + $('#messagesModalGlobal').modal('show', { dataset: { messageLevel: boxDef.level, - } + } }); } }; @@ -223,10 +223,10 @@ Template.Dashboard.helpers({ argsEnvBox: function ( environmentName, - regionsCount, - regions, - projectsCount, - projects, + regionsCount, + regions, + projectsCount, + projects, instancesCount, vservicesCount, vconnectorsCount, diff --git a/ui/imports/ui/components/environment-dashboard/environment-dashboard.js b/ui/imports/ui/components/environment-dashboard/environment-dashboard.js index 433096e..82fbb52 100644 --- a/ui/imports/ui/components/environment-dashboard/environment-dashboard.js +++ b/ui/imports/ui/components/environment-dashboard/environment-dashboard.js @@ -26,6 +26,7 @@ import { calcIconForMessageLevel, lastMessageTimestamp, calcColorClassForMessage import { Counts } from 'meteor/tmeasday:publish-counts'; import { Roles } from 'meteor/alanning:roles'; //import { idToStr } from '/imports/lib/utilities'; +import { Counter } from 'meteor/natestrauser:publish-performant-counts'; import '/imports/ui/components/data-cubic/data-cubic'; import '/imports/ui/components/icon/icon'; @@ -123,9 +124,10 @@ Template.EnvironmentDashboard.onCreated(function() { 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'); + + instance.subscribe('messages/count?level&env', 'info', env.name); + instance.subscribe('messages/count?level&env', 'warning', env.name); + instance.subscribe('messages/count?level&env', 'error', env.name); let vConnectorCounterName = 'inventory?env+type!counter?env=' + env.name + '&type=' + 'vconnector'; @@ -316,8 +318,11 @@ Template.EnvironmentDashboard.helpers({ }; } - let count = Counts.get('messages?env+level!counter?env=' + - envName + '&level=' + boxDef.level); + let counterName = `messages/count?level=${boxDef.level}&env=${envName}`; + let count = Counter.get(counterName); + + //let count = Counts.get('messages?env+level!counter?env=' + + // envName + '&level=' + boxDef.level); let title = _.capitalize(boxDef.level); diff --git a/ui/imports/ui/components/environment/environment.js b/ui/imports/ui/components/environment/environment.js index 83574f2..1f0e723 100644 --- a/ui/imports/ui/components/environment/environment.js +++ b/ui/imports/ui/components/environment/environment.js @@ -157,6 +157,7 @@ Template.Environment.onCreated(function () { new SimpleSchema({ _id: _idFieldDef, selectedNodeId: R.assoc('optional', true, _idFieldDef), + refresh: { type: String, optional: true }, }).validate(data); store.dispatch(setEnvEnvId(data._id)); diff --git a/ui/imports/ui/components/graph-tooltip-window/graph-tooltip-window.html b/ui/imports/ui/components/graph-tooltip-window/graph-tooltip-window.html index 53537ca..4ce9787 100644 --- a/ui/imports/ui/components/graph-tooltip-window/graph-tooltip-window.html +++ b/ui/imports/ui/components/graph-tooltip-window/graph-tooltip-window.html @@ -9,8 +9,8 @@ ######################################################################################## -->