diff --git a/src/_nav.js b/src/_nav.js
index db26ed3..47c9e9f 100644
--- a/src/_nav.js
+++ b/src/_nav.js
@@ -118,13 +118,13 @@ const _nav = [
to: "/leaves/today",
group: "Leaves",
},
- // {
- // component: CNavItem,
- // name: "Tasks",
- // icon: ,
- // to: "/task/today",
- // group: "Tasks",
- // },
+ {
+ component: CNavItem,
+ name: "Tasks",
+ icon: ,
+ to: "/tasks",
+ group: "Tasks",
+ },
{
component: CNavItem,
name: "Inventory Data",
diff --git a/src/routes.js b/src/routes.js
index cb47271..8d719c4 100644
--- a/src/routes.js
+++ b/src/routes.js
@@ -171,6 +171,10 @@ import OpeningInventoryReports from "./views/Reports/OpeningInventoryReports";
import StockReports from "./views/Reports/StockReports ";
import Transporter from "./views/Transporter/Transporter";
import EditRetailDistributor from "./views/RetailDistributors/EditRetailDistributor";
+import TaskSalesCoordinator from "./views/Tasks/TaskSalesCoordinator";
+import TaskTerritoryManager from "./views/Tasks/TaskTerritoryManager";
+import SingleUserTask from "./views/Tasks/SingleUserTask";
+import Tasks from "./views/Tasks/Task";
const routes = [
//dashboard
@@ -374,12 +378,36 @@ const routes = [
navName: "Leaves",
},
//Tasks
+ {
+ path: "/tasks",
+ name: "Tasks",
+ element: Tasks,
+ navName: "Tasks",
+ },
{
path: "/task/today",
name: "Today's Tasks",
element: TodayTask,
navName: "Tasks",
},
+ {
+ path: "/salescoordinator/task",
+ name: "Tasks SalesCoOrdinator",
+ element: TaskSalesCoordinator,
+ navName: "Tasks",
+ },
+ {
+ path: "/territorymanager/task",
+ name: "Tasks TerritoryManager",
+ element: TaskTerritoryManager,
+ navName: "Tasks",
+ },
+ {
+ path: "/task/view/:id",
+ name: "Single Task",
+ element: SingleUserTask,
+ navName: "Tasks",
+ },
// RetailDistributor
{
path: "/retail-distributor",
diff --git a/src/views/PrincipalDistributors/principalDistributor.js b/src/views/PrincipalDistributors/principalDistributor.js
index dfa0313..07808ad 100644
--- a/src/views/PrincipalDistributors/principalDistributor.js
+++ b/src/views/PrincipalDistributors/principalDistributor.js
@@ -7,6 +7,8 @@ import { isAutheticated } from "src/auth";
import swal from "sweetalert";
import OrderDetails from "./orderDetails";
import debounce from "lodash.debounce";
+import { toast } from "react-hot-toast";
+
const principalDistributor = () => {
const token = isAutheticated();
const navigate = useNavigate();
@@ -106,7 +108,56 @@ const principalDistributor = () => {
// }
// });
// };
+ const handleDownloadReport = async () => {
+ try {
+ const response = await axios.get(
+ `/api/v1/principaldistributor/download-report`,
+ {
+ headers: {
+ Authorization: `Bearer ${token}`,
+ },
+ responseType: "arraybuffer",
+ }
+ );
+ // Check if the request was successful
+ if (response.status === 200) {
+ // Convert response data into a Blob for download
+ const url = window.URL.createObjectURL(
+ new Blob([response.data], {
+ type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+ })
+ );
+
+ // Create a temporary download link and trigger the download
+ const link = document.createElement("a");
+ link.href = url;
+ link.download = "Principal_Distributor_Report.xlsx";
+ document.body.appendChild(link);
+ link.click();
+
+ // Cleanup
+ document.body.removeChild(link);
+ window.URL.revokeObjectURL(url); // Release Blob URL memory
+
+ // Show success message
+ toast.success("Report downloaded successfully!");
+ } else {
+ // If the response status is not 200, display an error message
+ throw new Error("Failed to download report");
+ }
+ } catch (err) {
+ // Display a user-friendly error message
+ const msg = err?.response?.data?.message || "Something went wrong!";
+ swal({
+ title: "Error",
+ text: msg,
+ icon: "error",
+ button: "Retry",
+ dangerMode: true,
+ });
+ }
+ };
return (
@@ -158,7 +209,7 @@ const principalDistributor = () => {
-
+
-
+
{
disabled={loading}
/>
-
+
{
disabled={loading}
/>
+
+
+
{
-
- {/* */}
+ {/*
*/}
-
- |
))
diff --git a/src/views/Products/Products.js b/src/views/Products/Products.js
index ba48fad..8e9beb0 100644
--- a/src/views/Products/Products.js
+++ b/src/views/Products/Products.js
@@ -237,7 +237,7 @@ const Products = () => {
-
+
-
-
+
{
-
+
-
+
{
disabled={loading}
/>
-
+
-
+
-
-
+
{
-
+
-
+
{
disabled={loading}
/>
-
+
-
+
-
-
+
{
const token = isAutheticated();
@@ -68,6 +69,56 @@ const RetailDistributor = () => {
const handleSearchChange = () => {
debouncedSearch();
};
+ const handleDownloadReport = async () => {
+ try {
+ const response = await axios.get(
+ `/api/retaildistributor/download-report`,
+ {
+ headers: {
+ Authorization: `Bearer ${token}`,
+ },
+ responseType: "arraybuffer",
+ }
+ );
+ // console.log(response);
+ // Check if the request was successful
+ if (response.status === 200) {
+ // Convert response data into a Blob for download
+ const url = window.URL.createObjectURL(
+ new Blob([response.data], {
+ type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+ })
+ );
+
+ // Create a temporary download link and trigger the download
+ const link = document.createElement("a");
+ link.href = url;
+ link.download = "RetailerReport.xlsx";
+ document.body.appendChild(link);
+ link.click();
+
+ // Cleanup
+ document.body.removeChild(link);
+ window.URL.revokeObjectURL(url); // Release Blob URL memory
+
+ // Show success message
+ toast.success("Report downloaded successfully!");
+ } else {
+ // If the response status is not 200, display an error message
+ throw new Error("Failed to download report");
+ }
+ } catch (err) {
+ // Display a user-friendly error message
+ const msg = err?.response?.data?.message || "Something went wrong!";
+ swal({
+ title: "Error",
+ text: msg,
+ icon: "error",
+ button: "Retry",
+ dangerMode: true,
+ });
+ }
+ };
return (
@@ -112,7 +163,7 @@ const RetailDistributor = () => {
-
+
-
+
{
disabled={loading}
/>
-
+
{
ref={principalDistributorRef}
/>
+
+
+ Download Report
+
+
-
+
{
ID |
Trade Name |
Created On |
- Principal Distributor |
+
+ Principal Distributor
+ |
Territory Manager |
Sales Coordinator |
Orders |
@@ -253,55 +318,54 @@ const RetailDistributor = () => {
-
-
+
- View
-
-
-
-
+ View
+
+
+
- Stock
-
-
-
-
+ Stock
+
+
+
+
+ {/* On large screens: OI and Edit buttons in one row */}
+
+
- OI
-
-
-
-
+ OI
+
+
+
- Edit
-
-
+
+ Edit
+
+
+
|
))
diff --git a/src/views/SalesCoOrdinators/SalesCoOrdinator.js b/src/views/SalesCoOrdinators/SalesCoOrdinator.js
index 81a4e39..7bd91df 100644
--- a/src/views/SalesCoOrdinators/SalesCoOrdinator.js
+++ b/src/views/SalesCoOrdinators/SalesCoOrdinator.js
@@ -154,7 +154,7 @@ const SalesCoOrdinator = () => {
-
+
-
-
+
{
Unique Id |
Name |
Mobile No. |
- Email |
+ Email |
Verify |
Register On |
-
+ |
Mapping
|
-
+ |
Action
|
@@ -289,7 +289,7 @@ const SalesCoOrdinator = () => {
// hour12: true,
})}
-
+ |
@@ -305,13 +305,13 @@ const SalesCoOrdinator = () => {
>
Retailer
|
-
+ |
@@ -326,7 +326,7 @@ const SalesCoOrdinator = () => {
handleDelete(salescoordinator._id)
}
diff --git a/src/views/Tasks/SingleUserTask.js b/src/views/Tasks/SingleUserTask.js
index a4fce93..c30a1e7 100644
--- a/src/views/Tasks/SingleUserTask.js
+++ b/src/views/Tasks/SingleUserTask.js
@@ -5,7 +5,7 @@ import Button from "@material-ui/core/Button";
import { isAutheticated } from "src/auth";
import swal from "sweetalert";
-const SingleUserleave = () => {
+const SingleUserTask = () => {
const { id } = useParams();
const token = isAutheticated();
const navigate = useNavigate();
@@ -74,7 +74,7 @@ const [userType, setUserType] = useState("");
textTransform: "capitalize",
}}
onClick={() => {
- navigate("/leaves/today", {
+ navigate("/task/today", {
replace: true,
});
}}
@@ -253,4 +253,4 @@ const [userType, setUserType] = useState("");
);
};
-export default SingleUserleave;
+export default SingleUserTask;
diff --git a/src/views/Tasks/Task.js b/src/views/Tasks/Task.js
new file mode 100644
index 0000000..0c59642
--- /dev/null
+++ b/src/views/Tasks/Task.js
@@ -0,0 +1,440 @@
+import React, { useState, useEffect, useRef, useCallback } from "react";
+import { Link } from "react-router-dom";
+import axios from "axios";
+import { isAutheticated } from "src/auth";
+import swal from "sweetalert";
+import debounce from "lodash.debounce";
+
+const Tasks = () => {
+ const token = isAutheticated();
+ const [loading, setLoading] = useState(false);
+ const [taskData, settaskData] = useState([]);
+
+ const tmnameRef = useRef();
+ const scnameRef = useRef();
+ const statusnameRef = useRef();
+ const startDateRef = useRef();
+ const endDateRef = useRef();
+
+ const [currentPage, setCurrentPage] = useState(1);
+ const [itemPerPage, setItemPerPage] = useState(10);
+ const [totalData, setTotalData] = useState(0);
+
+ const gettaskData = async () => {
+ setLoading(true);
+ try {
+ const response = await axios.get(`/api/task/tasks`, {
+ headers: {
+ Authorization: `Bearer ${token}`,
+ },
+ params: {
+ page: currentPage,
+ show: itemPerPage,
+ startDate: startDateRef.current?.value || "",
+ endDate: endDateRef.current?.value || "",
+ TMname: tmnameRef.current?.value || "",
+ SCname: scnameRef.current?.value || "",
+ status: statusnameRef.current?.value || "",
+ },
+ });
+ // console.log("response", response);
+
+ settaskData(response.data?.data || []);
+ setTotalData(response.data?.pagination?.total || 0);
+ } catch (err) {
+ const msg = err?.response?.data?.msg || "Something went wrong!";
+ swal({
+ title: "Error",
+ text: msg,
+ icon: "error",
+ button: "Retry",
+ dangerMode: true,
+ });
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ const debouncedSearch = useCallback(
+ debounce(() => {
+ setCurrentPage(1);
+ gettaskData();
+ }, 500),
+ []
+ );
+
+ const handleSearchChange = () => {
+ debouncedSearch();
+ };
+
+ useEffect(() => {
+ gettaskData();
+ }, [itemPerPage, currentPage]);
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Task ID
+ |
+
+ Due Date
+ |
+
+ Assigned TM
+ |
+
+ Task Type
+ |
+
+ Sales Coordinator
+ |
+
+ Task Status
+ |
+
+
+
+
+ {loading ? (
+
+
+ Loading...
+ |
+
+ ) : taskData.length > 0 ? (
+ taskData.map((task, index) => (
+
+
+ {task.taskId}
+ |
+
+ {new Date(task.taskDueDate).toLocaleString(
+ "en-IN",
+ {
+ month: "short",
+ day: "numeric",
+ year: "numeric",
+ }
+ )}
+ |
+
+ {task.taskAssignedBy.name}
+ |
+
+ {task.task}
+ |
+
+ {task.taskAssignedTo.name}
+ |
+
+ {task.taskStatus}
+ |
+
+ ))
+ ) : (
+
+
+ No Data Available...
+ |
+
+ )}
+
+
+
+
+
+
+ Showing {currentPage * itemPerPage - itemPerPage + 1} to{" "}
+ {Math.min(currentPage * itemPerPage, totalData)} of{" "}
+ {totalData} entries
+
+
+
+
+
+
+ -
+ setCurrentPage((prev) => prev - 1)}
+ disabled={loading}
+ >
+ Previous
+
+
+
+ {!(currentPage - 1 < 1) && (
+ -
+
+ setCurrentPage((prev) => prev - 1)
+ }
+ disabled={loading}
+ >
+ {currentPage - 1}
+
+
+ )}
+
+ -
+
+ {currentPage}
+
+
+
+ {!(
+ (currentPage + 1) * itemPerPage - itemPerPage >
+ totalData - 1
+ ) && (
+ -
+ {
+ setCurrentPage((prev) => prev + 1);
+ }}
+ disabled={loading}
+ >
+ {currentPage + 1}
+
+
+ )}
+
+ -
+ totalData - 1
+ )
+ ? "paginate_button page-item next"
+ : "paginate_button page-item next disabled"
+ }
+ >
+ setCurrentPage((prev) => prev + 1)}
+ disabled={loading}
+ >
+ Next
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default Tasks;
diff --git a/src/views/Tasks/TaskSalesCoordinator.js b/src/views/Tasks/TaskSalesCoordinator.js
index da47329..8e79c8b 100644
--- a/src/views/Tasks/TaskSalesCoordinator.js
+++ b/src/views/Tasks/TaskSalesCoordinator.js
@@ -7,7 +7,7 @@ import { isAutheticated } from "src/auth";
import swal from "sweetalert";
import debounce from 'lodash.debounce';
-const LeaveSalesCoordinator = () => {
+const TaskSalesCoordinator = () => {
const token = isAutheticated();
const navigate = useNavigate();
const [loading, setLoading] = useState(false);
@@ -71,7 +71,7 @@ const LeaveSalesCoordinator = () => {
- Sales Coordinators Leaves
+ Sales Coordinators List
{
textTransform: "capitalize",
}}
onClick={() => {
- navigate("/leaves/today", { replace: true });
+ navigate("/task/today", { replace: true });
}}
>
Cancel
@@ -220,7 +220,7 @@ const LeaveSalesCoordinator = () => {
})}
|
-
+
{
type="button"
className="btn btn-primary btn-sm waves-effect waves-light btn-table mt-1 mx-1"
>
- View Leaves
+ View Tasks
|
@@ -315,4 +315,4 @@ const LeaveSalesCoordinator = () => {
);
};
-export default LeaveSalesCoordinator;
+export default TaskSalesCoordinator;
diff --git a/src/views/Tasks/TaskTerritoryManager.js b/src/views/Tasks/TaskTerritoryManager.js
index b02b53a..388255c 100644
--- a/src/views/Tasks/TaskTerritoryManager.js
+++ b/src/views/Tasks/TaskTerritoryManager.js
@@ -7,7 +7,7 @@ import { isAutheticated } from "src/auth";
import swal from "sweetalert";
import debounce from 'lodash.debounce';
-const LeaveTerritoryManager = () => {
+const TaskTerritoryManager = () => {
const token = isAutheticated();
const navigate = useNavigate();
const [loading, setLoading] = useState(false);
@@ -71,7 +71,7 @@ const LeaveTerritoryManager = () => {
- Territory Managers Leaves
+ Territory Managers List
{
textTransform: "capitalize",
}}
onClick={() => {
- navigate("/leaves/today", { replace: true });
+ navigate("/task/today", { replace: true });
}}
>
Cancel
@@ -220,7 +220,7 @@ const LeaveTerritoryManager = () => {
})}
-
+
{
type="button"
className="btn btn-primary btn-sm waves-effect waves-light btn-table mt-1 mx-1"
>
- View Leaves
+ View Tasks
|
@@ -315,4 +315,4 @@ const LeaveTerritoryManager = () => {
);
};
-export default LeaveTerritoryManager;
+export default TaskTerritoryManager;
diff --git a/src/views/Tasks/TodayTasks.js b/src/views/Tasks/TodayTasks.js
index 6fd37ff..d7b9a04 100644
--- a/src/views/Tasks/TodayTasks.js
+++ b/src/views/Tasks/TodayTasks.js
@@ -83,11 +83,11 @@ const TodayTask = () => {
marginRight: "1rem",
textTransform: "capitalize",
}}
- // onClick={() => {
- // navigate("/salescoordinator/task", {
- // replace: true,
- // });
- // }}
+ onClick={() => {
+ navigate("/salescoordinator/task", {
+ replace: true,
+ });
+ }}
>
Show Sales Coordinator Task
@@ -98,11 +98,11 @@ const TodayTask = () => {
fontWeight: "bold",
textTransform: "capitalize",
}}
- // onClick={() => {
- // navigate("/territorymanager/task", {
- // replace: true,
- // });
- // }}
+ onClick={() => {
+ navigate("/territorymanager/task", {
+ replace: true,
+ });
+ }}
>
Show Territory Manager Task
diff --git a/src/views/TerritoryManager/TerritoryManager.js b/src/views/TerritoryManager/TerritoryManager.js
index 7d05514..4dee2ff 100644
--- a/src/views/TerritoryManager/TerritoryManager.js
+++ b/src/views/TerritoryManager/TerritoryManager.js
@@ -154,7 +154,7 @@ const TerritoryManager = () => {
-
+
-
-
+
{
// hour12: true,
})}
-
+ |
@@ -334,7 +334,7 @@ const TerritoryManager = () => {
handleDelete(territorymanager._id)
}
|