added employee section

This commit is contained in:
roshangarg 2024-05-03 10:34:47 +05:30
parent a5aa3ce47b
commit 0581cf77fe
14 changed files with 1170 additions and 954 deletions

View File

@ -50,6 +50,7 @@
"draft-js": "^0.11.7",
"draft-js-export-html": "^1.4.1",
"draft-js-import-html": "^1.4.1",
"file-saver": "^2.0.5",
"md5": "^2.3.0",
"moment": "^2.30.1",
"prop-types": "^15.7.2",
@ -76,7 +77,8 @@
"styled-components": "^6.0.8",
"sweetalert": "^2.1.2",
"sweetalert2": "^11.4.0",
"uuid": "^9.0.1"
"uuid": "^9.0.1",
"xlsx": "^0.18.5"
},
"devDependencies": {
"auto-changelog": "~2.3.0",

View File

@ -323,7 +323,7 @@ const _nav = [
// Employee
{
component: CNavItem,
name: "Employee",
name: " Employees & Access",
icon: <CIcon icon={cilImage} customClassName="nav-icon" />,
to: "/employee",
},

View File

@ -1,16 +1,17 @@
import React, { Suspense } from 'react'
import { Navigate, Route, Routes } from 'react-router-dom'
import { CContainer, CSpinner } from '@coreui/react'
import React, { Suspense, useState } from "react";
import { Navigate, Route, Routes } from "react-router-dom";
import { CContainer, CSpinner } from "@coreui/react";
// routes config
import routes from '../routes'
import routes from "../routes";
const AppContent = () => {
const [appRoutes, setAppRoutes] = useState(routes);
return (
<CContainer lg>
<Suspense fallback={<CSpinner color="primary" />}>
<Routes>
{routes.map((route, idx) => {
{appRoutes.map((route, idx) => {
return (
route.element && (
<Route
@ -21,15 +22,13 @@ const AppContent = () => {
element={<route.element />}
/>
)
)
);
})}
<Route path="/" element={<Navigate to="dashboard" replace />} />
</Routes>
</Suspense>
</CContainer>
)
}
);
};
export default React.memo(AppContent)
export default React.memo(AppContent);

View File

@ -27,12 +27,61 @@ const AppSidebar = () => {
const dispatch = useDispatch();
const unfoldable = useSelector((state) => state.sidebarUnfoldable);
const sidebarShow = useSelector((state) => state.sidebarShow);
const [navigationItem, setNavigationItem] = useState(navigation);
const [userdata, setUserData] = useState(null);
const token = isAutheticated();
console.log("userDatt", userdata);
useEffect(() => {
const getUser = async () => {
let existanceData = localStorage.getItem("authToken");
if (!existanceData) {
// console.log(existanceData.userData)
setUserData(false);
} else {
try {
// console.log('requesting user data from server')
let response = await axios.get(`/api/v1/user/details`, {
headers: {
Authorization: `Bearer ${token}`,
},
});
// console.log(response.data)
const data = response.data;
if (
(data.success && data.user.role === "admin") ||
data.user.role === "Employee"
) {
setUserData(data.user);
} else {
setUserData(false);
}
} catch (err) {
setUserData(false);
console.log(err);
}
}
};
getUser();
}, []);
useEffect(() => {
if (userdata && userdata.accessTo) {
const filteredNavigation = navigation.filter((item) => {
if (userdata.accessTo[item.name]) {
return true;
}
return false;
});
setNavigationItem(filteredNavigation);
} else {
setNavigationItem(navigation);
}
}, [userdata]);
///----------------------//
const [loading, setLoading] = useState(false);
const token = isAutheticated();
// urlcreated images
const [AppName, setAppName] = useState("");
const [HeaderlogoUrl, setHeaderlogoUrl] = useState("");
@ -87,7 +136,7 @@ const AppSidebar = () => {
</CSidebarBrand>
<CSidebarNav>
<SimpleBar>
<AppSidebarNav items={navigation} />
<AppSidebarNav items={navigationItem} />
</SimpleBar>
</CSidebarNav>
<CSidebarToggler

View File

@ -14,8 +14,8 @@ import { cibGmail } from "@coreui/icons";
import { createRoot } from "react-dom/client";
const setupAxios = () => {
// axios.defaults.baseURL = "http://localhost:5000";
axios.defaults.baseURL = "https://api.smellika.com";
axios.defaults.baseURL = "http://localhost:5000";
// axios.defaults.baseURL = "https://api.smellika.com";
axios.defaults.headers = {
"Cache-Control": "no-cache,no-store",

View File

@ -146,6 +146,7 @@ import RegistrationEmail from "./views/CustomerSupport/EmailCMS/RegistrationEmai
import Employee from "./views/EmployeeAccess/Employee";
import AddEmployee from "./views/EmployeeAccess/addEmployee";
import EditEmployee from "./views/EmployeeAccess/editEmployee";
import ExportToExcel from "./views/exportExcel";
const routes = [
{ path: "/", exact: true, name: "Home" },
{
@ -187,17 +188,17 @@ const routes = [
{
path: "/customers-details",
name: "User Table",
name: "Customers",
element: CustomerTable,
},
{
path: "/customers-details/:_id",
name: "User Table",
name: "Customers",
element: SingleUserAllDetails,
},
{
path: "/add-customer",
name: "User Table",
name: "Customers",
element: AddCustomer,
},
// {
@ -212,7 +213,7 @@ const routes = [
// },
{
path: "/users-address/view",
name: "view address",
name: "Customers",
element: viewDetails,
},
@ -275,12 +276,12 @@ const routes = [
{
path: "/contact/request",
name: "Contact Requests",
name: "Customer Service",
element: ContactRequests,
},
{
path: "/contact/request/new",
name: "AddContact Request",
name: "Customer Service",
element: AddContactRequest,
},
//Support Requests
@ -297,54 +298,54 @@ const routes = [
{
path: "/support/request",
name: "CustomerSupport Requests",
name: "Customer Service",
element: SupportRequest,
},
{
path: "/support/request/closed",
name: "Closed CustomerSupport Requests",
name: "Customer Service",
element: SupportRequestClosed,
},
{
path: "/support/request/closed/:ticketID",
name: "Closed CustomerSupport Request view",
name: "Customer Service",
element: CloseRequestView,
},
{
path: "/support/request/reply/:ticketID",
name: "CustomerSupport Reply",
name: "Customer Service",
element: SupportReply,
},
// Content ---- >
{
path: "/content",
name: "Content",
name: "Website Relatedt",
element: Content,
},
{
path: "/content/terms-and-conditions",
name: "Content",
name: "Website Related",
element: EditTermsConditions,
},
{
path: "/content/privacy-policy",
name: "Content",
name: "Website Related",
element: EditPrivacyPolicy,
},
{
path: "/content/shipping-policy",
name: "Content",
name: "Website Related",
element: EditShippingPolicy,
},
{
path: "/content/refund-policy",
name: "Content",
name: "Website Related",
element: EditRefundpolicy,
},
{
path: "/content/about-us",
name: "Content",
name: "Website Related",
element: EditAboutUs,
},
@ -459,9 +460,21 @@ const routes = [
element: ReturnedOrders,
},
//Point of sale orders
{ path: "/inStoreCashOrders/new", name: "In Store Cash Orders", element:InStoreCashOrders },
{ path: "/InStoreQRCodeOrders/new", name: "In Store QR Code Orders", element:InStoreQRCodeOrders },
{ path: "/inStoreOrders/:status/:id", name: "View In Store Cash Orders", element: POSViewOrders },
{
path: "/inStoreCashOrders/new",
name: "In Store Cash Orders",
element: InStoreCashOrders,
},
{
path: "/InStoreQRCodeOrders/new",
name: "In Store QR Code Orders",
element: InStoreQRCodeOrders,
},
{
path: "/inStoreOrders/:status/:id",
name: "View In Store Cash Orders",
element: POSViewOrders,
},
// { path: "/order/:status/:id", name: "View Order", element: ViewOdr },
//dashboard
@ -639,6 +652,13 @@ const routes = [
name: "Point of Sale",
element: Pos,
},
// Export to excel
{
path: "/exp",
name: "Point of Sale",
element: ExportToExcel,
},
];
export default routes;

View File

@ -25,26 +25,35 @@ const Employee = () => {
const [loading, setLoading] = useState(true);
const [loading1, setLoading1] = useState(true);
const [success, setSuccess] = useState(true);
const [users, setUsers] = useState([]);
const [employee, setemployee] = useState([]);
const [currentPage, setCurrentPage] = useState(1);
const [itemPerPage, setItemPerPage] = useState(10);
const [showData, setShowData] = useState(users);
const [showData, setShowData] = useState(employee);
const handleShowEntries = (e) => {
setCurrentPage(1);
setItemPerPage(e.target.value);
};
useEffect(() => {
const loadData = () => {
const indexOfLastPost = currentPage * itemPerPage;
const indexOfFirstPost = indexOfLastPost - itemPerPage;
setShowData(employee.slice(indexOfFirstPost, indexOfLastPost));
};
loadData();
}, [currentPage, itemPerPage, employee]);
console.log(employee);
// const getUsers = async () => {
// const getemployee = async () => {
// axios
// .get(`/api/v1/admin/users`, {
// .get(`/api/v1/admin/employee`, {
// headers: {
// Authorization: `Bearer ${token}`,
// },
// })
// .then((res) => {
// setUsers(res.data.users);
// setemployee(res.data.employee);
// setLoading(false);
// })
// .catch((error) => {
@ -60,19 +69,19 @@ const Employee = () => {
// };
// useEffect(() => {
// getUsers();
// getemployee();
// }, [success]);
// console.log(users);
// console.log(employee);
// useEffect(() => {
// const loadData = () => {
// const indexOfLastPost = currentPage * itemPerPage;
// const indexOfFirstPost = indexOfLastPost - itemPerPage;
// setShowData(users.slice(indexOfFirstPost, indexOfLastPost));
// setShowData(employee.slice(indexOfFirstPost, indexOfLastPost));
// };
// loadData();
// }, [currentPage, itemPerPage, users]);
// console.log(users);
// }, [currentPage, itemPerPage, employee]);
// console.log(employee);
// const handleDelete = (id) => {
// swal({
@ -113,6 +122,70 @@ const Employee = () => {
// });
// };
// get All employee
const getemployee = async () => {
axios
.get(`/api/v1/admin/employee`, {
headers: {
Authorization: `Bearer ${token}`,
},
})
.then((res) => {
setemployee(res.data.employee);
setLoading(false);
})
.catch((error) => {
swal({
title: error,
text: "please login to access the resource or refresh the page ",
icon: "error",
button: "Retry",
dangerMode: true,
});
setLoading(false);
});
};
useEffect(() => {
getemployee();
}, [success]);
console.log(employee);
console.log("showdata", showData);
// const trueEntries = Object.entries(showData.).filter(
// ([key, value]) => value === true
// );
const renderAccessTo = (accessTo) => {
return Object.entries(accessTo)
.filter(([key, value]) => value === true)
.map(([key, value]) => key)
.join(", ");
};
const handleDelete = async (id) => {
try {
// Send a DELETE request to your API to delete the employee by ID
const res = await axios.delete(`/api/v1/admin/delete-employee/${id}`, {
headers: {
Authorization: `Bearer ${token}`,
},
});
// If deletion is successful, update the employee list
swal({
title: "Congratulations!!",
text: res?.data?.message,
icon: "success",
buttons: "OK",
});
setemployee(employee.filter((employee) => employee._id !== id));
} catch (error) {
console.error("Error deleting employee:", error);
swal({
title: "",
text: "Something went wrong!",
icon: "error",
button: "Retry",
dangerMode: true,
});
}
};
return (
<div className="main-content">
<div className="page-content">
@ -207,134 +280,30 @@ const Employee = () => {
</td>
</tr>
)}
{!loading ? (
{loading ? (
<tr>
<td className="text-center" colSpan="6">
Loading...
</td>
</tr>
) : (
// showData.map((user, i) => {
// return (
// <tr key={i}>
// <td className="text-start">{user.name}</td>
// <td>{user._id}</td>
showData.map((employee, i) => {
return (
<tr key={i}>
<td className="text-start">{employee.name}</td>
<td>{employee.email}</td>
// <td className="text-start">
// {new Date(user.createdAt).toLocaleString(
// "en-IN",
// {
// weekday: "short",
// month: "short",
// day: "numeric",
// year: "numeric",
// hour: "numeric",
// minute: "numeric",
// hour12: true,
// }
// )}
// </td>
// {loading1 && (
// <>
// <td className="text-start">loading...</td>
// <td className="text-start">loading...</td>
// </>
// )}
<td
style={{ maxWidth: "200px" }}
className="text-start"
>
{renderAccessTo(employee.accessTo)}
</td>
// <OrderDetails
// _id={user?._id}
// setLoading1={setLoading1}
// />
// <td className="text-start">
// {/* <Link
// to={`/users-address/view/${userAddress._id}`}
// >
// <button
// style={{
// color: "white",
// marginRight: "1rem",
// }}
// type="button"
// className="
// btn btn-primary btn-sm
// waves-effect waves-light
// btn-table
// mx-1
// mt-1
// "
// >
// View
// </button>
// </Link>
// <Link
// to={`/users-address/edit/${userAddress._id}`}
// >
// <button
// style={{
// color: "white",
// marginRight: "1rem",
// }}
// type="button"
// className="
// btn btn-info btn-sm
// waves-effect waves-light
// btn-table
// mt-1
// mx-1
// "
// >
// Edit
// </button>
// </Link>
// <Link
// to={"#"}
// style={{
// marginRight: "1rem",
// }}
// >
// <button
// style={{ color: "white" }}
// type="button"
// className="
// btn btn-danger btn-sm
// waves-effect waves-light
// btn-table
// mt-1
// mx-1
// "
// onClick={() => {
// handleDelete(userAddress._id);
// }}
// >
// Delete
// </button>
// </Link> */}
// <Link to={`/customers-details/${user?._id}`}>
// <button
// type="button"
// className="mt-1 btn btn-info btn-sm waves-effect waves-light btn-table ml-2"
// >
// View
// </button>
// </Link>
// </td>
// </tr>
// );
// })
<tr>
<th>Roshan Garg</th>
<th>roshan@gmail.com</th>
{/* <th>Profile Image</th> */}
<th>dashboard</th>
{/* <th>Last Purchase</th>
<th>Orders</th> */}
<th>
<button
onClick={() =>
navigate("/edit-employee/44234234")
navigate(`/edit-employee/${employee._id}`)
}
style={{
color: "white",
@ -356,6 +325,7 @@ const Employee = () => {
color: "white",
marginRight: "1rem",
}}
onClick={() => handleDelete(employee._id)}
type="button"
className="
btn btn-primary btn-sm
@ -369,6 +339,8 @@ const Employee = () => {
</button>
</th>
</tr>
);
})
)}
</tbody>
</table>
@ -383,8 +355,8 @@ const Employee = () => {
aria-live="polite"
>
Showing {currentPage * itemPerPage - itemPerPage + 1} to{" "}
{Math.min(currentPage * itemPerPage, users.length)} of{" "}
{users.length} entries
{Math.min(currentPage * itemPerPage, employee.length)}{" "}
of {employee.length} entries
</div>
</div>
@ -432,7 +404,7 @@ const Employee = () => {
{!(
(currentPage + 1) * itemPerPage - itemPerPage >
users.length - 1
employee.length - 1
) && (
<li className="paginate_button page-item ">
<span
@ -451,7 +423,7 @@ const Employee = () => {
className={
!(
(currentPage + 1) * itemPerPage - itemPerPage >
users.length - 1
employee.length - 1
)
? "paginate_button page-item next"
: "paginate_button page-item next disabled"

View File

@ -5,32 +5,109 @@ import FormControlLabel from "@mui/material/FormControlLabel";
import Checkbox from "@mui/material/Checkbox";
import { useNavigate } from "react-router-dom";
import _nav from "src/_nav";
import toast from "react-hot-toast";
import axios from "axios";
const AddEmployee = () => {
const [employeeName, setEmployeeName] = useState("");
const [phone, setPhone] = useState("");
const [email, setEmail] = useState("");
const navigate = useNavigate();
const [checkedItems, setCheckedItems] = useState({});
const filteredNav = _nav.filter((item) => item.name !== "Employee");
const [checkedItems, setCheckedItems] = useState(
filteredNav.reduce((acc, item) => {
acc[item.name] = false;
return acc;
}, {})
);
// const filteredEntries = Object.fromEntries(
// Object.entries(checkedItems).filter(([key, value]) => value === true)
// );
// console.log(filteredEntries);
const handleCheckboxChange = (name) => (event) => {
setCheckedItems({
...checkedItems,
[name]: event.target.checked,
});
};
console.log(checkedItems);
const generatePassword = (name, email) => {
const combinedStr = (name + email).toLowerCase(); // Convert to lowercase for consistency
const specialChars = "@#*!$%^&"; // Define the set of special characters
const alphaChars = combinedStr.match(/[a-zA-Z]/g); // Filter out alphabetic characters
const digitChars = combinedStr.match(/\d/g); // Filter out digits
const filteredChars = combinedStr.match(/[^\W_]/g); // Filter out non-alphanumeric characters
let passwordChars = alphaChars.concat(filteredChars); // Combine alphabetic and filtered characters
// Ensure at least one uppercase letter
if (!passwordChars.some((char) => char === char.toUpperCase())) {
const uppercaseChar = String.fromCharCode(
65 + Math.floor(Math.random() * 26)
);
passwordChars.push(uppercaseChar);
}
// Ensure at least one digit
if (!digitChars || digitChars.length === 0) {
const digitChar = Math.floor(Math.random() * 10).toString();
passwordChars.push(digitChar);
}
// Insert a random special character at a random position in the password characters array
const specialChar = specialChars.charAt(
Math.floor(Math.random() * specialChars.length)
);
const randomIndex = Math.floor(Math.random() * (passwordChars.length + 1));
passwordChars.splice(randomIndex, 0, specialChar);
passwordChars = passwordChars.sort(() => Math.random() - 0.5); // Shuffle the characters
// passwordString.charAt(0).toUpperCase() + passwordString.slice(1) + "@";
const normalpassword = passwordChars.join("").slice(0, 8); // Take the first 8 characters
const passwordWithspecialChar =
normalpassword.charAt(0).toUpperCase() + normalpassword.slice(1) + "1@2";
return passwordWithspecialChar;
};
const handleFormSubmit = async (e) => {
e.preventDefault();
console.log("request made");
try {
if (!employeeName || !email || !phone) {
throw new Error("Fill all fields!");
}
// Generate password based on name and email
const generatedPassword = generatePassword(employeeName, email);
console.log(generatedPassword); // Use generatedPassword instead of generatePassword
// Set generated password to user state
const response = await axios.post("/api/v1/user/register", {
// Send user details
name: employeeName,
email: email,
phone: phone,
role: "Employee",
accessTo: checkedItems,
password: generatedPassword, // Send generated password to the backend
});
console.log(response);
if (response.status === 201) {
toast.success("Employee Added Successful");
// setUserId(response.data.userId);
navigate("/employee");
}
} catch (error) {
console.log(error?.response);
// toast.error(error?.response);
}
};
return (
<div>
<Box style={{ background: "#FFFFFF", color: "black", padding: "1rem" }}>
{/* <TextField
type="text"
value={title}
onChange={(e) => setTitle(e.target.value)}
variant="outlined"
size="small"
fullWidth
/> */}
<Typography
style={{ margin: "0.5rem 0rem", fontWeight: "bold" }}
variant="h6"
@ -53,6 +130,20 @@ const AddEmployee = () => {
onChange={(e) => setEmployeeName(e.target.value)}
/>
</div>
<div className="mb-3">
<label htmlFor="title" className="form-label">
Phone Number
</label>
<input
type="text"
className="form-control"
id="title"
placeholder="Eg: 8516913819"
value={phone}
onChange={(e) => setPhone(e.target.value)}
/>
</div>
<div className="mb-3">
<label htmlFor="welcomeMsgforDes" className="form-label">
@ -62,9 +153,8 @@ const AddEmployee = () => {
<input
type="email"
className="form-control"
// style={{ width: "300px" }}
id="welcomeMsgforDes"
placeholder="Eg: rosham@gmailcom "
placeholder="Eg: roshan@gmailcom "
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
@ -90,7 +180,7 @@ const AddEmployee = () => {
<Button
variant="contained"
color="primary"
// onClick={handleSaveClick}
onClick={handleFormSubmit}
style={{
fontWeight: "bold",
marginBottom: "1rem",
@ -103,7 +193,6 @@ const AddEmployee = () => {
<Button
variant="contained"
color="primary"
// onClick={handleCancelClick}
onClick={() => navigate("/employee")}
style={{
fontWeight: "bold",

View File

@ -1,76 +1,107 @@
import React, { useState, useEffect } from "react";
import axios from "axios";
import { useNavigate, useParams } from "react-router-dom";
import { Box, Button, Typography } from "@mui/material";
import React, { useState } from "react";
import FormGroup from "@mui/material/FormGroup";
import FormControlLabel from "@mui/material/FormControlLabel";
import Checkbox from "@mui/material/Checkbox";
import { useNavigate } from "react-router-dom";
import _nav from "src/_nav";
import { isAutheticated } from "src/auth";
const EditEmployee = () => {
const [employeeName, setEmployeeName] = useState("");
// const [email, setEmail] = useState("");
const { id } = useParams();
const token = isAutheticated();
const navigate = useNavigate();
const [employeeName, setEmployeeName] = useState("");
const [phone, setPhone] = useState("");
const [checkedItems, setCheckedItems] = useState({});
const filteredNav = _nav.filter((item) => item.name !== "Employee");
const handleCheckboxChange = (name) => (event) => {
setCheckedItems({
...checkedItems,
[name]: event.target.checked,
});
};
console.log(checkedItems);
useEffect(() => {
const getSingleEmployee = async () => {
try {
const response = await axios.get(`/api/v1/admin/user/${id}`, {
headers: {
Authorization: `Bearer ${token}`,
},
});
const { name, phone, accessTo } = response.data.user;
setEmployeeName(name);
setPhone(phone);
setCheckedItems(accessTo);
} catch (error) {
console.error("Error fetching employee:", error);
}
};
getSingleEmployee();
}, [id, token]);
const handleUpdateEmployee = async () => {
try {
await axios.put(
`/api/v1/admin/update-employee/${id}`,
{
name: employeeName,
phone: phone,
accessTo: checkedItems,
},
{
headers: {
Authorization: `Bearer ${token}`,
},
}
);
navigate("/employee");
} catch (error) {
console.error("Error updating employee:", error);
}
};
return (
<div>
<Box style={{ background: "#FFFFFF", color: "black", padding: "1rem" }}>
{/* <TextField
type="text"
value={title}
onChange={(e) => setTitle(e.target.value)}
variant="outlined"
size="small"
fullWidth
/> */}
<Typography
style={{ margin: "0.5rem 0rem", fontWeight: "bold" }}
variant="h6"
>
{" "}
Add Employee:{" "}
Update Employee
</Typography>
<div className="mb-3">
<label htmlFor="title" className="form-label">
Employee Name*
</label>
<input
type="text"
className="form-control"
id="title"
placeholder="Eg: Roshan Garg"
placeholder="Enter employee name"
value={employeeName}
onChange={(e) => setEmployeeName(e.target.value)}
/>
</div>
{/* <div className="mb-3">
<label htmlFor="welcomeMsgforDes" className="form-label">
Email*
<div className="mb-3">
<label htmlFor="phone" className="form-label">
Phone Number
</label>
<input
type="email"
type="text"
className="form-control"
// style={{ width: "300px" }}
id="welcomeMsgforDes"
placeholder="Eg: rosham@gmailcom "
value={email}
onChange={(e) => setEmail(e.target.value)}
placeholder="Enter phone number"
value={phone}
onChange={(e) => setPhone(e.target.value)}
/>
</div> */}
</div>
<Box>
<label htmlFor="welcomeMsgforDes" className="form-label">
<label htmlFor="accessTo" className="form-label">
Access to*
</label>
<div>
@ -86,11 +117,12 @@ const EditEmployee = () => {
))}
</div>
</Box>
<div style={{ display: "flex" }}>
<Button
variant="contained"
color="primary"
// onClick={handleSaveClick}
onClick={handleUpdateEmployee}
style={{
fontWeight: "bold",
marginBottom: "1rem",
@ -103,7 +135,6 @@ const EditEmployee = () => {
<Button
variant="contained"
color="primary"
// onClick={handleCancelClick}
onClick={() => navigate("/employee")}
style={{
fontWeight: "bold",

View File

@ -33,7 +33,7 @@ const Dashboard = () => {
//3rd
const [product, setProduct] = useState([]);
const getAllProduct = async () => {
let res = await axios.get(`/api/product/getAll/`, {
let res = await axios.get(`/api/product/getAll/admin`, {
headers: {
Authorization: `Bearer ${token}`,
},

73
src/views/exportExcel.js Normal file
View File

@ -0,0 +1,73 @@
import React, { useEffect, useState } from "react";
import * as XLSX from "xlsx";
import { saveAs } from "file-saver";
import { isAutheticated } from "src/auth";
import axios from "axios";
function ExportToExcel() {
const token = isAutheticated();
const [newOrdersData, setNewOrdersData] = useState([]);
const data = [
{ name: "John", email: "john@example.com", age: 28 },
{ name: "Jane", email: "jane@example.com", age: 32 },
// ... more data
];
useEffect(() => {
function getNewOrder() {
axios
.get(`/api/order/getAll/new`, {
headers: {
"Access-Control-Allow-Origin": "*",
Authorization: `Bearer ${token}`,
},
})
.then((res) => {
console.log(res);
const filteredOrders = res.data.order.filter(
(order) => order.orderType === "WebSite"
);
setNewOrdersData(filteredOrders);
// setLoading(false);
})
.catch((err) => {
console.log(err);
// setLoading(false);
});
}
getNewOrder();
}, []);
const exportToExcel = () => {
const flattenedData = newOrdersData.map((order) => ({
...order,
// Flatten shippingInfo object
shippingInfo: JSON.stringify(order.shippingInfo),
// Concatenate item names into a single string
items: order.items.map((item) => item.name).join(", "),
}));
const worksheet = XLSX.utils.json_to_sheet(flattenedData);
const workbook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1");
const excelBuffer = XLSX.write(workbook, {
bookType: "xlsx",
type: "array",
});
const blob = new Blob([excelBuffer], {
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8",
});
saveAs(blob, "exportedData.xlsx");
};
return (
<div className="App">
<button onClick={exportToExcel}>Export as Excel</button>
</div>
);
}
export default ExportToExcel;

File diff suppressed because it is too large Load Diff

View File

@ -93,7 +93,7 @@ function EditOrder() {
function getProductDetails() {
setLoading(true);
axios
.get(`/api/product/getAll/`, {
.get(`/api/product/getAll/admin`, {
headers: {
"Access-Control-Allow-Origin": "*",
Authorization: `Bearer ${token}`,

View File

@ -100,8 +100,10 @@ const Login = () => {
setLoading({ loading: true });
try {
const res = await axios.post("/api/v1/user/login/", auth);
console.log(res);
if (res.data.success == true) {
localStorage.setItem("authToken", res.data.token);
let response = await axios.get(`/api/v1/user/details`, {
headers: {
Authorization: `Bearer ${res.data.token}`,
@ -109,7 +111,7 @@ const Login = () => {
});
// console.log(response.data)
const data = response.data;
if (data.user.role === "admin") {
if (data.user.role === "admin" || data.user.role === "Employee") {
history("/dashboard");
setLoading(false);
window.location.reload();