feat: enhance LetterRequestService and UI to support lecturer information; update pagination and column display for improved clarity

This commit is contained in:
Yoga Pangestu 2026-09-03 14:26:43 +07:00
parent db56ec94ea
commit 80997b97b4
4 changed files with 17 additions and 8 deletions

View File

@ -14,10 +14,11 @@ class LetterRequestService
public function paginated(User $user, int $perPage = 25, string $search = '', ?string $status = null): LengthAwarePaginator public function paginated(User $user, int $perPage = 25, string $search = '', ?string $status = null): LengthAwarePaginator
{ {
return LetterRequest::query() return LetterRequest::query()
->with(['user.profile', 'user.student.department', 'processor.profile']) ->with(['user.profile', 'user.student.department', 'user.lecturer.departments', 'processor.profile'])
->when($search, fn ($q) => $q->where('letter_type', 'like', "%{$search}%") ->when($search, fn ($q) => $q->where('letter_type', 'like', "%{$search}%")
->orWhereHas('user', fn ($q) => $q->whereHas('profile', fn ($q) => $q->where('full_name', 'like', "%{$search}%")) ->orWhereHas('user', fn ($q) => $q->whereHas('profile', fn ($q) => $q->where('full_name', 'like', "%{$search}%"))
->orWhereHas('student', fn ($q) => $q->where('student_number', 'like', "%{$search}%")))) ->orWhereHas('student', fn ($q) => $q->where('student_number', 'like', "%{$search}%"))
->orWhereHas('lecturer', fn ($q) => $q->where('lecturer_number', 'like', "%{$search}%"))))
->when($status, fn ($q) => $q->where('status', $status)) ->when($status, fn ($q) => $q->where('status', $status))
->when($user->hasRole(UserRole::Mahasiswa->value) || $user->hasRole(UserRole::Dosen->value), fn ($q) => $q->where('user_id', $user->id)) ->when($user->hasRole(UserRole::Mahasiswa->value) || $user->hasRole(UserRole::Dosen->value), fn ($q) => $q->where('user_id', $user->id))
->latest() ->latest()

View File

@ -49,10 +49,15 @@ export function createLetterRequestColumns(
const columns: ColumnDef<LetterRequest>[] = [ const columns: ColumnDef<LetterRequest>[] = [
{ {
accessorKey: 'user.student.student_number', id: 'requester',
header: () => <span>Mahasiswa</span>, header: () => <span>Pemohon</span>,
cell: ({ row }) => { cell: ({ row }) => {
const user = row.original.user; const user = row.original.user;
const identifier = user?.student
? `${user.student.student_number} · ${user.student.department?.name ?? '-'}`
: user?.lecturer
? `${user.lecturer.lecturer_number} · ${user.lecturer.departments.map((d) => d.name).join(', ') || '-'}`
: '-';
return ( return (
<div> <div>
@ -60,8 +65,7 @@ export function createLetterRequestColumns(
{user?.profile?.full_name ?? 'N/A'} {user?.profile?.full_name ?? 'N/A'}
</p> </p>
<p className="text-xs text-muted-foreground"> <p className="text-xs text-muted-foreground">
{user?.student?.student_number} &middot;{' '} {identifier}
{user?.student?.department?.name ?? '-'}
</p> </p>
</div> </div>
); );

View File

@ -212,7 +212,7 @@ export default function LetterRequestIndex({
}} }}
title="Hapus Surat Permohonan" title="Hapus Surat Permohonan"
description={(letterRequest) => description={(letterRequest) =>
`Apakah Anda yakin ingin menghapus permohonan "${letterRequest.letter_type}" milik "${letterRequest.user?.profile?.full_name ?? 'mahasiswa ini'}"? Tindakan ini tidak dapat dibatalkan.` `Apakah Anda yakin ingin menghapus permohonan "${letterRequest.letter_type}" milik "${letterRequest.user?.profile?.full_name ?? 'pemohon ini'}"? Tindakan ini tidak dapat dibatalkan.`
} }
onConfirm={handleDelete} onConfirm={handleDelete}
/> />
@ -237,7 +237,7 @@ function LetterRequestFields({
<Input <Input
id="letter_type" id="letter_type"
name="letter_type" name="letter_type"
placeholder="Contoh: Surat Aktif Kuliah" placeholder="Contoh: Surat Aktif Kuliah, Surat Tugas"
defaultValue={editing?.letter_type ?? ''} defaultValue={editing?.letter_type ?? ''}
aria-invalid={!!errors.letter_type} aria-invalid={!!errors.letter_type}
/> />

View File

@ -21,6 +21,10 @@ export type LetterRequestUser = {
student_number: string; student_number: string;
department: { id: number; name: string } | null; department: { id: number; name: string } | null;
} | null; } | null;
lecturer: {
lecturer_number: string;
departments: { id: number; name: string }[];
} | null;
}; };
export type LetterRequestProcessor = { export type LetterRequestProcessor = {