ソースを参照

Merge pull request #2050 from djhvscf/develop

refactor(filter-control extension): refactor the filterDataType method
wenzhixin 9 年 前
コミット
6faa389670

+ 51 - 3
src/bootstrap-table.js

@@ -241,6 +241,50 @@
         return !!(navigator.userAgent.indexOf("MSIE ") > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./));
     };
 
+    var objectKeys = function () {
+        // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
+        if (!Object.keys) {
+            Object.keys = (function() {
+                'use strict';
+                var hasOwnProperty = Object.prototype.hasOwnProperty,
+                    hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),
+                    dontEnums = [
+                        'toString',
+                        'toLocaleString',
+                        'valueOf',
+                        'hasOwnProperty',
+                        'isPrototypeOf',
+                        'propertyIsEnumerable',
+                        'constructor'
+                    ],
+                    dontEnumsLength = dontEnums.length;
+
+                return function(obj) {
+                    if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {
+                        throw new TypeError('Object.keys called on non-object');
+                    }
+
+                    var result = [], prop, i;
+
+                    for (prop in obj) {
+                        if (hasOwnProperty.call(obj, prop)) {
+                            result.push(prop);
+                        }
+                    }
+
+                    if (hasDontEnumBug) {
+                        for (i = 0; i < dontEnumsLength; i++) {
+                            if (hasOwnProperty.call(obj, dontEnums[i])) {
+                                result.push(dontEnums[i]);
+                            }
+                        }
+                    }
+                    return result;
+                };
+            }());
+        }
+    };
+
     // BOOTSTRAP TABLE CLASS DEFINITION
     // ======================
 
@@ -809,8 +853,11 @@
         });
         this.$container.off('click', '.th-inner').on('click', '.th-inner', function (event) {
             var target = $(this);
-            if (target.closest('.bootstrap-table')[0] !== that.$container[0])
-                return false;
+
+            if (that.options.detailView) {
+                if (target.closest('.bootstrap-table')[0] !== that.$container[0])
+                    return false;
+            }
 
             if (that.options.sortable && target.parent().data().sortable) {
                 that.onSort(event);
@@ -2912,7 +2959,8 @@
         getFieldIndex: getFieldIndex,
         compareObjects: compareObjects,
         calculateObjectValue: calculateObjectValue,
-        getItemField: getItemField
+        getItemField: getItemField,
+        objectKeys: objectKeys
     };
 
     // BOOTSTRAP TABLE INIT

+ 57 - 25
src/extensions/filter-control/bootstrap-table-filter-control.js

@@ -1,14 +1,15 @@
 /**
  * @author: Dennis Hernández
  * @webSite: http://djhvscf.github.io/Blog
- * @version: v1.0.0
+ * @version: v2.0.0
  */
 
 !function ($) {
 
     'use strict';
 
-    var sprintf = $.fn.bootstrapTable.utils.sprintf;
+    var sprintf = $.fn.bootstrapTable.utils.sprintf,
+        objectKeys = $.fn.bootstrapTable.utils.objectKeys;
 
     var addOptionToSelectControl = function (selectControl, value, text) {
         value = $.trim(value);
@@ -198,30 +199,18 @@
                     return false;
                 }
             });
+
             if (column.filterData !== undefined && column.filterData.toLowerCase() !== 'column') {
-                var filterDataType = column.filterData.substring(0, 3);
-                var filterDataSource = column.filterData.substring(4, column.filterData.length);
-                var selectControl = $('.' + column.field);
-                addOptionToSelectControl(selectControl, '', '');
-
-                switch (filterDataType) {
-                    case 'url':
-                        $.ajax({
-                            url: filterDataSource,
-                            dataType: 'json',
-                            success: function (data) {
-                                $.each(data, function (key, value) {
-                                    addOptionToSelectControl(selectControl, key, value);
-                                });
-                            }
-                        });
-                        break;
-                    case 'var':
-                        var variableValues = window[filterDataSource];
-                        for (var key in variableValues) {
-                            addOptionToSelectControl(selectControl, key, variableValues[key]);
-                        }
-                        break;
+                var filterDataType = getFilterDataMethod(filterDataMethods, column.filterData.substring(0, column.filterData.indexOf(':')));
+
+                if (filterDataType !== null) {
+                    var filterDataSource = column.filterData.substring(column.filterData.indexOf(':') + 1, column.filterData.length),
+                        selectControl = $('.' + column.field);
+
+                    addOptionToSelectControl(selectControl, '', '');
+                    filterDataType(filterDataSource, selectControl);
+                } else {
+                    throw new SyntaxError('Error. You should use any of these allowed filter data methods: var, json, url.' + ' Use like this: var: {key: "value"}');
                 }
             }
         });
@@ -292,6 +281,43 @@
         }
     };
 
+    var filterDataMethods =
+        {
+            'var': function (filterDataSource, selectControl) {
+                var variableValues = window[filterDataSource];
+                for (var key in variableValues) {
+                    addOptionToSelectControl(selectControl, key, variableValues[key]);
+                }
+            },
+            'url': function (filterDataSource, selectControl) {
+                $.ajax({
+                    url: filterDataSource,
+                    dataType: 'json',
+                    success: function (data) {
+                        $.each(data, function (key, value) {
+                            addOptionToSelectControl(selectControl, key, value);
+                        });
+                    }
+                });
+            },
+            'json':function (filterDataSource, selectControl) {
+                var variableValues = JSON.parse(filterDataSource);
+                for (var key in variableValues) {
+                    addOptionToSelectControl(selectControl, key, variableValues[key]);
+                }
+            }
+        };
+
+    var getFilterDataMethod = function (objFilterDataMethod, searchTerm) {
+        var keys = Object.keys(objFilterDataMethod);
+        for (var i = 0; i < keys.length; i++) {
+            if (keys[i] === searchTerm) {
+                return objFilterDataMethod[searchTerm];
+            }
+        }
+        return null;
+    };
+
     $.extend($.fn.bootstrapTable.defaults, {
         filterControl: false,
         onColumnSearch: function (field, text) {
@@ -341,6 +367,12 @@
         //Make sure that the filterControl option is set
         if (this.options.filterControl) {
             var that = this;
+
+            // Compatibility: IE < 9 and old browsers
+            if (!Object.keys) {
+                objectKeys();
+            }
+
             //Make sure that the internal variables are set correctly
             this.options.valuesFilterControl = [];
 

+ 1 - 1
src/extensions/group-by/bootstrap-table-group-by.js

@@ -167,7 +167,7 @@
 
                 // Compatibility: IE < 9 and old browsers
                 if (!Object.keys) {
-                    setObjectKeys();
+                    $.fn.bootstrapTable.utils.objectKeys();
                 }
 
                 //Make sure that the internal variables are set correctly