import { Select, Option } from "../FormElements/Select";
import { InnerInput } from "../FormElements/Input/input";
import { PagePrev } from "./PagePrev";
import { PageNext } from "./PageNext";
import { PageItem } from "./PageItem";
import { useClassList } from "../utils/useProps";
import { createEffect, createSignal, For, Match, Show, Switch } from "solid-js";
const pages = [
{value: 10, label: '10条/页'},
{value: 20, label: '20条/页'},
{value: 50, label: '50条/页'},
{value: 100, label: '100条/页'}
];
export interface PaginationProps {
classList?: any
class?: any
shape?: 'normal'|'circle'
size?: 'small'|'large'
current: number
total: number
pageSize: number
onChange?: Function
onChangePageSize?: Function
innerNear?: number
displayedPages?: number
startEndShowNum?: number
showNums?: boolean
mini?: boolean
style?: any
showTotal?: boolean
showPage?: boolean
showJumper?: boolean
pages?: any[]
}
export function Pagination(props: PaginationProps) {
const classList = () => useClassList(props, 'cm-pagination', {
[`cm-pagination-${props.shape }`]: props.shape ,
[`cm-pagination-${props.size}`]: props.size
});
const current = () => props.current;
const total = () => props.total ?? 0;
const pageSize = () => props.pageSize ?? 10;
const innerNear = props.innerNear ?? 2;
const startEndShowNum = props.startEndShowNum ?? 2;
const showNums = props.showNums ?? true;
const showTotal = props.showTotal ?? true;
const ps = props.pages ?? pages;
const showJumper = props.showJumper ?? true;
const showPage = props.showPage ?? true;
const [pageNum, setPageNum] = createSignal(current());
createEffect(() => {
if (current() != pageNum()) {
setPageNum(current());
}
});
const prev = () => {
if (current() > 1) {
_handleChange(current() - 1);
}
};
const next = () => {
if (current() < _calcPage()) {
_handleChange(current() + 1);
}
};
const gotoPage = (v: string) => {
_handleChange(parseInt(v, 10));
}
const _calcPage = () => {
// 没数据的时候默认为第一页
if (total() === 0) {
return 1;
}
return Math.floor((total() - 1) / pageSize()) + 1;
};
const _isValid = (page: number) => {
return typeof page === 'number' && page >= 1;
}
/**
* 页号改变
* @method _handleChange
* @param p 当前页号
* @returns {*}
* @private
*/
const _handleChange = (p: number) => {
let page = p;
if (_isValid(page) && page !== current()) {
if (page > _calcPage()) {
page = _calcPage();
}
setPageNum(page);
if (props.onChange) {
props.onChange(page, pageSize);
}
}
}
const onChangePageSize = (size: number) => {
const totalPages = Math.floor((total() - 1) / size) + 1;
props.onChangePageSize && props.onChangePageSize(size);
if (current() > totalPages) {
setPageNum(1);
if (props.onChange) {
props.onChange(1, pageSize);
}
}
}
/**
* 获取中间显示的页号
* @method _getInner
* @returns {{start: number, end: number}}
* @private
*/
function _getInner () {
const pages = _calcPage();
const start = current () > startEndShowNum + innerNear + 1 ? current() - innerNear : startEndShowNum + 1;
const end = current() + innerNear + startEndShowNum >= pages ? pages - startEndShowNum : current() + innerNear;
return {start, end};
}
function rednderItems () {
if (!showNums) {
return null;
}
const pages = _calcPage();
const pagerList = [];
const interval = _getInner();
const cur = current();
for (let i = 1; i <= startEndShowNum; i++) {
let active = cur === i;
pagerList.push(