2012-02-16 4 views
2

У меня есть jqgrid, содержащий некоторые данные для фильтрации. Я хотел бы определить поле со списком с некоторыми предопределенными наборами фильтров/шаблонами. Если пользователь выбирает элемент списка со списком, сетка должна автоматически применять комбинированные фильтры. Предпочтительно, чтобы поле со списком было интегрировано в панель инструментов или пейджер jqGrid, но также на странице html было бы хорошо.jqgrid: Как определить пресеты/шаблоны фильтров внутри комбинированного блока?

Например:

  COMBO BOX 
     Item templates  filter parameters 
     ___________ 
     |Expired |  << Timeout = true 
     |Last Week |  << OpenDate between 02/13/2012 and 02/16/2012 
     |Last Month |  << OpenDate between 01/01/2012 and 02/16/2012 
     |......... |  ...... 

Заранее спасибо за вашу помощь

+1

Это очень хороший вопрос! В расширенном поиске есть шаблоны (см. Демонстрацию на [официальной демонстрационной странице] (http://trirand.com/blog/jqgrid/jqgrid.html) в разделе «Поиск»/«Шаблоны поиска»), но нет поддержка шаблонов для панели инструментов фильтра. У меня есть идея, как можно реализовать поисковые шаблоны на панели инструментов фильтра. Я отправлю свой ответ позже. – Oleg

ответ

4

jqGrid поддерживает Searching Templates в Advance Searching (см "Поиск"/"Поиск шаблонов" в the official jqGrid demo), но на данный момент нет поиска поддержка шаблонов в Toolbar Filtering.

Я нахожу ваш вопрос очень интересным. В the old question Я описал, как можно использовать общие внешние фильтры для отправки дополнительной информации на сервер. Способ может быть хорошим в случае удаленных данных, но он не может использоваться непосредственно в локальной сетке или в сетке с опцией loadonce: true.

Итак, я создал the demo, который показывает, как шаблоны фильтров могут быть реализованы в Toolbar Filtering и как интегрировать шаблон в jqGrid. Я использовал toolbar: [true, "top"] иметь дополнительную пустую панель над заголовками столбцов:

enter image description here

В реализации я использовал функцию refreshSerchingToolbar который я предложил первоначально here. Важно понимать, что функция refreshSerchingToolbar заполняет панель инструментов фильтра только информацией, которая может быть точно представлена ​​фильтром. Например, фильтр для строк «Закрыто» может быть представлен на панели инструментов фильтра (см. Рисунок выше), но интервал дат «Последняя неделя» и «Последний месяц». В случаях, когда данные в сетке будут отфильтрованы, но соответствующие поля панели инструментов фильтра остаются пустыми.

Наиболее важная часть кода демо вы можете найти ниже

var $grid = $("#list"), 
    initDate = function (elem) { 
     $(elem).datepicker({ 
      dateFormat: 'dd-M-yy', 
      autoSize: true, 
      changeYear: true, 
      changeMonth: true, 
      showButtonPanel: true, 
      showWeek: true 
     }); 
    }, 
    numberTemplate = {formatter: 'number', align: 'right', sorttype: 'number', editable: true/*, 
     searchoptions: { sopt: ['eq', 'ne', 'lt', 'le', 'gt', 'ge', 'nu', 'nn', 'in', 'ni'] }*/}, 
    dateTemplate = {width: 80, align: 'center', sorttype: 'date', 
      formatter: 'date', formatoptions: { newformat: 'd-M-Y' }, editable: true, datefmt: 'd-M-Y', 
      editoptions: { dataInit: initDate }, 
      searchoptions: { sopt: ['eq', 'ne', 'lt', 'le', 'gt', 'ge'], dataInit: initDate }}, 
    yesNoTemplate = {align: 'center', editable: true, formatter: 'checkbox', 
      edittype: 'checkbox', editoptions: {value: 'Yes:No', defaultValue: 'No'}, 
      stype: 'select', searchoptions: { sopt: ['eq', 'ne'], value: ':Any;true:Yes;false:No' }}, 
    myDefaultSearch = 'cn', 
    getColumnIndex = function (columnIndex) { 
     var cm = this.jqGrid('getGridParam', 'colModel'), i, l = cm.length; 
     for (i = 0; i < l; i++) { 
      if ((cm[i].index || cm[i].name) === columnIndex) { 
       return i; // return the colModel index 
      } 
     } 
     return -1; 
    }, 
    refreshSerchingToolbar = function (myDefaultSearch) { 
     var filters, i, l, rules, rule, iCol, cmi, control, tagName, 
      $this = $(this), 
      postData = $this.jqGrid('getGridParam', 'postData'), 
      cm = $this.jqGrid('getGridParam', 'colModel'); 

     for (i = 0, l = cm.length; i < l; i++) { 
      control = $("#gs_" + $.jgrid.jqID(cm[i].name)); 
      if (control.length > 0) { 
       tagName = control[0].tagName.toUpperCase(); 
       if (tagName === "SELECT") { // && cmi.stype === "select" 
        control.find("option[value='']") 
         .attr('selected', 'selected'); 
       } else if (tagName === "INPUT") { 
        control.val(''); 
       } 
      } 
     } 

     if (typeof (postData.filters) === "string" && 
       typeof (this.ftoolbar) === "boolean" && this.ftoolbar) { 

      filters = $.parseJSON(postData.filters); 
      if (filters && filters.groupOp === "AND" && typeof (filters.groups) === "undefined") { 
       // only in case of advance searching without grouping we import filters in the 
       // searching toolbar 
       rules = filters.rules; 
       for (i = 0, l = rules.length; i < l; i++) { 
        rule = rules[i]; 
        iCol = getColumnIndex.call($this, rule.field); 
        if (iCol >= 0) { 
         cmi = cm[iCol]; 
         control = $("#gs_" + $.jgrid.jqID(cmi.name)); 
         if (control.length > 0 && 
           (((typeof (cmi.searchoptions) === "undefined" || 
           typeof (cmi.searchoptions.sopt) === "undefined") 
           && rule.op === myDefaultSearch) || 
            (typeof (cmi.searchoptions) === "object" && 
             $.isArray(cmi.searchoptions.sopt) && 
             cmi.searchoptions.sopt.length > 0 && 
             cmi.searchoptions.sopt[0] === rule.op))) { 
          tagName = control[0].tagName.toUpperCase(); 
          if (tagName === "SELECT") { // && cmi.stype === "select" 
           control.find("option[value='" + $.jgrid.jqID(rule.data) + "']") 
            .attr('selected', 'selected'); 
          } else if (tagName === "INPUT") { 
           control.val(rule.data); 
          } 
         } 
        } 
       } 
      } 
     } 
    }, 
    templateClosed = { 
     groupOp: "AND", 
     rules: [ 
      { field: "closed", op: "eq", data: "true" } 
     ] 
    }, 
    templateLastWeek = { 
     groupOp: "AND", 
     rules: [ 
      { field: "invdate", op: "ge", "data": "13-Feb-2012" }, 
      { field: "invdate", op: "le", "data": "16-Feb-2012"} 
     ] 
    }, 
    templateLastMonth = { 
     groupOp: "AND", 
     rules: [ 
      { field: "invdate", op: "ge", "data": "16-Jan-2012" }, 
      { field: "invdate", op: "le", "data": "16-Feb-2012"} 
     ] 
    }, 
    myFilterTemplateLabel = 'Filter by Template:&nbsp;', 
    myFilterTemplateNames = ['Closed', 'Last Week', 'Last Month'], 
    myFilterTemplates = [templateClosed, templateLastWeek, templateLastMonth], 
    iTemplate, 
    cTemplates = myFilterTemplateNames.length, 
    templateOptions = '', 
    reloadWithNewFilterTemplate = function() { 
     var iTemplate = parseInt($('#filterTemplates').val(), 10), 
      postData = $grid.jqGrid('getGridParam', 'postData'); 
     if (isNaN(iTemplate)) { 
      $grid.jqGrid('setGridParam', {search: false}); 
     } else if (iTemplate >= 0) { 
      $.extend(postData, { 
       filters: JSON.stringify(myFilterTemplates[iTemplate]) 
      }); 
      $grid.jqGrid('setGridParam', {search: true}); 
     } 
     $grid.trigger('reloadGrid', [{current: true, page: 1}]); 
    }; 

$grid.jqGrid({ 
    ... 
    toolbar: [true, "top"], 
    loadComplete: function() { 
     var $this = $(this); 

     if (typeof (this.ftoolbar) !== "boolean") { 
      // create toolbar if needed 
      $this.jqGrid('filterToolbar', 
       {stringResult: true, searchOnEnter: true, defaultSearch: myDefaultSearch}); 
     } 
     refreshSerchingToolbar.call(this, myDefaultSearch); 
    } 
}); 
$.extend($.jgrid.search, { 
    multipleSearch: true, 
    multipleGroup: true, 
    recreateFilter: true, 
    closeOnEscape: true, 
    closeAfterSearch: true, 
    overlay: 0, 
    tmplLabel: myFilterTemplateLabel, 
    tmplNames: myFilterTemplateNames, 
    tmplFilters: myFilterTemplates 
}); 
$grid.jqGrid('navGrid', '#pager', {edit: false, add: false, del: false}); 
for (iTemplate = 0; iTemplate < cTemplates; iTemplate++) { 
    templateOptions += '<option value="' + iTemplate + '">' + 
     myFilterTemplateNames[iTemplate] + '</option>'; 
} 
$('#t_' + $.jgrid.jqID($grid[0].id)).append('<label for="filterTemplates">'+ 
    myFilterTemplateLabel + '</label>' + 
    '<select id="filterTemplates"><option value="">Not filtered</option>' + 
    templateOptions + '</select>'); 
$('#filterTemplates').change(reloadWithNewFilterTemplate).keyup(function (e) { 
    // some web browsers like Google Chrome don't fire "change" event 
    // if the select will be "scrolled" by keybord. Moreover some browsers 
    // like Internet Explorer don't change the select option on pressing 
    // of LEFT or RIGHT key. Another web browsers like Google Chrome do this. 
    // We make refrech of the grid in any from the cases. If needed one 
    // could modify the code to reduce unnneded reloading of the grid, 
    // but for the demo with a few local rows it's such optimization 
    // isn't really needed 
    var keyCode = e.keyCode || e.which; 

    if (keyCode === $.ui.keyCode.PAGE_UP || keyCode === $.ui.keyCode.PAGE_DOWN || 
      keyCode === $.ui.keyCode.END || keyCode === $.ui.keyCode.HOME || 
      keyCode === $.ui.keyCode.UP || keyCode === $.ui.keyCode.DOWN || 
      keyCode === $.ui.keyCode.LEFT || keyCode === $.ui.keyCode.RIGHT) { 

     reloadWithNewFilterTemplate(); 
    } 
}); 
+0

Спасибо большое! Ты лучший!!! – Larry

+0

@ Larry: Спасибо! Добро пожаловать! – Oleg

+0

@Oleg: В демо я ввел 400, чтобы указать столбец на панели поиска и нажал enter для поиска. После этого выбрана «Последняя неделя». 400 был удален на панели инструментов, и все суммы показаны. Как применить шаблон поиска в дополнение к фильтру панели инструментов, также сохранить условие фильтра панели инструментов? – Andrus

Смежные вопросы