github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/ui/app/components/list-pagination.js (about)

     1  import Component from '@ember/component';
     2  import { computed } from '@ember/object';
     3  import { computed as overridable } from 'ember-overridable-computed';
     4  import classic from 'ember-classic-decorator';
     5  
     6  @classic
     7  export default class ListPagination extends Component {
     8    @overridable(() => []) source;
     9    size = 25;
    10    page = 1;
    11    spread = 2;
    12  
    13    @computed('size', 'page')
    14    get startsAt() {
    15      return (this.page - 1) * this.size + 1;
    16    }
    17  
    18    @computed('source.[]', 'size', 'page')
    19    get endsAt() {
    20      return Math.min(this.page * this.size, this.get('source.length'));
    21    }
    22  
    23    @computed('source.[]', 'size')
    24    get lastPage() {
    25      return Math.ceil(this.get('source.length') / this.size);
    26    }
    27  
    28    @computed('source.[]', 'page', 'spread')
    29    get pageLinks() {
    30      const { spread, page, lastPage } = this;
    31  
    32      // When there is only one page, don't bother with page links
    33      if (lastPage === 1) {
    34        return [];
    35      }
    36  
    37      const lowerBound = Math.max(1, page - spread);
    38      const upperBound = Math.min(lastPage, page + spread) + 1;
    39  
    40      return Array(upperBound - lowerBound)
    41        .fill(null)
    42        .map((_, index) => ({
    43          pageNumber: lowerBound + index,
    44        }));
    45    }
    46  
    47    @computed('source.[]', 'page', 'size')
    48    get list() {
    49      const size = this.size;
    50      const start = (this.page - 1) * size;
    51      return this.source.slice(start, start + size);
    52    }
    53  }