From 8e2f2da5fc6ec2034d932b61d5a1f151e93c663c Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Sun, 30 Aug 2026 12:35:22 +0700 Subject: [PATCH] feat: enhance department handling by adding degree level and formatting labels --- .../Admin/Master/DepartmentService.php | 2 +- database/seeders/DepartmentSeeder.php | 6 ++--- .../js/pages/admin/announcements/index.tsx | 5 ++-- .../js/pages/admin/manage/courses/index.tsx | 9 ++++--- .../js/pages/admin/users/lecturers/create.tsx | 21 +++++++++------ .../js/pages/admin/users/lecturers/edit.tsx | 27 ++++++++++++------- .../js/pages/admin/users/lecturers/index.tsx | 5 ++-- .../js/pages/admin/users/students/create.tsx | 7 +++-- .../js/pages/admin/users/students/edit.tsx | 7 +++-- .../js/pages/admin/users/students/index.tsx | 5 ++-- resources/js/types/announcement.ts | 1 + resources/js/types/department.ts | 9 +++++++ 12 files changed, 69 insertions(+), 35 deletions(-) diff --git a/app/Services/Admin/Master/DepartmentService.php b/app/Services/Admin/Master/DepartmentService.php index 3f71ed8..eb1252b 100644 --- a/app/Services/Admin/Master/DepartmentService.php +++ b/app/Services/Admin/Master/DepartmentService.php @@ -10,7 +10,7 @@ class DepartmentService { public function getAllForSelect(): Collection { - return Department::select(['id', 'code', 'name'])->get(); + return Department::select(['id', 'code', 'name', 'degree_level'])->get(); } public function paginated(int $perPage = 25, string $search = ''): LengthAwarePaginator diff --git a/database/seeders/DepartmentSeeder.php b/database/seeders/DepartmentSeeder.php index 1ccd287..67d3f15 100644 --- a/database/seeders/DepartmentSeeder.php +++ b/database/seeders/DepartmentSeeder.php @@ -11,21 +11,21 @@ public function run(): void { Department::insert([ [ - 'code' => 'SI', + 'code' => 'SI-S1', 'name' => 'Sistem Informasi', 'degree_level' => 'S1', 'created_at' => now(), 'updated_at' => now(), ], [ - 'code' => 'TI', + 'code' => 'TI-S1', 'name' => 'Teknik Industri', 'degree_level' => 'S1', 'created_at' => now(), 'updated_at' => now(), ], [ - 'code' => 'BD', + 'code' => 'BD-S1', 'name' => 'Bisnis Digital', 'degree_level' => 'S1', 'created_at' => now(), diff --git a/resources/js/pages/admin/announcements/index.tsx b/resources/js/pages/admin/announcements/index.tsx index 5aad5cc..c9b3f6c 100644 --- a/resources/js/pages/admin/announcements/index.tsx +++ b/resources/js/pages/admin/announcements/index.tsx @@ -31,6 +31,7 @@ import type { Announcement, AnnouncementDepartment, } from '@/types/announcement'; +import { formatDepartmentLabel } from '@/types/department'; import { createAnnouncementColumns } from './columns'; type Props = { @@ -64,7 +65,7 @@ export default function AnnouncementIndex({ label: 'Jurusan', options: departments.map((department) => ({ value: String(department.id), - label: department.name, + label: formatDepartmentLabel(department), })), }, ]; @@ -255,7 +256,7 @@ function AnnouncementFields({ key={department.id} value={String(department.id)} > - {department.name} + {formatDepartmentLabel(department)} ))} diff --git a/resources/js/pages/admin/manage/courses/index.tsx b/resources/js/pages/admin/manage/courses/index.tsx index 9a6f451..05a5dae 100644 --- a/resources/js/pages/admin/manage/courses/index.tsx +++ b/resources/js/pages/admin/manage/courses/index.tsx @@ -27,9 +27,10 @@ import { update, } from '@/routes/admin/manage/courses'; import type { Course } from '@/types/course'; +import { formatDepartmentLabel } from '@/types/department'; import { createCourseColumns } from './columns'; -type Department = { id: number; name: string }; +type Department = { id: number; name: string; degree_level: string | null }; type Props = { courses: { @@ -62,7 +63,7 @@ export default function CourseIndex({ label: 'Jurusan', options: departments.map((department) => ({ value: String(department.id), - label: department.name, + label: formatDepartmentLabel(department), })), }, ]; @@ -256,7 +257,7 @@ function CreateForm({ key={dept.id} value={String(dept.id)} > - {dept.name} + {formatDepartmentLabel(dept)} ))} @@ -362,7 +363,7 @@ function EditForm({ key={dept.id} value={String(dept.id)} > - {dept.name} + {formatDepartmentLabel(dept)} ))} diff --git a/resources/js/pages/admin/users/lecturers/create.tsx b/resources/js/pages/admin/users/lecturers/create.tsx index d620a0e..7837297 100644 --- a/resources/js/pages/admin/users/lecturers/create.tsx +++ b/resources/js/pages/admin/users/lecturers/create.tsx @@ -24,8 +24,9 @@ import { PhoneInput } from '@/components/ui/phone-input'; import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; import { Textarea } from '@/components/ui/textarea'; import { index, store } from '@/routes/admin/users/lecturers'; +import { formatDepartmentLabel } from '@/types/department'; -type Department = { id: number; name: string }; +type Department = { id: number; name: string; degree_level: string | null }; type Props = { departments: Department[]; @@ -283,8 +284,8 @@ export default function LecturerCreate({ departments }: Props) { onValueChange={ setSelectedDepartments } - itemToStringLabel={(dept) => - dept.name + itemToStringLabel={ + formatDepartmentLabel } isItemEqualToValue={(a, b) => a.id === b.id @@ -297,11 +298,13 @@ export default function LecturerCreate({ departments }: Props) { (dept) => ( - {dept.name} + {formatDepartmentLabel( + dept, + )} ), )} @@ -326,7 +329,9 @@ export default function LecturerCreate({ departments }: Props) { key={dept.id} value={dept} > - {dept.name} + {formatDepartmentLabel( + dept, + )} ))} diff --git a/resources/js/pages/admin/users/lecturers/edit.tsx b/resources/js/pages/admin/users/lecturers/edit.tsx index 50a6b5a..184a44c 100644 --- a/resources/js/pages/admin/users/lecturers/edit.tsx +++ b/resources/js/pages/admin/users/lecturers/edit.tsx @@ -24,8 +24,9 @@ import { PhoneInput } from '@/components/ui/phone-input'; import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; import { Textarea } from '@/components/ui/textarea'; import { index, update } from '@/routes/admin/users/lecturers'; +import { formatDepartmentLabel } from '@/types/department'; -type Department = { id: number; name: string }; +type Department = { id: number; name: string; degree_level: string | null }; type User = { id: number; @@ -41,7 +42,11 @@ type User = { } | null; lecturer: { lecturer_number: string; - departments: { id: number; name: string }[]; + departments: { + id: number; + name: string; + degree_level: string | null; + }[]; } | null; }; @@ -318,8 +323,8 @@ export default function LecturerEdit({ user, departments }: Props) { onValueChange={ setSelectedDepartments } - itemToStringLabel={(dept) => - dept.name + itemToStringLabel={ + formatDepartmentLabel } isItemEqualToValue={(a, b) => a.id === b.id @@ -332,11 +337,13 @@ export default function LecturerEdit({ user, departments }: Props) { (dept) => ( - {dept.name} + {formatDepartmentLabel( + dept, + )} ), )} @@ -361,7 +368,9 @@ export default function LecturerEdit({ user, departments }: Props) { key={dept.id} value={dept} > - {dept.name} + {formatDepartmentLabel( + dept, + )} ))} diff --git a/resources/js/pages/admin/users/lecturers/index.tsx b/resources/js/pages/admin/users/lecturers/index.tsx index ca7ba33..1e6960b 100644 --- a/resources/js/pages/admin/users/lecturers/index.tsx +++ b/resources/js/pages/admin/users/lecturers/index.tsx @@ -19,10 +19,11 @@ import { update_user_status, exportMethod as exportLecturers, } from '@/routes/admin/users/lecturers'; +import { formatDepartmentLabel } from '@/types/department'; import type { Lecturer } from './columns'; import { createLecturerColumns } from './columns'; -type Department = { id: number; name: string }; +type Department = { id: number; name: string; degree_level: string | null }; type Props = { lecturers: { @@ -61,7 +62,7 @@ export default function LecturerIndex({ label: 'Jurusan', options: departments.map((department) => ({ value: String(department.id), - label: department.name, + label: formatDepartmentLabel(department), })), }, ]; diff --git a/resources/js/pages/admin/users/students/create.tsx b/resources/js/pages/admin/users/students/create.tsx index 3f7449f..19947e1 100644 --- a/resources/js/pages/admin/users/students/create.tsx +++ b/resources/js/pages/admin/users/students/create.tsx @@ -28,8 +28,9 @@ import { } from '@/components/ui/select'; import { Textarea } from '@/components/ui/textarea'; import { index, store } from '@/routes/admin/users/students'; +import { formatDepartmentLabel } from '@/types/department'; -type Department = { id: number; name: string }; +type Department = { id: number; name: string; degree_level: string | null }; type Lecturer = { id: number; lecturer_number: string; @@ -289,7 +290,9 @@ export default function StudentCreate({ departments, lecturers }: Props) { key={dept.id} value={String(dept.id)} > - {dept.name} + {formatDepartmentLabel( + dept, + )} ))} diff --git a/resources/js/pages/admin/users/students/edit.tsx b/resources/js/pages/admin/users/students/edit.tsx index 83ec83e..9c25ea3 100644 --- a/resources/js/pages/admin/users/students/edit.tsx +++ b/resources/js/pages/admin/users/students/edit.tsx @@ -28,8 +28,9 @@ import { } from '@/components/ui/select'; import { Textarea } from '@/components/ui/textarea'; import { index, update } from '@/routes/admin/users/students'; +import { formatDepartmentLabel } from '@/types/department'; -type Department = { id: number; name: string }; +type Department = { id: number; name: string; degree_level: string | null }; type Lecturer = { id: number; lecturer_number: string; @@ -336,7 +337,9 @@ export default function StudentEdit({ user, departments, lecturers }: Props) { key={dept.id} value={String(dept.id)} > - {dept.name} + {formatDepartmentLabel( + dept, + )} ))} diff --git a/resources/js/pages/admin/users/students/index.tsx b/resources/js/pages/admin/users/students/index.tsx index aa39512..e851abd 100644 --- a/resources/js/pages/admin/users/students/index.tsx +++ b/resources/js/pages/admin/users/students/index.tsx @@ -21,10 +21,11 @@ import { exportMethod as exportStudents, index as studentsIndex, } from '@/routes/admin/users/students'; +import { formatDepartmentLabel } from '@/types/department'; import { createStudentColumns } from './columns'; import type { Student } from './columns'; -type Department = { id: number; name: string }; +type Department = { id: number; name: string; degree_level: string | null }; type StatusOption = { value: string; label: string }; type Props = { @@ -70,7 +71,7 @@ export default function StudentIndex({ label: 'Jurusan', options: departments.map((department) => ({ value: String(department.id), - label: department.name, + label: formatDepartmentLabel(department), })), }, { diff --git a/resources/js/types/announcement.ts b/resources/js/types/announcement.ts index 8f5de5b..83c9363 100644 --- a/resources/js/types/announcement.ts +++ b/resources/js/types/announcement.ts @@ -2,6 +2,7 @@ export type AnnouncementDepartment = { id: number; code: string; name: string; + degree_level: string | null; }; export type AnnouncementCreator = { diff --git a/resources/js/types/department.ts b/resources/js/types/department.ts index 214ef5d..e555475 100644 --- a/resources/js/types/department.ts +++ b/resources/js/types/department.ts @@ -10,3 +10,12 @@ export type Department = { created_at: string; updated_at: string; }; + +export function formatDepartmentLabel(department: { + name: string; + degree_level?: string | null; +}): string { + return department.degree_level + ? `${department.name} (${department.degree_level})` + : department.name; +} -- 2.45.2