rd-pagination.js
Version:
The highly customizable JS pagination class.
11 lines • 19.5 kB
JavaScript
/**
* Rundiz Pagination.JS
*
* Ported from **Rundiz\Pagination** ( https://github.com/Rundiz/pagination ).
*
* @preserve Preserve file header doc-block.
* @package rd-pagination.js
* @version 0.0.4
*/
"use strict";class RdPagination{#events={};#isListenedClickEvent=!1;#options={};#selector="";#total_pages=0;constructor(selector,options={}){if("string"!=typeof selector)throw new Error("The argument selector must be string.");if("object"!=typeof options)throw new Error("The argument options must be an object.");this.#events=options.events;delete options.events,delete options.total_pages,options={base_url:"",page_number_value:0,total_records:0,items_per_page:10,page_number_type:"start_num",current_page_link:!1,current_page_link_attributes:{},current_tag_close:"",current_tag_open:"",first_page_always_show:!1,first_page_link_attributes:{},first_page_text:"« First",first_tag_close:" ",first_tag_open:" ",last_page_always_show:!1,last_page_link_attributes:{},last_page_text:"Last »",last_tag_close:" ",last_tag_open:" ",next_page_always_show:!1,next_page_link_attributes:{},next_page_text:"Next ›",next_tag_close:" ",next_tag_open:" ",number_adjacent_pages:5,number_display:!0,number_page_link_attributes:{},number_tag_close:" ",number_tag_open:" ",overall_tag_close:"",overall_tag_open:"",previous_page_always_show:!1,previous_page_link_attributes:{},previous_page_text:"‹ Previous",previous_tag_close:" ",previous_tag_open:" ",unavailable_after:2,unavailable_before:2,unavailable_display:!1,unavailable_tag_close:" ",unavailable_tag_open:" ",unavailable_text:"…",...options},this.#selector=selector,this.#options=options}#generateUrl(page_value,direction="",return_value_only=!1){return"first"===direction?"start_num"==this.#options.page_number_type?page_value=0:"page_num"==this.#options.page_number_type&&(page_value=1):"previous"===direction?"start_num"==this.#options.page_number_type?(page_value-=this.#options.items_per_page)<0&&(page_value=0):"page_num"==this.#options.page_number_type&&(page_value-=1)<=0&&(page_value=1):"next"===direction?"start_num"==this.#options.page_number_type?(page_value=parseFloat(page_value)+parseFloat(this.#options.items_per_page))>this.#total_pages*this.#options.items_per_page-this.#options.items_per_page&&(page_value=this.#total_pages*this.#options.items_per_page-this.#options.items_per_page):"page_num"==this.#options.page_number_type&&(page_value=parseFloat(page_value)+1)>this.#total_pages*this.#options.items_per_page/this.#options.items_per_page&&(page_value=this.#total_pages*this.#options.items_per_page/this.#options.items_per_page):"last"===direction?"start_num"==this.#options.page_number_type?page_value-=this.#options.items_per_page:"page_num"==this.#options.page_number_type&&(page_value/=this.#options.items_per_page):"start_num"==this.#options.page_number_type&&(page_value=page_value*this.#options.items_per_page-this.#options.items_per_page),!0===return_value_only?parseFloat(page_value):this.#options.base_url.replace("%PAGENUMBER%",page_value)}#getPaginationHTML(pagination_data){let pagination_rendered="\n";if(pagination_data?.overall_tag_open&&(pagination_rendered+=pagination_data.overall_tag_open),"object"==typeof pagination_data?.generated_pages)for(const page_key of pagination_data.generated_page_keys){if(!pagination_data.generated_pages[page_key]){console.warn("[rd-pageination.js] There is no generated pages key: "+page_key);continue}const page_item=pagination_data.generated_pages[page_key];let propertyName=null;if(page_item?.tag_open&&(pagination_rendered+=page_item.tag_open),page_item?.link){let linkAttributes='data-rd-pagination-link="true" data-rd-pagination-page-value="'+page_item.page_value+'"';if(isNaN(page_key)&&this.#options[page_key+"_link_attributes"]?propertyName=page_key+"_link_attributes":isNaN(page_key)||(propertyName="number_page_link_attributes",!0===page_item?.current_page&&(propertyName="current_page_link_attributes")),!this.#isEmptyObject(this.#options[propertyName]))for(const[attributeName,attributeValue]of Object.entries(this.#options[propertyName]))"href"!==attributeName.toLocaleLowerCase()&&"data-rd-pagination-link"!==attributeName.toLocaleLowerCase()&&"data-rd-pagination-page-value"!==attributeName.toLocaleLowerCase()&&(linkAttributes+=" "+attributeName+'="'+attributeValue+'"');pagination_rendered+="<a "+linkAttributes+' href="'+page_item.link+'">'}page_item?.text&&(pagination_rendered+=page_item.text),page_item?.link&&(pagination_rendered+="</a>"),page_item?.tag_close&&(pagination_rendered+=page_item.tag_close)}return pagination_data?.overall_tag_close&&(pagination_rendered+=pagination_data.overall_tag_close),pagination_rendered+="\n",pagination_rendered}#isCurrentlyFirstPage(){if("start_num"===this.#options.page_number_type){if(0===parseFloat(this.#options.page_number_value))return!0}else if("page_num"===this.#options.page_number_type&&1===parseFloat(this.#options.page_number_value))return!0;return!1}#isCurrentlyLastPage(){if("start_num"===this.#options.page_number_type){if(this.#options.page_number_value>=this.#total_pages*this.#options.items_per_page-this.#options.items_per_page)return!0}else if("page_num"===this.#options.page_number_type&&this.#options.page_number_value>=this.#total_pages)return!0;return!1}#isEmptyObject(obj){if("object"!=typeof obj)throw new Error("The argument obj must be an object.");for(const prop in obj)if(Object.hasOwn(obj,prop))return!1;return!0}#listenClickEvent(){!0!==this.#isListenedClickEvent&&(document.addEventListener("click",event=>{let thisTarget=event.target;thisTarget.closest("[data-rd-pagination-link]")&&thisTarget.closest(this.#selector)&&(thisTarget=thisTarget.closest("[data-rd-pagination-link]"),this.updateOptions({page_number_value:thisTarget.dataset.rdPaginationPageValue}),this.createLinks(),this.#events?.onclick&&"function"==typeof this.#events?.onclick?this.#events.onclick(thisTarget,event,this.#options):event.preventDefault())}),this.#isListenedClickEvent=!0)}#validateOptions(){if("string"!=typeof this.#options.base_url)throw new Error("The option `base_url` must be string.");if(""===this.#options.base_url)throw new Error("The option `base_url` is required.");if(isNaN(this.#options.page_number_value))throw new Error("The option `page_number_value` must be number.");if(isNaN(this.#options.total_records))throw new Error("The option `total_records` must be number.");"string"!=typeof this.#options.current_tag_close&&(this.#options.current_tag_close=""),"string"!=typeof this.#options.current_tag_open&&(this.#options.current_tag_open=""),"boolean"!=typeof this.#options.current_page_link&&(this.#options.current_page_link=!1),"object"!=typeof this.#options.current_page_link_attributes&&(this.#options.current_page_link_attributes={}),"boolean"!=typeof this.#options.first_page_always_show&&(this.#options.first_page_always_show=!1),"object"!=typeof this.#options.first_page_link_attributes&&(this.#options.first_page_link_attributes={}),"string"!=typeof this.#options.first_page_text&&!1!==this.#options.first_page_text&&(this.#options.first_page_text="« First"),"string"!=typeof this.#options.first_tag_close&&(this.#options.first_tag_close=""),"string"!=typeof this.#options.first_tag_open&&(this.#options.first_tag_open=""),isNaN(this.#options.items_per_page)&&(this.#options.items_per_page=10),"boolean"!=typeof this.#options.last_page_always_show&&(this.#options.last_page_always_show=!1),"object"!=typeof this.#options.last_page_link_attributes&&(this.#options.last_page_link_attributes={}),"string"!=typeof this.#options.last_page_text&&!1!==this.#options.last_page_text&&(this.#options.last_page_text="Last »"),"string"!=typeof this.#options.last_tag_close&&(this.#options.last_tag_close=""),"string"!=typeof this.#options.last_tag_open&&(this.#options.last_tag_open=""),"boolean"!=typeof this.#options.next_page_always_show&&(this.#options.next_page_always_show=!1),"object"!=typeof this.#options.next_page_link_attributes&&(this.#options.next_page_link_attributes={}),"string"!=typeof this.#options.next_page_text&&!1!==this.#options.next_page_text&&(this.#options.next_page_text="Next ›"),"string"!=typeof this.#options.next_tag_close&&(this.#options.next_tag_close=""),"string"!=typeof this.#options.next_tag_open&&(this.#options.next_tag_open=""),"number"!=typeof this.#options.number_adjacent_pages&&(this.#options.number_adjacent_pages=5),"object"!=typeof this.#options.number_page_link_attributes&&(this.#options.number_page_link_attributes={}),"boolean"!=typeof this.#options.number_display&&(this.#options.number_display=!0),"string"!=typeof this.#options.number_tag_close&&(this.#options.number_tag_close=""),"string"!=typeof this.#options.number_tag_open&&(this.#options.number_tag_open=""),"string"!=typeof this.#options.overall_tag_close&&(this.#options.overall_tag_close=""),"string"!=typeof this.#options.overall_tag_open&&(this.#options.overall_tag_open=""),"start_num"!==this.#options.page_number_type&&"page_num"!==this.#options.page_number_type&&(this.#options.page_number_type="start_num"),"boolean"!=typeof this.#options.previous_page_always_show&&(this.#options.previous_page_always_show=!1),"object"!=typeof this.#options.previous_page_link_attributes&&(this.#options.previous_page_link_attributes={}),"string"!=typeof this.#options.previous_page_text&&!1!==this.#options.previous_page_text&&(this.#options.previous_page_text="‹ Previous"),"string"!=typeof this.#options.previous_tag_close&&(this.#options.previous_tag_close=""),"string"!=typeof this.#options.previous_tag_open&&(this.#options.previous_tag_open=""),"boolean"!=typeof this.#options.unavailable_display&&(this.#options.unavailable_display=""),"string"!=typeof this.#options.unavailable_tag_close&&(this.#options.unavailable_tag_close=""),"string"!=typeof this.#options.unavailable_tag_open&&(this.#options.unavailable_tag_open=""),"string"!=typeof this.#options.unavailable_text&&(this.#options.unavailable_text="…"),"number"!=typeof this.#options.unavailable_after&&!1!==this.#options.unavailable_after&&(this.#options.unavailable_after=2),"number"!=typeof this.#options.unavailable_before&&!1!==this.#options.unavailable_before&&(this.#options.unavailable_before=2)}createLinks(){const pagination_data=this.getPaginationData();if(this.#listenClickEvent(),"object"!=typeof pagination_data)return null;const pagination_rendered=this.#getPaginationHTML(pagination_data);document.querySelectorAll(this.#selector)?.forEach(eachDOM=>{eachDOM.innerHTML=pagination_rendered})}get options(){return this.#options}getPaginationData(){this.#validateOptions();let output={};this.#total_pages=Math.ceil(this.#options.total_records/this.#options.items_per_page),output.total_pages=this.#total_pages,output.page_number_type=this.#options.page_number_type,output.current_page_number_displaying=1,"start_num"===this.#options.page_number_type?output.current_page_number_displaying=Math.ceil(this.#options.page_number_value/this.#options.items_per_page+1):"page_num"===this.#options.page_number_type&&(output.current_page_number_displaying=parseFloat(this.#options.page_number_value)),output.current_page_number_displaying>this.#total_pages?output.current_page_number_displaying=parseFloat(this.#total_pages):output.current_page_number_displaying<1&&(output.current_page_number_displaying=1),output.overall_tag_open=this.#options.overall_tag_open;let generated_pages={},generated_page_keys=[];if(generated_pages.first_page={},generated_pages.first_page.tag_open=null,generated_pages.first_page.link=null,generated_pages.first_page.page_value=null,generated_pages.first_page.text=null,generated_pages.first_page.tag_close=null,generated_page_keys.push("first_page"),!1!==this.#options.first_page_text&&(!0===this.#options.first_page_always_show||!1===this.#options.first_page_always_show&&!this.#isCurrentlyFirstPage())&&(generated_pages.first_page.tag_open=this.#options.first_tag_open,generated_pages.first_page.link=this.#generateUrl(this.#options.page_number_value,"first"),generated_pages.first_page.page_value=this.#generateUrl(this.#options.page_number_value,"first",!0),generated_pages.first_page.text=this.#options.first_page_text,generated_pages.first_page.tag_close=this.#options.first_tag_close),generated_pages.previous_page={},generated_pages.previous_page.tag_open=null,generated_pages.previous_page.link=null,generated_pages.previous_page.page_value=null,generated_pages.previous_page.text=null,generated_pages.previous_page.tag_close=null,generated_page_keys.push("previous_page"),!1!==this.#options.previous_page_text&&(!0===this.#options.previous_page_always_show||!1===this.#options.previous_page_always_show&&!this.#isCurrentlyFirstPage())&&(generated_pages.previous_page.tag_open=this.#options.previous_tag_open,generated_pages.previous_page.link=this.#generateUrl(this.#options.page_number_value,"previous"),generated_pages.previous_page.page_value=this.#generateUrl(this.#options.page_number_value,"previous",!0),generated_pages.previous_page.text=this.#options.previous_page_text,generated_pages.previous_page.tag_close=this.#options.previous_tag_close),!0===this.#options.number_display){let i;if(!0===this.#options.unavailable_display&&!1!==this.#options.unavailable_before&&output.current_page_number_displaying-this.#options.number_adjacent_pages>1){let number_adjacent_before_current=output.current_page_number_displaying-this.#options.number_adjacent_pages,number_before_unavailable=this.#options.unavailable_before;for(number_adjacent_before_current<=number_before_unavailable&&(number_before_unavailable=number_adjacent_before_current-1),i=1;i<=number_before_unavailable;i++)generated_pages[i]={},generated_pages[i].tag_open=this.#options.number_tag_open,generated_pages[i].link=this.#generateUrl(i),generated_pages[i].page_value=this.#generateUrl(i,"",!0),generated_pages[i].text=i,generated_pages[i].tag_close=this.#options.number_tag_close,generated_page_keys.push(i);number_adjacent_before_current>number_before_unavailable+1&&(generated_pages.unavailable_before={},generated_pages.unavailable_before.tag_open=this.#options.unavailable_tag_open,generated_pages.unavailable_before.link=null,generated_pages.unavailable_before.page_value=null,generated_pages.unavailable_before.text=this.#options.unavailable_text,generated_pages.unavailable_before.tag_close=this.#options.unavailable_tag_close,generated_page_keys.push("unavailable_before"))}if(this.#options.number_adjacent_pages>0)for(i=output.current_page_number_displaying-this.#options.number_adjacent_pages;i<output.current_page_number_displaying;i++)i>0&&(generated_pages[i]={},generated_pages[i].tag_open=this.#options.number_tag_open,generated_pages[i].link=this.#generateUrl(i),generated_pages[i].page_value=this.#generateUrl(i,"",!0),generated_pages[i].text=i,generated_pages[i].tag_close=this.#options.number_tag_close,generated_page_keys.push(i));if(generated_pages[i]={},generated_pages[i].tag_open=this.#options.current_tag_open,generated_pages[i].link=!0===this.#options.current_page_link?this.#generateUrl(i):null,generated_pages[i].current_page=!0,generated_pages[i].page_value=this.#generateUrl(i,"",!0),generated_pages[i].text=output.current_page_number_displaying,generated_pages[i].tag_close=this.#options.current_tag_close,generated_page_keys.push(i),this.#options.number_adjacent_pages>0)for(i=output.current_page_number_displaying+1;i<=output.current_page_number_displaying+this.#options.number_adjacent_pages;i++)i<=this.#total_pages&&(generated_pages[i]={},generated_pages[i].tag_open=this.#options.number_tag_open,generated_pages[i].link=this.#generateUrl(i),generated_pages[i].page_value=this.#generateUrl(i,"",!0),generated_pages[i].text=i,generated_pages[i].tag_close=this.#options.number_tag_close,generated_page_keys.push(i));if(!0===this.#options.unavailable_display&&!1!==this.#options.unavailable_after&&output.current_page_number_displaying+this.#options.number_adjacent_pages<this.#total_pages){let number_adjacent_after_current=output.current_page_number_displaying+this.#options.number_adjacent_pages,number_after_unavailable=this.#total_pages-(this.#options.unavailable_after-1);for(number_adjacent_after_current>=number_after_unavailable&&(number_after_unavailable=number_adjacent_after_current+1),number_adjacent_after_current+1<number_after_unavailable&&(generated_pages.unavailable_after={},generated_pages.unavailable_after.tag_open=this.#options.unavailable_tag_open,generated_pages.unavailable_after.link=null,generated_pages.unavailable_after.page_value=null,generated_pages.unavailable_after.text=this.#options.unavailable_text,generated_pages.unavailable_after.tag_close=this.#options.unavailable_tag_close,generated_page_keys.push("unavailable_after")),i=number_after_unavailable;i<=this.#total_pages;i++)generated_pages[i]={},generated_pages[i].tag_open=this.#options.number_tag_open,generated_pages[i].link=this.#generateUrl(i),generated_pages[i].page_value=this.#generateUrl(i,"",!0),generated_pages[i].text=i,generated_pages[i].tag_close=this.#options.number_tag_close,generated_page_keys.push(i)}}return generated_pages.next_page={},generated_pages.next_page.tag_open=null,generated_pages.next_page.link=null,generated_pages.next_page.page_value=null,generated_pages.next_page.text=null,generated_pages.next_page.tag_close=null,generated_page_keys.push("next_page"),!1!==this.#options.next_page_text&&(!0===this.#options.next_page_always_show||!1===this.#options.next_page_always_show&&!this.#isCurrentlyLastPage())&&(generated_pages.next_page.tag_open=this.#options.next_tag_open,generated_pages.next_page.link=this.#generateUrl(this.#options.page_number_value,"next"),generated_pages.next_page.page_value=this.#generateUrl(this.#options.page_number_value,"next",!0),generated_pages.next_page.text=this.#options.next_page_text,generated_pages.next_page.tag_close=this.#options.next_tag_close),generated_pages.last_page={},generated_pages.last_page.tag_open=null,generated_pages.last_page.link=null,generated_pages.last_page.page_value=null,generated_pages.last_page.text=null,generated_pages.last_page.tag_close=null,generated_page_keys.push("last_page"),!1!==this.#options.last_page_text&&(!0===this.#options.last_page_always_show||!1===this.#options.last_page_always_show&&!this.#isCurrentlyLastPage())&&(generated_pages.last_page.tag_open=this.#options.last_tag_open,generated_pages.last_page.link=this.#generateUrl(this.#total_pages*this.#options.items_per_page,"last"),generated_pages.last_page.page_value=this.#generateUrl(this.#total_pages*this.#options.items_per_page,"last",!0),generated_pages.last_page.text=this.#options.last_page_text,generated_pages.last_page.tag_close=this.#options.last_tag_close),output.generated_pages=generated_pages,output.generated_page_keys=generated_page_keys,output.overall_tag_close=this.#options.overall_tag_close,output}reCreateLinks(pagination_data){if("object"!=typeof pagination_data)throw new Error("The argument `pagination_data` must be object.");const pagination_rendered=this.#getPaginationHTML(pagination_data);document.querySelectorAll(this.#selector)?.forEach(eachDOM=>{eachDOM.innerHTML=pagination_rendered})}updateOptions(options={}){options?.events&&(this.#events=options.events),delete options.events,delete options.total_pages,this.#options={...this.#options,...options}}}"object"==typeof module&&"object"==typeof module.exports&&(module.exports=RdPagination);
//# sourceMappingURL=rd-pagination.min.js.map