import {Dom} from '../dom'; import {Types} from '../types'; import {Helpers} from '../helpers'; import {Event} from '../event'; export class GridLayout{ /** * Grid layout, table with fixed headers * @param {Object} tf TableFilter instance */ constructor(tf) { var f = tf.fObj; //defines grid width this.gridWidth = f.grid_width || null; //defines grid height this.gridHeight = f.grid_height || null; //defines css class for main container this.gridMainContCssClass = f.grid_cont_css_class || 'grd_Cont'; //defines css class for div containing table this.gridContCssClass = f.grid_tbl_cont_css_class || 'grd_tblCont'; //defines css class for div containing headers' table this.gridHeadContCssClass = f.grid_tblHead_cont_css_class || 'grd_headTblCont'; //defines css class for div containing rows counter, paging etc. this.gridInfDivCssClass = f.grid_inf_grid_css_class || 'grd_inf'; //defines which row contains column headers this.gridHeadRowIndex = f.grid_headers_row_index || 0; //array of headers row indexes to be placed in header table this.gridHeadRows = f.grid_headers_rows || [0]; //generate filters in table headers this.gridEnableFilters = f.grid_enable_default_filters!==undefined ? f.grid_enable_default_filters : true; //default col width this.gridDefaultColWidth = f.grid_default_col_width || '100px'; //enables/disables columns resizer this.gridEnableColResizer = f.grid_enable_cols_resizer!==undefined ? f.grid_enable_cols_resizer : false; //defines col resizer script path this.gridColResizerPath = f.grid_cont_col_resizer_path || this.basePath+'TFExt_ColsResizer/TFExt_ColsResizer.js'; this.gridColElms = []; this.tf = tf; } /** * Generates a grid with fixed headers */ init(){ var tf = this.tf; var f = tf.fObj; var tbl = tf.tbl; if(!tf.gridLayout){ return; } tf.isExternalFlt = true; // default width of 100px if column widths not set if(!tf.hasColWidth){ tf.colWidth = []; for(var k=0; k0){ tbl.removeChild(thead[0]); } //Headers table style this.headTbl.style.width = tbl.style.width; this.headTbl.style.tableLayout = 'fixed'; tbl.style.tableLayout = 'fixed'; this.headTbl.cellPadding = tbl.cellPadding; this.headTbl.cellSpacing = tbl.cellSpacing; //content table without headers needs col widths to be reset tf.SetColWidths(); //Headers container width this.headTblCont.style.width = this.tblCont.clientWidth+'px'; tbl.style.width = ''; // if(Helpers.isIE()){ // this.headTbl.style.width = ''; // } //scroll synchronisation var o = this; Event.add(this.tblCont, 'scroll', function(evt){ //this = scroll element var scrollLeft = this.scrollLeft; o.headTblCont.scrollLeft = scrollLeft; //New pointerX calc taking into account scrollLeft if(!o.isPointerXOverwritten){ try{ o.Evt.pointerX = function(evt){ var e = evt || global.event; var bdScrollLeft = tf_StandardBody().scrollLeft + scrollLeft; return (e.pageX + scrollLeft) || (e.clientX + bdScrollLeft); }; o.isPointerXOverwritten = true; } catch(err) { o.isPointerXOverwritten = false; } } }); //Sort is enabled if not specified in config object if(f.sort !== false){ tf.sort = true; tf.sortConfig.asyncSort = true; tf.sortConfig.triggerIds = sortTriggers; } if(this.gridEnableColResizer){ if(!tf.hasExtensions){ tf.extensions = { name:['ColumnsResizer_'+tf.id], src:[this.gridColResizerPath], description:['Columns Resizing'], initialize:[function(o){ o.SetColsResizer('ColumnsResizer_'+o.id);}] }; tf.hasExtensions = true; } else { if(!tf.__containsStr( 'colsresizer', Str.lower(tf.extensions.src.toString())) ){ tf.extensions.name.push('ColumnsResizer_'+tf.id); tf.extensions.src.push(tf.gridColResizerPath); tf.extensions.description.push('Columns Resizing'); tf.extensions.initialize.push(function(o){ o.SetColsResizer('ColumnsResizer_'+o.id);}); } } } //Default columns resizer properties for grid layout f.col_resizer_cols_headers_table = this.headTbl.getAttribute('id'); f.col_resizer_cols_headers_index = this.gridHeadRowIndex; f.col_resizer_width_adjustment = 0; f.col_enable_text_ellipsis = false; //Cols generation for all browsers excepted IE<=7 o.tblHasColTag = Dom.tag(tbl, 'col').length > 0 ? true : false; // if(!Helpers.isIE()){ //Col elements are enough to keep column widths after sorting and //filtering var createColTags = function(o){ if(!o){ return; } for(var k=(tf.nbCells-1); k>=0; k--){ var col = Dom.create('col', ['id', tf.id+'_col_'+k]); tbl.firstChild.parentNode.insertBefore(col, tbl.firstChild); col.style.width = tf.colWidth[k]; o.gridColElms[k] = col; } o.tblHasColTag = true; }; if(!o.tblHasColTag){ createColTags(o); } else { var cols = Dom.tag(tbl, 'col'); for(var ii=0; ii0 ){ // r = tbody[0].insertRow(0); // } else{ // r = tbl.insertRow(0); // } // r.style.height = '0px'; // for(var x=0; x0){ // tbody[0].moveRow(o.leadColWidthsRow.rowIndex, 0); // } else { // tbl.moveRow(o.leadColWidthsRow.rowIndex, 0); // } // } // if(afterSortFn){ // afterSortFn.call(null, o, colIndex); // } // }; // } var afterColResizedFn = Types.isFn(f.on_after_col_resized) ? f.on_after_col_resized : null; f.on_after_col_resized = function(o,colIndex){ if(!colIndex){ return; } var w = o.crWColsRow.cells[colIndex].style.width; var col = o.gridColElms[colIndex]; col.style.width = w; var thCW = o.crWColsRow.cells[colIndex].clientWidth; var tdCW = o.crWRowDataTbl.cells[colIndex].clientWidth; // if(Helpers.isIE()){ // tbl.style.width = o.headTbl.clientWidth+'px'; // } if(thCW != tdCW /*&& !Helpers.isIE()*/){ o.headTbl.style.width = tbl.clientWidth+'px'; } if(afterColResizedFn){ afterColResizedFn.call(null,o,colIndex); } }; if(tbl.clientWidth !== this.headTbl.clientWidth){ tbl.style.width = this.headTbl.clientWidth+'px'; } // Re-adjust reference row //tf.refRow = Helpers.isIE() ? (tf.refRow+1) : 0; } /** * Removes the grid layout */ destroy(){ var tf = this.tf; var tbl = tf.tbl; if(!tf.gridLayout){ return; } var t = tbl.parentNode.removeChild(tbl); this.tblMainCont.parentNode.insertBefore(t, this.tblMainCont); this.tblMainCont.parentNode.removeChild(this.tblMainCont); this.tblMainCont = null; this.headTblCont = null; this.headTbl = null; this.tblCont = null; tbl.outerHTML = tf.sourceTblHtml; //needed to keep reference of table element tbl = Dom.id(tf.id); } }