import React, { useEffect, useState } from 'react'; import AdjustmentModal from './AdjustmentModal'; import { RootState } from '../../store'; import { useSelector } from 'react-redux'; interface LeaveFormData { fromDate: string; toDate: string; } interface AdjustmentEntry { id: number; date: string; loggedHours: number; } interface LogEntry { id: number; date: string; hours: number; task: string; status: "Completed" | "In Progress" | "Pending"; } const data: LogEntry[] = [ { id: 1, date: "2025-11-01", hours: 8, task: "Frontend Development", status: "Completed" }, { id: 2, date: "2025-11-02", hours: 6, task: "API Integration", status: "In Progress" }, { id: 3, date: "2025-11-03", hours: 7.5, task: "UI Testing", status: "Pending" }, { id: 4, date: "2025-11-04", hours: 9, task: "Bug Fixing", status: "Completed" }, { id: 5, date: "2025-11-05", hours: 5.5, task: "Code Review", status: "Completed" }, ]; type TabType = 'create_and_adjust_timesheet' | 'sick' | 'adjustment'; const LeaveAndAdjustments: React.FC = () => { const [activeTab, setActiveTab] = useState('create_and_adjust_timesheet'); const projects = useSelector((state: RootState) => state.projects.projectsData); console.log("LeaveAndAdjustments", projects) // PTO State const [ptoLeave, setPtoLeave] = useState({ fromDate: '', toDate: '', }); const [ptoErrors, setPtoErrors] = useState>({}); // Sick Leave State const [sickLeave, setSickLeave] = useState({ fromDate: '', toDate: '', }); const [sickErrors, setSickErrors] = useState>({}); const [selectedProjectId, setSelectedProjectId] = useState("") const [selectedDate, setSelectedDate] = useState("") // Adjustment State const [selectedPeriod, setSelectedPeriod] = useState('week'); const [adjustmentData, setAdjustmentData] = useState([ { id: 1, date: '2025-11-01', loggedHours: 8 }, { id: 2, date: '2025-11-02', loggedHours: 7.5 }, { id: 3, date: '2025-11-03', loggedHours: 8 }, ]); const [editingId, setEditingId] = useState(null); const [editHours, setEditHours] = useState(''); // Validation function const validateLeaveForm = (data: LeaveFormData): Partial => { const errors: Partial = {}; if (!data.fromDate) { errors.fromDate = 'From date is required'; } if (!data.toDate) { errors.toDate = 'To date is required'; } if (data.fromDate && data.toDate && new Date(data.fromDate) > new Date(data.toDate)) { errors.toDate = 'To date must be after from date'; } if (!data.description.trim()) { errors.description = 'Description/Reason is required'; } return errors; }; const handlePtoSubmit = async () => { const errors = validateLeaveForm(ptoLeave); if (Object.keys(errors).length > 0) { setPtoErrors(errors); return; } try { console.log('Submitting PTO:', ptoLeave); alert('PTO request submitted successfully!'); setPtoLeave({ fromDate: '', toDate: '', description: '' }); setPtoErrors({}); } catch (error) { alert('Failed to submit request. Please try again.'); console.error('Error:', error); } }; // Sick Leave Handlers const handleSickChange = (field: keyof LeaveFormData, value: string) => { setSickLeave(prev => ({ ...prev, [field]: value })); if (sickErrors[field]) { setSickErrors(prev => ({ ...prev, [field]: undefined })); } }; const handleSickSubmit = async () => { const errors = validateLeaveForm(sickLeave); if (Object.keys(errors).length > 0) { setSickErrors(errors); return; } try { console.log('Submitting Sick Leave:', sickLeave); alert('Sick Leave request submitted successfully!'); setSickLeave({ fromDate: '', toDate: '', description: '' }); setSickErrors({}); } catch (error) { alert('Failed to submit request. Please try again.'); console.error('Error:', error); } }; const [editingEntry, setEditingEntry] = useState(null); const [newHours, setNewHours] = useState(0); const handlePeriodChange = (value: string) => setSelectedPeriod(value); const handleEditClick = (entry: AdjustmentEntry) => { setEditingEntry(entry); const modal = document.getElementById("editModal") as HTMLDialogElement; modal?.showModal(); }; const handleCloseModal = () => { setEditingEntry(null); setNewHours(0) const modal = document.getElementById("editModal") as HTMLDialogElement; modal?.close(); }; const handleSave = () => { console.log("Saving:", { ...editingEntry, updatedHours: newHours }); handleCloseModal(); }; const handleProjectSelect = (projectId: string) => { console.log("handleProjectSelect", projectId) setSelectedProjectId(projectId) } const handleSelectedDate = (value: string) => { // Ensure value stays as "YYYY-MM-DD" setSelectedDate(value); }; const fetchLogs = async () => { const res = await window.electron.getProjectLogs( selectedProjectId, selectedDate || undefined, selectedDate || undefined, ); if (res.success) { console.log("✅ Logs: fetchLogs", res); // Safely extract time if from/to exist const fromTime = res.from ? new Date(res.from).toISOString().slice(11, 16) : ""; const toTime = res.to ? new Date(res.to).toISOString().slice(11, 16) : ""; setPtoLeave({ fromDate: fromTime, toDate: toTime, }); } else { console.warn("⚠️ Failed to fetch project logs"); } }; useEffect(() => { if (selectedProjectId && selectedDate) { fetchLogs() } }, [selectedProjectId, selectedDate]) return (
{/* Header */}

Adjust Timesheet

{/* Main Container */}
{/* Tabs Navigation */}
{/* */}
{/* Tab Content */}
{/* PTO Tab */} {activeTab === 'create_and_adjust_timesheet' && (
{/*

Paid Time Off Request

*/}
{ptoErrors.fromDate && ( )}
handleSelectedDate(e.target.value)} className="input input-bordered input-sm w-full focus:input-primary transition-all" />
handlePtoChange('fromDate', e.target.value)} className={`input input-bordered input-sm w-full focus:input-primary transition-all ${ptoErrors.fromDate ? 'input-error' : ''}`} /> {ptoErrors.fromDate && ( )}
handlePtoChange('toDate', e.target.value)} className={`input input-bordered input-sm w-full focus:input-primary transition-all ${ptoErrors.toDate ? 'input-error' : ''}`} /> {ptoErrors.toDate && ( )}
setPtoLeave((prev) => ({ ...prev, fromDate: e.target.value })) } className={`input input-bordered input-sm w-full focus:input-primary transition-all ${ptoErrors.fromDate ? 'input-error' : ''}`} />
setPtoLeave((prev) => ({ ...prev, toDate: e.target.value })) } className={`input input-bordered input-sm w-full focus:input-primary transition-all ${ptoErrors.toDate ? 'input-error' : ''}`} />
handlePtoChange('toDate', e.target.value)} className={`input input-bordered input-sm w-full focus:input-primary transition-all ${ptoErrors.toDate ? 'input-error' : ''}`} /> {ptoErrors.toDate && ( )}