import {Feature} from './feature'; import Dom from '../dom'; import Types from '../types'; import Event from '../event'; import Str from '../string'; export class GridLayout extends Feature{ /** * Grid layout, table with fixed headers * @param {Object} tf TableFilter instance */ constructor(tf){ super(tf, 'gridLayout'); let f = this.config; //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'; this.gridColElms = []; //div containing grid elements if grid_layout true this.prfxMainTblCont = 'gridCont_'; //div containing table if grid_layout true this.prfxTblCont = 'tblCont_'; //div containing headers table if grid_layout true this.prfxHeadTblCont = 'tblHeadCont_'; //headers' table if grid_layout true this.prfxHeadTbl = 'tblHead_'; //id of td containing the filter if grid_layout true this.prfxGridFltTd = '_td_'; //id of th containing column header if grid_layout true this.prfxGridTh = 'tblHeadTh_'; this.sourceTblHtml = tf.tbl.outerHTML; // filters flag at TF level tf.fltGrid = this.gridEnableFilters; } /** * Generates a grid with fixed headers */ init(){ let tf = this.tf; let f = this.config; let tbl = tf.tbl; if(this.initialized){ return; } // Override reference rows indexes tf.refRow = Types.isNull(tf.startRow) ? 0 : tf.startRow; tf.headersRow = 0; tf.filtersRowIndex = 1; tf.isExternalFlt = true; // default width of 100px if column widths not set if(!tf.hasColWidths){ tf.colWidths = []; for(let k=0; k0){ tbl.removeChild(thead[0]); } //Headers table style this.headTbl.style.tableLayout = 'fixed'; tbl.style.tableLayout = 'fixed'; this.headTbl.cellPadding = tbl.cellPadding; this.headTbl.cellSpacing = tbl.cellSpacing; // this.headTbl.style.width = tbl.style.width; //content table without headers needs col widths to be reset tf.setColWidths(0, this.headTbl); //Headers container width // this.headTblCont.style.width = this.tblCont.clientWidth+'px'; tbl.style.width = ''; // this.headTbl.style.width = tbl.clientWidth + 'px'; // //scroll synchronisation Event.add(this.tblCont, 'scroll', (evt)=> { let elm = Event.target(evt); let scrollLeft = elm.scrollLeft; this.headTblCont.scrollLeft = scrollLeft; //New pointerX calc taking into account scrollLeft // if(!o.isPointerXOverwritten){ // try{ // o.Evt.pointerX = function(evt){ // let e = evt || global.event; // let bdScrollLeft = tf_StandardBody().scrollLeft + // scrollLeft; // return (e.pageX + scrollLeft) || // (e.clientX + bdScrollLeft); // }; // o.isPointerXOverwritten = true; // } catch(err) { // o.isPointerXOverwritten = false; // } // } }); //Configure sort extension if any let sort = (f.extensions || []).filter(function(itm){ return itm.name === 'sort'; }); if(sort.length === 1){ sort[0].async_sort = true; sort[0].trigger_ids = sortTriggers; } //Cols generation for all browsers excepted IE<=7 this.tblHasColTag = Dom.tag(tbl, 'col').length > 0 ? true : false; //Col elements are enough to keep column widths after sorting and //filtering let createColTags = function(){ for(let k=(tf.nbCells-1); k>=0; k--){ let col = Dom.create('col', ['id', tf.id+'_col_'+k]); tbl.insertBefore(col, tbl.firstChild); col.style.width = tf.colWidths[k]; this.gridColElms[k] = col; } this.tblHasColTag = true; }; if(!this.tblHasColTag){ createColTags.call(this); } else { let cols = Dom.tag(tbl, 'col'); for(let ii=0; ii