Browse Source

Adding all unique values to select control and Performance Improvements

Using all table values instead of just displayed values when paging is
done locally.

Moved sorting to happen after all values were added to the select
control
James Mikesell 10 years ago
parent
commit
fc8ed1ebb7
1 changed files with 45 additions and 38 deletions
  1. 45 38
      src/extensions/filter-control/bootstrap-table-filter-control.js

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

@@ -13,27 +13,28 @@
     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 $opts = selectControl.find('option:gt(0)');
-            $opts.sort(function (a, b) {
-                a = $(a).text().toLowerCase();
-                b = $(b).text().toLowerCase();
-                if ($.isNumeric(a) && $.isNumeric(b)) {
-                    // Convert numerical values from string to float.
-                    a = parseFloat(a);
-                    b = parseFloat(b);
-                }
-                return a > b ? 1 : a < b ? -1 : 0;
-            });
+    var sortSelectControl = function (selectControl) {
+        var $opts = selectControl.find('option:gt(0)');
+        $opts.sort(function (a, b) {
+            a = $(a).text().toLowerCase();
+            b = $(b).text().toLowerCase();
+            if ($.isNumeric(a) && $.isNumeric(b)) {
+                // Convert numerical values from string to float.
+                a = parseFloat(a);
+                b = parseFloat(b);
+            }
+            return a > b ? 1 : a < b ? -1 : 0;
+        });
 
-            selectControl.find('option:gt(0)').remove();
-            selectControl.append($opts);
-        }
+        selectControl.find('option:gt(0)').remove();
+        selectControl.append($opts);
     };
 
     var existOptionInSelectControl = function (selectControl, value) {
@@ -41,12 +42,12 @@
         for (var i = 0; i < options.length; i++) {
             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) {
@@ -140,30 +141,34 @@
                 return selectControl && selectControl.length > 0;
             };
 
-        for (var i = bootstrapTable.pageFrom - 1; i < bootstrapTable.pageTo; i++) {
-
-            $.each(bootstrapTable.header.fields, function (j, field) {
-                var column = bootstrapTable.columns[$.fn.bootstrapTable.utils.getFieldIndex(bootstrapTable.columns, field)],
-                    selectControl = $('.' + column.field);
-
+        $.each(bootstrapTable.header.fields, function (j, field) {
+            var column = bootstrapTable.columns[$.fn.bootstrapTable.utils.getFieldIndex(bootstrapTable.columns, field)],
+            selectControl = $('.' + column.field);
 
-                if (isColumnSearchableViaSelect(column) && isFilterDataNotGiven(column) && hasSelectControlElement(selectControl)) {
-                    if (selectControl.get(selectControl.length - 1).options.length === 0) {
-                        //Added the default option
-                        addOptionToSelectControl(selectControl, '', '');
-                    }
+            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 < data.length; i++) {
                     //Added a new value
                     var fieldValue = data[i][field],
-                        formattedValue = $.fn.bootstrapTable.utils.calculateObjectValue(bootstrapTable.header, bootstrapTable.header.formatters[j], [fieldValue, data[i], i], fieldValue);
+                    formattedValue = $.fn.bootstrapTable.utils.calculateObjectValue(bootstrapTable.header, bootstrapTable.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 createControls = function (that, header) {
         var addedFilterControl = false,
             isVisible,
@@ -210,9 +215,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;
@@ -221,6 +227,7 @@
                         for (var key in variableValues) {
                             addOptionToSelectControl(selectControl, key, variableValues[key]);
                         }
+                        sortSelectControl(selectControl);
                         break;
                 }
             }
@@ -524,4 +531,4 @@
             }, that.options.searchTimeOut);
         }
     };
-}(jQuery);
+}(jQuery);