123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386 |
- import Pager from './pager.vue';
- import ElSelect from 'element-ui/packages/select';
- import ElOption from 'element-ui/packages/option';
- import ElInput from 'element-ui/packages/input';
- import Locale from 'element-ui/src/mixins/locale';
- import { valueEquals } from 'element-ui/src/utils/util';
- export default {
- name: 'ElPagination',
- props: {
- pageSize: {
- type: Number,
- default: 10
- },
- small: Boolean,
- total: Number,
- pageCount: Number,
- pagerCount: {
- type: Number,
- validator(value) {
- return (value | 0) === value && value > 4 && value < 22 && (value % 2) === 1;
- },
- default: 7
- },
- currentPage: {
- type: Number,
- default: 1
- },
- layout: {
- default: 'prev, pager, next, jumper, ->, total'
- },
- pageSizes: {
- type: Array,
- default() {
- return [10, 20, 30, 40, 50, 100];
- }
- },
- popperClass: String,
- prevText: String,
- nextText: String,
- background: Boolean,
- disabled: Boolean,
- hideOnSinglePage: Boolean
- },
- data() {
- return {
- internalCurrentPage: 1,
- internalPageSize: 0,
- lastEmittedPage: -1,
- userChangePageSize: false
- };
- },
- render(h) {
- const layout = this.layout;
- if (!layout) return null;
- if (this.hideOnSinglePage && (!this.internalPageCount || this.internalPageCount === 1)) return null;
- let template = <div class={['el-pagination', {
- 'is-background': this.background,
- 'el-pagination--small': this.small
- }] }></div>;
- const TEMPLATE_MAP = {
- prev: <prev></prev>,
- jumper: <jumper></jumper>,
- pager: <pager currentPage={ this.internalCurrentPage } pageCount={ this.internalPageCount } pagerCount={ this.pagerCount } on-change={ this.handleCurrentChange } disabled={ this.disabled }></pager>,
- next: <next></next>,
- sizes: <sizes pageSizes={ this.pageSizes }></sizes>,
- slot: <slot>{ this.$slots.default ? this.$slots.default : '' }</slot>,
- total: <total></total>
- };
- const components = layout.split(',').map((item) => item.trim());
- const rightWrapper = <div class="el-pagination__rightwrapper"></div>;
- let haveRightWrapper = false;
- template.children = template.children || [];
- rightWrapper.children = rightWrapper.children || [];
- components.forEach(compo => {
- if (compo === '->') {
- haveRightWrapper = true;
- return;
- }
- if (!haveRightWrapper) {
- template.children.push(TEMPLATE_MAP[compo]);
- } else {
- rightWrapper.children.push(TEMPLATE_MAP[compo]);
- }
- });
- if (haveRightWrapper) {
- template.children.unshift(rightWrapper);
- }
- return template;
- },
- components: {
- Prev: {
- render(h) {
- return (
- <button
- type="button"
- class="btn-prev"
- disabled={ this.$parent.disabled || this.$parent.internalCurrentPage <= 1 }
- on-click={ this.$parent.prev }>
- {
- this.$parent.prevText
- ? <span>{ this.$parent.prevText }</span>
- : <i class="el-icon el-icon-arrow-left"></i>
- }
- </button>
- );
- }
- },
- Next: {
- render(h) {
- return (
- <button
- type="button"
- class="btn-next"
- disabled={ this.$parent.disabled || this.$parent.internalCurrentPage === this.$parent.internalPageCount || this.$parent.internalPageCount === 0 }
- on-click={ this.$parent.next }>
- {
- this.$parent.nextText
- ? <span>{ this.$parent.nextText }</span>
- : <i class="el-icon el-icon-arrow-right"></i>
- }
- </button>
- );
- }
- },
- Sizes: {
- mixins: [Locale],
- props: {
- pageSizes: Array
- },
- watch: {
- pageSizes: {
- immediate: true,
- handler(newVal, oldVal) {
- if (valueEquals(newVal, oldVal)) return;
- if (Array.isArray(newVal)) {
- this.$parent.internalPageSize = newVal.indexOf(this.$parent.pageSize) > -1
- ? this.$parent.pageSize
- : this.pageSizes[0];
- }
- }
- }
- },
- render(h) {
- return (
- <span class="el-pagination__sizes">
- <el-select
- value={ this.$parent.internalPageSize }
- popperClass={ this.$parent.popperClass || '' }
- size="mini"
- on-input={ this.handleChange }
- disabled={ this.$parent.disabled }>
- {
- this.pageSizes.map(item =>
- <el-option
- value={ item }
- label={ item + this.t('el.pagination.pagesize') }>
- </el-option>
- )
- }
- </el-select>
- </span>
- );
- },
- components: {
- ElSelect,
- ElOption
- },
- methods: {
- handleChange(val) {
- if (val !== this.$parent.internalPageSize) {
- this.$parent.internalPageSize = val = parseInt(val, 10);
- this.$parent.userChangePageSize = true;
- this.$parent.$emit('update:pageSize', val);
- this.$parent.$emit('size-change', val);
- }
- }
- }
- },
- Jumper: {
- mixins: [Locale],
- components: { ElInput },
- data() {
- return {
- userInput: null
- };
- },
- watch: {
- '$parent.internalCurrentPage'() {
- this.userInput = null;
- }
- },
- methods: {
- handleKeyup({ keyCode, target }) {
- // Chrome, Safari, Firefox triggers change event on Enter
- // Hack for IE: https://github.com/ElemeFE/element/issues/11710
- // Drop this method when we no longer supports IE
- if (keyCode === 13) {
- this.handleChange(target.value);
- }
- },
- handleInput(value) {
- this.userInput = value;
- },
- handleChange(value) {
- this.$parent.internalCurrentPage = this.$parent.getValidCurrentPage(value);
- this.$parent.emitChange();
- this.userInput = null;
- }
- },
- render(h) {
- return (
- <span class="el-pagination__jump">
- { this.t('el.pagination.goto') }
- <el-input
- class="el-pagination__editor is-in-pagination"
- min={ 1 }
- max={ this.$parent.internalPageCount }
- value={ this.userInput !== null ? this.userInput : this.$parent.internalCurrentPage }
- type="number"
- disabled={ this.$parent.disabled }
- nativeOnKeyup={ this.handleKeyup }
- onInput={ this.handleInput }
- onChange={ this.handleChange }/>
- { this.t('el.pagination.pageClassifier') }
- </span>
- );
- }
- },
- Total: {
- mixins: [Locale],
- render(h) {
- return (
- typeof this.$parent.total === 'number'
- ? <span class="el-pagination__total">{ this.t('el.pagination.total', { total: this.$parent.total }) }</span>
- : ''
- );
- }
- },
- Pager
- },
- methods: {
- handleCurrentChange(val) {
- this.internalCurrentPage = this.getValidCurrentPage(val);
- this.userChangePageSize = true;
- this.emitChange();
- },
- prev() {
- if (this.disabled) return;
- const newVal = this.internalCurrentPage - 1;
- this.internalCurrentPage = this.getValidCurrentPage(newVal);
- this.$emit('prev-click', this.internalCurrentPage);
- this.emitChange();
- },
- next() {
- if (this.disabled) return;
- const newVal = this.internalCurrentPage + 1;
- this.internalCurrentPage = this.getValidCurrentPage(newVal);
- this.$emit('next-click', this.internalCurrentPage);
- this.emitChange();
- },
- getValidCurrentPage(value) {
- value = parseInt(value, 10);
- const havePageCount = typeof this.internalPageCount === 'number';
- let resetValue;
- if (!havePageCount) {
- if (isNaN(value) || value < 1) resetValue = 1;
- } else {
- if (value < 1) {
- resetValue = 1;
- } else if (value > this.internalPageCount) {
- resetValue = this.internalPageCount;
- }
- }
- if (resetValue === undefined && isNaN(value)) {
- resetValue = 1;
- } else if (resetValue === 0) {
- resetValue = 1;
- }
- return resetValue === undefined ? value : resetValue;
- },
- emitChange() {
- this.$nextTick(() => {
- if (this.internalCurrentPage !== this.lastEmittedPage || this.userChangePageSize) {
- this.$emit('current-change', this.internalCurrentPage);
- this.lastEmittedPage = this.internalCurrentPage;
- this.userChangePageSize = false;
- }
- });
- }
- },
- computed: {
- internalPageCount() {
- if (typeof this.total === 'number') {
- return Math.max(1, Math.ceil(this.total / this.internalPageSize));
- } else if (typeof this.pageCount === 'number') {
- return Math.max(1, this.pageCount);
- }
- return null;
- }
- },
- watch: {
- currentPage: {
- immediate: true,
- handler(val) {
- this.internalCurrentPage = this.getValidCurrentPage(val);
- }
- },
- pageSize: {
- immediate: true,
- handler(val) {
- this.internalPageSize = isNaN(val) ? 10 : val;
- }
- },
- internalCurrentPage: {
- immediate: true,
- handler(newVal) {
- this.$emit('update:currentPage', newVal);
- this.lastEmittedPage = -1;
- }
- },
- internalPageCount(newVal) {
- /* istanbul ignore if */
- const oldPage = this.internalCurrentPage;
- if (newVal > 0 && oldPage === 0) {
- this.internalCurrentPage = 1;
- } else if (oldPage > newVal) {
- this.internalCurrentPage = newVal === 0 ? 1 : newVal;
- this.userChangePageSize && this.emitChange();
- }
- this.userChangePageSize = false;
- }
- }
- };
|