Эх сурвалжийг харах

HUE-1400 [hbase] Abe Review

Kevin Wang 12 жил өмнө
parent
commit
25a91c3

+ 2 - 4
apps/hbase/src/hbase/templates/app.mako

@@ -371,13 +371,11 @@ ${ commonheader(None, "hbase", user) | n,unicode }
 
 
 <script type="text/javascript" charset="utf-8">
-var i18n_message_cache =
-{
+var i18n_message_cache = {
 
 };
 
-function _(text)
-{
+function _(text) {
   return MSG[text];
 };
 

+ 65 - 129
apps/hbase/static/css/hbase.css

@@ -16,39 +16,32 @@
  limitations under the License.
 */
 
-.hbase-page
-{
+.hbase-page {
 	display: none;
 }
 
-.hbase-page.active
-{
+.hbase-page.active {
 	display: block;
 }
 
-ul#hbase-breadcrumbs li a
-{
+ul#hbase-breadcrumbs li a {
 	line-height: 18px;
 }
 
-.actionbar .well,.actionbar .well-small
-{
+.actionbar .well,.actionbar .well-small {
 	line-height: 30px;
 }
 
-.isLoading
-{
+.isLoading {
 	opacity: .5 !important;
 	background: url(/static/art/spinner.gif) center center no-repeat;
 }
 
-.smartview
-{
+.smartview {
 	padding:0px;
 }
 
-.smartview .smartview-row
-{
+.smartview .smartview-row {
 	padding:0px;
     font-size:0px;
     margin:0px;
@@ -57,16 +50,14 @@ ul#hbase-breadcrumbs li a
 	position: relative;
 }
 
-.smartview .smartview-row input[type="checkbox"]
-{
+.smartview .smartview-row input[type="checkbox"] {
 	border:solid 1px #ccc;
 	border-radius: 0px;
 	margin: 0px;
 	padding: 0px;
 }
 
-.smartview .smartview-row h5
-{
+.smartview .smartview-row h5 {
 	padding:0px 10px;
 	line-height: 40px;
 	background:#ddd;
@@ -88,37 +79,31 @@ ul#hbase-breadcrumbs li a
 	font-weight: normal;
 }
 
-.smartview .smartview-row.selected h5 > code
-{
+.smartview .smartview-row.selected h5 > code {
 	color: #355EDB;
 	border-color: #6872AD;
 }
 
-.smartview .smartview-row-controls
-{
+.smartview .smartview-row-controls {
 	display: none;
 }
 
-.smartview .smartview-row-controls.controls-hover-bottom
-{
+.smartview .smartview-row-controls.controls-hover-bottom {
 	position: absolute;
 	bottom: 0px;
 	right:5px;
 	z-index: 10;
 }
 
-.smartview .smartview-row.selected .smartview-row-controls, .smartview-row:hover .smartview-row-controls
-{
+.smartview .smartview-row.selected .smartview-row-controls, .smartview-row:hover .smartview-row-controls {
 	display: inline;
 }
 
-.smartview .smartview-row.selected h5 > i
-{
+.smartview .smartview-row.selected h5 > i {
 	color: #355EDB;
 }
 
-.smartview ul.smartview-cells
-{
+.smartview ul.smartview-cells {
 	border-top:solid 1px #ccc;
 	width:100%;
 	overflow-x:auto;
@@ -134,8 +119,7 @@ ul#hbase-breadcrumbs li a
     min-height: 68px;
 }
 
-.smartview ul.smartview-cells > li
-{
+.smartview ul.smartview-cells > li {
 	position: relative;
 	border-right:solid 1px #ccc;
 	background: #efefef;
@@ -151,39 +135,32 @@ ul#hbase-breadcrumbs li a
     border-top:0px;
 }
 
-.smartview ul.smartview-cells > li > div
-{
+.smartview ul.smartview-cells > li > div {
 	position: relative;
 	height: 100%;
 }
 
-.smartview ul.smartview-cells > li.active
-{
+.smartview ul.smartview-cells > li.active {
 	border-top:solid 3px #4C62E6;
 }
 
-.smartview ul.smartview-cells > li:hover, .smartview ul.smartview-cells > li.active
-{
+.smartview ul.smartview-cells > li:hover, .smartview ul.smartview-cells > li.active {
 	cursor: pointer;
 	background: #fcfcfc;
 }
-.smartview ul.smartview-cells > li:hover .label.timestamp, .smartview ul.smartview-cells > li.active .label.timestamp
-{
+.smartview ul.smartview-cells > li:hover .label.timestamp, .smartview ul.smartview-cells > li.active .label.timestamp {
 	display: block;
 	color:#555;
 	border:solid 1px #ccc;
 }
-.smartview ul.smartview-cells > li:hover a.corner-btn
-{
+.smartview ul.smartview-cells > li:hover a.corner-btn {
 	display: block;
 }
-.smartview ul.smartview-cells > li:hover a.corner-btn:hover
-{
+.smartview ul.smartview-cells > li:hover a.corner-btn:hover {
 	color:#000;
 }
 
-.smartview ul.smartview-cells > li h6
-{
+.smartview ul.smartview-cells > li h6 {
 	padding:6px;
 	margin:0px;
 	color:#3a3a3a;
@@ -192,21 +169,18 @@ ul#hbase-breadcrumbs li a
 	white-space: nowrap;
 }
 
-.smartview ul.smartview-cells > li.active h6
-{
+.smartview ul.smartview-cells > li.active h6 {
 	color:#4C62E6;
 }
 
-.smartview ul.smartview-cells > li .timestamp
-{
+.smartview ul.smartview-cells > li .timestamp {
 	position: absolute;
 	bottom:-2px;
 	right:-2px;
 	display: none;
 }
 
-.smartview ul.smartview-cells > li .corner-btn
-{
+.smartview ul.smartview-cells > li .corner-btn {
 	position: absolute;
 	top:5px;
 	right:5px;
@@ -217,8 +191,7 @@ ul#hbase-breadcrumbs li a
 	padding:0px 6px;
 }
 
-.smartview ul.smartview-cells > li pre
-{
+.smartview ul.smartview-cells > li pre {
 	border-radius: 0px;
 	border:none;
 	background:transparent;
@@ -232,8 +205,7 @@ ul#hbase-breadcrumbs li a
 	border: dashed 1px #ccc;
 }
 
-.smartview ul.smartview-cells > li > div > textarea
-{
+.smartview ul.smartview-cells > li > div > textarea {
 	display: block;
 	border-radius: 0px;
     outline: none;
@@ -245,30 +217,25 @@ ul#hbase-breadcrumbs li a
     border: none;
 }
 
-.smartview ul.smartview-cells > li pre:hover
-{
+.smartview ul.smartview-cells > li pre:hover {
 	background: #BAD0FF;
 }
 
-.smartview ul.smartview-cells > li > pre:hover, .smartview ul.smartview-cells > li.active pre
-{
+.smartview ul.smartview-cells > li > pre:hover, .smartview ul.smartview-cells > li.active pre {
 	color:#333;
 }
 
-.smartview ul.smartview-cells > li .label
-{
+.smartview ul.smartview-cells > li .label {
 	background:#ddd;
 	font-size: 11px;
 	text-shadow:none;
 	font-weight: 400;
 }
-.smartview ul.smartview-cells li.new_column_cell
-{
+.smartview ul.smartview-cells li.new_column_cell {
 	vertical-align:middle;
 	width:120px;
 }
-.smartview ul.smartview-cells li.new_column_cell a
-{
+.smartview ul.smartview-cells li.new_column_cell a {
 	text-align: center;
 	font-size:24px;
 	display:block;
@@ -277,41 +244,34 @@ ul#hbase-breadcrumbs li a
 	text-decoration: none;
 }
 
-.subnav
-{
+.subnav {
 	padding:5px 0px;
 	line-height:30px;
 	border:none;
 }
 
-.subnav select, .subnav input, .well input, .well select, .smartview select, .smartview .smartview-row-controls input
-{
+.subnav select, .subnav input, .well input, .well select, .smartview select, .smartview .smartview-row-controls input {
 	margin:0px;
 }
-.ui-autocomplete
-{
+.ui-autocomplete {
 	z-index:10000 !important;
 }
 
-.btn-group
-{
+.btn-group {
 	display:inline-block;
 	line-height: 1em;
 }
-.footer-slider
-{
+.footer-slider {
 	white-space: nowrap;
 	overflow-x: auto;
 	width: 70%;
 	float:left;
 }
-.footer-slider code
-{
+.footer-slider code {
 	cursor:pointer;
 }
 
-#searchbar-main
-{
+#searchbar-main {
 	display: inline;
 	background: #fff;
 	line-height: 1em;
@@ -380,8 +340,7 @@ ul#hbase-breadcrumbs li a
 	position: relative;
 	overflow: hidden;
 }
-#search-tags
-{
+#search-tags {
 	display: block;
 	margin: 0px;
 	padding: 0px;
@@ -391,44 +350,37 @@ ul#hbase-breadcrumbs li a
 	height: 100%;
 }
 
-#search-tags > span
-{
+#search-tags > span {
 	color: #d14;
 }
 
-#search-tags span
-{
+#search-tags span {
 	margin: 1px;
 	padding: 2px;
 }
-#search-tags span:hover
-{
+#search-tags span:hover {
 	margin: 0px;
 	border: dashed 1px #5D6F8C;
 }
 
-#search-tags > span > span
-{
+#search-tags > span > span {
 	padding: 0px 3px;
 	border-radius: 3px;
 }
 
-#search-tags span.columns
-{
+#search-tags span.columns {
 	color: #fff;
 	background: #3FA3D9;
 }
 
-#search-tags span.scan
-{
+#search-tags span.scan {
 	color: #fff;
 	background: #EDA11F;
 	padding: 0px 3px;
 	border-radius: 3px;
 }
 
-#search-tags span.prefix
-{
+#search-tags span.prefix {
 	color: #fff;
 	background: #5EB568;
 }
@@ -463,8 +415,7 @@ ul#hbase-breadcrumbs li a
 }
 
 
-#search-typeahead
-{
+#search-typeahead {
 	position: absolute;
 	z-index: 10000;
 	margin: 0px;
@@ -474,8 +425,7 @@ ul#hbase-breadcrumbs li a
 	margin-top: 40px;
 }
 
-#search-typeahead li:first-child a
-{
+#search-typeahead li:first-child a {
 	overflow: auto;
 	background: #fff;
 	color: #3a3a3a;
@@ -483,8 +433,7 @@ ul#hbase-breadcrumbs li a
 	background: #eee;
 }
 
-#search-typeahead li a
-{
+#search-typeahead li a {
 	padding: 5px;
 	background: #fff;
 	margin-top: -1px;
@@ -495,20 +444,18 @@ ul#hbase-breadcrumbs li a
 	cursor: pointer;
 }
 
-#search-typeahead li a.active
-{
+#search-typeahead li a.active {
 	background: rgb(1, 99, 156);
 	color: #fff;
 	font-weight: bold;
 }
 
-#searchbar-main input[type=text].tag-searchbar
-{
+#searchbar-main input[type=text].tag-searchbar {
 	border: 0px;
 	background: transparent;
 	box-shadow: none;
 	border:none;
-    margin-right:15%;
+    msargin-right:15%;
     padding:0px;
     display: inline-block;
     border-radius: 0px;
@@ -516,8 +463,7 @@ ul#hbase-breadcrumbs li a
     width:100%;
 }
 
-#searchbar-main input[type=text].tag-searchbar.active
-{
+#searchbar-main input[type=text].tag-searchbar.active {
 	color:#fff;
 	width:1px;
 	background: #fff;
@@ -525,13 +471,11 @@ ul#hbase-breadcrumbs li a
 }
 
 
-#searchbar-main small
-{
+#searchbar-main small {
 	color: #bbb;
 }
 
-#searchbar-main i.tagIndicator
-{
+#searchbar-main i.tagIndicator {
 	color: #000;
 	padding: 0px !important;
 	border: 0px;
@@ -558,13 +502,11 @@ ul#hbase-breadcrumbs li a
     }
 }
 
-#cluster-menu
-{
+#cluster-menu {
 	font-size:14px;
 }
 
-#cell_edit_modal
-{
+#cell_edit_modal {
 	width: 80%;
 	left: 10%;
 	margin-left: 0px;
@@ -574,37 +516,31 @@ ul#hbase-breadcrumbs li a
 	overflow: visible;
 }
 
-#cell_edit_modal iframe
-{
+#cell_edit_modal iframe {
 	min-height: 600px;
 }
 
-#cell_edit_modal .CodeMirror
-{
+#cell_edit_modal .CodeMirror {
 	height:100%;
 }
 
-#cell_edit_modal .modal-body
-{
+#cell_edit_modal .modal-body {
 	max-height: 600px;
 }
 
-textarea
-{
+textarea {
 	-webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
     box-sizing: border-box;
 }
 
-#column-family-selectors
-{
+#column-family-selectors {
 	margin-left: 10px;
 	line-height: 30px;
 	display: inline-block;
 }
 
-.loader-main
-{
+.loader-main {
 	font-size: 50px;
 }
 

+ 13 - 26
apps/hbase/static/js/api.js

@@ -14,23 +14,19 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-var API =
-{
+var API = {
   //base querying function
   //query(functionName, ClusterName, arg0, arg1).done(callback)
-  query: function()
-  {
+  query: function() {
     // all url building should be in this function
     var url = "/hbase/api";
     var $_POST = {};
-    for(var i=0;i<arguments.length;i++)
-    {
+    for(var i=0;i<arguments.length;i++) {
       if (arguments[i] == null)
         arguments[i] = "";
       arguments[i] = arguments[i] + "";
       var key = arguments[i].slice(0, 15);
-      if (key == "hbase-post-key-")
-      {
+      if (key == "hbase-post-key-") {
         key += Object.keys($_POST).length;
         $_POST[key] = arguments[i].slice(15);
         arguments[i] = key;
@@ -38,16 +34,13 @@ var API =
       url += '/' + arguments[i];
     }
     var queryObject = {url:url, method:'POST', startTime: new Date().getTime(), status:'running...'}
-    var handler = $.post(url, $_POST).error(function(response)
-    {
+    var handler = $.post(url, $_POST).error(function(response) {
       $.jHueNotify.error(JSON.parse(response.responseText).message);
     });
     var doneHandle = handler.done;
-    handler.done = function()
-    {
+    handler.done = function() {
       var cb = arguments[0];
-      return doneHandle.apply(handler, [function(data)
-      {
+      return doneHandle.apply(handler, [function(data) {
         app.views.tabledata.truncated(data.truncated); //change later
         app.views.tabledata.truncateLimit(data.limit);
         app.views.tabledata.truncateCount(data.truncate_count);
@@ -57,35 +50,29 @@ var API =
     };
     return handler;
   },
-  queryArray: function(action, args)
-  {
+  queryArray: function(action, args) {
     return API.query.apply(this, [action].concat(args));
   },
   //function,arg0,arg1, queries the current cluster
-  queryCluster: function()
-  {
+  queryCluster: function() {
     var args = Array.prototype.slice.call(arguments);
     args.splice(1, 0, app.cluster());
     return API.query.apply(this, args);
   },
-  queryTable: function()
-  {
+  queryTable: function() {
     var args = Array.prototype.slice.call(arguments);
     args.splice(1, 0, app.views.tabledata.name());
     return API.queryCluster.apply(this, args);
   },
   //functions to abstract away API structure, in case API changes:
   //only have funciton name, data, and callbacks. no URL or api-facing.
-  createTable: function(cluster, tableName, columns, callback)
-  {
+  createTable: function(cluster, tableName, columns, callback) {
      return API.query('createTable', cluster, tableName, columns).done(callback);
   },
-  getTableNames: function(cluster, callback)
-  {
+  getTableNames: function(cluster, callback) {
     return API.query('getTableNames', cluster).done(callback);
   },
-  getTableList: function(cluster, callback)
-  {
+  getTableList: function(cluster, callback) {
     return API.query('getTableList', cluster).done(callback);
   }
 }

+ 35 - 69
apps/hbase/static/js/app.js

@@ -14,8 +14,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-var AppViewModel = function()
-{
+var AppViewModel = function() {
   var self = this;
 
   self.station = ko.observable("");
@@ -23,22 +22,18 @@ var AppViewModel = function()
   self.focusModel = ko.observable();
   self.cluster = ko.observable("");
   self.clusters = ko.observableArray();
-  API.query('getClusters').done(function(data)
-  {
+  API.query('getClusters').done(function(data) {
     app.clusters(data);
   });
   self.search = new tagsearch();
 
   self.views = {
-    tables: new DataTableViewModel({columns:['Table Name', 'Enabled'], el: 'views.tables', reload: function(callback)
-    {
+    tables: new DataTableViewModel({columns:['Table Name', 'Enabled'], el: 'views.tables', reload: function(callback) {
       var d_self = this;
       d_self.items.removeAll();
-      API.queryCluster("getTableList").done(function(data)
-      {
+      API.queryCluster("getTableList").done(function(data) {
         d_self.items.removeAll(); //need to remove again before callback executes
-        for(q=0;q<data.length;q++)
-        {
+        for(q=0; q<data.length; q++) {
           d_self.items.push(new TableDataRow(data[q]));
         }
         d_self._el.find('a[data-row-selector=true]').jHueRowSelector();
@@ -46,40 +41,32 @@ var AppViewModel = function()
           callback();
       });
     }}),
-    tabledata: new SmartViewModel({el: 'views.tabledata', reload: function(callback) //move inside SmartViewModel class?
+    tabledata: new SmartViewModel({el: 'views.tabledata', reload: function(callback) //move inside SmartViewModel class? 
     {
       var t_self = this;
-      function getColumnFamilies()
-      {
+      function getColumnFamilies() {
         var cols = [];
         var cfs = t_self.columnFamilies();
-        for(var i=0;i<cfs.length;i++)
-        {
-          if(cfs[i].enabled())
-          {
+        for(var i=0; i<cfs.length; i++) {
+          if(cfs[i].enabled()) {
             cols.push(cfs[i].name);
           }
         }
         return cols;
       }
-      API.queryTable("getRowQuerySet", JSON.stringify(getColumnFamilies()), ko.toJSON(t_self.querySet())).done(function(data)
-      {
-        if(data.length>0)
-        {
+      API.queryTable("getRowQuerySet", JSON.stringify(getColumnFamilies()), ko.toJSON(t_self.querySet())).done(function(data) {
+        if(data.length > 0) {
           var keys = Object.keys(data);
           var items = [];
-          for(var i=0;i<keys.length;i++)
-          {
-            var row = new SmartViewDataRow({items: [], row:data[keys[i]].row, reload:function(options)
-            {
+          for(var i=0; i<keys.length; i++) {
+            var row = new SmartViewDataRow({items: [], row:data[keys[i]].row, reload: function(options) {
               var self = this;
               options = (options == null) ? {} : options;
               options = ko.utils.extend({
                 callback:function(data){},
                 columns: getColumnFamilies()
               }, options);
-              API.queryTable("getRow", JSON.stringify(options.columns), self.row).done(function(data)
-              {
+              API.queryTable("getRow", JSON.stringify(options.columns), self.row).done(function(data) {
                 self.setItems(data.columns);
                 callback(data);
                 self.isLoading(false);
@@ -107,8 +94,7 @@ ko.applyBindings(app);
 
 routed = false;
 routie({
-  ':cluster/:table/query/:query': function(cluster, table, query)
-    {
+  ':cluster/:table/query/:query': function(cluster, table, query) {
       logGA('query_table');
       Router.setTable(cluster, table);
       Views.render('dataview');
@@ -117,16 +103,14 @@ routie({
       app.search.evaluate();
       routed = true;
     },
-    ':cluster/:table': function(cluster, table)
-    {
+    ':cluster/:table': function(cluster, table) {
       //logGA('view_table'); taken care of in reload()
       Router.setTable(cluster, table);
       app.station('table');
       Views.render('dataview');
       routed = true;
     },
-    ':cluster': function(cluster)
-    {
+    ':cluster': function(cluster) {
       logGA('view_cluster');
       Breadcrumbs.render();
       app.station('cluster');
@@ -136,14 +120,12 @@ routie({
       app.views.tables.reload();
       routed = true;
     },
-    'error': function()
-    {
+    'error': function() {
       logGA('error');
       routed = true;
     },
     '': function(){
-    var redirect = app.clusters.subscribe(function(data)
-    {
+    var redirect = app.clusters.subscribe(function(data) {
       routie(data[0].name);
       redirect.dispose();
     });
@@ -160,41 +142,33 @@ routie({
 
 $.fn.renderElement = function(data){utils.renderElement($(this,data))};
 
-$.fn.showIndicator = function()
-{
+$.fn.showIndicator = function() {
   $(this).addClass('isLoading');
 }
 
-$.fn.hideIndicator = function()
-{
+$.fn.hideIndicator = function() {
   $(this).removeClass('isLoading');
 }
 
-$.fn.toggleIndicator = function()
-{
+$.fn.toggleIndicator = function() {
   $(this).toggleClass('isLoading');
 }
 
-function bindSubmit()
-{
+function bindSubmit() {
   var self = this;
   var data = [];
   var hash_cache = {};
-  $(this).find('.controls > input, .controls > textarea, .controls > ul input').not('input[type=submit]').each(function()
-  {
+  $(this).find('.controls > input, .controls > textarea, .controls > ul input').not('input[type=submit]').each(function() {
     if($(this).hasClass('ignore'))
       return;
     var use_post = $(this).data('use-post');
     var submitVal = null;
-    if($(this).data('subscribe'))
-    {
+    if($(this).data('subscribe')) {
       var target = $($(this).data('subscribe'));
-      switch(target[0].tagName)
-      {
+      switch(target[0].tagName) {
         case "UL":
           var serialized = {};
-          target.find('li').each(function()
-          {
+          target.find('li').each(function() {
             serialized[$(this).find('input')[0].value] = $(this).find('input')[1].value;
           });
           submitVal = JSON.stringify(serialized);
@@ -202,20 +176,17 @@ function bindSubmit()
           break;
       }
     }
-    else if($(this).hasClass('serializeHash'))
-    {
+    else if($(this).hasClass('serializeHash')) {
       var target = $(this).attr('name');
       if(!hash_cache[target])
         hash_cache[target] = {};
       hash_cache[target][$(this).data(key)] = $(this).val();
     }
-    else
-    {
+    else {
       submitVal = $(this).val();
       //change reload next
     }
-    if(submitVal)
-    {
+    if(submitVal) {
       if(use_post)
         submitVal = "hbase-post-key-" + JSON.stringify(submitVal);
       else
@@ -227,13 +198,11 @@ function bindSubmit()
   var ui = app.focusModel();
   if(ui)
     ui.isLoading(true);
-  API.queryArray($(this).attr('action'), data).complete(function()
-  {
+  API.queryArray($(this).attr('action'), data).complete(function() {
     $(self).find('input[type=submit]').removeClass('disabled').hideIndicator();
     if(ui)
       ui.isLoading(false);
-  }).success(function()
-  {
+  }).success(function() {
     if(ui)
       app.focusModel().reload();
     $(self).modal('hide').trigger('reset');
@@ -242,19 +211,16 @@ function bindSubmit()
 }
 $('form.ajaxSubmit').submit(bindSubmit);
 
-$('a.action_addColumn').click(function()
-{
+$('a.action_addColumn').click(function() {
   $(this).parent().find("ul").append("<li><input type=\"text\" name=\"table_columns\" placeholder = \"family:column_name\"/></li>")
 });
-$('a.action_addColumnValue').click(function()
-{
+$('a.action_addColumnValue').click(function() {
   $(this).parent().find("ul").append("<li><input type=\"text\" name=\"column_values\" class=\"ignore\" placeholder = \"family:column_name\"/> <input type=\"text\" name=\"column_values\" class=\"ignore\" placeholder = \"cell_value\"/></li>")
 });
 
 var konami = [38, 38, 40, 40, 37, 39, 37, 39, 66, 65, 13];
 var konami_index = 0;
-$(window).keydown(function(ev)
-{
+$(window).keydown(function(ev) {
   if(ev.keyCode == konami[konami_index])
     konami_index++;
   else

+ 23 - 44
apps/hbase/static/js/base.js

@@ -14,16 +14,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-var BaseModel = function()
-{
+var BaseModel = function() {
 }
 
-var ListViewModel = function(options)
-{
+var ListViewModel = function(options) {
   var self = this, _defaults = {
     items: [],
-    reload: function()
-    {
+    reload: function() {
 
     },
     sortFields: {}
@@ -34,18 +31,16 @@ var ListViewModel = function(options)
   self.items = ko.observableArray(options.items);
   self.sortDropDown = new SortDropDownView({sortFields: options.sortFields, target: self.items});
   self.selectAll = function(){
-    for(t=0;t<self.items().length;t++)
+    for(t=0; t<self.items().length; t++)
       self.items()[t].isSelected(true);
     return self;
   };
-  self.deselectAll = function()
-  {
-    for(q=0;q<self.items().length;q++)
+  self.deselectAll = function() {
+    for(q=0; q<self.items().length; q++)
       self.items()[q].isSelected(false);
     return self;
   };
-  self.toggleSelectAll = function()
-  {
+  self.toggleSelectAll = function() {
     if(self.selected().length != self.items().length)
       return self.selectAll();
     return self.deselectAll();
@@ -53,27 +48,22 @@ var ListViewModel = function(options)
   self.selected = function(){
     var acc = [];
     var items = self.items();
-    for(i=0;i<items.length;i++)
-    {
+    for(i=0; i<items.length; i++) {
       if(items[i].isSelected())
         acc.push(items[i]);
     }
     return acc;
   };
-  self.batchSelected = function(action)
-  {
+  self.batchSelected = function(action) {
     var selected = self.selected();
     var batchCount = 0;
 
-    for(q=0; q<selected.length; q++)
-    {
+    for(q=0; q<selected.length; q++) {
       self.isLoading(true);
       var call = action.apply(selected[q], arguments);
-      var callback = function()
-      {
+      var callback = function() {
         batchCount++;
-        if(batchCount >= selected.length)
-        {
+        if(batchCount >= selected.length) {
           self.reload();
           self.isLoading(false);
         }
@@ -84,35 +74,26 @@ var ListViewModel = function(options)
         self.isLoading(false);
     }
   };
-  self.batchSelectedAlias = function(actionAlias)
-  {
-    self.batchSelected(function()
-    {
+  self.batchSelectedAlias = function(actionAlias) {
+    self.batchSelected(function() {
       return this[actionAlias]();
     });
   };
-  self.enableSelected = function()
-  {
-    self.batchSelected(function()
-    {
+  self.enableSelected = function() {
+    self.batchSelected(function() {
       return this.enable();
     });
   };
-  self.disableSelected = function()
-  {
-    confirm("Confirm Disable", "Disable these tables?", function()
-    {
-      self.batchSelected(function()
-      {
+  self.disableSelected = function() {
+    confirm("Confirm Disable", "Disable these tables?", function() {
+      self.batchSelected(function() {
         return this.disable();
       });
     });
   };
   self.dropSelected = function() {
-    confirm("Confirm Delete", "Are you sure you want to delete the selected items? (WARNING: This cannot be undone!)", function()
-    {
-      self.batchSelected(function()
-      {
+    confirm("Confirm Delete", "Are you sure you want to delete the selected items? (WARNING: This cannot be undone!)", function() {
+      self.batchSelected(function() {
         return this.drop(true);
       });
     });
@@ -120,8 +101,7 @@ var ListViewModel = function(options)
   self.reload = function(callback){
     self.items.removeAll();
     self.isLoading(true);
-    options.reload.apply(self,[function()
-    {
+    options.reload.apply(self,[function() {
       self.isLoading(false);
       if(callback!=null)
         callback();
@@ -132,8 +112,7 @@ var ListViewModel = function(options)
   self.isLoading = ko.observable(false);
 };
 
-var DataRow = function(options)
-{
+var DataRow = function(options) {
   var self = this;
   ko.utils.extend(self,options); //applies options on itself
   BaseModel.apply(self,[options]);

+ 109 - 215
apps/hbase/static/js/controls.js

@@ -40,14 +40,12 @@ var searchRenderers = {
   }
 };
 
-var DataTableViewModel = function(options)
-{
+var DataTableViewModel = function(options) {
   var self = this, _defaults = {
     name: '',
     columns: [],
     items: [],
-    reload: function()
-    {
+    reload: function() {
 
     },
     el:''
@@ -56,20 +54,16 @@ var DataTableViewModel = function(options)
   ListViewModel.apply(this, [options]);
 
   self.name = ko.observable(options.name);
-  self.searchQuery.subscribe(function(value)
-  {
+  self.searchQuery.subscribe(function(value) {
     self._table.fnFilter(value);
   });
   self.columns = ko.observableArray(options.columns);
   self._el = $('table[data-datasource="' + options.el + '"]');
   self._table = null;
-  self._initTable = function()
-  {
-    if(!self._table)
-    {
+  self._initTable = function() {
+    if(!self._table) {
       self._table = self._el.dataTable({
-        "aoColumnDefs": [
-          { "bSortable": false, "aTargets": [ 0 ] }
+        "aoColumnDefs": [ { "bSortable": false, "aTargets": [ 0 ] }
         ],
       "sDom": 'tr',//this has to be in, change to sDom so you can call filter()
       'bAutoWidth':false,
@@ -81,17 +75,14 @@ var DataTableViewModel = function(options)
       var el = $(event.currentTarget);
   };
   var _reload = self.reload;
-  self.reload = function(callback)
-  {
+  self.reload = function(callback) {
     logGA('view_cluster');
-    if(self._table)
-    {
+    if(self._table) {
       self._table.fnClearTable();
       self._table.fnDestroy();
       self._table = null;
     }
-    _reload(function()
-    {
+    _reload(function() {
       self._initTable();
       if(callback!=null)
         callback();
@@ -127,24 +118,20 @@ var DataTableViewModel = function(options)
 };
 
 //a Listview of Listviews
-var SmartViewModel = function(options)
-{
+var SmartViewModel = function(options) {
   var self = this;
   options = ko.utils.extend({
     name: '',
     items: [],
-    reload: function()
-    {
+    reload: function() {
 
     },
     el:'',
     sortFields: {
-      'Row Key': function(a, b)
-      {
+      'Row Key': function(a, b) {
         return a.row.localeCompare(b.row);
       },
-      'Column Count': function(a, b)
-      {
+      'Column Count': function(a, b) {
         a = a.items().length;
         b = b.items().length;
         if(a > b)
@@ -153,8 +140,7 @@ var SmartViewModel = function(options)
           return -1;
         return 0;
       },
-      'Row Key Length': function(a, b)
-      {
+      'Row Key Length': function(a, b) {
         a = a.row.length;
         b = b.row.length;
         if(a > b)
@@ -186,10 +172,8 @@ var SmartViewModel = function(options)
   {
     var inputs = value.match(searchRenderers['rowkey']['select']);
     self.querySet.removeAll();
-    for(var i=0;i<inputs.length;i++)
-    {
-      if(inputs[i].trim() != "" && inputs[i].trim() != ',')
-      {
+    for(var i=0; i<inputs.length; i++) {
+      if(inputs[i].trim() != "" && inputs[i].trim() != ',') {
         var p = inputs[i].split('+');
         var scan = p.length > 1 ? parseInt(p[1].trim()) : 0;
         var extract = inputs[i].match(searchRenderers['rowkey']['nested']['columns']['select']);
@@ -208,14 +192,11 @@ var SmartViewModel = function(options)
     self.evaluateQuery();
   });
 
-  self._reloadcfs = function()
-  {
-    return API.queryTable("getColumnDescriptors").done(function(data)
-    {
+  self._reloadcfs = function() {
+    return API.queryTable("getColumnDescriptors").done(function(data) {
       self.columnFamilies.removeAll();
       var keys = Object.keys(data);
-      for(var i=0;i<keys.length;i++)
-      {
+      for(var i=0;i<keys.length;i++) {
         self.columnFamilies.push(new ColumnFamily({name:keys[i], enabled:false}));
       }
       self.reload();
@@ -223,55 +204,44 @@ var SmartViewModel = function(options)
   };
 
   self.columnQuery = ko.observable("");
-  self.columnQuery.subscribe(function(query)
-  {
-    $(self.items()).each(function()
-    {
+  self.columnQuery.subscribe(function(query) {
+    $(self.items()).each(function() {
       this.searchQuery(query);
     });
   });
 
-  self.rows = ko.computed(function()
-  {
+  self.rows = ko.computed(function() {
     var a = [];
     var items = this.items();
-    for(var i=0; i<items.length; i++)
-    {
+    for(var i=0; i<items.length; i++) {
       a.push(items[i].row);
     }
     return a;
   }, self);
 
   self.querySet = ko.observableArray();
-  self.validateQuery = function()
-  {
-    $(self.querySet()).each(function()
-    {
+  self.validateQuery = function() {
+    $(self.querySet()).each(function() {
       this.validate();
       this.editing(false);
     });
   };
-  self.addQuery = function()
-  {
+  self.addQuery = function() {
     self.validateQuery();
-    self.querySet.push(new QuerySetPeice({onValidate: function()
-    {
+    self.querySet.push(new QuerySetPeice({onValidate: function() {
       //self.reload();
     }}))
   };
-  self.evaluateQuery = function(callback)
-  {
+  self.evaluateQuery = function(callback) {
     self.validateQuery();
     self.reload(callback);
   };
   var _reload = self.reload;
-  self.reload = function(callback)
-  {
+  self.reload = function(callback) {
   	logGA('view_table');
     self.truncated = ko.observable(false);
     var queryStart = new Date();
-    _reload(function()
-    {
+    _reload(function() {
       self.lastReloadTime((new Date() - queryStart)/1000);
       if(callback!=null)
         callback();
@@ -284,21 +254,17 @@ var SmartViewModel = function(options)
   self.truncateCount = ko.observable(0);
 };
 
-var SmartViewDataRow = function(options)
-{
+var SmartViewDataRow = function(options) {
   var self = this;
   options = ko.utils.extend({
     sortFields: {
-      'Column Family': function(a, b)
-      {
+      'Column Family': function(a, b) {
         return a.name.localeCompare(b.name);
       },
-      'Column Name': function(a, b)
-      {
+      'Column Name': function(a, b) {
         return a.name.split(':')[1].localeCompare(b.name.split(':')[1]);
       },
-      'Cell Value': function(a, b)
-      {
+      'Cell Value': function(a, b) {
         a = a.value.length;
         b = b.value.length;
         if(a > b)
@@ -307,8 +273,7 @@ var SmartViewDataRow = function(options)
           return -1;
         return 0;
       },
-      'Timestamp': function(a, b)
-      {
+      'Timestamp': function(a, b) {
         a = parseInt(a.timestamp);
         b = parseInt(b.timestamp);
         if(a > b)
@@ -317,12 +282,10 @@ var SmartViewDataRow = function(options)
           return -1;
         return 0;
       },
-      'MIME Type': function()
-      {
+      'MIME Type': function() {
 
       },
-      'Column Name Length': function(a, b)
-      {
+      'Column Name Length': function(a, b) {
         a = a.name.split(':')[1].length;
         b = b.name.split(':')[1].length;
         if(a > b)
@@ -340,17 +303,14 @@ var SmartViewDataRow = function(options)
 
   self.displayRangeStart = 0;
   self.displayRangeLength = 20;
-  self.items.subscribe(function()
-  {
+  self.items.subscribe(function() {
     self.displayedItems([]);
     self.updateDisplayedItems();
   });
 
-  self.searchQuery.subscribe(function(searchValue)
-  {
+  self.searchQuery.subscribe(function(searchValue) {
     self.scrollLoadSource = ko.computed(function(){
-      return self.items().filter(function(column)
-      {
+      return self.items().filter(function(column) {
         return column.name.toLowerCase().indexOf(searchValue.toLowerCase()) != -1;
       });
     });
@@ -360,50 +320,39 @@ var SmartViewDataRow = function(options)
 
   self.scrollLoadSource = self.items;
 
-  self.updateDisplayedItems = function()
-  {
+  self.updateDisplayedItems = function() {
     var x = self.displayRangeStart;
     self.displayedItems(self.scrollLoadSource().slice(x, x + self.displayRangeLength));
   };
 
-  self.resetScrollLoad = function()
-  {
+  self.resetScrollLoad = function() {
     self.scrollLoadSource = self.items;
     self.updateDisplayedItems();
   };
 
-  self.toggleSelectedCollapse = function()
-  {
-    if(self.displayedItems().length == self.displayRangeStart + self.displayRangeLength)
-    {
-      self.displayedItems(self.displayedItems().filter(function(item)
-      {
+  self.toggleSelectedCollapse = function() {
+    if(self.displayedItems().length == self.displayRangeStart + self.displayRangeLength) {
+      self.displayedItems(self.displayedItems().filter(function(item) {
         return item.isSelected();
       }));
       self.scrollLoadSource = self.displayedItems;
     }
-    else
-    {
+    else {
       self.resetScrollLoad();
     }
   };
 
-  self.onScroll = function(target, ev)
-  {
-    if($(ev.target).scrollLeft() == ev.target.scrollWidth - ev.target.clientWidth && self.displayedItems().length < self.scrollLoadSource().length)
-    {
+  self.onScroll = function(target, ev) {
+    if($(ev.target).scrollLeft() == ev.target.scrollWidth - ev.target.clientWidth && self.displayedItems().length < self.scrollLoadSource().length) {
       self.displayRangeLength += 15;
       self.updateDisplayedItems();
     }
   };
 
-  self.drop = function(cont)
-  {
-    function doDrop()
-    {
+  self.drop = function(cont) {
+    function doDrop() {
       self.isLoading(true);
-      return API.queryTable('deleteAllRow', self.row, "{}").complete(function()
-      {
+      return API.queryTable('deleteAllRow', self.row, "{}").complete(function() {
         app.views.tabledata.items.remove(self); //decouple later
         self.isLoading(false);
       });
@@ -412,12 +361,10 @@ var SmartViewDataRow = function(options)
     (cont === true) ? doDrop() : confirm("Confirm Delete", 'Delete row ' + self.row + '? (This cannot be undone)', doDrop);
   };
 
-  self.setItems = function(cols)
-  {
+  self.setItems = function(cols) {
     var colKeys = Object.keys(cols);
     var items = [];
-    for(var q=0;q<colKeys.length;q++)
-    {
+    for(var q=0; q<colKeys.length; q++) {
       items.push(new ColumnRow({name: colKeys[q],
              timestamp: cols[colKeys[q]].timestamp,
              value: cols[colKeys[q]].value,
@@ -428,30 +375,26 @@ var SmartViewDataRow = function(options)
   };
 
   self.selectAllVisible = function(){
-    for(t=0;t<self.displayedItems().length;t++)
+    for(t=0; t<self.displayedItems().length; t++)
       self.displayedItems()[t].isSelected(true);
     return self;
   };
 
-  self.toggleSelectAllVisible = function()
-  {
+  self.toggleSelectAllVisible = function() {
     if(self.selected().length != self.displayedItems().length)
       return self.selectAllVisible();
     return self.deselectAll();
   };
 
-  self.push = function(item)
-  {
+  self.push = function(item) {
     var column = new ColumnRow(item);
     self.items.push(column);
   };
 
   var _reload = self.reload;
-  self.reload = function(callback)
-  {
+  self.reload = function(callback) {
   	logGA('get_row');
-    _reload(function()
-    {
+    _reload(function() {
       if(callback!=null)
         callback();
       self.isLoading(false);
@@ -459,22 +402,18 @@ var SmartViewDataRow = function(options)
   };
 };
 
-var ColumnRow = function(options)
-{
+var ColumnRow = function(options) {
   var self = this;
   ko.utils.extend(self,options);
   DataRow.apply(self,[options]);
 
   self.value = ko.observable(self.value);
   self.history = new CellHistoryPage({row: self.parent.row, column: self.name, timestamp: self.timestamp, items: []});
-  self.drop = function(cont)
-  {
-    function doDrop()
-    {
+  self.drop = function(cont) {
+    function doDrop() {
       logGA('filter_columns');
       self.parent.isLoading(true);
-      return API.queryTable('deleteColumn', self.parent.row, self.name).done(function(data)
-      {
+      return API.queryTable('deleteColumn', self.parent.row, self.name).done(function(data) {
         self.parent.items.remove(self);
         if(self.parent.items().length > 0)
           self.parent.reload(); //change later
@@ -484,11 +423,9 @@ var ColumnRow = function(options)
     (cont === true) ? doDrop() : confirm("Confirm Delete", "Are you sure you want to drop this column?", doDrop);
   };
 
-  self.reload = function(callback, skipPut)
-  {
+  self.reload = function(callback, skipPut) {
     self.isLoading(true);
-    API.queryTable('get', self.parent.row, self.name, 'null').done(function(data)
-    {
+    API.queryTable('get', self.parent.row, self.name, 'null').done(function(data) {
       if(data.length > 0 && !skipPut)
         self.value(data[0].value);
       if(typeof callback !== "undefined" && callback != null)
@@ -497,12 +434,10 @@ var ColumnRow = function(options)
     });
   };
 
-  self.value.subscribe(function(value)
-  {
+  self.value.subscribe(function(value) {
     //change transport prep to object wrapper
     logGA('put_column');
-    API.queryTable('putColumn', self.parent.row, self.name, "hbase-post-key-" + JSON.stringify(value)).done(function(data)
-    {
+    API.queryTable('putColumn', self.parent.row, self.name, "hbase-post-key-" + JSON.stringify(value)).done(function(data) {
       self.reload(function(){}, true);
     });
     self.editing(false);
@@ -510,11 +445,10 @@ var ColumnRow = function(options)
 
   self.editing = ko.observable(false);
 
-  self.isLoading = ko.observable(false); //move to baseclass 
+  self.isLoading = ko.observable(false); //move to baseclass
 };
 
-var SortDropDownView = function(options)
-{
+var SortDropDownView = function(options) {
   var self = this;
   options = ko.utils.extend({
     sortFields: {},
@@ -529,22 +463,18 @@ var SortDropDownView = function(options)
   self.sortField.subscribe(function(){self.sort()});
   self.sortFields = ko.observableArray(Object.keys(options.sortFields)); // change to ko.computed?
   self.sortFunctionHash = ko.observable(options.sortFields);
-  self.toggleSortMode = function()
-  {
+  self.toggleSortMode = function() {
     self.sortAsc(!self.sortAsc());
   };
-  self.sort = function()
-  {
+  self.sort = function() {
     if (!self.target || !(self.sortFields().length > 0)) return;
-    self.target.sort(function(a, b)
-    {
+    self.target.sort(function(a, b) {
       return (self.sortAsc() ? 1 : -1) * self.sortFunctionHash()[self.sortField() ? self.sortField() : self.sortFields()[0]](a,b); //all sort functions must sort by ASC for default
     });
   };
 };
 
-var TableDataRow = function(options)
-{
+var TableDataRow = function(options) {
   var self = this;
   options = ko.utils.extend({
     name:"",
@@ -556,37 +486,30 @@ var TableDataRow = function(options)
   self.enabled = ko.observable(options['enabled']);
   self.toggle = function(viewModel,event){
     var action = ['enable','disable'][self.enabled() << 0], el = $(event.currentTarget);
-    confirm("Confirm "+action, "Are you sure you want to " + action + " this table?", function() //gotta i18n this!
+    confirm("Confirm "+action, "Are you sure you want to " + action + " this table?", function() //gotta i18n this! 
     {
       el.showIndicator();
-      return self[action](el).complete(function()
-      {
+      return self[action](el).complete(function() {
         el.hideIndicator();
       });
     });
   };
-  self.enable = function(el)
-  {
-    return API.queryCluster('enableTable',self.name).complete(function()
-    {
+  self.enable = function(el) {
+    return API.queryCluster('enableTable',self.name).complete(function() {
       self.enabled(true);
     });
   };
-  self.disable = function(el)
-  {
-    return API.queryCluster('disableTable',self.name).complete(function()
-    {
+  self.disable = function(el) {
+    return API.queryCluster('disableTable',self.name).complete(function() {
       self.enabled(false);
     });
   };
-  self.drop = function(el)
-  {
+  self.drop = function(el) {
     return API.queryCluster('deleteTable',self.name);
   };
 };
 
-var QuerySetPeice = function(options)
-{
+var QuerySetPeice = function(options) {
   var self = this;
   options = ko.utils.extend({
     row_key: "null",
@@ -605,8 +528,7 @@ var QuerySetPeice = function(options)
   self.filter = ko.observable(options.filter);
   self.editing = ko.observable(true);
 
-  self.validate = function()
-  {
+  self.validate = function() {
     if(self.scan_length() <= 0 || self.row_key() == "")
       return app.views.tabledata.querySet.remove(self); //change later
     return options.onValidate();
@@ -615,12 +537,10 @@ var QuerySetPeice = function(options)
   self.scan_length.subscribe(self.validate.bind());
 };
 
-var ColumnFamily = function(options)
-{
+var ColumnFamily = function(options) {
   this.name = options.name;
   this.enabled = ko.observable(options.enabled);
-  this.toggle = function()
-  {
+  this.toggle = function() {
     this.enabled(!this.enabled());
     app.views.tabledata.reload();
   };
@@ -628,44 +548,37 @@ var ColumnFamily = function(options)
 
 
 //tagsearch
-var tagsearch = function()
-{
+var tagsearch = function() {
   var self = this;
   self.tags = ko.observableArray();
   self.mode = ko.observable('idle');
   self.cur_input = ko.observable('');
-  self.hints = ko.observableArray([
-    {
+  self.hints = ko.observableArray([ {
       hint: 'End Query',
       shortcut: ',',
       mode: ['rowkey', 'prefix', 'scan'],
       selected: false
-    },
-    {
+    }, {
       hint: 'Mark Row Prefix',
       shortcut: '*',
       mode: ['rowkey'],
       selected: false
-    },
-    {
+    }, {
       hint: 'Start Scan',
       shortcut: '+',
       mode: ['rowkey', 'prefix'],
       selected: false
-    },
-    {
+    }, {
       hint: 'Start Select Columns',
       shortcut: '[',
       mode: ['rowkey', 'prefix'],
       selected: false
-    },
-    {
+    }, {
       hint: 'End Column/Family',
       shortcut: ',',
       mode: ['columns'],
       selected: false
-    },
-    {
+    }, {
       hint: 'End Select Columns',
       shortcut: ']',
       mode: ['columns'],
@@ -684,19 +597,16 @@ var tagsearch = function()
       selected: false
     }
   ]);
-  self.activeHints = ko.computed(function()
-  {
+  self.activeHints = ko.computed(function() {
     var ret = [];
-    $(self.hints()).each(function(i, hint)
-    {
+    $(self.hints()).each(function(i, hint) {
       if (hint.mode.indexOf(self.mode()) > -1)
         ret.push(hint);
     });
     return ret;
   });
   self.activeHint = ko.observable(-1);
-  self.modes =
-  {
+  self.modes = {
     'rowkey': {
       hint: 'Row Key Value',
       type: 'String'
@@ -722,23 +632,18 @@ var tagsearch = function()
   self.modeQueue = ['idle'];
   self.focused = ko.observable(false);
 
-  self.insertTag = function(tag)
-  {
+  self.insertTag = function(tag) {
     var mode = tag.indexOf('+') != -1 ? 'scan' : 'rowkey';
     var tag = {value: tag, tag: mode} //parse mode
     self.tags.push(tag);
   }
 
-  self.render = function(input, renderers)
-  {
+  self.render = function(input, renderers) {
     var keys = Object.keys(renderers);
-    for(var i=0; i<keys.length; i++)
-    {
-      input = input.replace(renderers[keys[i]].select, function(selected)
-      {
+    for(var i=0; i<keys.length; i++) {
+      input = input.replace(renderers[keys[i]].select, function(selected) {
         var hasMatched = false;
-        var processed = selected.replace(renderers[keys[i]].tag, function(tagged)
-        {
+        var processed = selected.replace(renderers[keys[i]].tag, function(tagged) {
           hasMatched = true;
           return "<span class='" + keys[i] + " tagsearchTag' title='" + keys[i] + "' data-toggle='tooltip'>" + ('nested' in renderers[keys[i]] ? self.render(tagged, renderers[keys[i]].nested) : tagged) + "</span>";
         });
@@ -750,23 +655,19 @@ var tagsearch = function()
     return input;
   };
 
-  self.updateMode = function(value)
-  {
+  self.updateMode = function(value) {
     var selection = value.slice(0, self.selectionEnd());
     var endindex = selection.slice(selection.lastIndexOf(',')).indexOf(',');
     if(endindex == -1) endindex = selection.length;
     var lastbit = value.substring(selection.lastIndexOf(','), endindex).trim();
-    if(lastbit == "," || lastbit == "")
-    {
+    if(lastbit == "," || lastbit == "") {
       self.mode('idle');
       return;
     }
     var tokens = "[]+,*{}";
     var m = 'rowkey';
-    for(var i=selection.length - 1; i>=0; i--)
-    {
-      if(tokens.indexOf(selection[i]) != -1)
-      {
+    for(var i=selection.length - 1; i>=0; i--) {
+      if(tokens.indexOf(selection[i]) != -1) {
         if(selection[i] == '{')
           m = 'filter';
         else if(selection[i] == '[')
@@ -786,8 +687,7 @@ var tagsearch = function()
   self.selectionStart = ko.observable(0);
   self.selectionEnd = ko.observable(0);
 
-  self.hintText = ko.computed(function()
-  {
+  self.hintText = ko.computed(function() {
     var value = self.cur_input();
     var selection = value.slice(0, self.selectionEnd());
     var index = selection.lastIndexOf(',') + 1;
@@ -802,10 +702,8 @@ var tagsearch = function()
     return pre.slice(0, s) + "<span class='selection'>" + pre.slice(s, e) + "</span>" + pre.slice(e);
   });
 
-  self.onKeyDown = function(target, ev)
-  {
-    if(ev.keyCode == 13 && self.cur_input().slice(self.cur_input().lastIndexOf(',')).trim() != ",")
-    {
+  self.onKeyDown = function(target, ev) {
+    if(ev.keyCode == 13 && self.cur_input().slice(self.cur_input().lastIndexOf(',')).trim() != ",") {
         self.evaluate();
         return false;
     }
@@ -822,8 +720,7 @@ var tagsearch = function()
 	self.updateMode(self.cur_input());
   };
 
-  self.evaluate = function()
-  {
+  self.evaluate = function() {
     app.views.tabledata.searchQuery(self.cur_input());
   };
 
@@ -848,19 +745,16 @@ var tagsearch = function()
   });
 };
 
-var CellHistoryPage = function(options)
-{
+var CellHistoryPage = function(options) {
   var self = this;
 
   self.items = ko.observableArray(options.items);
   self.loading = ko.observable(false);
 
-  self.reload = function(timestamp, append)
-  {
+  self.reload = function(timestamp, append) {
     if(!timestamp)
       timestamp = options.timestamp
-    API.queryTable("getVerTs", options.row, options.column, timestamp, 10, 'null').done(function(res)
-    {
+    API.queryTable("getVerTs", options.row, options.column, timestamp, 10, 'null').done(function(res) {
       self.loading = ko.observable(true);
       if(!append)
         self.items(res);

+ 13 - 26
apps/hbase/static/js/nav.js

@@ -14,50 +14,40 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-var Router =
-{
-  go: function(page)
-  {
+var Router = {
+  go: function(page) {
     if(!Views.render(page))
       return history.back();
     return page;
   },
-  setTable: function(cluster, table)
-  {
+  setTable: function(cluster, table) {
     Router.setCluster(cluster);
     app.pageTitle(cluster + ' / ' + table);
     app.views.tabledata.name(table);
     app.focusModel(app.views.tabledata);
   },
-  setCluster: function(cluster)
-  {
+  setCluster: function(cluster) {
     Router.set();
     app.cluster(cluster);
   },
-  set: function()
-  {
+  set: function() {
       Breadcrumbs.render();
   }
 }
 
-var Breadcrumbs =
-{
+var Breadcrumbs = {
   _selector_root:'#hbase-breadcrumbs',
   //renders breadcrumbs automaticall
-  render:function(mutators)
-  {
+  render:function(mutators) {
     root = $(Breadcrumbs._selector_root).html('');
     crumbs = ['/hbase'].concat(document.URL.split('/').splice(4));
     biglink = "";
-    for(i=0;i<crumbs.length;i++)
-    {
+    for(i=0;i<crumbs.length;i++) {
       biglink += crumbs[i] + '/'
-      function clean_url(url)
-      {
+      function clean_url(url) {
         replacers = {'/': '', '#': '', '_': ' ', '^[a-z]': function(a) { return a.toUpperCase(); }};
         keys = Object.keys(replacers);
-        for(q=0;q<keys.length;q++)
-        {
+        for(q=0;q<keys.length;q++) {
           url = url.replace(new RegExp(keys[q],'g'), replacers[keys[q]]);
         }
         return url;
@@ -69,10 +59,8 @@ var Breadcrumbs =
   }
 }
 
-var Views =
-{
-  render:function(view)
-  {
+var Views = {
+  render:function(view) {
     page = $('.hbase-page#hbase-page-' + view);
     if(!page)
       return false;
@@ -80,8 +68,7 @@ var Views =
     page.addClass('active');
     return page;
   },
-  displayError:function(error)
-  {
+  displayError:function(error) {
     console.log(error);
   }
 }

+ 42 - 83
apps/hbase/static/js/utils.js

@@ -14,44 +14,35 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-var utils =
-{
+var utils = {
   //take an element with mustache templates as content and re-render
-  renderElement:function(element,data)
-  {
+  renderElement:function(element,data) {
     element.html(Mustache.render(element.html(), data));
   },
-  renderElements:function(selector,data)
-  {
+  renderElements:function(selector,data) {
     if(selector == null || typeof(selector) == "undefined")
       selector = '';
-    $(selector).each(function()
-    {
+    $(selector).each(function() {
       utils._renderElement(this);
     });
   },
-  renderPage:function(page_selector,data)
-  {
+  renderPage:function(page_selector,data) {
     return utils.renderElements('.' + PAGE_TEMPLATE_PREFIX + page_selector,data);
   },
-  setTitle:function(title)
-  {
+  setTitle:function(title) {
     $('.page-title').text(title);
     return this;
   },
-  getTitle:function()
-  {
+  getTitle:function() {
     return $('.page-title').text();
   }
 }
 
 
-function hashToArray(hash)
-{
+function hashToArray(hash) {
   var keys = Object.keys(hash);
   var output = [];
-  for(var i=0;i<keys.length;i++)
-  {
+  for(var i=0;i<keys.length;i++) {
     output.push({'key':keys[i],'value':hash[keys[i]]});
   }
   return output;
@@ -59,8 +50,7 @@ function hashToArray(hash)
 
 function stringHashColor(str) {
   var r = 0, g = 0, b = 0, a = 0;
-  for(var i=0;i<str.length;i++)
-  {
+  for(var i=0;i<str.length;i++) {
     var c = str.charCodeAt(i);
     a += c;
     r += Math.floor(Math.abs(Math.sin(c)) * a);
@@ -70,23 +60,19 @@ function stringHashColor(str) {
     return 'rgb('+(r%190)+','+(g%190)+','+(b%190)+')'; //always keep values under 180, to keep it darker
 }
 
-function scrollTo(posY)
-{
+function scrollTo(posY) {
   $('html, body').animate({scrollTop: posY - 120}, 400);
 }
 
-function lockClickOrigin(func, origin)
-{
-  return function(target, ev)
-  {
+function lockClickOrigin(func, origin) {
+  return function(target, ev) {
     if(origin != ev.target)
       return function(){};
     return func(target, ev);
   };
 }
 
-function confirm(title, text, callback)
-{
+function confirm(title, text, callback) {
   var modal = $('#confirm-modal');
   ko.cleanNode(modal[0]);
   modal.attr('data-bind','template: {name: "confirm_template"}');
@@ -98,22 +84,18 @@ function confirm(title, text, callback)
   modal.modal('show');
 }
 
-function launchModal(modal, data)
-{
+function launchModal(modal, data) {
   var element = $('#'+modal);
   ko.cleanNode(element[0]);
   element.attr('data-bind','template: {name: "'+modal+'_template"}');
   ko.applyBindings(data, element[0]);
   element.is('.ajaxSubmit') ? element.submit(bindSubmit) : '';
-  switch(modal)
-  {
+  switch(modal) {
     case 'cell_edit_modal':
-      if(data.mime.split('/')[0] == 'text')
-      {
+      if(data.mime.split('/')[0] == 'text') {
         var target = document.getElementById('codemirror_target');
         var mime = data.mime;
-        if(mime == "text/json")
-        {
+        if(mime == "text/json") {
           mime = {name: "javascript", json: true};
         }
             var cm = CodeMirror.fromTextArea(target, {
@@ -122,8 +104,7 @@ function launchModal(modal, data)
               lineNumbers: true
             });
             setTimeout(function(){cm.refresh()}, 401); //CM invis bug workaround
-            element.find('input[type=submit]').click(function()
-            {
+            element.find('input[type=submit]').click(function() {
               cm.save();
             });
           }
@@ -135,16 +116,13 @@ function launchModal(modal, data)
 logGA(modal.slice(0, modal.indexOf('_modal') != -1 ? modal.indexOf('_modal') : modal.length));
 }
 
-function parseXML(xml)
-{
+function parseXML(xml) {
   var parser, xmlDoc;
-  if (window.DOMParser)
-  {
+  if (window.DOMParser) {
      parser = new DOMParser();
       xmlDoc = parser.parseFromString(xml,"text/xml");
   }
-  else
-    {
+  else {
     xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
     xmlDoc.async = false;
     xmlDoc.loadXML(xml);
@@ -152,94 +130,76 @@ function parseXML(xml)
     return new XMLSerializer().serializeToString(xmlDoc);
 }
 
-function detectMimeType(data)
-{
-  var MIME_TESTS =
-  {
+function detectMimeType(data) {
+  var MIME_TESTS = {
     'type/null':function(data){return !data;},
     'type/int':function(data){return !isNaN(parseInt(data));},
-    'text/json':function(data)
-    {
-      try
-      {
+    'text/json':function(data) {
+      try {
         return JSON.parse(data);
       }
       catch(err){}
     },
-    'text/xml':function(data)
-    {
+    'text/xml':function(data) {
       return parseXML(data).indexOf('parsererror') == -1;
     }
   }
   var keys = Object.keys(MIME_TESTS);
-  for(var i=0;i<keys.length;i++)
-  {
+  for(var i=0;i<keys.length;i++) {
     if(MIME_TESTS[keys[i]](data))
       return keys[i];
   }
   //images
   var types = ['image/png','image/gif','image/jpg','application/pdf']
   var b64 = ['iVBORw','R0lG','/9j/','JVBERi']
-  try
-  {
+  try {
     var decoded = atob(data).toLowerCase().trim();
-    for(var i=0;i<types.length;i++)
-    {
+    for(var i=0;i<types.length;i++) {
       var location = decoded.indexOf(types[i].split('/')[1]);
       if(location >= 0 && location<10) //stupid guess
         return types[i];
     }
   }
-  catch(error)
-  {
+  catch(error) {
   }
-  for(var i=0;i<types.length;i++)
-  {
+  for(var i=0;i<types.length;i++) {
     if(data.indexOf(b64[i]) >= 0 && data.indexOf(b64[i]) <= 10)
       return types[i];
   }
   return 'type/null';
 }
 
-function convertTimestamp(timestamp)
-{
+function convertTimestamp(timestamp) {
   var date = new Date(parseInt(timestamp)*1000);
   return date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();
 }
 
-function resetElements()
-{
-  $(window).scroll(function(e)
-  {
-    $(".subnav.sticky").each(function()
-    {
+function resetElements() {
+  $(window).scroll(function(e) {
+    $(".subnav.sticky").each(function() {
       var padder = $(this).data('padder'), top = $(this).position().top;
-      if(padder && top <= padder.position().top)
-      {
+      if(padder && top <= padder.position().top) {
         $(this).removeClass('subnav-fixed').data('padder').remove();
         $(this).removeData('padder');
       }
-      else if(!padder && top <= window.scrollY + $('.navbar').outerHeight())
-      {
+      else if(!padder && top <= window.scrollY + $('.navbar').outerHeight()) {
         $(this).addClass('subnav-fixed').data('padder',$('<div></div>').insertBefore($(this)).css('height',$(this).outerHeight()));
       }
     });
   });
 };
 
-function prepForTransport(value)
-{
+function prepForTransport(value) {
   value = value.replace(/\"/g,'\\\"').replace(/\//g,'\\/');
   if(isNaN(parseInt(value)) && value.trim() != '')
     value = '"' + value + '"';
   return encodeURIComponent(value);
 };
 
-function logGA(postfix)
-{
+function logGA(postfix) {
   if(postfix == null)
     postfix = ""
-  if (typeof trackOnGA == 'function'){
+  if (typeof trackOnGA == 'function') {
     trackOnGA('hbase/' + postfix);
   }
 };
@@ -320,8 +280,7 @@ ko.bindingHandlers.editableText = {
     } else {
       if(!fallback) {
         element.innerHTML = app.search.render(value, searchRenderers);
-        if(window.selectIndex != null)
-        {
+        if(window.selectIndex != null) {
           setCursor(element, window.selectIndex);
         }
       }