import { Head, useForm, usePage } from '@inertiajs/react'; import React, { useState, useEffect } from 'react'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import AppLayout from '@/layouts/app-layout'; // Define expected prop types interface Attendance { id: number; date: string; check_in: string | null; check_out: string | null; status: 'present' | 'leave' | 'dispensation'; notes: string | null; } interface PageProps { attendances: Attendance[]; todayAttendance: Attendance | null; [key: string]: unknown; } interface SharedData { flash: { success?: string; error?: string; }; } export default function Index({ attendances, todayAttendance }: PageProps) { const { flash } = usePage().props as SharedData; const [locationError, setLocationError] = useState(null); const [coordinates, setCoordinates] = useState<{ lat: number; lng: number } | null>(null); const [isLoadingLocation, setIsLoadingLocation] = useState(false); const { data: regulerData, setData: setRegulerData, post: postReguler, processing: processingReguler } = useForm({ latitude_in: '', longitude_in: '', latitude_out: '', longitude_out: '', }); const { data: leaveData, setData: setLeaveData, post: postLeave, processing: processingLeave, reset: resetLeave } = useForm({ date: '', notes: '', }); const { data: dispenData, setData: setDispenData, post: postDispen, processing: processingDispen, reset: resetDispen } = useForm({ latitude_in: '', longitude_in: '', notes: '', }); // Mendapatkan lokasi saat komponen dimuat atau tombol ditekan const getLocation = (callback?: (lat: number, lng: number) => void) => { setIsLoadingLocation(true); setLocationError(null); if (!navigator.geolocation) { setLocationError('Geolocation tidak didukung oleh browser ini.'); setIsLoadingLocation(false); return; } navigator.geolocation.getCurrentPosition( (position) => { const lat = position.coords.latitude; const lng = position.coords.longitude; setCoordinates({ lat, lng }); setRegulerData({ ...regulerData, latitude_in: lat.toString(), longitude_in: lng.toString(), latitude_out: lat.toString(), longitude_out: lng.toString(), }); setDispenData({ ...dispenData, latitude_in: lat.toString(), longitude_in: lng.toString(), }); setIsLoadingLocation(false); if (callback) callback(lat, lng); }, (error) => { let errorMsg = 'Gagal mengambil lokasi.'; if (error.code === 1) errorMsg = 'Izin lokasi ditolak. Harap izinkan akses lokasi.'; setLocationError(errorMsg); setIsLoadingLocation(false); }, { enableHighAccuracy: true, timeout: 10000, maximumAge: 0 } ); }; useEffect(() => { getLocation(); }, []); const handleClockIn = (e: React.FormEvent) => { e.preventDefault(); if (!coordinates) { getLocation((lat, lng) => { postReguler('/employee/attendances/clock-in'); }); } else { postReguler('/employee/attendances/clock-in'); } }; const handleClockOut = (e: React.FormEvent) => { e.preventDefault(); if (!coordinates) { getLocation((lat, lng) => { postReguler('/employee/attendances/clock-out'); }); } else { postReguler('/employee/attendances/clock-out'); } }; const handleLeaveSubmit = (e: React.FormEvent) => { e.preventDefault(); postLeave('/employee/attendances/leave', { onSuccess: () => resetLeave() }); }; const handleDispenSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!coordinates) { getLocation((lat, lng) => { postDispen('/employee/attendances/dispensation', { onSuccess: () => resetDispen() }); }); } else { postDispen('/employee/attendances/dispensation', { onSuccess: () => resetDispen() }); } }; const formatStatus = (status: string) => { switch (status) { case 'present': return 'Hadir'; case 'leave': return 'Izin/Cuti'; case 'dispensation': return 'Dispensasi'; default: return status; } }; return (
{/* Header Section */}

Portal Absensi

Lakukan absen masuk/pulang, atau ajukan izin dan dispensasi.

{/* Flash Messages */} {flash?.success && (
{flash.success}
)} {flash?.error && (
{flash.error}
)} {locationError && (
{locationError}
)}
{/* Left Column: Forms */}
Harian Izin Dispen {/* Tab Absen Reguler */} Absen Reguler {todayAttendance ? 'Anda sudah memiliki catatan absensi hari ini.' : 'Sistem membutuhkan akses lokasi untuk mencatat absensi.'}

Lokasi Saat Ini:

{isLoadingLocation ? 'Mengambil lokasi...' : (coordinates ? `${coordinates.lat.toFixed(6)}, ${coordinates.lng.toFixed(6)}` : 'Lokasi tidak tersedia')}

{/* Tab Izin */} Form Izin / Cuti Ajukan izin tidak masuk kerja.
setLeaveData('date', e.target.value)} />