mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-28 18:20:57 +00:00
120 lines
3.4 KiB
TypeScript
120 lines
3.4 KiB
TypeScript
import { Button } from "../button";
|
||
import { DataTableFooterProps } from "./types";
|
||
|
||
export interface DataTableFooterOptions {
|
||
pageSizeOptions?: number[];
|
||
showPageSizeSelector?: boolean;
|
||
showRowCount?: boolean;
|
||
showPagination?: boolean;
|
||
labels?: {
|
||
rowsPerPage?: string;
|
||
page?: string;
|
||
of?: string;
|
||
showing?: string;
|
||
ofLabel?: string;
|
||
items?: string;
|
||
previous?: string;
|
||
next?: string;
|
||
};
|
||
}
|
||
|
||
interface DataTableFooterComponentProps<
|
||
TData,
|
||
> extends DataTableFooterProps<TData> {
|
||
options?: DataTableFooterOptions;
|
||
}
|
||
|
||
const defaultOptions: DataTableFooterOptions = {
|
||
pageSizeOptions: [5, 10, 25, 50],
|
||
showPageSizeSelector: true,
|
||
showRowCount: true,
|
||
showPagination: true,
|
||
labels: {
|
||
rowsPerPage: "Rows per page",
|
||
page: "Page",
|
||
of: "of",
|
||
showing: "Showing",
|
||
ofLabel: "of",
|
||
items: "items",
|
||
previous: "Previous",
|
||
next: "Next",
|
||
},
|
||
};
|
||
|
||
export function DataTableFooter<TData>({
|
||
table,
|
||
pagination,
|
||
options = {},
|
||
}: DataTableFooterComponentProps<TData>) {
|
||
const opts = { ...defaultOptions, ...options };
|
||
const labels = { ...defaultOptions.labels, ...options.labels };
|
||
|
||
const pageIndex = pagination.pageIndex ?? 0;
|
||
const pageSize = pagination.pageSize ?? 10;
|
||
const totalCount = pagination.totalCount ?? 0;
|
||
|
||
const start = totalCount === 0 ? 0 : pageIndex * pageSize + 1;
|
||
const end = Math.min((pageIndex + 1) * pageSize, totalCount);
|
||
|
||
const handlePageSizeChange = (newPageSize: number) => {
|
||
table?.setPageSize(newPageSize);
|
||
};
|
||
|
||
return (
|
||
<div className="flex flex-wrap items-center justify-between gap-4 p-4 max-sm:flex-col max-sm:items-start">
|
||
{(opts.showPageSizeSelector || opts.showRowCount) && (
|
||
<div className="flex flex-wrap items-center gap-3 text-sm text-slate-500">
|
||
{opts.showPageSizeSelector && (
|
||
<>
|
||
<label htmlFor="page-size" className="font-medium text-slate-700">
|
||
{labels.rowsPerPage}
|
||
</label>
|
||
<select
|
||
id="page-size"
|
||
value={pageSize}
|
||
onChange={(e) => handlePageSizeChange(Number(e.target.value))}
|
||
className="h-9 rounded-xl border border-slate-200 bg-white px-3 text-sm text-slate-700 outline-none transition focus:border-[#33578D]/50 focus:ring-2 focus:ring-[#33578D]/20"
|
||
>
|
||
{opts.pageSizeOptions?.map((size) => (
|
||
<option key={size} value={size}>
|
||
{size}
|
||
</option>
|
||
))}
|
||
</select>
|
||
</>
|
||
)}
|
||
{opts.showRowCount && (
|
||
<span>
|
||
{labels.showing} {start}–{end} {labels.ofLabel} {totalCount}{" "}
|
||
{labels.items}
|
||
</span>
|
||
)}
|
||
</div>
|
||
)}
|
||
|
||
{opts.showPagination && (
|
||
<div className="flex items-center justify-end space-x-2">
|
||
<div className="space-x-2">
|
||
<Button
|
||
variant="outline"
|
||
size="sm"
|
||
onClick={() => table?.previousPage()}
|
||
disabled={!table?.getCanPreviousPage()}
|
||
>
|
||
{labels.previous}
|
||
</Button>
|
||
<Button
|
||
variant="outline"
|
||
size="sm"
|
||
onClick={() => table?.nextPage()}
|
||
disabled={!table?.getCanNextPage()}
|
||
>
|
||
{labels.next}
|
||
</Button>
|
||
</div>
|
||
</div>
|
||
)}
|
||
</div>
|
||
);
|
||
}
|