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 { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import EmployeeLayout from '@/layouts/employee-layout'; import { AttendanceMapModal } from '@/components/AttendanceMapModal'; import { MapPin, AlertCircle, RefreshCw, CheckCircle2, LogOut } from 'lucide-react'; interface Attendance { id: number; date: string; check_in: string | null; check_out: string | null; status: 'present' | 'leave' | 'dispensation'; notes: string | null; latitude_in?: string | null; longitude_in?: string | null; latitude_out?: string | null; longitude_out?: string | null; } interface PageProps { attendances: Attendance[]; todayAttendance: Attendance | null; [key: string]: unknown; } export default function AttendanceIndex({ attendances, todayAttendance }: PageProps) { const { flash } = usePage().props; const [locationError, setLocationError] = useState(null); const [coordinates, setCoordinates] = useState<{ lat: number; lng: number } | null>(null); const [isLoadingLocation, setIsLoadingLocation] = useState(true); 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, errors: leaveErrors } = useForm({ date: '', notes: '', }); const { data: dispenData, setData: setDispenData, post: postDispen, processing: processingDispen, reset: resetDispen, errors: dispenErrors } = useForm({ latitude_in: '', longitude_in: '', notes: '', }); const getLocation = () => { 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); }, (error) => { let errorMsg = 'Gagal mengambil lokasi.'; if (error.code === 1) errorMsg = 'Izin lokasi ditolak. Harap izinkan akses lokasi di pengaturan browser/perangkat Anda.'; setLocationError(errorMsg); setIsLoadingLocation(false); }, { enableHighAccuracy: true, timeout: 10000, maximumAge: 0 } ); }; useEffect(() => { getLocation(); }, []); const handleClockIn = (e: React.FormEvent) => { e.preventDefault(); postReguler('/employee/attendances/clock-in'); }; const handleClockOut = (e: React.FormEvent) => { e.preventDefault(); 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(); 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; } }; const isClockInDisabled = processingReguler || isLoadingLocation || !coordinates || Boolean(todayAttendance?.check_in); const isClockOutDisabled = processingReguler || isLoadingLocation || !coordinates || !todayAttendance || Boolean(todayAttendance?.check_out); return (

Portal Absensi

Lakukan absen masuk, pulang, atau ajukan izin.

{isLoadingLocation ? ( ) : locationError ? ( ) : ( )}

{isLoadingLocation ? 'Mencari lokasi Anda...' : locationError ? 'Gagal Akses Lokasi' : 'Lokasi Ditemukan'}

{isLoadingLocation ? 'Harap tunggu, pastikan GPS aktif.' : locationError ? locationError : `Koordinat: ${coordinates?.lat.toFixed(6)}, ${coordinates?.lng.toFixed(6)}`}

{locationError && ( )}
Harian Izin Dispen

Absen Harian

{todayAttendance ? 'Anda sudah memiliki catatan absensi hari ini.' : 'Sistem membutuhkan akses lokasi.'}

setLeaveData('date', e.target.value)} className="h-11" /> {leaveErrors.date &&

{leaveErrors.date}

}