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
{
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}%")
->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($user->hasRole(UserRole::Mahasiswa->value) || $user->hasRole(UserRole::Dosen->value), fn ($q) => $q->where('user_id', $user->id))
->latest()

View File

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

View File

@ -212,7 +212,7 @@ export default function LetterRequestIndex({
}}
title="Hapus Surat Permohonan"
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}
/>
@ -237,7 +237,7 @@ function LetterRequestFields({
<Input
id="letter_type"
name="letter_type"
placeholder="Contoh: Surat Aktif Kuliah"
placeholder="Contoh: Surat Aktif Kuliah, Surat Tugas"
defaultValue={editing?.letter_type ?? ''}
aria-invalid={!!errors.letter_type}
/>

View File

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