2

I've read this QA jqGrid filtering on the client-side using "filterToolbar" and this one triggering client-side filtering at load time in a jqGrid before I posted. Is there any way to just use one text box to filter the data on the client side?

The data is loaded via the grids built in mechanizm to consume json, and I have set loadonce:true, now the question is how to implement.

Here is an example from another grid plug-in http://datatables.net/release-datatables/examples/basic_init/zero_config.html

Regards, Stephen

Community
  • 1
  • 1
Stephen Patten
  • 6,333
  • 10
  • 50
  • 84
  • 1
    Is [the demo](http://www.ok-soft-gmbh.com/jqGrid/SingleSearchFilter.htm) from [the answer](http://stackoverflow.com/a/4509018/315935) not exactly what you need? – Oleg Dec 15 '11 at 23:23
  • @Oleg : Now how did I miss that? That looks very promising. Thank you. – Stephen Patten Dec 15 '11 at 23:29
  • You are welcome! In general you should just set `search: true` parameter of grid (no `_search`), set either `filters` or three other properties `searchField`, `searchOper`, `searchString` properties of `postData` parameter depend of the searching mode which you use and then call `trigger("reloadGrid")`. – Oleg Dec 15 '11 at 23:34
  • @Oleg Can this demo be modified to search multiple columns? – Stephen Patten Dec 15 '11 at 23:35
  • 1
    Yes, but in the case you should use ["advanced searching"](http://www.trirand.com/jqgridwiki/doku.php?id=wiki:advanced_searching) (`multipleSearch:true`) and fill `filters` property instead. See [the answer](http://stackoverflow.com/a/5273385/315935) for example. – Oleg Dec 15 '11 at 23:40
  • See [here](http://stackoverflow.com/a/8282968/315935) some additional references. – Oleg Dec 15 '11 at 23:41
  • @Oleg So then it would become $.extend(postdata, { filters: myFilter, searchString: text }); Where I have constructed the proper filter (myFilter) dynamically – Stephen Patten Dec 16 '11 at 00:32
  • I posted you before [this](http://stackoverflow.com/a/5273385/315935) and [this](http://stackoverflow.com/a/5750127/315935) links which demonstrate building of `myFilter` dynamically. – Oleg Dec 16 '11 at 00:36
  • Just making sure, there are a myriad of options and at times I feel quite overwhelmed. – Stephen Patten Dec 16 '11 at 00:47

1 Answers1

6

I'm answering my own question but the credit goes to Oleg (The Doctor, as he in called in my office) since it was his with guidance and deep knowledge of jqGrid that I was able to complete this.

The keys to this are two fold, you must set multipleSearch: true in the grid and then construct the proper filter based on your requirements. See the button code at the end for the filter creation. One thing to note is that I don't perform a search until at least 2 chars have been entered into the text box.

Side note to this is that I am going to remove the button and handle the key down event of the text box to perform the search.

$(document).ready(function () {

var grid = $('#favoriteGrid'),
            decodeErrorMessage = function (jqXHR, textStatus, errorThrown) {
                var html, errorInfo, i, errorText = textStatus + '\n' + errorThrown;
                if (jqXHR.responseText.charAt(0) === '[') {
                    try {
                        errorInfo = $.parseJSON(jqXHR.responseText);
                        errorText = "";
                        for (i = 0; i < errorInfo.length; i++) {
                            if (errorText.length !== 0) {
                                errorText += "<hr/>";
                            }
                            errorText += errorInfo[i].Source + ": " + errorInfo[i].Message;
                        }
                    }
                    catch (e) { }
                } else {
                    html = /<body.*?>([\s\S]*)<\/body>/.exec(jqXHR.responseText);
                    if (html !== null && html.length > 1) {
                        errorText = html[1];
                    }
                }
                return errorText;
            };

grid.jqGrid({
    url: myAjaxUrl,
    datatype: 'json',
    ajaxGridOptions: { contentType: "application/json" },
    jsonReader: { repeatitems: false },
    colNames: ['Qty', 'Features', 'Item Nbr', 'Brand', 'Product', 'Supplier', 'Price', 'UOM', 'Case Pack', 'Remarks', 'Ave Weight', 'Par', 'Sort', 'Last Purchase', 'GLCode', 'ProductId', 'OldProductId', 'CategoryName'],
    colModel: [
            { name: 'Quantity', index: 'Quantity', width: 20, sorttype: "number", editable: true, edittype: 'text', editoptions: { size: 10, maxlength: 15} },
            { name: 'ProductAttributes', index: 'ProductAttributes', width: 50 },
            { name: 'ItemNum', index: 'ItemNum', width: 60, align: "right" },
            { name: 'BrandName', index: 'BrandName', width: 100 },
            { name: 'ProducName', index: 'ProducName', width: 150 },
            { name: 'SupplierName', index: 'SupplierName', width: 100 },
            { name: 'Price', index: 'Price', width: 80, sorttype: "number", align: "right" },
            { name: 'UOM', index: 'UOM', width: 80 },
            { name: 'CasePack', index: 'CasePack', width: 80 },
            { name: 'PackageRemarks', index: 'PackageRemarks', width: 80 },
            { name: 'AveWeight', index: 'AveWeight', width: 80, align: "right" },
            { name: 'Par', index: 'Par', width: 80, align: "right" },
            { name: 'SortPriority', index: 'SortPriority', hidden: true },
            { name: 'LastPurchaseDate', index: 'LastPurchaseDate', width: 80, align: "right" },
            { name: 'GLCode', index: 'GLCode', hidden: true },
            { name: 'ProductId', index: 'ProductId', hidden: true },
            { name: 'OldProductId', index: 'OldProductId', hidden: true },
            { name: 'CategoryName', index: 'CategoryName', hidden: true }
        ],
    pager: $('#favoritePager'),
    pginput: false,
    rowNum: 1000,
    viewrecords: true,
    multiselect: true, // enable multiselct
    gridview: true,
    loadonce: true, // one ajax call per 
    caption: "Products List",
    loadError: function (jqXHR, textStatus, errorThrown) {
        // remove error div if exist
        $('#' + this.id + '_err').remove();
        // insert div with the error description before the grid
        grid.closest('div.ui-jqgrid').before(
                '<div id="' + this.id + '_err" style="max-width:' + this.style.width +
                ';"><div class="ui-state-error ui-corner-all" style="padding:0.7em;float:left;"><span class="ui-icon ui-icon-alert" style="float:left; margin-right: .3em;"></span><span style="clear:left">' +
                decodeErrorMessage(jqXHR, textStatus, errorThrown) + '</span></div><div style="clear:left"/></div>')
    },
    loadComplete: function () {
        // remove error div if exist
        $('#' + this.id + '_err').remove();
        // resize the grid both Heigh and Width
        //$("#grid").jqGrid('setGridHeight', Math.min(400, parseInt(jQuery(".ui-jqgrid-btable").css('height')))); // works
        //$(".ui-jqgrid-bdiv").css('height', jQuery("#favoriteGrid").css('height'));
        var gr = jQuery('#favoriteGrid');
        fixGridHeight(gr);
    },
    ondblClickRow: function (rowid, ri, ci) {
        // Popup modal dialog for details view 
    }
}).jqGrid('navGrid', '#favoritePager',
    { add: false, edit: false, del: false, search: true, refresh: false },
    {},
    {},
    {},
    { multipleSearch: true },
    {});


// Add Search
$("#mySearch").button().click(function () {
    var text = $("#searchText").val();
    var postdata = grid.jqGrid('getGridParam', 'postData');
    // build up the filter
    // ['equal','not equal', 'less', 'less or equal','greater','greater or equal', 'begins with','does not begin with','is in','is not in','ends with','does not end with','contains','does not contain']
    // ['eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','cn','nc']
    var myfilter = { groupOp: "OR", rules: [] };        
    myfilter.rules.push({ field: "ItemNum", op: "cn", data: text });
    myfilter.rules.push({ field: "BrandName", op: "cn", data: text });
    myfilter.rules.push({ field: "ProducName", op: "cn", data: text });

    $.extend(postdata, { filters: JSON.stringify(myfilter) });
    grid.jqGrid('setGridParam', { search: text.length > 2, postData: postdata });        
    grid.trigger("reloadGrid", [{ page: 1}]);
});

});
Mark Carpenter Jr
  • 812
  • 1
  • 16
  • 32
Stephen Patten
  • 6,333
  • 10
  • 50
  • 84