Pārlūkot izejas kodu

HUE-6932 [indexes] Add field sample popover

Enrico Berti 8 gadi atpakaļ
vecāks
revīzija
f0018cd

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
desktop/core/src/desktop/static/desktop/css/hue.css


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
desktop/core/src/desktop/static/desktop/css/hue3-extra.css


+ 0 - 2
desktop/core/src/desktop/static/desktop/less/hue-cross-version.less

@@ -406,8 +406,6 @@ ul.errorlist {
   input[type="text"] {
     border-radius: 20px;
     margin: 0;
-    min-height: 26px;
-    padding-left: 12px;
     width: 130px;
   }
 }

+ 156 - 3
desktop/libs/indexer/src/indexer/templates/indexes.mako

@@ -18,7 +18,7 @@
   from django.utils.translation import ugettext as _
   from desktop import conf
 
-  from desktop.views import commonheader, commonfooter, commonshare, commonimportexport
+  from desktop.views import commonheader, commonfooter, commonshare, commonimportexport, _ko
 %>
 
 <%namespace name="assist" file="/assist.mako" />
@@ -51,7 +51,8 @@ ${ assist.assistPanel() }
 
 <link rel="stylesheet" href="${ static('notebook/css/notebook.css') }" type="text/css">
 <link rel="stylesheet" href="${ static('indexer/css/indexes.css') }" type="text/css">
-
+<script src="${ static('desktop/js/hue.json.js') }" type="text/javascript" charset="utf-8"></script>
+<script src="${ static('dashboard/js/search.ko.js') }" type="text/javascript" charset="utf-8"></script>
 
 <script type="text/html" id="indexes-breadcrumbs">
   <h1>
@@ -87,6 +88,75 @@ ${ assist.assistPanel() }
   </h1>
 </script>
 
+<script type="text/html" id="analysis-popover">
+  <!-- ko if: $root.fieldAnalysesName() -->
+  <div data-bind="with: $root.getFieldAnalysis()">
+    <div class="pull-right">
+      <input type="text" data-bind="visible: section() == 'terms', clearable: terms.prefix, valueUpdate:'afterkeydown'" placeholder="${ _('Prefix filter...') }"/>
+    </div>
+    <ul class="nav nav-tabs" role="tablist" style="margin-bottom: 20px">
+      <li class="active"><a href="#analysis-terms-index" role="tab" data-toggle="tab" data-bind="click: function() { section('terms'); }">${ _('Terms') }</a></li>
+      <li><a href="#analysis-stats-index" role="tab" data-toggle="tab" data-bind="click: function() { section('stats'); }">${ _('Stats') }</a></li>
+    </ul>
+    <div class="tab-content" style="max-height: 370px; height: 370px; border: none">
+      <div class="tab-pane active" id="analysis-terms-index" data-bind="with: terms">
+        <div class="widget-spinner" data-bind="visible: $parent.isLoading()">
+          <i class="fa fa-spinner fa-spin"></i>
+        </div>
+        <div class="alert" data-bind="visible: ! $parent.isLoading() && $data.data().length == 0">${ _('There are no terms to be shown') }</div>
+        <table style="width: 100%" data-bind="visible: ! $parent.isLoading() && $data.data().length > 0" class="table table-condensed">
+          <tbody data-bind="foreach: $data.data">
+          <tr>
+            <td data-bind="text: val.value"></td>
+            <td style="width: 40px">
+              <div class="progress">
+                <div class="bar-label" data-bind="text:val.count"></div>
+                <div class="bar bar-info" style="margin-top:-20px;" data-bind="style: {'width': ((val.count / $parent.data()[0].val.count) * 100) + '%'}"></div>
+              </div>
+            </td>
+          </tr>
+          </tbody>
+        </table>
+      </div>
+      <div class="tab-pane" id="analysis-stats-index" data-bind="with: stats">
+        <div class="widget-spinner" data-bind="visible: $parent.isLoading()">
+          <i class="fa fa-spinner fa-spin"></i>
+        </div>
+        <div class="alert" data-bind="visible: !$parent.isLoading() && $data.data().length > 0 && $data.data()[0].key.toLowerCase() == 'error'">${ _('This field does not support stats') }</div>
+        <div class="alert" data-bind="visible: !$parent.isLoading() && $data.data().length == 0">${ _('There are no stats to be shown') }</div>
+        <table style="width: 100%" data-bind="visible: ! $parent.isLoading() && $data.data().length > 0 && $data.data()[0].key.toLowerCase() != 'error'" class="table table-condensed">
+          <tbody data-bind="foreach: $data.data">
+          <tr>
+            <td style="vertical-align: top"><strong data-bind="text: key"></strong></td>
+            <!-- ko if: key == 'facets' -->
+            <td>
+              <!-- ko if: val[Object.keys(val)[0]] != null -->
+              <table style="width: 400px">
+                <tbody data-bind="foreach: Object.keys(val[Object.keys(val)[0]])">
+                  <tr>
+                    <td style="vertical-align: top; padding-left: 4px; padding-right: 4px"><strong data-bind="text: $data"></strong></td>
+                    <td data-bind="template: 'stats-facets'"></td>
+                  </tr>
+                </tbody>
+              </table>
+              <!-- /ko -->
+              <!-- ko ifnot: val[Object.keys(val)[0]] != null -->
+              ${ _('Not available') }
+              <!-- /ko -->
+            </td>
+            <!-- /ko -->
+            <!-- ko ifnot: key == 'facets' -->
+            <td data-bind="text: val"></td>
+            <!-- /ko -->
+          </tr>
+          </tbody>
+        </table>
+      </div>
+    </div>
+  </div>
+  <!-- /ko -->
+</script>
+
 <div class="navbar hue-title-bar nokids">
     <div class="navbar-inner">
       <div class="container-fluid">
@@ -168,6 +238,19 @@ ${ assist.assistPanel() }
 
             <!-- ko template: { if: section() == 'list-indexes', name: 'list-indexes' }--><!-- /ko -->
             <!-- ko template: { if: section() == 'list-index', name: 'list-index', data: index() }--><!-- /ko -->
+
+            <div id="fieldAnalysisIndexes" class="popover mega-popover right">
+              <div class="arrow"></div>
+              <h3 class="popover-title" style="text-align: left">
+                <a class="pull-right pointer" data-bind="click: function(){ $('#fieldAnalysisIndexes').hide(); $root.fieldAnalysesName(''); }"><i class="fa fa-times"></i></a>
+                <strong data-bind="text: $root.fieldAnalysesName"></strong>
+                <!-- ko if: $root.getFieldAnalysis() -->
+                  (<span data-bind="text: $root.getFieldAnalysis().type"></span>)
+                <!-- /ko -->
+              </h3>
+              <div class="popover-content" data-bind="template: { name: 'analysis-popover' }" style="text-align: left"></div>
+            </div>
+
           </div>
 
           <!-- ko hueSpinner: { spin: isLoading, center: true, size: 'xlarge' } --><!-- /ko -->
@@ -379,7 +462,7 @@ ${ assist.assistPanel() }
         <tr>
           <td data-bind="text: $index() + 1"></td>
           <td>
-            <i class="fa fa-info muted pointer analysis"></i>
+            <i class="fa fa-info muted pointer analysis" data-bind="click: function(data, e) { $root.fieldAnalysesName(name()); $root.showFieldAnalysis(data, e); }, attr: {'title': '${ _ko('Analyze') }'}, visible: type() != 'aggr'"></i>
           </td>
           <td data-bind="text: name"></td>
           <td data-bind="text: type"></td>
@@ -592,6 +675,21 @@ ${ assist.assistPanel() }
       };
     };
 
+    var Collection = function () {
+      var self = this;
+
+      self.id = ko.observable('');
+      self.name = ko.observable('');
+      self.engine = 'solr';
+    }
+
+
+    var Query = function () {
+      var self = this;
+      self.qs = ko.observableArray([ ko.mapping.fromJS({q:''}) ]);
+      self.fqs = ko.observableArray([]);
+    }
+
 
     var IndexesViewModel = function (options) {
       var self = this;
@@ -761,6 +859,7 @@ ${ assist.assistPanel() }
             self.index().type(index.type());
             self.index().getSample();
             hueUtils.changeURL(self.baseURL + self.index().name());
+            self.collection.name(self.index().name());
             self.section('list-index');
             self.tab('index-overview');
           } else {
@@ -788,6 +887,40 @@ ${ assist.assistPanel() }
         });
         hueAnalytics.log('indexes', 'delete_indexes');
       };
+
+      self.fieldAnalyses = ko.observableArray([]);
+      self.fieldAnalysesName = ko.observable('');
+      self.collection = new Collection();
+      self.query = new Query();
+
+      self.showFieldAnalysis = function (data, e) {
+        if (self.fieldAnalysesName()) {
+          var analyse = self.getFieldAnalysis();
+
+          if (analyse == null) {
+            analyse = new FieldAnalysis(self, self.fieldAnalysesName(), data.type());
+            self.fieldAnalyses.push(analyse);
+          }
+
+          analyse.update();
+          huePubSub.publish('show.analysis', e);
+        }
+      }
+
+      self.getFieldAnalysis = function () {
+        var fieldName = self.fieldAnalysesName();
+        var _analyse = null;
+
+        $.each(self.fieldAnalyses(), function (index, analyse) {
+          if (analyse.name() == fieldName) {
+            _analyse = analyse;
+            return false;
+          }
+        });
+
+        return _analyse;
+      };
+
     };
     return IndexesViewModel;
   })();
@@ -812,6 +945,26 @@ ${ assist.assistPanel() }
         }
       }, 'indexes');
 
+      huePubSub.subscribe('show.analysis', function (originalEvent) {
+        if (originalEvent.pageX == null && originalEvent.clientX != null) {
+          var doc = document.documentElement, body = document.body;
+          originalEvent.pageX = originalEvent.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
+          originalEvent.pageY = originalEvent.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
+        }
+        if ($('#indexesComponents').offset().left > 0) {
+          originalEvent.pageX = originalEvent.pageX - $('#indexesComponents').offset().left;
+          originalEvent.pageY = originalEvent.pageY - $('#indexesComponents').offset().top;
+        }
+        else {
+          originalEvent.pageX = originalEvent.pageX - $('.content-panel').position().left;
+          originalEvent.pageY = originalEvent.pageY + $('.content-panel').scrollTop();
+        }
+        $("#fieldAnalysisIndexes").show().css({
+          top: Math.max(0, originalEvent.pageY + ${ is_embeddable and '48' or '-70'} - $("#fieldAnalysisIndexes").outerHeight() / 2),
+          left: originalEvent.pageX
+        });
+      });
+
       viewModel.fetchIndexes(function () {
         if (options.index) {
           var foundIndex = viewModel.getIndexByName(options.index);

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels