@@ -3,7 +3,54 @@ import type { Course, Day } from "common/types";
33import { useEffect , useState } from "react" ;
44import courseApi from "~/api/course" ;
55import CourseRegisterConfirmDialog from "./CourseRegisterConfirmDialog" ;
6+ import TagFilter from "./TagFilter" ;
67
8+ const faculties = [
9+ "all" ,
10+ "zenki" ,
11+ "law" ,
12+ "medicine" ,
13+ "engineering" ,
14+ "arts" ,
15+ "science" ,
16+ "agriculture" ,
17+ "economics" ,
18+ "liberal-arts" ,
19+ "education" ,
20+ "pharmacy" ,
21+ ] as const ;
22+ export type FacultyKey = ( typeof faculties ) [ number ] ;
23+ const facultyRegExMap = new Map < FacultyKey , RegExp > ( [
24+ [ "all" , / .* / ] ,
25+ [ "zenki" , / ^ [ 3 4 ] .* / ] ,
26+ [ "law" , / ^ 0 1 .* / ] ,
27+ [ "medicine" , / ^ 0 2 .* / ] ,
28+ [ "engineering" , / ^ F E N .* / ] ,
29+ [ "arts" , / ^ 0 4 .* / ] ,
30+ [ "science" , / ^ 0 5 .* / ] ,
31+ [ "agriculture" , / ^ 0 6 .* / ] ,
32+ [ "economics" , / ^ 0 7 .* / ] ,
33+ [ "liberal-arts" , / ^ 0 8 .* / ] ,
34+ [ "education" , / ^ 0 9 .* / ] ,
35+ [ "pharmacy" , / ^ 1 0 .* / ] ,
36+ ] ) ;
37+
38+ const facultyNameMap = new Map < FacultyKey , string > ( [
39+ [ "all" , "全て" ] ,
40+ [ "zenki" , "前期教養" ] ,
41+ [ "law" , "法" ] ,
42+ [ "medicine" , "医" ] ,
43+ [ "engineering" , "工" ] ,
44+ [ "arts" , "文" ] ,
45+ [ "science" , "理" ] ,
46+ [ "agriculture" , "農" ] ,
47+ [ "economics" , "経済" ] ,
48+ [ "liberal-arts" , "後期教養" ] ,
49+ [ "education" , "教育" ] ,
50+ [ "pharmacy" , "薬" ] ,
51+ ] ) ;
52+
53+ // TODO: フィルタのロジックが異様にばらけているのでリファクタしよう・・
754export default function SelectCourseDialog ( {
855 open,
956 onClose,
@@ -21,6 +68,7 @@ export default function SelectCourseDialog({
2168} ) {
2269 const [ availableCourses , setAvailableCourses ] = useState < Course [ ] > ( [ ] ) ;
2370 const [ searchText , setSearchText ] = useState ( "" ) ;
71+ const [ selectedFaculty , setSelectedFaculty ] = useState < FacultyKey > ( "all" ) ;
2472 const [ filteredAvailableCourses , setFilteredAvailableCourses ] = useState <
2573 Course [ ]
2674 > ( [ ] ) ;
@@ -89,9 +137,9 @@ export default function SelectCourseDialog({
89137 < p className = "text-base" >
90138 { currentEdit ?. course ?. name ?? "-" }
91139 </ p >
92- < p className = "text-gray-500 text-sm" > { `${
93- currentEdit ?. course ?. teacher ?? "-"
94- } / ${ currentEdit ?. course ?. id ?? "-" } `} </ p >
140+ < p className = "text-gray-500 text-sm" > { `${ currentEdit ?. course ?. teacher ?? "-" } / ${
141+ currentEdit ?. course ?. id ?? "-"
142+ } `} </ p >
95143 </ div >
96144 < button
97145 type = "button"
@@ -109,7 +157,6 @@ export default function SelectCourseDialog({
109157 < p className = "text-gray-500" > 未登録</ p >
110158 ) }
111159 </ div >
112-
113160 < input
114161 type = "text"
115162 placeholder = "授業名で検索"
@@ -124,27 +171,40 @@ export default function SelectCourseDialog({
124171 setFilteredAvailableCourses ( newFilteredCourses ) ;
125172 } }
126173 />
174+ < div className = "my-4 flex flex-row" >
175+ < TagFilter
176+ keyNameMap = { facultyNameMap }
177+ selectedTag = { selectedFaculty ?? "all" }
178+ onTagChange = { ( tag ) => {
179+ setSelectedFaculty ( ( prev ) => ( prev === tag ? "all" : tag ) ) ;
180+ } }
181+ />
182+ </ div >
127183 { filteredAvailableCourses . length === 0 ? (
128184 < p className = "mt-2 text-gray-500" >
129185 条件に当てはまる授業はありません。
130186 </ p >
131187 ) : (
132188 < ul className = "mt-4 max-h-[300px] overflow-auto" >
133- { filteredAvailableCourses . map ( ( course ) => (
134- < li key = { course . id } >
135- < button
136- type = "button"
137- className = "w-full cursor-pointer rounded-lg border p-2 hover:bg-gray-100"
138- onClick = { ( ) => {
139- setNewCourse ( course ) ;
140- setConfirmDialogStatus ( "add" ) ;
141- } }
142- >
143- < p > { course . name } </ p >
144- < p className = "text-gray-500 text-sm" > { `${ course . teacher } / ${ course . id } ` } </ p >
145- </ button >
146- </ li >
147- ) ) }
189+ { filteredAvailableCourses
190+ . filter ( ( course ) =>
191+ facultyRegExMap . get ( selectedFaculty ) ?. test ( course . id ) ,
192+ )
193+ . map ( ( course ) => (
194+ < li key = { course . id } >
195+ < button
196+ type = "button"
197+ className = "w-full cursor-pointer rounded-lg border p-2 hover:bg-gray-100"
198+ onClick = { ( ) => {
199+ setNewCourse ( course ) ;
200+ setConfirmDialogStatus ( "add" ) ;
201+ } }
202+ >
203+ < p > { course . name } </ p >
204+ < p className = "text-gray-500 text-sm" > { `${ course . teacher } / ${ course . id } ` } </ p >
205+ </ button >
206+ </ li >
207+ ) ) }
148208 </ ul >
149209 ) }
150210 </ div >
0 commit comments