From 1aac5f664ff64cb4645323ff31e8033d9668ec0a Mon Sep 17 00:00:00 2001 From: Sibunnayak Date: Wed, 13 Nov 2024 17:51:17 +0530 Subject: [PATCH] report download of retailer and pd and task --- src/_nav.js | 14 +- src/routes.js | 28 ++ .../principalDistributor.js | 149 ++++-- src/views/Products/Products.js | 6 +- src/views/Reports/OpeningInventoryReports.js | 13 +- src/views/Reports/StockReports .js | 13 +- .../RetailDistributors/RetailDistributor.js | 164 +++++-- .../SalesCoOrdinators/SalesCoOrdinator.js | 20 +- src/views/Tasks/SingleUserTask.js | 6 +- src/views/Tasks/Task.js | 440 ++++++++++++++++++ src/views/Tasks/TaskSalesCoordinator.js | 12 +- src/views/Tasks/TaskTerritoryManager.js | 12 +- src/views/Tasks/TodayTasks.js | 20 +- .../TerritoryManager/TerritoryManager.js | 10 +- 14 files changed, 748 insertions(+), 159 deletions(-) create mode 100644 src/views/Tasks/Task.js 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 = () => {
-
+
-
+
{
-
+
- {/* */} + {/* */} - - - - - + + + {/* Stock Button */} + - Stock - - - - + + + {/* OI Button */} + - OI - - + + +
{
-
+
-
+
{ 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} />
+
+ +
-
+
{ - + @@ -253,55 +318,54 @@ const RetailDistributor = () => { )) 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 = () => {
-
+
-
+
{
-
+
ID Trade Name Created OnPrincipal Distributor + Principal Distributor + Territory Manager Sales Coordinator Orders - - - - - + + - Stock - - - - + + + + {/* On large screens: OI and Edit buttons in one row */} +
+ - OI - - - - + + - Edit - - + + +
{ - + - - @@ -289,7 +289,7 @@ const SalesCoOrdinator = () => { // hour12: true, })} - - @@ -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
@@ -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 = () => {
-
+
-
+
{
-
+
Unique Id Name Mobile No.EmailEmail Verify Register On + Mapping + Action
+ @@ -305,13 +305,13 @@ const SalesCoOrdinator = () => { > + @@ -326,7 +326,7 @@ const SalesCoOrdinator = () => { - + - +
{ // hour12: true, })} -
+ @@ -334,7 +334,7 @@ const TerritoryManager = () => {