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 (
);
}
// function PageSize({ number, onSelected }: { number?: number; onSelected: () => void }) {
// const { t } = useTranslation();
// const [searchParams] = useSearchParams();
// return (
//
// );
// }