I want to have range filter in columns (not in templates filters which is ther in jqgrid) . Can anyone help on this

ε祈祈猫儿з 提交于 2020-01-05 04:12:08

问题


as u see in screenshot ,in existing dropdown I want to add an option of inbetween ,where either user can give two values for range selection in textbox or it can be a editabe dropdown.

jQGRID DATA - IF user enter 34:09:0;90:08:8 he should get all values which are >=34:09:0 and <90:08:8 in duration filter

$(function() {
  "use strict";
  var mydata = [{
    id: "1",
    invdate: "720:0:0",
    name: "test",
    note: "note",
    amount: "200.00",
    tax: "10.00",
    total: "210.00"
  }, {
    id: "2",
    invdate: "34:09:0",
    name: "test2",
    note: "note2",
    amount: "300.00",
    tax: "20.00",
    total: "320.00"
  }, {
    id: "3",
    invdate: "0:0:0",
    name: "test3",
    note: "note3",
    amount: "400.00",
    tax: "30.00",
    total: "430.00"
  }, {
    id: "4",
    invdate: "90:08:8",
    name: "test4",
    note: "note4",
    amount: "200.00",
    tax: "10.00",
    total: "210.00"
  }, {
    id: "5",
    invdate: "09:34:2",
    name: "test5",
    note: "note5",
    amount: "300.00",
    tax: "20.00",
    total: "320.00"
  }, {
    id: "6",
    invdate: "80:12:02",
    name: "test6",
    note: "note6",
    amount: "400.00",
    tax: "30.00",
    total: "430.00"
  }, {
    id: "7",
    invdate: "80:12:01",
    name: "test7",
    note: "note7",
    amount: "200.00",
    tax: "10.00",
    total: "210.00"
  }, {
    id: "8",
    invdate: "112:23:6",
    name: "test8",
    note: "note8",
    amount: "300.00",
    tax: "20.00",
    total: "320.00"
  }, {
    id: "9",
    invdate: "80:12:1 ",
    name: "test9",
    note: "note9",
    amount: "400.00",
    tax: "30.00",
    total: "430.00"
  }, {
    id: "10",
    invdate: "112:34:2",
    name: "test10",
    note: "note10",
    amount: "500.00",
    tax: "30.00",
    total: "530.00"
  }, {
    id: "11",
    invdate: "114:23:2",
    name: "test11",
    note: "note11",
    amount: "500.00",
    tax: "30.00",
    total: "530.00"
  }, {
    id: "13",
    invdate: "80:12:4 ",
    name: "test11",
    note: "note12",
    amount: "500.00",
    tax: "30.00",
    total: "530.00"
  }, {
    id: "14",
    invdate: "0:1:0",
    name: "test11",
    note: "note12",
    amount: "500.00",
    tax: "30.00",
    total: "530.00"
  }, {
    id: "15",
    invdate: "80:12:3",
    name: "test11",
    note: "note12",
    amount: "500.00",
    tax: "30.00",
    total: "530.00"
  }];


  $("#grid").jqGrid({
    data: mydata,
    colNames: ['Inv No', 'Duration', 'Client', 'Amount', 'Tax', 'Total', 'Notes'],
    colModel: [{
      name: 'id',
      index: 'id',
      search: false,
      width: 65,
      sorttype: 'int'
    }, {
      name: 'invdate',
      index: 'invdate',
      width: 120,
      align: 'center',
      sorttype: 'datetime',
      datefmt: 'H:i:s',
      searchoptions: {
        sopt: ['inbetween', 'eq', 'lt', 'le', 'gt', 'ge']
      }
    }, {
      name: 'name',
      index: 'name',
      width: 90,
      search: false,
    }, {
      name: 'amount',
      index: 'amount',
      width: 70,
      formatter: 'number',
      align: "right",
      search: false,
    }, {
      name: 'tax',
      index: 'tax',
      width: 60,
      formatter: 'number',
      align: "right",
      search: false,
    }, {
      name: 'total',
      index: 'total',
      width: 60,
      formatter: 'number',
      align: "right",
      search: false,
    }, {
      name: 'note',
      index: 'note',
      width: 100,
      search: false,
    }],
    pager: true,
    autoencode: true,
    viewrecords: true,
    rowNum: 10,
    rowList: [5, 10, 20, "10000:All"],
    caption: "Demonstration custom searching operation (Duration Range)",
    customSortOperations: {

      inbetween: {
        operand: "inbetween",
        text: "in between",
        filter: function(options) {}
      }
    },
    searching: {
      searchOperators: true
     
    }
  }).jqGrid("filterToolbar");
});
<style> html,
body {
  font-size: 75%;
}
</style>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">

  <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.11.3/themes/redmond/jquery-ui.css">
  <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
  <!--<link rel="stylesheet" href="../jqGrid/css/ui.jqgrid.css">-->
  <link rel="stylesheet" href="http://www.ok-soft-gmbh.com/jqGrid/OK/ui.jqgrid.css">

  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.11.3/jquery-ui.min.js"></script>
  <script src="http://www.ok-soft-gmbh.com/jqGrid/OK/i18n/grid.locale-en.js"></script>

  <script src="http://www.ok-soft-gmbh.com/jqGrid/OK/jquery.jqGrid.src.js"></script>
</head>

<body>
  <div id="outerDiv" style="margin:5px;">
    <table id="grid"></table>
  </div>
</body>

</html>

回答1:


The implementation depends on the version of jqGrid which you use (can use) and from fork of jqGrid which you use (free jqGrid, commercial Guriddo jqGrid JS or an old jqGrid in version <=4.7). I develop free jqGrid fork and implemented custom filtering operations, where you can define any custom filter operation. See the answer, this one.

If you can't use free jqGrid, then you you can use beforeSearch callback of filterToolbar to change the filter like I described in the old answer. You will get more long and more complicated code, which works in the filter toolbar, but not in Searching Dialog, where you will have to use onSearch callback. In any way it's possible too, but the implementation is more sophisticated.

UPDATED: The fix of your code could be for example the following:

$(function() {
  "use strict";
  var mydata = [{
    id: "1",
    invdate: "720:0:0",
    name: "test",
    note: "note",
    amount: "200.00",
    tax: "10.00",
    total: "210.00"
  }, {
    id: "2",
    invdate: "34:09:0",
    name: "test2",
    note: "note2",
    amount: "300.00",
    tax: "20.00",
    total: "320.00"
  }, {
    id: "3",
    invdate: "0:0:0",
    name: "test3",
    note: "note3",
    amount: "400.00",
    tax: "30.00",
    total: "430.00"
  }, {
    id: "4",
    invdate: "90:08:8",
    name: "test4",
    note: "note4",
    amount: "200.00",
    tax: "10.00",
    total: "210.00"
  }, {
    id: "5",
    invdate: "09:34:2",
    name: "test5",
    note: "note5",
    amount: "300.00",
    tax: "20.00",
    total: "320.00"
  }, {
    id: "6",
    invdate: "80:12:02",
    name: "test6",
    note: "note6",
    amount: "400.00",
    tax: "30.00",
    total: "430.00"
  }, {
    id: "7",
    invdate: "80:12:01",
    name: "test7",
    note: "note7",
    amount: "200.00",
    tax: "10.00",
    total: "210.00"
  }, {
    id: "8",
    invdate: "112:23:6",
    name: "test8",
    note: "note8",
    amount: "300.00",
    tax: "20.00",
    total: "320.00"
  }, {
    id: "9",
    invdate: "80:12:1 ",
    name: "test9",
    note: "note9",
    amount: "400.00",
    tax: "30.00",
    total: "430.00"
  }, {
    id: "10",
    invdate: "112:34:2",
    name: "test10",
    note: "note10",
    amount: "500.00",
    tax: "30.00",
    total: "530.00"
  }, {
    id: "11",
    invdate: "114:23:2",
    name: "test11",
    note: "note11",
    amount: "500.00",
    tax: "30.00",
    total: "530.00"
  }, {
    id: "13",
    invdate: "80:12:4 ",
    name: "test11",
    note: "note12",
    amount: "500.00",
    tax: "30.00",
    total: "530.00"
  }, {
    id: "14",
    invdate: "0:1:0",
    name: "test11",
    note: "note12",
    amount: "500.00",
    tax: "30.00",
    total: "530.00"
  }, {
    id: "15",
    invdate: "80:12:3",
    name: "test11",
    note: "note12",
    amount: "500.00",
    tax: "30.00",
    total: "530.00"
  }];


  $("#grid").jqGrid({
    data: mydata,
    colNames: ['Inv No', 'Duration', 'Client', 'Amount', 'Tax', 'Total', 'Notes'],
    colModel: [{
      name: 'id',
      index: 'id',
      search: false,
      width: 65,
      sorttype: 'int'
    }, {
      name: 'invdate',
      index: 'invdate',
      width: 200,
      align: 'center',
      sorttype: 'datetime',
      datefmt: 'H:i:s',
      searchoptions: {
        sopt: ['inbetween', 'eq', 'lt', 'le', 'gt', 'ge']
      }
    }, {
      name: 'name',
      index: 'name',
      width: 90,
      search: false,
    }, {
      name: 'amount',
      index: 'amount',
      width: 70,
      formatter: 'number',
      align: "right",
      search: false,
    }, {
      name: 'tax',
      index: 'tax',
      width: 60,
      formatter: 'number',
      align: "right",
      search: false,
    }, {
      name: 'total',
      index: 'total',
      width: 60,
      formatter: 'number',
      align: "right",
      search: false,
    }, {
      name: 'note',
      index: 'note',
      width: 100,
      search: false,
    }],
    pager: true,
    autoencode: true,
    viewrecords: true,
    rowNum: 10,
    rowList: [5, 10, 20, "10000:All"],
    caption: "Demonstration custom searching operation (Duration Range)",
    customSortOperations: {
      inbetween: {
        operand: "inbetween",
        text: "in between",
        filter: function(options) {
           var convertToSeconds = function (value) {
                   // every value should have 3 integer parts
                   var parts = value.split(":");
                   if (parts.length < 2) { parts.push(0); }
                   if (parts.length < 3) { parts.push(0); }
                   // now parts has 3 elements: h:m:s
                   return parseInt(parts[2], 10) +
                       parseInt(parts[1], 10) * 60 +
                       parseInt(parts[0], 10) * 3600;

               };
           var partsOfFilter = options.searchValue.split("-");
           if (partsOfFilter.length < 2) {
               // wrong filter
               return false;
           }

           // options.item[options.cmName] - the data from the column
           return convertToSeconds(options.item[options.cmName]) >=
                  convertToSeconds(partsOfFilter[0]) &&
                  convertToSeconds(options.item[options.cmName]) <=
                  convertToSeconds(partsOfFilter[1])
        }
      }
    },
    searching: {
      searchOperators: true
     
    }
  }).jqGrid("filterToolbar");
});
<style> html,
body {
  font-size: 75%;
}
</style>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">

  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/redmond/jquery-ui.min.css">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/free-jqgrid/4.13.5/css/ui.jqgrid.min.css">

  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/free-jqgrid/4.13.5/js/jquery.jqgrid.min.js"></script>
</head>

<body>
  <div id="outerDiv" style="margin:5px;">
    <table id="grid"></table>
  </div>
</body>

</html>


来源:https://stackoverflow.com/questions/40483338/i-want-to-have-range-filter-in-columns-not-in-templates-filters-which-is-ther-i

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!