fix: tighten workspace controls

This commit is contained in:
2026-07-02 18:24:35 -07:00
parent fd548eaa7b
commit 7718d9759c
9 changed files with 331 additions and 81 deletions

View File

@@ -4,8 +4,6 @@ import { buildPageHref } from "@/modules/settings/lib/pagination";
type TableToolbarProps = {
actionLabel?: string;
page: number;
pageCount: number;
pathname: string;
query: string;
searchPlaceholder: string;
@@ -14,8 +12,6 @@ type TableToolbarProps = {
export function TableToolbar({
actionLabel,
page,
pageCount,
pathname,
query,
searchPlaceholder,
@@ -29,31 +25,88 @@ export function TableToolbar({
</Button>
</form>
<div className="flex items-center justify-between gap-3 text-sm text-muted-foreground">
<span>{actionLabel ?? `${total}`}</span>
<div className="flex items-center gap-2">
{page <= 1 ? (
<Button disabled size="sm" variant="outline">
</Button>
) : (
<LinkButton href={buildPageHref(pathname, query, page - 1)} size="sm" variant="outline">
</LinkButton>
)}
<span className="min-w-16 text-center">
{page}/{pageCount}
</span>
{page >= pageCount ? (
<Button disabled size="sm" variant="outline">
</Button>
) : (
<LinkButton href={buildPageHref(pathname, query, page + 1)} size="sm" variant="outline">
</LinkButton>
)}
</div>
<span className="text-sm text-muted-foreground">{actionLabel ?? `${total}`}</span>
</div>
);
}
type TablePaginationProps = {
page: number;
pageCount: number;
pathname: string;
query: string;
total: number;
};
export function TablePagination({
page,
pageCount,
pathname,
query,
total,
}: TablePaginationProps): React.ReactElement {
const safePage = Math.min(page, pageCount);
const isFirstPage = safePage <= 1;
const isLastPage = safePage >= pageCount;
return (
<div className="flex flex-col gap-3 border-t p-4 text-sm text-muted-foreground lg:flex-row lg:items-center lg:justify-between">
<span> {total} </span>
<div className="flex flex-wrap items-center gap-2">
{isFirstPage ? (
<Button disabled size="sm" variant="outline">
</Button>
) : (
<LinkButton href={buildPageHref(pathname, query, 1)} size="sm" variant="outline">
</LinkButton>
)}
{isFirstPage ? (
<Button disabled size="sm" variant="outline">
</Button>
) : (
<LinkButton href={buildPageHref(pathname, query, safePage - 1)} size="sm" variant="outline">
</LinkButton>
)}
<span className="min-w-14 text-center text-foreground">
{safePage}/{pageCount}
</span>
<form action={pathname} className="flex items-center gap-2">
{query.trim() ? <input name="q" type="hidden" value={query.trim()} /> : null}
<Input
aria-label="跳转页码"
className="h-9 w-20"
defaultValue={safePage}
max={pageCount}
min={1}
name="page"
type="number"
/>
<Button size="sm" type="submit" variant="outline">
</Button>
</form>
{isLastPage ? (
<Button disabled size="sm" variant="outline">
</Button>
) : (
<LinkButton href={buildPageHref(pathname, query, safePage + 1)} size="sm" variant="outline">
</LinkButton>
)}
{isLastPage ? (
<Button disabled size="sm" variant="outline">
</Button>
) : (
<LinkButton href={buildPageHref(pathname, query, pageCount)} size="sm" variant="outline">
</LinkButton>
)}
</div>
</div>
);