import type { ExtractPropTypes } from 'vue'; import { computed, toRef, defineComponent } from 'vue'; import LeftOutlined from '@ant-design/icons-vue/LeftOutlined'; import RightOutlined from '@ant-design/icons-vue/RightOutlined'; import DoubleLeftOutlined from '@ant-design/icons-vue/DoubleLeftOutlined'; import DoubleRightOutlined from '@ant-design/icons-vue/DoubleRightOutlined'; import { tuple } from '../_util/type'; import PropTypes, { withUndefined } from '../_util/vue-types'; import VcSelect from '../select'; import MiniSelect from './MiniSelect'; import { useLocaleReceiver } from '../locale-provider/LocaleReceiver'; import VcPagination from '../vc-pagination'; import enUS from '../vc-pagination/locale/en_US'; import classNames from '../_util/classNames'; import useConfigInject from '../_util/hooks/useConfigInject'; export const paginationProps = () => ({ total: PropTypes.number, defaultCurrent: PropTypes.number, disabled: PropTypes.looseBool, current: PropTypes.number, defaultPageSize: PropTypes.number, pageSize: PropTypes.number, hideOnSinglePage: PropTypes.looseBool, showSizeChanger: PropTypes.looseBool, pageSizeOptions: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.number, PropTypes.string])), buildOptionText: PropTypes.func, showSizeChange: PropTypes.func, showQuickJumper: withUndefined(PropTypes.oneOfType([PropTypes.looseBool, PropTypes.object])), showTotal: PropTypes.any, size: PropTypes.string, simple: PropTypes.looseBool, locale: PropTypes.object, prefixCls: PropTypes.string, selectPrefixCls: PropTypes.string, itemRender: PropTypes.func, role: PropTypes.string, showLessItems: PropTypes.looseBool, onChange: PropTypes.func, onShowSizeChange: PropTypes.func, 'onUpdate:current': PropTypes.func, 'onUpdate:pageSize': PropTypes.func, }); export const paginationConfig = () => ({ ...paginationProps(), position: PropTypes.oneOf(tuple('top', 'bottom', 'both')), }); export type PaginationProps = Partial>>; export type PaginationConfig = Partial>>; export type PaginationLocale = any; export default defineComponent({ name: 'APagination', inheritAttrs: false, props: paginationProps(), emits: ['change', 'showSizeChange', 'update:current', 'update:pageSize'], setup(props, { slots, attrs }) { const { prefixCls, configProvider, direction } = useConfigInject('pagination', props); const selectPrefixCls = computed(() => configProvider.getPrefixCls('select', props.selectPrefixCls), ); const [locale] = useLocaleReceiver('Pagination', enUS, toRef(props, 'locale')); const getIconsProps = (pre: string) => { const ellipsis = •••; let prevIcon = ( ); let nextIcon = ( ); let jumpPrevIcon = ( {/* You can use transition effects in the container :) */}
{ellipsis}
); let jumpNextIcon = ( {/* You can use transition effects in the container :) */}
{ellipsis}
); // change arrows direction in right-to-left direction if (direction.value === 'rtl') { [prevIcon, nextIcon] = [nextIcon, prevIcon]; [jumpPrevIcon, jumpNextIcon] = [jumpNextIcon, jumpPrevIcon]; } return { prevIcon, nextIcon, jumpPrevIcon, jumpNextIcon, }; }; return () => { const { size, itemRender = slots.itemRender, buildOptionText = slots.buildOptionText, ...restProps } = props; const isSmall = size === 'small'; const paginationProps = { ...restProps, ...getIconsProps(prefixCls.value), prefixCls: prefixCls.value, selectPrefixCls: selectPrefixCls.value, selectComponentClass: isSmall ? MiniSelect : VcSelect, locale: locale.value, buildOptionText, ...attrs, class: classNames( { mini: isSmall, [`${prefixCls.value}-rtl`]: direction.value === 'rtl' }, attrs.class, ), itemRender, }; return ; }; }, });