import React, { useState, useEffect } from 'react'; import { X, Save, MapPin, User, Calendar, CheckSquare, Upload, Trash2, Box, Plus } from 'lucide-react'; export default function EditBranchModal({ isOpen, onClose, onRefresh, branch }) { const [loading, setLoading] = useState(false); const [formData, setFormData] = useState({ name: '', location: '', manager_name: '', operational_start_date: '', status: 'Active', payroll_from_day: 1, payroll_to_day: 28, salary_generation_day: 2, }); const [newDocs, setNewDocs] = useState([]); useEffect(() => { if (branch) { setFormData({ name: branch.name || '', location: branch.location || '', manager_name: branch.manager_name || '', operational_start_date: branch.operational_start_date || '', status: branch.status || 'Active', payroll_from_day: branch.payroll_from_day || 1, payroll_to_day: branch.payroll_to_day || 28, salary_generation_day: branch.salary_generation_day || 2, }); setNewDocs([]); } }, [branch]); const handleAddDocRow = () => { setNewDocs([...newDocs, { name: '', file: null, document_number: '', expiry_date: '', reminder_days: 30 }]); }; const handleNewDocChange = (index, field, value) => { const updated = [...newDocs]; updated[index][field] = value; setNewDocs(updated); }; const handleRemoveDocRow = (index) => { setNewDocs(newDocs.filter((_, i) => i !== index)); }; const handleSubmit = async (e) => { e.preventDefault(); setLoading(true); const data = new FormData(); data.append('_method', 'PUT'); // For Laravel to handle PUT via POST data.append('name', formData.name); data.append('location', formData.location); data.append('manager_name', formData.manager_name); data.append('operational_start_date', formData.operational_start_date); data.append('status', formData.status); data.append('payroll_from_day', formData.payroll_from_day); data.append('payroll_to_day', formData.payroll_to_day); data.append('salary_generation_day', formData.salary_generation_day); newDocs.forEach((doc, index) => { if (doc.file) { data.append(`new_docs[${index}][file]`, doc.file); data.append(`new_docs[${index}][name]`, doc.name || `New Document ${index + 1}`); data.append(`new_docs[${index}][document_number]`, doc.document_number || ''); data.append(`new_docs[${index}][expiry_date]`, doc.expiry_date); data.append(`new_docs[${index}][reminder_days]`, doc.reminder_days || 30); } }); try { const res = await fetch(`/api/branches/${branch.id}`, { method: 'POST', // Using POST with _method=PUT for FormData headers: { 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content, }, body: data, }); if (res.ok) { onRefresh(); onClose(); } else { const err = await res.json(); alert(err.message || 'Error updating branch'); } } catch (error) { alert('An error occurred. Please try again.'); } finally { setLoading(false); } }; if (!isOpen || !branch) return null; return (
{/* Header */}

Edit Branch

Update details for {branch.name}.

{/* Left: Info */}

Basic Information

setFormData({...formData, name: e.target.value})} />
setFormData({...formData, location: e.target.value})} />
setFormData({...formData, manager_name: e.target.value})} />
setFormData({...formData, operational_start_date: e.target.value})} />

PAYROLL CYCLE CONFIG

setFormData({...formData, payroll_from_day: e.target.value})} />
setFormData({...formData, payroll_to_day: e.target.value})} />
setFormData({...formData, salary_generation_day: e.target.value})} />
{/* Right: Docs */}

Documents

{/* Existing Docs */}

Existing Files

{branch.documents && branch.documents.length > 0 ? ( branch.documents.map((doc) => (

{doc.name} - {doc.document_number || 'N/A'}

Expires: {new Date(doc.expiry_date).toLocaleDateString()}

)) ) : (

No documents uploaded.

)}
{/* New Doc Rows */} {newDocs.map((doc, index) => (
New Document Row
handleNewDocChange(index, 'name', e.target.value)} />
handleNewDocChange(index, 'file', e.target.files[0])} />
handleNewDocChange(index, 'document_number', e.target.value)} />

Doc Number

handleNewDocChange(index, 'expiry_date', e.target.value)} />

Expiry

handleNewDocChange(index, 'reminder_days', e.target.value)} />

Days Before

))}
); }