import { FormEvent, useEffect, useState } from "react"; import Modal from "../modals/Modal"; import Constants from "../../../application/Constants"; import clsx from "clsx"; import InputSelector from "../input/InputSelector"; import InputNumber from "../input/InputNumber"; import {ButtonPrimary} from "../buttons/ButtonPrimary"; import {ButtonSecondary} from "../buttons/ButtonSecondary"; import { useApp } from "../../../hooks"; import { useRouter, useSearchParams } from "next/navigation"; interface Props { page: number; pageSize: number; totalItems: number; totalPages: number; defaultPageSize?: number; } export default function GridPagination({ page, pageSize, totalItems, totalPages, defaultPageSize = Constants.DEFAULT_PAGE_SIZE }: Props) { const { t } = useApp(); const [state, setState] = useState<{ page: number; pageSize: number | undefined }>({ page, pageSize }); const [from, setFrom] = useState(0); const [to, setTo] = useState(0); // const submit = useSubmit(); const navigation = useRouter(); const loading = false //navigation.state === "loading" || navigation.state === "submitting"; const [searchParams, setSearchParams] = useSearchParams(); const [showPageSizeModal, setShowPageSizeModal] = useState(false); const [showPageNumberModal, setShowPageNumberModal] = useState(false); useEffect(() => { setFrom(page * pageSize - pageSize + 1); let to = page * pageSize; if (to > totalItems) { to = totalItems; } setTo(to); }, [page, pageSize, totalItems]); useEffect(() => { /* const pageSizeParam = searchParams.get("pageSize")?.toString() ?? defaultPageSize.toString(); const pageParam = searchParams.get("page")?.toString() ?? "1"; if (state.page.toString() !== pageParam || state.pageSize?.toString() !== pageSizeParam) { if (state.page.toString() !== pageParam) { searchParams.set("page", state.page.toString()); } if (state.pageSize?.toString() !== pageSizeParam) { if (state.pageSize) { searchParams.set("pageSize", state.pageSize.toString()); } else { searchParams.delete("pageSize"); } } setSearchParams(searchParams); } */ // eslint-disable-next-line react-hooks/exhaustive-deps }, [state]); return (
{totalItems > 0 && ( )}
{showPageNumberModal ? ( setState({ ...state, page: parseInt(e.target.value) })} onBlur={() => setShowPageNumberModal(false)} className="block w-full min-w-0 flex-1 rounded border-gray-200 text-xs focus:border-accent-500 focus:ring-accent-500" /> ) : ( )}
{ setState({ page: e.currentPage, pageSize: e.pageSize, }); setShowPageSizeModal(false); }} />
); } function PageOptionsForm({ page, pageSize, onChange, totalItems, }: { page: number; pageSize?: number; totalItems?: number; onChange: (state: { currentPage: number; pageSize?: number }) => void; }) { const { t } = useApp(); const [totalPages, setTotalPages] = useState(0); const [state, setState] = useState({ currentPage: page, pageSize: pageSize }); useEffect(() => { if (totalItems) { setTotalPages(Math.ceil(totalItems / (state.pageSize || Constants.DEFAULT_PAGE_SIZE))); } }, [state.pageSize, totalItems]); function handleSubmit(e: FormEvent) { e.stopPropagation(); e.preventDefault(); onChange(state); } function onReset() { onChange({ currentPage: 1, pageSize: undefined }); } function existingChanges() { return state.pageSize !== Constants.DEFAULT_PAGE_SIZE || state.currentPage !== 1; } return (
setState({ ...state, pageSize: Number(e) })} options={[undefined, ...Constants.PAGE_SIZE_OPTIONS].map((size) => { return { value: size, name: size === undefined ? t("shared.default") : size.toString(), }; })} />
{t("shared.totalPages")}: {totalPages}
} value={state.currentPage} min={1} max={totalPages} setValue={(e) => setState({ ...state, currentPage: Number(e) })} />
{t("shared.reset")} {t("shared.confirm")}
); } // function PageSize({ number, onSelected }: { number?: number; onSelected: () => void }) { // const { t } = useTranslation(); // const [searchParams] = useSearchParams(); // return ( // // ); // }