import {Dom} from '../dom'; import {Types} from '../types'; import {Str} from '../string'; import {Helpers} from '../helpers'; export class Paging{ /** * Pagination component * @param {Object} tf TableFilter instance */ constructor(tf){ // TableFilter configuration var f = tf.fObj; //id of container element this.pagingTgtId = f.paging_target_id || null; //defines table paging length this.pagingLength = !isNaN(f.paging_length) ? f.paging_length : 10; //id of container element this.resultsPerPageTgtId = f.results_per_page_target_id || null; //css class for paging select element this.pgSlcCssClass = f.paging_slc_css_class || 'pgSlc'; //css class for paging input element this.pgInpCssClass = f.paging_inp_css_class || 'pgNbInp'; //defines css class for results per page select this.resultsSlcCssClass = f.results_slc_css_class || 'rspg'; //css class for label preceding results per page select this.resultsSpanCssClass = f.results_span_css_class || 'rspgSpan'; //nb visible rows this.nbVisibleRows = 0; //nb hidden rows this.nbHiddenRows = 0; //1st row index of current page this.startPagingRow = 0; //total nb of pages this.nbPages = 0; //defines next page button text this.btnNextPageText = f.btn_next_page_text || '>'; //defines previous page button text this.btnPrevPageText = f.btn_prev_page_text || '<'; //defines last page button text this.btnLastPageText = f.btn_last_page_text || '>|'; //defines first page button text this.btnFirstPageText = f.btn_first_page_text || '|<'; //defines next page button html this.btnNextPageHtml = f.btn_next_page_html || (!this.enableIcons ? null : ''); //defines previous page button html this.btnPrevPageHtml = f.btn_prev_page_html || (!this.enableIcons ? null : ''); //defines last page button html this.btnFirstPageHtml = f.btn_first_page_html || (!this.enableIcons ? null : ''); //defines previous page button html this.btnLastPageHtml = f.btn_last_page_html || (!this.enableIcons ? null : ''); //defines text preceeding page selector drop-down this.pageText = f.page_text || ' Page '; //defines text after page selector drop-down this.ofText = f.of_text || ' of '; //css class for span containing tot nb of pages this.nbPgSpanCssClass = f.nb_pages_css_class || 'nbpg'; //enables/disables paging buttons this.hasPagingBtns = f.paging_btns===false ? false : true; //stores paging buttons events this.pagingBtnEvents = null; //defines previous page button html this.pageSelectorType = f.page_selector_type || tf.fltTypeSlc; //calls function before page is changed this.onBeforeChangePage = Types.isFn(f.on_before_change_page) ? f.on_before_change_page : null; //calls function before page is changed this.onAfterChangePage = Types.isFn(f.on_after_change_page) ? f.on_after_change_page : null; var start_row = this.refRow; var nrows = this.nbRows; //calculates page nb this.nbPages = Math.ceil((nrows-start_row)/this.pagingLength); var evt = tf.Evt; //Paging elements events if(!evt._Paging.next){ var o = this; evt._Paging = {// paging buttons events slcIndex: function(){ return (o.pageSelectorType===tf.fltTypeSlc) ? o.pagingSlc.options.selectedIndex : parseInt(o.pagingSlc.value, 10)-1; }, nbOpts: function(){ return (o.pageSelectorType===tf.fltTypeSlc) ? parseInt(o.pagingSlc.options.length, 10)-1 : (o.nbPages-1); }, next: function(){ if(evt._Paging.nextEvt){ evt._Paging.nextEvt(); } var nextIndex = evt._Paging.slcIndex() < evt._Paging.nbOpts() ? evt._Paging.slcIndex()+1 : 0; o.changePage(nextIndex); }, prev: function(){ if(evt._Paging.prevEvt){ evt._Paging.prevEvt(); } var prevIndex = evt._Paging.slcIndex()>0 ? evt._Paging.slcIndex()-1 : evt._Paging.nbOpts(); o.changePage(prevIndex); }, last: function(){ if(evt._Paging.lastEvt){ evt._Paging.lastEvt(); } o.changePage(evt._Paging.nbOpts()); }, first: function(){ if(evt._Paging.firstEvt){ evt._Paging.firstEvt(); } o.changePage(0); }, _detectKey: function(e){ var evt = e || global.event; if(evt){ var key = evt.getKeyCode(e); if(key===13){ if(tf.sorted){ tf.Filter(); o.changePage(evt._Paging.slcIndex()); } else{ o.changePage(); } this.blur(); } } }, nextEvt: null, prevEvt: null, lastEvt: null, firstEvt: null }; } this.tf = tf; } init(){ var slcPages; var tf = this.tf; var evt = tf.Evt; // Paging drop-down list selector if(this.pageSelectorType === tf.fltTypeSlc){ slcPages = Dom.create( tf.fltTypeSlc, ['id', tf.prfxSlcPages+tf.id]); slcPages.className = this.pgSlcCssClass; console.log(evt); slcPages.onchange = evt._OnSlcPagesChange; //slcPages.onchange = function(){ alert('hello'); } } // Paging input selector if(this.pageSelectorType === tf.fltTypeInp){ slcPages = Dom.create( tf.fltTypeInp, ['id', tf.prfxSlcPages+tf.id], ['value', tf.currentPageNb] ); slcPages.className = this.pgInpCssClass; slcPages.onkeypress = evt._Paging._detectKey; } // btns containers var btnNextSpan = Dom.create( 'span',['id', tf.prfxBtnNextSpan+tf.id]); var btnPrevSpan = Dom.create( 'span',['id', tf.prfxBtnPrevSpan+tf.id]); var btnLastSpan = Dom.create( 'span',['id', tf.prfxBtnLastSpan+tf.id]); var btnFirstSpan = Dom.create( 'span',['id', tf.prfxBtnFirstSpan+tf.id]); if(this.hasPagingBtns){ // Next button if(!this.btnNextPageHtml){ var btn_next = Dom.create( tf.fltTypeInp, ['id', tf.prfxBtnNext+tf.id], ['type', 'button'], ['value', this.btnNextPageText], ['title', 'Next'] ); btn_next.className = this.btnPageCssClass; btn_next.onclick = evt._Paging.next; btnNextSpan.appendChild(btn_next); } else { btnNextSpan.innerHTML = this.btnNextPageHtml; btnNextSpan.onclick = evt._Paging.next; } // Previous button if(!this.btnPrevPageHtml){ var btn_prev = Dom.create( tf.fltTypeInp, ['id',tf.prfxBtnPrev+tf.id], ['type','button'], ['value',this.btnPrevPageText], ['title','Previous'] ); btn_prev.className = this.btnPageCssClass; btn_prev.onclick = evt._Paging.prev; btnPrevSpan.appendChild(btn_prev); } else { btnPrevSpan.innerHTML = this.btnPrevPageHtml; btnPrevSpan.onclick = evt._Paging.prev; } // Last button if(!this.btnLastPageHtml){ var btn_last = Dom.create( tf.fltTypeInp, ['id',tf.prfxBtnLast+tf.id], ['type','button'], ['value',this.btnLastPageText], ['title','Last'] ); btn_last.className = this.btnPageCssClass; btn_last.onclick = evt._Paging.last; btnLastSpan.appendChild(btn_last); } else { btnLastSpan.innerHTML = this.btnLastPageHtml; btnLastSpan.onclick = evt._Paging.last; } // First button if(!this.btnFirstPageHtml){ var btn_first = Dom.create( tf.fltTypeInp, ['id',tf.prfxBtnFirst+tf.id], ['type','button'], ['value',this.btnFirstPageText], ['title','First'] ); btn_first.className = this.btnPageCssClass; btn_first.onclick = evt._Paging.first; btnFirstSpan.appendChild(btn_first); } else { btnFirstSpan.innerHTML = this.btnFirstPageHtml; btnFirstSpan.onclick = evt._Paging.first; } } // paging elements (buttons+drop-down list) are added to defined element if(!this.pagingTgtId){ tf.SetTopDiv(); } var targetEl = !this.pagingTgtId ? tf.mDiv : Dom.id(this.pagingTgtId); /*** if paging previously removed this prevents IE memory leak with removeChild used in RemovePaging method. For more info refer to http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2840253&SiteID=1 ***/ if (targetEl.innerHTML!==''){ targetEl.innerHTML = ''; } /*** ***/ targetEl.appendChild(btnFirstSpan); targetEl.appendChild(btnPrevSpan); var pgBeforeSpan = Dom.create( 'span',['id', tf.prfxPgBeforeSpan+tf.id] ); pgBeforeSpan.appendChild( Dom.text(this.pageText) ); pgBeforeSpan.className = this.nbPgSpanCssClass; targetEl.appendChild(pgBeforeSpan); targetEl.appendChild(slcPages); var pgAfterSpan = Dom.create( 'span',['id', tf.prfxPgAfterSpan+tf.id]); pgAfterSpan.appendChild( Dom.text(this.ofText) ); pgAfterSpan.className = this.nbPgSpanCssClass; targetEl.appendChild(pgAfterSpan); var pgspan = Dom.create( 'span',['id', tf.prfxPgSpan+tf.id] ); pgspan.className = this.nbPgSpanCssClass; pgspan.appendChild( Dom.text(' '+this.nbPages+' ') ); targetEl.appendChild(pgspan); targetEl.appendChild(btnNextSpan); targetEl.appendChild(btnLastSpan); this.pagingSlc = Dom.id(tf.prfxSlcPages+tf.id); /*==================================================== - onchange event for paging select =====================================================*/ var o = this; evt._OnSlcPagesChange = function(){ if(evt._Paging._OnSlcPagesChangeEvt){ evt._Paging._OnSlcPagesChangeEvt(); } o.changePage(); this.blur(); //ie only: blur is not enough... if(this.parentNode && Helpers.isIE()){ this.parentNode.focus(); } }; // if this.rememberGridValues==true this.SetPagingInfo() is called // in ResetGridValues() method if(!tf.rememberGridValues || tf.isPagingRemoved){ this.setPagingInfo(); } if(!tf.fltGrid){ tf.ValidateAllRows(); this.setPagingInfo(tf.validRowsIndex); } this.pagingBtnEvents = evt._Paging; tf.isPagingRemoved = false; } addPaging(filterTable){ var tf = this.tf; if(!tf.hasGrid || tf.paging){ return; } tf.paging = true; tf.isPagingRemoved = true; this.init(); tf.ResetValues(); if(filterTable){ tf.Filter(); } } setPagingInfo(validRows){ var tf = this.tf; var rows = tf.tbl.rows; var mdiv = !this.pagingTgtId ? tf.mDiv : Dom.id(this.pagingTgtId); var pgspan = Dom.id(tf.prfxPgSpan+tf.id); //stores valid rows indexes if(validRows && validRows.length>0){ tf.validRowsIndex = validRows; } else { //re-sets valid rows indexes array tf.validRowsIndex = []; //counts rows to be grouped for(var j=tf.refRow; j0){ mdiv.style.visibility = 'visible'; if(this.pageSelectorType === tf.fltTypeSlc){ for(var z=0; z