diff --git a/app/Http/Controllers/Admin/AcademicClasses/MaterialController.php b/app/Http/Controllers/Admin/AcademicClasses/MaterialController.php index 5543d83..740f16f 100644 --- a/app/Http/Controllers/Admin/AcademicClasses/MaterialController.php +++ b/app/Http/Controllers/Admin/AcademicClasses/MaterialController.php @@ -22,11 +22,11 @@ public function __construct( public function index(PaginatedRequest $request): Response { return Inertia::render('admin/academic-classes/materials/index', [ - 'materials' => $this->service->paginated( + 'materials' => Inertia::scroll(fn () => $this->service->paginated( $request->user(), ...$request->validatedWithDefaults(), courseClassId: $request->validated('course_class_id'), - ), + )), 'courseClasses' => $this->courseClassService->getAllForSelect($request->user()), 'filters' => $request->only(['course_class_id']), ]); diff --git a/app/Http/Controllers/Admin/Developer/LogController.php b/app/Http/Controllers/Admin/Developer/LogController.php index 9067867..58b0790 100644 --- a/app/Http/Controllers/Admin/Developer/LogController.php +++ b/app/Http/Controllers/Admin/Developer/LogController.php @@ -22,11 +22,11 @@ public function index(PaginatedRequest $request): Response return Inertia::render('admin/developer/logs/index', [ 'entries' => $file - ? $this->service->paginated( + ? Inertia::scroll(fn () => $this->service->paginated( $file, ...$request->validatedWithDefaults(), level: $request->validated('level'), - ) + )) : null, 'files' => $files, 'selectedFile' => $file, diff --git a/app/Http/Controllers/Admin/FeedbackController.php b/app/Http/Controllers/Admin/FeedbackController.php index c244692..9a3f9b6 100644 --- a/app/Http/Controllers/Admin/FeedbackController.php +++ b/app/Http/Controllers/Admin/FeedbackController.php @@ -25,12 +25,12 @@ public function __construct( public function index(PaginatedRequest $request): Response { return Inertia::render('admin/feedback/index', [ - 'feedbacks' => $this->service->paginated( + 'feedbacks' => Inertia::scroll(fn () => $this->service->paginated( $request->user(), ...$request->validatedWithDefaults(), type: $request->validated('type'), status: $request->validated('status'), - ), + )), 'types' => FeedbackType::options(), 'statuses' => FeedbackStatus::options(), 'filters' => $request->only(['type', 'status']), diff --git a/app/Http/Controllers/Admin/Finances/TuitionInvoiceController.php b/app/Http/Controllers/Admin/Finances/TuitionInvoiceController.php index e4c3957..a3e4687 100644 --- a/app/Http/Controllers/Admin/Finances/TuitionInvoiceController.php +++ b/app/Http/Controllers/Admin/Finances/TuitionInvoiceController.php @@ -38,12 +38,12 @@ public function index(PaginatedRequest $request): Response $summaryTermId = $requestedTermId ?? $this->academicTermService->getActive()?->id; return Inertia::render('admin/finances/tuition-invoices/index', [ - 'invoices' => $this->service->paginated( + 'invoices' => Inertia::scroll(fn () => $this->service->paginated( ...$request->validatedWithDefaults(), academicTermId: $requestedTermId, status: $request->validated('status'), paymentMethod: $request->validated('payment_method'), - ), + )), 'summary' => $this->service->summary( search: $request->validated('search') ?? '', academicTermId: $summaryTermId, diff --git a/app/Http/Controllers/Admin/Manage/AnnouncementController.php b/app/Http/Controllers/Admin/Manage/AnnouncementController.php index e8b0ecc..307a774 100644 --- a/app/Http/Controllers/Admin/Manage/AnnouncementController.php +++ b/app/Http/Controllers/Admin/Manage/AnnouncementController.php @@ -20,10 +20,10 @@ public function __construct( public function index(PaginatedRequest $request): Response { return Inertia::render('admin/manage/announcements/index', [ - 'announcements' => $this->service->paginated( + 'announcements' => Inertia::scroll(fn () => $this->service->paginated( $request->user(), ...$request->validatedWithDefaults(), - ), + )), ]); } diff --git a/app/Http/Controllers/Admin/Manage/CourseClass/CourseClassController.php b/app/Http/Controllers/Admin/Manage/CourseClass/CourseClassController.php index 7d4a5f5..22e51ce 100644 --- a/app/Http/Controllers/Admin/Manage/CourseClass/CourseClassController.php +++ b/app/Http/Controllers/Admin/Manage/CourseClass/CourseClassController.php @@ -27,11 +27,11 @@ public function __construct( public function index(PaginatedRequest $request): Response { return Inertia::render('admin/manage/course-classes/index', [ - 'courseClasses' => $this->service->paginated( + 'courseClasses' => Inertia::scroll(fn () => $this->service->paginated( ...$request->validatedWithDefaults(), academicTermId: $request->validated('academic_term_id'), method: $request->validated('method'), - ), + )), 'courses' => $this->courseService->getAllForSelect(), 'lecturers' => $this->lecturerService->getAllForSelect(), 'academicTerms' => $this->academicTermService->getAllForSelect(), diff --git a/app/Http/Controllers/Admin/Manage/CourseRegistrationController.php b/app/Http/Controllers/Admin/Manage/CourseRegistrationController.php index a46818a..2e28099 100644 --- a/app/Http/Controllers/Admin/Manage/CourseRegistrationController.php +++ b/app/Http/Controllers/Admin/Manage/CourseRegistrationController.php @@ -35,11 +35,11 @@ public function index(PaginatedRequest $request): Response|RedirectResponse return Inertia::render('admin/manage/course-registrations/index', [ 'departments' => $this->service->departmentSummary(), - 'registrations' => $this->service->paginated( + 'registrations' => Inertia::scroll(fn () => $this->service->paginated( $user, ...$request->validatedWithDefaults(), departmentId: $request->validated('department_id'), - ), + )), 'filters' => $request->only(['department_id']), ]); } diff --git a/app/Http/Controllers/Admin/Master/AcademicTermController.php b/app/Http/Controllers/Admin/Master/AcademicTermController.php index c363a39..a7dcf17 100644 --- a/app/Http/Controllers/Admin/Master/AcademicTermController.php +++ b/app/Http/Controllers/Admin/Master/AcademicTermController.php @@ -21,11 +21,11 @@ public function __construct( public function index(PaginatedRequest $request): Response { return Inertia::render('admin/master/academic-terms/index', [ - 'academicTerms' => $this->service->paginated( + 'academicTerms' => Inertia::scroll(fn () => $this->service->paginated( ...$request->validatedWithDefaults(), semester: $request->validated('semester'), isActive: $request->filled('is_active') ? $request->boolean('is_active') : null, - ), + )), 'filters' => $request->only(['semester', 'is_active']), ]); } diff --git a/app/Http/Controllers/Admin/Master/CourseController.php b/app/Http/Controllers/Admin/Master/CourseController.php index 8a84e10..673c88e 100644 --- a/app/Http/Controllers/Admin/Master/CourseController.php +++ b/app/Http/Controllers/Admin/Master/CourseController.php @@ -22,12 +22,12 @@ public function __construct( public function index(PaginatedRequest $request): Response { return Inertia::render('admin/master/courses/index', [ - 'courses' => $this->service->paginated( + 'courses' => Inertia::scroll(fn () => $this->service->paginated( $request->user(), ...$request->validatedWithDefaults(), departmentId: $request->validated('department_id'), semesterNumber: $request->validated('semester_number'), - ), + )), 'departments' => $this->departmentService->getAllForSelect(), 'semesterNumbers' => $this->service->getSemesterNumbers(), 'filters' => $request->only(['department_id', 'semester_number']), diff --git a/app/Http/Controllers/Admin/Master/DepartmentController.php b/app/Http/Controllers/Admin/Master/DepartmentController.php index fd5983d..a428990 100644 --- a/app/Http/Controllers/Admin/Master/DepartmentController.php +++ b/app/Http/Controllers/Admin/Master/DepartmentController.php @@ -22,7 +22,7 @@ public function __construct( public function index(PaginatedRequest $request): Response { return Inertia::render('admin/master/departments/index', [ - 'departments' => $this->service->paginated(...$request->validatedWithDefaults()), + 'departments' => Inertia::scroll(fn () => $this->service->paginated(...$request->validatedWithDefaults())), 'lecturers' => $this->lecturerService->getAllForSelect(), ]); } diff --git a/app/Http/Controllers/Admin/Services/AcademicAdvisingLogController.php b/app/Http/Controllers/Admin/Services/AcademicAdvisingLogController.php index c887ba4..93e7cb3 100644 --- a/app/Http/Controllers/Admin/Services/AcademicAdvisingLogController.php +++ b/app/Http/Controllers/Admin/Services/AcademicAdvisingLogController.php @@ -24,11 +24,11 @@ public function __construct( public function index(PaginatedRequest $request): Response { return Inertia::render('admin/services/academic-advising-logs/index', [ - 'logs' => $this->service->paginated( + 'logs' => Inertia::scroll(fn () => $this->service->paginated( $request->user(), ...$request->validatedWithDefaults(), lecturerId: $request->validated('lecturer_id'), - ), + )), 'students' => $this->studentService->getAllForSelect(), 'lecturers' => $this->lecturerService->getAllForSelect(), 'filters' => $request->only(['lecturer_id']), diff --git a/app/Http/Controllers/Admin/Services/LetterRequestController.php b/app/Http/Controllers/Admin/Services/LetterRequestController.php index fab579d..cbdfee5 100644 --- a/app/Http/Controllers/Admin/Services/LetterRequestController.php +++ b/app/Http/Controllers/Admin/Services/LetterRequestController.php @@ -22,11 +22,11 @@ public function __construct( public function index(PaginatedRequest $request): Response { return Inertia::render('admin/services/letter-requests/index', [ - 'letterRequests' => $this->service->paginated( + 'letterRequests' => Inertia::scroll(fn () => $this->service->paginated( $request->user(), ...$request->validatedWithDefaults(), status: $request->validated('status'), - ), + )), 'filters' => $request->only(['status']), ]); } diff --git a/app/Http/Controllers/Admin/Users/AdministratorController.php b/app/Http/Controllers/Admin/Users/AdministratorController.php index cb09ca6..44c6cda 100644 --- a/app/Http/Controllers/Admin/Users/AdministratorController.php +++ b/app/Http/Controllers/Admin/Users/AdministratorController.php @@ -21,10 +21,10 @@ public function __construct( public function index(PaginatedRequest $request): Response { return Inertia::render('admin/users/administrators/index', [ - 'administrators' => $this->service->paginated( + 'administrators' => Inertia::scroll(fn () => $this->service->paginated( ...$request->validatedWithDefaults(), gender: $request->validated('gender'), - ), + )), 'filters' => $request->only(['gender']), ]); } diff --git a/app/Http/Controllers/Admin/Users/LecturerController.php b/app/Http/Controllers/Admin/Users/LecturerController.php index 2f51a3f..42a55fa 100644 --- a/app/Http/Controllers/Admin/Users/LecturerController.php +++ b/app/Http/Controllers/Admin/Users/LecturerController.php @@ -26,11 +26,11 @@ public function __construct( public function index(PaginatedRequest $request): Response { return Inertia::render('admin/users/lecturers/index', [ - 'lecturers' => $this->service->paginated( + 'lecturers' => Inertia::scroll(fn () => $this->service->paginated( ...$request->validatedWithDefaults(), gender: $request->validated('gender'), departmentId: $request->validated('department_id'), - ), + )), 'departments' => $this->departmentService->getAllForSelect(), 'filters' => $request->only(['gender', 'department_id']), ]); diff --git a/app/Http/Controllers/Admin/Users/StudentController.php b/app/Http/Controllers/Admin/Users/StudentController.php index 5cff4a1..be5de7d 100644 --- a/app/Http/Controllers/Admin/Users/StudentController.php +++ b/app/Http/Controllers/Admin/Users/StudentController.php @@ -30,14 +30,14 @@ public function __construct( public function index(PaginatedRequest $request): Response { return Inertia::render('admin/users/students/index', [ - 'students' => $this->service->paginated( + 'students' => Inertia::scroll(fn () => $this->service->paginated( $request->user(), ...$request->validatedWithDefaults(), gender: $request->validated('gender'), departmentId: $request->validated('department_id'), status: $request->validated('status'), enrollmentYear: $request->validated('enrollment_year'), - ), + )), 'departments' => $this->departmentService->getAllForSelect(), 'statuses' => StudentStatus::options(), 'enrollmentYears' => $this->service->getEnrollmentYears(), diff --git a/resources/js/components/data-cards.tsx b/resources/js/components/data-cards.tsx index b47ea15..1b467b5 100644 --- a/resources/js/components/data-cards.tsx +++ b/resources/js/components/data-cards.tsx @@ -1,3 +1,4 @@ +import { InfiniteScroll } from '@inertiajs/react'; import { ChevronLeft, ChevronRight, @@ -29,10 +30,19 @@ interface DataCardsProps { emptyText?: string; toolbar?: React.ReactNode; pagination: PaginationState; - onPageChange: (page: number) => void; + onPageChange?: (page: number) => void; onPerPageChange?: (perPage: number) => void; onSearchChange?: (search: string) => void; searchValue?: string; + /** + * Enables infinite scroll instead of page-based pagination. `propName` + * must match the Inertia page prop returned via `Inertia::scroll()` on + * the backend so the frontend can track its merge/scroll metadata. + */ + infiniteScroll?: { + propName: string; + buffer?: number; + }; } export function DataCards({ @@ -48,7 +58,9 @@ export function DataCards({ onPerPageChange, onSearchChange, searchValue, + infiniteScroll, }: DataCardsProps) { + const isInfiniteScroll = !!infiniteScroll; const [localSearch, setLocalSearch] = React.useState(searchValue ?? ''); const [previousSearchValue, setPreviousSearchValue] = React.useState(searchValue); @@ -112,16 +124,51 @@ export function DataCards({ )} {data.length ? ( -
- {data.map((item, index) => ( - - {renderCard(item, index)} - - ))} -
+ isInfiniteScroll ? ( + + loading ? ( +

+ Memuat data... +

+ ) : hasMore ? null : ( +

+ Semua data telah ditampilkan. +

+ ) + } + > + {data.map((item, index) => ( + + + {renderCard(item, index)} + + + ))} +
+ ) : ( +
+ {data.map((item, index) => ( + + + {renderCard(item, index)} + + + ))} +
+ ) ) : ( @@ -130,45 +177,52 @@ export function DataCards({ )} -
- - {`Halaman ${currentPage} dari ${totalPages}`} - -
- - - - + {isInfiniteScroll ? ( +

+ Menampilkan {data.length.toLocaleString('id-ID')} dari{' '} + {pagination.total.toLocaleString('id-ID')} data +

+ ) : ( +
+ + {`Halaman ${currentPage} dari ${totalPages}`} + +
+ + + + +
-
+ )} ); } diff --git a/resources/js/components/data-table.tsx b/resources/js/components/data-table.tsx index 8cdec4e..da83507 100644 --- a/resources/js/components/data-table.tsx +++ b/resources/js/components/data-table.tsx @@ -12,6 +12,7 @@ import { verticalListSortingStrategy, } from '@dnd-kit/sortable'; import { CSS } from '@dnd-kit/utilities'; +import { InfiniteScroll } from '@inertiajs/react'; import type { ColumnDef, ExpandedState, Row } from '@tanstack/react-table'; import { flexRender, @@ -71,6 +72,15 @@ interface DataTableProps { onPerPageChange?: (perPage: number) => void; onSearchChange?: (search: string) => void; searchValue?: string; + /** + * Enables infinite scroll instead of page-based pagination. `propName` + * must match the Inertia page prop returned via `Inertia::scroll()` on + * the backend so the frontend can track its merge/scroll metadata. + */ + infiniteScroll?: { + propName: string; + buffer?: number; + }; } const DragHandleContext = React.createContext<{ @@ -163,7 +173,10 @@ export function DataTable({ onPerPageChange, onSearchChange, searchValue, + infiniteScroll, }: DataTableProps) { + const tbodyRef = React.useRef(null); + const [expanded, setExpanded] = React.useState(() => { if (!defaultExpanded || !data.length) { return {}; @@ -183,7 +196,9 @@ export function DataTable({ setLocalSearch(searchValue ?? ''); }, [searchValue]); - const isServerMode = !!pagination && !!onPageChange; + const isInfiniteScroll = !!infiniteScroll; + const hasServerPager = !isInfiniteScroll && !!pagination && !!onPageChange; + const hasServerSearch = !!onSearchChange; const isSortable = !!onReorder && !!getRowId; const handleSearchDebounced = useDebounce( @@ -200,7 +215,7 @@ export function DataTable({ header: () => No, cell: ({ row }) => ( - {isServerMode + {hasServerPager ? (currentPage - 1) * (pagination?.per_page ?? 25) + row.index + 1 @@ -275,14 +290,14 @@ export function DataTable({ function handleSearchChange(value: string) { setLocalSearch(value); - if (isServerMode) { + if (hasServerSearch) { handleSearchDebounced(value); } } return ( <> - {(searchKey || toolbar || isServerMode) && ( + {(searchKey || toolbar || hasServerPager || isInfiniteScroll) && (
{searchKey && ( ({ )} {toolbar}
- {isServerMode && onPerPageChange && ( + {hasServerPager && onPerPageChange && ( - +
)} diff --git a/resources/js/pages/admin/manage/course-registrations/index.tsx b/resources/js/pages/admin/manage/course-registrations/index.tsx index c779ced..5d6b99c 100644 --- a/resources/js/pages/admin/manage/course-registrations/index.tsx +++ b/resources/js/pages/admin/manage/course-registrations/index.tsx @@ -49,16 +49,11 @@ export default function CourseRegistrationIndex({ total: registrations.total, }; - const { - search, - handlePageChange, - handlePerPageChange, - handleSearchChange, - applyFilters, - } = useServerTable({ + const { search, handleSearchChange, applyFilters } = useServerTable({ route: () => index.url(), pagination, filters, + resetKeys: ['registrations'], }); const columns = createCourseRegistrationColumns(); @@ -74,11 +69,10 @@ export default function CourseRegistrationIndex({ columns={columns} data={registrations.data} pagination={pagination} - onPageChange={handlePageChange} - onPerPageChange={handlePerPageChange} onSearchChange={handleSearchChange} searchValue={search} searchKey="student" + infiniteScroll={{ propName: 'registrations' }} groupBy={(row) => row.student?.department?.name ?? 'Tanpa Jurusan' } diff --git a/resources/js/pages/admin/master/academic-terms/index.tsx b/resources/js/pages/admin/master/academic-terms/index.tsx index fb52dd2..4f57a4f 100644 --- a/resources/js/pages/admin/master/academic-terms/index.tsx +++ b/resources/js/pages/admin/master/academic-terms/index.tsx @@ -83,16 +83,11 @@ export default function AcademicTermIndex({ total: academicTerms.total, }; - const { - search, - handlePageChange, - handlePerPageChange, - handleSearchChange, - applyFilters, - } = useServerTable({ + const { search, handleSearchChange, applyFilters } = useServerTable({ route: () => academicTermIndex.url(), pagination, filters, + resetKeys: ['academicTerms'], }); function handleDelete() { @@ -184,10 +179,9 @@ export default function AcademicTermIndex({ data={academicTerms.data} searchKey="academic_year" pagination={pagination} - onPageChange={handlePageChange} - onPerPageChange={handlePerPageChange} onSearchChange={handleSearchChange} searchValue={search} + infiniteScroll={{ propName: 'academicTerms' }} toolbar={ courseIndex.url(), pagination, filters, + resetKeys: ['courses'], }); function handleDelete() { @@ -187,10 +182,9 @@ export default function CourseIndex({ data={courses.data} searchKey="name" pagination={pagination} - onPageChange={handlePageChange} - onPerPageChange={handlePerPageChange} onSearchChange={handleSearchChange} searchValue={search} + infiniteScroll={{ propName: 'courses' }} groupBy={(course) => `${course.department?.name ?? 'Tanpa Jurusan'} - Semester ${course.semester_number ?? 'Tidak ditentukan'}` } diff --git a/resources/js/pages/admin/master/departments/index.tsx b/resources/js/pages/admin/master/departments/index.tsx index 4c35632..35d93ef 100644 --- a/resources/js/pages/admin/master/departments/index.tsx +++ b/resources/js/pages/admin/master/departments/index.tsx @@ -84,14 +84,10 @@ export default function DepartmentIndex({ total: departments.total, }; - const { - search, - handlePageChange, - handlePerPageChange, - handleSearchChange, - } = useServerTable({ + const { search, handleSearchChange } = useServerTable({ route: () => departmentIndex.url(), pagination, + resetKeys: ['departments'], }); function handleDelete() { @@ -179,10 +175,9 @@ export default function DepartmentIndex({ data={departments.data} searchKey="name" pagination={pagination} - onPageChange={handlePageChange} - onPerPageChange={handlePerPageChange} onSearchChange={handleSearchChange} searchValue={search} + infiniteScroll={{ propName: 'departments' }} />

- {entry.lecturer?.user?.profile - ?.full_name ?? 'N/A'} + {entry.lecturer?.user?.profile?.full_name ?? + 'N/A'}

{format( @@ -300,9 +295,7 @@ function KaprodiFields({

diff --git a/resources/js/pages/admin/services/academic-advising-logs/index.tsx b/resources/js/pages/admin/services/academic-advising-logs/index.tsx index b951e4d..ded1699 100644 --- a/resources/js/pages/admin/services/academic-advising-logs/index.tsx +++ b/resources/js/pages/admin/services/academic-advising-logs/index.tsx @@ -105,16 +105,11 @@ export default function AcademicAdvisingLogIndex({ total: logs.total, }; - const { - search, - handlePageChange, - handlePerPageChange, - handleSearchChange, - applyFilters, - } = useServerTable({ + const { search, handleSearchChange, applyFilters } = useServerTable({ route: () => academicAdvisingLogIndex.url(), pagination, filters, + resetKeys: ['logs'], }); function handleDelete() { @@ -198,11 +193,10 @@ export default function AcademicAdvisingLogIndex({ columns={columns} data={logs.data} pagination={pagination} - onPageChange={handlePageChange} - onPerPageChange={handlePerPageChange} onSearchChange={handleSearchChange} searchValue={search} searchKey="student" + infiniteScroll={{ propName: 'logs' }} toolbar={ {log.students.map((student) => (
  • - {student.user?.profile - ?.full_name ?? 'N/A'}{' '} + {student.user?.profile?.full_name ?? + 'N/A'}{' '} · {student.student_number}
  • ))} @@ -338,8 +332,7 @@ function AdvisingLogFields({ <>
    - {selectedStudents.length === - availableStudents.length && + {selectedStudents.length === availableStudents.length && availableStudents.length > 0 ? 'Batalkan Semua' : 'Pilih Semua'} diff --git a/resources/js/pages/admin/services/letter-requests/index.tsx b/resources/js/pages/admin/services/letter-requests/index.tsx index c49ddc6..0a1e185 100644 --- a/resources/js/pages/admin/services/letter-requests/index.tsx +++ b/resources/js/pages/admin/services/letter-requests/index.tsx @@ -75,16 +75,11 @@ export default function LetterRequestIndex({ total: letterRequests.total, }; - const { - search, - handlePageChange, - handlePerPageChange, - handleSearchChange, - applyFilters, - } = useServerTable({ + const { search, handleSearchChange, applyFilters } = useServerTable({ route: () => letterRequestIndex.url(), pagination, filters, + resetKeys: ['letterRequests'], }); function handleDelete() { @@ -189,11 +184,10 @@ export default function LetterRequestIndex({ columns={columns} data={letterRequests.data} pagination={pagination} - onPageChange={handlePageChange} - onPerPageChange={handlePerPageChange} onSearchChange={handleSearchChange} searchValue={search} searchKey="student" + infiniteScroll={{ propName: 'letterRequests' }} toolbar={ editing && (
    - +
    ) } diff --git a/resources/js/pages/admin/users/administrators/index.tsx b/resources/js/pages/admin/users/administrators/index.tsx index ad23fe7..7848ca5 100644 --- a/resources/js/pages/admin/users/administrators/index.tsx +++ b/resources/js/pages/admin/users/administrators/index.tsx @@ -59,16 +59,11 @@ export default function AdministratorIndex({ administrators, filters }: Props) { total: administrators.total, }; - const { - search, - handlePageChange, - handlePerPageChange, - handleSearchChange, - applyFilters, - } = useServerTable({ + const { search, handleSearchChange, applyFilters } = useServerTable({ route: () => administratorsIndex.url(), pagination, filters, + resetKeys: ['administrators'], }); function handleDelete() { @@ -140,10 +135,9 @@ export default function AdministratorIndex({ administrators, filters }: Props) { data={administrators.data} searchKey="name" pagination={pagination} - onPageChange={handlePageChange} - onPerPageChange={handlePerPageChange} onSearchChange={handleSearchChange} searchValue={search} + infiniteScroll={{ propName: 'administrators' }} toolbar={ lecturersIndex.url(), pagination, filters, + resetKeys: ['lecturers'], }); function handleDelete() { @@ -177,10 +172,9 @@ export default function LecturerIndex({ data={lecturers.data} searchKey="name" pagination={pagination} - onPageChange={handlePageChange} - onPerPageChange={handlePerPageChange} onSearchChange={handleSearchChange} searchValue={search} + infiniteScroll={{ propName: 'lecturers' }} toolbar={ studentsIndex.url(), pagination, filters, + resetKeys: ['students'], }); function handleDelete() { @@ -226,10 +221,9 @@ export default function StudentIndex({ data={students.data} searchKey="name" pagination={pagination} - onPageChange={handlePageChange} - onPerPageChange={handlePerPageChange} onSearchChange={handleSearchChange} searchValue={search} + infiniteScroll={{ propName: 'students' }} toolbar={