Skip to content

Commit 9f7b414

Browse files
authored
Fix and polish grading submissions table logic (#2825)
* tanstack table initialization with pageSize to allow additional entries to be loaded * update debounced function to additionally reset the page when search value changes. * adds a reset page for column filter removal for consistency reasons. * fix linting. * update depedency array * Rearrange state declaration + move debounced function entirely within memo
1 parent 3abd1c3 commit 9f7b414

File tree

1 file changed

+23
-8
lines changed

1 file changed

+23
-8
lines changed

src/pages/academy/grading/subcomponents/GradingSubmissionsTable.tsx

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -124,20 +124,28 @@ const GradingSubmissionTable: React.FC<GradingSubmissionTableProps> = ({
124124
...tableFilters.columnFilters
125125
]);
126126

127+
const [page, setPage] = useState(0);
128+
const maxPage = useMemo(() => Math.ceil(totalRows / pageSize) - 1, [totalRows, pageSize]);
129+
const resetPage = useCallback(() => setPage(0), [setPage]);
130+
127131
/** The value to be shown in the search bar */
128132
const [searchQuery, setSearchQuery] = useState('');
129133
/** The actual value sent to the backend */
130134
const [searchValue, setSearchValue] = useState('');
131-
const debouncedSetSearchValue = useMemo(() => debounce(setSearchValue, 300), []);
135+
// Placing searchValue as a dependency for triggering a page reset will result in double-querying.
136+
const debouncedUpdateSearchValue = useMemo(
137+
() =>
138+
debounce((newValue: string) => {
139+
resetPage();
140+
setSearchValue(newValue);
141+
}, 300),
142+
[resetPage]
143+
);
132144
const handleSearchQueryUpdate: React.ChangeEventHandler<HTMLInputElement> = e => {
133145
setSearchQuery(e.target.value);
134-
debouncedSetSearchValue(e.target.value);
146+
debouncedUpdateSearchValue(e.target.value);
135147
};
136148

137-
const [page, setPage] = useState(0);
138-
const maxPage = useMemo(() => Math.ceil(totalRows / pageSize) - 1, [totalRows, pageSize]);
139-
const resetPage = useCallback(() => setPage(0), [setPage]);
140-
141149
// Converts the columnFilters array into backend query parameters.
142150
const backendFilterParams = useMemo(() => {
143151
const filters: Array<{ [key: string]: any }> = [
@@ -158,7 +166,13 @@ const GradingSubmissionTable: React.FC<GradingSubmissionTableProps> = ({
158166
const table = useReactTable({
159167
data: submissions,
160168
columns,
161-
state: { columnFilters },
169+
state: {
170+
columnFilters,
171+
pagination: {
172+
pageIndex: 0,
173+
pageSize: pageSize
174+
}
175+
},
162176
onColumnFiltersChange: setColumnFilters,
163177
getCoreRowModel: getCoreRowModel(),
164178
getFilteredRowModel: getFilteredRowModel(),
@@ -168,6 +182,7 @@ const GradingSubmissionTable: React.FC<GradingSubmissionTableProps> = ({
168182
const handleFilterRemove = ({ id, value }: ColumnFilter) => {
169183
const newFilters = columnFilters.filter(filter => filter.id !== id && filter.value !== value);
170184
setColumnFilters(newFilters);
185+
resetPage();
171186
};
172187

173188
useEffect(() => {
@@ -176,7 +191,7 @@ const GradingSubmissionTable: React.FC<GradingSubmissionTableProps> = ({
176191

177192
useEffect(() => {
178193
resetPage();
179-
}, [updateEntries, resetPage]);
194+
}, [updateEntries, resetPage, searchValue]);
180195

181196
useEffect(() => {
182197
updateEntries(page, backendFilterParams);

0 commit comments

Comments
 (0)