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; } export default function TablePagination({ page, pageSize, totalItems, totalPages }: 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]); function onSetState(state: { page: number; pageSize: number | undefined }) { const currentPageSizeParam = searchParams["pageSize"]?.toString(); const pageSizeParam = currentPageSizeParam ?? Constants.DEFAULT_PAGE_SIZE.toString(); const pageParam = searchParams["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); } setState(state); } function getPages() { if (totalPages === 0) { return [1]; } if (totalPages > 100) { const start = Math.max(1, page - 50); const end = Math.min(totalPages, page + 50); return Array.from({ length: end - start + 1 }, (_, i) => start + i); } return Array.from({ length: totalPages }, (_, i) => i + 1); } return (
{totalItems > 0 && ( )}
{/* */}
{showPageNumberModal ? ( onSetState({ ...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" /> ) : ( // )}
{ onSetState({ 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 ( // // ); // }