浏览代码

Merge pull request #4314 from wenzhixin/feature/4296

Adding filterOrderBy column option
文翼 6 年之前
父节点
当前提交
3dc1ac54f9

+ 9 - 0
site/docs/extensions/filter-control.md

@@ -137,6 +137,15 @@ Dependence if you use the datepicker option: [bootstrap-datepicker](https://gith
 
 - **Default:** `''`
 
+### filterOrderBy
+- **type:** `String`
+
+- **Detail:**
+
+   Set this to order the options in a select control whether ascending or descending.
+
+- **Default:** `'asc'`
+
 ### Icons
 * clear: 'glyphicon-trash icon-clear'
 

+ 3 - 43
src/bootstrap-table.js

@@ -400,8 +400,8 @@ class BootstrapTable {
           if (this.header.sortNames[index]) {
             name = this.header.sortNames[index]
           }
-          let aa = Utils.getItemField(a, name, this.options.escape)
-          let bb = Utils.getItemField(b, name, this.options.escape)
+          const aa = Utils.getItemField(a, name, this.options.escape)
+          const bb = Utils.getItemField(b, name, this.options.escape)
           const value = Utils.calculateObjectValue(this.header, this.header.sorters[index], [aa, bb, a, b])
 
           if (value !== undefined) {
@@ -411,47 +411,7 @@ class BootstrapTable {
             return order * value
           }
 
-          // Fix #161: undefined or null string sort bug.
-          if (aa === undefined || aa === null) {
-            aa = ''
-          }
-          if (bb === undefined || bb === null) {
-            bb = ''
-          }
-
-          if (this.options.sortStable && aa === bb) {
-            aa = a._position
-            bb = b._position
-          }
-
-          // IF both values are numeric, do a numeric comparison
-          if (Utils.isNumeric(aa) && Utils.isNumeric(bb)) {
-            // Convert numerical values form string to float.
-            aa = parseFloat(aa)
-            bb = parseFloat(bb)
-            if (aa < bb) {
-              return order * -1
-            }
-            if (aa > bb) {
-              return order
-            }
-            return 0
-          }
-
-          if (aa === bb) {
-            return 0
-          }
-
-          // If value is not a string, convert to string
-          if (typeof aa !== 'string') {
-            aa = aa.toString()
-          }
-
-          if (aa.localeCompare(bb) === -1) {
-            return order * -1
-          }
-
-          return order
+          return Utils.sort(aa, bb, order, this.options.sortStable)
         })
       }
 

+ 14 - 20
src/extensions/filter-control/bootstrap-table-filter-control.js

@@ -46,19 +46,12 @@ const UtilsFilterControl = {
       )
     }
   },
-  sortSelectControl (selectControl) {
+  sortSelectControl (selectControl, orderBy) {
     const $selectControl = $(selectControl.get(selectControl.length - 1))
     const $opts = $selectControl.find('option:gt(0)')
 
     $opts.sort((a, b) => {
-      let aa = $(a).text().toLowerCase()
-      let bb = $(b).text().toLowerCase()
-      if ($.isNumeric(a) && $.isNumeric(b)) {
-        // Convert numerical values from string to float.
-        aa = parseFloat(aa)
-        bb = parseFloat(bb)
-      }
-      return aa > bb ? 1 : aa < bb ? -1 : 0
+      return Utils.sort(a.textContent, b.textContent, orderBy === 'desc' ? -1 : 1)
     })
 
     $selectControl.find('option:gt(0)').remove()
@@ -244,7 +237,7 @@ const UtilsFilterControl = {
           UtilsFilterControl.addOptionToSelectControl(selectControl, uniqueValues[key], key)
         }
 
-        UtilsFilterControl.sortSelectControl(selectControl)
+        UtilsFilterControl.sortSelectControl(selectControl, column.filterOrderBy)
 
         if (that.options.hideUnusedSelectOptions) {
           UtilsFilterControl.hideUnusedSelectOptions(selectControl, uniqueValues)
@@ -350,7 +343,7 @@ const UtilsFilterControl = {
                 for (const key in data) {
                   UtilsFilterControl.addOptionToSelectControl(selectControl, key, data[key])
                 }
-                UtilsFilterControl.sortSelectControl(selectControl)
+                UtilsFilterControl.sortSelectControl(selectControl, column.filterOrderBy)
               }
             })
             break
@@ -360,7 +353,7 @@ const UtilsFilterControl = {
             for (key in variableValues) {
               UtilsFilterControl.addOptionToSelectControl(selectControl, key, variableValues[key])
             }
-            UtilsFilterControl.sortSelectControl(selectControl)
+            UtilsFilterControl.sortSelectControl(selectControl, column.filterOrderBy)
             break
           case 'jso':
             variableValues = JSON.parse(filterDataSource)
@@ -368,7 +361,7 @@ const UtilsFilterControl = {
             for (key in variableValues) {
               UtilsFilterControl.addOptionToSelectControl(selectControl, key, variableValues[key])
             }
-            UtilsFilterControl.sortSelectControl(selectControl)
+            UtilsFilterControl.sortSelectControl(selectControl, column.filterOrderBy)
             break
         }
       }
@@ -474,15 +467,15 @@ const UtilsFilterControl = {
   }
 }
 const filterDataMethods = {
-  var (filterDataSource, selectControl) {
+  var (filterDataSource, selectControl, filterOrderBy) {
     const variableValues = window[filterDataSource]
     // eslint-disable-next-line guard-for-in
     for (const key in variableValues) {
       UtilsFilterControl.addOptionToSelectControl(selectControl, key, variableValues[key])
     }
-    UtilsFilterControl.sortSelectControl(selectControl)
+    UtilsFilterControl.sortSelectControl(selectControl, filterOrderBy)
   },
-  url (filterDataSource, selectControl) {
+  url (filterDataSource, selectControl, filterOrderBy) {
     $.ajax({
       url: filterDataSource,
       dataType: 'json',
@@ -491,17 +484,17 @@ const filterDataMethods = {
         for (const key in data) {
           UtilsFilterControl.addOptionToSelectControl(selectControl, key, data[key])
         }
-        UtilsFilterControl.sortSelectControl(selectControl)
+        UtilsFilterControl.sortSelectControl(selectControl, filterOrderBy)
       }
     })
   },
-  json (filterDataSource, selectControl) {
+  json (filterDataSource, selectControl, filterOrderBy) {
     const variableValues = JSON.parse(filterDataSource)
     // eslint-disable-next-line guard-for-in
     for (const key in variableValues) {
       UtilsFilterControl.addOptionToSelectControl(selectControl, key, variableValues[key])
     }
-    UtilsFilterControl.sortSelectControl(selectControl)
+    UtilsFilterControl.sortSelectControl(selectControl, filterOrderBy)
   }
 }
 
@@ -554,7 +547,8 @@ $.extend($.fn.bootstrapTable.columnDefaults, {
   filterDatepickerOptions: undefined,
   filterStrictSearch: false,
   filterStartsWithSearch: false,
-  filterControlPlaceholder: ''
+  filterControlPlaceholder: '',
+  filterOrderBy: 'asc' // asc || desc
 })
 
 $.extend($.fn.bootstrapTable.Constructor.EVENTS, {

+ 43 - 0
src/utils/index.js

@@ -245,5 +245,48 @@ export default {
       data.push(row)
     })
     return data
+  },
+
+  sort (a, b, order, sortStable) {
+    if (a === undefined || a === null) {
+      a = ''
+    }
+    if (b === undefined || b === null) {
+      b = ''
+    }
+
+    if (sortStable && a === b) {
+      a = a._position
+      b = b._position
+    }
+
+    // If both values are numeric, do a numeric comparison
+    if (this.isNumeric(a) && this.isNumeric(b)) {
+      // Convert numerical values form string to float.
+      a = parseFloat(a)
+      b = parseFloat(b)
+      if (a < b) {
+        return order * -1
+      }
+      if (a > b) {
+        return order
+      }
+      return 0
+    }
+
+    if (a === b) {
+      return 0
+    }
+
+    // If value is not a string, convert to string
+    if (typeof a !== 'string') {
+      a = a.toString()
+    }
+
+    if (a.localeCompare(b) === -1) {
+      return order * -1
+    }
+
+    return order
   }
 }