HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
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
    }
}