jqGrid width subgrid pager exceeds main grid width - jqgrid

I hope my title is comprehensive !
I am developing my own personal account with one main grid and one grid as subgrid.
The trouble is that main grid pager is displayed fine, but subgrid pager exceeds the width of grid, such as below :
I don't understand what is wrong.
Here is the subgrid code :
subGridRowExpanded: function(subgrid_id, row_id) {
var rowdata = $("#jqGrid").jqGrid('getRowData',row_id),
catg=rowdata.cg_id,
subgrid_table_id = subgrid_id+"_t",
pager_id = "p_"+subgrid_table_id;
$("#"+subgrid_id).closest("td").attr("colspan", 20)
.css({
borderRight:0,
borderLeft:0,
padding:0
})
.parent().find('td:eq(0)')
.addClass('ui-widget-content')
.addClass('ui-state-highlight')
.css({
borderLeft:0,
borderTop:0
});
$("#"+subgrid_id).html("<table id='"+subgrid_table_id+"' class='scroll'></table><div id='"+pager_id+"'></div>");
$("#"+subgrid_table_id).jqGrid({
url:"subc.php?rowid="+row_id+"&catg="+catg,
idPrefix:'s_'+row_id+'_',
datatype: "json",
colNames: ["ID","id_cp","Nom du poste"],
colModel:[
{
name:"su_id",
hidden:true
},
{
name:"id_cg",
hidden:true
},
{
name:"su_name"
}
],
caption:"Liste des postes budgétaires",
hidegrid: false,
gridview: true,
autowidth:true,
shrinkToFit:false,
viewrecords: true,
recordtext: "Postes {0} - {1} of {2}",
emptyrecords: "Aucun poste à afficher",
rownumbers:true,
rownumWidth:40,
altRows:false,
height:"auto",
maxHeight: (23*15),
rowNum: 20,
pager: pager_id,
loadComplete: function(){
$("#gview_"+subgrid_table_id+" .ui-jqgrid-titlebar .ui-jqgrid-title").css({color:'#875', fontWeight:'bold', fontSize:'1.2rem', lineHeight:'1.3rem',marginLeft:'10px'});
}
});
$("#"+subgrid_table_id).jqGrid('navGrid',"#"+pager_id,{search:false});
}
I'm sure that's a newbie mistake, and I hope somebody could help me.
Many thanks in advance
Cheers
JiheL

Related

load jqgrid via ajax to dialog search options dropdown don't work

When I use my jqgrid (v.4.6) on page evrything is ok.
When I load jqgrid via ajax to jquery dialog searchoptions dropdown list doesn't work for me.
In jqgrid search box searchoptions dropdown list doesn't work for me either.
$(document).ready(function(){
jQuery("#list_bs").jqGrid({
url:'some.php',
datatype: "json",
height: 450,
width: 1050,
colNames:['FirstName','Name','Date'],
colModel:[
{name:'FirstName',index:'FirstName', width:200, sorttype:'string', searchoptions:{sopt:['bw','bn','cn','ne','ew','en']}},
{name:'Name',index:'Name', width:200, sorttype:'string', searchoptions:{sopt:['bw','bn','cn','ne','ew','en']}},
{name:'Date',index:'Date', width:100, sorttype:'string', searchoptions:{sopt:['bw','bn','cn','ne','ew','en']}},
],
rowNum:50,
rowList : [20,30,50],
loadonce:false,
multiselect : false,
mtype: "GET",
shrinkToFit: false,
rownumbers: true,
gridview: true,
pager: '#pager',
sortname: 'Name',
viewrecords: true,
sortorder: "ASC",
toolbar: [true,"top"],
});
$("#list_bs").jqGrid('navGrid', '#pager_bs',
{
edit:false,
add:false ,
del:false,
},
{},
{},
{},
{
multipleSearch: true,
showQuery: true
}
......
)
});
jQuery("#list_bs").jqGrid('filterToolbar',{ searchOperators: true,stringResult:true, searchOnEnter: false, autosearch: true ,enableClear: false});
try like below this work for me.You have give data in the dropdown in its column model
{
name: 'Name', Name: 'Title', align: 'center', editable: true, editoptions: { readonly: 'readonly' },
stype: 'select',
searchoptions: {
sopt: ['eq','cn'],
dataUrl: //get data from server
buildSelect: function (data) {
var response, s = '<select>', i;
response = jQuery.parseJSON(data);
s += '<option value="0">--Select Book Title--</option>';
if (response && response.length) {
$.each(response, function (i) {
s += '<option value="' + this.Name+ '">' + this.Name+ '</option>';
});
}
return s + '</select>';
}
}
}
I don't need dropdown in toolbar input
My search operator dropdown list doesn't open.
The problem is only when my own jqgrid is loaded by ajax in to jquery dialog.
$( "#my_dialog" ).dialog({
width:'auto',
open: function(event, ui){
$.ajax(
{
url: "some.php",
type: "POST",
data: "is_dialog=true",
error: function(){
},
beforeSend: function(){
$("#loader").show();
},
complete: function(){
$("#loader").hide();
},
success: function( strData ){
$("#dialog_content").html(strData );
}
}
);
},
});
...........
<div id="my_dialog" >
<div id="dialog_content"></div>
</div>

jqgrid: how do I change the layout of the pager?

I'd like to change the layout of the pager, so that the VCR buttons are all grouped together, followed by the Page number input field, then the number of rows drop-down. How would I accomplish this?
Here is the code I'm currently using to display the jqgrid. Its the standard JavaScript code:
$(function(){
$("#" + listName).jqGrid({
url: url,
datatype: 'json',
mtype: 'GET',
colNames: columnNames,
colModel: columnModel,
pager: pagerName,
rowNum: displayRows,
rowList: rowList,
sortname: initSortCol,
sortorder: initSortOrder,
viewrecords: true,
multiselect: multiSelect,
gridview: true,
caption: caption,
height: height,
jsonReader: {
root: 'data',
page: 'currentPage',
total: 'totalPages',
records: 'totalRows',
repeatitems: false,
id: dataModelRowId
}
});
jQuery("#" + listName).jqGrid('navGrid','#' + pagerName,{edit:false,add:false,del:false,search:false});
Example of jqgrid with page number, number of records per page.
Code:
$(document).ready(function(){
//jqGrid
$("#librariesList").jqGrid({
url:'<%=request.getContextPath()%>/Admin/getAllLibraries',
datatype: "json",
colNames:['Id','Edit','Type','Created Date', 'Modified Date', 'Url', 'Use Url'],
colModel:[
{name:'libraryId', index:'libraryId',search:false, width:30,sortable: false,hidden:true},
{name:'libraryId', index:'libraryId',search:false, width:30,sortable: false, formatter: editLink},
{name:'type',index:'type',width:80},
{name:'createdDate',index:'createdDate',width:150},
{name:'modifiedDate',index:'modifiedDate',width:150},
{name:'url',index:'url',width:150},
{name:'useUrl',index:'useUrl',width:50},
],
rowNum:20,
rowList:[10,20,30,40,50],
rownumbers: true,
pager: '#pagerDiv',
sortname: 'createdDate',
viewrecords: true,
sortorder: "asc",
autowidth:'true',
});
$('#gridContainer div:not(.ui-jqgrid-titlebar)').width("100%");
$('.ui-jqgrid-bdiv').css('height', window.innerHeight * .55);
$('#load_librariesList').width("130");
$("#librariesList").jqGrid('navGrid','#pagerDiv',{edit:false,add:false,del:false},{},{},{},{closeAfterSearch:true});
$(".inline").colorbox({inline:true, width:"20%"});
});
function editLink(cellValue, options, rowdata, action)
{
return "<a href='<%=request.getContextPath()%>/Admin/editLibrary/"+ rowdata.libraryId + "' class='ui-icon ui-icon-pencil' ></a>";
}
jggrid is displayed like below:

jqGrid how to collapse row when clicking on other row

In a main grid, when I click on one row, it become 'highlighted' and the seven subgrids are showed.
Here is an example where first row is selected, and near to be edited (work in progress) :
Now, if I click on second row of the main grid, the first is hidden and the second selected. I click after on edit button and a warning appears : no selected row !
If I click again on the second row, it become unselected, and again I click for selecting and editing, that runs fine ! So I presume that my code for switching between collapsed and expanded status is somewhere wrong :
UPDATED 2013-04-11
Following Oleg's answer, I join the full code (limited to 30000) of my program :
jQuery(function ($) {
var resetAltRows = function () {
$(this).children("tbody:first").children('tr.jqgrow').removeClass('myAltRowClass');
$(this).children("tbody:first").children('tr.jqgrow').each(function(){
var arbo=$(this).find('td:eq(0)').text().substr(0,1);
$(this).addClass('myAltRowClass1'+arbo);
if(arbo==1)$(this).find('td:eq(1) input:checkbox').attr('checked','checked');
});
$(this).children("tbody:first").children('tr.jqgrow:visible:odd').addClass('myAltRowClass');
};
var OldSelectedRow=null,
height=$('body').height()-235,
numRows=Math.floor(height/23)-(Math.floor(height/23)%5),
heightRows=numRows*23,
myGrid = $("#tab51");
//************************
//************************
//************************
myGrid.jqGrid({
caption:"Liste des BONS DE TRAVAUX STANDARD",
hidegrid:false,
url:'opt511.php',
datatype: "json",
height:heightRows,
rowNum:numRows,
shrinkToFit:true,
colNames:['Id','A.R.C.','B.T.','Date ARC','Client','Nom','Ville','Cde client','Matériel','Marque','Prest.','Description','N° série','Objet','X','b.type','idref'],
colModel:[
{name:'b.id',index:'b.id', hidden:true,key:true},
{name:'b.arc',index:'b.arc', width:60,align:'center',editable:true},
{name:'b.ind',index:'b.ind', width:30,align:"center"},
{name:'b.date_in',index:'b.date_in', width:70,align:"center"},
{name:'c.code',index:'c.code', width:40},
{name:'c.descr',index:'c.descr',width:200},
{name:'c.ville',index:'c.ville', width:200},
{name:'b.cde_clt',index:'b.cde_clt', width:150},
{name:'q.code',index:'q.code', width:80},
{name:'k.code',index:'k.code', width:80},
{name:'b.nature',index:'b.nature', stype:'select',width:40,align:'center',
searchoptions:{
dataUrl:'sh51.php'
},
cellattr: function (rowId, val, rawObject, cm, rdata) {
return 'title="' + rawObject[15] + '"';
}
},
{name:'2m.descr',index:'2m.descr', width:200},
{name:'p.numserie',index:'p.numserie', width:80},
{name:'b.descr',index:'b.descr', width:200},
{name:'clos',index:'clos', width:20,stype:'select',align:'center',sortable:false,
searchrules:{date:true},
search:true,
searchoptions:{
value:{"": "?", 0:"En cours", 1: "Clôturé"},
defaultValue:0
}
},
{name:'btype',index:'btype', width:40,hidden:true},
{name:'idref',index:'btype', width:40,hidden:true}
],
postData: {
filters:'{"groupOp":"AND","rules":['+
'{"field":"clos","op":"eq","data":"0"}]}'
},
search:true,
pager: '#tab51p',
sortname: 'b.arc',
gridComplete:function(){
OldSelectedRow=null;
sortDataCol(this);,
},
onSelectRow:function(id,status){
alert('begin = '+myGrid.jqGrid('getGridParam','selrow'));
if(OldSelectedRow!=id){
if(OldSelectedRow!=null){
myGrid.jqGrid ('collapseSubGridRow', OldSelectedRow);
$('#'+OldSelectedRow).removeClass('ui-state-highlight');
}
$('#'+id).addClass('ui-state-highlight');
OldSelectedRow=id;
myGrid.jqGrid('expandSubGridRow',id);
}else{
myGrid.jqGrid ('collapseSubGridRow', id);
$('#'+id).removeClass('ui-state-highlight');
OldSelectedRow=null;
}
alert('end = '+myGrid.jqGrid('getGridParam','selrow'));
},
subGrid: true,
subGridRowExpanded: function(subgrid_id, row_id) {
//*********************
// 1ST SUBGRID
//*********************
var rowdata = myGrid.jqGrid('getRowData',row_id),
btr=rowdata['b.id'],
subgrid_table_id = subgrid_id+"_a",
pager_id = "p_"+subgrid_table_id;
$("#"+subgrid_id).html("<table id='"+subgrid_table_id+"' class='scroll'></table><div id='"+pager_id+"' class='scroll'></div>");
$("#"+subgrid_table_id).jqGrid({
url:"sg511a.php?id="+row_id+"&btr="+btr,
datatype: "json",
colNames: ['Nature','Information'],
colModel: [
{name:'c.code',index:'c.code', width:150,align:'right',sortable:false},
{name:'p.coeff',index:'p.coeff', width:630,sortable:false}
],
height: '100%',
autowidth:true,
caption:'1 - INFORMATIONS CLIENT',
});
//*********************
// 2ND SUBGRID
//*********************
var clt=rowdata['c.code'],
subgrid_table_id = subgrid_id+"_b",
pager_id = "p_"+subgrid_table_id;
$("#"+subgrid_id).append("<table id='"+subgrid_table_id+"' class='scroll'></table><div id='"+pager_id+"' class='scroll'></div>");
$("#"+subgrid_table_id).jqGrid({
url:"sg511b.php?id="+row_id+"&clt="+clt,
datatype: "json",
colNames: ['Id','X','Civilité','Nom','Prénom','Service'],
colModel: [
{name:'t.id',index:'t.id', width:60, align:"center",hidden:true},
{name:'check',index:'check', width:20,sortable:false,formatter:'checkbox',align:'center',
editable: false, edittype: 'checkbox', editoptions: {value: "true:false", defaultValue: "false"},
formatoptions: {disabled: false}
},
{name:'v.code',index:'v.code', width:60,sortable:false},
{name:'t.nom',index:'t.nom', width:210,sortable:false},
{name:'t.prenom',index:'t.prenom', width:210,sortable:false},
{name:'f.descr',index:'f.descr', width:220,sortable:false}
],
pager: pager_id,
sortname: 't.nom',
hiddengrid:true,
scroll:true,
maxheight: 230,
autowidth:true,
caption:'2 - PERSONNES A CONTACTER',
gridComplete:function(){
OldSelectedRow=null;
sortDataCol(this);
}
});
$("#"+subgrid_table_id).jqGrid('navGrid',"#"+pager_id,{search:false,add:false,edit:false,del:false});
//*********************
// 3TH SUBGRID
//*********************
rowdata = myGrid.jqGrid('getRowData',row_id);
var parc=rowdata['p.id'];
var subgrid_table_id, pager_id;
subgrid_table_id = subgrid_id+"_c";
pager_id = "p_"+subgrid_table_id;
$("#"+subgrid_id).append("<table id='"+subgrid_table_id+"' class='scroll'></table><div id='"+pager_id+"' class='scroll'></div>");
$("#"+subgrid_table_id).jqGrid({
url:"sg511c.php?id="+row_id+"&parc="+parc,
datatype: "json",
colNames: ['Id','Ensemble','Quantité','Article','Désignation','Matière'],
colModel: [
{name:'a.id',index:'a.id', width:60, align:"center",hidden:true},
{name:'c.code',index:'c.code', width:100},
{name:'p.coeff',index:'p.coeff', width:60,align:"center"},
{name:'a.code',index:'a.code', width:80},
{name:'a.descr',index:'a.descr',width:400},
{name:'m.code',index:'m.code', width:80}
],
pager: pager_id,
sortname: 'c.code',
sortorder: "asc",
hiddengrid:true,
rownumbers: true,
rownumWidth: 40,
gridview: true,
scroll:true,
maxheight: 230,
autowidth:true,
onSortCol: function (index, idxcol, sortorder) {
// montre la colonne sélectionnée pour le tri de la grille
if (this.p.lastsort >= 0 && this.p.lastsort !== idxcol
&& this.p.colModel[this.p.lastsort].sortable !== false) {
$(this.grid.headers[this.p.lastsort].el).find(">div.ui-jqgrid-sortable>span.s-ico").show();
$(this.grid.headers[this.p.lastsort].el).removeClass('ui-state-active');
}
$(this.grid.headers[idxcol].el).addClass('ui-state-active');
},
altRows:true,
altclass:'myAltRowClass',
viewrecords: true,
caption:'3 - SPECIFICATIONS TECHNIQUES',
emptyrecords: 'Aucune donnée correspondante...',
});
//*********************
// 4TH SUBGRID
//*********************
rowdata = myGrid.jqGrid('getRowData',row_id);
var parc=rowdata['idref'];
var subgrid_table_id, pager_id;
subgrid_table_id = subgrid_id+"_d";
pager_id = "p_"+subgrid_table_id;
$("#"+subgrid_id).append("<table id='"+subgrid_table_id+"' class='scroll'></table><div id='"+pager_id+"' class='scroll'></div>");
$("#"+subgrid_table_id).jqGrid({
url:"sg511d.php?id="+row_id+"&parc="+parc,
datatype: "json",
colNames: ['Id','Ensemble','Quantité','Article','Désignation','Matière'],
colModel: [
{name:'a.id',index:'a.id', width:60, align:"center",hidden:true},
{name:'c.code',index:'c.code', width:100},
{name:'p.coeff',index:'p.coeff', width:60,align:"center"},
{name:'a.code',index:'a.code', width:80},
{name:'a.descr',index:'a.descr',width:400},
{name:'m.code',index:'m.code', width:80}
],
pager: pager_id,
sortname: 'c.code',
sortorder: "asc",
hiddengrid:true,
rownumbers: true,
rownumWidth: 40,
gridview: true,
scroll:true,
maxheight: 230,
autowidth:true,
onSortCol: function (index, idxcol, sortorder) {
// montre la colonne sélectionnée pour le tri de la grille
if (this.p.lastsort >= 0 && this.p.lastsort !== idxcol
&& this.p.colModel[this.p.lastsort].sortable !== false) {
$(this.grid.headers[this.p.lastsort].el).find(">div.ui-jqgrid-sortable>span.s-ico").show();
$(this.grid.headers[this.p.lastsort].el).removeClass('ui-state-active');
}
$(this.grid.headers[idxcol].el).addClass('ui-state-active');
},
altRows:true,
altclass:'myAltRowClass',
viewrecords: true,
caption:'4 - PIECES A PREPARER',
emptyrecords: 'Aucune donnée correspondante...',
gridComplete:function(){
colModel = $("#"+subgrid_id+'_d').jqGrid('getGridParam', 'colModel');
sortName =$("#"+subgrid_id+'_d').jqGrid('getGridParam', 'sortname');
$('#gbox_' + $.jgrid.jqID($("#"+subgrid_id+'_d')[0].id) +
' tr.ui-jqgrid-labels th.ui-th-column').each(function (i) {
var cmi = colModel[i], colName = cmi.name;
if (cmi.sortable !== false) {
$(this).find('>div.ui-jqgrid-sortable>span.s-ico').show();
} else if (!cmi.sortable && colName !== 'rn' && colName !== 'cb' && colName !== 'subgrid') {
$(this).find('>div.ui-jqgrid-sortable').css({cursor: 'default'});
}
if (cmi.name === sortName) {
$(this).addClass('ui-state-active');
//alert(i);
var gridId = $("#"+subgrid_id+'_d').jqGrid('getDataIDs');
for (var countRow = 0; countRow < gridId .length; countRow ++)
{
var rowId = gridId [countRow ];
var dataFromTheRow = $("#"+subgrid_id+'_d').jqGrid ('getRowData', rowId);
$("#"+subgrid_id+'_d').jqGrid('setCell',rowId, i, '','ui-widget-header');
$("#"+subgrid_id+'_d').jqGrid('setCell',rowId, i, '',{'border-top':0,'border-left':0});
}
}
});
},
});
$("#"+subgrid_table_id).jqGrid('navGrid',"#"+pager_id,{search:false,add:false,edit:false,del:false});
//*********************
// 5TH SUBGRID
//*********************
rowdata = myGrid.jqGrid('getRowData',row_id);
var btr=rowdata['b.id'],lastId='';
var prest=rowdata['btype'];
var nature=rowdata['b.nature'];
var subgrid_table_id, pager_id;
subgrid_table_id = subgrid_id+"_e";
pager_id = "p_"+subgrid_table_id;
$("#"+subgrid_id).append("<table id='"+subgrid_table_id+"' class='scroll'></table><div id='"+pager_id+"' class='scroll'></div>");
$("#"+subgrid_table_id).jqGrid({
url:"sg511e.php?id="+row_id+"&btr="+btr,
datatype:"json",
mType:'POST',
loadui: "disable",
colNames:['id','Prestations','Radio','Checked','Disabled','Select','Informations'],
colModel:[
{name:'id',index:'id',width:100,hidden:true},
{name:'name',index:'name',width:550,sortable:false,
formatter: function (cellvalue,options,rowObject) {
if(rowObject.radio.length==0){
if(rowObject.id.substr(0,1)=='1'){
var check="checked='checked'";
}else{
var check='';
}
if(rowObject.disabled>'0'){
var disabled="disabled";
}else{
var disabled='';
}
var box="<input type='checkbox' class='itmchk' "+check+" "+disabled+"/>";
}else{
var box="<input type='radio' class='itmrad' id='"+rowObject.radio+"' name='"+rowObject.radio+"' "+(rowObject.checked>0?'checked':'')+" />";
}
switch(rowObject.level){
case '0':
var bstyle="<strong>", estyle="</strong>";
break;
case '1':
var bstyle="", estyle="";
break;
default:
var bstyle="<em>", estyle="</em>";
}
return box + bstyle + $.jgrid.htmlEncode(cellvalue) + estyle;
}
},
{name:'radio',index:'radio',width:30,sortable:false,hidden:true},
{name:'checked',index:'checked',width:30,sortable:false,hidden:true},
{name:'disabled',index:'disabled',width:30,sortable:false,hidden:true},
{name:'select',index:'select',width:200,sortable:false,hidden:true},
{name:'data',index:'data',width:230,sortable:false,
formatter: function (cellvalue,options,rowObject) {
var cell='';
if(rowObject.select>" "){
var tab=rowObject.select.split("|");
var id=rowObject.id.substr(0,1);
cell="<select class='itmsel'>";
for(var i=0;i<tab.length;i++){
var fld=tab[i].split(';');
var opt="<option value='"+fld[0]+"' class='myAltRowClass1"+id+"'";
if(i==0){
opt+=" style='font-style:italic;'";
}else{
opt+=" style='color:red;'";
}
opt+=">"+(i>0?' • ':'')+fld[1]+"</option>";
cell+=opt;
}
cell+='</select>';
}
return cell;
}
}
],
sortname: 'id',
sortorder: "asc",
hiddengrid:true,
gridview: true,
treeGrid:true,
pager:pager_id,
treeGridModel: "adjacency",
treedatatype: 'json',
ExpandColumn: 'name',
jsonReader: {
repeatitems: false,
root: function (obj) { return obj; },
page: function (obj) { return 1; },
total: function (obj) { return 1; },
records: function (obj) { return obj.length; }
},
scroll:true,
autowidth:true,
height: 230,
loadComplete: function() {
var grid = this;
resetAltRows.call(this);
$(this).find('tr.jqgrow td div.treeclick').click(function(){
resetAltRows.call(grid);
});
$(this).find('tr.jqgrow td span.cell-wrapper').click(function(){
resetAltRows.call(grid);
});
$("#"+subgrid_table_id).jqGrid('setLabel', 'name', '<b>'+nature+' - '+prest+'</b>');
//
},
beforeSelectRow: function (rowid, e) {
var $this = $(this),
isLeafName = $this.jqGrid("getGridParam", "treeReader").leaf_field,
localIdName = $this.jqGrid("getGridParam", "localReader").id,
localData,
state,
setCheckedStateOfChildrenItems = function (children) {
$.each(children, function () {
$("#" + this[localIdName] + " input.itmchk").prop("checked", state);
if (!this[isLeafName]) {
setCheckedStateOfChildrenItems($this.jqGrid("getNodeChildren", this));
}
});
};
if (e.target.nodeName === "INPUT" && $(e.target).hasClass("itmchk")) {
state = $(e.target).prop("checked");
localData = $this.jqGrid("getLocalRow", rowid);
setCheckedStateOfChildrenItems($this.jqGrid("getNodeChildren", localData), state);
}
},
onSortCol: function (index, idxcol, sortorder) {
// montre la colonne sélectionnée pour le tri de la grille
if (this.p.lastsort >= 0 && this.p.lastsort !== idxcol
&& this.p.colModel[this.p.lastsort].sortable !== false) {
$(this.grid.headers[this.p.lastsort].el).find(">div.ui-jqgrid-sortable>span.s-ico").show();
$(this.grid.headers[this.p.lastsort].el).removeClass('ui-state-active');
}
$(this.grid.headers[idxcol].el).addClass('ui-state-active');
},
caption:'5 - TRAVAUX A EFFECTUER',
});
$("#"+subgrid_table_id).jqGrid('navGrid',"#"+pager_id,{search:false,add:false,edit:false,del:false});
//*********************
// 6TH SUBGRID
//*********************
rowdata = myGrid.jqGrid('getRowData',row_id);
var parc=rowdata['p.id'];
var subgrid_table_id, pager_id;
subgrid_table_id = subgrid_id+"_f";
pager_id = "p_"+subgrid_table_id;
$("#"+subgrid_id).append("<table id='"+subgrid_table_id+"' class='scroll'></table><div id='"+pager_id+"' class='scroll'></div>");
$("#"+subgrid_table_id).jqGrid({
url:"sg511f.php?id="+row_id+"&parc="+parc,
datatype: "json",
colNames: ['Id','Ensemble','Quantité','Article','Désignation','Matière'],
colModel: [
{name:'a.id',index:'a.id', width:60, align:"center",hidden:true},
{name:'c.code',index:'c.code', width:100},
{name:'p.coeff',index:'p.coeff', width:60,align:"center"},
{name:'a.code',index:'a.code', width:80},
{name:'a.descr',index:'a.descr',width:400},
{name:'m.code',index:'m.code', width:80}
],
pager: pager_id,
sortname: 'c.code',
sortorder: "asc",
hiddengrid:true,
rownumbers: true,
rownumWidth: 40,
gridview: true,
scroll:true,
maxheight: 230,
autowidth:true,
onSortCol: function (index, idxcol, sortorder) {
// montre la colonne sélectionnée pour le tri de la grille
if (this.p.lastsort >= 0 && this.p.lastsort !== idxcol
&& this.p.colModel[this.p.lastsort].sortable !== false) {
$(this.grid.headers[this.p.lastsort].el).find(">div.ui-jqgrid-sortable>span.s-ico").show();
$(this.grid.headers[this.p.lastsort].el).removeClass('ui-state-active');
}
$(this.grid.headers[idxcol].el).addClass('ui-state-active');
},
altRows:true,
altclass:'myAltRowClass',
viewrecords: true,
caption:'6 - INTERVENANTS',
emptyrecords: 'Aucune donnée correspondante...',
});
$("#"+subgrid_table_id).jqGrid('navGrid',"#"+pager_id,{search:false,add:false,edit:false,del:false});
$("#"+subgrid_table_id).jqGrid('filterToolbar',{stringResult: true,searchOnEnter : false});
// montre la colonne triée au chargement des données
colModel = $("#"+subgrid_table_id).jqGrid('getGridParam', 'colModel');
sortName = $("#"+subgrid_table_id).jqGrid('getGridParam', 'sortname');
$('#gbox_' + $.jgrid.jqID($("#"+subgrid_table_id)[0].id) +
' tr.ui-jqgrid-labels th.ui-th-column').each(function (i) {
var cmi = colModel[i], colName = cmi.name;
if (cmi.sortable !== false) {
$(this).find('>div.ui-jqgrid-sortable>span.s-ico').show();
} else if (!cmi.sortable && colName !== 'rn' && colName !== 'cb' && colName !== 'subgrid') {
$(this).find('>div.ui-jqgrid-sortable').css({cursor: 'default'});
}
if (cmi.name === sortName) {
$(this).addClass('ui-state-active');
}
});
//*********************
// 7TH SUBGRID
//*********************
rowdata = myGrid.jqGrid('getRowData',row_id);
var parc=rowdata['p.id'];
var subgrid_table_id, pager_id;
subgrid_table_id = subgrid_id+"_g";
pager_id = "p_"+subgrid_table_id;
$("#"+subgrid_id).append("<table id='"+subgrid_table_id+"' class='scroll'></table><div id='"+pager_id+"' class='scroll'></div>");
$("#"+subgrid_table_id).jqGrid({
url:"sg511g.php?id="+row_id+"&parc="+parc,
datatype: "json",
colNames: ['Id','Ensemble','Quantité','Article','Désignation','Matière'],
colModel: [
{name:'a.id',index:'a.id', width:60, align:"center",hidden:true},
{name:'c.code',index:'c.code', width:100},
{name:'p.coeff',index:'p.coeff', width:60,align:"center"},
{name:'a.code',index:'a.code', width:80},
{name:'a.descr',index:'a.descr',width:400},
{name:'m.code',index:'m.code', width:80}
],
pager: pager_id,
sortname: 'c.code',
sortorder: "asc",
hiddengrid:true,
rownumbers: true,
rownumWidth: 40,
gridview: true,
scroll:true,
maxheight: 230,
autowidth:true,
onSortCol: function (index, idxcol, sortorder) {
// montre la colonne sélectionnée pour le tri de la grille
if (this.p.lastsort >= 0 && this.p.lastsort !== idxcol
&& this.p.colModel[this.p.lastsort].sortable !== false) {
$(this.grid.headers[this.p.lastsort].el).find(">div.ui-jqgrid-sortable>span.s-ico").show();
$(this.grid.headers[this.p.lastsort].el).removeClass('ui-state-active');
}
$(this.grid.headers[idxcol].el).addClass('ui-state-active');
},
altRows:true,
altclass:'myAltRowClass',
viewrecords: true,
caption:'7 - PLAN DE PREVENTION',
emptyrecords: 'Aucune donnée correspondante...',
});
$("#"+subgrid_table_id).jqGrid('navGrid',"#"+pager_id,{search:false,add:false,edit:false,del:false});
$("#"+subgrid_table_id).jqGrid('filterToolbar',{stringResult: true,searchOnEnter : false});
var subgridg="#"+subgrid_id;
// #tab_51_1;
var chaine='abcdefg';
$(".ui-jqgrid-titlebar",subgridg).click(function(){
var titlebar=this;
var clicked=chaine.indexOf($(titlebar).parent().attr('id').substr(-1));
// id is 'tab51_1_a' so clicked is 0
var depart=$(titlebar).parent().parent().parent().attr('id');
// I run my search from id 'tab51_1' class 'tablediv'
$('#'+depart).find('.ui-jqgrid-view').each(function(idx){
if(idx==clicked){
$(".ui-jqgrid-titlebar-close", titlebar).click();
}else{
if(typeof $(subgridg).find('.ui-jqgrid-bdiv:eq('+idx+')').css('display')=='undefined'||$(subgridg).find('.ui-jqgrid-bdiv:eq('+idx+')').css('display')=='block'){
$(subgridg).find(".ui-jqgrid-titlebar-close:eq("+idx+")").click();
}
}
});
});
},
subGridRowColapsed: function(subgrid_id, row_id) {
$("#"+subgrid_id+"_a").remove();
$("#"+subgrid_id+"_b").remove();
$("#"+subgrid_id+"_c").remove();
$("#"+subgrid_id+"_d").remove();
$("#"+subgrid_id+"_e").remove();
$("#"+subgrid_id+"_f").remove();
$("#"+subgrid_id+"_g").remove();
myGrid.jqGrid('resetSelection');
}
});});
where I don't use any subGridOptions so I think that false is the defaultValue of reloadOnExpand.
I have added in OnSelectedRow function 2 alerts, at beginning and ending of function.
The first click display fine selrows for begin and end, but for next click, the end alert displays 'null'.
I have tried also to delete all parts into 'subGridRowExpanded' and 'subGridRowColapsed' functions.
The trouble doesn't happen, begin and end selrows are fine and I can edit row as I want.
Inner workings of jqGrid seem very complicate for me as I'm not used to work with it, and I have to thank you one more time for all time you spend for helping noobs as me. You are always right in your comments and I hope you will be for long time on this forum.
Thanks again. Have a nice day. JiheL
UPDATED 2013-04-22
After applying all suggests from Oleg, I made some changes in the 20 scripts of my app, which all are built in the same way.
For this subject, here is the small part of onSelectRow I changed :
onSelectRow:function(id){
var expanded = $("td.sgexpanded", myGrid)[0];
if(expanded){
$(expanded).trigger("click").parent().removeClass('ui-state-highlight');
}
myGrid.jqGrid('expandSubGridRow',id);
$('#'+id).addClass('ui-state-highlight');
alert(id+' '+myGrid.jqGrid('getGridParam','selrow'));
},
but no more luck for the result, I can't edit a row which has been expanded after collapse other row. I don't understand why selrow changes after collapse old row and expand selected row.
I hope someone could drive me about this trouble, I think I'm not alone to meet this problem.
Many thanks in advance for your kind help, really appreciated. JiheL
UPDATED 2013-04-23
After applying Oleg's suggests the main problem (edit an expanded row after collapsing other) seems to be solved. But setting selected row to top of grid runs fine with five first rows, but not with following rows. Strange ! Here is a snapshot of fact :
Strange because demo in http://jsfiddle.net/jihel/JMcKF/ runs fine and has been created with my app code ! I'm searching what can be wrong or alter scrollTop, if someone has already met such a trouble and have an idea for solving, many thanks for all your help. Have a nice day
It's difficult to analyse so long code. So I post just some comments about the potential problems which I can see in the code after I looked through it.
The main problem which I see: you should use idPrefix option in all subgrids (or in the main grid and subgrid). The value of idPrefix option option should depend on rowid where the subgrid will be opened. For example you can use
idPrefix: "s_" + row_id + "_a_"
for the first subgrid, idPrefix: "s_" + row_id + "_b_" for the second subgrid and so on.
I recommend you don't use . (dot) or any other meta-characters in the column name. It's origin of potential errors in your code and in the code of jqGrid. You should understand that the name property will be used to build id attributes of some internal elements of jqGrid. There are some restrictions in CSS which characters are permitted in id attribute. Additionally jqGrid have to build selectors to get the corresponding elements from the page. For example $("#" + rowid) will be wrong selector if rowid includes . because the selector ("#a.b") will be interpreted as: element with id=a and the class b instead of id="a.b". Old versions of jqGrid don't worked at all with such ids and such names. Recent version of jqGrid should works, but nevertheless usage of meta-characters in ids increase the complexity of the code in many time. Do you really need it?
Because of almost the same problem I don't recommend you to use the same name property for different tables. It could be important if you plan to use searching filter for multiple grids or subgrids (to use filterToolbar for multiple grids). Currently you use 'c.code' for example in multiple subgrids which is potential origin of the future problems.
If you really need to use . for searching and you use datatype: "json" without loadonce: true then you can use index which has . and name which has no .. For example you can use name: 'b_id', index: 'b.id'. If you use index value which is the same as the value of name property, it's recommended to remove index property from the column definition.
Additionally I would don't recommend to use scroll:true option of jqGrid. In general virtual scrolling is nice feature, but in my opinion the implementation of virtual scrolling have many bugs abd side effects. So I recommend don't use it. If you really hardly need the feature then you should use it in the form scroll:1 and you have to invest more time in the debugging.
The last remark: I don't recommend usage of gridComplete. I recommend to use loadComplete instead. See the answer for more details.
The last remark: i recommend to use gridview: true in all grids and subgrids which you use.
UPDATED: I am not sure that I full understand which behavior you want to implement in onSelectRow, but the following implementation
onSelectRow: function (rowid) {
var $self = $(this),
$this = $("#" + $.jgrid.jqID(rowid)), // the row
$expanded = $self.find("td.sgexpanded");
if ($expanded.length > 0) {
$expanded.trigger("click");
}
$self.jqGrid("expandSubGridRow", rowid);
$self.jqGrid("setSelection", rowid, false);
$this.closest(".ui-jqgrid-bdiv").scrollTop($this.position().top);
}

jqgrid, alert with arror after failet add record to database

it's my code:
<script type="text/javascript">
var grid = $("#list");
$(function(){
var grid = $("#list");
grid.jqGrid({
url:'grid.php',
datatype: 'xml',
mtype: 'GET',
colNames:['ID sprzętu','Kod sprzętu', 'Właściciel','Konfiguracja'],
colModel :[
{name:'SprzetID', index:'SprzetID', width:90},
{name:'Kod', index:'Kod', width:120, editable: true},
{name:'Wlasciciel', index:'Wlasciciel', width:200, align:'left', editable: true},
{name:'Konfiguracja', index:'Konfiguracja', width:400, align:'left', editable: true},
],
pager: '#pager',
rowNum:10,
rowList:[10,20,30],
sortname: 'SprzetID',
sortorder: 'asc',
viewrecords: true,
gridview: true,
caption: 'Lista sprzętu'
});
grid.jqGrid('navGrid','#pager',
{add: true, edit: true, del: true, search: true}, //options
{width:400, }, // edit options
{width:400,closeAfterAdd: true, url:'add.php'}, // add options
{reloadAfterSubmit:false}, // del options
{width:600} // search options
);
});
All is great, when adding record to database is correctly, but when for example field "Kod" is duplicate (it's unique field), record can't be add to database... and isn't. I want to display alert with error message, but I can't find in documentation how to do it... I gues,I should use "afterSubmit", but how... I don't know.
Resolved. In add parameters I added code:
afterSubmit: function(response, postdata) {
if(response.responseText != ""){
return [false, response.responseText];
}else{
return [true,"Ok"];
}}

JQGrid : subgrid as a GRID with a navigation bar

I am using JQGrid and displaying subGrid as a JQGRID itself.
I was wondering if there is a way to display the navigation bar for the subgrid too.
I tried following the way its being done for JQGrid, but in vain.
Thanks in advance!
Make sure that in the subGrid jqGRid function you also set the pager property to the pager id in the subgrid
... subGrid: true,
subGridRowExpanded: function(subgrid_id, row_id)
{
var subgrid_table_id;
var pager_id;
subgrid_table_id = subgrid_id+"_t";
pager_id = "p_"+subgrid_table_id;
$("#" + subgrid_id).html("<table id='"+subgrid_table_id+"' class='scroll'></table><div id='"+ pager_id +"' class='scroll'></div>");
$("#" + subgrid_table_id).jqGrid({
url:"ListSub/"+ row_id,
datatype: "json",
colNames: ['Street1','Street2','Street3','Zip','Place','Country'],
colModel:
[
{name:"Street1",index:"Street1",width:80,key:true, editable:true},
{name:"Street2",index:"Street2",width:130, editable:true},
{name:"Street3",index:"Street3",width:80,align:"right", editable:true},
{name:"Zip",index:"Zip",width:80,align:"right", editable:true},
{name:"Place",index:"Place",width:100,align:"right", editable:true},
{name:"Country",index:"Country",width:100,align:"right", editable:true}
],
caption: "Offices",
height: "100%",
rowNum:10,
sortname: 'Street1',
sortorder: "asc",
pager:pager_id
});
jQuery("#"+subgrid_table_id).jqGrid('navGrid',"#"+pager_id,{edit:false,add:false,del:false,search:false})
}....
subGrid: true,
subGridRowExpanded: function(ParentGridID, rowid) {
var datagridSub, navGrid;
SubGridID = ParentGridID+"_t";
//alert(rowid);
navGrid = "p_"+datagridSub;
$("#"+ParentGridID).html("<table id='"+SubGridID+"' class='scroll'></table><div id='"+PagerID+"' class='scroll'></div>");
jQuery("#"+SubGridID).jqGrid({
url:'service url'+rowid,
datatype: "json",
type: "GET",
colNames: ['Id','MID','VendorCode1','VendorCode2','Percentage'],
width:700,
colModel: [
{name:"id",index:"id",width:30},
{name:"mid",index:"mid",width:30},
{name:"vendorcode1",index:"vendorcode1",width:40},
{name:"vendorcode2",index:"vendorcode2",width:40},
{name:"percentage",index:"percentage",width:70}
],
jsonReader: {
repeatitems: false, // To Bind the Data in Grid, if it is JSON format.
id: "id",
root: function (obj) { return obj; } // To Bind the Data in Grid.
// page: function () { return 1; },
//total: function () { return 1; },
//records: function (obj) { return obj.length; },
},
rowNum:20,
pager: '#PagerID',
sortname: 'num',
sortorder: "asc",
postData: {id: rowid},
height: '120%',
});
}

Resources