ilios/frontend

View on GitHub
packages/frontend/app/components/pagination-links.js

Summary

Maintainability
A
0 mins
Test Coverage
import Component from '@glimmer/component';
import { action } from '@ember/object';

export default class PaginationLinksComponent extends Component {
  get disablePrev() {
    return this.args.page === 1;
  }

  get disableNext() {
    return this.lastPage === this.args.page;
  }

  get lastPage() {
    return Math.ceil(this.args.results.length / this.args.size);
  }

  get pages() {
    return this.lastPage <= 7
      ? this.simplePages(this.lastPage)
      : this.complexPages(this.lastPage, this.args.page);
  }

  @action
  selectPage(value) {
    this.args.onSelectPage(this.args.page + value);
  }

  simplePages(lastPage) {
    const pageNumbers = [];

    for (let i = 1; i <= lastPage; i++) {
      pageNumbers.push(i);
    }

    return pageNumbers;
  }

  complexPages(lastPage, page) {
    if (page <= 4) {
      return [1, 2, 3, 4, 5, '...', lastPage];
    }

    if (page >= lastPage - 3) {
      return [1, '...', lastPage - 4, lastPage - 3, lastPage - 2, lastPage - 1, lastPage];
    }

    return [1, '...', page - 1, page, page + 1, page + 2, '...', lastPage];
  }
}