@@ -47,9 +47,13 @@ const Contest: React.FC = () => {
4747 setSearchParams ( { province, page : '1' } ) ;
4848 } ;
4949
50- const grade = Number ( searchParams . get ( 'grade' ) || '0' ) ;
51- const setGrade = ( grade : number ) => {
52- setSearchParams ( { grade : String ( grade ) , page : '1' } ) ;
50+ const gradeParam = searchParams . get ( 'grade' ) || '' ;
51+ const selectedGrades = useMemo (
52+ ( ) => gradeParam . split ( ',' ) . map ( Number ) . filter ( Boolean ) ,
53+ [ gradeParam ]
54+ ) ;
55+ const setSelectedGrades = ( grades : number [ ] ) => {
56+ setSearchParams ( { grade : grades . join ( ',' ) , page : '1' } ) ;
5357 } ;
5458
5559 const provinces = useMemo ( ( ) => {
@@ -70,7 +74,7 @@ const Contest: React.FC = () => {
7074 . sort ( ( a , b ) => a . key . localeCompare ( b . key ) ) ;
7175 } , [ id ] ) ;
7276
73- const grades = useMemo (
77+ const gradeOptions = useMemo (
7478 ( ) => [
7579 ...new Set (
7680 contest . contestants . map (
@@ -89,12 +93,13 @@ const Contest: React.FC = () => {
8993 province ? contestant . province === province : true
9094 )
9195 . filter ( contestant =>
92- grade
93- ? ( contestant . enroll_middle ?. value
94- || contestant . oier . enroll_middle ) === grade
96+ selectedGrades . length
97+ ? selectedGrades . includes (
98+ contestant . enroll_middle ?. value || contestant . oier . enroll_middle
99+ )
95100 : true
96101 ) ,
97- [ contest , province , grade ]
102+ [ contest , province , selectedGrades ]
98103 ) ;
99104
100105 const awards = awardLevels . filter ( awardLevel =>
@@ -164,17 +169,19 @@ const Contest: React.FC = () => {
164169 fluid
165170 search
166171 selection
172+ multiple
167173 clearable
168174 placeholder = "年级"
169- value = { grade || null }
170- options = { grades
175+ value = { selectedGrades }
176+ options = { gradeOptions
171177 . map ( grade => ( {
172178 key : grade ,
173179 value : grade ,
174180 text : getGrade ( grade , contest . school_year ( ) ) ,
175181 } ) )
176182 . sort ( compareGrades ) }
177- onChange = { ( _ , { value } ) => setGrade ( Number ( value ) ) }
183+ onChange = { ( _ , { value } ) =>
184+ setSelectedGrades ( ( value as number [ ] ) . map ( Number ) ) }
178185 />
179186 < Form . Dropdown
180187 fluid
@@ -192,9 +199,9 @@ const Contest: React.FC = () => {
192199 < Table . Header >
193200 < Table . Row >
194201 < Table . HeaderCell width = { 1 } >
195- { grade || province ? `总排名` : '#' }
202+ { selectedGrades . length || province ? `总排名` : '#' }
196203 </ Table . HeaderCell >
197- { Boolean ( grade || province ) && (
204+ { Boolean ( selectedGrades . length || province ) && (
198205 < Table . HeaderCell > #</ Table . HeaderCell >
199206 ) }
200207 < Table . HeaderCell > 姓名</ Table . HeaderCell >
@@ -214,7 +221,7 @@ const Contest: React.FC = () => {
214221 trigger = {
215222 < >
216223 < Table . Cell > { contestant . rank } </ Table . Cell >
217- { Boolean ( grade || province ) && (
224+ { Boolean ( selectedGrades . length || province ) && (
218225 < Table . Cell width = { 1 } >
219226 { ( page - 1 ) * perPage + index + 1 }
220227 </ Table . Cell >
0 commit comments