From 66217577136c9e719376fd0d0f83b152e699b0d3 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Tue, 1 Sep 2026 20:59:56 +0700 Subject: [PATCH] feat: add department selection and advisor filtering in student create and edit forms --- .../Admin/Users/Student/StudentRequest.php | 3 +- .../js/pages/admin/users/students/create.tsx | 30 +++++++++++-- .../js/pages/admin/users/students/edit.tsx | 44 ++++++++++++++----- 3 files changed, 60 insertions(+), 17 deletions(-) diff --git a/app/Http/Requests/Admin/Users/Student/StudentRequest.php b/app/Http/Requests/Admin/Users/Student/StudentRequest.php index 2f645ec..533283c 100644 --- a/app/Http/Requests/Admin/Users/Student/StudentRequest.php +++ b/app/Http/Requests/Admin/Users/Student/StudentRequest.php @@ -73,7 +73,8 @@ public function rules(): array 'academic_advisor_id' => [ 'required', 'integer', - Rule::exists('lecturers', 'id'), + Rule::exists('lecturer_department', 'lecturer_id') + ->where('department_id', $this->input('department_id')), ], 'status' => [ 'nullable', diff --git a/resources/js/pages/admin/users/students/create.tsx b/resources/js/pages/admin/users/students/create.tsx index 80db5a0..caa974a 100644 --- a/resources/js/pages/admin/users/students/create.tsx +++ b/resources/js/pages/admin/users/students/create.tsx @@ -35,6 +35,7 @@ type Lecturer = { id: number; lecturer_number: string; user: { profile: { full_name: string } | null } | null; + departments: { id: number }[]; }; type Props = { @@ -45,8 +46,15 @@ type Props = { export default function StudentCreate({ departments, lecturers }: Props) { const [gender, setGender] = useState(''); const [birthDate, setBirthDate] = useState(); + const [departmentId, setDepartmentId] = useState(''); const [advisor, setAdvisor] = useState(null); + const availableAdvisors = departmentId + ? lecturers.filter((l) => + l.departments.some((d) => String(d.id) === departmentId), + ) + : []; + return ( <> @@ -279,8 +287,15 @@ export default function StudentCreate({ departments, lecturers }: Props) { - { + setDepartmentId(value); + setAdvisor(null); + }} + > @@ -354,8 +369,9 @@ export default function StudentCreate({ departments, lecturers }: Props) { value={advisor?.id ?? ''} /> `${lect.user?.profile?.full_name ?? 'N/A'} - ${lect.lecturer_number}` @@ -365,12 +381,18 @@ export default function StudentCreate({ departments, lecturers }: Props) { } > - Dosen tidak ditemukan. + Dosen tidak + ditemukan. {(lect: Lecturer) => ( diff --git a/resources/js/pages/admin/users/students/edit.tsx b/resources/js/pages/admin/users/students/edit.tsx index b862a35..c6c1cfa 100644 --- a/resources/js/pages/admin/users/students/edit.tsx +++ b/resources/js/pages/admin/users/students/edit.tsx @@ -35,6 +35,7 @@ type Lecturer = { id: number; lecturer_number: string; user: { profile: { full_name: string } | null } | null; + departments: { id: number }[]; }; type User = { @@ -71,12 +72,23 @@ export default function StudentEdit({ user, departments, lecturers }: Props) { ? new Date(user.profile.birth_date) : undefined, ); + const [departmentId, setDepartmentId] = useState( + user.student?.department_id + ? String(user.student.department_id) + : '', + ); const [advisor, setAdvisor] = useState( lecturers.find( (lect) => lect.id === user.student?.academic_advisor_id, ) ?? null, ); + const availableAdvisors = departmentId + ? lecturers.filter((l) => + l.departments.some((d) => String(d.id) === departmentId), + ) + : []; + return ( <> @@ -318,16 +330,17 @@ export default function StudentEdit({ user, departments, lecturers }: Props) { * - { + setDepartmentId(value); + setAdvisor(null); + }} > @@ -407,8 +420,9 @@ export default function StudentEdit({ user, departments, lecturers }: Props) { value={advisor?.id ?? ''} /> `${lect.user?.profile?.full_name ?? 'N/A'} - ${lect.lecturer_number}` @@ -418,12 +432,18 @@ export default function StudentEdit({ user, departments, lecturers }: Props) { } > - Dosen tidak ditemukan. + Dosen tidak + ditemukan. {(lect: Lecturer) => (