@vuesax-alpha/nightly
Version:
A Component Library for Vue 3
1 lines • 26.3 kB
Source Map (JSON)
{"version":3,"file":"pagination.mjs","sources":["../../../../../../packages/components/pagination/src/pagination.ts"],"sourcesContent":["import {\n computed,\n defineComponent,\n getCurrentInstance,\n h,\n provide,\n ref,\n watch,\n} from 'vue'\nimport {\n buildProps,\n debugWarn,\n definePropType,\n getVsColor,\n iconPropType,\n isNumber,\n mutable,\n} from '@vuesax-alpha/utils'\nimport { useColorProp, useNamespace } from '@vuesax-alpha/hooks'\nimport { paginationContextKey } from '@vuesax-alpha/tokens'\nimport { ChevronLeft, ChevronRight } from '@vuesax-alpha/icons-vue'\n\nimport Next from './components/next.vue'\nimport Prev from './components/prev.vue'\nimport Sizes from './components/sizes.vue'\nimport Jumper from './components/jumper.vue'\nimport Total from './components/total.vue'\nimport Pager from './components/pager.vue'\n\nimport type { ExtractPropTypes, VNode } from 'vue'\n\n/**\n * It it user's responsibility to guarantee that the value of props.total... is number\n * (same as pageSize, defaultPageSize, currentPage, defaultCurrentPage, pageCount)\n * Otherwise we can reasonable infer that the corresponding field is absent\n */\nconst isAbsent = (v: unknown): v is undefined => typeof v !== 'number'\ntype LayoutKey =\n | 'prev'\n | 'pager'\n | 'next'\n | 'jumper'\n | '->'\n | 'total'\n | 'slot'\n | 'sizes'\n\nexport const paginationProps = buildProps({\n /**\n * @description Component color - Accept Vuesax's color, Hex, rgb\n */\n color: useColorProp,\n\n /** @description total item count */\n total: { type: Number },\n\n /** @description default initial value of current page */\n defaultCurrentPage: { type: Number },\n\n /** @description current page number */\n currentPage: { type: Number },\n\n /** @description default initial value of page size */\n defaultPageSize: { type: Number },\n\n /** @description options of item count per page */\n pageSize: { type: Number },\n\n /**\n * @description total page count. Set either `total` or `page-count` and pages will be displayed; if you need `page-sizes`, `total` is required\n */\n pageCount: { type: Number },\n\n /**\n * @description number of pages to show. Pagination collapses when the total page count exceeds this value\n */\n pagerCount: {\n type: Number,\n validator: (value: unknown) => {\n return (\n isNumber(value) &&\n Math.trunc(value) === value &&\n value > 4 &&\n value < 22 &&\n value % 2 === 1\n )\n },\n default: 7,\n },\n\n /** @description layout of Pagination, an array or string elements separated with a comma */\n layout: {\n type: definePropType<LayoutKey[] | LayoutKey>([String, Array]),\n default: () =>\n mutable([\n 'prev',\n 'pager',\n 'next',\n 'jumper',\n '->',\n 'total',\n 'slot',\n 'sizes',\n ] as const),\n },\n\n /** @description item count of each page */\n pageSizes: {\n type: definePropType<number[]>(Array),\n default: () => mutable([10, 20, 30, 40, 50, 100] as const),\n },\n\n /** @description */\n hideOnSinglePage: { type: Boolean },\n\n /** @description text for the prev button */\n prevText: {\n type: String,\n default: '',\n },\n /** @description icon for the prev button, higher priority of `prev-text` */\n prevIcon: {\n type: iconPropType,\n default: () => ChevronLeft,\n },\n /** @description text for the next button */\n nextText: {\n type: String,\n default: '',\n },\n /** @description icon for the next button, higher priority of `next-text` */\n nextIcon: {\n type: iconPropType,\n default: () => ChevronRight,\n },\n\n /** @description Determine if the pagination is infinite. */\n infinite: { type: Boolean, default: false },\n\n /** @description Add a progress bar to the component determined by the current page and the total (length) of pages. */\n progress: { type: Boolean },\n\n /** @description Change the margin between the items causing them to be fully glued and the radius is removed making them square. */\n notMargin: { type: Boolean },\n\n /** @description Makes the buttons not have the internal number and changes its size. */\n buttonsDotted: { type: Boolean, default: false },\n\n shape: {\n type: String,\n values: ['circle', 'square'] as const,\n default: '',\n },\n\n /** @description Determine if the entire component is in the disabled state. */\n disabled: { type: Boolean, default: false },\n\n /** @description Determine which items are in the disabled state. */\n disabledItems: {\n type: definePropType<number[]>(Array),\n default: (): number[] => [],\n },\n\n /** @description Determine which items are in the charging state. */\n loadingItems: {\n type: definePropType<number[]>(Array),\n default: (): number[] => [],\n },\n} as const)\n\nexport type PaginationProps = ExtractPropTypes<typeof paginationProps>\n\nexport const paginationEmits = {\n 'update:current-page': (val: number) => isNumber(val),\n 'update:page-size': (val: number) => isNumber(val),\n 'size-change': (val: number) => isNumber(val),\n 'page-change': (val: number) => isNumber(val),\n 'prev-click': (val: number) => isNumber(val),\n 'next-click': (val: number) => isNumber(val),\n}\n\nexport type PaginationEmits = typeof paginationEmits\n\nconst COMPONENT_NAME = 'VsPagination'\n\nexport default defineComponent({\n name: COMPONENT_NAME,\n props: paginationProps,\n emits: paginationEmits,\n setup(props, { emit, slots }) {\n const ns = useNamespace('pagination')\n\n const vnodeProps = getCurrentInstance()!.vnode.props || {}\n\n // we can find @xxx=\"xxx\" props on `vnodeProps` to check if user bind corresponding events\n const hasCurrentPageListener =\n 'onUpdate:currentPage' in vnodeProps ||\n 'onUpdate:current-page' in vnodeProps ||\n 'onCurrentChange' in vnodeProps\n const hasPageSizeListener =\n 'onUpdate:pageSize' in vnodeProps ||\n 'onUpdate:page-size' in vnodeProps ||\n 'onSizeChange' in vnodeProps\n\n const assertValidUsage = computed(() => {\n // Users have to set either one, otherwise count of pages cannot be determined\n if (isAbsent(props.total) && isAbsent(props.pageCount))\n return 'need to set props `total` or `pageCount`, otherwise count of pages cannot be determined.'\n\n // <pagination ...otherProps :current-page=\"xxx\" /> without corresponding listener is forbidden now\n // Users have to use two way binding of `currentPage`\n // If users just want to provide a default value, `defaultCurrentPage` is here for you\n if (!isAbsent(props.currentPage) && !hasCurrentPageListener)\n return 'You have to use v-model binding of `currentPage`.\\nIf you just want to provide a default value, `defaultCurrentPage` is here for you.'\n\n // When you want to change sizes, things get more complex, detailed below\n // Basically the most important value we need is page count\n // either directly from props.pageCount\n // or calculated from props.total\n // we will take props.pageCount precedence over props.total\n if (props.layout.includes('sizes')) {\n if (!isAbsent(props.pageCount)) {\n // if props.pageCount is assign by user, then user have to watch pageSize change\n // and recalculate pageCount\n if (!hasPageSizeListener)\n return 'Your layout having `sizes`. If `pageCount` is assign, then you have to watch `pageSize` change and recalculate `pageCount`.'\n } else if (!isAbsent(props.total)) {\n // Otherwise, we will see if user have props.pageSize defined\n // If so, meaning user want to have pageSize controlled himself/herself from component\n // Thus page size listener is required\n // users are account for page size change\n if (!isAbsent(props.pageSize)) {\n if (!hasPageSizeListener) {\n return 'Your layout having `sizes`. If you have `pageSize` defined, meaning you want to have `pageSize` controlled yourself from component. Thus page size `listener` is required, you are account for `pageSize` changed.'\n }\n } else {\n // (else block just for explaination)\n // else page size is controlled by pagination internally\n }\n }\n }\n return true\n })\n\n const innerPageSize = ref(\n isAbsent(props.defaultPageSize) ? 10 : props.defaultPageSize\n )\n\n const innerCurrentPage = ref(\n isAbsent(props.defaultCurrentPage) ? 1 : props.defaultCurrentPage\n )\n\n const pageSizeBridge = computed({\n get() {\n return isAbsent(props.pageSize) ? innerPageSize.value : props.pageSize\n },\n set(v: number) {\n if (isAbsent(props.pageSize)) {\n innerPageSize.value = v\n }\n if (hasPageSizeListener) {\n emit('update:page-size', v)\n emit('size-change', v)\n }\n },\n })\n\n const pageCountBridge = computed<number>(() => {\n let pageCount = 0\n if (!isAbsent(props.pageCount)) {\n pageCount = props.pageCount\n } else if (!isAbsent(props.total)) {\n pageCount = Math.max(1, Math.ceil(props.total / pageSizeBridge.value))\n }\n return pageCount\n })\n\n const currentPageBridge = computed<number>({\n get() {\n return isAbsent(props.currentPage)\n ? innerCurrentPage.value\n : props.currentPage\n },\n set(v) {\n let newCurrentPage = v\n if (v < 1) {\n newCurrentPage = props.infinite ? pageCountBridge.value : 1\n } else if (v > pageCountBridge.value) {\n newCurrentPage = props.infinite ? 1 : pageCountBridge.value\n }\n if (isAbsent(props.currentPage)) {\n innerCurrentPage.value = newCurrentPage\n }\n if (hasCurrentPageListener) {\n emit('update:current-page', newCurrentPage)\n emit('page-change', newCurrentPage)\n }\n },\n })\n\n watch(currentPageBridge, (newValue, oldValue) => {\n if (isPagerDisabled(newValue) || isPagerLoading(newValue)) {\n let newVal = newValue\n if (newValue > oldValue) {\n newVal += 1\n } else {\n newVal -= 1\n }\n\n if (newVal > pageCountBridge.value) {\n newVal = props.infinite ? 1 : oldValue\n } else if (newVal <= 0) {\n newVal = props.infinite ? pageCountBridge.value : newValue + 1\n }\n\n currentPageBridge.value = newVal\n }\n })\n\n watch(pageCountBridge, (val) => {\n if (currentPageBridge.value > val) currentPageBridge.value = val\n })\n\n const isPagerLoading = (pager = Number.NaN) =>\n props.loadingItems.includes(pager)\n\n const isPagerDisabled = (pager = Number.NaN) =>\n props.disabled || props.disabledItems.includes(pager)\n\n function handleCurrentChange(val: number) {\n currentPageBridge.value = val\n }\n\n function handleSizeChange(val: number) {\n pageSizeBridge.value = val\n const newPageCount = pageCountBridge.value\n if (currentPageBridge.value > newPageCount) {\n currentPageBridge.value = newPageCount\n }\n }\n\n function prev() {\n if (props.disabled) return\n currentPageBridge.value -= 1\n emit('prev-click', currentPageBridge.value)\n }\n\n function next() {\n if (props.disabled) return\n currentPageBridge.value += 1\n emit('next-click', currentPageBridge.value)\n }\n\n function addClass(element: any, cls: string) {\n if (element) {\n if (!element.props) {\n element.props = {}\n }\n element.props.class = [element.props.class, cls].join(' ')\n }\n }\n\n provide(paginationContextKey, {\n pageCount: pageCountBridge,\n disabled: computed(() => props.disabled),\n currentPage: currentPageBridge,\n buttonsDotted: computed(() => props.buttonsDotted),\n infinite: computed(() => props.infinite),\n loadingItems: computed(() => props.loadingItems),\n disabledItems: computed(() => props.disabledItems),\n isPagerDisabled,\n isPagerLoading,\n changeEvent: handleCurrentChange,\n handleSizeChange,\n })\n\n return () => {\n if (assertValidUsage.value != true) {\n debugWarn(COMPONENT_NAME, assertValidUsage.value)\n return null\n }\n if (!props.layout.length) return null\n if (props.hideOnSinglePage && pageCountBridge.value <= 1) return null\n\n const rootChildren: Array<VNode | VNode[] | null> = []\n const rightWrapperChildren: Array<VNode | VNode[] | null> = []\n const rightWrapperRoot = h(\n 'div',\n { class: ns.e('rightwrapper') },\n rightWrapperChildren\n )\n const TEMPLATE_MAP: Record<\n Exclude<LayoutKey, '->'>,\n VNode | VNode[] | null\n > = {\n prev: h(Prev, {\n prevText: props.prevText,\n prevIcon: props.prevIcon,\n onClick: prev,\n }),\n jumper: h(Jumper),\n pager: h(Pager, {\n color: props.color,\n progress: props.progress,\n pagerCount: props.pagerCount,\n onChange: handleCurrentChange,\n }),\n next: h(Next, {\n nextText: props.nextText,\n nextIcon: props.nextIcon,\n onClick: next,\n }),\n sizes: h(Sizes, {\n pageSize: pageSizeBridge.value,\n pageSizes: props.pageSizes,\n }),\n slot:\n slots?.default?.({\n currentPage: currentPageBridge.value,\n total: props.total,\n pageSize: pageSizeBridge.value,\n pageSizes: props.pageSizes,\n pagerCount: props.pagerCount,\n }) ?? null,\n total: h(Total, { total: isAbsent(props.total) ? 0 : props.total }),\n }\n\n const components = props.layout\n .toString()\n .split(',')\n .map((item: string) => item.trim()) as LayoutKey[]\n\n let haveRightWrapper = false\n\n components.forEach((c) => {\n if (c === '->') {\n haveRightWrapper = true\n return\n }\n if (!haveRightWrapper) {\n rootChildren.push(TEMPLATE_MAP[c])\n } else {\n rightWrapperChildren.push(TEMPLATE_MAP[c])\n }\n })\n\n addClass(rootChildren[0], ns.is('first'))\n addClass(rootChildren[rootChildren.length - 1], ns.is('last'))\n\n if (haveRightWrapper && rightWrapperChildren.length > 0) {\n addClass(rightWrapperChildren[0], ns.is('first'))\n addClass(\n rightWrapperChildren[rightWrapperChildren.length - 1],\n ns.is('last')\n )\n rootChildren.push(rightWrapperRoot)\n }\n return h(\n 'div',\n {\n role: 'pagination',\n 'aria-label': 'pagination',\n class: [\n ns.b(),\n ns.is(props.shape),\n ns.is('buttons-dotted', props.buttonsDotted),\n ns.is('not-margin', props.notMargin),\n ],\n style: ns.cssVar({\n color: getVsColor(props.color),\n }),\n },\n rootChildren\n )\n }\n },\n})\n"],"names":[],"mappings":"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"}