File: D:/HostingSpaces/SBogers10/shop.komma.nl/resources/js/services/paginatorService.js
import { Paginator } from '../models/paginator'
import { axios } from '../../../vendor/komma/kms/resources/js/global/axiosBootstrapper';
export class PaginatorService {
/**
* @param {string|null} url
*/
constructor(url = null) {
this.paginatorData = new Paginator();
this.paginatorData.current_page = 1
this.paginatorData.first_page_url = ''
this.paginatorData.from = 0
this.paginatorData.last_page = 1
this.paginatorData.last_page_url = ''
this.paginatorData.next_page_url = ''
this.paginatorData.per_page = 15
this.paginatorData.prev_page_url = ''
this.paginatorData.to = 1
this.paginatorData.total = 0
this.method = 'get'
this.data = null
if(url) this.setUrl(url);
this.handleResponse = this.handleResponse.bind(this)
this.handleResponseError = this.handleResponseError.bind(this)
this.fetch = this.fetch.bind(this)
this.next = this.next.bind(this)
this.previous = this.previous.bind(this)
}
//Fetches the data
/**
* @return {Promise<*>}
*/
fetch() {
if(!this.hasUrl()) throw new Error('Please set the url first.')
const url = this.paginatorData.path + '?' + this.queryString()
let promise = axios({
method: this.method,
url: url,
data: this.data
}).then(this.handleResponse)
promise.catch(this.handleResponseError)
return promise;
}
//The next functions edit the current page and do a fluent return
/**
* @return {PaginatorService}
*/
next() {
if(this.paginatorData.next_page_url) this.paginatorData.current_page++
return this;
}
/**
* @return {PaginatorService}
*/
previous() {
if(this.paginatorData.prev_page_url) this.paginatorData.current_page--
return this;
}
/**
* @param page
* @return {PaginatorService}
*/
page(page = 1) {
if(page > this.lastPageNumber()) page = this.lastPageNumber();
else if(page < this.firstPageNumber()) page = this.firstPageNumber();
this.paginatorData.current_page = page;
return this;
}
/**
* @return {PaginatorService}
*/
first() {
this.paginatorData.current_page = this.firstPageNumber();
return this;
}
/**
* @return {PaginatorService}
*/
last() {
this.paginatorData.current_page = this.lastPageNumber();
return this;
}
//The next functions provide info about the current paginator state
/**
* @return {number}
*/
total() {
return this.paginatorData.total
}
/**
* @return {number}
*/
from() {
return this.paginatorData.from
}
/**
* @return {number}
*/
to() {
return this.paginatorData.to
}
/**
* @return {number}
*/
currentPageNumber() {
return this.paginatorData.current_page
}
/**
* @return {null|number}
*/
prevPageNumber() {
return this.extractPageNumberFromUrl(this.paginatorData.prev_page_url)
}
/**
* @return {null|number}
*/
firstPageNumber() {
return this.extractPageNumberFromUrl(this.paginatorData.first_page_url)
}
/**
* @return {null|number}
*/
nextPageNumber() {
return this.extractPageNumberFromUrl(this.paginatorData.next_page_url)
}
/**
* @return {null|number}
*/
lastPageNumber() {
return this.extractPageNumberFromUrl(this.paginatorData.last_page_url)
}
//The next functions let you work with the url, http method, and optional data to pass along
/**
* @return {boolean}
*/
hasUrl() {
return this.paginatorData.path !== ''
}
/**
* @param {string} url
* @return {PaginatorService}
*/
setUrl(url) {
this.paginatorData.path = url;
return this
}
/**
* @return {string}
*/
getUrl() {
return this.paginatorData.path
}
/**
* Aditional data for the request
*
* @param data
* @return {PaginatorService}
*/
setData(data) {
this.data = data
return this
}
getData() {
return this.data
}
/**
* @param method
* @return {PaginatorService}
*/
setMethod(method) {
this.method = method
return this
}
//The next functions are helpers, and should not be used directly
/**
* @private
* @param urlString
* @return {null|number}
*/
extractPageNumberFromUrl(urlString) {
if(!urlString || urlString === '') return null;
const url = new URL(urlString);
const params = new URLSearchParams(url.search);
if(!params.has('page')) return null
return parseInt(params.get('page'));
}
/**
* @private
*/
queryString() {
let params = new URLSearchParams();
params.set('page', this.paginatorData.current_page.toString(10))
params.set('perpage', this.paginatorData.per_page.toString(10))
return params.toString()
}
/**
* @private
* @param error
*/
handleResponseError(error) {
console.log('An error occured: ')
console.error(error);
}
/**
* @private
* @param response
* @return {*}
*/
handleResponse(response) {
this.paginatorData = new Paginator(response.data)
return this.paginatorData.data
}
}