| 1 |
578311c |
Mrdn |
2y ago |
import { |
| 2 |
578311c |
Mrdn |
2y ago |
ChevronLeftIcon, |
| 3 |
578311c |
Mrdn |
2y ago |
ChevronRightIcon, |
| 4 |
578311c |
Mrdn |
2y ago |
DoubleArrowLeftIcon, |
| 5 |
578311c |
Mrdn |
2y ago |
DoubleArrowRightIcon, |
| 6 |
aec4bc7 |
Mrdn |
2y ago |
} from "@radix-ui/react-icons"; |
| 7 |
578311c |
Mrdn |
2y ago |
import { |
| 8 |
578311c |
Mrdn |
2y ago |
Button, |
| 9 |
578311c |
Mrdn |
2y ago |
Select, |
| 10 |
578311c |
Mrdn |
2y ago |
SelectContent, |
| 11 |
578311c |
Mrdn |
2y ago |
SelectItem, |
| 12 |
578311c |
Mrdn |
2y ago |
SelectTrigger, |
| 13 |
578311c |
Mrdn |
2y ago |
SelectValue, |
| 14 |
7389ad0 |
Mardin |
2y ago |
} from "@marzneshin/common/components"; |
| 15 |
aec4bc7 |
Mrdn |
2y ago |
import { useTranslation } from "react-i18next"; |
| 16 |
65bbe9d |
Mardin |
2y ago |
import { Table } from "@tanstack/react-table" |
| 17 |
578311c |
Mrdn |
2y ago |
|
| 18 |
65bbe9d |
Mardin |
2y ago |
export function DataTablePagination<TData>({ table }: { table: Table<TData> }) { |
| 19 |
578311c |
Mrdn |
2y ago |
const { t } = useTranslation(); |
| 20 |
aec4bc7 |
Mrdn |
2y ago |
|
| 21 |
578311c |
Mrdn |
2y ago |
return ( |
| 22 |
578311c |
Mrdn |
2y ago |
<div className="flex justify-between items-center p-2 w-full"> |
| 23 |
aec4bc7 |
Mrdn |
2y ago |
{table.options.onRowSelectionChange && ( |
| 24 |
578311c |
Mrdn |
2y ago |
<div className="flex-1 text-sm text-muted-foreground"> |
| 25 |
578311c |
Mrdn |
2y ago |
{table.getFilteredSelectedRowModel().rows.length} {"/"} |
| 26 |
aec4bc7 |
Mrdn |
2y ago |
{table.getFilteredRowModel().rows.length} {t("table.selected")} |
| 27 |
aec4bc7 |
Mrdn |
2y ago |
</div> |
| 28 |
aec4bc7 |
Mrdn |
2y ago |
)} |
| 29 |
ded762d |
Mrdn |
2y ago |
<div className="flex justify-between items-center space-x-6 w-full lg:space-x-8"> |
| 30 |
578311c |
Mrdn |
2y ago |
<div className="flex items-center space-x-2"> |
| 31 |
4cebd65 |
Mardin |
2y ago |
<label id="rows-per-page-label" htmlFor="rows-per-page-select" className="text-sm font-medium"> |
| 32 |
4cebd65 |
Mardin |
2y ago |
{t("table.row-per-page")} |
| 33 |
4cebd65 |
Mardin |
2y ago |
</label> |
| 34 |
578311c |
Mrdn |
2y ago |
<Select |
| 35 |
578311c |
Mrdn |
2y ago |
value={`${table.getState().pagination.pageSize}`} |
| 36 |
578311c |
Mrdn |
2y ago |
onValueChange={(value) => { |
| 37 |
aec4bc7 |
Mrdn |
2y ago |
table.setPageSize(Number(value)); |
| 38 |
aec4bc7 |
Mrdn |
2y ago |
table.setPageIndex(1); |
| 39 |
578311c |
Mrdn |
2y ago |
}} |
| 40 |
4cebd65 |
Mardin |
2y ago |
aria-labelledby="rows-per-page-label" |
| 41 |
578311c |
Mrdn |
2y ago |
> |
| 42 |
4cebd65 |
Mardin |
2y ago |
<SelectTrigger |
| 43 |
4cebd65 |
Mardin |
2y ago |
className="h-8 w-[70px]" |
| 44 |
4cebd65 |
Mardin |
2y ago |
aria-controls="rows-per-page-listbox" |
| 45 |
4cebd65 |
Mardin |
2y ago |
aria-labelledby="rows-per-page-label" |
| 46 |
4cebd65 |
Mardin |
2y ago |
> |
| 47 |
578311c |
Mrdn |
2y ago |
<SelectValue placeholder={table.getState().pagination.pageSize} /> |
| 48 |
578311c |
Mrdn |
2y ago |
</SelectTrigger> |
| 49 |
4cebd65 |
Mardin |
2y ago |
<SelectContent |
| 50 |
4cebd65 |
Mardin |
2y ago |
id="rows-per-page-listbox" |
| 51 |
4cebd65 |
Mardin |
2y ago |
side="top" |
| 52 |
4cebd65 |
Mardin |
2y ago |
aria-labelledby="rows-per-page-label" |
| 53 |
4cebd65 |
Mardin |
2y ago |
> |
| 54 |
578311c |
Mrdn |
2y ago |
{[10, 20, 50, 100].map((pageSize) => ( |
| 55 |
4cebd65 |
Mardin |
2y ago |
<SelectItem |
| 56 |
4cebd65 |
Mardin |
2y ago |
key={pageSize} |
| 57 |
4cebd65 |
Mardin |
2y ago |
value={`${pageSize}`} |
| 58 |
4cebd65 |
Mardin |
2y ago |
aria-selected={table.getState().pagination.pageSize === pageSize} |
| 59 |
4cebd65 |
Mardin |
2y ago |
> |
| 60 |
578311c |
Mrdn |
2y ago |
{pageSize} |
| 61 |
578311c |
Mrdn |
2y ago |
</SelectItem> |
| 62 |
578311c |
Mrdn |
2y ago |
))} |
| 63 |
578311c |
Mrdn |
2y ago |
</SelectContent> |
| 64 |
578311c |
Mrdn |
2y ago |
</Select> |
| 65 |
578311c |
Mrdn |
2y ago |
</div> |
| 66 |
ca9d44e |
Mardin |
2y ago |
{(table.getPageCount() - 1) !== 0 && |
| 67 |
ca9d44e |
Mardin |
2y ago |
<div className="flex justify-center items-center text-sm font-medium w-[100px]"> |
| 68 |
ca9d44e |
Mardin |
2y ago |
Page {table.getState().pagination.pageIndex + 1} of{" "} |
| 69 |
ca9d44e |
Mardin |
2y ago |
{table.getPageCount() - 1} |
| 70 |
ca9d44e |
Mardin |
2y ago |
</div> |
| 71 |
ca9d44e |
Mardin |
2y ago |
} |
| 72 |
578311c |
Mrdn |
2y ago |
<div className="flex items-center space-x-2"> |
| 73 |
578311c |
Mrdn |
2y ago |
<Button |
| 74 |
578311c |
Mrdn |
2y ago |
variant="outline" |
| 75 |
578311c |
Mrdn |
2y ago |
className="hidden p-0 w-8 h-8 lg:flex" |
| 76 |
578311c |
Mrdn |
2y ago |
onClick={() => table.setPageIndex(1)} |
| 77 |
578311c |
Mrdn |
2y ago |
disabled={!table.getCanPreviousPage()} |
| 78 |
578311c |
Mrdn |
2y ago |
> |
| 79 |
578311c |
Mrdn |
2y ago |
<span className="sr-only">Go to first page</span> |
| 80 |
578311c |
Mrdn |
2y ago |
<DoubleArrowLeftIcon className="w-4 h-4" /> |
| 81 |
578311c |
Mrdn |
2y ago |
</Button> |
| 82 |
578311c |
Mrdn |
2y ago |
<Button |
| 83 |
578311c |
Mrdn |
2y ago |
variant="outline" |
| 84 |
578311c |
Mrdn |
2y ago |
className="p-0 w-8 h-8" |
| 85 |
578311c |
Mrdn |
2y ago |
onClick={() => table.previousPage()} |
| 86 |
578311c |
Mrdn |
2y ago |
disabled={!table.getCanPreviousPage()} |
| 87 |
578311c |
Mrdn |
2y ago |
> |
| 88 |
578311c |
Mrdn |
2y ago |
<span className="sr-only">Go to previous page</span> |
| 89 |
578311c |
Mrdn |
2y ago |
<ChevronLeftIcon className="w-4 h-4" /> |
| 90 |
578311c |
Mrdn |
2y ago |
</Button> |
| 91 |
578311c |
Mrdn |
2y ago |
<Button |
| 92 |
578311c |
Mrdn |
2y ago |
variant="outline" |
| 93 |
578311c |
Mrdn |
2y ago |
className="p-0 w-8 h-8" |
| 94 |
578311c |
Mrdn |
2y ago |
onClick={() => table.nextPage()} |
| 95 |
578311c |
Mrdn |
2y ago |
disabled={!table.getCanNextPage()} |
| 96 |
578311c |
Mrdn |
2y ago |
> |
| 97 |
578311c |
Mrdn |
2y ago |
<span className="sr-only">Go to next page</span> |
| 98 |
578311c |
Mrdn |
2y ago |
<ChevronRightIcon className="w-4 h-4" /> |
| 99 |
578311c |
Mrdn |
2y ago |
</Button> |
| 100 |
578311c |
Mrdn |
2y ago |
<Button |
| 101 |
578311c |
Mrdn |
2y ago |
variant="outline" |
| 102 |
578311c |
Mrdn |
2y ago |
className="hidden p-0 w-8 h-8 lg:flex" |
| 103 |
578311c |
Mrdn |
2y ago |
onClick={() => table.setPageIndex(table.getPageCount() - 1)} |
| 104 |
578311c |
Mrdn |
2y ago |
disabled={!table.getCanNextPage()} |
| 105 |
578311c |
Mrdn |
2y ago |
> |
| 106 |
578311c |
Mrdn |
2y ago |
<span className="sr-only">Go to last page</span> |
| 107 |
578311c |
Mrdn |
2y ago |
<DoubleArrowRightIcon className="w-4 h-4" /> |
| 108 |
578311c |
Mrdn |
2y ago |
</Button> |
| 109 |
578311c |
Mrdn |
2y ago |
</div> |
| 110 |
578311c |
Mrdn |
2y ago |
</div> |
| 111 |
578311c |
Mrdn |
2y ago |
</div> |
| 112 |
aec4bc7 |
Mrdn |
2y ago |
); |
| 113 |
578311c |
Mrdn |
2y ago |
} |