diff --git a/frontend/src/Pages/delivery/DLDriverDashboard.jsx b/frontend/src/Pages/delivery/DLDriverDashboard.jsx index 473f92aa..bc806e2e 100644 --- a/frontend/src/Pages/delivery/DLDriverDashboard.jsx +++ b/frontend/src/Pages/delivery/DLDriverDashboard.jsx @@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import axios from 'axios'; import DeliverySidebar from '../../Components/delivery/DeliverySidebar'; +import { FaCheck, FaTruck, FaClipboardCheck, FaShippingFast } from 'react-icons/fa'; // Import icons for status const DLDriverDashboard = () => { const [driver, setDriver] = useState(null); @@ -64,8 +65,76 @@ const DLDriverDashboard = () => { } }; + const handleStatusUpdate = async (deliveryId, currentStatus) => { + let newStatus; + + // Determine next status + if (currentStatus === 'Ready') { + newStatus = 'Picked Up'; + } else if (currentStatus === 'Picked Up') { + newStatus = 'On The Way'; + } else if (currentStatus === 'On The Way') { + newStatus = 'Delivered'; + } else { + return; // If already delivered or status is not eligible for change, do nothing + } + + try { + const driverToken = localStorage.getItem('driverToken'); + await axios.put( + `/api/delivery/${deliveryId}/status`, + { deliveryStatus: newStatus }, + { + headers: { + Authorization: `Bearer ${driverToken}`, + }, + } + ); + + // Update the delivery status in the state + setOngoingDeliveries((prevDeliveries) => + prevDeliveries.map((delivery) => + delivery._id === deliveryId + ? { ...delivery, deliveryStatus: newStatus } + : delivery + ) + ); + } catch (error) { + console.error('Error updating delivery status:', error); + } + }; + + const handleViewDelivery = (deliveryId) => { + navigate(`/driver/delivery/${deliveryId}`); // Redirect to delivery view page + }; + if (loading) return
Loading...
; + // Helper function to render delivery status with icons + const renderDeliveryStatus = (status) => { + if (status === 'Ready') { + return ; + } else if (status === 'Picked Up') { + return ; + } else if (status === 'On The Way') { + return ; + } else if (status === 'Delivered') { + return ; + } + }; + + // Helper function to render progress bar based on status + const renderProgressBar = (status) => { + const progress = status === 'Ready' ? 25 : status === 'Picked Up' ? 50 : status === 'On The Way' ? 75 : 100; + const bgColor = progress === 100 ? 'bg-gray-400' : 'bg-green-500'; + + return ( +
+
+
+ ); + }; + return (
{/* Sidebar */} @@ -75,6 +144,15 @@ const DLDriverDashboard = () => { {/* Main content */}
+ + {/* NIC and Password Equality Check */} +{driver && driver.idCardNumber === driver.password && ( +
+ Warning: Your NIC number and password are the same. Please update your password for better security. +
+)} + +

Welcome, {driver.fullName}

@@ -111,41 +189,95 @@ const DLDriverDashboard = () => {
{/* Ongoing Deliveries Section */} -
-

Ongoing Deliveries

- {ongoingDeliveries.length > 0 ? ( - - - - - - - - - - - - - {ongoingDeliveries.map((delivery) => ( - - - - - - - - - ))} - -
Tracking IDShop NamePickup AddressDropoff AddressStatusActions
{delivery.trackingID}{delivery.shopName}{delivery.pickupAddress}{delivery.dropOffAddress}{delivery.deliveryStatus} - -
- ) : ( -

No ongoing deliveries at the moment.

- )} +
+

Ongoing Deliveries

+ + {ongoingDeliveries.length > 0 ? ( +
+ {ongoingDeliveries.map((delivery) => ( +
+ {/* Delivery Tracking ID */} +

Tracking ID: {delivery.trackingID}

+ + {/* Delivery Status Progress Bar */} +
+
+
+ + Status: {delivery.deliveryStatus} + +
+
+
+
+
+
+ Progress: + {delivery.deliveryStatus === 'Ready' + ? '25%' + : delivery.deliveryStatus === 'Picked Up' + ? '50%' + : delivery.deliveryStatus === 'On The Way' + ? '75%' + : '100% (Delivered)'} +
+ + {/* Delivery Table for Detailed Info */} + + + + + + + + + + + + + + + + + +
Shop NamePickup AddressDropoff AddressActions
{delivery.shopName}{delivery.pickupAddress}{delivery.dropOffAddress} + + +
+
+ ))} +
+ ) : ( +

No ongoing deliveries at the moment.

+ )} +
+
diff --git a/frontend/src/Pages/delivery/driver/ViewDelivery.jsx b/frontend/src/Pages/delivery/driver/ViewDelivery.jsx index 49fad8db..543c0734 100644 --- a/frontend/src/Pages/delivery/driver/ViewDelivery.jsx +++ b/frontend/src/Pages/delivery/driver/ViewDelivery.jsx @@ -1,13 +1,16 @@ import React, { useState, useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import axios from 'axios'; -import DeliverySidebar from '../../../Components/delivery/DeliverySidebar'; +import jsPDF from 'jspdf'; +import 'jspdf-autotable'; // Import jsPDF-autotable for table formatting +import farmcartLogo from '../../../assets/logo.png'; // Make sure you have your logo here +import DLmanageSidebar from '../../../Components/delivery/DeliverySidebar'; // Sidebar component -const ViewDelivery = () => { +const DLViewDelivery = () => { const { id } = useParams(); // Get the delivery ID from the URL const [delivery, setDelivery] = useState(null); // State for storing delivery data const [driver, setDriver] = useState(null); // State for driver info - const [loading, setLoading] = useState(true); // Loading state + const [loading, setLoading] = useState(true); const driverToken = localStorage.getItem('driverToken'); // Get driver token from localStorage const navigate = useNavigate(); @@ -44,75 +47,129 @@ const ViewDelivery = () => { fetchDelivery(); }, [driverToken, id, navigate]); - if (loading) return
Loading...
; + if (loading) return
Loading...
; + + // Function to generate the PDF + const generatePDF = () => { + const doc = new jsPDF(); + + // Add logo + doc.addImage(farmcartLogo, 'PNG', 10, 10, 50, 20); // Add logo with width and height + + // Add title + doc.setFontSize(22); + doc.text('Delivery Details', 105, 40, null, null, 'center'); // Title centered at the top + + // Add company name + doc.setFontSize(12); + doc.text('FarmCart Lanka (PVT.) LTD', 105, 50, null, null, 'center'); + doc.text('No.78, Malabe, Colombo', 105, 55, null, null, 'center'); + doc.text('(+94) 011 34 56 837', 105, 60, null, null, 'center'); + doc.text('www.farmcart.com', 105, 65, null, null, 'center'); + + // Move down to add delivery details table + doc.setFontSize(12); + doc.text('Delivery Information', 14, 80); // Left-aligned delivery information + + // Create a table with delivery details + doc.autoTable({ + startY: 85, // Starting position on the Y-axis + head: [['Field', 'Details']], // Table headers + body: [ + ['Tracking ID', delivery.trackingID], + ['Order ID', delivery.oID], + ['Driver Name', driver?.firstName + ' ' + driver?.lastName], // Adding driver name + ['Driver ID', delivery.drID], + ['Shop Name', delivery.shopName], + ['Pickup Address', delivery.pickupAddress], + ['Customer Name', delivery.customerName || 'N/A'], + ['Dropoff Address', delivery.dropOffAddress], + ['Assigned Time', new Date(delivery.assignDateTime).toLocaleString()], + ['Delivery Status', delivery.deliveryStatus], + [ + 'Delivered Time', + delivery.deliveredDateTime + ? new Date(delivery.deliveredDateTime).toLocaleString() + : 'Ongoing', + ], + ], + theme: 'grid', // Use grid theme for the table + headStyles: { fillColor: [46, 204, 113] }, // Green background for headers + bodyStyles: { textColor: [0, 0, 0] }, // Black text color for table body + }); + + // Save the PDF with a dynamic name based on the delivery tracking ID + doc.save(`Delivery_${delivery.trackingID}.pdf`); + }; return (
{/* Sidebar */} {/* Main content */} -
-
-

Delivery Details

+
+
{/* Added a green left border */} +

{/* Increased font size and made it bolder */} + Delivery Details +

{delivery ? ( -
- {/* Displaying all delivery details */} -
-

Tracking ID:

-

{delivery.trackingID}

-
-
-

Order ID:

-

{delivery.oID}

-
-
-

Driver ID:

-

{delivery.drID}

-
-
-

Shop Name:

-

{delivery.shopName}

-
-
-

Pickup Address:

-

{delivery.pickupAddress}

-
-
-

Customer Name:

-

{delivery.customerName}

-
-
-

Dropoff Address:

-

{delivery.dropOffAddress}

-
-
-

Assigned Time:

-

{new Date(delivery.assignDateTime).toLocaleString()}

-
-
-

Delivery Status:

-

{delivery.deliveryStatus}

-
-
-

Delivered Time:

-

- {delivery.deliveredDateTime - ? new Date(delivery.deliveredDateTime).toLocaleString() - : 'Not Delivered Yet'} -

-
+
+ + + {[ + ['Tracking ID', delivery.trackingID], + ['Order ID', delivery.oID], + ['Driver Name', driver?.firstName + ' ' + driver?.lastName], // Display driver name + ['Driver ID', delivery.drID], + ['Shop Name', delivery.shopName], + ['Pickup Address', delivery.pickupAddress], + ['Customer Name', delivery.customerName || 'N/A'], + ['Dropoff Address', delivery.dropOffAddress], + ['Assigned Time', new Date(delivery.assignDateTime).toLocaleString()], + ['Delivery Status', delivery.deliveryStatus], + [ + 'Delivered Time', + delivery.deliveredDateTime + ? new Date(delivery.deliveredDateTime).toLocaleString() + : 'Ongoing', + ], + ].map(([field, value], index) => ( + + + + + ))} + +
+ {field} + + {value} +
) : ( -

No delivery details found.

+

No delivery details found.

)} + + {/* Download Button */} +
+ +
); }; -export default ViewDelivery; +export default DLViewDelivery;