diff --git a/src/_nav.js b/src/_nav.js index f2b1fee..fdc6272 100644 --- a/src/_nav.js +++ b/src/_nav.js @@ -38,14 +38,6 @@ const _nav = [ icon: , group: "", }, - { - component: CNavItem, - name: "Principal Distributor", - icon: , - to: "/principal-distributor", - group: "PrincipalDistributor", - }, - { component: CNavGroup, name: "Product Management", @@ -76,6 +68,13 @@ const _nav = [ }, ], }, + { + component: CNavItem, + name: "Principal Distributor", + icon: , + to: "/principal-distributor", + group: "PrincipalDistributor", + }, { component: CNavItem, name: "Sales Coordinator", @@ -90,6 +89,13 @@ const _nav = [ to: "/territorymanagers", group: "TerritoryManager", }, + // { + // component: CNavItem, + // name: "retail Distributor", + // icon: , + // to: "/retail-distributor", + // group: "RetailDistributor", + // }, { component: CNavItem, name: "Attendance", diff --git a/src/routes.js b/src/routes.js index 150b499..af91697 100644 --- a/src/routes.js +++ b/src/routes.js @@ -139,6 +139,7 @@ import AttendanceTerritoryManager from "./views/Attendance/AttendanceTerritoryMa import SingleUserAttendance from "./views/Attendance/SingleUserAttendance"; import SingleUserleave from "./views/Leaves/SingleUserLeave"; import LeaveTerritoryManager from "./views/Leaves/LeaveTerritoryManager"; +import RetailDistributor from "./views/RetailDistributors/RetailDistributor"; const routes = [ //dashboard @@ -294,6 +295,13 @@ const routes = [ element: Edittax, navName: "Product Management", }, + // RetailDistributor + { + path: "/retail-distributor", + name: "RetailDistributor", + element: RetailDistributor, + navName: "RetailDistributor", + }, //----------------------- End Product Management Routes------------------------------------------------ //Departure diff --git a/src/views/Attendance/AttendanceSalesCoordinator.js b/src/views/Attendance/AttendanceSalesCoordinator.js index a61dd41..6d0db84 100644 --- a/src/views/Attendance/AttendanceSalesCoordinator.js +++ b/src/views/Attendance/AttendanceSalesCoordinator.js @@ -1,10 +1,11 @@ -import React, { useState, useEffect, useRef } from "react"; +import React, { useState, useEffect, useRef,useCallback } from "react"; import { Link } from "react-router-dom"; import axios from "axios"; import Button from "@material-ui/core/Button"; import { useNavigate } from "react-router-dom"; import { isAutheticated } from "src/auth"; import swal from "sweetalert"; +import debounce from 'lodash.debounce'; const AttendanceSalesCoordinator = () => { const token = isAutheticated(); @@ -55,7 +56,14 @@ const AttendanceSalesCoordinator = () => { useEffect(() => { getSalesCoOrdinatorsData(); }, [success, itemPerPage, currentPage]); + const debouncedSearch = useCallback(debounce(() => { + setCurrentPage(1); + getSalesCoOrdinatorsData(); + }, 500), []); + const handleSearchChange = () => { + debouncedSearch(); + }; return (
@@ -119,6 +127,7 @@ const AttendanceSalesCoordinator = () => { placeholder="SalesCoOrdinator name" className="form-control" ref={nameRef} + onChange={handleSearchChange} disabled={loading} />
@@ -129,6 +138,7 @@ const AttendanceSalesCoordinator = () => { placeholder="Mobile Number" className="form-control" ref={mobileRef} + onChange={handleSearchChange} disabled={loading} />
@@ -137,6 +147,7 @@ const AttendanceSalesCoordinator = () => { -
- -
diff --git a/src/views/Attendance/AttendanceTerritoryManager.js b/src/views/Attendance/AttendanceTerritoryManager.js index a54a817..d346bf6 100644 --- a/src/views/Attendance/AttendanceTerritoryManager.js +++ b/src/views/Attendance/AttendanceTerritoryManager.js @@ -1,10 +1,11 @@ -import React, { useState, useEffect, useRef } from "react"; +import React, { useState, useEffect, useRef,useCallback } from "react"; import { Link } from "react-router-dom"; import axios from "axios"; import Button from "@material-ui/core/Button"; import { useNavigate } from "react-router-dom"; import { isAutheticated } from "src/auth"; import swal from "sweetalert"; +import debounce from 'lodash.debounce'; const AttendanceTerritoryManager = () => { const token = isAutheticated(); @@ -55,7 +56,14 @@ const AttendanceTerritoryManager = () => { useEffect(() => { getterritorymanagerData(); }, [ itemPerPage, currentPage]); + const debouncedSearch = useCallback(debounce(() => { + setCurrentPage(1); + getterritorymanagerData(); + }, 500), []); + const handleSearchChange = () => { + debouncedSearch(); + }; return (
@@ -119,6 +127,7 @@ const AttendanceTerritoryManager = () => { placeholder="territorymanager name" className="form-control" ref={nameRef} + onChange={handleSearchChange} disabled={loading} />
@@ -129,6 +138,7 @@ const AttendanceTerritoryManager = () => { placeholder="Mobile Number" className="form-control" ref={mobileRef} + onChange={handleSearchChange} disabled={loading} />
@@ -137,6 +147,7 @@ const AttendanceTerritoryManager = () => {
-
- -
diff --git a/src/views/Leaves/LeaveSalesCoordinator.js b/src/views/Leaves/LeaveSalesCoordinator.js index 37212ed..90ee797 100644 --- a/src/views/Leaves/LeaveSalesCoordinator.js +++ b/src/views/Leaves/LeaveSalesCoordinator.js @@ -1,10 +1,11 @@ -import React, { useState, useEffect, useRef } from "react"; +import React, { useState, useEffect, useRef,useCallback } from "react"; import { Link } from "react-router-dom"; import axios from "axios"; import Button from "@material-ui/core/Button"; import { useNavigate } from "react-router-dom"; import { isAutheticated } from "src/auth"; import swal from "sweetalert"; +import debounce from 'lodash.debounce'; const LeaveSalesCoordinator = () => { const token = isAutheticated(); @@ -53,9 +54,13 @@ const LeaveSalesCoordinator = () => { getSalesCoOrdinatorsData(); }, [currentPage, itemPerPage]); - const handleFilter = () => { + const debouncedSearch = useCallback(debounce(() => { setCurrentPage(1); getSalesCoOrdinatorsData(); + }, 500), []); + + const handleSearchChange = () => { + debouncedSearch(); }; return ( @@ -121,6 +126,7 @@ const LeaveSalesCoordinator = () => { placeholder="Sales Coordinator name" className="form-control" ref={nameRef} + onChange={handleSearchChange} disabled={loading} />
@@ -131,6 +137,7 @@ const LeaveSalesCoordinator = () => { placeholder="Mobile Number" className="form-control" ref={mobileRef} + onChange={handleSearchChange} disabled={loading} /> @@ -139,6 +146,7 @@ const LeaveSalesCoordinator = () => { -
- -
diff --git a/src/views/Leaves/LeaveTerritoryManager.js b/src/views/Leaves/LeaveTerritoryManager.js index 29e7e1c..ad57c29 100644 --- a/src/views/Leaves/LeaveTerritoryManager.js +++ b/src/views/Leaves/LeaveTerritoryManager.js @@ -1,10 +1,11 @@ -import React, { useState, useEffect, useRef } from "react"; +import React, { useState, useEffect, useRef,useCallback } from "react"; import { Link } from "react-router-dom"; import axios from "axios"; import Button from "@material-ui/core/Button"; import { useNavigate } from "react-router-dom"; import { isAutheticated } from "src/auth"; import swal from "sweetalert"; +import debounce from 'lodash.debounce'; const LeaveTerritoryManager = () => { const token = isAutheticated(); @@ -53,9 +54,13 @@ const LeaveTerritoryManager = () => { getterritorymanagersData(); }, [currentPage, itemPerPage]); - const handleFilter = () => { + const debouncedSearch = useCallback(debounce(() => { setCurrentPage(1); - getterritorymanagersData(); + getterritorymanagerData(); + }, 500), []); + + const handleSearchChange = () => { + debouncedSearch(); }; return ( @@ -121,6 +126,7 @@ const LeaveTerritoryManager = () => { placeholder="Territory Manager name" className="form-control" ref={nameRef} + onChange={handleSearchChange} disabled={loading} />
@@ -131,6 +137,7 @@ const LeaveTerritoryManager = () => { placeholder="Mobile Number" className="form-control" ref={mobileRef} + onChange={handleSearchChange} disabled={loading} /> @@ -139,6 +146,7 @@ const LeaveTerritoryManager = () => { -
- -
diff --git a/src/views/RetailDistributors/RetailDistributor.js b/src/views/RetailDistributors/RetailDistributor.js new file mode 100644 index 0000000..b623087 --- /dev/null +++ b/src/views/RetailDistributors/RetailDistributor.js @@ -0,0 +1,295 @@ +import React, { useState, useEffect, useRef, useCallback } from "react"; +import { Link } from "react-router-dom"; +import axios from "axios"; +import Button from "@material-ui/core/Button"; +import { useNavigate } from "react-router-dom"; +import { isAutheticated } from "src/auth"; +import swal from "sweetalert"; +import debounce from 'lodash.debounce'; + +const RetailDistributor = () => { + const token = isAutheticated(); + const navigate = useNavigate(); + const [loading, setLoading] = useState(false); + const [success, setSuccess] = useState(true); + const [retailDistributorsData, setRetailDistributorsData] = useState([]); + + const nameRef = useRef(); + const mobileRef = useRef(); + const VerifyRetailDistributorRef = useRef(); + + const [currentPage, setCurrentPage] = useState(1); + const [itemPerPage, setItemPerPage] = useState(10); + const [totalData, setTotalData] = useState(0); + + const getRetailDistributorsData = async () => { + setLoading(true); + try { + const res = await axios.get(`/api/retaildistributor/getAll/`, { + headers: { + Authorization: `Bearer ${token}`, + }, + params: { + page: currentPage, + show: itemPerPage, + name: nameRef.current.value, + mobileNumber: mobileRef.current.value, + isVerified: VerifyRetailDistributorRef.current.value, + }, + }); + setRetailDistributorsData(res.data?.retailDistributors); + setTotalData(res.data?.total_data); + } catch (err) { + const msg = err?.response?.data?.message || "Something went wrong!"; + swal({ + title: "Error", + text: msg, + icon: "error", + button: "Retry", + dangerMode: true, + }); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + getRetailDistributorsData(); + }, [success, itemPerPage, currentPage]); + + const debouncedSearch = useCallback(debounce(() => { + setCurrentPage(1); + getRetailDistributorsData(); + }, 500), []); + + const handleSearchChange = () => { + debouncedSearch(); + }; + + const totalPages = Math.ceil(totalData / itemPerPage); + + return ( +
+
+
+
+
+
+
+ Retail Distributors +
+
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ + + + + + + + + + + + + {loading ? ( + + + + ) : retailDistributorsData?.length > 0 ? ( + retailDistributorsData?.map((retailDistributor, i) => { + return ( + + + + + + + + ); + }) + ) : ( + + + + )} + +
IDTrade NameCreated OnMappedAction
+ Loading... +
+ {retailDistributor?.id} + + {retailDistributor?.tradeName} + + {new Date( + retailDistributor.createdAt + ).toLocaleString("en-IN", { + weekday: "short", + month: "short", + day: "numeric", + year: "numeric", + hour: "numeric", + minute: "numeric", + hour12: true, + })} + +
+
Principal Distributor: {retailDistributor.principalDistributor || 'N/A'}
+
Territory Manager: {retailDistributor.territoryManager || 'N/A'}
+
Sales Coordinator: {retailDistributor.salesCoordinator || 'N/A'}
+
+
+ + + +
+ No Retail Distributor found! +
+
+
+
+
+ Showing {currentPage * itemPerPage - itemPerPage + 1} to{" "} + {Math.min(currentPage * itemPerPage, totalData)} of{" "} + {totalData} entries +
+
+ +
+
+
    +
  • + + setCurrentPage((prev) => + prev > 1 ? prev - 1 : prev + ) + } + > + Previous + +
  • +
  • + + setCurrentPage((prev) => + prev < totalPages ? prev + 1 : prev + ) + } + > + Next + +
  • +
+
+
+
+
+
+
+
+
+
+
+ ); +}; + +export default RetailDistributor;