get invoice api integration and add search functionality

This commit is contained in:
Sibunnayak 2024-09-24 11:12:26 +05:30
parent 85aafe181c
commit 0a2a416b6c
3 changed files with 145 additions and 1054 deletions

View File

@ -1,302 +1,4 @@
// import React, { useState, useEffect } from "react";
// import { Link } from "react-router-dom";
// import axios from "axios";
// import { isAutheticated } from "src/auth";
// function DeliveredOrders() {
// const token = isAutheticated();
// const [loading, setLoading] = useState(true);
// const [success, setSuccess] = useState(true);
// const [deliveredOrdersData, setDeliveredOrdersData] = useState([]);
// const [currentPage, setCurrentPage] = useState(1);
// const [itemPerPage, setItemPerPage] = useState(10);
// const [showData, setShowData] = useState(deliveredOrdersData);
// const handleShowEntries = (e) => {
// setCurrentPage(1);
// setItemPerPage(e.target.value);
// };
// useEffect(() => {
// function getProcessingOrder() {
// axios
// .get(`/api/order/getAll/delivered`, {
// headers: {
// "Access-Control-Allow-Origin": "*",
// Authorization: `Bearer ${token}`,
// },
// })
// .then((res) => {
// setDeliveredOrdersData(res.data.order);
// setLoading(false);
// })
// .catch((err) => {
// console.log(err);
// setLoading(false);
// });
// }
// getProcessingOrder();
// }, []);
// useEffect(() => {
// const loadData = () => {
// const indexOfLastPost = currentPage * itemPerPage;
// const indexOfFirstPost = indexOfLastPost - itemPerPage;
// setShowData(deliveredOrdersData.slice(indexOfFirstPost, indexOfLastPost));
// };
// loadData();
// }, [currentPage, itemPerPage, deliveredOrdersData]);
// return (
// <div className="main-content">
// <div className="page-content">
// <div className="container-fluid">
// <div className="row">
// <div className="col-12">
// <div
// className="
// page-title-box
// d-flex
// align-items-center
// justify-content-between
// "
// >
// <div style={{ fontSize: "22px" }} className="fw-bold">
// Delivered Orders
// </div>
// </div>
// </div>
// </div>
// <div className="row">
// <div className="col-lg-12">
// <div className="card">
// <div className="card-body">
// <div className="row ml-0 mr-0 mb-10">
// <div className="col-sm-12 col-md-12">
// <div className="dataTables_length">
// <label className="w-100">
// Show
// <select
// style={{ width: "10%" }}
// name=""
// onChange={(e) => handleShowEntries(e)}
// className="
// select-w
// custom-select custom-select-sm
// form-control form-control-sm
// "
// >
// <option value="10">10</option>
// <option value="25">25</option>
// <option value="50">50</option>
// <option value="100">100</option>
// </select>
// entries
// </label>
// </div>
// </div>
// </div>
// <div className="table-responsive table-shoot mt-3">
// <table
// className="table table-centered table-nowrap"
// style={{ border: "1px solid" }}
// >
// <thead
// className="thead-light"
// style={{ background: "#ecdddd" }}
// >
// <tr>
// <th className="text-start">Order ID</th>
// <th className="text-start">Customer</th>
// <th className="text-start">Order value</th>
// <th className="text-start">Order At</th>
// <th className="text-start">Status</th>
// <th className="text-start">Actions</th>
// </tr>
// </thead>
// <tbody>
// {!loading && showData.length === 0 && (
// <tr className="text-center">
// <td colSpan="6">
// <h5>No Data Available</h5>
// </td>
// </tr>
// )}
// {loading ? (
// <tr>
// <td className="text-center" colSpan="6">
// Loading...
// </td>
// </tr>
// ) : (
// showData.map((order, i) => {
// return (
// <tr key={i}>
// <td className="text-start">{order?.orderID}</td>
// <td className="text-start">
// {order?.user?.name}
// </td>
// <td className="text-start">
// ₹{order?.total_amount}
// </td>
// <td className="text-start">
// {new Date(order?.paidAt).toLocaleString(
// "en-IN",
// {
// month: "short",
// day: "numeric",
// year: "numeric",
// hour: "2-digit",
// minute: "numeric",
// hour12: true,
// }
// )}
// </td>
// <td className="text-start">
// <span className="badge text-bg-success text-white">
// {order?.orderStatus}
// </span>
// </td>
// <td className="text-start">
// {/* <Link to={`/orders/${order.orderStatus}/${order._id}`}> */}
// <Link
// to={`/orders/${order.orderStatus}/${order._id}`}
// >
// <button
// style={{ color: "white" }}
// type="button"
// className="
// btn btn-primary btn-sm
// waves-effect waves-light
// btn-table
// ms-2 mt-1
// "
// >
// View
// </button>
// </Link>
// </td>
// </tr>
// );
// })
// )}
// </tbody>
// </table>
// </div>
// <div className="row mt-20">
// <div className="col-sm-12 col-md-6 mb-20">
// <div
// className="dataTables_info"
// id="datatable_info"
// role="status"
// aria-live="polite"
// >
// Showing {currentPage * itemPerPage - itemPerPage + 1} to{" "}
// {Math.min(
// currentPage * itemPerPage,
// deliveredOrdersData.length
// )}{" "}
// of {deliveredOrdersData.length} entries
// </div>
// </div>
// <div className="col-sm-12 col-md-6">
// <div className="d-flex">
// <ul className="pagination ms-auto">
// <li
// className={
// currentPage === 1
// ? "paginate_button page-item previous disabled"
// : "paginate_button page-item previous"
// }
// >
// <span
// className="page-link"
// style={{ cursor: "pointer" }}
// onClick={() => setCurrentPage((prev) => prev - 1)}
// >
// Previous
// </span>
// </li>
// {!(currentPage - 1 < 1) && (
// <li className="paginate_button page-item">
// <span
// className="page-link"
// style={{ cursor: "pointer" }}
// onClick={(e) =>
// setCurrentPage((prev) => prev - 1)
// }
// >
// {currentPage - 1}
// </span>
// </li>
// )}
// <li className="paginate_button page-item active">
// <span
// className="page-link"
// style={{ cursor: "pointer" }}
// >
// {currentPage}
// </span>
// </li>
// {!(
// (currentPage + 1) * itemPerPage - itemPerPage >
// deliveredOrdersData.length - 1
// ) && (
// <li className="paginate_button page-item ">
// <span
// className="page-link"
// style={{ cursor: "pointer" }}
// onClick={() => {
// setCurrentPage((prev) => prev + 1);
// }}
// >
// {currentPage + 1}
// </span>
// </li>
// )}
// <li
// className={
// !(
// (currentPage + 1) * itemPerPage - itemPerPage >
// deliveredOrdersData.length - 1
// )
// ? "paginate_button page-item next"
// : "paginate_button page-item next disabled"
// }
// >
// <span
// className="page-link"
// style={{ cursor: "pointer" }}
// onClick={() => setCurrentPage((prev) => prev + 1)}
// >
// Next
// </span>
// </li>
// </ul>
// </div>
// </div>
// </div>
// </div>
// </div>
// </div>
// </div>
// </div>
// </div>
// </div>
// );
// }
// export default DeliveredOrders;
import React, { useState, useEffect } from "react";
import React, { useState, useEffect, useRef } from "react";
import {
Box,
Button,
@ -319,36 +21,41 @@ import {
import { useNavigate } from "react-router-dom";
import axios from "axios";
import { isAutheticated } from "src/auth";
import { debounce } from "lodash"; // Import debounce from lodash
const DeliveredOrders = () => {
const ProcessingOrders = () => {
const [orders, setOrders] = useState([]);
const [loading, setLoading] = useState(true);
const [page, setPage] = useState(0);
const [page, setPage] = useState(0); // 0-based page
const [rowsPerPage, setRowsPerPage] = useState(5);
const [totalOrders, setTotalOrders] = useState(0);
const [searchField, setSearchField] = useState("Order ID");
const [searchText, setSearchText] = useState("");
const navigate = useNavigate();
const token = isAutheticated();
const searchRef = useRef();
const fetchOrdersDebounced = useRef(
debounce((page, limit, searchField, searchText) => {
fetchOrders(page, limit, searchField, searchText);
}, 500)
).current;
// Fetch orders with pagination
const fetchOrders = async (page, limit) => {
const fetchOrders = async (page, limit, searchField = "", searchText = "") => {
setLoading(true);
try {
const response = await axios.get("/api/get-delivered-order-admin", {
const response = await axios.get("/api/get-delivered-invoice-admin", {
headers: {
Authorization: `Bearer ${token}`,
},
params: {
page: page + 1, // Adjusting for zero-based index in the UI
limit,
searchField,
searchText,
page: page + 1,
[searchField === "Order ID" ? "orderId" : "invoiceId"]: searchText || "",
},
});
// console.log(response);
setOrders(response?.data?.deliveredOrders);
setTotalOrders(response?.data?.totalOrders);
setOrders(response?.data?.invoices);
setTotalOrders(response?.data?.totalCount);
} catch (error) {
console.error("Error fetching orders:", error);
} finally {
@ -357,11 +64,13 @@ const DeliveredOrders = () => {
};
useEffect(() => {
fetchOrders(page, rowsPerPage);
}, [page, rowsPerPage, searchField, searchText]);
fetchOrdersDebounced(page, rowsPerPage, searchField, searchText);
}, [page, rowsPerPage, searchField, searchText]);
const handleSearchChange = (event) => {
setSearchText(event.target.value);
const value = event.target.value;
setSearchText(value);
searchRef.current = value;
};
const handleSearchFieldChange = (event) => {
@ -369,28 +78,18 @@ const DeliveredOrders = () => {
};
const handleChangePage = (event, newPage) => {
setPage(newPage);
setPage(newPage);
};
const handleChangeRowsPerPage = (event) => {
setRowsPerPage(parseInt(event.target.value, 10));
setPage(0);
setPage(0);
};
const filteredOrders = orders?.filter((order) => {
if (searchField === "Order ID") {
return order.uniqueId.toLowerCase().includes(searchText.toLowerCase());
}
if (searchField === "Status") {
return order.status.toLowerCase().includes(searchText.toLowerCase());
}
return true;
});
return (
<Box>
<Typography variant="h4" mb={2} textAlign="center">
Delivered Order Placed List
Delivered Invoice List
</Typography>
<Box display="flex" mb={2} alignItems="center">
<FormControl variant="outlined" sx={{ minWidth: 150, mr: 2 }}>
@ -403,7 +102,7 @@ const DeliveredOrders = () => {
label="Search By"
>
<MenuItem value="Order ID">Order ID</MenuItem>
<MenuItem value="Status">Status</MenuItem>
<MenuItem value="Invoice ID">Invoice ID</MenuItem>
</Select>
</FormControl>
<TextField
@ -419,9 +118,10 @@ const DeliveredOrders = () => {
<TableHead>
<TableRow>
<TableCell>Order ID</TableCell>
<TableCell>Order Date</TableCell>
<TableCell>Invoice ID</TableCell>
<TableCell>Processing Date</TableCell>
<TableCell>Items</TableCell>
<TableCell>Order Value</TableCell>
<TableCell>Invoice Value</TableCell>
<TableCell>Status</TableCell>
<TableCell>Action</TableCell>
</TableRow>
@ -435,23 +135,24 @@ const DeliveredOrders = () => {
</TableCell>
</TableRow>
))
) : filteredOrders.length > 0 ? (
filteredOrders.map((order) => (
<TableRow key={order._id}>
<TableCell>{order.uniqueId}</TableCell>
) : orders.length > 0 ? (
orders.map((invoice) => (
<TableRow key={invoice._id}>
<TableCell>{invoice.orderId.uniqueId}</TableCell>
<TableCell>{invoice.invoiceId}</TableCell>
<TableCell>
{new Date(order.createdAt).toDateString()}
<span>, {formatAMPM(order.createdAt)}</span>
{new Date(invoice.courierstatus_timeline.delivered).toDateString()}
<span>, {formatAMPM(invoice.courierstatus_timeline.delivered)}</span>
</TableCell>
<TableCell>{order.orderItem.length}</TableCell>
<TableCell>{order.grandTotal.toFixed(2)}</TableCell>
<TableCell>{order.status}</TableCell>
<TableCell>{invoice.items.length}</TableCell>
<TableCell>{invoice.invoiceAmount}</TableCell>
<TableCell>{invoice.courierStatus}</TableCell>
<TableCell>
<Button
variant="contained"
color="primary"
onClick={() =>
navigate(`/orders/${order.status}/${order._id}`)
navigate(`/orders/${invoice.courierStatus}/${invoice._id}`)
}
>
View
@ -462,7 +163,7 @@ const DeliveredOrders = () => {
) : (
<TableRow>
<TableCell colSpan={6} align="center">
<Typography variant="body1">Data not found</Typography>
<Typography variant="body1">No data found</Typography>
</TableCell>
</TableRow>
)}
@ -473,7 +174,7 @@ const DeliveredOrders = () => {
component="div"
count={totalOrders}
rowsPerPage={rowsPerPage}
page={page}
page={page}
onPageChange={handleChangePage}
onRowsPerPageChange={handleChangeRowsPerPage}
/>
@ -484,14 +185,12 @@ const DeliveredOrders = () => {
// Helper function to format time as AM/PM
const formatAMPM = (date) => {
var hours = new Date(date).getHours();
var minutes = new Date(date).getMinutes();
var ampm = hours >= 12 ? "PM" : "AM";
hours = hours % 12;
hours = hours ? hours : 12;
minutes = minutes < 10 ? "0" + minutes : minutes;
var strTime = hours + ":" + minutes + " " + ampm;
return strTime;
const hours = new Date(date).getHours();
const minutes = new Date(date).getMinutes();
const ampm = hours >= 12 ? "PM" : "AM";
const formattedHours = hours % 12 || 12;
const formattedMinutes = minutes < 10 ? "0" + minutes : minutes;
return `${formattedHours}:${formattedMinutes} ${ampm}`;
};
export default DeliveredOrders;
export default ProcessingOrders;

View File

@ -1,304 +1,4 @@
// import React, { useState, useEffect } from "react";
// import { Link } from "react-router-dom";
// import axios from "axios";
// import { isAutheticated } from "src/auth";
// function DispatchedOrders() {
// const token = isAutheticated();
// const [loading, setLoading] = useState(true);
// const [success, setSuccess] = useState(true);
// const [dispatchedOrdersData, setDispatchedOrdersData] = useState([]);
// const [currentPage, setCurrentPage] = useState(1);
// const [itemPerPage, setItemPerPage] = useState(10);
// const [showData, setShowData] = useState(dispatchedOrdersData);
// const handleShowEntries = (e) => {
// setCurrentPage(1);
// setItemPerPage(e.target.value);
// };
// useEffect(() => {
// function getDispatchedOrder() {
// axios
// .get(`/api/order/getAll/dispatched`, {
// headers: {
// "Access-Control-Allow-Origin": "*",
// Authorization: `Bearer ${token}`,
// },
// })
// .then((res) => {
// setDispatchedOrdersData(res.data.order);
// console.log(res.data.order);
// setLoading(false);
// })
// .catch((err) => {
// console.log(err);
// setLoading(false);
// });
// }
// getDispatchedOrder();
// }, []);
// useEffect(() => {
// const loadData = () => {
// const indexOfLastPost = currentPage * itemPerPage;
// const indexOfFirstPost = indexOfLastPost - itemPerPage;
// setShowData(
// dispatchedOrdersData.slice(indexOfFirstPost, indexOfLastPost)
// );
// };
// loadData();
// }, [currentPage, itemPerPage, dispatchedOrdersData]);
// return (
// <div className="main-content">
// <div className="page-content">
// <div className="container-fluid">
// <div className="row">
// <div className="col-12">
// <div
// className="
// page-title-box
// d-flex
// align-items-center
// justify-content-between
// "
// >
// <div style={{ fontSize: "22px" }} className="fw-bold">
// Dispatched Orders
// </div>
// </div>
// </div>
// </div>
// <div className="row">
// <div className="col-lg-12">
// <div className="card">
// <div className="card-body">
// <div className="row ml-0 mr-0 mb-10">
// <div className="col-sm-12 col-md-12">
// <div className="dataTables_length">
// <label className="w-100">
// Show
// <select
// style={{ width: "10%" }}
// name=""
// onChange={(e) => handleShowEntries(e)}
// className="
// select-w
// custom-select custom-select-sm
// form-control form-control-sm
// "
// >
// <option value="10">10</option>
// <option value="25">25</option>
// <option value="50">50</option>
// <option value="100">100</option>
// </select>
// entries
// </label>
// </div>
// </div>
// </div>
// <div className="table-responsive table-shoot mt-3">
// <table
// className="table table-centered table-nowrap"
// style={{ border: "1px solid" }}
// >
// <thead
// className="thead-light"
// style={{ background: "#ecdddd" }}
// >
// <tr>
// <th className="text-start">Order ID</th>
// <th className="text-start">Customer</th>
// <th className="text-start">Order value</th>
// <th className="text-start">Order At</th>
// <th className="text-start">Status</th>
// <th className="text-start">Actions</th>
// </tr>
// </thead>
// <tbody>
// {!loading && showData.length === 0 && (
// <tr className="text-center">
// <td colSpan="6">
// <h5>No Data Available</h5>
// </td>
// </tr>
// )}
// {loading ? (
// <tr>
// <td className="text-center" colSpan="6">
// Loading...
// </td>
// </tr>
// ) : (
// showData.map((order, i) => {
// return (
// <tr key={i}>
// <td className="text-start">{order?.orderID}</td>
// <td className="text-start">
// {order?.user?.name}
// </td>
// <td className="text-start">
// ₹{order?.total_amount}
// </td>
// <td className="text-start">
// {new Date(order?.paidAt).toLocaleString(
// "en-IN",
// {
// month: "short",
// day: "numeric",
// year: "numeric",
// hour: "2-digit",
// minute: "numeric",
// hour12: true,
// }
// )}
// </td>
// <td className="text-start">
// <span className="badge text-bg-info text-white">
// {order?.orderStatus}
// </span>
// </td>
// <td className="text-start">
// {/* <Link to={`/orders/${order.orderStatus}/${order._id}`}> */}
// <Link
// to={`/orders/${order.orderStatus}/${order._id}`}
// >
// <button
// style={{ color: "white" }}
// type="button"
// className="
// btn btn-primary btn-sm
// waves-effect waves-light
// btn-table
// ms-2 mt-1
// "
// >
// View
// </button>
// </Link>
// </td>
// </tr>
// );
// })
// )}
// </tbody>
// </table>
// </div>
// <div className="row mt-20">
// <div className="col-sm-12 col-md-6 mb-20">
// <div
// className="dataTables_info"
// id="datatable_info"
// role="status"
// aria-live="polite"
// >
// Showing {currentPage * itemPerPage - itemPerPage + 1} to{" "}
// {Math.min(
// currentPage * itemPerPage,
// dispatchedOrdersData.length
// )}{" "}
// of {dispatchedOrdersData.length} entries
// </div>
// </div>
// <div className="col-sm-12 col-md-6">
// <div className="d-flex">
// <ul className="pagination ms-auto">
// <li
// className={
// currentPage === 1
// ? "paginate_button page-item previous disabled"
// : "paginate_button page-item previous"
// }
// >
// <span
// className="page-link"
// style={{ cursor: "pointer" }}
// onClick={() => setCurrentPage((prev) => prev - 1)}
// >
// Previous
// </span>
// </li>
// {!(currentPage - 1 < 1) && (
// <li className="paginate_button page-item">
// <span
// className="page-link"
// style={{ cursor: "pointer" }}
// onClick={(e) =>
// setCurrentPage((prev) => prev - 1)
// }
// >
// {currentPage - 1}
// </span>
// </li>
// )}
// <li className="paginate_button page-item active">
// <span
// className="page-link"
// style={{ cursor: "pointer" }}
// >
// {currentPage}
// </span>
// </li>
// {!(
// (currentPage + 1) * itemPerPage - itemPerPage >
// dispatchedOrdersData.length - 1
// ) && (
// <li className="paginate_button page-item ">
// <span
// className="page-link"
// style={{ cursor: "pointer" }}
// onClick={() => {
// setCurrentPage((prev) => prev + 1);
// }}
// >
// {currentPage + 1}
// </span>
// </li>
// )}
// <li
// className={
// !(
// (currentPage + 1) * itemPerPage - itemPerPage >
// dispatchedOrdersData.length - 1
// )
// ? "paginate_button page-item next"
// : "paginate_button page-item next disabled"
// }
// >
// <span
// className="page-link"
// style={{ cursor: "pointer" }}
// onClick={() => setCurrentPage((prev) => prev + 1)}
// >
// Next
// </span>
// </li>
// </ul>
// </div>
// </div>
// </div>
// </div>
// </div>
// </div>
// </div>
// </div>
// </div>
// </div>
// );
// }
// export default DispatchedOrders;
import React, { useState, useEffect } from "react";
import React, { useState, useEffect, useRef } from "react";
import {
Box,
Button,
@ -321,36 +21,41 @@ import {
import { useNavigate } from "react-router-dom";
import axios from "axios";
import { isAutheticated } from "src/auth";
import { debounce } from "lodash"; // Import debounce from lodash
const DispatchedOrders = () => {
const ProcessingOrders = () => {
const [orders, setOrders] = useState([]);
const [loading, setLoading] = useState(true);
const [page, setPage] = useState(0);
const [page, setPage] = useState(0); // 0-based page
const [rowsPerPage, setRowsPerPage] = useState(5);
const [totalOrders, setTotalOrders] = useState(0);
const [searchField, setSearchField] = useState("Order ID");
const [searchText, setSearchText] = useState("");
const navigate = useNavigate();
const token = isAutheticated();
const searchRef = useRef();
const fetchOrdersDebounced = useRef(
debounce((page, limit, searchField, searchText) => {
fetchOrders(page, limit, searchField, searchText);
}, 500)
).current;
// Fetch orders with pagination
const fetchOrders = async (page, limit) => {
const fetchOrders = async (page, limit, searchField = "", searchText = "") => {
setLoading(true);
try {
const response = await axios.get("/api/get-dispatched-order-admin", {
const response = await axios.get("/api/get-dispatched-invoice-admin", {
headers: {
Authorization: `Bearer ${token}`,
},
params: {
page: page + 1, // Adjusting for zero-based index in the UI
limit,
searchField,
searchText,
page: page + 1,
[searchField === "Order ID" ? "orderId" : "invoiceId"]: searchText || "",
},
});
// console.log(response);
setOrders(response?.data?.dispatchedOrders);
setTotalOrders(response?.data?.totalOrders);
setOrders(response?.data?.invoices);
setTotalOrders(response?.data?.totalCount);
} catch (error) {
console.error("Error fetching orders:", error);
} finally {
@ -359,11 +64,13 @@ const DispatchedOrders = () => {
};
useEffect(() => {
fetchOrders(page, rowsPerPage);
}, [page, rowsPerPage, searchField, searchText]);
fetchOrdersDebounced(page, rowsPerPage, searchField, searchText);
}, [page, rowsPerPage, searchField, searchText]);
const handleSearchChange = (event) => {
setSearchText(event.target.value);
const value = event.target.value;
setSearchText(value);
searchRef.current = value;
};
const handleSearchFieldChange = (event) => {
@ -371,28 +78,18 @@ const DispatchedOrders = () => {
};
const handleChangePage = (event, newPage) => {
setPage(newPage);
setPage(newPage);
};
const handleChangeRowsPerPage = (event) => {
setRowsPerPage(parseInt(event.target.value, 10));
setPage(0);
setPage(0);
};
const filteredOrders = orders?.filter((order) => {
if (searchField === "Order ID") {
return order.uniqueId.toLowerCase().includes(searchText.toLowerCase());
}
if (searchField === "Status") {
return order.status.toLowerCase().includes(searchText.toLowerCase());
}
return true;
});
return (
<Box>
<Typography variant="h4" mb={2} textAlign="center">
Dispatched Order Placed List
Dispatch Invoice List
</Typography>
<Box display="flex" mb={2} alignItems="center">
<FormControl variant="outlined" sx={{ minWidth: 150, mr: 2 }}>
@ -405,7 +102,7 @@ const DispatchedOrders = () => {
label="Search By"
>
<MenuItem value="Order ID">Order ID</MenuItem>
<MenuItem value="Status">Status</MenuItem>
<MenuItem value="Invoice ID">Invoice ID</MenuItem>
</Select>
</FormControl>
<TextField
@ -421,9 +118,10 @@ const DispatchedOrders = () => {
<TableHead>
<TableRow>
<TableCell>Order ID</TableCell>
<TableCell>Order Date</TableCell>
<TableCell>Invoice ID</TableCell>
<TableCell>Processing Date</TableCell>
<TableCell>Items</TableCell>
<TableCell>Order Value</TableCell>
<TableCell>Invoice Value</TableCell>
<TableCell>Status</TableCell>
<TableCell>Action</TableCell>
</TableRow>
@ -437,23 +135,24 @@ const DispatchedOrders = () => {
</TableCell>
</TableRow>
))
) : filteredOrders.length > 0 ? (
filteredOrders.map((order) => (
<TableRow key={order._id}>
<TableCell>{order.uniqueId}</TableCell>
) : orders.length > 0 ? (
orders.map((invoice) => (
<TableRow key={invoice._id}>
<TableCell>{invoice.orderId.uniqueId}</TableCell>
<TableCell>{invoice.invoiceId}</TableCell>
<TableCell>
{new Date(order.createdAt).toDateString()}
<span>, {formatAMPM(order.createdAt)}</span>
{new Date(invoice.courierstatus_timeline.dispatched).toDateString()}
<span>, {formatAMPM(invoice.courierstatus_timeline.dispatched)}</span>
</TableCell>
<TableCell>{order.orderItem.length}</TableCell>
<TableCell>{order.grandTotal.toFixed(2)}</TableCell>
<TableCell>{order.status}</TableCell>
<TableCell>{invoice.items.length}</TableCell>
<TableCell>{invoice.invoiceAmount}</TableCell>
<TableCell>{invoice.courierStatus}</TableCell>
<TableCell>
<Button
variant="contained"
color="primary"
onClick={() =>
navigate(`/orders/${order.status}/${order._id}`)
navigate(`/orders/${invoice.courierStatus}/${invoice._id}`)
}
>
View
@ -464,7 +163,7 @@ const DispatchedOrders = () => {
) : (
<TableRow>
<TableCell colSpan={6} align="center">
<Typography variant="body1">Data not found</Typography>
<Typography variant="body1">No data found</Typography>
</TableCell>
</TableRow>
)}
@ -475,7 +174,7 @@ const DispatchedOrders = () => {
component="div"
count={totalOrders}
rowsPerPage={rowsPerPage}
page={page}
page={page}
onPageChange={handleChangePage}
onRowsPerPageChange={handleChangeRowsPerPage}
/>
@ -486,14 +185,12 @@ const DispatchedOrders = () => {
// Helper function to format time as AM/PM
const formatAMPM = (date) => {
var hours = new Date(date).getHours();
var minutes = new Date(date).getMinutes();
var ampm = hours >= 12 ? "PM" : "AM";
hours = hours % 12;
hours = hours ? hours : 12;
minutes = minutes < 10 ? "0" + minutes : minutes;
var strTime = hours + ":" + minutes + " " + ampm;
return strTime;
const hours = new Date(date).getHours();
const minutes = new Date(date).getMinutes();
const ampm = hours >= 12 ? "PM" : "AM";
const formattedHours = hours % 12 || 12;
const formattedMinutes = minutes < 10 ? "0" + minutes : minutes;
return `${formattedHours}:${formattedMinutes} ${ampm}`;
};
export default DispatchedOrders;
export default ProcessingOrders;

View File

@ -1,306 +1,4 @@
// import React, { useState, useEffect } from "react";
// import { Link } from "react-router-dom";
// import axios from "axios";
// import { isAutheticated } from "src/auth";
// import toast from "react-hot-toast";
// function ProcessingOrders() {
// const token = isAutheticated();
// const [loading, setLoading] = useState(true);
// const [success, setSuccess] = useState(true);
// const [processingOrdersData, setProcessingOrdersData] = useState([]);
// const [currentPage, setCurrentPage] = useState(1);
// const [itemPerPage, setItemPerPage] = useState(10);
// const [showData, setShowData] = useState(processingOrdersData);
// const handleShowEntries = (e) => {
// setCurrentPage(1);
// setItemPerPage(e.target.value);
// };
// useEffect(() => {
// function getProcessingOrder() {
// axios
// .get(`/api/order/getAll/processing`, {
// headers: {
// "Access-Control-Allow-Origin": "*",
// Authorization: `Bearer ${token}`,
// },
// })
// .then((res) => {
// console.log(res.data.order);
// setProcessingOrdersData(res.data.order);
// setLoading(false);
// })
// .catch((err) => {
// console.log(err);
// setLoading(false);
// });
// }
// getProcessingOrder();
// }, []);
// useEffect(() => {
// const loadData = () => {
// const indexOfLastPost = currentPage * itemPerPage;
// const indexOfFirstPost = indexOfLastPost - itemPerPage;
// setShowData(
// processingOrdersData.slice(indexOfFirstPost, indexOfLastPost)
// );
// };
// loadData();
// }, [currentPage, itemPerPage, processingOrdersData]);
// return (
// <div className="main-content">
// <div className="page-content">
// <div className="container-fluid">
// <div className="row">
// <div className="col-12">
// <div
// className="
// page-title-box
// d-flex
// align-items-center
// justify-content-between
// "
// >
// <div style={{ fontSize: "22px" }} className="fw-bold">
// Processing Orders
// </div>
// </div>
// </div>
// </div>
// <div className="row">
// <div className="col-lg-12">
// <div className="card">
// <div className="card-body">
// <div className="row ml-0 mr-0 mb-10">
// <div className="col-sm-12 col-md-12">
// <div className="dataTables_length">
// <label className="w-100">
// Show
// <select
// style={{ width: "10%" }}
// name=""
// onChange={(e) => handleShowEntries(e)}
// className="
// select-w
// custom-select custom-select-sm
// form-control form-control-sm
// "
// >
// <option value="10">10</option>
// <option value="25">25</option>
// <option value="50">50</option>
// <option value="100">100</option>
// </select>
// entries
// </label>
// </div>
// </div>
// </div>
// <div className="table-responsive table-shoot mt-3">
// <table
// className="table table-centered table-nowrap"
// style={{ border: "1px solid" }}
// >
// <thead
// className="thead-light"
// style={{ background: "#ecdddd" }}
// >
// <tr>
// <th className="text-start">Order ID</th>
// <th className="text-start">Customer</th>
// <th className="text-start">Order value</th>
// <th className="text-start">Order At</th>
// <th className="text-start">Status</th>
// <th className="text-start">Actions</th>
// </tr>
// </thead>
// <tbody>
// {!loading && showData.length === 0 && (
// <tr className="text-center">
// <td colSpan="6">
// <h5>No Data Available</h5>
// </td>
// </tr>
// )}
// {loading ? (
// <tr>
// <td className="text-center" colSpan="6">
// Loading...
// </td>
// </tr>
// ) : (
// showData.map((order, i) => {
// return (
// <tr key={i}>
// <td className="text-start">{order?.orderID}</td>
// <td className="text-start">
// {order?.user?.name}
// </td>
// <td className="text-start">
// ₹{order?.total_amount}
// </td>
// <td className="text-start">
// {new Date(order?.paidAt).toLocaleString(
// "en-IN",
// {
// month: "short",
// day: "numeric",
// year: "numeric",
// hour: "2-digit",
// minute: "numeric",
// hour12: true,
// }
// )}
// </td>
// <td className="text-start">
// <span className="badge text-bg-warning text-white">
// {order?.orderStatus}
// </span>
// </td>
// <td className="text-start">
// {/* <Link to={`/orders/${order.orderStatus}/${order._id}`}> */}
// <Link
// to={`/orders/${order.orderStatus}/${order._id}`}
// >
// <button
// style={{ color: "white" }}
// type="button"
// className="
// btn btn-primary btn-sm
// waves-effect waves-light
// btn-table
// ms-2 mt-1
// "
// >
// View
// </button>
// </Link>
// </td>
// </tr>
// );
// })
// )}
// </tbody>
// </table>
// </div>
// <div className="row mt-20">
// <div className="col-sm-12 col-md-6 mb-20">
// <div
// className="dataTables_info"
// id="datatable_info"
// role="status"
// aria-live="polite"
// >
// Showing {currentPage * itemPerPage - itemPerPage + 1} to{" "}
// {Math.min(
// currentPage * itemPerPage,
// processingOrdersData.length
// )}{" "}
// of {processingOrdersData.length} entries
// </div>
// </div>
// <div className="col-sm-12 col-md-6">
// <div className="d-flex">
// <ul className="pagination ms-auto">
// <li
// className={
// currentPage === 1
// ? "paginate_button page-item previous disabled"
// : "paginate_button page-item previous"
// }
// >
// <span
// className="page-link"
// style={{ cursor: "pointer" }}
// onClick={() => setCurrentPage((prev) => prev - 1)}
// >
// Previous
// </span>
// </li>
// {!(currentPage - 1 < 1) && (
// <li className="paginate_button page-item">
// <span
// className="page-link"
// style={{ cursor: "pointer" }}
// onClick={(e) =>
// setCurrentPage((prev) => prev - 1)
// }
// >
// {currentPage - 1}
// </span>
// </li>
// )}
// <li className="paginate_button page-item active">
// <span
// className="page-link"
// style={{ cursor: "pointer" }}
// >
// {currentPage}
// </span>
// </li>
// {!(
// (currentPage + 1) * itemPerPage - itemPerPage >
// processingOrdersData.length - 1
// ) && (
// <li className="paginate_button page-item ">
// <span
// className="page-link"
// style={{ cursor: "pointer" }}
// onClick={() => {
// setCurrentPage((prev) => prev + 1);
// }}
// >
// {currentPage + 1}
// </span>
// </li>
// )}
// <li
// className={
// !(
// (currentPage + 1) * itemPerPage - itemPerPage >
// processingOrdersData.length - 1
// )
// ? "paginate_button page-item next"
// : "paginate_button page-item next disabled"
// }
// >
// <span
// className="page-link"
// style={{ cursor: "pointer" }}
// onClick={() => setCurrentPage((prev) => prev + 1)}
// >
// Next
// </span>
// </li>
// </ul>
// </div>
// </div>
// </div>
// </div>
// </div>
// </div>
// </div>
// </div>
// </div>
// </div>
// );
// }
// export default ProcessingOrders;
import React, { useState, useEffect } from "react";
import React, { useState, useEffect, useRef } from "react";
import {
Box,
Button,
@ -323,36 +21,41 @@ import {
import { useNavigate } from "react-router-dom";
import axios from "axios";
import { isAutheticated } from "src/auth";
import { debounce } from "lodash"; // Import debounce from lodash
const ProcessingOrders = () => {
const [orders, setOrders] = useState([]);
const [loading, setLoading] = useState(true);
const [page, setPage] = useState(0);
const [page, setPage] = useState(0); // 0-based page
const [rowsPerPage, setRowsPerPage] = useState(5);
const [totalOrders, setTotalOrders] = useState(0);
const [searchField, setSearchField] = useState("Order ID");
const [searchText, setSearchText] = useState("");
const navigate = useNavigate();
const token = isAutheticated();
const searchRef = useRef();
const fetchOrdersDebounced = useRef(
debounce((page, limit, searchField, searchText) => {
fetchOrders(page, limit, searchField, searchText);
}, 500)
).current;
// Fetch orders with pagination
const fetchOrders = async (page, limit) => {
const fetchOrders = async (page, limit, searchField = "", searchText = "") => {
setLoading(true);
try {
const response = await axios.get("/api/get-processing-order-admin", {
const response = await axios.get("/api/get-processing-invoice-admin", {
headers: {
Authorization: `Bearer ${token}`,
},
params: {
page: page + 1, // Adjusting for zero-based index in the UI
limit,
searchField,
searchText,
page: page + 1,
[searchField === "Order ID" ? "orderId" : "invoiceId"]: searchText || "",
},
});
// console.log(response);
setOrders(response?.data?.processingOrders);
setTotalOrders(response?.data?.totalOrders);
setOrders(response?.data?.invoices);
setTotalOrders(response?.data?.totalCount);
} catch (error) {
console.error("Error fetching orders:", error);
} finally {
@ -361,11 +64,13 @@ const ProcessingOrders = () => {
};
useEffect(() => {
fetchOrders(page, rowsPerPage);
}, [page, rowsPerPage, searchField, searchText]);
fetchOrdersDebounced(page, rowsPerPage, searchField, searchText);
}, [page, rowsPerPage, searchField, searchText]);
const handleSearchChange = (event) => {
setSearchText(event.target.value);
const value = event.target.value;
setSearchText(value);
searchRef.current = value;
};
const handleSearchFieldChange = (event) => {
@ -373,28 +78,18 @@ const ProcessingOrders = () => {
};
const handleChangePage = (event, newPage) => {
setPage(newPage);
setPage(newPage);
};
const handleChangeRowsPerPage = (event) => {
setRowsPerPage(parseInt(event.target.value, 10));
setPage(0);
setPage(0);
};
const filteredOrders = orders?.filter((order) => {
if (searchField === "Order ID") {
return order.uniqueId.toLowerCase().includes(searchText.toLowerCase());
}
if (searchField === "Status") {
return order.status.toLowerCase().includes(searchText.toLowerCase());
}
return orders;
});
return (
<Box>
<Typography variant="h4" mb={2} textAlign="center">
Processing Order Placed List
Processing Invoice List
</Typography>
<Box display="flex" mb={2} alignItems="center">
<FormControl variant="outlined" sx={{ minWidth: 150, mr: 2 }}>
@ -407,7 +102,7 @@ const ProcessingOrders = () => {
label="Search By"
>
<MenuItem value="Order ID">Order ID</MenuItem>
<MenuItem value="Status">Status</MenuItem>
<MenuItem value="Invoice ID">Invoice ID</MenuItem>
</Select>
</FormControl>
<TextField
@ -423,9 +118,10 @@ const ProcessingOrders = () => {
<TableHead>
<TableRow>
<TableCell>Order ID</TableCell>
<TableCell>Order Date</TableCell>
<TableCell>Invoice ID</TableCell>
<TableCell>Processing Date</TableCell>
<TableCell>Items</TableCell>
<TableCell>Order Value</TableCell>
<TableCell>Invoice Value</TableCell>
<TableCell>Status</TableCell>
<TableCell>Action</TableCell>
</TableRow>
@ -439,23 +135,24 @@ const ProcessingOrders = () => {
</TableCell>
</TableRow>
))
) : filteredOrders.length > 0 ? (
filteredOrders.map((order) => (
<TableRow key={order._id}>
<TableCell>{order.uniqueId}</TableCell>
) : orders.length > 0 ? (
orders.map((invoice) => (
<TableRow key={invoice._id}>
<TableCell>{invoice.orderId.uniqueId}</TableCell>
<TableCell>{invoice.invoiceId}</TableCell>
<TableCell>
{new Date(order.createdAt).toDateString()}
<span>, {formatAMPM(order.createdAt)}</span>
{new Date(invoice.courierstatus_timeline.processing).toDateString()}
<span>, {formatAMPM(invoice.courierstatus_timeline.processing)}</span>
</TableCell>
<TableCell>{order.orderItem.length}</TableCell>
<TableCell>{order.grandTotal.toFixed(2)}</TableCell>
<TableCell>{order.status}</TableCell>
<TableCell>{invoice.items.length}</TableCell>
<TableCell>{invoice.invoiceAmount}</TableCell>
<TableCell>{invoice.courierStatus}</TableCell>
<TableCell>
<Button
variant="contained"
color="primary"
onClick={() =>
navigate(`/orders/${order.status}/${order._id}`)
navigate(`/orders/${invoice.courierStatus}/${invoice._id}`)
}
>
View
@ -466,7 +163,7 @@ const ProcessingOrders = () => {
) : (
<TableRow>
<TableCell colSpan={6} align="center">
<Typography variant="body1">Data not found</Typography>
<Typography variant="body1">No data found</Typography>
</TableCell>
</TableRow>
)}
@ -477,7 +174,7 @@ const ProcessingOrders = () => {
component="div"
count={totalOrders}
rowsPerPage={rowsPerPage}
page={page}
page={page}
onPageChange={handleChangePage}
onRowsPerPageChange={handleChangeRowsPerPage}
/>
@ -488,14 +185,12 @@ const ProcessingOrders = () => {
// Helper function to format time as AM/PM
const formatAMPM = (date) => {
var hours = new Date(date).getHours();
var minutes = new Date(date).getMinutes();
var ampm = hours >= 12 ? "PM" : "AM";
hours = hours % 12;
hours = hours ? hours : 12;
minutes = minutes < 10 ? "0" + minutes : minutes;
var strTime = hours + ":" + minutes + " " + ampm;
return strTime;
const hours = new Date(date).getHours();
const minutes = new Date(date).getMinutes();
const ampm = hours >= 12 ? "PM" : "AM";
const formattedHours = hours % 12 || 12;
const formattedMinutes = minutes < 10 ? "0" + minutes : minutes;
return `${formattedHours}:${formattedMinutes} ${ampm}`;
};
export default ProcessingOrders;