@@ -124,20 +124,28 @@ const GradingSubmissionTable: React.FC<GradingSubmissionTableProps> = ({
124
124
...tableFilters . columnFilters
125
125
] ) ;
126
126
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
+
127
131
/** The value to be shown in the search bar */
128
132
const [ searchQuery , setSearchQuery ] = useState ( '' ) ;
129
133
/** The actual value sent to the backend */
130
134
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
+ ) ;
132
144
const handleSearchQueryUpdate : React . ChangeEventHandler < HTMLInputElement > = e => {
133
145
setSearchQuery ( e . target . value ) ;
134
- debouncedSetSearchValue ( e . target . value ) ;
146
+ debouncedUpdateSearchValue ( e . target . value ) ;
135
147
} ;
136
148
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
-
141
149
// Converts the columnFilters array into backend query parameters.
142
150
const backendFilterParams = useMemo ( ( ) => {
143
151
const filters : Array < { [ key : string ] : any } > = [
@@ -158,7 +166,13 @@ const GradingSubmissionTable: React.FC<GradingSubmissionTableProps> = ({
158
166
const table = useReactTable ( {
159
167
data : submissions ,
160
168
columns,
161
- state : { columnFilters } ,
169
+ state : {
170
+ columnFilters,
171
+ pagination : {
172
+ pageIndex : 0 ,
173
+ pageSize : pageSize
174
+ }
175
+ } ,
162
176
onColumnFiltersChange : setColumnFilters ,
163
177
getCoreRowModel : getCoreRowModel ( ) ,
164
178
getFilteredRowModel : getFilteredRowModel ( ) ,
@@ -168,6 +182,7 @@ const GradingSubmissionTable: React.FC<GradingSubmissionTableProps> = ({
168
182
const handleFilterRemove = ( { id, value } : ColumnFilter ) => {
169
183
const newFilters = columnFilters . filter ( filter => filter . id !== id && filter . value !== value ) ;
170
184
setColumnFilters ( newFilters ) ;
185
+ resetPage ( ) ;
171
186
} ;
172
187
173
188
useEffect ( ( ) => {
@@ -176,7 +191,7 @@ const GradingSubmissionTable: React.FC<GradingSubmissionTableProps> = ({
176
191
177
192
useEffect ( ( ) => {
178
193
resetPage ( ) ;
179
- } , [ updateEntries , resetPage ] ) ;
194
+ } , [ updateEntries , resetPage , searchValue ] ) ;
180
195
181
196
useEffect ( ( ) => {
182
197
updateEntries ( page , backendFilterParams ) ;
0 commit comments