Skip to content

Commit 4198e7a

Browse files
committed
feat: multiple grade selection in contest detail
1 parent 3d05420 commit 4198e7a

1 file changed

Lines changed: 21 additions & 14 deletions

File tree

  • apps/frontend-legacy/src/pages/contest

apps/frontend-legacy/src/pages/contest/[id].tsx

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)