123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497 |
- var detailview = $.extend({}, $.fn.datagrid.defaults.view, {
- render: function(target, container, frozen){
- var state = $.data(target, 'datagrid');
- var opts = state.options;
- if (frozen){
- if (!(opts.rownumbers || (opts.frozenColumns && opts.frozenColumns.length))){
- return;
- }
- }
-
- var rows = state.data.rows;
- var fields = $(target).datagrid('getColumnFields', frozen);
- var table = [];
- table.push('<table class="datagrid-btable" cellspacing="0" cellpadding="0" border="0"><tbody>');
- for(var i=0; i<rows.length; i++) {
- // get the class and style attributes for this row
- var css = opts.rowStyler ? opts.rowStyler.call(target, i, rows[i]) : '';
- var classValue = '';
- var styleValue = '';
- if (typeof css == 'string'){
- styleValue = css;
- } else if (css){
- classValue = css['class'] || '';
- styleValue = css['style'] || '';
- }
-
- var cls = 'class="datagrid-row ' + (i % 2 && opts.striped ? 'datagrid-row-alt ' : ' ') + classValue + '"';
- var style = styleValue ? 'style="' + styleValue + '"' : '';
- var rowId = state.rowIdPrefix + '-' + (frozen?1:2) + '-' + i;
- table.push('<tr id="' + rowId + '" datagrid-row-index="' + i + '" ' + cls + ' ' + style + '>');
- table.push(this.renderRow.call(this, target, fields, frozen, i, rows[i]));
- table.push('</tr>');
-
- table.push('<tr style="display:none;">');
- if (frozen){
- table.push('<td colspan=' + (fields.length+(opts.rownumbers?1:0)) + ' style="border-right:0">');
- } else {
- table.push('<td colspan=' + (fields.length) + '>');
- }
- table.push('<div class="datagrid-row-detail">');
- if (frozen){
- table.push(' ');
- } else {
- table.push(opts.detailFormatter.call(target, i, rows[i]));
- }
- table.push('</div>');
- table.push('</td>');
- table.push('</tr>');
-
- }
- table.push('</tbody></table>');
-
- $(container).html(table.join(''));
- },
-
- renderRow: function(target, fields, frozen, rowIndex, rowData){
- var opts = $.data(target, 'datagrid').options;
-
- var cc = [];
- if (frozen && opts.rownumbers){
- var rownumber = rowIndex + 1;
- if (opts.pagination){
- rownumber += (opts.pageNumber-1)*opts.pageSize;
- }
- cc.push('<td class="datagrid-td-rownumber"><div class="datagrid-cell-rownumber">'+rownumber+'</div></td>');
- }
- for(var i=0; i<fields.length; i++){
- var field = fields[i];
- var col = $(target).datagrid('getColumnOption', field);
- if (col){
- var value = rowData[field]; // the field value
- var css = col.styler ? (col.styler(value, rowData, rowIndex)||'') : '';
- var classValue = '';
- var styleValue = '';
- if (typeof css == 'string'){
- styleValue = css;
- } else if (cc){
- classValue = css['class'] || '';
- styleValue = css['style'] || '';
- }
- var cls = classValue ? 'class="' + classValue + '"' : '';
- var style = col.hidden ? 'style="display:none;' + styleValue + '"' : (styleValue ? 'style="' + styleValue + '"' : '');
-
- cc.push('<td field="' + field + '" ' + cls + ' ' + style + '>');
-
- if (col.checkbox){
- style = '';
- } else if (col.expander){
- style = "text-align:center;height:16px;";
- } else {
- style = styleValue;
- if (col.align){style += ';text-align:' + col.align + ';'}
- if (!opts.nowrap){
- style += ';white-space:normal;height:auto;';
- } else if (opts.autoRowHeight){
- style += ';height:auto;';
- }
- }
-
- cc.push('<div style="' + style + '" ');
- if (col.checkbox){
- cc.push('class="datagrid-cell-check ');
- } else {
- cc.push('class="datagrid-cell ' + col.cellClass);
- }
- cc.push('">');
-
- if (col.checkbox){
- cc.push('<input type="checkbox" name="' + field + '" value="' + (value!=undefined ? value : '') + '">');
- } else if (col.expander) {
- //cc.push('<div style="text-align:center;width:16px;height:16px;">');
- cc.push('<span class="datagrid-row-expander datagrid-row-expand" style="display:inline-block;width:16px;height:16px;cursor:pointer;" />');
- //cc.push('</div>');
- } else if (col.formatter){
- cc.push(col.formatter(value, rowData, rowIndex));
- } else {
- cc.push(value);
- }
-
- cc.push('</div>');
- cc.push('</td>');
- }
- }
- return cc.join('');
- },
-
- insertRow: function(target, index, row){
- var opts = $.data(target, 'datagrid').options;
- var dc = $.data(target, 'datagrid').dc;
- var panel = $(target).datagrid('getPanel');
- var view1 = dc.view1;
- var view2 = dc.view2;
-
- var isAppend = false;
- var rowLength = $(target).datagrid('getRows').length;
- if (rowLength == 0){
- $(target).datagrid('loadData',{total:1,rows:[row]});
- return;
- }
-
- if (index == undefined || index == null || index >= rowLength) {
- index = rowLength;
- isAppend = true;
- this.canUpdateDetail = false;
- }
-
- $.fn.datagrid.defaults.view.insertRow.call(this, target, index, row);
-
- _insert(true);
- _insert(false);
-
- this.canUpdateDetail = true;
-
- function _insert(frozen){
- var v = frozen ? view1 : view2;
- var tr = v.find('tr[datagrid-row-index='+index+']');
-
- if (isAppend){
- var newDetail = tr.next().clone();
- tr.insertAfter(tr.next());
- } else {
- var newDetail = tr.next().next().clone();
- }
- newDetail.insertAfter(tr);
- newDetail.hide();
- if (!frozen){
- newDetail.find('div.datagrid-row-detail').html(opts.detailFormatter.call(target, index, row));
- }
- }
- },
-
- deleteRow: function(target, index){
- var opts = $.data(target, 'datagrid').options;
- var dc = $.data(target, 'datagrid').dc;
- var tr = opts.finder.getTr(target, index);
- tr.next().remove();
- $.fn.datagrid.defaults.view.deleteRow.call(this, target, index);
- dc.body2.triggerHandler('scroll');
- },
-
- updateRow: function(target, rowIndex, row){
- var dc = $.data(target, 'datagrid').dc;
- var opts = $.data(target, 'datagrid').options;
- var cls = $(target).datagrid('getExpander', rowIndex).attr('class');
- $.fn.datagrid.defaults.view.updateRow.call(this, target, rowIndex, row);
- $(target).datagrid('getExpander', rowIndex).attr('class',cls);
-
- // update the detail content
- if (this.canUpdateDetail){
- var row = $(target).datagrid('getRows')[rowIndex];
- var detail = $(target).datagrid('getRowDetail', rowIndex);
- detail.html(opts.detailFormatter.call(target, rowIndex, row));
- }
- },
-
- bindEvents: function(target){
- var state = $.data(target, 'datagrid');
- if (state.ss.bindDetailEvents){return;}
- state.ss.bindDetailEvents = true;
- var dc = state.dc;
- var opts = state.options;
- var body = dc.body1.add(dc.body2);
- var clickHandler = ($.data(body[0],'events')||$._data(body[0],'events')).click[0].handler;
- body.unbind('click').bind('click', function(e){
- var tt = $(e.target);
- var tr = tt.closest('tr.datagrid-row');
- if (!tr.length){return}
- if (tt.hasClass('datagrid-row-expander')){
- var rowIndex = parseInt(tr.attr('datagrid-row-index'));
- if (tt.hasClass('datagrid-row-expand')){
- $(target).datagrid('expandRow', rowIndex);
- } else {
- $(target).datagrid('collapseRow', rowIndex);
- }
- $(target).datagrid('fixRowHeight');
-
- } else {
- clickHandler(e);
- }
- e.stopPropagation();
- });
- },
-
- onBeforeRender: function(target){
- var state = $.data(target, 'datagrid');
- var opts = state.options;
- var dc = state.dc;
- var t = $(target);
- var hasExpander = false;
- var fields = t.datagrid('getColumnFields',true).concat(t.datagrid('getColumnFields'));
- for(var i=0; i<fields.length; i++){
- var col = t.datagrid('getColumnOption', fields[i]);
- if (col.expander){
- hasExpander = true;
- break;
- }
- }
- if (!hasExpander){
- if (opts.frozenColumns && opts.frozenColumns.length){
- opts.frozenColumns[0].splice(0,0,{field:'_expander',expander:true,width:24,resizable:false,fixed:true});
- } else {
- opts.frozenColumns = [[{field:'_expander',expander:true,width:24,resizable:false,fixed:true}]];
- }
-
- var t = dc.view1.children('div.datagrid-header').find('table');
- var td = $('<td rowspan="'+opts.frozenColumns.length+'"><div class="datagrid-header-expander" style="width:24px;"></div></td>');
- if ($('tr',t).length == 0){
- td.wrap('<tr></tr>').parent().appendTo($('tbody',t));
- } else if (opts.rownumbers){
- td.insertAfter(t.find('td:has(div.datagrid-header-rownumber)'));
- } else {
- td.prependTo(t.find('tr:first'));
- }
- }
- // if (!state.bindDetailEvents){
- // state.bindDetailEvents = true;
- // var that = this;
- // setTimeout(function(){
- // that.bindEvents(target);
- // },0);
- // }
- },
-
- onAfterRender: function(target){
- var that = this;
- var state = $.data(target, 'datagrid');
- var dc = state.dc;
- var opts = state.options;
- var panel = $(target).datagrid('getPanel');
-
- $.fn.datagrid.defaults.view.onAfterRender.call(this, target);
-
- if (!state.onResizeColumn){
- state.onResizeColumn = opts.onResizeColumn;
- }
- if (!state.onResize){
- state.onResize = opts.onResize;
- }
- function resizeDetails(){
- var ht = dc.header2.find('table');
- var fr = ht.find('tr.datagrid-filter-row').hide();
- var ww = ht.width()-1;
- var details = dc.body2.find('>table.datagrid-btable>tbody>tr>td>div.datagrid-row-detail:visible')._outerWidth(ww);
- // var details = dc.body2.find('div.datagrid-row-detail:visible')._outerWidth(ww);
- details.find('.easyui-fluid').trigger('_resize');
- fr.show();
- }
-
- opts.onResizeColumn = function(field, width){
- if (!opts.fitColumns){
- resizeDetails();
- }
- var rowCount = $(target).datagrid('getRows').length;
- for(var i=0; i<rowCount; i++){
- $(target).datagrid('fixDetailRowHeight', i);
- }
-
- // call the old event code
- state.onResizeColumn.call(target, field, width);
- };
- opts.onResize = function(width, height){
- if (opts.fitColumns){
- resizeDetails();
- }
- state.onResize.call(panel, width, height);
- };
-
- this.canUpdateDetail = true; // define if to update the detail content when 'updateRow' method is called;
-
- var footer = dc.footer1.add(dc.footer2);
- footer.find('span.datagrid-row-expander').css('visibility', 'hidden');
- $(target).datagrid('resize');
- this.bindEvents(target);
- var detail = dc.body1.add(dc.body2).find('div.datagrid-row-detail');
- detail.unbind().bind('mouseover mouseout click dblclick contextmenu scroll', function(e){
- e.stopPropagation();
- });
- }
- });
- $.extend($.fn.datagrid.methods, {
- fixDetailRowHeight: function(jq, index){
- return jq.each(function(){
- var opts = $.data(this, 'datagrid').options;
- if (!(opts.rownumbers || (opts.frozenColumns && opts.frozenColumns.length))){
- return;
- }
- var dc = $.data(this, 'datagrid').dc;
- var tr1 = opts.finder.getTr(this, index, 'body', 1).next();
- var tr2 = opts.finder.getTr(this, index, 'body', 2).next();
- // fix the detail row height
- if (tr2.is(':visible')){
- tr1.css('height', '');
- tr2.css('height', '');
- var height = Math.max(tr1.height(), tr2.height());
- tr1.css('height', height);
- tr2.css('height', height);
- }
- dc.body2.triggerHandler('scroll');
- });
- },
- getExpander: function(jq, index){ // get row expander object
- var opts = $.data(jq[0], 'datagrid').options;
- return opts.finder.getTr(jq[0], index).find('span.datagrid-row-expander');
- },
- // get row detail container
- getRowDetail: function(jq, index){
- var opts = $.data(jq[0], 'datagrid').options;
- var tr = opts.finder.getTr(jq[0], index, 'body', 2);
- // return tr.next().find('div.datagrid-row-detail');
- return tr.next().find('>td>div.datagrid-row-detail');
- },
- expandRow: function(jq, index){
- return jq.each(function(){
- var opts = $(this).datagrid('options');
- var dc = $.data(this, 'datagrid').dc;
- var expander = $(this).datagrid('getExpander', index);
- if (expander.hasClass('datagrid-row-expand')){
- expander.removeClass('datagrid-row-expand').addClass('datagrid-row-collapse');
- var tr1 = opts.finder.getTr(this, index, 'body', 1).next();
- var tr2 = opts.finder.getTr(this, index, 'body', 2).next();
- tr1.show();
- tr2.show();
- $(this).datagrid('fixDetailRowHeight', index);
- if (opts.onExpandRow){
- var row = $(this).datagrid('getRows')[index];
- opts.onExpandRow.call(this, index, row);
- }
- }
- });
- },
- collapseRow: function(jq, index){
- return jq.each(function(){
- var opts = $(this).datagrid('options');
- var dc = $.data(this, 'datagrid').dc;
- var expander = $(this).datagrid('getExpander', index);
- if (expander.hasClass('datagrid-row-collapse')){
- expander.removeClass('datagrid-row-collapse').addClass('datagrid-row-expand');
- var tr1 = opts.finder.getTr(this, index, 'body', 1).next();
- var tr2 = opts.finder.getTr(this, index, 'body', 2).next();
- tr1.hide();
- tr2.hide();
- dc.body2.triggerHandler('scroll');
- if (opts.onCollapseRow){
- var row = $(this).datagrid('getRows')[index];
- opts.onCollapseRow.call(this, index, row);
- }
- }
- });
- }
- });
- $.extend($.fn.datagrid.methods, {
- subgrid: function(jq, conf){
- return jq.each(function(){
- createGrid(this, conf);
- function createGrid(target, conf, prow){
- var queryParams = $.extend({}, conf.options.queryParams||{});
- queryParams[conf.options.foreignField] = prow ? prow[conf.options.foreignField] : undefined;
- $(target).datagrid($.extend({}, conf.options, {
- subgrid: conf.subgrid,
- view: (conf.subgrid ? detailview : undefined),
- queryParams: queryParams,
- detailFormatter: function(index, row){
- return '<div><table class="datagrid-subgrid"></table></div>';
- },
- onExpandRow: function(index, row){
- var opts = $(this).datagrid('options');
- var rd = $(this).datagrid('getRowDetail', index);
- var dg = getSubGrid(rd);
- if (!dg.data('datagrid')){
- createGrid(dg[0], opts.subgrid, row);
- }
- rd.find('.easyui-fluid').trigger('_resize');
- setHeight(this, index);
- if (conf.options.onExpandRow){
- conf.options.onExpandRow.call(this, index, row);
- }
- },
- onCollapseRow: function(index, row){
- setHeight(this, index);
- if (conf.options.onCollapseRow){
- conf.options.onCollapseRow.call(this, index, row);
- }
- },
- onResize: function(){
- var dg = $(this).children('div.datagrid-view').children('table')
- setParentHeight(this);
- },
- onResizeColumn: function(field, width){
- setParentHeight(this);
- if (conf.options.onResizeColumn){
- conf.options.onResizeColumn.call(this, field, width);
- }
- },
- onLoadSuccess: function(data){
- setParentHeight(this);
- if (conf.options.onLoadSuccess){
- conf.options.onLoadSuccess.call(this, data);
- }
- }
- }));
- }
- function getSubGrid(rowDetail){
- var div = $(rowDetail).children('div');
- if (div.children('div.datagrid').length){
- return div.find('>div.datagrid>div.panel-body>div.datagrid-view>table.datagrid-subgrid');
- } else {
- return div.find('>table.datagrid-subgrid');
- }
- }
- function setParentHeight(target){
- var tr = $(target).closest('div.datagrid-row-detail').closest('tr').prev();
- if (tr.length){
- var index = parseInt(tr.attr('datagrid-row-index'));
- var dg = tr.closest('div.datagrid-view').children('table');
- setHeight(dg[0], index);
- }
- }
- function setHeight(target, index){
- $(target).datagrid('fixDetailRowHeight', index);
- $(target).datagrid('fixRowHeight', index);
- var tr = $(target).closest('div.datagrid-row-detail').closest('tr').prev();
- if (tr.length){
- var index = parseInt(tr.attr('datagrid-row-index'));
- var dg = tr.closest('div.datagrid-view').children('table');
- setHeight(dg[0], index);
- }
- }
- });
- },
- getParentGrid: function(jq){
- var detail = jq.closest('div.datagrid-row-detail');
- if (detail.length){
- return detail.closest('.datagrid-view').children('.datagrid-f');
- } else {
- return null;
- }
- },
- getParentRowIndex: function(jq){
- var detail = jq.closest('div.datagrid-row-detail');
- if (detail.length){
- var tr = detail.closest('tr').prev();
- return parseInt(tr.attr('datagrid-row-index'));
- } else {
- return -1;
- }
- }
- });
|