From 0317bc1a009223bf9f5fcfdab769f5af121121b1 Mon Sep 17 00:00:00 2001 From: lakshan sanjeewa Date: Tue, 1 Oct 2024 01:02:05 +0530 Subject: [PATCH] done --- backend/controllers/DLDeliveryController.js | 23 +- backend/routes/DLDeliveryRoute.js | 5 +- frontend/src/App.jsx | 4 +- .../Pages/delivery/driver/ViewDeliveries.jsx | 328 +++++++----------- 4 files changed, 161 insertions(+), 199 deletions(-) diff --git a/backend/controllers/DLDeliveryController.js b/backend/controllers/DLDeliveryController.js index f2a609f0..3042c1a2 100644 --- a/backend/controllers/DLDeliveryController.js +++ b/backend/controllers/DLDeliveryController.js @@ -200,4 +200,25 @@ export const updateDeliveryStatus = asyncHandler(async (req, res) => { } catch (error) { res.status(500).json({ message: 'Error updating delivery status', error }); } -}); \ No newline at end of file +}); + + + + +// Controller to get all deliveries for a specific driver +export const getDeliveriesByDriver = async (req, res) => { + const { driverID } = req.params; // Get driverID from route params + + try { + // Fetch all deliveries where the driverID matches + const deliveries = await DLDelivery.find({ driverID: driverID }); + + if (!deliveries || deliveries.length === 0) { + return res.status(404).json({ message: 'No deliveries found for this driver.' }); + } + + res.status(200).json(deliveries); // Return deliveries as response + } catch (error) { + res.status(500).json({ message: 'Error fetching deliveries', error: error.message }); + } +}; \ No newline at end of file diff --git a/backend/routes/DLDeliveryRoute.js b/backend/routes/DLDeliveryRoute.js index 2c465d4a..af9d0835 100644 --- a/backend/routes/DLDeliveryRoute.js +++ b/backend/routes/DLDeliveryRoute.js @@ -1,5 +1,5 @@ import express from 'express'; -import { getAllDeliveries ,getDeliveryById,getTotalDeliveries,getOngoingDeliveries,getOngoingDeliveriesByDriver,updateDeliveryStatus} from '../controllers/DLDeliveryController.js'; +import { getAllDeliveries ,getDeliveryById,getTotalDeliveries,getOngoingDeliveries,getOngoingDeliveriesByDriver,updateDeliveryStatus,getDeliveriesByDriver} from '../controllers/DLDeliveryController.js'; const router = express.Router(); @@ -26,5 +26,8 @@ router.get('/ongoing/:driverID', getOngoingDeliveriesByDriver); // Route to update delivery status router.put('/:deliveryId/status', updateDeliveryStatus); +// Route to get all deliveries for a specific driver +router.get('/driver/:driverID', getDeliveriesByDriver); + export default router; diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index df724bea..1687095b 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -85,7 +85,7 @@ import DLAllDeliveries from './Pages/delivery/DLviewDeliveries'; // Import the D import DLViewDelivery from './Pages/delivery/DLviewDelivery'; // Import the import OngoingDelivery from './Pages/delivery/driver/OngoingDelivery'; // Import the OngoingDelivery component import ViewDelivery from './Pages/delivery/driver/ViewDelivery'; // Import the ViewDelivery page - +import ViewDeliveries from './Pages/delivery/driver/ViewDeliveries'; // Import the ViewDeliveries page @@ -207,7 +207,7 @@ const router = createBrowserRouter( } /> } /> } /> {/* Route for viewing a specific delivery */} - + } /> } /> diff --git a/frontend/src/Pages/delivery/driver/ViewDeliveries.jsx b/frontend/src/Pages/delivery/driver/ViewDeliveries.jsx index 5a70eef1..a37fa192 100644 --- a/frontend/src/Pages/delivery/driver/ViewDeliveries.jsx +++ b/frontend/src/Pages/delivery/driver/ViewDeliveries.jsx @@ -1,109 +1,109 @@ -import React, { useState, useEffect } from 'react'; -import { useNavigate } from 'react-router-dom'; -import axios from 'axios'; -import DeliverySidebar from '../../Components/delivery/DeliverySidebar'; // Sidebar for driver +import React, { useEffect, useState } from 'react' +import axios from 'axios' +import { useNavigate } from 'react-router-dom' +import DeliverySidebar from '../../../Components/delivery/DeliverySidebar' +import Swal from 'sweetalert2' const ViewDeliveries = () => { - const [deliveries, setDeliveries] = useState([]); // Store deliveries - const [searchTerm, setSearchTerm] = useState(''); // Search term for filtering - const [filteredDeliveries, setFilteredDeliveries] = useState([]); // Filtered deliveries - const [page, setPage] = useState(1); // Current page - const [totalPages, setTotalPages] = useState(1); // Total pages - const [filterStatus, setFilterStatus] = useState('All Deliveries'); // Delivery status filter - const [driver, setDriver] = useState(null); // Driver profile - + const [deliveries, setDeliveries] = useState([]); + const [loading, setLoading] = useState(true); + const [driver, setDriver] = useState(null); + const driverToken = localStorage.getItem('driverToken'); const navigate = useNavigate(); - // Fetch driver profile and deliveries on component mount useEffect(() => { const fetchDriverAndDeliveries = async () => { - const driverToken = localStorage.getItem('driverToken'); if (!driverToken) { - navigate('/driver/login'); // Redirect to login if no token + navigate('/driver/login'); // Redirect to login if not logged in return; } try { // Fetch driver profile - const { data: driverData } = await axios.get('/api/drivers/profile', { + const driverRes = await axios.get('/api/drivers/profile', { headers: { Authorization: `Bearer ${driverToken}`, }, }); - setDriver(driverData); // Store driver info + setDriver(driverRes.data); - // Fetch deliveries assigned to this driver - const { data: deliveryData } = await axios.get(`/api/delivery/driver/${driverData._id}`, { - params: { search: searchTerm, page, limit: 20 }, + // Fetch all deliveries for the driver + const deliveriesRes = await axios.get(`/api/delivery/driver/${driverRes.data._id}`, { headers: { Authorization: `Bearer ${driverToken}`, }, }); - setDeliveries(deliveryData.deliveries); - setTotalPages(deliveryData.pages); - setFilteredDeliveries(deliveryData.deliveries); // Initialize with all deliveries + + setDeliveries(deliveriesRes.data); + setLoading(false); } catch (error) { console.error('Error fetching deliveries:', error); + setLoading(false); } }; fetchDriverAndDeliveries(); - }, [searchTerm, page, navigate]); - - // Handle search input change and filter deliveries - const handleSearch = (event) => { - const searchValue = event.target.value; - setSearchTerm(searchValue); - - if (searchValue === '') { - applyStatusFilter(filterStatus); // Reapply status filter if search is cleared + }, [driverToken, navigate]); + + 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 { - const filtered = deliveries.filter( - (delivery) => - delivery.trackingID - .toLowerCase() - .includes(searchValue.toLowerCase()) || - delivery.oID - .toLowerCase() - .includes(searchValue.toLowerCase()) || - delivery.shopName - .toLowerCase() - .includes(searchValue.toLowerCase()) || - (delivery.customerName && - delivery.customerName - .toLowerCase() - .includes(searchValue.toLowerCase())) - ); - setFilteredDeliveries(filtered); + return; // If already delivered or status is not eligible for change, do nothing } - }; - // Handle status filter - const applyStatusFilter = (status) => { - setFilterStatus(status); + // Show SweetAlert confirmation + const result = await Swal.fire({ + title: `Are you sure you want to mark this delivery as ${newStatus}?`, + icon: 'warning', + showCancelButton: true, + confirmButtonText: `Yes, ${newStatus}!`, + }); - if (status === 'All Deliveries') { - setFilteredDeliveries(deliveries); // Show all deliveries - } else { - const filtered = deliveries.filter( - (delivery) => delivery.deliveryStatus === status - ); - setFilteredDeliveries(filtered); + if (result.isConfirmed) { + try { + // Update status in the backend + await axios.put( + `/api/delivery/${deliveryId}/status`, + { deliveryStatus: newStatus }, + { + headers: { + Authorization: `Bearer ${driverToken}`, + }, + } + ); + + // Update the state with the new status + setDeliveries((prevDeliveries) => + prevDeliveries.map((delivery) => + delivery._id === deliveryId + ? { ...delivery, deliveryStatus: newStatus } + : delivery + ) + ); + + // Show success message + Swal.fire('Updated!', `Delivery marked as ${newStatus}.`, 'success'); + } catch (error) { + Swal.fire('Error', 'Failed to update delivery status', 'error'); + } } - - setPage(1); // Reset to first page when filter changes }; - // Handle page change - const handlePageChange = (newPage) => { - if (newPage > 0 && newPage <= totalPages) { - setPage(newPage); - } + const handleViewDelivery = (deliveryId) => { + navigate(`/driver/delivery/${deliveryId}`); // Navigate to delivery view page }; - const handleView = (id) => { - navigate(`/driver/delivery/${id}`); // Redirect to the delivery view page with the delivery ID - }; + if (loading) { + return
Loading...
; + } return (
@@ -113,138 +113,76 @@ const ViewDeliveries = () => { {/* Main content */} -
-
-

- Your Deliveries -

- - {/* Search box */} -
- -
- - {/* Status filter buttons */} -
- - - - - -
- - {/* Deliveries table */} -
- - - - - - - - - - - - - - {filteredDeliveries.length > 0 ? ( - filteredDeliveries.map((delivery, index) => ( +
+
+

All Deliveries

+ + {deliveries.length > 0 ? ( +
+
#Tracking IDShop NamePickup AddressDropoff AddressStatusActions
+ + + + + + + + + + + + + + + + {deliveries.map((delivery) => ( - - - - - - - + + + + + + + + + - )) - ) : ( - - - - )} - -
Tracking IDOrder IDDriver IDShop NamePickup AddressCustomer NameDropoff AddressAssigned TimeStatusActions
- {(page - 1) * 20 + index + 1} - {delivery.trackingID}{delivery.shopName}{delivery.pickupAddress}{delivery.dropOffAddress}{delivery.deliveryStatus} + {delivery.trackingID}{delivery.oID}{delivery.drID}{delivery.shopName}{delivery.pickupAddress}{delivery.customerName}{delivery.dropOffAddress}{new Date(delivery.assignDateTime).toLocaleString()}{delivery.deliveryStatus} +
- No deliveries found -
-
- - {/* Pagination */} -
- - - Page {page} of {totalPages} - - -
+ ))} + + +
+ ) : ( +

No deliveries available at the moment.

+ )}