import React, { useState, useEffect } from 'react'; import { useParams, useNavigate, useSearchParams } from 'react-router-dom'; import { useWorkOrderDetails, useWorkOrderMutations } from '../hooks/useWorkOrder'; import { FaArrowLeft, FaSave, FaEdit, FaCheckCircle, FaClock } from 'react-icons/fa'; import type { CreateWorkOrderData } from '../services/workOrderService'; const WorkOrderDetail: React.FC = () => { const { workOrderName } = useParams<{ workOrderName: string }>(); const navigate = useNavigate(); const [searchParams] = useSearchParams(); const duplicateFromWorkOrder = searchParams.get('duplicate'); const isNewWorkOrder = workOrderName === 'new'; const isDuplicating = isNewWorkOrder && !!duplicateFromWorkOrder; const { workOrder, loading, error } = useWorkOrderDetails( isDuplicating ? duplicateFromWorkOrder : (isNewWorkOrder ? null : workOrderName || null) ); const { createWorkOrder, updateWorkOrder, updateStatus, loading: saving } = useWorkOrderMutations(); const [isEditing, setIsEditing] = useState(isNewWorkOrder); const [formData, setFormData] = useState({ company: '', work_order_type: '', asset: '', asset_name: '', description: '', repair_status: 'Open', workflow_state: '', department: '', custom_priority_: 'Normal', asset_type: '', manufacturer: '', serial_number: '', model: '', custom_site_contractor: '', custom_subcontractor: '', failure_date: '', custom_deadline_date: '', }); useEffect(() => { if (workOrder) { setFormData({ company: workOrder.company || '', work_order_type: workOrder.work_order_type || '', asset: workOrder.asset || '', asset_name: isDuplicating ? `${workOrder.asset_name} (Copy)` : (workOrder.asset_name || ''), description: workOrder.description || '', repair_status: isDuplicating ? 'Open' : (workOrder.repair_status || 'Open'), workflow_state: workOrder.workflow_state || '', department: workOrder.department || '', custom_priority_: workOrder.custom_priority_ || 'Normal', asset_type: workOrder.asset_type || '', manufacturer: workOrder.manufacturer || '', serial_number: workOrder.serial_number || '', model: workOrder.model || '', custom_site_contractor: workOrder.custom_site_contractor || '', custom_subcontractor: workOrder.custom_subcontractor || '', failure_date: workOrder.failure_date || '', custom_deadline_date: workOrder.custom_deadline_date || '', }); } }, [workOrder, isDuplicating]); const handleChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value })); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!formData.work_order_type) { alert('Please select a Work Order Type'); return; } console.log('Submitting work order data:', formData); try { if (isNewWorkOrder || isDuplicating) { const newWorkOrder = await createWorkOrder(formData); const successMessage = isDuplicating ? 'Work order duplicated successfully!' : 'Work order created successfully!'; alert(successMessage); navigate(`/work-orders/${newWorkOrder.name}`); } else if (workOrderName) { await updateWorkOrder(workOrderName, formData); alert('Work order updated successfully!'); setIsEditing(false); } } catch (err) { console.error('Work order save error:', err); const errorMessage = err instanceof Error ? err.message : 'Unknown error'; if (errorMessage.includes('404') || errorMessage.includes('not found') || errorMessage.includes('has no attribute') || errorMessage.includes('417')) { alert( '⚠️ Work Order API Not Deployed\n\n' + 'The Work Order API endpoint is not deployed on your Frappe server yet.\n\n' + 'Deploy work_order_api.py to: frappe-bench/apps/asset_lite/asset_lite/api/\n\n' + 'Error: ' + errorMessage ); } else { alert('Failed to save work order:\n\n' + errorMessage); } } }; const handleStatusUpdate = async (newStatus: string) => { if (!workOrderName || isNewWorkOrder) return; try { await updateStatus(workOrderName, newStatus); alert('Status updated successfully!'); window.location.reload(); } catch (err) { alert('Failed to update status: ' + (err instanceof Error ? err.message : 'Unknown error')); } }; if (loading) { return (

Loading work order details...

); } if (error && !isNewWorkOrder && !isDuplicating) { return (

Error: {error}

); } return (
{/* Header */}
{!isNewWorkOrder && !isEditing && ( <> {/* Quick Status Update Buttons */} {workOrder?.repair_status !== 'Completed' && ( )} {workOrder?.repair_status !== 'In Progress' && workOrder?.repair_status !== 'Completed' && ( )} )} {isEditing && ( <> )}
{/* Left Column - Main Info */}
{/* Work Order Information */}

Work Order Information

{isDuplicating && (

💡 Duplicating from: {duplicateFromWorkOrder}

)}