feat: implement pagination reset on filter change and maintain scroll position for status toggle actions

This commit is contained in:
Yoga Pangestu 2026-04-29 21:56:51 +07:00
parent e11df20ea6
commit 90946babeb
3 changed files with 19 additions and 2 deletions

View File

@ -3,6 +3,7 @@ import type {
ColumnFiltersState, ColumnFiltersState,
SortingState, SortingState,
VisibilityState, VisibilityState,
PaginationState,
} from '@tanstack/react-table'; } from '@tanstack/react-table';
import { import {
flexRender, flexRender,
@ -104,6 +105,15 @@ export function DataTable<TData, TValue>({
const [columnVisibility, setColumnVisibility] = const [columnVisibility, setColumnVisibility] =
React.useState<VisibilityState>({}); React.useState<VisibilityState>({});
const [globalFilter, setGlobalFilter] = React.useState(''); const [globalFilter, setGlobalFilter] = React.useState('');
const [pagination, setPagination] = React.useState<PaginationState>({
pageIndex: 0,
pageSize: 10,
});
// Reset to page 1 when filters or search change
React.useEffect(() => {
setPagination((prev) => ({ ...prev, pageIndex: 0 }));
}, [globalFilter, columnFilters]);
const finalColumns = React.useMemo(() => { const finalColumns = React.useMemo(() => {
const computedColumns = [...columns]; const computedColumns = [...columns];
@ -168,7 +178,10 @@ export function DataTable<TData, TValue>({
columnVisibility, columnVisibility,
rowSelection, rowSelection,
globalFilter, globalFilter,
pagination,
}, },
onPaginationChange: setPagination,
autoResetPageIndex: false,
}); });
const selectedRows = table.getFilteredSelectedRowModel().rows; const selectedRows = table.getFilteredSelectedRowModel().rows;

View File

@ -57,6 +57,8 @@ export function useCategoryIndex() {
const onToggleStatus = (id: number) => { const onToggleStatus = (id: number) => {
router.patch(categoryRoutes.toggleStatus(id).url, {}, { router.patch(categoryRoutes.toggleStatus(id).url, {}, {
preserveState: true,
preserveScroll: true,
onSuccess: (response: any) => toast.success(response.props.flash.success), onSuccess: (response: any) => toast.success(response.props.flash.success),
}); });
}; };

View File

@ -1,8 +1,8 @@
import productRoutes from '@/routes/product';
import type { Product } from '@/types';
import { router } from '@inertiajs/react'; import { router } from '@inertiajs/react';
import { useState } from 'react'; import { useState } from 'react';
import { toast } from 'sonner'; import { toast } from 'sonner';
import productRoutes from '@/routes/product';
import type { Product } from '@/types';
export function useProductIndex() { export function useProductIndex() {
const [selectedImage, setSelectedImage] = useState<string | null>(null); const [selectedImage, setSelectedImage] = useState<string | null>(null);
@ -46,6 +46,8 @@ export function useProductIndex() {
const onToggleStatus = (id: number) => { const onToggleStatus = (id: number) => {
router.patch(productRoutes.toggleStatus(id).url, {}, { router.patch(productRoutes.toggleStatus(id).url, {}, {
preserveState: true,
preserveScroll: true,
onSuccess: (response: any) => toast.success(response.props.flash.success), onSuccess: (response: any) => toast.success(response.props.flash.success),
}); });
}; };