123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- /*jshint eqeqeq:false */
- /*global jQuery */
- (function($){
- /**
- * jqGrid extension for SubGrid Data
- * Tony Tomov tony@trirand.com
- * http://trirand.com/blog/
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl-2.0.html
- **/
- "use strict";
- $.jgrid.extend({
- setSubGrid : function () {
- return this.each(function (){
- var $t = this, cm, i,
- suboptions = {
- plusicon : "ui-icon-plus",
- minusicon : "ui-icon-minus",
- openicon: "ui-icon-carat-1-sw",
- expandOnLoad: false,
- delayOnLoad : 50,
- selectOnExpand : false,
- selectOnCollapse : false,
- reloadOnExpand : true
- };
- $t.p.subGridOptions = $.extend(suboptions, $t.p.subGridOptions || {});
- $t.p.colNames.unshift("");
- $t.p.colModel.unshift({name:'subgrid',width: $.jgrid.cell_width ? $t.p.subGridWidth+$t.p.cellLayout : $t.p.subGridWidth,sortable: false,resizable:false,hidedlg:true,search:false,fixed:true});
- cm = $t.p.subGridModel;
- if(cm[0]) {
- cm[0].align = $.extend([],cm[0].align || []);
- for(i=0;i<cm[0].name.length;i++) { cm[0].align[i] = cm[0].align[i] || 'left';}
- }
- });
- },
- addSubGridCell :function (pos,iRow) {
- var prp='',ic,sid;
- this.each(function(){
- prp = this.formatCol(pos,iRow);
- sid= this.p.id;
- ic = this.p.subGridOptions.plusicon;
- });
- return "<td role=\"gridcell\" aria-describedby=\""+sid+"_subgrid\" class=\"ui-sgcollapsed sgcollapsed\" "+prp+"><a style='cursor:pointer;'><span class='ui-icon "+ic+"'></span></a></td>";
- },
- addSubGrid : function( pos, sind ) {
- return this.each(function(){
- var ts = this;
- if (!ts.grid ) { return; }
- //-------------------------
- var subGridCell = function(trdiv,cell,pos)
- {
- var tddiv = $("<td align='"+ts.p.subGridModel[0].align[pos]+"'></td>").html(cell);
- $(trdiv).append(tddiv);
- };
- var subGridXml = function(sjxml, sbid){
- var tddiv, i, sgmap,
- dummy = $("<table cellspacing='0' cellpadding='0' border='0'><tbody></tbody></table>"),
- trdiv = $("<tr></tr>");
- for (i = 0; i<ts.p.subGridModel[0].name.length; i++) {
- tddiv = $("<th class='ui-state-default ui-th-subgrid ui-th-column ui-th-"+ts.p.direction+"'></th>");
- $(tddiv).html(ts.p.subGridModel[0].name[i]);
- $(tddiv).width( ts.p.subGridModel[0].width[i]);
- $(trdiv).append(tddiv);
- }
- $(dummy).append(trdiv);
- if (sjxml){
- sgmap = ts.p.xmlReader.subgrid;
- $(sgmap.root+" "+sgmap.row, sjxml).each( function(){
- trdiv = $("<tr class='ui-widget-content ui-subtblcell'></tr>");
- if(sgmap.repeatitems === true) {
- $(sgmap.cell,this).each( function(i) {
- subGridCell(trdiv, $(this).text() || ' ',i);
- });
- } else {
- var f = ts.p.subGridModel[0].mapping || ts.p.subGridModel[0].name;
- if (f) {
- for (i=0;i<f.length;i++) {
- subGridCell(trdiv, $(f[i],this).text() || ' ',i);
- }
- }
- }
- $(dummy).append(trdiv);
- });
- }
- var pID = $("table:first",ts.grid.bDiv).attr("id")+"_";
- $("#"+$.jgrid.jqID(pID+sbid)).append(dummy);
- ts.grid.hDiv.loading = false;
- $("#load_"+$.jgrid.jqID(ts.p.id)).hide();
- return false;
- };
- var subGridJson = function(sjxml, sbid){
- var tddiv,result,i,cur, sgmap,j,
- dummy = $("<table cellspacing='0' cellpadding='0' border='0'><tbody></tbody></table>"),
- trdiv = $("<tr></tr>");
- for (i = 0; i<ts.p.subGridModel[0].name.length; i++) {
- tddiv = $("<th class='ui-state-default ui-th-subgrid ui-th-column ui-th-"+ts.p.direction+"'></th>");
- $(tddiv).html(ts.p.subGridModel[0].name[i]);
- $(tddiv).width( ts.p.subGridModel[0].width[i]);
- $(trdiv).append(tddiv);
- }
- $(dummy).append(trdiv);
- if (sjxml){
- sgmap = ts.p.jsonReader.subgrid;
- result = $.jgrid.getAccessor(sjxml, sgmap.root);
- if ( result !== undefined ) {
- for (i=0;i<result.length;i++) {
- cur = result[i];
- trdiv = $("<tr class='ui-widget-content ui-subtblcell'></tr>");
- if(sgmap.repeatitems === true) {
- if(sgmap.cell) { cur=cur[sgmap.cell]; }
- for (j=0;j<cur.length;j++) {
- subGridCell(trdiv, cur[j] || ' ',j);
- }
- } else {
- var f = ts.p.subGridModel[0].mapping || ts.p.subGridModel[0].name;
- if(f.length) {
- for (j=0;j<f.length;j++) {
- subGridCell(trdiv, cur[f[j]] || ' ',j);
- }
- }
- }
- $(dummy).append(trdiv);
- }
- }
- }
- var pID = $("table:first",ts.grid.bDiv).attr("id")+"_";
- $("#"+$.jgrid.jqID(pID+sbid)).append(dummy);
- ts.grid.hDiv.loading = false;
- $("#load_"+$.jgrid.jqID(ts.p.id)).hide();
- return false;
- };
- var populatesubgrid = function( rd )
- {
- var sid,dp, i, j;
- sid = $(rd).attr("id");
- dp = {nd_: (new Date().getTime())};
- dp[ts.p.prmNames.subgridid]=sid;
- if(!ts.p.subGridModel[0]) { return false; }
- if(ts.p.subGridModel[0].params) {
- for(j=0; j < ts.p.subGridModel[0].params.length; j++) {
- for(i=0; i<ts.p.colModel.length; i++) {
- if(ts.p.colModel[i].name === ts.p.subGridModel[0].params[j]) {
- dp[ts.p.colModel[i].name]= $("td:eq("+i+")",rd).text().replace(/\ \;/ig,'');
- }
- }
- }
- }
- if(!ts.grid.hDiv.loading) {
- ts.grid.hDiv.loading = true;
- $("#load_"+$.jgrid.jqID(ts.p.id)).show();
- if(!ts.p.subgridtype) { ts.p.subgridtype = ts.p.datatype; }
- if($.isFunction(ts.p.subgridtype)) {
- ts.p.subgridtype.call(ts, dp);
- } else {
- ts.p.subgridtype = ts.p.subgridtype.toLowerCase();
- }
- switch(ts.p.subgridtype) {
- case "xml":
- case "json":
- $.ajax($.extend({
- type:ts.p.mtype,
- url: $.isFunction(ts.p.subGridUrl) ? ts.p.subGridUrl.call(ts, dp) : ts.p.subGridUrl,
- dataType:ts.p.subgridtype,
- data: $.isFunction(ts.p.serializeSubGridData)? ts.p.serializeSubGridData.call(ts, dp) : dp,
- complete: function(sxml) {
- if(ts.p.subgridtype === "xml") {
- subGridXml(sxml.responseXML, sid);
- } else {
- subGridJson($.jgrid.parse(sxml.responseText),sid);
- }
- sxml=null;
- }
- }, $.jgrid.ajaxOptions, ts.p.ajaxSubgridOptions || {}));
- break;
- }
- }
- return false;
- };
- var _id, pID,atd, nhc=0, bfsc, r;
- $.each(ts.p.colModel,function(){
- if(this.hidden === true || this.name === 'rn' || this.name === 'cb') {
- nhc++;
- }
- });
- var len = ts.rows.length, i=1;
- if( sind !== undefined && sind > 0) {
- i = sind;
- len = sind+1;
- }
- while(i < len) {
- if($(ts.rows[i]).hasClass('jqgrow')) {
- if(ts.p.scroll) {
- $(ts.rows[i].cells[pos]).unbind('click');
- }
- $(ts.rows[i].cells[pos]).bind('click', function() {
- var tr = $(this).parent("tr")[0];
- r = tr.nextSibling;
- if($(this).hasClass("sgcollapsed")) {
- pID = ts.p.id;
- _id = tr.id;
- if(ts.p.subGridOptions.reloadOnExpand === true || ( ts.p.subGridOptions.reloadOnExpand === false && !$(r).hasClass('ui-subgrid') ) ) {
- atd = pos >=1 ? "<td colspan='"+pos+"'> </td>":"";
- bfsc = $(ts).triggerHandler("jqGridSubGridBeforeExpand", [pID + "_" + _id, _id]);
- bfsc = (bfsc === false || bfsc === 'stop') ? false : true;
- if(bfsc && $.isFunction(ts.p.subGridBeforeExpand)) {
- bfsc = ts.p.subGridBeforeExpand.call(ts, pID+"_"+_id,_id);
- }
- if(bfsc === false) {return false;}
- $(tr).after( "<tr role='row' class='ui-subgrid'>"+atd+"<td class='ui-widget-content subgrid-cell'><span class='ui-icon "+ts.p.subGridOptions.openicon+"'></span></td><td colspan='"+parseInt(ts.p.colNames.length-1-nhc,10)+"' class='ui-widget-content subgrid-data'><div id="+pID+"_"+_id+" class='tablediv'></div></td></tr>" );
- $(ts).triggerHandler("jqGridSubGridRowExpanded", [pID + "_" + _id, _id]);
- if( $.isFunction(ts.p.subGridRowExpanded)) {
- ts.p.subGridRowExpanded.call(ts, pID+"_"+ _id,_id);
- } else {
- populatesubgrid(tr);
- }
- } else {
- $(r).show();
- }
- $(this).html("<a style='cursor:pointer;'><span class='ui-icon "+ts.p.subGridOptions.minusicon+"'></span></a>").removeClass("sgcollapsed").addClass("sgexpanded");
- if(ts.p.subGridOptions.selectOnExpand) {
- $(ts).jqGrid('setSelection',_id);
- }
- } else if($(this).hasClass("sgexpanded")) {
- bfsc = $(ts).triggerHandler("jqGridSubGridRowColapsed", [pID + "_" + _id, _id]);
- bfsc = (bfsc === false || bfsc === 'stop') ? false : true;
- _id = tr.id;
- if( bfsc && $.isFunction(ts.p.subGridRowColapsed)) {
- bfsc = ts.p.subGridRowColapsed.call(ts, pID+"_"+_id,_id );
- }
- if(bfsc===false) {return false;}
- if(ts.p.subGridOptions.reloadOnExpand === true) {
- $(r).remove(".ui-subgrid");
- } else if($(r).hasClass('ui-subgrid')) { // incase of dynamic deleting
- $(r).hide();
- }
- $(this).html("<a style='cursor:pointer;'><span class='ui-icon "+ts.p.subGridOptions.plusicon+"'></span></a>").removeClass("sgexpanded").addClass("sgcollapsed");
- if(ts.p.subGridOptions.selectOnCollapse) {
- $(ts).jqGrid('setSelection',_id);
- }
- }
- return false;
- });
- }
- i++;
- }
- if(ts.p.subGridOptions.expandOnLoad === true) {
- $(ts.rows).filter('.jqgrow').each(function(index,row){
- $(row.cells[0]).click();
- });
- }
- ts.subGridXml = function(xml,sid) {subGridXml(xml,sid);};
- ts.subGridJson = function(json,sid) {subGridJson(json,sid);};
- });
- },
- expandSubGridRow : function(rowid) {
- return this.each(function () {
- var $t = this;
- if(!$t.grid && !rowid) {return;}
- if($t.p.subGrid===true) {
- var rc = $(this).jqGrid("getInd",rowid,true);
- if(rc) {
- var sgc = $("td.sgcollapsed",rc)[0];
- if(sgc) {
- $(sgc).trigger("click");
- }
- }
- }
- });
- },
- collapseSubGridRow : function(rowid) {
- return this.each(function () {
- var $t = this;
- if(!$t.grid && !rowid) {return;}
- if($t.p.subGrid===true) {
- var rc = $(this).jqGrid("getInd",rowid,true);
- if(rc) {
- var sgc = $("td.sgexpanded",rc)[0];
- if(sgc) {
- $(sgc).trigger("click");
- }
- }
- }
- });
- },
- toggleSubGridRow : function(rowid) {
- return this.each(function () {
- var $t = this;
- if(!$t.grid && !rowid) {return;}
- if($t.p.subGrid===true) {
- var rc = $(this).jqGrid("getInd",rowid,true);
- if(rc) {
- var sgc = $("td.sgcollapsed",rc)[0];
- if(sgc) {
- $(sgc).trigger("click");
- } else {
- sgc = $("td.sgexpanded",rc)[0];
- if(sgc) {
- $(sgc).trigger("click");
- }
- }
- }
- }
- });
- }
- });
- })(jQuery);
|