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 }