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 ? (
-
-
-
- Tracking ID |
- Shop Name |
- Pickup Address |
- Dropoff Address |
- Status |
- Actions |
-
-
-
- {ongoingDeliveries.map((delivery) => (
-
- {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 Name |
+ Pickup Address |
+ Dropoff Address |
+ Actions |
+
+
+
+
+ {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;