ソースを参照

Merge pull request #2166 from jamesmikesell/develop

refactor(filter-control extension): adding all unique values to select control and performance Improvements
wenzhixin 9 年 前
コミット
8adae34c3c
1 ファイル変更45 行追加26 行削除
  1. 45 26
      src/extensions/filter-control/bootstrap-table-filter-control.js

+ 45 - 26
src/extensions/filter-control/bootstrap-table-filter-control.js

@@ -14,12 +14,14 @@
     var addOptionToSelectControl = function (selectControl, value, text) {
         value = $.trim(value);
         selectControl = $(selectControl.get(selectControl.length - 1));
-        if (existOptionInSelectControl(selectControl, value)) {
+        if (!existOptionInSelectControl(selectControl, value)) {
             selectControl.append($("<option></option>")
                 .attr("value", value)
                 .text($('<div />').html(text).text()));
+        }
+    };
 
-            // Sort it. Not overly efficient to do this here
+    var sortSelectControl = function (selectControl) {
             var $opts = selectControl.find('option:gt(0)');
             $opts.sort(function (a, b) {
                 a = $(a).text().toLowerCase();
@@ -34,20 +36,19 @@
 
             selectControl.find('option:gt(0)').remove();
             selectControl.append($opts);
-        }
     };
 
     var existOptionInSelectControl = function (selectControl, value) {
         var options = selectControl.get(selectControl.length - 1).options;
         for (var i = 0; i < options.length; i++) {
-            if (!value || options[i].value === value.toString()) {
+            if (options[i].value === value.toString()) {
                 //The value is not valid to add
-                return false;
+                return true;
             }
         }
 
         //If we get here, the value is valid to add
-        return true;
+        return false;
     };
 
     var fixHeaderCSS = function (that) {
@@ -179,26 +180,31 @@
             (that.options.sidePagination === 'server' ? that.pageTo : that.options.totalRows) :
             that.pageTo;
 
-        for (var i = 0; i < z; i++) {
-            $.each(that.header.fields, function (j, field) {
-                var column = that.columns[$.fn.bootstrapTable.utils.getFieldIndex(that.columns, field)],
-                    selectControl = $('.' + escapeID(column.field));
-
-                if (isColumnSearchableViaSelect(column) && isFilterDataNotGiven(column) && hasSelectControlElement(selectControl)) {
-                    if (selectControl.get(selectControl.length - 1).options.length === 0) {
-                        //Added the default option
-                        addOptionToSelectControl(selectControl, '', '');
-                    }
+        $.each(that.header.fields, function (j, field) {
+            var column = that.columns[$.fn.bootstrapTable.utils.getFieldIndex(that.columns, field)],
+                selectControl = $('.' + escapeID(column.field));
 
+            if (isColumnSearchableViaSelect(column) && isFilterDataNotGiven(column) && hasSelectControlElement(selectControl)) {
+                if (selectControl.get(selectControl.length - 1).options.length === 0) {
+                    //Added the default option
+                    addOptionToSelectControl(selectControl, '', '');
+                }
+                
+                var uniqueValues = {};
+                for (var i = 0; i < z; i++) {
                     //Added a new value
                     var fieldValue = data[i][field],
                         formattedValue = $.fn.bootstrapTable.utils.calculateObjectValue(that.header, that.header.formatters[j], [fieldValue, data[i], i], fieldValue);
 
-                    addOptionToSelectControl(selectControl, fieldValue, formattedValue);
+                    uniqueValues[formattedValue] = fieldValue;
                 }
-            });
-        }
-
+                for (var key in uniqueValues) {
+                    addOptionToSelectControl(selectControl, uniqueValues[key], key);
+                }
+                
+                sortSelectControl(selectControl);
+            }
+        });
     };
 
     var escapeID = function( id ) {
@@ -261,9 +267,10 @@
                             url: filterDataSource,
                             dataType: 'json',
                             success: function (data) {
-                                $.each(data, function (key, value) {
-                                    addOptionToSelectControl(selectControl, key, value);
-                                });
+                                for (var key in data) {
+                                    addOptionToSelectControl(selectControl, key, data[key]);
+                                }
+                                sortSelectControl(selectControl);
                             }
                         });
                         break;
@@ -272,12 +279,14 @@
                         for (key in variableValues) {
                             addOptionToSelectControl(selectControl, key, variableValues[key]);
                         }
+                        sortSelectControl(selectControl);
                         break;
                     case 'jso':
                         variableValues = JSON.parse(filterDataSource);
                         for (key in variableValues) {
                             addOptionToSelectControl(selectControl, key, variableValues[key]);
                         }
+                        sortSelectControl(selectControl);
                         break;
                 }
             }
@@ -356,15 +365,17 @@
                 for (var key in variableValues) {
                     addOptionToSelectControl(selectControl, key, variableValues[key]);
                 }
+                sortSelectControl(selectControl);
             },
             'url': function (filterDataSource, selectControl) {
                 $.ajax({
                     url: filterDataSource,
                     dataType: 'json',
                     success: function (data) {
-                        $.each(data, function (key, value) {
-                            addOptionToSelectControl(selectControl, key, value);
-                        });
+                        for (var key in data) {
+                            addOptionToSelectControl(selectControl, key, data[key]);
+                        }
+                        sortSelectControl(selectControl);
                     }
                 });
             },
@@ -373,6 +384,7 @@
                 for (var key in variableValues) {
                     addOptionToSelectControl(selectControl, key, variableValues[key]);
                 }
+                sortSelectControl(selectControl);
             }
         };
 
@@ -580,6 +592,13 @@
             delete this.filterColumnsPartial[$field];
         }
 
+        // if the searchText is the same as the previously selected column value,
+        // bootstrapTable will not try searching again (even though the selected column
+        // may be different from the previous search).  As a work around
+        // we're manually appending some text to bootrap's searchText field
+        // to guarantee that it will perform a search again when we call this.onSearch(event)
+        this.searchText += "randomText";
+
         this.options.pageNumber = 1;
         this.onSearch(event);
         this.updatePagination();