|
1 | | -/* |
2 | | - * セメスターフィルターのコンポーネント |
3 | | - */ |
4 | | - |
5 | | -import type { ClassType } from "@packages/models"; |
6 | | -import type React from "react"; |
| 1 | +import type { ClassSeries } from "@packages/models"; |
7 | 2 | import { FlagButton } from "../UI/FlagButton.tsx"; |
8 | 3 |
|
9 | | -/** |
10 | | - * クラス種別フィルターのプロパティ |
11 | | - */ |
12 | | -interface SemesterProp { |
13 | | - selectedClassTypes?: ClassType[]; |
14 | | - setSelectedClassTypes: (classType: ClassType[]) => void; |
15 | | -} |
16 | | - |
17 | | -const ClassType1: ClassType[] = ["基礎", "要求", "主題", "展開"]; |
18 | | -const ClassType2: ClassType[] = ["L", "A", "B", "C", "D", "E", "F"]; |
| 4 | +const ClassType: ClassSeries[] = ["基礎", "要求", "主題", "展開"]; |
| 5 | +const GeneralSeries = ["L", "A", "B", "C", "D", "E", "F"] as const; |
19 | 6 |
|
20 | 7 | /** |
21 | | - * 種別フィルターのコンポーネント |
22 | | - * @param prop 種別フィルターのプロパティ |
23 | | - * @returns コンポーネント |
| 8 | + * 成績種別・系列でフィルターする |
24 | 9 | */ |
25 | | -export const ClassTypeFilter: React.FC<SemesterProp> = (prop: SemesterProp) => { |
26 | | - const selectedClassTypes = prop.selectedClassTypes ?? []; |
| 10 | +export function ClassSeriesFilter(props: { |
| 11 | + selectedClassSeries?: ClassSeries[]; |
| 12 | + setSelectedClassSeries: (classSeries: ClassSeries[]) => void; |
| 13 | +}) { |
| 14 | + const selectedClassSeries = props.selectedClassSeries ?? []; |
27 | 15 |
|
28 | 16 | // ボタンがクリックされたときの関数 |
29 | | - const onClick = (classType: ClassType) => { |
30 | | - if (selectedClassTypes.includes(classType)) { |
| 17 | + const onClick = (classSeries: ClassSeries) => { |
| 18 | + if (selectedClassSeries.includes(classSeries)) { |
31 | 19 | // 既に含まれている場合、除外 |
32 | | - prop.setSelectedClassTypes( |
33 | | - selectedClassTypes.filter((c) => c !== classType), |
| 20 | + props.setSelectedClassSeries( |
| 21 | + selectedClassSeries.filter((c) => c !== classSeries), |
34 | 22 | ); |
35 | 23 | } else { |
36 | 24 | // 含まれていた場合、追加 |
37 | | - prop.setSelectedClassTypes([...selectedClassTypes, classType]); |
| 25 | + props.setSelectedClassSeries([...selectedClassSeries, classSeries]); |
38 | 26 | } |
39 | 27 | }; |
40 | 28 |
|
41 | 29 | return ( |
42 | 30 | <div className="grid grid-cols-8 gap-2"> |
43 | | - {ClassType1.map((c) => ( |
| 31 | + {ClassType.map((c) => ( |
44 | 32 | <FlagButton |
45 | 33 | key={c} |
46 | 34 | label={c} |
47 | | - isSelected={selectedClassTypes.includes(c)} |
| 35 | + isSelected={selectedClassSeries.includes(c)} |
48 | 36 | onClick={() => onClick(c)} |
49 | 37 | className="col-span-2" |
50 | 38 | /> |
51 | 39 | ))} |
52 | 40 |
|
53 | | - {ClassType2.map((c) => ( |
| 41 | + {GeneralSeries.map((c) => ( |
54 | 42 | <FlagButton |
55 | 43 | key={c} |
56 | 44 | label={c} |
57 | | - isSelected={selectedClassTypes.includes(c)} |
58 | | - onClick={() => onClick(c)} |
| 45 | + isSelected={selectedClassSeries.includes(`総合${c}`)} |
| 46 | + onClick={() => onClick(`総合${c}`)} |
59 | 47 | className="aspect-square col-span-1" |
60 | 48 | /> |
61 | 49 | ))} |
62 | 50 | </div> |
63 | 51 | ); |
64 | | -}; |
| 52 | +} |
0 commit comments