Added the delete table logic and view schema views

Project: http://git-wip-us.apache.org/repos/asf/incubator-blur/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-blur/commit/ef5f913b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-blur/tree/ef5f913b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-blur/diff/ef5f913b

Branch: refs/heads/console-v2
Commit: ef5f913b4d44a9090f4292284677dc3e39b7a7f5
Parents: 5f50468
Author: Chris Rohr <[email protected]>
Authored: Wed Mar 26 18:30:54 2014 -0400
Committer: Chris Rohr <[email protected]>
Committed: Wed Mar 26 18:30:54 2014 -0400

----------------------------------------------------------------------
 contrib/blur-console/ui/app/index.html          |  26 +--
 .../ui/app/scripts/blurconsole.b_utils.js       |  63 ++++++-
 .../ui/app/scripts/blurconsole.fake.js          | 116 ++++++++++--
 .../ui/app/scripts/blurconsole.model.js         |  41 ++++-
 .../ui/app/scripts/blurconsole.schema.js        | 175 +++++++++++++++++++
 .../ui/app/scripts/blurconsole.shell.js         |  10 +-
 .../ui/app/scripts/blurconsole.tables.js        |  80 ++++++++-
 .../ui/app/styles/blurconsole.schema.scss       |  20 +++
 .../blur-console/ui/app/styles/blurconsole.scss |   8 +-
 9 files changed, 496 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/ef5f913b/contrib/blur-console/ui/app/index.html
----------------------------------------------------------------------
diff --git a/contrib/blur-console/ui/app/index.html 
b/contrib/blur-console/ui/app/index.html
index 0591ace..c9fc093 100644
--- a/contrib/blur-console/ui/app/index.html
+++ b/contrib/blur-console/ui/app/index.html
@@ -33,6 +33,7 @@ limitations under the License.
         <!-- build:css(.tmp) styles/main.css -->
         <link rel="stylesheet" href="styles/blurconsole.css">
         <link rel="stylesheet" href="styles/blurconsole.dashboard.css">
+        <link rel="stylesheet" href="styles/blurconsole.schema.css">
         <!-- endbuild -->
         <script src="bower_components/modernizr/modernizr.js"></script>
 
@@ -73,18 +74,18 @@ limitations under the License.
         <!-- endbuild -->
 
         <!-- build:js scripts/plugins.js -->
-        <script src="bower_components/sass-bootstrap/js/affix.js"></script>
-        <script src="bower_components/sass-bootstrap/js/alert.js"></script>
-        <script src="bower_components/sass-bootstrap/js/dropdown.js"></script>
-        <script src="bower_components/sass-bootstrap/js/tooltip.js"></script>
-        <script src="bower_components/sass-bootstrap/js/modal.js"></script>
-        <script 
src="bower_components/sass-bootstrap/js/transition.js"></script>
-        <script src="bower_components/sass-bootstrap/js/button.js"></script>
-        <script src="bower_components/sass-bootstrap/js/popover.js"></script>
-        <script src="bower_components/sass-bootstrap/js/carousel.js"></script>
-        <script src="bower_components/sass-bootstrap/js/scrollspy.js"></script>
-        <script src="bower_components/sass-bootstrap/js/collapse.js"></script>
-        <script src="bower_components/sass-bootstrap/js/tab.js"></script>
+        <script 
src="bower_components/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/affix.js"></script>
+        <script 
src="bower_components/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/alert.js"></script>
+        <script 
src="bower_components/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/dropdown.js"></script>
+        <script 
src="bower_components/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/tooltip.js"></script>
+        <script 
src="bower_components/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/modal.js"></script>
+        <script 
src="bower_components/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/transition.js"></script>
+        <script 
src="bower_components/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/button.js"></script>
+        <script 
src="bower_components/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/popover.js"></script>
+        <script 
src="bower_components/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/carousel.js"></script>
+        <script 
src="bower_components/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/scrollspy.js"></script>
+        <script 
src="bower_components/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/collapse.js"></script>
+        <script 
src="bower_components/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/tab.js"></script>
         <script src="bower_components/flot/jquery.flot.js"></script>
         <script src="bower_components/flot/jquery.flot.pie.js"></script>
         <script src="bower_components/flot/jquery.flot.categories.js"></script>
@@ -98,6 +99,7 @@ limitations under the License.
         <script src="scripts/blurconsole.shell.js"></script>
         <script src="scripts/blurconsole.dashboard.js"></script>
         <script src="scripts/blurconsole.tables.js"></script>
+        <script src="scripts/blurconsole.schema.js"></script>
         <script src="scripts/blurconsole.data.js"></script>
         <script src="scripts/blurconsole.fake.js"></script>
         <script src="scripts/blurconsole.model.js"></script>

http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/ef5f913b/contrib/blur-console/ui/app/scripts/blurconsole.b_utils.js
----------------------------------------------------------------------
diff --git a/contrib/blur-console/ui/app/scripts/blurconsole.b_utils.js 
b/contrib/blur-console/ui/app/scripts/blurconsole.b_utils.js
index 5f98e4e..ef65821 100644
--- a/contrib/blur-console/ui/app/scripts/blurconsole.b_utils.js
+++ b/contrib/blur-console/ui/app/scripts/blurconsole.b_utils.js
@@ -15,7 +15,7 @@ limitations under the License.
 /*global blurconsole:false */
 blurconsole.browserUtils = (function(){
        'use strict';
-       var table;
+       var table, modal, cleanId, booleanImg;
 
        table = function(def, data) {
                var tableMarkup;
@@ -52,7 +52,66 @@ blurconsole.browserUtils = (function(){
                return tableMarkup;
        };
 
+       modal = function(id, title, content, buttons, size) {
+               var mSize, markup, mButtons = buttons;
+
+               switch(size) {
+                       case 'large':
+                               mSize = 'modal-lg';
+                               break;
+                       case 'medium':
+                               mSize = 'modal-md';
+                               break;
+                       default:
+                               mSize = 'modal-sm';
+               }
+
+               markup = '<div class="modal fade" id="' + id + '">';
+               markup += '<div class="modal-dialog ' + mSize + '">';
+               markup += '<div class="modal-content">';
+               markup += '<div class="modal-header"><button type="button" 
class="close" data-dismiss="modal">&times;</button><h4 class="modal-title">' + 
title + '</h4></div>';
+               markup += '<div class="modal-body">' + ($.type(content) === 
'string' ? content : $(content).html()) + '</div>';
+
+               if (mButtons) {
+                       if (!$.isArray(mButtons)) {
+                               mButtons = [mButtons];
+                       }
+
+                       markup += '<div class="modal-footer">';
+                       $.each(mButtons, function(i, button) {
+                               markup += '<button type="button" class="btn ' + 
button.classes + '" id="' + button.id + '" ';
+
+                               if (button.data) {
+                                       $.each(button.data, function(key, 
dataAttr) {
+                                               markup += 'data-' + key + '="' 
+ dataAttr + '" ';
+                                       });
+                               }
+                               
+                               markup += '>' + button.label + '</button> ';
+                       });
+                       markup += '</div>';
+               }
+
+               markup += '</div></div></div>';
+
+               return markup;
+       };
+
+       cleanId = function(str) {
+               return str.replace(/([;&,\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, 
'\\$1');
+       };
+
+       booleanImg = function(val) {
+               if (val && (val === true || val === 'yes' || val === 'true')) {
+                       return '<div class="label label-success"><i 
class="glyphicon glyphicon-ok-sign"></i></div>';
+               }
+               return '<div class="label label-danger"><i class="glyphicon 
glyphicon-minus-sign"></i></div>';
+       };
+
        return {
-               table: table
+               table: table,
+               modal : modal,
+               cleanId : cleanId,
+               booleanImg : booleanImg
        };
 }());
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/ef5f913b/contrib/blur-console/ui/app/scripts/blurconsole.fake.js
----------------------------------------------------------------------
diff --git a/contrib/blur-console/ui/app/scripts/blurconsole.fake.js 
b/contrib/blur-console/ui/app/scripts/blurconsole.fake.js
index 2e90bd5..2719004 100644
--- a/contrib/blur-console/ui/app/scripts/blurconsole.fake.js
+++ b/contrib/blur-console/ui/app/scripts/blurconsole.fake.js
@@ -15,16 +15,18 @@ limitations under the License.
 /*global blurconsole:false */
 blurconsole.fake = (function() {
        'use strict';
-       var getTableList, getNodeList, getQueryPerformance, getQueries;
+       var getTableList, getNodeList, getQueryPerformance, getQueries, 
disableTable, enableTable, deleteTable, getSchema, findTerms,
+               randomNumber, randomBoolean, randomString;
 
        getTableList = function() {
+               console.log('getting fake table list');
                var clusters = ['prodA', 'prodB'], data = [], i, cluster, rows, 
records, enabled;
 
                for (i = 0; i < 5; i++) {
-                       cluster = clusters[Math.floor(Math.random()*2)];
-                       rows = Math.floor(Math.random()*1000+1);
-                       records = Math.floor(Math.random()*10000+1001);
-                       enabled = Math.floor(Math.random()*2) === 1;
+                       cluster = clusters[randomNumber(2, true)];
+                       rows = randomNumber(1000);
+                       records = randomNumber(10000)+1000;
+                       enabled = randomBoolean();
 
                        data.push({cluster:cluster, name:'testtable'+i, 
enabled:enabled, rows:rows, records:records});
 
@@ -33,14 +35,15 @@ blurconsole.fake = (function() {
        };
 
        getNodeList = function() {
+               console.log('getting fake node list');
                var controllers = {online:[], offline:[]},
                        clusters = [{name:'prodA', online:[], offline:[]}, 
{name:'prodB', online:[], offline:[]}],
                        zookeepers = {online: [], offline:[]},
                        i, state;
 
                for(i = 0; i < 3; i++) {
-                       state = Math.floor(Math.random()*2);
-                       if (state === 0) {
+                       state = randomBoolean();
+                       if (state) {
                                controllers.online.push('controller' + i + 
'.localhost');
                                clusters[0].online.push('prodA.shard' + i + 
'.localhost');
                                clusters[1].online.push('prodB.shard' + i + 
'.localhost');
@@ -56,19 +59,112 @@ blurconsole.fake = (function() {
        };
 
        getQueryPerformance = function() {
-               return Math.floor((Math.random()*1000) + 1);
+               console.log('getting fake query performance');
+               return randomNumber(1000);
        };
 
        getQueries = function() {
+               console.log('getting fake queries');
                return {
-                       slowQueries : Math.floor((Math.random()*100) + 1) % 10 
=== 0
+                       slowQueries : randomNumber(100) % 10 === 0
                };
        };
 
+       disableTable = function(table) {
+               console.log('Fake sending request to disable table [' + table + 
']');
+       };
+
+       enableTable = function(table) {
+               console.log('Fake sending request to enable table [' + table + 
']');
+       };
+
+       deleteTable = function(table, includeFiles) {
+               console.log('Fake sending request to delete table [' + table + 
'] with files [' + includeFiles + ']');
+       };
+
+       getSchema = function(table) {
+               console.log('getting fake schema for table [' + table + ']');
+               var f, schema = {}, familyCount = randomNumber(20), types = 
['string', 'long', 'int', 'date', 'stored', 'customType'];
+
+               for(f=0; f < familyCount; f++) {
+                       var c, fam = {}, columnCount = randomNumber(30);
+                       for(c=0; c < columnCount; c++) {
+                               fam['col'+c] = {
+                                       'fieldLess' : randomBoolean(),
+                                       'type' : types[randomNumber(6, true)],
+                                       'extra' : null
+                               };
+
+                               if (randomBoolean()) {
+                                       var e, extraPropCount = 
randomNumber(3), props = {};
+                                       for (e=0; e < extraPropCount; e++) {
+                                               props['extra'+e] = 'val'+e;
+                                       }
+                                       fam['col'+c].extra = props;
+                               }
+                       }
+                       schema['fam'+f] = fam;
+               }
+
+               return schema;
+       };
+
+       findTerms = function(table, family, column, startsWith, callback) {
+               console.log('getting fake terms from [' + table + '] for family 
[' + family + '] and column [' + column + '] starting with [' + startsWith + 
']');
+
+               var terms = [];
+
+               for (var i = 0; i < 10; i++) {
+                       var randStr = randomString();
+                       if (startsWith) {
+                               randStr = startsWith + randStr;
+                       }
+                       terms.push(randStr);
+               }
+
+               console.log(terms.length);
+
+               terms = terms.sort(function (a, b) {
+                       return a.toLowerCase().localeCompare(b.toLowerCase());
+               });
+
+               callback(terms);
+       };
+
+       randomNumber = function(max, includeZero) {
+               var random = Math.random()*max;
+
+               if (!includeZero) {
+                       random++;
+               }
+
+               return Math.floor(random);
+       };
+
+       randomBoolean = function() {
+               return randomNumber(2) % 2 === 0;
+       };
+
+       randomString = function() {
+               var text = '';
+               var possible = 
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+
+               for( var i=0; i < Math.floor(Math.random() * 30 + 1); i++ ) {
+                       text += possible.charAt(Math.floor(Math.random() * 
possible.length));
+               }
+
+               return text;
+       };
+
        return {
                getTableList : getTableList,
                getNodeList : getNodeList,
                getQueryPerformance : getQueryPerformance,
-               getQueries : getQueries
+               getQueries : getQueries,
+               disableTable : disableTable,
+               enableTable : enableTable,
+               deleteTable : deleteTable,
+               getSchema : getSchema,
+               findTerms : findTerms
        };
 }());
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/ef5f913b/contrib/blur-console/ui/app/scripts/blurconsole.model.js
----------------------------------------------------------------------
diff --git a/contrib/blur-console/ui/app/scripts/blurconsole.model.js 
b/contrib/blur-console/ui/app/scripts/blurconsole.model.js
index 834a5dc..e36266e 100644
--- a/contrib/blur-console/ui/app/scripts/blurconsole.model.js
+++ b/contrib/blur-console/ui/app/scripts/blurconsole.model.js
@@ -29,13 +29,13 @@ blurconsole.model = (function() {
                tables, metrics, nodes, initModule, nodePoller, tablePoller, 
queryPerformancePoller, queryPoller;
 
        tables = (function() {
-               var getClusters, getEnabledTables, getDisabledTables, 
isDataLoaded;
+               var getClusters, getEnabledTables, getDisabledTables, 
isDataLoaded, disableTable, enableTable, deleteTable, getSchema, findTerms;
 
                getClusters = function() {
-                       if (stateMap.tableNameMap == null) {
+                       if (stateMap.tableNameMap === null) {
                                return [];
                        }
-                       
+
                        return 
blurconsole.utils.unique($.map(stateMap.tableNameMap, function(table){
                                return table.cluster;
                        }), true);
@@ -66,14 +66,41 @@ blurconsole.model = (function() {
                };
 
                isDataLoaded = function() {
-                       return stateMap.tableNameMap != null;
+                       return stateMap.tableNameMap !== null;
+               };
+
+               disableTable = function(tableName) {
+                       configMap.poller.disableTable(tableName);
+               };
+
+               enableTable = function(tableName) {
+                       configMap.poller.enableTable(tableName);
+               };
+
+               deleteTable = function(tableName, includeFiles) {
+                       configMap.poller.deleteTable(tableName, includeFiles);
+               };
+
+               getSchema = function(tableName) {
+                       return configMap.poller.getSchema(tableName);
+               };
+
+               findTerms = function(table, family, column, startsWith) {
+                       configMap.poller.findTerms(table, family, column, 
startsWith, function(terms) {
+                               $.gevent.publish('terms-updated', terms);
+                       });
                };
 
                return {
                        getClusters : getClusters,
                        getEnabledTables : getEnabledTables,
                        getDisabledTables : getDisabledTables,
-                       isDataLoaded : isDataLoaded
+                       isDataLoaded : isDataLoaded,
+                       disableTable : disableTable,
+                       enableTable : enableTable,
+                       deleteTable : deleteTable,
+                       getSchema : getSchema,
+                       findTerms : findTerms
                };
        }());
 
@@ -100,7 +127,7 @@ blurconsole.model = (function() {
                };
 
                isDataLoaded = function() {
-                       return stateMap.nodeMap != null;
+                       return stateMap.nodeMap !== null;
                };
 
                return {
@@ -271,7 +298,7 @@ blurconsole.model = (function() {
 
                
stateMap.queryPerformance.push(configMap.poller.getQueryPerformance());
                $.gevent.publish('query-perf-updated');
-               setTimeout(queryPerformancePoller, 1000);
+               setTimeout(queryPerformancePoller, 5000);
        };
 
        queryPoller = function() {

http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/ef5f913b/contrib/blur-console/ui/app/scripts/blurconsole.schema.js
----------------------------------------------------------------------
diff --git a/contrib/blur-console/ui/app/scripts/blurconsole.schema.js 
b/contrib/blur-console/ui/app/scripts/blurconsole.schema.js
new file mode 100644
index 0000000..e270cca
--- /dev/null
+++ b/contrib/blur-console/ui/app/scripts/blurconsole.schema.js
@@ -0,0 +1,175 @@
+/*
+
+Licensed 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.
+*/
+/*jshint laxbreak: true */
+/*global blurconsole:false */
+blurconsole.schema = (function () {
+       'use strict';
+       var
+               configMap = {
+                       mainHtml: String()
+                               + '<div class="container-fluid">'
+                                       + '<div class="row">'
+                                               + '<div class="col-md-6">'
+                                                       + '<div 
class="panel-group schemaList">'
+                                                       + '</div>'
+                                               + '</div>'
+                                               + '<div class="col-md-6">'
+                                                       + '<div class="row">'
+                                                               + '<div 
class="col-md-12 schemaColumnInfo">'
+                                                                       + '<div 
class="schemaColumnDef in">'
+                                                                               
+ '<strong>Choose a column on the left to see def</strong>'
+                                                                       + 
'</div>'
+                                                               + '</div>'
+                                                       + '</div>'
+                                                       + '<div class="row">'
+                                                               + '<div 
class="col-md-12 schemaColumnTerms">'
+                                                                       + '<div 
class="input-group">'
+                                                                               
+ '<input class="form-control termSearch" placeholder="Starts With" 
type="text">'
+                                                                               
+ '<span class="input-group-btn">'
+                                                                               
        + '<button class="btn btn-default" type="button">Go!</button>'
+                                                                               
+ '</span>'
+                                                                       + 
'</div>'
+                                                                       + '<ul 
class="list-group termList"></ul>'
+                                                               + '</div>'
+                                                       + '</div>'
+                                               + '</div>'
+                                       + '</div>'
+                               + '</div>'
+               },
+               stateMap = {},
+               jqueryMap = {},
+               initModule, showSchema, buildTreeSection, buildInfoSection, 
viewTerms, findTerms, loadTerms, switchToSearch;
+
+       showSchema = function(event, table) {
+               stateMap.table = table;
+               stateMap.modalId = stateMap.table + '_modal';
+               stateMap.schema = 
blurconsole.model.tables.getSchema(stateMap.table);
+
+               jqueryMap.contentHolder = $(configMap.mainHtml);
+               
jqueryMap.contentHolder.find('.schemaList').html(buildTreeSection());
+               
jqueryMap.contentHolder.find('.schemaColumnInfo').append(buildInfoSection());
+
+               jqueryMap.modal = 
$(blurconsole.browserUtils.modal(stateMap.modalId, 'Schema Definition for ' + 
stateMap.table, jqueryMap.contentHolder, null, 'large'));
+               jqueryMap.modal.modal()
+               .on('shown.bs.modal', function(e){
+                       jqueryMap.columnTermsSection = $('.schemaColumnTerms', 
jqueryMap.modal);
+                       jqueryMap.termSearch = $('.termSearch', 
jqueryMap.modal);
+                       jqueryMap.termList = $('.termList', jqueryMap.modal);
+                       jqueryMap.termSearchButton = $('.schemaColumnTerms 
button', jqueryMap.modal);
+                       $('.collapse', e.currentTarget).collapse({ toggle: 
false });
+               })
+               .on('hidden.bs.modal', function(e) {
+                       $(e.currentTarget).remove();
+                       jqueryMap.contentHolder.remove();
+                       jqueryMap = {};
+                       stateMap = {};
+               })
+               .on('click', 'li.schemaColumn', function() {
+                       var defId = $(this).find('a').attr('href');
+                       $('div.schemaColumnDef').removeClass('in');
+                       $(defId).addClass('in');
+                       jqueryMap.columnTermsSection.hide();
+                       return false;
+               })
+               .on('click', 'a.termsTrigger', viewTerms)
+               .on('click', '.schemaColumnTerms button', findTerms)
+               .on('click', '.searchTrigger', switchToSearch);
+       };
+
+       buildTreeSection = function() {
+               var tree = '';
+               $.each(stateMap.schema, function(family, cols){
+                       var famId = blurconsole.browserUtils.cleanId(family);
+                       tree += '<div class="panel panel-default"><div 
class="panel-heading">';
+                       tree += '<h4 class="panel-title"><a 
data-toggle="collapse" data-parent=".schemaList" href="#' + famId + '">' + 
family + '</a></h4></div>';
+                       tree += '<div id="' + famId + '" class="panel-collapse 
collapse"><div class="panel-body"><ul class="list-group">';
+                       $.each(cols, function(col, def) {
+                               var colId = 
blurconsole.browserUtils.cleanId(col);
+                               tree += '<li class="list-group-item 
schemaColumn"><a href="#' + famId + '_' + colId + '">' + col + '';
+                               if (def.type !== 'stored') {
+                                       tree += ' <span 
class="badge">searchable</span>';
+                               }
+                               tree += '</a><div class="pull-right"><i 
class="glyphicon glyphicon-chevron-right"></i></div></li>';
+                       });
+                       tree += '</ul></div></div></div>';
+               });
+               return tree;
+       };
+
+       buildInfoSection = function() {
+               var info = '';
+               $.each(stateMap.schema, function(family, cols){
+                       var famId = blurconsole.browserUtils.cleanId(family);
+                       $.each(cols, function(col, def){
+                               var colId = 
blurconsole.browserUtils.cleanId(col);
+                               info += '<div class="schemaColumnDef" id="' + 
famId + '_' + colId + '"><ul class="list-group">';
+                               info += '<li 
class="list-group-item"><strong>Fieldless Searching:</strong> ' + 
blurconsole.browserUtils.booleanImg(def.fieldLess) + '</li>';
+                               info += '<li 
class="list-group-item"><strong>Field Type:</strong> ' + def.type + '</li>';
+                               if (def.extra) {
+                                       $.each(def.extra, function(key, value) {
+                                               info += '<li 
class="list-group-item"><strong>' + key + ':</strong> ' + value + '</li>';
+                                       });
+                               }
+                               if (def.type !== 'stored') {
+                                       info += '<li class="list-group-item"><a 
href="#" class="termsTrigger" data-fam="' + family + '" data-col="' + col + 
'">View Terms</a></li>';
+                               }
+                               info += '</ul></div>';
+                       });
+               });
+               return info;
+       };
+
+       viewTerms = function() {
+               jqueryMap.termList.html('<div class="center-block"><img 
src="images/ajax-loader.gif"></div>');
+               jqueryMap.termSearch.val('');
+               jqueryMap.columnTermsSection.show();
+               var $this = $(this);
+
+               stateMap.termFamily = $this.data('fam');
+               stateMap.termColumn = $this.data('col');
+
+               jqueryMap.termSearchButton.trigger('click');
+       };
+
+       findTerms = function() {
+               blurconsole.model.tables.findTerms(stateMap.table, 
stateMap.termFamily, stateMap.termColumn, jqueryMap.termSearch.val());
+       };
+
+       loadTerms = function() {
+               var terms = Array.prototype.slice.call(arguments, 1);
+               jqueryMap.termList.html('');
+               $.each(terms, function(i, term){
+                       jqueryMap.termList.append('<li 
class="list-group-item">' + term + ' <span class="badge badge-success 
searchTrigger" title="Search for this value" data-value="' + term + '"><i 
class="glyphicon glyphicon-search"></i></span></li>');
+               });
+       };
+
+       switchToSearch = function(){
+               blurconsole.shell.changeAnchorPart({
+                       tab: 'search',
+                       _tab: {
+                               query: stateMap.termFamily + '.' + 
stateMap.termColumn + ':' + $(this).data('value')
+                       }
+               });
+       };
+
+       initModule = function() {
+               $.gevent.subscribe($(document), 'schema-show', showSchema);
+               $.gevent.subscribe($(document), 'terms-updated', loadTerms);
+       };
+
+       return {
+               initModule : initModule
+       };
+}());
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/ef5f913b/contrib/blur-console/ui/app/scripts/blurconsole.shell.js
----------------------------------------------------------------------
diff --git a/contrib/blur-console/ui/app/scripts/blurconsole.shell.js 
b/contrib/blur-console/ui/app/scripts/blurconsole.shell.js
index 7aa2a7f..29cf639 100644
--- a/contrib/blur-console/ui/app/scripts/blurconsole.shell.js
+++ b/contrib/blur-console/ui/app/scripts/blurconsole.shell.js
@@ -22,7 +22,8 @@ blurconsole.shell = (function () {
        'use strict';
        var configMap = {
                anchorSchemaMap : {
-                       tab : { dashboard : true, tables : true, queries : 
true, search : true }
+                       tab : { dashboard : true, tables : true, queries : 
true, search : true },
+                       _tab : { query: true }
                },
                defaultTab : 'dashboard',
                allTabs : ['dashboard', 'tables', 'queries', 'search']
@@ -144,6 +145,8 @@ blurconsole.shell = (function () {
                stateMap.$container = $container;
                setJqueryMap();
 
+               blurconsole.schema.initModule();
+
                $('.side-nav li').tooltip();
 
                jqueryMap.$sideNavTabs.click( onClickTab );
@@ -163,5 +166,8 @@ blurconsole.shell = (function () {
                }
        };
 
-       return { initModule: initModule };
+       return {
+               initModule: initModule,
+               changeAnchorPart : changeAnchorPart
+       };
 }());
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/ef5f913b/contrib/blur-console/ui/app/scripts/blurconsole.tables.js
----------------------------------------------------------------------
diff --git a/contrib/blur-console/ui/app/scripts/blurconsole.tables.js 
b/contrib/blur-console/ui/app/scripts/blurconsole.tables.js
index 57193a0..7d56145 100644
--- a/contrib/blur-console/ui/app/scripts/blurconsole.tables.js
+++ b/contrib/blur-console/ui/app/scripts/blurconsole.tables.js
@@ -22,16 +22,26 @@ blurconsole.tables = (function () {
                        {label:'Table Name', key:'name'},
                        {label:'Row Count', key: 'rowCount'},
                        {label:'Record Count', key: 'recordCount'},
-                       {label:'Actions', key: function(){ return ''; }}
+                       {label:'Actions', key: function(row) {
+                               var actions = '', table = row.name;
+                               actions += '<a href="#" class="schemaTrigger 
btn btn-default" data-name="' + table + '"><i class="glyphicon 
glyphicon-list-alt"></i> Schema</a> ';
+                               actions += '<a href="#" class="disableTrigger 
btn btn-danger" data-name="' + table + '"><i class="glyphicon 
glyphicon-cloud-download"></i> Disable</a> ';
+                               return actions;
+                       }}
                ],
                disabledDef : [
                        {label:'Table Name', key:'name'},
-                       {label:'Actions', key: function(){ return ''; }}
+                       {label:'Actions', key: function(row) {
+                               var actions = '', table = row.name;
+                               actions += '<a href="#" class="enableTrigger 
btn btn-default" data-name="' + table + '"><i class="glyphicon 
glyphicon-cloud-upload"></i> Enable</a> ';
+                               actions += '<a href="#" class="deleteTrigger 
btn btn-danger" data-name="' + table + '"><i class="glyphicon 
glyphicon-trash"></i> Delete</a> ';
+                               return actions;
+                       }}
                ]
        },
        stateMap = { $container : null },
        jqueryMap = {},
-       setJqueryMap, initModule, unloadModule, updateTableList, buildTabs, 
waitForData;
+       setJqueryMap, initModule, unloadModule, updateTableList, buildTabs, 
waitForData, registerPageEvents, unregisterPageEvents;
 
        setJqueryMap = function() {
                var $container = stateMap.$container;
@@ -44,6 +54,7 @@ blurconsole.tables = (function () {
 
        unloadModule = function() {
                $.gevent.unsubscribe(jqueryMap.$container, 'tables-updated');
+               unregisterPageEvents();
        };
 
        initModule = function($container) {
@@ -52,10 +63,7 @@ blurconsole.tables = (function () {
                        setJqueryMap();
                        $.gevent.subscribe(jqueryMap.$container, 
'tables-updated', updateTableList);
                        waitForData();
-                       jqueryMap.$tableInfoHolder.on('click', 'ul.nav a', 
function(e) {
-                               e.preventDefault();
-                               $(this).tab('show');
-                       });
+                       registerPageEvents();
                });
                return true;
        };
@@ -99,7 +107,7 @@ blurconsole.tables = (function () {
                $.each(clusters, function(idx, cluster){
                        var clusterPane = $('#' + cluster + '_pane');
                        
clusterPane.find('.enabledSection').html(blurconsole.browserUtils.table(configMap.enabledDef,
 blurconsole.model.tables.getEnabledTables(cluster)));
-                       
clusterPane.find('.disabledSection').html(blurconsole.browserUtils.table(configMap.enabledDef,
 blurconsole.model.tables.getDisabledTables(cluster)));
+                       
clusterPane.find('.disabledSection').html(blurconsole.browserUtils.table(configMap.disabledDef,
 blurconsole.model.tables.getDisabledTables(cluster)));
                });
        };
 
@@ -120,6 +128,62 @@ blurconsole.tables = (function () {
                });
        };
 
+       registerPageEvents = function() {
+               // Tab control
+               jqueryMap.$tableInfoHolder.on('click', 'ul.nav a', function(e) {
+                       e.preventDefault();
+                       $(this).tab('show');
+               });
+
+               // View Schema
+               jqueryMap.$tableInfoHolder.on('click', 'a.schemaTrigger', 
function() {
+                       $.gevent.publish('schema-show', $(this).data('name'));
+                       return false;
+               });
+
+               // Disable Table
+               jqueryMap.$tableInfoHolder.on('click', 'a.disableTrigger', 
function() {
+                       
blurconsole.model.tables.disableTable($(this).data('name'));
+                       return false;
+               });
+
+               // Enable Table
+               jqueryMap.$tableInfoHolder.on('click', 'a.enableTrigger', 
function() {
+                       
blurconsole.model.tables.enableTable($(this).data('name'));
+                       return false;
+               });
+
+               // Delete Table
+               jqueryMap.$tableInfoHolder.on('click', 'a.deleteTrigger', 
function() {
+                       var tableName = $(this).data('name');
+                       console.log('delete:' + tableName);
+                       var modalContent = 
blurconsole.browserUtils.modal('confirmDelete', 'Confirm Table Deletion', 'You 
are about to delete table ' + tableName + '.  Are you sure you want to do this? 
If so, do you also want to delete the underlying table data?', [
+                               {classes: 'btn-warning tableOnly', label: 
'Table Only'},
+                               {classes: 'btn-danger tableAndData', label: 
'Table And Data'},
+                               {classes: 'btn-default cancel', label: 
'Cancel', data: {dismiss:'modal'}}
+                       ], 'medium');
+
+                       var modal = 
$(modalContent).modal().on('shown.bs.modal', function(e){
+                               $(e.currentTarget).on('click', '.tableOnly', 
function() {
+                                       
blurconsole.model.tables.deleteTable(tableName, false);
+                                       modal.modal('hide');
+                               }).on('click', '.tableAndData', function() {
+                                       
blurconsole.model.tables.deleteTable(tableName, true);
+                                       modal.modal('hide');
+                               });
+                       }).on('hidden.bs.modal', function(e) {
+                               $(e.currentTarget).remove();
+                       });
+                       return false;
+               });
+       };
+
+       unregisterPageEvents = function() {
+               if (jqueryMap.$tableInfoHolder) {
+                       jqueryMap.$tableInfoHolder.off();
+               }
+       };
+
        return {
                initModule : initModule,
                unloadModule : unloadModule

http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/ef5f913b/contrib/blur-console/ui/app/styles/blurconsole.schema.scss
----------------------------------------------------------------------
diff --git a/contrib/blur-console/ui/app/styles/blurconsole.schema.scss 
b/contrib/blur-console/ui/app/styles/blurconsole.schema.scss
new file mode 100644
index 0000000..fd58790
--- /dev/null
+++ b/contrib/blur-console/ui/app/styles/blurconsole.schema.scss
@@ -0,0 +1,20 @@
+.modal .schemaColumnDef {
+       display: none;
+       &.in {
+               display: block;
+       }
+       strong {
+               width: 140px;
+               display: inline-block;
+       }
+}
+
+.modal .schemaColumnTerms {
+       display: none;
+       .termList {
+               margin-top: 5px;
+               .searchTrigger {
+                       cursor: pointer;
+               }
+       }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/ef5f913b/contrib/blur-console/ui/app/styles/blurconsole.scss
----------------------------------------------------------------------
diff --git a/contrib/blur-console/ui/app/styles/blurconsole.scss 
b/contrib/blur-console/ui/app/styles/blurconsole.scss
index e50c1f3..350f664 100644
--- a/contrib/blur-console/ui/app/styles/blurconsole.scss
+++ b/contrib/blur-console/ui/app/styles/blurconsole.scss
@@ -13,9 +13,9 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
  */
 
-$icon-font-path: "/bower_components/sass-bootstrap/fonts/";
+$icon-font-path: 
"/bower_components/twbs-bootstrap-sass/vendor/assets/fonts/bootstrap/";
 
-@import 'sass-bootstrap/lib/bootstrap';
+@import 'twbs-bootstrap-sass/vendor/assets/stylesheets/bootstrap';
 
 .browsehappy {
     margin: 0.2em 0;
@@ -24,6 +24,10 @@ $icon-font-path: "/bower_components/sass-bootstrap/fonts/";
     padding: 0.2em 0;
 }
 
+.input-group-btn > .btn {
+  height: $input-height-base;
+}
+
 /* Space out content a bit */
 body {
     padding: 70px 10px 20px 50px;

Reply via email to