Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Friday mor #89

Merged
merged 75 commits into from
Oct 11, 2024
Merged
Changes from 1 commit
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
69b09f2
merge the edits
lksnjw Sep 28, 2024
07fa4e0
Merge pull request #1 from lksnjw/SANJEEWA-ADDING
lksnjw Sep 28, 2024
6b00285
Merge pull request #48 from lksnjw/master
lksnjw Sep 28, 2024
aed5ec3
CHANGES MADE PORT NUMBERS
lksnjw Sep 28, 2024
8eb6ae5
done
lksnjw Sep 28, 2024
5eb7bd9
done
lksnjw Sep 28, 2024
af1ac94
fix cloudinary to the register
lksnjw Sep 28, 2024
589096f
Merge pull request #2 from lksnjw/register-change
lksnjw Sep 28, 2024
0d18f30
creating apdf
lksnjw Sep 29, 2024
d9bb721
Merge pull request #3 from lksnjw/creating-a-pdf
lksnjw Sep 29, 2024
1f4c585
fixed driver profile
lksnjw Sep 29, 2024
1eeb6b8
updated
lksnjw Sep 29, 2024
9b976ea
updated the delivery serach
lksnjw Sep 29, 2024
f324699
header
lksnjw Sep 29, 2024
53162ea
done
lksnjw Sep 29, 2024
9952309
Merge pull request #4 from lksnjw/editing-side-bars
lksnjw Sep 29, 2024
15c88d3
count set
lksnjw Sep 29, 2024
ab42f92
Update DLmangeDash.jsx
lksnjw Sep 29, 2024
8e5323f
done
lksnjw Sep 29, 2024
14732e0
updated driver
lksnjw Sep 29, 2024
5f28fc8
Merge pull request #5 from lksnjw/dashboard-update
lksnjw Sep 30, 2024
62f8847
fix errors
lksnjw Sep 30, 2024
71c23e9
Merge pull request #6 from lksnjw/dashboard-update
lksnjw Sep 30, 2024
c181fb9
editing
lksnjw Sep 30, 2024
1103622
done
lksnjw Sep 30, 2024
b3edb8b
Merge pull request #7 from lksnjw/this-is-the-eding-branch
lksnjw Sep 30, 2024
393e363
added pdf download
lksnjw Sep 30, 2024
064fbc2
done
lksnjw Sep 30, 2024
7b42dec
Merge pull request #8 from lksnjw/this-is-the-eding-branch
lksnjw Sep 30, 2024
5042e48
done edit profile pawword verification
lksnjw Sep 30, 2024
f47235f
Merge pull request #9 from lksnjw/this-is-the-eding-branch
lksnjw Sep 30, 2024
0317bc1
done
lksnjw Sep 30, 2024
15c21b1
fixed driver side all deliveriws
lksnjw Sep 30, 2024
2c30771
validation complete for driver registration
lksnjw Sep 30, 2024
24a1504
registation photo validation complete
lksnjw Sep 30, 2024
24219e6
update the sendind email with a button
lksnjw Sep 30, 2024
3650917
DONE linking pages
lksnjw Oct 1, 2024
7ffc3d5
Merge pull request #10 from lksnjw/this-is-the-eding-branch
lksnjw Oct 1, 2024
9ddf5b9
FIX LICENSE REGISTRATION
lksnjw Oct 1, 2024
ba97229
DONE
lksnjw Oct 1, 2024
d2ac115
Update DLDriverRegistrationForm.jsx
lksnjw Oct 1, 2024
823dde3
Merge pull request #11 from lksnjw/this-is-the-eding-branch
lksnjw Oct 1, 2024
dae7947
Merge pull request #12 from lksnjw/SANJEEWA-ADDING
lksnjw Oct 5, 2024
5a1fc7f
🔀 Automated Docker Image Building & Bug fixes (#57)
nmdra Oct 6, 2024
252bd37
Merge pull request #58 from lksnjw/SANJEEWA-ADDING
lksnjw Oct 7, 2024
620d565
format complete
lksnjw Oct 7, 2024
e23b7ae
Merge pull request #61 from lksnjw/SANJEEWA-ADDING
lksnjw Oct 7, 2024
ab18a9c
🚧 Update (WIP)
nmdra Oct 7, 2024
5e4e54b
updated localhost
lksnjw Oct 7, 2024
64bc423
🔀 Update (WIP)
nmdra Oct 7, 2024
ee6521a
Merge pull request #63 from lksnjw/SANJEEWA-ADDING
lksnjw Oct 7, 2024
095fc81
Merge pull request #13 from lksnjw/SANJEEWA-ADDING
lksnjw Oct 7, 2024
3a802c7
Merge branch 'sanjeewa' into sanjeewa_merge
nmdra Oct 7, 2024
43f6853
done
lksnjw Oct 7, 2024
eed00ef
updated auto assigning
lksnjw Oct 7, 2024
f9a7ce6
updated sendin email
lksnjw Oct 7, 2024
335c983
a
lksnjw Oct 8, 2024
a80bf45
Merge remote-tracking branch 'upstream/sanjeewa_merge' into SANJEEWA-…
lksnjw Oct 8, 2024
1766e57
Update DLImageUpload.jsx
lksnjw Oct 8, 2024
55b4cc8
Merge branch 'SANJEEWA-ADDING'
lksnjw Oct 8, 2024
35960d8
Merge branch 'master' of https://github.com/lksnjw/Farm-Cart-
lksnjw Oct 8, 2024
bdff065
update
lksnjw Oct 8, 2024
b1c39bd
fix dl view delivery and make first step to the map
lksnjw Oct 9, 2024
648e8cd
Added income page
lksnjw Oct 10, 2024
e25ce9d
update loadings
lksnjw Oct 10, 2024
7a61744
formated
lksnjw Oct 10, 2024
e719605
Merge branch 'nmdra:master' into master
lksnjw Oct 10, 2024
60f1463
Merge branch 'after-merge' into friday-mor
lksnjw Oct 10, 2024
9e3bd9f
fix preview one
lksnjw Oct 10, 2024
f2d69d1
fixed dash board
lksnjw Oct 10, 2024
e8bb441
formated
lksnjw Oct 10, 2024
20d0941
added admin login
lksnjw Oct 10, 2024
9d52ad1
updated
lksnjw Oct 10, 2024
26917c1
fixed
lksnjw Oct 11, 2024
2203826
Merge branch 'development' into friday-mor
nmdra Oct 11, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
updated driver
created . ongoing delivery
  • Loading branch information
lksnjw committed Sep 29, 2024
commit 14732e0477f77319550f3d1ab5fd3076195b3a26
34 changes: 34 additions & 0 deletions backend/controllers/DLDeliveryController.js
Original file line number Diff line number Diff line change
@@ -166,4 +166,38 @@ export const getOngoingDeliveriesByDriver = asyncHandler(async (req, res) => {
} else {
res.json({ message: 'No ongoing deliveries at the moment' });
}
});



// Update delivery status
export const updateDeliveryStatus = asyncHandler(async (req, res) => {
const { deliveryStatus } = req.body; // Get the new status from the request body

try {
const delivery = await DLDelivery.findById(req.params.deliveryId);

if (!delivery) {
return res.status(404).json({ message: 'Delivery not found' });
}

// Prevent moving back to previous statuses
if (delivery.deliveryStatus === 'Delivered') {
return res.status(400).json({ message: 'Cannot update the status of a delivered order' });
}

// Update the delivery status
delivery.deliveryStatus = deliveryStatus;

// If the delivery is marked as "Delivered", set the deliveredDateTime
if (deliveryStatus === 'Delivered') {
delivery.deliveredDateTime = Date.now();
}

await delivery.save();

res.status(200).json({ message: 'Delivery status updated successfully', delivery });
} catch (error) {
res.status(500).json({ message: 'Error updating delivery status', error });
}
});
5 changes: 4 additions & 1 deletion backend/routes/DLDeliveryRoute.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import express from 'express';
import { getAllDeliveries ,getDeliveryById,getTotalDeliveries,getOngoingDeliveries,getOngoingDeliveriesByDriver} from '../controllers/DLDeliveryController.js';
import { getAllDeliveries ,getDeliveryById,getTotalDeliveries,getOngoingDeliveries,getOngoingDeliveriesByDriver,updateDeliveryStatus} from '../controllers/DLDeliveryController.js';

const router = express.Router();

@@ -23,5 +23,8 @@ router.get('/ongoing/count', getOngoingDeliveries);
// Route to get ongoing deliveries assigned to a driver
router.get('/ongoing/:driverID', getOngoingDeliveriesByDriver);

// Route to update delivery status
router.put('/:deliveryId/status', updateDeliveryStatus);


export default router;
5 changes: 4 additions & 1 deletion frontend/src/App.jsx
Original file line number Diff line number Diff line change
@@ -83,7 +83,8 @@ import OrderTable from './Pages/delivery/DLOtable'; // Assuming you store it in
import Od from './Pages/delivery/or/orderdelete'; //
import DLAllDeliveries from './Pages/delivery/DLviewDeliveries'; // Import the DLAllDeliveries component
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



@@ -204,6 +205,8 @@ const router = createBrowserRouter(
<Route path="/d" element={<Od/>} />
<Route path="/DLAllDeliveries" element={<DLAllDeliveries/>} />
<Route path="/manager/delivery/:id" element={<DLViewDelivery />} />
<Route path="/ongoing" element={<OngoingDelivery />} />
<Route path="/driver/delivery/:id" element={<ViewDelivery />} /> {/* Route for viewing a specific delivery */}


<Route path="*" element={<NotFound />} />
2 changes: 1 addition & 1 deletion frontend/src/Components/delivery/DeliverySidebar.jsx
Original file line number Diff line number Diff line change
@@ -77,7 +77,7 @@ const DeliverySidebar = ({ driver }) => {
</li>
<li>
<NavLink
to="/driver/ongoing-deliveries"
to="/ongoing"
className={({ isActive }) =>
`flex items-center p-2 text-gray-700 rounded-md hover:bg-gray-100 ${
isActive ? 'bg-gray-100 border-l-4 border-green-700' : ''
191 changes: 191 additions & 0 deletions frontend/src/Pages/delivery/driver/OngoingDelivery.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,191 @@
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 OngoingDelivery = () => {
const [deliveries, setDeliveries] = useState([]);
const [loading, setLoading] = useState(true);
const [driver, setDriver] = useState(null);
const driverToken = localStorage.getItem('driverToken');
const navigate = useNavigate();

useEffect(() => {
const fetchDriverAndDeliveries = async () => {
if (!driverToken) {
navigate('/driver/login'); // Redirect to login if not logged in
return;
}

try {
// Fetch driver profile
const driverRes = await axios.get('/api/drivers/profile', {
headers: {
Authorization: `Bearer ${driverToken}`,
},
});
setDriver(driverRes.data);

// Fetch ongoing deliveries for the driver
const deliveriesRes = await axios.get(`/api/delivery/ongoing/${driverRes.data._id}`, {
headers: {
Authorization: `Bearer ${driverToken}`,
},
});

setDeliveries(deliveriesRes.data);
setLoading(false);
} catch (error) {
console.error('Error fetching deliveries:', error);
}
};

fetchDriverAndDeliveries();
}, [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 {
return; // If already delivered or status is not eligible for change, do nothing
}

// 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 (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');
}
}
};

const handleViewDelivery = (deliveryId) => {
navigate(`/driver/delivery/${deliveryId}`); // Navigate to delivery view page
};

if (loading) {
return <div>Loading...</div>;
}

return (
<div className="flex min-h-screen bg-gray-50">
{/* Sidebar */}
<aside className="fixed top-0 left-0 bottom-0 w-64 bg-gray-50 shadow-md pl-8 pt-16 mt-16">
<DeliverySidebar driver={driver} />
</aside>

{/* Main content */}
<main className="flex-1 ml-64 p-16 overflow-y-auto">
<div className="max-w-7xl mx-auto p-8 bg-white shadow-lg rounded-lg">
<h1 className="text-3xl font-bold mb-6 text-center">Ongoing Deliveries</h1>

{deliveries.length > 0 ? (
<div className="overflow-x-auto">
<table className="min-w-full bg-white border border-gray-200">
<thead>
<tr className="bg-gray-200">
<th className="px-4 py-2 border">Tracking ID</th>
<th className="px-4 py-2 border">Order ID</th>
<th className="px-4 py-2 border">Driver ID</th>
<th className="px-4 py-2 border">Shop Name</th>
<th className="px-4 py-2 border">Pickup Address</th>
<th className="px-4 py-2 border">Customer Name</th>
<th className="px-4 py-2 border">Dropoff Address</th>
<th className="px-4 py-2 border">Assigned Time</th>
<th className="px-4 py-2 border">Status</th>
<th className="px-4 py-2 border">Actions</th>
</tr>
</thead>
<tbody>
{deliveries.map((delivery) => (
<tr key={delivery._id} className="hover:bg-gray-100">
<td className="px-4 py-2 border">{delivery.trackingID}</td>
<td className="px-4 py-2 border">{delivery.oID}</td>
<td className="px-4 py-2 border">{delivery.drID}</td>
<td className="px-4 py-2 border">{delivery.shopName}</td>
<td className="px-4 py-2 border">{delivery.pickupAddress}</td>
<td className="px-4 py-2 border">{delivery.customerName}</td>
<td className="px-4 py-2 border">{delivery.dropOffAddress}</td>
<td className="px-4 py-2 border">{new Date(delivery.assignDateTime).toLocaleString()}</td>
<td className="px-4 py-2 border">{delivery.deliveryStatus}</td>
<td className="px-4 py-2 border space-y-2">
<button
onClick={() => handleStatusUpdate(delivery._id, delivery.deliveryStatus)}
className={`block w-full px-4 py-2 ${
delivery.deliveryStatus === 'Ready'
? 'bg-yellow-500 hover:bg-yellow-600'
: delivery.deliveryStatus === 'Picked Up'
? 'bg-blue-500 hover:bg-blue-600'
: delivery.deliveryStatus === 'On The Way'
? 'bg-green-500 hover:bg-green-600'
: 'bg-gray-400 cursor-not-allowed'
} text-white rounded-md`}
disabled={delivery.deliveryStatus === 'Delivered'}
>
{delivery.deliveryStatus === 'Ready'
? 'Picked Up'
: delivery.deliveryStatus === 'Picked Up'
? 'On The Way'
: delivery.deliveryStatus === 'On The Way'
? 'Delivered'
: 'Completed'}
</button>
<button
onClick={() => handleViewDelivery(delivery._id)}
className="block w-full px-4 py-2 bg-gray-500 text-white rounded-md hover:bg-gray-600"
>
View
</button>
</td>
</tr>
))}
</tbody>
</table>
</div>
) : (
<p className="text-center text-gray-600">No ongoing deliveries at the moment.</p>
)}
</div>
</main>
</div>
);
};

export default OngoingDelivery;
118 changes: 118 additions & 0 deletions frontend/src/Pages/delivery/driver/ViewDelivery.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
import React, { useState, useEffect } from 'react';
import { useParams, useNavigate } from 'react-router-dom';
import axios from 'axios';
import DeliverySidebar from '../../../Components/delivery/DeliverySidebar';

const ViewDelivery = () => {
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 driverToken = localStorage.getItem('driverToken'); // Get driver token from localStorage
const navigate = useNavigate();

useEffect(() => {
const fetchDelivery = async () => {
if (!driverToken) {
navigate('/driver/login'); // Redirect to login if token is missing
return;
}

try {
// Fetch the driver profile
const driverRes = await axios.get('/api/drivers/profile', {
headers: {
Authorization: `Bearer ${driverToken}`,
},
});
setDriver(driverRes.data); // Set driver profile

// Fetch the delivery details using the delivery ID from the URL
const deliveryRes = await axios.get(`/api/delivery/d/${id}`, {
headers: {
Authorization: `Bearer ${driverToken}`,
},
});
setDelivery(deliveryRes.data); // Set delivery details
setLoading(false); // Set loading to false when data is fetched
} catch (error) {
console.error('Error fetching delivery details:', error);
setLoading(false);
}
};

fetchDelivery();
}, [driverToken, id, navigate]);

if (loading) return <div>Loading...</div>;

return (
<div className="flex min-h-screen bg-gray-50">
{/* Sidebar */}
<aside className="fixed top-0 left-0 bottom-0 w-64 bg-gray-50 shadow-md pl-8 pt-16 mt-16">
<DeliverySidebar driver={driver} />
</aside>

{/* Main content */}
<main className="flex-1 ml-64 p-16 overflow-y-auto">
<div className="max-w-5xl mx-auto p-8 bg-white shadow-lg rounded-lg">
<h1 className="text-3xl font-bold mb-6 text-center">Delivery Details</h1>

{delivery ? (
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
{/* Displaying all delivery details */}
<div>
<h3 className="font-semibold">Tracking ID:</h3>
<p>{delivery.trackingID}</p>
</div>
<div>
<h3 className="font-semibold">Order ID:</h3>
<p>{delivery.oID}</p>
</div>
<div>
<h3 className="font-semibold">Driver ID:</h3>
<p>{delivery.drID}</p>
</div>
<div>
<h3 className="font-semibold">Shop Name:</h3>
<p>{delivery.shopName}</p>
</div>
<div>
<h3 className="font-semibold">Pickup Address:</h3>
<p>{delivery.pickupAddress}</p>
</div>
<div>
<h3 className="font-semibold">Customer Name:</h3>
<p>{delivery.customerName}</p>
</div>
<div>
<h3 className="font-semibold">Dropoff Address:</h3>
<p>{delivery.dropOffAddress}</p>
</div>
<div>
<h3 className="font-semibold">Assigned Time:</h3>
<p>{new Date(delivery.assignDateTime).toLocaleString()}</p>
</div>
<div>
<h3 className="font-semibold">Delivery Status:</h3>
<p>{delivery.deliveryStatus}</p>
</div>
<div>
<h3 className="font-semibold">Delivered Time:</h3>
<p>
{delivery.deliveredDateTime
? new Date(delivery.deliveredDateTime).toLocaleString()
: 'Not Delivered Yet'}
</p>
</div>
</div>
) : (
<p className="text-center text-gray-600">No delivery details found.</p>
)}
</div>
</main>
</div>
);
};

export default ViewDelivery;