You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2017/04/13 15:56:50 UTC

[20/29] ignite git commit: IGNITE-4943 Improve design of table on Admin Panel screen.

IGNITE-4943 Improve design of table on Admin Panel screen.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/8c9c60a4
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/8c9c60a4
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/8c9c60a4

Branch: refs/heads/ignite-4929
Commit: 8c9c60a48e3431950791c8cfeb9236f6d034e1cb
Parents: 4ad2657
Author: Dmitriy Shabalin <ds...@gridgain.com>
Authored: Wed Apr 12 10:19:06 2017 +0700
Committer: Andrey Novikov <an...@gridgain.com>
Committed: Wed Apr 12 10:19:06 2017 +0700

----------------------------------------------------------------------
 modules/web-console/frontend/.eslintrc          |   2 +-
 modules/web-console/frontend/app/app.js         |   3 -
 .../form-field-datepicker.pug                   |  59 ----
 .../form-field-datepicker.scss                  |  20 --
 .../list-of-registered-users.categories.js      |   4 +-
 .../list-of-registered-users.column-defs.js     |  44 +--
 .../list-of-registered-users.controller.js      | 132 ++++++--
 .../list-of-registered-users.scss               |   4 +
 .../list-of-registered-users.tpl.pug            |  73 ++---
 .../ui-grid-header/ui-grid-header.scss          |  91 ------
 .../ui-grid-header/ui-grid-header.tpl.pug       |  29 --
 .../ui-grid-settings/ui-grid-settings.pug       |  33 --
 .../ui-grid-settings/ui-grid-settings.scss      | 144 ---------
 .../frontend/app/helpers/jade/mixins.pug        |   3 +
 .../frontend/app/modules/states/admin.state.js  |  11 +-
 .../frontend/app/primitives/badge/index.scss    |   4 +
 .../frontend/app/primitives/btn/index.scss      |  41 +++
 .../app/primitives/datepicker/index.pug         |  60 ++++
 .../app/primitives/datepicker/index.scss        |  64 ++++
 .../frontend/app/primitives/dropdown/index.pug  |  43 +++
 .../frontend/app/primitives/dropdown/index.scss |  82 +++++
 .../frontend/app/primitives/index.js            |   8 +
 .../frontend/app/primitives/page/index.scss     |  35 ++
 .../frontend/app/primitives/panel/index.scss    |  51 +++
 .../frontend/app/primitives/tabs/index.scss     |  15 +
 .../app/primitives/ui-grid-header/index.scss    |  91 ++++++
 .../app/primitives/ui-grid-header/index.tpl.pug |  29 ++
 .../app/primitives/ui-grid-settings/index.pug   |  33 ++
 .../app/primitives/ui-grid-settings/index.scss  | 171 ++++++++++
 .../frontend/app/primitives/ui-grid/index.scss  | 321 +++++++++++++++++++
 .../frontend/public/stylesheets/style.scss      |   5 -
 modules/web-console/frontend/views/base2.pug    |  22 ++
 .../frontend/views/settings/admin.tpl.pug       |   3 +-
 .../web-console/frontend/views/sql/sql.tpl.pug  |   1 -
 34 files changed, 1249 insertions(+), 482 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/.eslintrc
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/.eslintrc b/modules/web-console/frontend/.eslintrc
index 958c6d1..adbeb84 100644
--- a/modules/web-console/frontend/.eslintrc
+++ b/modules/web-console/frontend/.eslintrc
@@ -143,7 +143,7 @@ rules:
     no-script-url: 0
     no-self-compare: 2
     no-sequences: 2
-    no-shadow: 2
+    no-shadow: 0
     no-shadow-restricted-names: 2
     no-spaced-func: 2
     no-sparse-arrays: 1

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/app.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/app.js b/modules/web-console/frontend/app/app.js
index 26d3ad5..80e32a1 100644
--- a/modules/web-console/frontend/app/app.js
+++ b/modules/web-console/frontend/app/app.js
@@ -17,9 +17,6 @@
 
 import '../public/stylesheets/style.scss';
 import '../app/primitives';
-import './components/ui-grid-header/ui-grid-header.scss';
-import './components/ui-grid-settings/ui-grid-settings.scss';
-import './components/form-field-datepicker/form-field-datepicker.scss';
 
 import './app.config';
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/components/form-field-datepicker/form-field-datepicker.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/form-field-datepicker/form-field-datepicker.pug b/modules/web-console/frontend/app/components/form-field-datepicker/form-field-datepicker.pug
deleted file mode 100644
index d70476f..0000000
--- a/modules/web-console/frontend/app/components/form-field-datepicker/form-field-datepicker.pug
+++ /dev/null
@@ -1,59 +0,0 @@
-//-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
-mixin ignite-form-field-datepicker(label, model, name, mindate, maxdate, disabled, required, placeholder, tip)
-    mixin form-field-input()
-        input.form-control(
-            id=`{{ ${name} }}Input`
-            name=`{{ ${name} }}`
-
-            placeholder=placeholder
-            
-            data-ng-model=model
-
-            data-ng-required=required && `${required}`
-            data-ng-disabled=disabled && `${disabled}`
-
-            bs-datepicker
-            data-date-format='MMM yyyy'
-            data-start-view='1'
-            data-min-view='1'
-
-            data-min-date=mindate ? `{{ ${mindate} }}` : false
-            data-max-date=maxdate ? `{{ ${maxdate} }}` : `today`
-
-            data-container='body > .wrapper'
-
-            tabindex='0'
-
-            onkeydown="return false"
-
-            data-ignite-form-panel-field=''
-        )&attributes(attributes.attributes)
-
-    .ignite-form-field
-        if name
-            +ignite-form-field__label(label, name, required)
-
-        .ignite-form-field__control
-            if tip
-                i.tipField.icon-help(bs-tooltip='' data-title=tip)
-
-            if block
-                block
-
-            .input-tip
-                +form-field-input(attributes=attributes)

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/components/form-field-datepicker/form-field-datepicker.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/form-field-datepicker/form-field-datepicker.scss b/modules/web-console/frontend/app/components/form-field-datepicker/form-field-datepicker.scss
deleted file mode 100644
index 0f6fe6e..0000000
--- a/modules/web-console/frontend/app/components/form-field-datepicker/form-field-datepicker.scss
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-.datepicker.dropdown-menu tbody button {
-    height: 100%;
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.categories.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.categories.js b/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.categories.js
index 95edf8b..01b1fc8 100644
--- a/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.categories.js
+++ b/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.categories.js
@@ -16,8 +16,8 @@
  */
 
 export default [
-    {name: 'Actions', visible: true, selectable: true},
-    {name: 'User', visible: true, selectable: true},
+    {name: 'Actions', visible: false, selectable: false},
+    {name: 'User', visible: true, selectable: false},
     {name: 'Email', visible: true, selectable: true},
     {name: 'Company', visible: true, selectable: true},
     {name: 'Country', visible: true, selectable: true},

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.column-defs.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.column-defs.js b/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.column-defs.js
index e859acf..54bfb03 100644
--- a/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.column-defs.js
+++ b/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.column-defs.js
@@ -17,7 +17,7 @@
 
 const ICON_SORT = '<span ui-grid-one-bind-id-grid="col.uid + \'-sortdir-text\'" ui-grid-visible="col.sort.direction" aria-label="Sort Descending"><i ng-class="{ \'ui-grid-icon-up-dir\': col.sort.direction == asc, \'ui-grid-icon-down-dir\': col.sort.direction == desc, \'ui-grid-icon-blank\': !col.sort.direction }" title="" aria-hidden="true"></i></span>';
 
-const USER_TEMPLATE = '<div class="ui-grid-cell-contents"><i class="pull-left" ng-class="row.entity.admin ? \'icon-admin\' : \'icon-user\'"></i>{{ COL_FIELD }}</div>';
+const USER_TEMPLATE = '<div class="ui-grid-cell-contents"><i class="pull-left" ng-class="row.entity.admin ? \'icon-admin\' : \'icon-user\'"></i>&nbsp;{{ COL_FIELD }}</div>';
 
 const CLUSTER_HEADER_TEMPLATE = `<div class='ui-grid-cell-contents' bs-tooltip data-title='{{ col.headerTooltip(col) }}' data-placement='top'><i class='fa fa-sitemap'></i>${ICON_SORT}</div>`;
 const MODEL_HEADER_TEMPLATE = `<div class='ui-grid-cell-contents' bs-tooltip data-title='{{ col.headerTooltip(col) }}' data-placement='top'><i class='fa fa-object-group'></i>${ICON_SORT}</div>`;
@@ -49,32 +49,32 @@ const ACTIONS_TEMPLATE = `
 const EMAIL_TEMPLATE = '<div class="ui-grid-cell-contents"><a ng-href="mailto:{{ COL_FIELD }}">{{ COL_FIELD }}</a></div>';
 
 export default [
-    {name: 'actions', displayName: 'Actions', categoryDisplayName: 'Actions', cellTemplate: ACTIONS_TEMPLATE, field: 'actions', minWidth: 70, width: 70, enableFiltering: false, enableSorting: false},
+    {name: 'actions', displayName: 'Actions', categoryDisplayName: 'Actions', cellTemplate: ACTIONS_TEMPLATE, field: 'actions', minWidth: 70, width: 70, enableFiltering: false, enableSorting: false, visible: false},
     {name: 'user', displayName: 'User', categoryDisplayName: 'User', field: 'userName', cellTemplate: USER_TEMPLATE, minWidth: 160, enableFiltering: true, filter: { placeholder: 'Filter by name...' }},
-    {name: 'email', displayName: 'Email', categoryDisplayName: 'Email', field: 'email', cellTemplate: EMAIL_TEMPLATE, minWidth: 160, enableFiltering: true, filter: { placeholder: 'Filter by email...' }},
+    {name: 'email', displayName: 'Email', categoryDisplayName: 'Email', field: 'email', cellTemplate: EMAIL_TEMPLATE, minWidth: 160, enableFiltering: false, filter: { placeholder: 'Filter by email...' }},
     {name: 'company', displayName: 'Company', categoryDisplayName: 'Company', field: 'company', minWidth: 160, enableFiltering: true, filter: { placeholder: 'Filter by company...' }},
-    {name: 'country', displayName: 'Country', categoryDisplayName: 'Country', field: 'countryCode', minWidth: 80, enableFiltering: true, filter: { placeholder: 'Filter by country...' }},
+    {name: 'country', displayName: 'Country', categoryDisplayName: 'Country', field: 'countryCode', minWidth: 120, enableFiltering: true, filter: { placeholder: 'Filter by country...' }},
     {name: 'lastlogin', displayName: 'Last login', categoryDisplayName: 'Last login', field: 'lastLogin', cellFilter: 'date:"M/d/yy HH:mm"', minWidth: 105, width: 105, enableFiltering: false, visible: false},
-    {name: 'lastactivity', displayName: 'Last activity', categoryDisplayName: 'Last activity', field: 'lastActivity', cellFilter: 'date:"M/d/yy HH:mm"', minWidth: 115, width: 115, enableFiltering: false, visible: true, sort: { direction: 'desc', priority: 0 }},
+    {name: 'lastactivity', displayName: 'Last activity', categoryDisplayName: 'Last activity', field: 'lastActivity', cellFilter: 'date:"M/d/yy HH:mm"', minWidth: 130, width: 130, enableFiltering: false, visible: true, sort: { direction: 'desc', priority: 0 }},
     // Configurations
-    {name: 'cfg_clusters', displayName: 'Clusters count', categoryDisplayName: 'Configurations', headerCellTemplate: CLUSTER_HEADER_TEMPLATE, field: 'counters.clusters', type: 'number', headerTooltip: 'Clusters count', minWidth: 55, width: 55, enableFiltering: false, visible: false},
-    {name: 'cfg_models', displayName: 'Models count', categoryDisplayName: 'Configurations', headerCellTemplate: MODEL_HEADER_TEMPLATE, field: 'counters.models', type: 'number', headerTooltip: 'Models count', minWidth: 55, width: 55, enableFiltering: false, visible: false},
-    {name: 'cfg_caches', displayName: 'Caches count', categoryDisplayName: 'Configurations', headerCellTemplate: CACHE_HEADER_TEMPLATE, field: 'counters.caches', type: 'number', headerTooltip: 'Caches count', minWidth: 55, width: 55, enableFiltering: false, visible: false},
-    {name: 'cfg_igfs', displayName: 'IGFS count', categoryDisplayName: 'Configurations', headerCellTemplate: IGFS_HEADER_TEMPLATE, field: 'counters.igfs', type: 'number', headerTooltip: 'IGFS count', minWidth: 55, width: 55, enableFiltering: false, visible: false},
+    {name: 'cfg_clusters', displayName: 'Clusters count', categoryDisplayName: 'Configurations', headerCellTemplate: CLUSTER_HEADER_TEMPLATE, field: 'counters.clusters', type: 'number', cellClass: 'ui-grid-number-cell', headerTooltip: 'Clusters count', minWidth: 65, width: 65, enableFiltering: false, visible: false},
+    {name: 'cfg_models', displayName: 'Models count', categoryDisplayName: 'Configurations', headerCellTemplate: MODEL_HEADER_TEMPLATE, field: 'counters.models', type: 'number', cellClass: 'ui-grid-number-cell', headerTooltip: 'Models count', minWidth: 65, width: 65, enableFiltering: false, visible: false},
+    {name: 'cfg_caches', displayName: 'Caches count', categoryDisplayName: 'Configurations', headerCellTemplate: CACHE_HEADER_TEMPLATE, field: 'counters.caches', type: 'number', cellClass: 'ui-grid-number-cell', headerTooltip: 'Caches count', minWidth: 65, width: 65, enableFiltering: false, visible: false},
+    {name: 'cfg_igfs', displayName: 'IGFS count', categoryDisplayName: 'Configurations', headerCellTemplate: IGFS_HEADER_TEMPLATE, field: 'counters.igfs', type: 'number', cellClass: 'ui-grid-number-cell', headerTooltip: 'IGFS count', minWidth: 65, width: 65, enableFiltering: false, visible: false},
     // Activities Total
-    {name: 'cfg', displayName: 'Cfg', categoryDisplayName: 'Total activities', field: 'activitiesTotal["configuration"] || 0', type: 'number', headerTooltip: 'Total count of configuration usages', minWidth: 55, width: 55, enableFiltering: false},
-    {name: 'qry', displayName: 'Qry', categoryDisplayName: 'Total activities', field: 'activitiesTotal["queries"] || 0', type: 'number', headerTooltip: 'Total count of queries usages', minWidth: 55, width: 55, enableFiltering: false},
-    {name: 'demo', displayName: 'Demo', categoryDisplayName: 'Total activities', field: 'activitiesTotal["demo"] || 0', type: 'number', headerTooltip: 'Total count of demo startup', minWidth: 65, width: 65, enableFiltering: false},
-    {name: 'dnld', displayName: 'Dnld', categoryDisplayName: 'Total activities', field: 'activitiesDetail["/agent/download"] || 0', type: 'number', headerTooltip: 'Total count of agent downloads', minWidth: 55, width: 55, enableFiltering: false},
-    {name: 'starts', displayName: 'Starts', categoryDisplayName: 'Total activities', field: 'activitiesDetail["/agent/start"] || 0', type: 'number', headerTooltip: 'Total count of agent startup', minWidth: 65, width: 65, enableFiltering: false},
+    {name: 'cfg', displayName: 'Cfg', categoryDisplayName: 'Total activities', field: 'activitiesTotal["configuration"] || 0', type: 'number', cellClass: 'ui-grid-number-cell', headerTooltip: 'Total count of configuration usages', minWidth: 70, width: 70, enableFiltering: false},
+    {name: 'qry', displayName: 'Qry', categoryDisplayName: 'Total activities', field: 'activitiesTotal["queries"] || 0', type: 'number', cellClass: 'ui-grid-number-cell', headerTooltip: 'Total count of queries usages', minWidth: 70, width: 70, enableFiltering: false},
+    {name: 'demo', displayName: 'Demo', categoryDisplayName: 'Total activities', field: 'activitiesTotal["demo"] || 0', type: 'number', cellClass: 'ui-grid-number-cell', headerTooltip: 'Total count of demo startup', minWidth: 85, width: 85, enableFiltering: false},
+    {name: 'dnld', displayName: 'Dnld', categoryDisplayName: 'Total activities', field: 'activitiesDetail["/agent/download"] || 0', type: 'number', cellClass: 'ui-grid-number-cell', headerTooltip: 'Total count of agent downloads', minWidth: 80, width: 80, enableFiltering: false},
+    {name: 'starts', displayName: 'Starts', categoryDisplayName: 'Total activities', field: 'activitiesDetail["/agent/start"] || 0', type: 'number', cellClass: 'ui-grid-number-cell', headerTooltip: 'Total count of agent startup', minWidth: 80, width: 80, enableFiltering: false},
     // Activities Configuration
-    {name: 'clusters', displayName: 'Clusters', categoryDisplayName: 'Configuration\'s activities', field: 'activitiesDetail["/configuration/clusters"] || 0', type: 'number', headerTooltip: 'Configuration clusters', minWidth: 55, width: 80, enableFiltering: false, visible: false},
-    {name: 'model', displayName: 'Model', categoryDisplayName: 'Configuration\'s activities', field: 'activitiesDetail["/configuration/domains"] || 0', type: 'number', headerTooltip: 'Configuration model', minWidth: 55, width: 80, enableFiltering: false, visible: false},
-    {name: 'caches', displayName: 'Caches', categoryDisplayName: 'Configuration\'s activities', field: 'activitiesDetail["/configuration/caches"] || 0', type: 'number', headerTooltip: 'Configuration caches', minWidth: 55, width: 80, enableFiltering: false, visible: false},
-    {name: 'igfs', displayName: 'IGFS', categoryDisplayName: 'Configuration\'s activities', field: 'activitiesDetail["/configuration/igfs"] || 0', type: 'number', headerTooltip: 'Configuration IGFS', minWidth: 55, width: 80, enableFiltering: false, visible: false},
-    {name: 'summary', displayName: 'Summary', categoryDisplayName: 'Configuration\'s activities', field: 'activitiesDetail["/configuration/summary"] || 0', type: 'number', headerTooltip: 'Configuration summary', minWidth: 55, width: 80, enableFiltering: false, visible: false},
+    {name: 'clusters', displayName: 'Clusters', categoryDisplayName: 'Configuration\'s activities', field: 'activitiesDetail["/configuration/clusters"] || 0', type: 'number', cellClass: 'ui-grid-number-cell', headerTooltip: 'Configuration clusters', minWidth: 80, width: 80, enableFiltering: false, visible: false},
+    {name: 'model', displayName: 'Model', categoryDisplayName: 'Configuration\'s activities', field: 'activitiesDetail["/configuration/domains"] || 0', type: 'number', cellClass: 'ui-grid-number-cell', headerTooltip: 'Configuration model', minWidth: 80, width: 80, enableFiltering: false, visible: false},
+    {name: 'caches', displayName: 'Caches', categoryDisplayName: 'Configuration\'s activities', field: 'activitiesDetail["/configuration/caches"] || 0', type: 'number', cellClass: 'ui-grid-number-cell', headerTooltip: 'Configuration caches', minWidth: 80, width: 80, enableFiltering: false, visible: false},
+    {name: 'igfs', displayName: 'IGFS', categoryDisplayName: 'Configuration\'s activities', field: 'activitiesDetail["/configuration/igfs"] || 0', type: 'number', cellClass: 'ui-grid-number-cell', headerTooltip: 'Configuration IGFS', minWidth: 80, width: 80, enableFiltering: false, visible: false},
+    {name: 'summary', displayName: 'Summary', categoryDisplayName: 'Configuration\'s activities', field: 'activitiesDetail["/configuration/summary"] || 0', type: 'number', cellClass: 'ui-grid-number-cell', headerTooltip: 'Configuration summary', minWidth: 80, width: 80, enableFiltering: false, visible: false},
     // Activities Queries
-    {name: 'execute', displayName: 'Execute', categoryDisplayName: 'Queries\' activities', field: 'activitiesDetail["/queries/execute"] || 0', type: 'number', headerTooltip: 'Query executions', minWidth: 55, width: 80, enableFiltering: false, visible: false},
-    {name: 'explain', displayName: 'Explain', categoryDisplayName: 'Queries\' activities', field: 'activitiesDetail["/queries/explain"] || 0', type: 'number', headerTooltip: 'Query explain executions', minWidth: 55, width: 80, enableFiltering: false, visible: false},
-    {name: 'scan', displayName: 'Scan', categoryDisplayName: 'Queries\' activities', field: 'activitiesDetail["/queries/scan"] || 0', type: 'number', headerTooltip: 'Scan query executions', minWidth: 55, width: 80, enableFiltering: false, visible: false}
+    {name: 'execute', displayName: 'Execute', categoryDisplayName: 'Queries\' activities', field: 'activitiesDetail["/queries/execute"] || 0', type: 'number', cellClass: 'ui-grid-number-cell', headerTooltip: 'Query executions', minWidth: 65, width: 80, enableFiltering: false, visible: false},
+    {name: 'explain', displayName: 'Explain', categoryDisplayName: 'Queries\' activities', field: 'activitiesDetail["/queries/explain"] || 0', type: 'number', cellClass: 'ui-grid-number-cell', headerTooltip: 'Query explain executions', minWidth: 65, width: 80, enableFiltering: false, visible: false},
+    {name: 'scan', displayName: 'Scan', categoryDisplayName: 'Queries\' activities', field: 'activitiesDetail["/queries/scan"] || 0', type: 'number', cellClass: 'ui-grid-number-cell', headerTooltip: 'Scan query executions', minWidth: 65, width: 80, enableFiltering: false, visible: false}
 ];

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.controller.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.controller.js b/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.controller.js
index acf76fa..3590229 100644
--- a/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.controller.js
+++ b/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.controller.js
@@ -15,14 +15,13 @@
  * limitations under the License.
  */
 
-import headerTemplate from 'app/components/ui-grid-header/ui-grid-header.tpl.pug';
+import headerTemplate from 'app/primitives/ui-grid-header/index.tpl.pug';
 
 import columnDefs from './list-of-registered-users.column-defs';
 import categories from './list-of-registered-users.categories';
 
 const rowTemplate = `<div
   ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.uid"
-  ng-mouseover="grid.api.selection.selectRow(row.entity);"
   ui-grid-one-bind-id-grid="rowRenderIndex + '-' + col.uid + '-cell'"
   class="ui-grid-cell"
   ng-class="{ 'ui-grid-row-header-cell': col.isRowHeader }"
@@ -39,6 +38,8 @@ export default class IgniteListOfRegisteredUsersCtrl {
 
         $ctrl.groupBy = 'user';
 
+        $ctrl.selected = [];
+
         $ctrl.params = {
             startDate: new Date(),
             endDate: new Date()
@@ -46,14 +47,20 @@ export default class IgniteListOfRegisteredUsersCtrl {
 
         $ctrl.uiGridGroupingConstants = uiGridGroupingConstants;
 
-        const becomeUser = (user) => {
+        User.read().then((user) => $ctrl.user = user);
+
+        const becomeUser = () => {
+            const user = this.gridApi.selection.getSelectedRows()[0];
+
             AdminData.becomeUser(user._id)
                 .then(() => User.load())
                 .then(() => $state.go('base.configuration.clusters'))
                 .then(() => NotebookData.load());
         };
 
-        const removeUser = (user) => {
+        const removeUser = () => {
+            const user = this.gridApi.selection.getSelectedRows()[0];
+
             Confirm.confirm(`Are you sure you want to remove user: "${user.userName}"?`)
                 .then(() => AdminData.removeUser(user))
                 .then(() => {
@@ -65,7 +72,9 @@ export default class IgniteListOfRegisteredUsersCtrl {
                 .then(() => $ctrl.adjustHeight($ctrl.gridOptions.data.length));
         };
 
-        const toggleAdmin = (user) => {
+        const toggleAdmin = () => {
+            const user = this.gridApi.selection.getSelectedRows()[0];
+
             if (user.adminChanging)
                 return;
 
@@ -76,7 +85,9 @@ export default class IgniteListOfRegisteredUsersCtrl {
                 .finally(() => user.adminChanging = false);
         };
 
-        const showActivities = (user) => {
+        const showActivities = () => {
+            const user = this.gridApi.selection.getSelectedRows()[0];
+
             return new ActivitiesUserDialog({ user });
         };
 
@@ -92,6 +103,34 @@ export default class IgniteListOfRegisteredUsersCtrl {
             return renderableRows;
         };
 
+        $ctrl.actionOptions = [
+            {
+                action: 'Become this user',
+                click: becomeUser.bind(this),
+                available: true
+            },
+            {
+                action: 'Revoke admin',
+                click: toggleAdmin.bind(this),
+                available: true
+            },
+            {
+                action: 'Grant admin',
+                click: toggleAdmin.bind(this),
+                available: false
+            },
+            {
+                action: 'Remove user',
+                click: removeUser.bind(this),
+                available: true
+            },
+            {
+                action: 'Activity detail',
+                click: showActivities.bind(this),
+                available: true
+            }
+        ];
+
         $ctrl._userGridOptions = {
             columnDefs,
             categories
@@ -99,30 +138,38 @@ export default class IgniteListOfRegisteredUsersCtrl {
 
         $ctrl.gridOptions = {
             data: [],
-            columnVirtualizationThreshold: 30,
+
             columnDefs,
             categories,
+
             headerTemplate,
+            columnVirtualizationThreshold: 30,
             rowTemplate,
+            rowHeight: 46,
+            selectWithCheckboxOnly: true,
+            selectionRowHeaderWidth: 52,
+            suppressRemoveSort: false,
             enableFiltering: true,
+            enableSelectAll: true,
             enableRowSelection: true,
-            enableRowHeaderSelection: false,
+            enableFullRowSelection: true,
             enableColumnMenus: false,
             multiSelect: false,
             modifierKeysToMultiSelect: true,
-            noUnselect: true,
+            noUnselect: false,
             fastWatch: true,
             exporterSuppressColumns: ['actions'],
             exporterCsvColumnSeparator: ';',
             onRegisterApi: (api) => {
                 $ctrl.gridApi = api;
 
-                api.becomeUser = becomeUser;
-                api.removeUser = removeUser;
-                api.toggleAdmin = toggleAdmin;
-                api.showActivities = showActivities;
+                api.selection.on.rowSelectionChanged($scope, $ctrl._updateSelected.bind($ctrl));
+                api.selection.on.rowSelectionChangedBatch($scope, $ctrl._updateSelected.bind($ctrl));
 
                 api.grid.registerRowsProcessor(companiesExcludeFilter, 50);
+
+                $scope.$watch(() => $ctrl.gridApi.grid.getVisibleRows().length, (rows) => $ctrl.adjustHeight(rows));
+                $scope.$watch(() => $ctrl.params.companiesExclude, () => $ctrl.gridApi.grid.refreshRows());
             }
         };
 
@@ -142,7 +189,7 @@ export default class IgniteListOfRegisteredUsersCtrl {
                 });
         };
 
-        const fitlerDates = (sdt, edt) => {
+        const filterDates = (sdt, edt) => {
             $ctrl.gridOptions.exporterCsvFilename = `web_console_users_${dtFilter(sdt, 'yyyy_MM')}.csv`;
 
             const startDate = Date.UTC(sdt.getFullYear(), sdt.getMonth(), 1);
@@ -151,25 +198,37 @@ export default class IgniteListOfRegisteredUsersCtrl {
             reloadUsers({ startDate, endDate });
         };
 
-        $scope.$watch(() => $ctrl.params.companiesExclude, () => {
-            $ctrl.gridApi.grid.refreshRows();
-        });
-
-        $scope.$watch(() => $ctrl.params.startDate, (sdt) => fitlerDates(sdt, $ctrl.params.endDate));
-        $scope.$watch(() => $ctrl.params.endDate, (edt) => fitlerDates($ctrl.params.startDate, edt));
-
-        $scope.$watch(() => $ctrl.gridApi.grid.getVisibleRows().length, (length) => $ctrl.adjustHeight(length >= 20 ? 20 : length));
+        $scope.$watch(() => $ctrl.params.startDate, (sdt) => filterDates(sdt, $ctrl.params.endDate));
+        $scope.$watch(() => $ctrl.params.endDate, (edt) => filterDates($ctrl.params.startDate, edt));
     }
 
     adjustHeight(rows) {
-        const height = Math.min(rows, 20) * 30 + 75;
+        // Add header height.
+        const height = Math.min(rows, 20) * 48 + 78;
 
-        // Remove header height.
         this.gridApi.grid.element.css('height', height + 'px');
 
         this.gridApi.core.handleWindowResize();
     }
 
+    _updateSelected() {
+        const ids = this.gridApi.selection.getSelectedRows().map(({ _id }) => _id).sort();
+
+        if (ids.length) {
+            const user = this.gridApi.selection.getSelectedRows()[0];
+            const other = this.user._id !== user._id;
+
+            this.actionOptions[1].available = other && user.admin;
+            this.actionOptions[2].available = other && !user.admin;
+
+            this.actionOptions[0].available = other;
+            this.actionOptions[3].available = other;
+        }
+
+        if (!_.isEqual(ids, this.selected))
+            this.selected = ids;
+    }
+
     _enableColumns(_categories, visible) {
         _.forEach(_categories, (cat) => {
             cat.visible = visible;
@@ -180,6 +239,11 @@ export default class IgniteListOfRegisteredUsersCtrl {
             });
         });
 
+        // Check to all selected columns.
+        this.gridOptions.selectedAll = true;
+
+        _.forEach(this._selectableColumns(), ({ visible }) => this.gridOptions.selectedAll = visible);
+
         // Workaround for this.gridApi.grid.refresh() didn't return promise.
         this.gridApi.grid.processColumnsProcessors(this.gridApi.grid.columns)
             .then((renderableColumns) => this.gridApi.grid.setVisibleColumns(renderableColumns))
@@ -220,7 +284,6 @@ export default class IgniteListOfRegisteredUsersCtrl {
         this.groupBy = 'user';
 
         this.gridApi.grouping.clearGrouping();
-
         this.gridOptions.categories = this._userGridOptions.categories;
         this.gridOptions.columnDefs = this._userGridOptions.columnDefs;
     }
@@ -229,6 +292,7 @@ export default class IgniteListOfRegisteredUsersCtrl {
         this.groupBy = 'company';
 
         this.gridApi.grouping.clearGrouping();
+
         this.gridApi.grouping.groupColumn('company');
         this.gridApi.grouping.aggregateColumn('user', this.uiGridGroupingConstants.aggregation.COUNT);
 
@@ -242,17 +306,18 @@ export default class IgniteListOfRegisteredUsersCtrl {
         const _categories = _.cloneDeep(categories);
         const _columnDefs = _.cloneDeep(columnDefs);
 
-        // Cut company category;
+        // Cut company category.
         const company = _categories.splice(3, 1)[0];
+        company.selectable = false;
 
-        // Hide Actions category;
+        // Hide Actions category.
         _categories.splice(0, 1);
 
         _.forEach(_.filter(_columnDefs, {displayName: 'Actions'}), (col) => {
             col.visible = false;
         });
 
-        // Add company as first column;
+        // Add company as first column.
         _categories.unshift(company);
 
         _.forEach(_columnDefs, (col) => {
@@ -265,7 +330,7 @@ export default class IgniteListOfRegisteredUsersCtrl {
             col.customTreeAggregationFinalizerFn = (agg) => agg.rendered = agg.value;
         });
 
-        // Set grouping to last activity column
+        // Set grouping to last activity column.
         const lastactivity = _.find(_columnDefs, { name: 'lastactivity' });
 
         if (_.nonNil(lastactivity)) {
@@ -296,17 +361,18 @@ export default class IgniteListOfRegisteredUsersCtrl {
         const _categories = _.cloneDeep(categories);
         const _columnDefs = _.cloneDeep(columnDefs);
 
-        // Cut country category;
+        // Cut country category.
         const country = _categories.splice(4, 1)[0];
+        country.selectable = false;
 
-        // Hide Actions category;
+        // Hide Actions category.
         _categories.splice(0, 1);
 
         _.forEach(_.filter(_columnDefs, {displayName: 'Actions'}), (col) => {
             col.visible = false;
         });
 
-        // Add company as first column;
+        // Add company as first column.
         _categories.unshift(country);
 
         _.forEach(_columnDefs, (col) => {
@@ -319,7 +385,7 @@ export default class IgniteListOfRegisteredUsersCtrl {
             col.customTreeAggregationFinalizerFn = (agg) => agg.rendered = agg.value;
         });
 
-        // Set grouping to last activity column
+        // Set grouping to last activity column.
         const lastactivity = _.find(_columnDefs, { name: 'lastactivity' });
 
         if (_.nonNil(lastactivity)) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.scss b/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.scss
index 8059d70..d94fb2e 100644
--- a/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.scss
+++ b/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.scss
@@ -15,6 +15,10 @@
  * limitations under the License.
  */
 
+ignite-list-of-registered-users {
+  display: block;
+}
+
 .list-of-registered-users {
   & > a {
     display: inline-block;

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.tpl.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.tpl.pug b/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.tpl.pug
index ec4b4fd..c4fec37 100644
--- a/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.tpl.pug
+++ b/modules/web-console/frontend/app/components/list-of-registered-users/list-of-registered-users.tpl.pug
@@ -15,58 +15,59 @@
     limitations under the License.
 
 include /app/helpers/jade/mixins
-include /app/components/form-field-datepicker/form-field-datepicker.pug
 
 mixin grid-settings()
-    i.fa.fa-bars(data-animation='am-flip-x' bs-dropdown='' aria-haspopup='true' aria-expanded='expanded' data-auto-close='1' data-trigger='click')
-    ul.select.dropdown-menu(role='menu')
-        li(ng-repeat='item in $ctrl.gridOptions.categories|filter:{selectable:true}')
-            a(ng-click='$ctrl.toggleColumns(item, !item.visible)')
-                i.fa.fa-check-square-o.pull-left(ng-if='item.visible')
-                i.fa.fa-square-o.pull-left(ng-if='!item.visible')
-                span {{::item.name}}
-        li.divider
-        li
-            a(ng-click='$ctrl.selectAllColumns()') Select all
-        li
-            a(ng-click='$ctrl.clearAllColumns()') Clear all
-        li.divider
-        li
-            a(ng-click='$hide()') Close
-
+    .grid-settings
+        i.fa.fa-cog(data-animation='am-flip-x' bs-dropdown='' aria-haspopup='true' aria-expanded='expanded' data-auto-close='1' data-trigger='click')
+        ul.select.dropdown-menu(role='menu')
+            li
+                a(ng-click='$ctrl.gridOptions.selectedAll ? $ctrl.clearAllColumns() : $ctrl.selectAllColumns()') 
+                    i.fa.fa-check-square-o.pull-left(ng-if='$ctrl.gridOptions.selectedAll')
+                    i.fa.fa-square-o.pull-left(ng-if='!$ctrl.gridOptions.selectedAll')
+                    span All
+            li(ng-repeat='item in $ctrl.gridOptions.categories|filter:{selectable:true}')
+                a(ng-click='$ctrl.toggleColumns(item, !item.visible)')
+                    i.fa.fa-check-square-o.pull-left(ng-if='item.visible')
+                    i.fa.fa-square-o.pull-left(ng-if='!item.visible')
+                    span {{::item.name}}
 
 .list-of-registered-users
-    ul.tabs
+    ul.tabs.tabs--blue
         li(role='presentation' ng-class='{ active: $ctrl.groupBy === "user" }') 
             a(ng-click='$ctrl.groupByUser()') 
                 span Users
-                span.badge {{ $ctrl.gridOptions.data.length }}
+                span.badge.badge--blue {{ $ctrl.gridOptions.data.length }}
         li(role='presentation' ng-class='{ active: $ctrl.groupBy === "company" }')
             a(ng-click='$ctrl.groupByCompany()') 
                 span Companies
-                span.badge {{ $ctrl.companies.length }}
+                span.badge.badge--blue {{ $ctrl.companies.length }}
         li(role='presentation' ng-class='{ active: $ctrl.groupBy === "country" }')
             a(ng-click='$ctrl.groupByCountry()')
                 span Countries
-                span.badge {{ $ctrl.countries.length }}
+                span.badge.badge--blue {{ $ctrl.countries.length }}
 
-    .panel.panel-default
+    .panel--ignite
         .panel-heading.ui-grid-settings
-            +grid-settings
-            label(ng-show='$ctrl.groupBy === "user"') Showing users:&nbsp;
-                strong {{ $ctrl.gridApi.grid.getVisibleRows().length }}
-                sub(ng-show='users.length === $ctrl.gridApi.grid.getVisibleRows().length') all
-
-            -var form = 'admin'
-            form.pull-right(name=form novalidate)
-                button.btn.btn-primary(ng-click='$ctrl.exportCsv()' bs-tooltip data-title='Export table to csv') Export
-
-                .ui-grid-settings-dateperiod
-                    +ignite-form-field-datepicker('Period:', '$ctrl.params.startDate', '"period"', null, '$ctrl.params.endDate')
-                    +ignite-form-field-datepicker('Period:', '$ctrl.params.endDate', null, '$ctrl.params.startDate', null)
-
-                .ui-grid-settings-filter
+            .panel-title(ng-hide='$ctrl.selected.length')
+                span(ng-if='$ctrl.groupBy === "user"') List of registered users
+                span(ng-if='$ctrl.groupBy === "company"') List of registered companies
+                span(ng-if='$ctrl.groupBy === "country"') List of registered countries
+                +grid-settings
+                button.btn.btn--stroke(ng-click='$ctrl.exportCsv()' bs-tooltip data-title='Export table to csv')
+                    i.fa.fa-file-excel-o.export-icon
+                form.ui-grid-settings-dateperiod(name=form novalidate)
+                    -var form = 'admin'
+                    +ignite-form-field-datepicker('Period: from', '$ctrl.params.startDate', '"startDate"', null, '$ctrl.params.endDate')
+                    +ignite-form-field-datepicker('to', '$ctrl.params.endDate', '"endDate"', '$ctrl.params.startDate', null)
+                form.ui-grid-settings-filter
+                    -var form = 'admin'
                     +ignite-form-field-text('Exclude:', '$ctrl.params.companiesExclude', '"exclude"', false, false, 'Exclude by company name...')
 
+            .panel-selected(ng-show='$ctrl.selected.length')
+                .pull-right
+                    +ignite-form-field-bsdropdown('Actions', '$ctrl.action', 'action', false, false, '$ctrl.actionOptions')
+                div
+                    | {{ $ctrl.selected.length }} item{{ $ctrl.selected.length > 1 ? 's' : '' }} selected
+
         .panel-collapse
             .grid.ui-grid--ignite(ui-grid='$ctrl.gridOptions' ui-grid-resize-columns ui-grid-selection ui-grid-exporter ui-grid-pinning ui-grid-grouping)

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/components/ui-grid-header/ui-grid-header.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/ui-grid-header/ui-grid-header.scss b/modules/web-console/frontend/app/components/ui-grid-header/ui-grid-header.scss
deleted file mode 100644
index 4530c02..0000000
--- a/modules/web-console/frontend/app/components/ui-grid-header/ui-grid-header.scss
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-.ui-grid-header--subcategories {
-    .ui-grid-row:nth-child(even) .ui-grid-cell.cell-total {
-        background-color: rgba(102,175,233,.6);
-    }
-
-    .ui-grid-row:nth-child(odd) .ui-grid-cell.cell-total {
-        background-color: rgba(102,175,233,.3);
-    }
-
-    .ui-grid-header-cell-row {
-        height: 30px;
-    }
-
-    .ui-grid-header-cell {
-        .ui-grid-cell-contents > span:not(.ui-grid-header-cell-label) {
-            right: 3px;
-        }
-    }
-
-    .ui-grid-header-cell [role="columnheader"] {
-        display: flex;
-        
-        flex-wrap: wrap;
-        align-items: center;
-        justify-content: center;
-
-        height: 100%;
-
-        & > div {
-            flex: 1 100%;
-            height: auto;
-        }
-
-        & > div[ui-grid-filter] {
-            flex: auto;
-        }
-    }
-
-    .ui-grid-header-span {
-        position: relative;
-        border-right: 0;
-        background: #f5f5f5;
-
-        .ng-hide + .ui-grid-header-cell-row .ui-grid-header-cell {
-            height: 58px;
-        }
-
-        .ng-hide + .ui-grid-header-cell-row .ui-grid-cell-contents {
-            padding: 5px 5px;
-        }
-
-        .ui-grid-column-resizer.right {
-            top: -100px;
-        }
-        .ng-hide + .ui-grid-header-cell-row .ui-grid-column-resizer.right {
-            bottom: -100px;
-        }
-
-        &.ui-grid-header-cell .ui-grid-header-cell .ui-grid-column-resizer.right {
-            border-right-width: 0;
-        }
-        &.ui-grid-header-cell .ui-grid-header-cell:last-child .ui-grid-column-resizer.right {
-            border-right-width: 1px;
-        }
-
-        & > div > .ui-grid-cell-contents {
-            border-bottom: 1px solid #d4d4d4;
-        }
-    }
-
-    input {
-        line-height: 21px;
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/components/ui-grid-header/ui-grid-header.tpl.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/ui-grid-header/ui-grid-header.tpl.pug b/modules/web-console/frontend/app/components/ui-grid-header/ui-grid-header.tpl.pug
deleted file mode 100644
index 9b14fca..0000000
--- a/modules/web-console/frontend/app/components/ui-grid-header/ui-grid-header.tpl.pug
+++ /dev/null
@@ -1,29 +0,0 @@
-//-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
-.ui-grid-header.ui-grid-header--subcategories(role='rowgroup')
-    .ui-grid-top-panel
-        .ui-grid-header-viewport
-            .ui-grid-header-canvas
-                .ui-grid-header-cell-wrapper(ng-style='colContainer.headerCellWrapperStyle()')
-                    .ui-grid-header-cell-row(role='row')
-                        .ui-grid-header-span.ui-grid-header-cell.ui-grid-clearfix.ui-grid-category(ng-repeat='cat in grid.options.categories', ng-if='cat.visible && \
-                        (colContainer.renderedColumns | uiGridSubcategories: cat.name).length > 0')
-                            div(ng-show='(colContainer.renderedColumns|uiGridSubcategories:cat.name).length > 1')
-                                .ui-grid-cell-contents {{ cat.name }}
-                            .ui-grid-header-cell-row
-                                .ui-grid-header-cell.ui-grid-clearfix(ng-repeat='col in (colContainer.renderedColumns|uiGridSubcategories:cat.name) track by col.uid' ui-grid-header-cell='' col='col' render-index='$index')
-                        .ui-grid-header-cell.ui-grid-clearfix(ng-if='col.colDef.name === "treeBaseRowHeaderCol"' ng-repeat='col in colContainer.renderedColumns track by col.uid' ui-grid-header-cell='' col='col' render-index='$index')

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/components/ui-grid-settings/ui-grid-settings.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/ui-grid-settings/ui-grid-settings.pug b/modules/web-console/frontend/app/components/ui-grid-settings/ui-grid-settings.pug
deleted file mode 100644
index 8f1487e..0000000
--- a/modules/web-console/frontend/app/components/ui-grid-settings/ui-grid-settings.pug
+++ /dev/null
@@ -1,33 +0,0 @@
-//-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
-mixin ui-grid-settings()
-    .ui-grid-settings
-        i.fa.fa-bars(data-animation='am-flip-x' bs-dropdown='' aria-haspopup='true' aria-expanded='expanded' data-auto-close='1' data-trigger='click')
-        ul.select.dropdown-menu(role='menu')
-            li(ng-repeat='item in paragraph.gridOptions.categories|filter:{selectable:true}')
-                a(ng-click='paragraph.toggleColumns(item, !item.visible)')
-                    i.fa.fa-check-square-o.pull-left(ng-if='item.visible')
-                    i.fa.fa-square-o.pull-left(ng-if='!item.visible')
-                    span {{::item.name}}
-            li.divider
-            li
-                a(ng-click='paragraph.selectAllColumns()') Select all
-            li
-                a(ng-click='paragraph.clearAllColumns()') Clear all
-            li.divider
-            li
-                a(ng-click='$hide()') Close

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/components/ui-grid-settings/ui-grid-settings.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/ui-grid-settings/ui-grid-settings.scss b/modules/web-console/frontend/app/components/ui-grid-settings/ui-grid-settings.scss
deleted file mode 100644
index d0a31f0..0000000
--- a/modules/web-console/frontend/app/components/ui-grid-settings/ui-grid-settings.scss
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-.ui-grid-settings {
-    ul.select.dropdown-menu > li > a {
-        padding-top: 0;
-        padding-bottom: 0;
-    }
-
-    ul.select.dropdown-menu > li > a > i {
-        position: relative;
-        line-height: 26px;
-        width: 14px;
-        margin-left: 0;
-        color: inherit;
-    }
-
-    ul.select.dropdown-menu > li > a > span {
-        line-height: 26px;
-        padding-left: 5px;
-        padding-right: 8px;
-        cursor: pointer;
-    }
-
-    .btn {
-        float: right;
-
-        line-height: 20px;
-        margin-right: 0;
-    }
-
-    &-filter {
-        float: right;
-
-        .ignite-form-field {
-            width: 280px;
-            margin-right: 10px;
-
-            &__label {
-            }
-
-            &__control {
-            }
-
-            &:nth-child(1) {
-                float: left;
-
-                .ignite-form-field__label {
-                    width: 30%;
-                }
-
-                .ignite-form-field__control {
-                    width: 70%;
-                }
-            }
-        }
-    }
-
-    &-number-filter {
-        float: right;
-
-        .ignite-form-field {
-            width: 180px;
-            margin-right: 0;
-
-            &__label {
-            }
-
-            &__control {
-            }
-
-            &:nth-child(1) {
-                float: left;
-
-                .ignite-form-field__label {
-                    margin-right: 0;
-                    width: 70%;
-                    max-width: 100%;
-                }
-
-                .ignite-form-field__control {
-                    width: 30%;
-                }
-            }
-        }
-
-        button {
-            width: auto;
-            display: inline-block;
-            margin-left: 5px;
-        }
-    }
-
-    &-dateperiod {
-        float: right;
-
-        .ignite-form-field {
-            width: 160px;
-            margin-right: 10px;
-
-            &__label {
-            }
-
-            &__control {
-            }
-
-            &:nth-child(1) {
-                float: left;
-
-                .ignite-form-field__label {
-                    width: 40%;
-                }
-
-                .ignite-form-field__control {
-                    width: 60%;
-                }
-            }
-
-            &:nth-child(2) {
-                float: left;
-
-                width: 100px;
-
-                .ignite-form-field__control {
-                    width: 100%;
-                }
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/helpers/jade/mixins.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/helpers/jade/mixins.pug b/modules/web-console/frontend/app/helpers/jade/mixins.pug
index bf49fa9..3b6cd19 100644
--- a/modules/web-console/frontend/app/helpers/jade/mixins.pug
+++ b/modules/web-console/frontend/app/helpers/jade/mixins.pug
@@ -16,6 +16,9 @@
 
 include ./form
 include ../../primitives/tooltip/index
+include ../../primitives/datepicker/index
+include ../../primitives/dropdown/index
+include ../../primitives/ui-grid-settings/index
 
 //- Mixin for advanced options toggle.
 mixin advanced-options-toggle(click, cond, showMessage, hideMessage)

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/modules/states/admin.state.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/admin.state.js b/modules/web-console/frontend/app/modules/states/admin.state.js
index 93a38dd..ea9ba49 100644
--- a/modules/web-console/frontend/app/modules/states/admin.state.js
+++ b/modules/web-console/frontend/app/modules/states/admin.state.js
@@ -18,6 +18,7 @@
 import angular from 'angular';
 
 import templateUrl from 'views/settings/admin.tpl.pug';
+import template from 'views/base2.pug';
 
 angular
 .module('ignite-console.states.admin', [
@@ -28,7 +29,15 @@ angular
     $stateProvider
     .state('settings.admin', {
         url: '/admin',
-        templateUrl,
+        views: {
+            '@': {
+                template
+            },
+            '@settings.admin': {
+                templateUrl
+            }
+        },
+        // templateUrl,
         onEnter: AclRoute.checkAccess('admin_page'),
         metaTags: {
             title: 'Admin panel'

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/primitives/badge/index.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/primitives/badge/index.scss b/modules/web-console/frontend/app/primitives/badge/index.scss
index 837ab5b..8ce477f 100644
--- a/modules/web-console/frontend/app/primitives/badge/index.scss
+++ b/modules/web-console/frontend/app/primitives/badge/index.scss
@@ -33,4 +33,8 @@
   line-height: 12px;
 
   background-color: $brand-primary;
+}
+
+.badge--blue {
+  background-color: #0067b9;
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/primitives/btn/index.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/primitives/btn/index.scss b/modules/web-console/frontend/app/primitives/btn/index.scss
new file mode 100644
index 0000000..1eb027f
--- /dev/null
+++ b/modules/web-console/frontend/app/primitives/btn/index.scss
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.btn.btn--stroke {
+    min-width: 36px;
+    height: 36px;
+
+    line-height: 36px;
+    text-align: center;
+
+    color: #ee2b27;
+    border: 1px solid #ee2b27;
+    background: initial;
+
+    &:hover, &:focus {
+        color: #a8110f;
+        border-color: #a8110f;
+    }
+
+    &:focus {
+        outline: none;
+    }
+
+    i {
+        margin: 0;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/primitives/datepicker/index.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/primitives/datepicker/index.pug b/modules/web-console/frontend/app/primitives/datepicker/index.pug
new file mode 100644
index 0000000..10453c0
--- /dev/null
+++ b/modules/web-console/frontend/app/primitives/datepicker/index.pug
@@ -0,0 +1,60 @@
+//-
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+mixin ignite-form-field-datepicker(label, model, name, mindate, maxdate, disabled, required, placeholder, tip)
+    mixin form-field-input()
+        input.form-control(
+            id=`{{ ${name} }}Input`
+            name=`{{ ${name} }}`
+
+            placeholder=placeholder
+            
+            data-ng-model=model
+
+            data-ng-required=required && `${required}`
+            data-ng-disabled=disabled && `${disabled}`
+
+            bs-datepicker
+            data-date-format='MMM yyyy'
+            data-start-view='1'
+            data-min-view='1'
+
+            data-min-date=mindate ? `{{ ${mindate} }}` : false
+            data-max-date=maxdate ? `{{ ${maxdate} }}` : `today`
+
+            data-placement='bottom'
+            data-container='.docs-content'
+
+            tabindex='0'
+
+            onkeydown="return false"
+
+            data-ignite-form-panel-field=''
+        )&attributes(attributes.attributes)
+
+    .datepicker--ignite.ignite-form-field
+        if name
+            +ignite-form-field__label(label, name, required)
+
+        .ignite-form-field__control
+            if tip
+                i.tipField.icon-help(bs-tooltip='' data-title=tip)
+
+            if block
+                block
+
+            .input-tip
+                +form-field-input(attributes=attributes)

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/primitives/datepicker/index.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/primitives/datepicker/index.scss b/modules/web-console/frontend/app/primitives/datepicker/index.scss
new file mode 100644
index 0000000..786a2c1
--- /dev/null
+++ b/modules/web-console/frontend/app/primitives/datepicker/index.scss
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.datepicker.dropdown-menu tbody button {
+    height: 100%;
+}
+
+.datepicker--ignite {
+    $height: 36px;
+
+    display: inline-block;
+    width: auto;
+
+    font-size: 14px;
+
+    label.ignite-form-field__label {
+        width: auto;
+        max-width: initial;
+
+        font-size: inherit;
+        line-height: $height;
+    }
+
+    .ignite-form-field__control {
+        width: auto;
+
+        input {
+            width: auto;
+            height: $height;
+            min-width: 70px;
+            max-width: 70px;
+            padding: 0;
+            padding-left: 5px;
+
+            cursor: pointer;
+            color: transparent;
+            font-size: inherit;
+            line-height: $height;
+            text-align: left;
+            text-shadow: 0 0 0 #ee2b27;
+
+            border: none;
+            box-shadow: none;
+
+            &:hover, &:focus {
+                text-shadow: 0 0 0 #a8110f;
+            }
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/primitives/dropdown/index.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/primitives/dropdown/index.pug b/modules/web-console/frontend/app/primitives/dropdown/index.pug
new file mode 100644
index 0000000..a6476eb
--- /dev/null
+++ b/modules/web-console/frontend/app/primitives/dropdown/index.pug
@@ -0,0 +1,43 @@
+//-
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+mixin ignite-form-field-bsdropdown(label, model, name, disabled, required, options, tip)
+    .dropdown--ignite.ignite-form-field
+        .ignite-form-field__control(
+            data-ng-model=model
+
+            data-ng-required=required && `${required}`
+            data-ng-disabled=disabled && `${disabled}` || `!${options}.length`
+
+            bs-dropdown=''
+
+            data-trigger='hover focus'
+            data-placement='bottom-right'
+            data-container='self'
+            data-animation=''
+
+            tabindex='0'
+            aria-haspopup='true'
+            aria-expanded='false'
+        )&attributes(attributes.attributes)
+            a.dropdown-toggle
+                span !{label}
+                span.caret
+
+        ul.dropdown-menu(role='menu')
+            li(ng-repeat=`item in ${options}` ng-if='item.available')
+                a(ng-click='item.click()') {{ item.action }}
+

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/primitives/dropdown/index.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/primitives/dropdown/index.scss b/modules/web-console/frontend/app/primitives/dropdown/index.scss
new file mode 100644
index 0000000..e474534
--- /dev/null
+++ b/modules/web-console/frontend/app/primitives/dropdown/index.scss
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.ignite-form-field {
+    & &__control {
+        &:first-child:last-child {
+          width: 100% !important;
+        }
+    }
+}
+
+.dropdown--ignite {
+    font-style: normal;
+
+    .ignite-form-field__control {
+        outline: none;
+
+        & > a {
+            display: inline-block;
+            height: 36px;
+
+            padding: 0 15px;
+
+            border: 1px solid #ee2b27;
+            border-radius: 4px;
+
+            color: #de4538;
+            line-height: 36px;
+
+            .caret {
+                margin-left: 9px;
+                margin-right: -6px;
+            }
+        }
+
+        &:hover, &:focus {
+            & > a {
+                border-color: #a8110f;
+
+                color: #a8110f;
+                text-decoration: none;
+            }
+        }
+
+        ul {
+            padding: 0;
+
+            border-color: #c5c5c5;
+            box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.3);
+
+            a {
+                padding-left: 15px;
+                padding-right: 15px;
+
+                color: #393939;
+                line-height: 26px;
+
+                &:hover {
+                    color: #a8110f;
+                }
+            }
+
+            li:not(:last-child) {
+                border-bottom: 1px solid #dddddd;
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/primitives/index.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/primitives/index.js b/modules/web-console/frontend/app/primitives/index.js
index 7940f7a..e72f087 100644
--- a/modules/web-console/frontend/app/primitives/index.js
+++ b/modules/web-console/frontend/app/primitives/index.js
@@ -16,4 +16,12 @@
  */
 
 import './badge/index.scss';
+import './btn/index.scss';
+import './datepicker/index.scss';
 import './tabs/index.scss';
+import './panel/index.scss';
+import './dropdown/index.scss';
+import './ui-grid/index.scss';
+import './ui-grid-header/index.scss';
+import './ui-grid-settings/index.scss';
+import './page/index.scss';

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/primitives/page/index.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/primitives/page/index.scss b/modules/web-console/frontend/app/primitives/page/index.scss
new file mode 100644
index 0000000..fb749e7
--- /dev/null
+++ b/modules/web-console/frontend/app/primitives/page/index.scss
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.docs-content {
+    header {
+        margin: 40px 0 30px;
+        border: none;
+        background-color: initial;
+
+        h1 {
+            color: #393939;
+            font-family: Roboto;
+            font-size: 24px;
+            font-weight: normal;
+            font-style: normal;
+            font-stretch: normal;
+            line-height: 24px;
+            letter-spacing: normal;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/primitives/panel/index.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/primitives/panel/index.scss b/modules/web-console/frontend/app/primitives/panel/index.scss
new file mode 100644
index 0000000..826d33e
--- /dev/null
+++ b/modules/web-console/frontend/app/primitives/panel/index.scss
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+@import '../../../public/stylesheets/variables';
+
+.panel--ignite {
+  border: none;
+  border-radius: 0;
+
+  font-family: Roboto;
+
+  background-color: white;
+  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2);
+
+  .panel-heading {
+    height: auto;
+    padding: 22px 20px;
+
+    background-color: initial;
+    border-bottom: 1px solid $panel-default-border;
+
+    &:hover {
+      text-decoration: none;
+    }
+  }
+
+  .panel-title {
+    font-size: 16px;
+    line-height: 36px;
+  }
+
+  .panel-selected {
+    font-size: 14px;
+    font-style: italic;
+    line-height: 36px;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/primitives/tabs/index.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/primitives/tabs/index.scss b/modules/web-console/frontend/app/primitives/tabs/index.scss
index eed88cb..ade990d 100644
--- a/modules/web-console/frontend/app/primitives/tabs/index.scss
+++ b/modules/web-console/frontend/app/primitives/tabs/index.scss
@@ -27,6 +27,8 @@ ul.tabs {
     list-style: none;
 
     padding-left: 0;
+    margin-bottom: 0;
+
     border-bottom: 1px solid $nav-tabs-border-color;
 
     li {
@@ -46,6 +48,7 @@ ul.tabs {
 
             color: $text-color;
             font-size: $font-size;
+            font-family: Roboto;
             text-align: center;
             line-height: $height - 2*$offset-vertical;
 
@@ -70,4 +73,16 @@ ul.tabs {
             margin-left: 45px;
         }
     }
+}
+
+ul.tabs.tabs--blue {
+    li {
+        &.active {
+            border-color: #0067b9;
+        }
+
+        &:not(.active):hover {
+            border-color: #94bbdd;
+        }
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/primitives/ui-grid-header/index.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/primitives/ui-grid-header/index.scss b/modules/web-console/frontend/app/primitives/ui-grid-header/index.scss
new file mode 100644
index 0000000..4530c02
--- /dev/null
+++ b/modules/web-console/frontend/app/primitives/ui-grid-header/index.scss
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.ui-grid-header--subcategories {
+    .ui-grid-row:nth-child(even) .ui-grid-cell.cell-total {
+        background-color: rgba(102,175,233,.6);
+    }
+
+    .ui-grid-row:nth-child(odd) .ui-grid-cell.cell-total {
+        background-color: rgba(102,175,233,.3);
+    }
+
+    .ui-grid-header-cell-row {
+        height: 30px;
+    }
+
+    .ui-grid-header-cell {
+        .ui-grid-cell-contents > span:not(.ui-grid-header-cell-label) {
+            right: 3px;
+        }
+    }
+
+    .ui-grid-header-cell [role="columnheader"] {
+        display: flex;
+        
+        flex-wrap: wrap;
+        align-items: center;
+        justify-content: center;
+
+        height: 100%;
+
+        & > div {
+            flex: 1 100%;
+            height: auto;
+        }
+
+        & > div[ui-grid-filter] {
+            flex: auto;
+        }
+    }
+
+    .ui-grid-header-span {
+        position: relative;
+        border-right: 0;
+        background: #f5f5f5;
+
+        .ng-hide + .ui-grid-header-cell-row .ui-grid-header-cell {
+            height: 58px;
+        }
+
+        .ng-hide + .ui-grid-header-cell-row .ui-grid-cell-contents {
+            padding: 5px 5px;
+        }
+
+        .ui-grid-column-resizer.right {
+            top: -100px;
+        }
+        .ng-hide + .ui-grid-header-cell-row .ui-grid-column-resizer.right {
+            bottom: -100px;
+        }
+
+        &.ui-grid-header-cell .ui-grid-header-cell .ui-grid-column-resizer.right {
+            border-right-width: 0;
+        }
+        &.ui-grid-header-cell .ui-grid-header-cell:last-child .ui-grid-column-resizer.right {
+            border-right-width: 1px;
+        }
+
+        & > div > .ui-grid-cell-contents {
+            border-bottom: 1px solid #d4d4d4;
+        }
+    }
+
+    input {
+        line-height: 21px;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/primitives/ui-grid-header/index.tpl.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/primitives/ui-grid-header/index.tpl.pug b/modules/web-console/frontend/app/primitives/ui-grid-header/index.tpl.pug
new file mode 100644
index 0000000..1b91d9e
--- /dev/null
+++ b/modules/web-console/frontend/app/primitives/ui-grid-header/index.tpl.pug
@@ -0,0 +1,29 @@
+//-
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+.ui-grid-header.ui-grid-header--subcategories(role='rowgroup')
+    .ui-grid-top-panel
+        .ui-grid-header-viewport
+            .ui-grid-header-canvas
+                .ui-grid-header-cell-wrapper(ng-style='colContainer.headerCellWrapperStyle()')
+                    .ui-grid-header-cell-row(role='row')
+                        .ui-grid-header-span.ui-grid-header-cell.ui-grid-clearfix.ui-grid-category(ng-repeat='cat in grid.options.categories', ng-if='cat.visible && \
+                        (colContainer.renderedColumns | uiGridSubcategories: cat.name).length > 0')
+                            div(ng-show='(colContainer.renderedColumns|uiGridSubcategories:cat.name).length > 1')
+                                .ui-grid-cell-contents {{ cat.name }}
+                            .ui-grid-header-cell-row
+                                .ui-grid-header-cell.ui-grid-clearfix(ng-repeat='col in (colContainer.renderedColumns|uiGridSubcategories:cat.name) track by col.uid' ui-grid-header-cell='' col='col' render-index='$index')
+                        .ui-grid-header-cell.ui-grid-clearfix(ng-if='col.colDef.name === "treeBaseRowHeaderCol" || col.colDef.name === "selectionRowHeaderCol"' ng-repeat='col in colContainer.renderedColumns track by col.uid' ui-grid-header-cell='' col='col' render-index='$index' ng-class='{ disabled: !grid.options.multiSelect && col.colDef.name === "selectionRowHeaderCol"}')

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/primitives/ui-grid-settings/index.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/primitives/ui-grid-settings/index.pug b/modules/web-console/frontend/app/primitives/ui-grid-settings/index.pug
new file mode 100644
index 0000000..8f1487e
--- /dev/null
+++ b/modules/web-console/frontend/app/primitives/ui-grid-settings/index.pug
@@ -0,0 +1,33 @@
+//-
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+mixin ui-grid-settings()
+    .ui-grid-settings
+        i.fa.fa-bars(data-animation='am-flip-x' bs-dropdown='' aria-haspopup='true' aria-expanded='expanded' data-auto-close='1' data-trigger='click')
+        ul.select.dropdown-menu(role='menu')
+            li(ng-repeat='item in paragraph.gridOptions.categories|filter:{selectable:true}')
+                a(ng-click='paragraph.toggleColumns(item, !item.visible)')
+                    i.fa.fa-check-square-o.pull-left(ng-if='item.visible')
+                    i.fa.fa-square-o.pull-left(ng-if='!item.visible')
+                    span {{::item.name}}
+            li.divider
+            li
+                a(ng-click='paragraph.selectAllColumns()') Select all
+            li
+                a(ng-click='paragraph.clearAllColumns()') Clear all
+            li.divider
+            li
+                a(ng-click='$hide()') Close

http://git-wip-us.apache.org/repos/asf/ignite/blob/8c9c60a4/modules/web-console/frontend/app/primitives/ui-grid-settings/index.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/primitives/ui-grid-settings/index.scss b/modules/web-console/frontend/app/primitives/ui-grid-settings/index.scss
new file mode 100644
index 0000000..3519eb2
--- /dev/null
+++ b/modules/web-console/frontend/app/primitives/ui-grid-settings/index.scss
@@ -0,0 +1,171 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.ui-grid-settings {
+    ul.select.dropdown-menu {
+        padding: 0;
+
+        & > li {
+            & > a {
+                padding: 3px 12px;
+
+                & > span {
+                    line-height: 26px;
+                    padding-left: 10px;
+                    padding-right: 8px;
+                    cursor: pointer;
+                }
+
+                & > i {
+                    position: relative;
+                    
+                    width: 12px;
+                    height: 12px;
+                    margin-top: 7px;
+                    margin-left: 0;
+
+                    color: inherit;
+                    line-height: 26px;
+
+                    border: 1px solid #afafaf;
+                    border-radius: 2px;
+                    background-color: #FFF;
+
+                    box-shadow: inset 0 1px 1px #ccc;
+
+                    &.fa-square-o:before,
+                    &.fa-check-square-o:before {
+                        content: '';
+                    }
+
+                    &.fa-check-square-o {
+                        border-color: #0067b9;
+                        background-color: #0067b9;
+
+                        box-shadow: none;
+                    }
+
+                    &.fa-check-square-o:before {
+                        content: '';
+
+                        position: absolute;
+                        top: 0px;
+                        left: 3px;
+
+                        width: 4px;
+                        height: 8px;
+
+                        border: solid #FFF;
+                        border-width: 0 2px 2px 0;
+
+                        transform: rotate(35deg);
+                    }
+                }
+            }
+
+            &:not(:last-child) {
+                border-bottom: 1px solid #dddddd;
+            }
+        }
+    }
+
+    .btn {
+        float: right;
+
+        line-height: 20px;
+        margin-right: 0;
+    }
+
+    &-filter {
+        float: right;
+        margin-right: 35px;
+
+        .ignite-form-field {
+            $height: 36px;
+
+            width: 260px;
+
+            font-size: 14px;
+
+            label {
+                width: auto;
+                max-width: initial;
+                margin-right: 10px;
+
+                font-size: inherit;
+                line-height: $height;
+            }
+
+            &__control {
+                width: 190px;
+
+                input {
+                    &:focus {
+                        box-shadow: none;
+                    }
+                }
+            }
+        }
+    }
+
+    &-number-filter {
+        float: right;
+
+        .ignite-form-field {
+            width: 180px;
+            margin-right: 0;
+
+            &__label {
+            }
+
+            &__control {
+            }
+
+            &:nth-child(1) {
+                float: left;
+
+                .ignite-form-field__label {
+                    margin-right: 0;
+                    width: 70%;
+                    max-width: 100%;
+                }
+
+                .ignite-form-field__control {
+                    width: 30%;
+                }
+            }
+        }
+
+        button {
+            width: auto;
+            display: inline-block;
+            margin-left: 5px;
+        }
+    }
+
+    &-dateperiod {
+        float: right;
+        display: block;
+        margin-right: 35px;
+    }
+}
+
+.grid-settings {
+    display: inline-block;
+
+    margin-left: 10px;
+}
\ No newline at end of file