0

i have the following jqgrid 4.6 grid

enter image description here

the code for the grid:

<!DOCTYPE html>
<html>
  <head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <link rel="stylesheet" href="http://code.jquery.com/ui/1.11.4/themes/le-frog/jquery-ui.css" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqgrid/4.6.0/css/ui.jqgrid.css" />
  </head>
  <body>

    <table id="list47"></table>
    <div id="plist47"></div>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.34/browser.min.js"></script>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.3/jquery.min.js"></script>
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jqgrid/4.6.0/js/i18n/grid.locale-en.js"></script>
    <script type="text/javascript">
      $.jgrid.no_legacy_api = true;
      $.jgrid.useJSON = true;
    </script>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jqgrid/4.6.0/js/jquery.jqGrid.min.js"></script>
    <script>
      $(function(){

        var mydata = [
          {id:"1",invdate:"2010-05-24",name:"test",note:"note",tax:"10.00",total:"2111.00"} ,
          {id:"2",invdate:"2010-05-25",name:"test2",note:"note2",tax:"20.00",total:"320.00"},
          {id:"3",invdate:"2007-09-01",name:"test3",note:"note3",tax:"30.00",total:"430.00"},
          {id:"4",invdate:"2007-10-04",name:"test",note:"note",tax:"10.00",total:"210.00"},
          {id:"5",invdate:"2007-10-05",name:"test2",note:"note2",tax:"20.00",total:"320.00"},
          {id:"6",invdate:"2007-09-06",name:"test3",note:"note3",tax:"30.00",total:"430.00"},
          {id:"7",invdate:"2007-10-04",name:"test",note:"note",tax:"10.00",total:"210.00"},
          {id:"8",invdate:"2007-10-03",name:"test2",note:"note2",amount:"300.00",tax:"21.00",total:"320.00"},
          {id:"9",invdate:"2007-09-01",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"},
          {id:"11",invdate:"2007-10-01",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},
          {id:"12",invdate:"2007-10-02",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"},
          {id:"13",invdate:"2007-09-01",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"},
          {id:"14",invdate:"2007-10-04",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},
          {id:"15",invdate:"2007-10-05",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"},
          {id:"16",invdate:"2007-09-06",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"},
          {id:"17",invdate:"2007-10-04",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},
          {id:"18",invdate:"2007-10-03",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"},
          {id:"19",invdate:"2007-09-01",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"},
          {id:"21",invdate:"2007-10-01",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},
          {id:"22",invdate:"2007-10-02",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"},
          {id:"23",invdate:"2007-09-01",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"},
          {id:"24",invdate:"2007-10-04",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},
          {id:"25",invdate:"2007-10-05",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"},
          {id:"26",invdate:"2007-09-06",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"},
          {id:"27",invdate:"2007-10-04",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},
          {id:"28",invdate:"2007-10-03",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"},
          {id:"29",invdate:"2007-09-01",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"}
        ];




        jQuery("#list47").jqGrid({
          data: mydata,
          datatype: "local",
          height: 'auto',
          rowNum: 30,
          rowList: [10,20,30],
          colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'],
          colModel:[
            {name:'id',index:'id', width:60, sorttype:"int"},
            {name:'invdate',index:'invdate', width:90, sorttype:"date", formatter:"date"},
            {name:'name',index:'name', width:100, editable:true},
            {name:'amount',index:'amount', width:80, align:"right",sorttype:"float", formatter:"number", editable:true},
            {name:'tax',index:'tax', width:80, align:"right",sorttype:"float", editable:true},
            {name:'total',index:'total', width:80,align:"right",sorttype:"float"},
            {name:'note',index:'note', width:150, sortable:false}
          ],
          pager: "#plist47",
          viewrecords: true,
          sortname: 'name',
          grouping:true,
          groupingView : {
            groupField : ['name'],
            groupColumnShow : [false],
            groupText : ['<b>{0} - {1} Item(s)</b>']
          },
          caption: "Configure group header row"
        });
      })

      jQuery("#list47").jqGrid('setGroupHeaders', {
        useColSpanStyle: false,
        groupHeaders:[
          {startColumnName: 'id', numberOfColumns: 2, titleText: 'Client Details'}
        ]
      });
      jQuery("#list47").jqGrid('setFrozenColumns');

    </script>

  </body>
</html>

i want to do the following things to the grid:

  1. Freeze columns InvoiceNo, Date and have other columns to the right scroll horizontally
  2. i need to set individual cell colors to colors that matches certain conditions

( A.) Color the Amount columns cells who has a value 0.00 to 'red'. This means the code shoudl find all cells with value 0.00 in Amount column and color those cells to 'red'

please note that i dont need the whole row to be colored in red only just those cells with that matching value

( B. ) just like above, in the total column find the cells that has a value that is greater than 300.00 and color them in yellow

how do i achieve this?

NP Neil Footy
  • 75
  • 1
  • 10
  • `cellattr` is the property/callback function of `colModel` (see [the documentation](http://www.trirand.com/jqgridwiki/doku.php?id=wiki:colmodel_options)) and not the option of the grid like `rowattr`. – Oleg Nov 01 '16 at 23:28

1 Answers1

1

First of all you should move the last part of your JavaScript code (where you call setGroupHeaders and setFrozenColumns) inside of $(function(){...}) block.

To set the color/background-color of rows based on the value of amount you should use rowattr:

rowattr: function (item) {
    if (item.amount == null || parseFloat(item.amount) === 0) {
        //return { "class": "ui-state-error" };
        //return { "style": "color: red" };
        return { "style": "background: red" };
    }
}

See the demo here: https://jsfiddle.net/f7yopLr0/1/. It produces the results like on the picture below

enter image description here

UPDATED: To change colors only the cells of amount and total columns one can use

cellattr: function (rowid, cellValue, item) {
    if (cellValue == null || parseFloat(cellValue) === 0) {
        return ' style="color:red"';
    }
}

in amount column and

cellattr: function (rowid, cellValue, item) {
    if (cellValue == null || parseFloat(cellValue) === 0) {
        return ' style="color:red"';
    }
}

in total column. See https://jsfiddle.net/f7yopLr0/2/

Oleg
  • 220,925
  • 34
  • 403
  • 798
  • hi Oleg thanks for reply : ) that awesome. But Oleg i need to know if its possible to color only the cell that matches the condition NOT THE WHOLE ROW? e.g: if amount column cell has 0.00 it should be red so only the cells in the column Amount with value 0.00 should be colored in red but not their whole row. – NP Neil Footy Nov 01 '16 at 23:00
  • @ANP: Which cell? If you write about some cell then you should write about the column name which color/background color you need to change. I still don't know whether the color, background color or both you need to change. I posted you already references to old answers which demonstrates the usage of `rowattr` and `cellattr`. You need to use `cellattr`. See [the answer](http://stackoverflow.com/a/12180842/315935). One can set `class` or `style`, but one should use just a little another return value as in `rowattr`: one need return the string instead of object. – Oleg Nov 01 '16 at 23:07
  • 1
    @ANP: Look at the demo https://jsfiddle.net/f7yopLr0/2/. I hope it do what you need. See **UPDATED** part of my answer. – Oleg Nov 01 '16 at 23:21