Преглед изворни кода

HUE-7848 [dashboard] Add widget's field list could present more metadata

jdesjean пре 7 година
родитељ
комит
4b95d085df

+ 1 - 1
desktop/core/src/desktop/templates/assist.mako

@@ -1000,7 +1000,7 @@ from desktop.views import _ko
     };
 
     var SOLR_ASSIST_KNOWN_FACET_VALUES = {
-      'type': {'date': -1, 'tdate': -1, 'timestamp': -1, 'pdate': -1, 'int': -1, 'tint': -1, 'pint': -1, 'long': -1, 'tlong': -1, 'plong': -1, 'float': -1, 'tfloat': -1, 'pfloat': -1, 'double': -1, 'tdouble': -1, 'pdouble': -1, 'currency': -1, 'smallint': -1, 'bigint': -1, 'tinyint': -1, 'SpatialRecursivePrefixTreeFieldType': -1 }
+      'type': {'date': -1, 'tdate': -1, 'timestamp': -1, 'pdate': -1, 'int': -1, 'tint': -1, 'pint': -1, 'long': -1, 'tlong': -1, 'plong': -1, 'float': -1, 'tfloat': -1, 'pfloat': -1, 'double': -1, 'tdouble': -1, 'pdouble': -1, 'currency': -1, 'smallint': -1, 'bigint': -1, 'tinyint': -1, 'SpatialRecursivePrefixTreeFieldType': -1, 'string': -1, 'boolean': -1 }
     };
 
 

Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
desktop/libs/dashboard/src/dashboard/static/dashboard/css/common_dashboard.css


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
desktop/libs/dashboard/src/dashboard/static/dashboard/css/search.css


+ 49 - 2
desktop/libs/dashboard/src/dashboard/static/dashboard/js/search.ko.js

@@ -1245,6 +1245,17 @@ var Collection = function (vm, collection) {
   });
 
   self.template.fieldsModalFilter = ko.observable(""); // For UI
+  self.template.autocompleteFromFieldsModalFilter = function (nonPartial, partial) {
+    var result = [];
+    var partialLower = partial.toLowerCase();
+    self.template.availableWidgetFields().forEach(function (entry) {
+      var value = typeof entry.name() == "string" ? entry.name() : entry.name().toString();
+      if (value.toLowerCase().indexOf(partialLower) === 0) {
+        result.push(nonPartial + partial + value.substring(partial.length));
+      }
+    });
+    return result;
+  };
   self.template.fieldsModalType = ko.observable(""); // For UI
   self.template.fieldsAttributesFilter = ko.observable(""); // For UI
 
@@ -1290,11 +1301,19 @@ var Collection = function (vm, collection) {
 
   self.template.filteredModalFields = ko.pureComputed(function () {
     var filter = self.template.fieldsModalFilter();
-    if (! filter) {
+    var bHasText = filter && filter.text && filter.text.length;
+    var bHasFacet = filter && filter.facets && filter.facets['type'];
+    if (!bHasText && !bHasFacet) {
       return self.template.availableWidgetFields();
     } else {
+      var aType = bHasFacet ? Object.keys(filter.facets['type']).map(function (s) { return s && s.toLowerCase(); }) : [];
+      var aText = filter.text.map(function (s) { return s && s.toLowerCase(); })
       return ko.utils.arrayFilter(self.template.availableWidgetFields(), function (field) {
-        return field.name().toLowerCase().indexOf(filter.toLowerCase()) > -1;
+        var bTextMatch = !bHasText || aText.some(function (text) {
+          return field.name().toLowerCase().indexOf(text) > -1;
+        });
+        var bFacetMatch = !bHasFacet || aType.indexOf(field.type().toLowerCase()) > -1;
+        return bTextMatch && bFacetMatch;
       });
     }
   });
@@ -1645,6 +1664,34 @@ var Collection = function (vm, collection) {
     }
   });
 
+  self.showContextPopover = function (field, event) {
+    var $source = $(event.target);
+    var offset = $source.offset();
+    var split = self.name().split('.');
+    huePubSub.publish('context.popover.show', {
+      data: {
+        type: self.engine() === 'solr' ? 'collection' : 'column',
+        identifierChain: [
+          { name: split.length > 1 ? split[0] : 'default' },
+          { name: split.length > 1 ? split[1] : split[0] },
+          { name: field.name() }
+        ]
+      },
+      showInAssistEnabled: true,
+      sourceType: self.engine(),
+      orientation: 'right',
+      defaultDatabase: 'default',
+      pinEnabled: false,
+      source: {
+        element: event.target,
+        left: offset.left,
+        top: offset.top - 3,
+        right: offset.left + $source.width() + 1,
+        bottom: offset.top + $source.height() - 3
+      }
+    });
+  };
+
   huePubSub.publish('set.active.dashboard.collection', self);
 };
 

+ 8 - 0
desktop/libs/dashboard/src/dashboard/static/dashboard/less/common_dashboard.less

@@ -548,4 +548,12 @@
     margin-top: 1px;
   }
 
+  #addFacetDemiModal .inline-autocomplete-container {
+    width: 220px;
+    height: 30px;
+  }
+
+  #addFacetDemiModal .inline-autocomplete-container .inline-autocomplete-input {
+    width: calc(100% ~"-" 10px);
+  }
 }

+ 2 - 0
desktop/libs/dashboard/src/dashboard/static/dashboard/less/search.less

@@ -277,6 +277,7 @@
   .fields-chooser li {
     cursor: pointer;
     margin-bottom: 10px;
+    padding: 0px;
   }
 
   .fields-chooser li .badge {
@@ -426,6 +427,7 @@
   }
 
   .demi-modal {
+    z-index: 1038;
     min-height: 80px;
     .typeahead {
       position: fixed;

+ 15 - 25
desktop/libs/dashboard/src/dashboard/templates/common_search.mako

@@ -2555,13 +2555,25 @@ ${ dashboard.layout_skeleton(suffix='search') }
   <div class="modal-body">
     <a href="javascript: void(0)" data-dismiss="modal" data-bind="click: addFacetDemiModalFieldCancel" class="pull-right"><i class="fa fa-times"></i></a>
     <div style="float: left; margin-right: 10px;">
-      <input id="addFacetInput" type="text" data-bind="clearable: $root.collection.template.fieldsModalFilter, valueUpdate:'afterkeydown'" placeholder="${_('Filter fields')}" class="input" style="float: left" /><br/>
+      <!-- ko component: {
+        name: 'inline-autocomplete',
+        params: {
+          querySpec: $root.collection.template.fieldsModalFilter,
+          facets: ['type'],
+          knownFacetValues: $root.collection.engine() === 'solr' ? SOLR_ASSIST_KNOWN_FACET_VALUES : SQL_ASSIST_KNOWN_FACET_VALUES,
+          autocompleteFromEntries: $root.collection.template.autocompleteFromFieldsModalFilter
+        }
+      } --><!-- /ko -->
+      <!--<input id="addFacetInput" type="text" data-bind="clearable: $root.collection.template.fieldsModalFilter, valueUpdate:'afterkeydown'" placeholder="${_('Filter fields')}" class="input" style="float: left" /><br/>-->
     </div>
     <div>
       <ul data-bind="foreach: $root.collection.template.filteredModalFields().sort(function (l, r) { return l.name() > r.name() ? 1 : -1 }), visible: $root.collection.template.filteredModalFields().length > 0"
           class="unstyled inline fields-chooser" style="height: 100px; overflow-y: auto">
-        <li data-bind="click: addFacetDemiModalFieldPreview">
-          <span class="badge badge-info"><span data-bind="text: name(), attr: {'title': type()}"></span>
+        <li data-bind="visibleOnHover: { 'selector': '.entity-field-picker' }">
+          <a class="entity-field-picker inactive-action" href="javascript:void(0);" data-bind="click: $root.collection.showContextPopover" style="opacity: 0">
+            <i class="fa fa-fw fa-info" title="${_('Show Details')}"/>
+          </a>
+          <span class="badge badge-info"><span data-bind="text: name(), attr: {'title': type()}, click: addFacetDemiModalFieldPreview"></span>
           </span>
         </li>
       </ul>
@@ -4507,17 +4519,6 @@ $(document).ready(function () {
             addFacetDemiModalFieldPreview(searchViewModel.collection.template.availableWidgetFields()[0]);
           }
           else {
-            $('#addFacetInput').typeahead({
-              'source': searchViewModel.collection.template.availableWidgetFieldsNames(),
-              'updater': function (item) {
-                addFacetDemiModalFieldPreview({
-                  'name': function () {
-                    return item
-                  }
-                });
-                return item;
-              }
-            });
             $("#addFacetDemiModal").modal("show");
             $("#addFacetDemiModal input[type='text']").focus();
           }
@@ -4554,17 +4555,6 @@ $(document).ready(function () {
           addFacetDemiModalFieldPreview(searchViewModel.collection.template.availableWidgetFields()[0]);
         }
         else {
-          $('#addFacetInput').typeahead({
-            'source': searchViewModel.collection.template.availableWidgetFieldsNames(),
-            'updater': function (item) {
-              addFacetDemiModalFieldPreview({
-                'name': function () {
-                  return item
-                }
-              });
-              return item;
-            }
-          });
           $("#addFacetDemiModal").modal("show");
           $("#addFacetDemiModal input[type='text']").focus();
         }

+ 1 - 1
desktop/libs/notebook/src/notebook/dashboard_api.py

@@ -202,7 +202,7 @@ class SQLDashboardApi(DashboardApi):
     # Ideally from left assist at some point instead
     databases = get_api(MockRequest(self.user), snippet).autocomplete(snippet)['databases']
     database = databases and 'default' not in databases and databases[0] or 'default'
-    return [table['name'] for table in get_api(MockRequest(self.user), snippet).autocomplete(snippet, database=database)['tables_meta']]
+    return [database + '.' + table['name'] for table in get_api(MockRequest(self.user), snippet).autocomplete(snippet, database=database)['tables_meta']]
 
 
   # This method currently behaves more like a static method

Неке датотеке нису приказане због велике количине промена