فهرست منبع

[assist] Add table and view facets to search

Johan Ahlen 10 سال پیش
والد
کامیت
ea52cea764

+ 4 - 0
desktop/core/src/desktop/static/desktop/css/hue3.css

@@ -1938,6 +1938,10 @@ form.form-inline .modal-header .close {
   margin-top: 30px;
 }
 
+.margin-left-5 {
+  margin-left: 5px;
+}
+
 .margin-left-10 {
   margin-left: 10px;
 }

+ 27 - 16
desktop/core/src/desktop/static/desktop/js/assist/assistEntry.js

@@ -26,13 +26,18 @@
    * @param {Object} definition
    * @param {string} definition.type
    * @param {string} definition.name
-   * @param {boolean} definition.isColumn
-   * @param {boolean} definition.isTable
-   * @param {boolean} definition.isMapValue
-   * @param {boolean} definition.isArray
+   * @param {boolean} [definition.isColumn]
+   * @param {boolean} [definition.isTable]
+   * @param {boolean} [definition.isView]
+   * @param {boolean} [definition.isDatabase]
+   * @param {boolean} [definition.isMapValue]
+   * @param {boolean} [definition.isArray]
    * @param {AssistEntry} parent
    * @param {AssistSource} assistSource
-   * @param {function} [filter] - ko.observable
+   * @param {Object} filter
+   * @param {function} filter.query (observable)
+   * @param {function} filter.showViews (observable)
+   * @param {function} filter.showTables (observable)
    * @param {Object} i18n
    * @param {string} i18n.errorLoadingTablePreview
    * @param {Object} navigationSettings
@@ -70,12 +75,15 @@
     });
 
     self.filteredEntries = ko.computed(function () {
-      if (self.filter == null || self.filter().length === 0) {
+      if (self.filter == null || (self.filter.showTables() && self.filter.showViews() && self.filter.query().length === 0)) {
         return self.entries();
       }
       var result = [];
       $.each(self.entries(), function (index, entry) {
-        if (entry.definition.name.toLowerCase().indexOf(self.filter()) > -1) {
+        if ((entry.definition.isTable && !self.filter.showTables()) || (entry.definition.isView && !self.filter.showViews()) ) {
+          return;
+        }
+        if (entry.definition.name.toLowerCase().indexOf(self.filter.query()) > -1) {
           result.push(entry);
         }
       });
@@ -86,7 +94,7 @@
     self.columnName = null;
     self.type = null;
     self.databaseName = self.getHierarchy()[0];
-    if (self.definition.isTable) {
+    if (self.definition.isTable || self.definition.isView) {
       self.tableName = self.definition.name;
       self.columnName = null;
       self.type = self.definition.type;
@@ -96,7 +104,7 @@
     }
 
     self.editorText = ko.computed(function () {
-      if (self.definition.isTable) {
+      if (self.definition.isTable || self.definition.isView) {
         return self.definition.name;
       }
       if (self.definition.isColumn) {
@@ -105,7 +113,7 @@
       var parts = [];
       var entry = self;
       while (entry != null) {
-        if (entry.definition.isTable) {
+        if (entry.definition.isTable || self.definition.isView) {
           break;
         }
         if (entry.definition.isArray || entry.definition.isMapValue) {
@@ -146,7 +154,8 @@
             displayName: table.name,
             title: table.name + (table.comment ? ' - ' + table.comment : ''),
             type: table.type,
-            isTable: true
+            isTable: /table/i.test(table.type),
+            isView: /view/i.test(table.type)
           });
         }));
       } else if (typeof data.extended_columns !== "undefined" && data.extended_columns !== null) {
@@ -240,10 +249,12 @@
    * @param {Object} definition
    * @param {string} definition.type
    * @param {string} definition.name
-   * @param {boolean} definition.isColumn
-   * @param {boolean} definition.isTable
-   * @param {boolean} definition.isMapValue
-   * @param {boolean} definition.isArray
+   * @param {boolean} [definition.isDatabase]
+   * @param {boolean} [definition.isColumn]
+   * @param {boolean} [definition.isTable]
+   * @param {boolean} [definition.isView]
+   * @param {boolean} [definition.isMapValue]
+   * @param {boolean} [definition.isArray]
    */
   AssistEntry.prototype.createEntry = function (definition) {
     var self = this;
@@ -274,7 +285,7 @@
 
   AssistEntry.prototype.openItem = function () {
     var self = this;
-    if (self.definition.isTable) {
+    if (self.definition.isTable || self.definition.isView) {
       huePubSub.publish("assist.table.selected", {
         database: self.databaseName,
         name: self.definition.name

+ 6 - 2
desktop/core/src/desktop/static/desktop/js/assist/assistSource.js

@@ -43,10 +43,14 @@
     self.hasErrors = ko.observable(false);
     self.simpleStyles = ko.observable(false);
 
-    self.filter = ko.observable("").extend({ rateLimit: 150 });
+    self.filter = {
+      query: ko.observable("").extend({ rateLimit: 150 }),
+      showTables: ko.observable(true),
+      showViews: ko.observable(true)
+    };
 
     self.filterActive = ko.computed(function () {
-      return self.filter().length !== 0;
+      return self.filter.query().length !== 0 || !self.filter.showViews() || !self.filter.showTables();
     });
 
     var storageSearchVisible = $.totalStorage(self.type + ".assist.searchVisible");

+ 12 - 13
desktop/core/src/desktop/templates/assist.mako

@@ -137,8 +137,8 @@ from desktop.views import _ko
   </script>
 
   <script type="text/html" id="assist-entry-actions">
-    <div class="assist-actions" data-bind="css: { 'table-actions' : definition.isTable, 'column-actions': definition.isColumn, 'database-actions' : definition.isDatabase } " style="opacity: 0">
-      <a class="inactive-action" href="javascript:void(0)" data-bind="visible: definition.isTable && navigationSettings.showPreview, click: showPreview"><i class="fa fa-list" title="${_('Preview Sample data')}"></i></a>
+    <div class="assist-actions" data-bind="css: { 'table-actions' : definition.isTable || definition.isView, 'column-actions': definition.isColumn, 'database-actions' : definition.isDatabase } " style="opacity: 0">
+      <a class="inactive-action" href="javascript:void(0)" data-bind="visible: (definition.isTable || definition.isView) && navigationSettings.showPreview, click: showPreview"><i class="fa fa-list" title="${_('Preview Sample data')}"></i></a>
       <span data-bind="visible: navigationSettings.showStats, component: { name: 'table-stats', params: {
           statsVisible: statsVisible,
           sourceType: assistSource.type,
@@ -160,16 +160,14 @@ from desktop.views import _ko
     </ul>
     <!-- /ko -->
     <ul data-bind="foreach: filteredEntries, css: { 'assist-tables': definition.isDatabase }, event: { 'scroll': assistSource.repositionActions }">
-      <li data-bind="visibleOnHover: { override: statsVisible, selector: definition.isTable ? '.table-actions' : '.column-actions' }, css: { 'assist-table': definition.isTable, 'assist-column': definition.isColumn }">
-        <!-- ko template: { if: definition.isTable || definition.isColumn, name: 'assist-entry-actions' } --><!-- /ko -->
-        <a class="assist-entry" data-bind="multiClick: { click: toggleOpen, dblClick: dblClick }, attr: {'title': definition.title }, css: { 'assist-field-link': ! definition.isTable, 'assist-table-link': definition.isTable }" href="javascript:void(0)">
+      <li data-bind="visibleOnHover: { override: statsVisible, selector: (definition.isTable || definition.isView) ? '.table-actions' : '.column-actions' }, css: { 'assist-table': (definition.isTable || definition.isView), 'assist-column': definition.isColumn }">
+        <!-- ko template: { if: definition.isTable || definition.isView || definition.isColumn, name: 'assist-entry-actions' } --><!-- /ko -->
+        <a class="assist-entry" data-bind="multiClick: { click: toggleOpen, dblClick: dblClick }, attr: {'title': definition.title }, css: { 'assist-field-link': ! (definition.isTable || definition.isView), 'assist-table-link': (definition.isTable || definition.isView) }" href="javascript:void(0)">
           <!-- ko if: definition.isTable -->
-            <!-- ko if: definition.type == 'Table' -->
-              <i class="fa fa-fw fa-table muted"></i>
-            <!-- /ko -->
-            <!-- ko if: definition.type == 'View' -->
-              <i class="fa fa-fw fa-eye muted"></i>
-            <!-- /ko -->
+            <i class="fa fa-fw fa-table muted"></i>
+          <!-- /ko -->
+          <!-- ko if: definition.isView -->
+            <i class="fa fa-fw fa-eye muted"></i>
           <!-- /ko -->
           <span draggable="true" data-bind="text: definition.displayName, draggableText: { text: editorText }"></span>
         </a>
@@ -180,7 +178,7 @@ from desktop.views import _ko
         <!-- ko template: { if: open(), name: 'assist-entries'  } --><!-- /ko -->
       </li>
     </ul>
-    <!-- ko template: { if: ! hasEntries() && ! loading() && definition.isTable, name: 'assist-no-table-entries' } --><!-- /ko -->
+    <!-- ko template: { if: ! hasEntries() && ! loading() && (definition.isTable || definition.isView), name: 'assist-no-table-entries' } --><!-- /ko -->
     <!-- ko template: { if: ! hasEntries() && ! loading() && definition.isDatabase, name: 'assist-no-database-entries' } --><!-- /ko -->
   </script>
 
@@ -256,7 +254,8 @@ from desktop.views import _ko
       </li>
 
       <li data-bind="slideVisible: hasEntries() && isSearchVisible() && !$parent.loading() && !$parent.hasErrors()">
-        <div><input id="searchInput" type="text" placeholder="${ _('Table name...') }" style="width:90%;" data-bind="hasFocus: editingSearch, clearable: filter, value: filter, valueUpdate: 'afterkeydown'"/></div>
+        <div><label class="checkbox inline-block margin-left-5"><input type="checkbox" data-bind="checked: filter.showTables" />Tables</label><label class="checkbox inline-block margin-left-10"><input type="checkbox" data-bind="checked: filter.showViews" />Views</label></div>
+        <div><input id="searchInput" type="text" placeholder="${ _('Table name...') }" style="width:90%;" data-bind="hasFocus: editingSearch, clearable: filter.query, value: filter.query, valueUpdate: 'afterkeydown'"/></div>
       </li>
 
       <div class="table-container">