From 9626181d468dcefd5f106a223f414687cfc67006 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Tue, 25 Aug 2026 23:42:14 +0700 Subject: [PATCH] feat: enhance UI components with icons and improve navigation links --- resources/js/components/app-sidebar.tsx | 12 ++++++------ resources/js/components/confirm-dialog.tsx | 14 ++++++++++++++ resources/js/components/form-dialog.tsx | 7 +++++-- resources/js/components/nav-main.tsx | 2 +- resources/js/components/nav-secondary.tsx | 2 +- .../academic-classes/assignments/submissions.tsx | 7 +++++-- .../admin/academic-classes/attendances/index.tsx | 9 +++++++-- .../admin/academic-classes/attendances/session.tsx | 7 +++++-- .../admin/finances/tuition-invoices/payments.tsx | 7 +++++-- .../admin/manage/course-classes/enrollments.tsx | 7 +++++-- resources/js/pages/admin/settings/profile.tsx | 2 ++ resources/js/pages/admin/settings/security.tsx | 2 ++ .../js/pages/admin/users/administrators/create.tsx | 13 +++++++++---- .../js/pages/admin/users/administrators/edit.tsx | 13 +++++++++---- .../js/pages/admin/users/administrators/index.tsx | 7 ++++--- .../js/pages/admin/users/lecturers/create.tsx | 13 +++++++++---- resources/js/pages/admin/users/lecturers/edit.tsx | 13 +++++++++---- resources/js/pages/admin/users/lecturers/index.tsx | 5 +++-- resources/js/pages/admin/users/students/create.tsx | 13 +++++++++---- resources/js/pages/admin/users/students/edit.tsx | 13 +++++++++---- resources/js/pages/admin/users/students/index.tsx | 8 +++++--- 21 files changed, 124 insertions(+), 52 deletions(-) diff --git a/resources/js/components/app-sidebar.tsx b/resources/js/components/app-sidebar.tsx index 0344d59..3dd46d2 100644 --- a/resources/js/components/app-sidebar.tsx +++ b/resources/js/components/app-sidebar.tsx @@ -40,20 +40,20 @@ import { SidebarMenuButton, SidebarMenuItem, } from '@/components/ui/sidebar'; -import { index as feedbackRoute } from '@/routes/admin/feedback'; -import { index as academicAdvisingLogsRoute } from '@/routes/admin/services/academic-advising-logs'; -import { index as announcementsRoute } from '@/routes/admin/announcements'; import { index as assignmentsRoute } from '@/routes/admin/academic-classes/assignments'; import { index as attendancesRoute } from '@/routes/admin/academic-classes/attendances'; -import { index as courseClassesRoute } from '@/routes/admin/manage/course-classes'; import { index as courseRegistrationsRoute } from '@/routes/admin/academic-classes/course-registrations'; -import { index as coursesRoute } from '@/routes/admin/manage/courses'; -import { index as letterRequestsRoute } from '@/routes/admin/services/letter-requests'; import { index as materialsRoute } from '@/routes/admin/academic-classes/materials'; import { index as schedulesRoute } from '@/routes/admin/academic-classes/schedules'; +import { index as announcementsRoute } from '@/routes/admin/announcements'; +import { index as feedbackRoute } from '@/routes/admin/feedback'; import { index as tuitionInvoicesRoute } from '@/routes/admin/finances/tuition-invoices'; +import { index as courseClassesRoute } from '@/routes/admin/manage/course-classes'; +import { index as coursesRoute } from '@/routes/admin/manage/courses'; import { index as academicTerm } from '@/routes/admin/master/academic-terms'; import { index as departmentsRoute } from '@/routes/admin/master/departments'; +import { index as academicAdvisingLogsRoute } from '@/routes/admin/services/academic-advising-logs'; +import { index as letterRequestsRoute } from '@/routes/admin/services/letter-requests'; import { edit as appearanceRoute } from '@/routes/admin/settings/appearance'; import { edit as profileRoute } from '@/routes/admin/settings/profile'; import { edit as securityRoute } from '@/routes/admin/settings/security'; diff --git a/resources/js/components/confirm-dialog.tsx b/resources/js/components/confirm-dialog.tsx index f52a26e..153016a 100644 --- a/resources/js/components/confirm-dialog.tsx +++ b/resources/js/components/confirm-dialog.tsx @@ -1,3 +1,5 @@ +import { Check, Trash2, X } from 'lucide-react'; +import type { ReactNode } from 'react'; import { Button } from '@/components/ui/button'; import { Dialog, @@ -14,6 +16,7 @@ type ConfirmDialogProps = { title: string; description: string; confirmLabel?: string; + confirmIcon?: ReactNode; cancelLabel?: string; variant?: 'default' | 'destructive'; onConfirm: () => void; @@ -26,11 +29,20 @@ export function ConfirmDialog({ title, description, confirmLabel = 'Konfirmasi', + confirmIcon, cancelLabel = 'Batal', variant = 'destructive', onConfirm, loading = false, }: ConfirmDialogProps) { + const icon = + confirmIcon ?? + (variant === 'destructive' ? ( + + ) : ( + + )); + return ( @@ -43,6 +55,7 @@ export function ConfirmDialog({ variant="outline" onClick={() => onOpenChange(false)} > + {cancelLabel} diff --git a/resources/js/components/form-dialog.tsx b/resources/js/components/form-dialog.tsx index e682027..578f0f8 100644 --- a/resources/js/components/form-dialog.tsx +++ b/resources/js/components/form-dialog.tsx @@ -1,3 +1,6 @@ +import { Form } from '@inertiajs/react'; +import { Save, X } from 'lucide-react'; +import type { ReactNode } from 'react'; import { Button } from '@/components/ui/button'; import { Dialog, @@ -6,8 +9,6 @@ import { DialogHeader, DialogTitle, } from '@/components/ui/dialog'; -import { Form } from '@inertiajs/react'; -import type { ReactNode } from 'react'; type FormDialogProps = { open: boolean; @@ -63,12 +64,14 @@ export function FormDialog({ variant="outline" onClick={() => onOpenChange(false)} > + Batal diff --git a/resources/js/components/nav-main.tsx b/resources/js/components/nav-main.tsx index d444978..12f1351 100644 --- a/resources/js/components/nav-main.tsx +++ b/resources/js/components/nav-main.tsx @@ -1,5 +1,6 @@ "use client" +import { Link, usePage } from "@inertiajs/react"; import { SidebarGroup, SidebarGroupLabel, @@ -7,7 +8,6 @@ import { SidebarMenuButton, SidebarMenuItem } from "@/components/ui/sidebar"; -import { Link, usePage } from "@inertiajs/react"; export type NavItem = { name: string diff --git a/resources/js/components/nav-secondary.tsx b/resources/js/components/nav-secondary.tsx index 832692f..c933b7f 100644 --- a/resources/js/components/nav-secondary.tsx +++ b/resources/js/components/nav-secondary.tsx @@ -1,7 +1,7 @@ "use client" +import type {Icon} from "@tabler/icons-react"; import * as React from "react" -import { type Icon } from "@tabler/icons-react" import { SidebarGroup, diff --git a/resources/js/pages/admin/academic-classes/assignments/submissions.tsx b/resources/js/pages/admin/academic-classes/assignments/submissions.tsx index 1e1acfe..68fd2b0 100644 --- a/resources/js/pages/admin/academic-classes/assignments/submissions.tsx +++ b/resources/js/pages/admin/academic-classes/assignments/submissions.tsx @@ -1,7 +1,7 @@ import { Head, router } from '@inertiajs/react'; import type { ColumnDef } from '@tanstack/react-table'; import { format } from 'date-fns'; -import { Pencil, Plus, Trash2 } from 'lucide-react'; +import { ArrowLeft, Pencil, Plus, Trash2 } from 'lucide-react'; import { useState } from 'react'; import { DataTable } from '@/components/data-table'; import { DateTimeField } from '@/components/datetime-field'; @@ -161,7 +161,10 @@ export default function SubmissionIndex({ title="Pengumpulan Tugas" actions={ } /> diff --git a/resources/js/pages/admin/academic-classes/attendances/index.tsx b/resources/js/pages/admin/academic-classes/attendances/index.tsx index 6694da2..0b929a8 100644 --- a/resources/js/pages/admin/academic-classes/attendances/index.tsx +++ b/resources/js/pages/admin/academic-classes/attendances/index.tsx @@ -1,6 +1,6 @@ import { Head, Link, router } from '@inertiajs/react'; import { format } from 'date-fns'; -import { ClipboardCheck, Plus, Trash2 } from 'lucide-react'; +import { ClipboardCheck, Pencil, Plus, Trash2, X } from 'lucide-react'; import { useState } from 'react'; import { DeleteConfirmDialog } from '@/components/delete-confirm-dialog'; import { PageHeader } from '@/components/page-header'; @@ -123,10 +123,14 @@ export default function AttendanceIndex({ sessions, courseClasses }: Props) { ]).url } > + Lihat / Edit ) : ( - Lihat / Edit + + + Lihat / Edit + )} } /> diff --git a/resources/js/pages/admin/finances/tuition-invoices/payments.tsx b/resources/js/pages/admin/finances/tuition-invoices/payments.tsx index dfedda5..67a5f94 100644 --- a/resources/js/pages/admin/finances/tuition-invoices/payments.tsx +++ b/resources/js/pages/admin/finances/tuition-invoices/payments.tsx @@ -1,7 +1,7 @@ import { Head, router } from '@inertiajs/react'; import type { ColumnDef } from '@tanstack/react-table'; import { format } from 'date-fns'; -import { Paperclip, Pencil, Plus, Trash2 } from 'lucide-react'; +import { ArrowLeft, Paperclip, Pencil, Plus, Trash2 } from 'lucide-react'; import { useState } from 'react'; import { DataTable } from '@/components/data-table'; import { DateTimeField } from '@/components/datetime-field'; @@ -176,7 +176,10 @@ export default function TuitionPaymentIndex({ invoice, payments }: Props) { title="Pembayaran" actions={ } /> diff --git a/resources/js/pages/admin/manage/course-classes/enrollments.tsx b/resources/js/pages/admin/manage/course-classes/enrollments.tsx index 8ac0f0e..0a256e1 100644 --- a/resources/js/pages/admin/manage/course-classes/enrollments.tsx +++ b/resources/js/pages/admin/manage/course-classes/enrollments.tsx @@ -1,7 +1,7 @@ import { Head, router } from '@inertiajs/react'; import type { ColumnDef } from '@tanstack/react-table'; import { format } from 'date-fns'; -import { Trash2, UserPlus } from 'lucide-react'; +import { ArrowLeft, Trash2, UserPlus } from 'lucide-react'; import { useState } from 'react'; import { DataTable } from '@/components/data-table'; import { DeleteConfirmDialog } from '@/components/delete-confirm-dialog'; @@ -109,7 +109,10 @@ export default function ClassEnrollmentIndex({ title="Peserta Kelas" actions={ } /> diff --git a/resources/js/pages/admin/settings/profile.tsx b/resources/js/pages/admin/settings/profile.tsx index b3d28b4..237a6b0 100644 --- a/resources/js/pages/admin/settings/profile.tsx +++ b/resources/js/pages/admin/settings/profile.tsx @@ -1,5 +1,6 @@ import { Form, Head, Link, usePage } from '@inertiajs/react'; import { format } from 'date-fns'; +import { Save } from 'lucide-react'; import { useState } from 'react'; import ProfileController from '@/actions/App/Http/Controllers/Admin/Settings/ProfileController'; import { DatePicker } from '@/components/date-picker'; @@ -368,6 +369,7 @@ export default function Profile({ disabled={processing} data-test="update-profile-button" > + Simpan diff --git a/resources/js/pages/admin/settings/security.tsx b/resources/js/pages/admin/settings/security.tsx index 0a3b279..45fbbfa 100644 --- a/resources/js/pages/admin/settings/security.tsx +++ b/resources/js/pages/admin/settings/security.tsx @@ -1,4 +1,5 @@ import { Form, Head } from '@inertiajs/react'; +import { Save } from 'lucide-react'; import { useRef } from 'react'; import SecurityController from '@/actions/App/Http/Controllers/Admin/Settings/SecurityController'; import Heading from '@/components/heading'; @@ -113,6 +114,7 @@ export default function Security({ passwordRules }: Props) { disabled={processing} data-test="update-password-button" > + Simpan diff --git a/resources/js/pages/admin/users/administrators/create.tsx b/resources/js/pages/admin/users/administrators/create.tsx index 178d21e..f72dc82 100644 --- a/resources/js/pages/admin/users/administrators/create.tsx +++ b/resources/js/pages/admin/users/administrators/create.tsx @@ -1,3 +1,7 @@ +import { Form, Head } from '@inertiajs/react'; +import { format } from 'date-fns'; +import { ArrowLeft, Save } from 'lucide-react'; +import { useState } from 'react'; import { DatePicker } from '@/components/date-picker'; import InputError from '@/components/input-error'; import { PageHeader } from '@/components/page-header'; @@ -10,9 +14,6 @@ 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/administrators'; -import { Form, Head } from '@inertiajs/react'; -import { format } from 'date-fns'; -import { useState } from 'react'; type Role = { id: number; name: string }; @@ -34,7 +35,10 @@ export default function AdministratorCreate({ roles }: Props) { title="Tambah Administrator" actions={ } /> @@ -148,6 +152,7 @@ export default function AdministratorCreate({ roles }: Props) {
diff --git a/resources/js/pages/admin/users/administrators/edit.tsx b/resources/js/pages/admin/users/administrators/edit.tsx index e16f855..f997f6b 100644 --- a/resources/js/pages/admin/users/administrators/edit.tsx +++ b/resources/js/pages/admin/users/administrators/edit.tsx @@ -1,3 +1,7 @@ +import { Form, Head } from '@inertiajs/react'; +import { format } from 'date-fns'; +import { ArrowLeft, Save } from 'lucide-react'; +import { useState } from 'react'; import { DatePicker } from '@/components/date-picker'; import InputError from '@/components/input-error'; import { PageHeader } from '@/components/page-header'; @@ -10,9 +14,6 @@ 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/administrators'; -import { Form, Head } from '@inertiajs/react'; -import { format } from 'date-fns'; -import { useState } from 'react'; type Role = { id: number; name: string }; @@ -45,7 +46,10 @@ export default function AdministratorEdit({ user, roles }: Props) { title="Edit Administrator" actions={ } /> @@ -159,6 +163,7 @@ export default function AdministratorEdit({ user, roles }: Props) {
diff --git a/resources/js/pages/admin/users/administrators/index.tsx b/resources/js/pages/admin/users/administrators/index.tsx index 6bfa2a3..1197840 100644 --- a/resources/js/pages/admin/users/administrators/index.tsx +++ b/resources/js/pages/admin/users/administrators/index.tsx @@ -1,3 +1,6 @@ +import { Head, router } from '@inertiajs/react'; +import { Plus, RotateCcw } from 'lucide-react'; +import { useState } from 'react'; import { ConfirmDialog } from '@/components/confirm-dialog'; import type { PaginationState } from '@/components/data-table'; import { DataTable } from '@/components/data-table'; @@ -12,9 +15,6 @@ import { edit, reset_password } from '@/routes/admin/users/administrators'; -import { Head, router } from '@inertiajs/react'; -import { Plus } from 'lucide-react'; -import { useState } from 'react'; import type { Administrator } from './columns'; import { createAdministratorColumns } from './columns'; @@ -135,6 +135,7 @@ export default function AdministratorIndex({ administrators }: Props) { : '' } confirmLabel="Reset" + confirmIcon={} variant="default" onConfirm={handleResetPassword} /> diff --git a/resources/js/pages/admin/users/lecturers/create.tsx b/resources/js/pages/admin/users/lecturers/create.tsx index c55516b..07393fe 100644 --- a/resources/js/pages/admin/users/lecturers/create.tsx +++ b/resources/js/pages/admin/users/lecturers/create.tsx @@ -1,3 +1,7 @@ +import { Form, Head } from '@inertiajs/react'; +import { format } from 'date-fns'; +import { ArrowLeft, Save } from 'lucide-react'; +import { useState } from 'react'; import { DatePicker } from '@/components/date-picker'; import InputError from '@/components/input-error'; import { PageHeader } from '@/components/page-header'; @@ -10,9 +14,6 @@ import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Textarea } from '@/components/ui/textarea'; import { index, store } from '@/routes/admin/users/lecturers'; -import { Form, Head } from '@inertiajs/react'; -import { format } from 'date-fns'; -import { useState } from 'react'; type Department = { id: number; name: string }; @@ -33,7 +34,10 @@ export default function LecturerCreate({ departments }: Props) { title="Tambah Dosen" actions={ } /> @@ -162,6 +166,7 @@ export default function LecturerCreate({ departments }: Props) {
diff --git a/resources/js/pages/admin/users/lecturers/edit.tsx b/resources/js/pages/admin/users/lecturers/edit.tsx index 7b66ecf..91a1840 100644 --- a/resources/js/pages/admin/users/lecturers/edit.tsx +++ b/resources/js/pages/admin/users/lecturers/edit.tsx @@ -1,3 +1,7 @@ +import { Form, Head } from '@inertiajs/react'; +import { format } from 'date-fns'; +import { ArrowLeft, Save } from 'lucide-react'; +import { useState } from 'react'; import { DatePicker } from '@/components/date-picker'; import InputError from '@/components/input-error'; import { PageHeader } from '@/components/page-header'; @@ -10,9 +14,6 @@ import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Textarea } from '@/components/ui/textarea'; import { index, update } from '@/routes/admin/users/lecturers'; -import { Form, Head } from '@inertiajs/react'; -import { format } from 'date-fns'; -import { useState } from 'react'; type Department = { id: number; name: string }; @@ -44,7 +45,10 @@ export default function LecturerEdit({ user, departments }: Props) { title="Edit Dosen" actions={ } /> @@ -172,6 +176,7 @@ export default function LecturerEdit({ user, departments }: Props) {
diff --git a/resources/js/pages/admin/users/lecturers/index.tsx b/resources/js/pages/admin/users/lecturers/index.tsx index c8b6c3b..feb5889 100644 --- a/resources/js/pages/admin/users/lecturers/index.tsx +++ b/resources/js/pages/admin/users/lecturers/index.tsx @@ -1,8 +1,8 @@ import { Head, router } from '@inertiajs/react'; -import { Plus } from 'lucide-react'; +import { Plus, RotateCcw } from 'lucide-react'; import { useState } from 'react'; -import type { PaginationState } from '@/components/data-table'; import { ConfirmDialog } from '@/components/confirm-dialog'; +import type { PaginationState } from '@/components/data-table'; import { DataTable } from '@/components/data-table'; import { DeleteConfirmDialog } from '@/components/delete-confirm-dialog'; import { PageHeader } from '@/components/page-header'; @@ -135,6 +135,7 @@ export default function LecturerIndex({ lecturers }: Props) { : '' } confirmLabel="Reset" + confirmIcon={} variant="default" onConfirm={handleResetPassword} /> diff --git a/resources/js/pages/admin/users/students/create.tsx b/resources/js/pages/admin/users/students/create.tsx index 6fae06d..8589bc1 100644 --- a/resources/js/pages/admin/users/students/create.tsx +++ b/resources/js/pages/admin/users/students/create.tsx @@ -1,3 +1,7 @@ +import { Form, Head } from '@inertiajs/react'; +import { format } from 'date-fns'; +import { ArrowLeft, Save } from 'lucide-react'; +import { useState } from 'react'; import { DatePicker } from '@/components/date-picker'; import InputError from '@/components/input-error'; import { PageHeader } from '@/components/page-header'; @@ -10,9 +14,6 @@ import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Textarea } from '@/components/ui/textarea'; import { index, store } from '@/routes/admin/users/students'; -import { Form, Head } from '@inertiajs/react'; -import { format } from 'date-fns'; -import { useState } from 'react'; type Department = { id: number; name: string }; type Lecturer = { id: number; lecturer_number: string; user: { profile: { full_name: string } | null } | null }; @@ -35,7 +36,10 @@ export default function StudentCreate({ departments, lecturers }: Props) { title="Tambah Mahasiswa" actions={ } /> @@ -190,6 +194,7 @@ export default function StudentCreate({ departments, lecturers }: Props) {
diff --git a/resources/js/pages/admin/users/students/edit.tsx b/resources/js/pages/admin/users/students/edit.tsx index 6b223c1..ea8e8a3 100644 --- a/resources/js/pages/admin/users/students/edit.tsx +++ b/resources/js/pages/admin/users/students/edit.tsx @@ -1,3 +1,7 @@ +import { Form, Head } from '@inertiajs/react'; +import { format } from 'date-fns'; +import { ArrowLeft, Save } from 'lucide-react'; +import { useState } from 'react'; import { DatePicker } from '@/components/date-picker'; import InputError from '@/components/input-error'; import { PageHeader } from '@/components/page-header'; @@ -10,9 +14,6 @@ import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Textarea } from '@/components/ui/textarea'; import { index, update } from '@/routes/admin/users/students'; -import { Form, Head } from '@inertiajs/react'; -import { format } from 'date-fns'; -import { useState } from 'react'; type Department = { id: number; name: string }; type Lecturer = { id: number; lecturer_number: string; user: { profile: { full_name: string } | null } | null }; @@ -46,7 +47,10 @@ export default function StudentEdit({ user, departments, lecturers }: Props) { title="Edit Mahasiswa" actions={ } /> @@ -216,6 +220,7 @@ export default function StudentEdit({ user, departments, lecturers }: Props) {
diff --git a/resources/js/pages/admin/users/students/index.tsx b/resources/js/pages/admin/users/students/index.tsx index 084f84e..04a3085 100644 --- a/resources/js/pages/admin/users/students/index.tsx +++ b/resources/js/pages/admin/users/students/index.tsx @@ -1,8 +1,8 @@ import { Head, router } from '@inertiajs/react'; -import { Plus } from 'lucide-react'; +import { Plus, RotateCcw } from 'lucide-react'; import { useState } from 'react'; -import type { PaginationState } from '@/components/data-table'; import { ConfirmDialog } from '@/components/confirm-dialog'; +import type { PaginationState } from '@/components/data-table'; import { DataTable } from '@/components/data-table'; import { DeleteConfirmDialog } from '@/components/delete-confirm-dialog'; import { PageHeader } from '@/components/page-header'; @@ -15,7 +15,8 @@ import { reset_password, index as studentsIndex, } from '@/routes/admin/users/students'; -import { createStudentColumns, type Student } from './columns'; +import { createStudentColumns } from './columns'; +import type {Student} from './columns'; type Props = { students: { @@ -134,6 +135,7 @@ export default function StudentIndex({ students }: Props) { : '' } confirmLabel="Reset" + confirmIcon={} variant="default" onConfirm={handleResetPassword} />