order view part fixed , add sc and tm add on efield employee code also fixed the add multiple of sc and tm
This commit is contained in:
parent
003bc54c71
commit
f758cfe1ba
@ -60,7 +60,10 @@ const AddMultiplesc = () => {
|
|||||||
setNewlyCreated(data.newlyCreated);
|
setNewlyCreated(data.newlyCreated);
|
||||||
// console.log(data.newlyCreated);
|
// console.log(data.newlyCreated);
|
||||||
}
|
}
|
||||||
if (data.updatedsalesCoordinators && data.updatedsalesCoordinators.length > 0) {
|
if (
|
||||||
|
data.updatedsalesCoordinators &&
|
||||||
|
data.updatedsalesCoordinators.length > 0
|
||||||
|
) {
|
||||||
setupdatedsalesCoordinators(data.updatedsalesCoordinators);
|
setupdatedsalesCoordinators(data.updatedsalesCoordinators);
|
||||||
// console.log(data.updatedsalesCoordinators);
|
// console.log(data.updatedsalesCoordinators);
|
||||||
}
|
}
|
||||||
@ -145,14 +148,17 @@ const AddMultiplesc = () => {
|
|||||||
<table className="table table-bordered">
|
<table className="table table-bordered">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
<th>Employee Code</th>
|
||||||
<th>Sales Coordinator Name</th>
|
<th>Sales Coordinator Name</th>
|
||||||
<th>Email</th>
|
<th>Email</th>
|
||||||
|
<th>Phone</th>
|
||||||
<th>Message</th>
|
<th>Message</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{errors.map((error, index) => (
|
{errors.map((error, index) => (
|
||||||
<tr key={index}>
|
<tr key={index}>
|
||||||
|
<td>{error.uniqueId || "N/A"}</td>
|
||||||
<td>{error.name || "N/A"}</td>
|
<td>{error.name || "N/A"}</td>
|
||||||
<td>{error.email || "N/A"}</td>
|
<td>{error.email || "N/A"}</td>
|
||||||
<td>{error.phone || "N/A"}</td>
|
<td>{error.phone || "N/A"}</td>
|
||||||
@ -169,6 +175,7 @@ const AddMultiplesc = () => {
|
|||||||
<table className="table table-bordered">
|
<table className="table table-bordered">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
<th>Employee Code</th>
|
||||||
<th>Sales Coordinator Name</th>
|
<th>Sales Coordinator Name</th>
|
||||||
<th>Email</th>
|
<th>Email</th>
|
||||||
<th>Phone</th>
|
<th>Phone</th>
|
||||||
@ -178,6 +185,7 @@ const AddMultiplesc = () => {
|
|||||||
<tbody>
|
<tbody>
|
||||||
{updatedsalesCoordinators.map((SC, index) => (
|
{updatedsalesCoordinators.map((SC, index) => (
|
||||||
<tr key={index}>
|
<tr key={index}>
|
||||||
|
<td>{SC.uniqueId || "N/A"}</td>
|
||||||
<td>{SC.name || "N/A"}</td>
|
<td>{SC.name || "N/A"}</td>
|
||||||
<td>{SC.email || "N/A"}</td>
|
<td>{SC.email || "N/A"}</td>
|
||||||
<td>{SC.mobileNumber || "N/A"}</td>
|
<td>{SC.mobileNumber || "N/A"}</td>
|
||||||
@ -194,6 +202,7 @@ const AddMultiplesc = () => {
|
|||||||
<table className="table table-bordered">
|
<table className="table table-bordered">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
<th>Employee Code</th>
|
||||||
<th>Sales Coordinator Name</th>
|
<th>Sales Coordinator Name</th>
|
||||||
<th>Email</th>
|
<th>Email</th>
|
||||||
<th>Phone</th>
|
<th>Phone</th>
|
||||||
@ -202,6 +211,7 @@ const AddMultiplesc = () => {
|
|||||||
<tbody>
|
<tbody>
|
||||||
{newlyCreated.map((SC, index) => (
|
{newlyCreated.map((SC, index) => (
|
||||||
<tr key={index}>
|
<tr key={index}>
|
||||||
|
<td>{SC?.salesCoordinator?.uniqueId || "N/A"}</td>
|
||||||
<td>{SC?.salesCoordinator?.name || "N/A"}</td>
|
<td>{SC?.salesCoordinator?.name || "N/A"}</td>
|
||||||
<td>{SC?.salesCoordinator?.email || "N/A"}</td>
|
<td>{SC?.salesCoordinator?.email || "N/A"}</td>
|
||||||
<td>{SC?.salesCoordinator?.mobileNumber || "N/A"}</td>
|
<td>{SC?.salesCoordinator?.mobileNumber || "N/A"}</td>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import React, { useState, useEffect } from "react";
|
import React, { useState, useEffect, useRef, useCallback } from "react";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
import { isAutheticated } from "src/auth";
|
import { isAutheticated } from "src/auth";
|
||||||
@ -6,12 +6,14 @@ import Modal from "react-bootstrap/Modal";
|
|||||||
import Button from "react-bootstrap/Button";
|
import Button from "react-bootstrap/Button";
|
||||||
import Form from "react-bootstrap/Form";
|
import Form from "react-bootstrap/Form";
|
||||||
import swal from "sweetalert";
|
import swal from "sweetalert";
|
||||||
|
import debounce from "lodash.debounce";
|
||||||
|
|
||||||
const AddSalesCoOrdinator = () => {
|
const AddSalesCoOrdinator = () => {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const token = isAutheticated();
|
const token = isAutheticated();
|
||||||
|
|
||||||
const [formData, setFormData] = useState({
|
const [formData, setFormData] = useState({
|
||||||
|
uniqueId: "",
|
||||||
name: "",
|
name: "",
|
||||||
email: "",
|
email: "",
|
||||||
countryCode: "+91",
|
countryCode: "+91",
|
||||||
@ -20,39 +22,118 @@ const AddSalesCoOrdinator = () => {
|
|||||||
territoryManager: "", // Add territoryManager field
|
territoryManager: "", // Add territoryManager field
|
||||||
});
|
});
|
||||||
|
|
||||||
const [territoryManagers, setTerritoryManagers] = useState([]); // State for storing fetched territory managers
|
const nameRef = useRef();
|
||||||
|
const dropdownRef = useRef(); // Reference for the dropdown
|
||||||
|
const [territoryManagers, setTerritoryManagers] = useState([]);
|
||||||
const [showModal, setShowModal] = useState(false);
|
const [showModal, setShowModal] = useState(false);
|
||||||
const [loading, setLoading] = useState(false); // Loading state for the Territory Manager dropdown
|
const [showDropdown, setShowDropdown] = useState(false);
|
||||||
|
const [tmname, setTmname] = useState("");
|
||||||
|
const getTerritoryManagers = async (query = "") => {
|
||||||
|
try {
|
||||||
|
const res = await axios.get(`/api/territorymanager/getAll-dropdown/`, {
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${token}`,
|
||||||
|
},
|
||||||
|
params: {
|
||||||
|
name: query,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
setTerritoryManagers(res.data.territoryManager || []);
|
||||||
|
} catch (err) {
|
||||||
|
const msg = err?.response?.data?.message || "Something went wrong!";
|
||||||
|
swal({
|
||||||
|
title: "Error",
|
||||||
|
text: msg,
|
||||||
|
icon: "error",
|
||||||
|
button: "Retry",
|
||||||
|
dangerMode: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Fetch Territory Managers when the component mounts
|
// Fetch Territory Managers when the component mounts
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
getTerritoryManagers();
|
getTerritoryManagers();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const getTerritoryManagers = () => {
|
const debouncedSearch = useCallback(
|
||||||
setLoading(true);
|
debounce(() => {
|
||||||
axios
|
getTerritoryManagers(nameRef.current.value);
|
||||||
.get(`/api/territorymanager/getAll/`, {
|
}, 500),
|
||||||
headers: {
|
[]
|
||||||
Authorization: `Bearer ${token}`,
|
);
|
||||||
},
|
|
||||||
})
|
const handleSearchChange = (e) => {
|
||||||
.then((res) => {
|
// const { value } = e.target;
|
||||||
setTerritoryManagers(res.data.territoryManager || []); // Store the response data
|
// setFormData({ ...formData, territoryManager: value });
|
||||||
setLoading(false);
|
setShowDropdown(true);
|
||||||
})
|
setTmname(e.target.value);
|
||||||
.catch((err) => {
|
debouncedSearch();
|
||||||
console.error(err);
|
};
|
||||||
setLoading(false);
|
|
||||||
});
|
const handleDropdownSelect = (tm) => {
|
||||||
|
setFormData({ ...formData, territoryManager: tm._id });
|
||||||
|
setTmname(tm.name);
|
||||||
|
setShowDropdown(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleInputClick = () => {
|
||||||
|
setFormData({ ...formData, territoryManager: "" });
|
||||||
|
setShowDropdown(true);
|
||||||
|
getTerritoryManagers();
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleChange = (e) => {
|
const handleChange = (e) => {
|
||||||
setFormData({ ...formData, [e.target.name]: e.target.value });
|
setFormData({ ...formData, [e.target.name]: e.target.value });
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Listen for clicks outside the dropdown and input field to hide the dropdown
|
||||||
|
useEffect(() => {
|
||||||
|
const handleClickOutside = (event) => {
|
||||||
|
if (
|
||||||
|
nameRef.current &&
|
||||||
|
dropdownRef.current &&
|
||||||
|
!nameRef.current.contains(event.target) &&
|
||||||
|
!dropdownRef.current.contains(event.target)
|
||||||
|
) {
|
||||||
|
setShowDropdown(false); // Hide the dropdown
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
document.addEventListener("mousedown", handleClickOutside);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
document.removeEventListener("mousedown", handleClickOutside);
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const validateForm = () => {
|
||||||
|
const { uniqueId, name, email, mobileNumber, territoryManager } = formData;
|
||||||
|
if (!uniqueId || !name || !email || !mobileNumber || !territoryManager) {
|
||||||
|
swal({
|
||||||
|
title: "Warning",
|
||||||
|
text: "All fields are required!",
|
||||||
|
icon: "warning",
|
||||||
|
button: "OK",
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!/^\d{10}$/.test(mobileNumber)) {
|
||||||
|
swal({
|
||||||
|
title: "Warning",
|
||||||
|
text: "Mobile number must be 10 digits!",
|
||||||
|
icon: "warning",
|
||||||
|
button: "OK",
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
const handleRegister = async (e) => {
|
const handleRegister = async (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
if (!validateForm()) return;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await axios.post("/api/salescoordinator/register", formData, {
|
await axios.post("/api/salescoordinator/register", formData, {
|
||||||
headers: {
|
headers: {
|
||||||
@ -130,28 +211,55 @@ const AddSalesCoOrdinator = () => {
|
|||||||
<div className="card">
|
<div className="card">
|
||||||
<div className="card-body">
|
<div className="card-body">
|
||||||
<form onSubmit={handleRegister}>
|
<form onSubmit={handleRegister}>
|
||||||
<div className="form-group d-flex align-items-center">
|
<div className="form-group position-relative">
|
||||||
<label className="mr-2">Add Territory Manager:</label>
|
<label>Add Territory Manager *</label>
|
||||||
<select
|
<input
|
||||||
|
type="text"
|
||||||
className="form-control"
|
className="form-control"
|
||||||
name="territoryManager"
|
placeholder="Search and select Territory Manager"
|
||||||
onChange={handleChange}
|
ref={nameRef}
|
||||||
value={formData.territoryManager}
|
value={tmname}
|
||||||
disabled={loading}
|
onChange={handleSearchChange}
|
||||||
required
|
onClick={handleInputClick}
|
||||||
style={{ width: "auto", flex: 1 }}
|
/>
|
||||||
>
|
{/* Dropdown */}
|
||||||
<option value="">Select Territory Manager</option>
|
{showDropdown && territoryManagers.length > 0 && (
|
||||||
{territoryManagers.map((tm) => (
|
<ul
|
||||||
<option key={tm._id} value={tm._id}>
|
className="dropdown-menu show w-100"
|
||||||
{tm.name}
|
ref={dropdownRef} // Reference for the dropdown
|
||||||
</option>
|
style={{
|
||||||
))}
|
position: "absolute",
|
||||||
</select>
|
zIndex: 1000,
|
||||||
|
top: "100%",
|
||||||
|
left: 0,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{territoryManagers.map((tm) => (
|
||||||
|
<li
|
||||||
|
key={tm._id}
|
||||||
|
className="dropdown-item"
|
||||||
|
onClick={() => handleDropdownSelect(tm)}
|
||||||
|
>
|
||||||
|
{tm.name}
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="form-group">
|
<div className="form-group">
|
||||||
<label>Name</label>
|
<label>Employee Code *</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="uniqueId"
|
||||||
|
className="form-control"
|
||||||
|
value={formData.uniqueId}
|
||||||
|
onChange={handleChange}
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="form-group">
|
||||||
|
<label>Name *</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
name="name"
|
name="name"
|
||||||
@ -162,7 +270,7 @@ const AddSalesCoOrdinator = () => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="form-group">
|
<div className="form-group">
|
||||||
<label>Email</label>
|
<label>Email *</label>
|
||||||
<input
|
<input
|
||||||
type="email"
|
type="email"
|
||||||
name="email"
|
name="email"
|
||||||
@ -174,7 +282,7 @@ const AddSalesCoOrdinator = () => {
|
|||||||
</div>
|
</div>
|
||||||
<div className="form-group d-flex">
|
<div className="form-group d-flex">
|
||||||
<div className="mr-2" style={{ flex: 1 }}>
|
<div className="mr-2" style={{ flex: 1 }}>
|
||||||
<label>Country Code</label>
|
<label>Country Code *</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
name="countryCode"
|
name="countryCode"
|
||||||
@ -186,7 +294,7 @@ const AddSalesCoOrdinator = () => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div style={{ flex: 3 }}>
|
<div style={{ flex: 3 }}>
|
||||||
<label>Mobile Number</label>
|
<label>Mobile Number *</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
name="mobileNumber"
|
name="mobileNumber"
|
||||||
@ -197,7 +305,7 @@ const AddSalesCoOrdinator = () => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button type="submit" className="btn btn-primary">
|
<button className="btn btn-primary mt-4" type="submit">
|
||||||
Register
|
Register
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
@ -211,25 +319,24 @@ const AddSalesCoOrdinator = () => {
|
|||||||
{/* OTP Modal */}
|
{/* OTP Modal */}
|
||||||
<Modal show={showModal} onHide={() => setShowModal(false)}>
|
<Modal show={showModal} onHide={() => setShowModal(false)}>
|
||||||
<Modal.Header closeButton>
|
<Modal.Header closeButton>
|
||||||
<Modal.Title>Enter OTP</Modal.Title>
|
<Modal.Title>Verify OTP</Modal.Title>
|
||||||
</Modal.Header>
|
</Modal.Header>
|
||||||
<Modal.Body>
|
<Modal.Body>
|
||||||
<Form.Group>
|
<Form.Group controlId="otp">
|
||||||
<Form.Label>OTP</Form.Label>
|
<Form.Label>Enter OTP</Form.Label>
|
||||||
<Form.Control
|
<Form.Control
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="Enter OTP"
|
name="otp"
|
||||||
value={formData.otp}
|
value={formData.otp}
|
||||||
onChange={(e) =>
|
onChange={handleChange}
|
||||||
setFormData({ ...formData, otp: e.target.value })
|
placeholder="Enter OTP"
|
||||||
}
|
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
</Modal.Body>
|
</Modal.Body>
|
||||||
<Modal.Footer>
|
<Modal.Footer>
|
||||||
<Button variant="secondary" onClick={() => setShowModal(false)}>
|
<Button variant="secondary" onClick={() => setShowModal(false)}>
|
||||||
Cancel
|
Close
|
||||||
</Button>
|
</Button>
|
||||||
<Button variant="primary" onClick={handleVerifyOTP}>
|
<Button variant="primary" onClick={handleVerifyOTP}>
|
||||||
Verify OTP
|
Verify OTP
|
||||||
|
@ -13,6 +13,7 @@ const EditSalesCoOrdinator = () => {
|
|||||||
const { id } = useParams();
|
const { id } = useParams();
|
||||||
|
|
||||||
const [formData, setFormData] = useState({
|
const [formData, setFormData] = useState({
|
||||||
|
uniqueId: "",
|
||||||
name: "",
|
name: "",
|
||||||
email: "",
|
email: "",
|
||||||
countryCode: "",
|
countryCode: "",
|
||||||
@ -42,10 +43,11 @@ const EditSalesCoOrdinator = () => {
|
|||||||
// Assuming country code always starts with + and is followed by 1-3 digits
|
// Assuming country code always starts with + and is followed by 1-3 digits
|
||||||
const fullMobileNumber = data?.mobileNumber || "";
|
const fullMobileNumber = data?.mobileNumber || "";
|
||||||
const countryCodeMatch = fullMobileNumber.match(/^\+\d{1,2}/);
|
const countryCodeMatch = fullMobileNumber.match(/^\+\d{1,2}/);
|
||||||
const countryCode = countryCodeMatch ? countryCodeMatch[0] : "";
|
const countryCode = countryCodeMatch ? countryCodeMatch[0] : "+91";
|
||||||
const mobileNumber = fullMobileNumber.replace(countryCode, "");
|
const mobileNumber = fullMobileNumber.replace(countryCode, "");
|
||||||
|
|
||||||
setFormData({
|
setFormData({
|
||||||
|
uniqueId: data?.uniqueId || "",
|
||||||
name: data?.name || "",
|
name: data?.name || "",
|
||||||
email: data?.email || "",
|
email: data?.email || "",
|
||||||
countryCode: countryCode,
|
countryCode: countryCode,
|
||||||
@ -69,6 +71,7 @@ const EditSalesCoOrdinator = () => {
|
|||||||
.patch(
|
.patch(
|
||||||
`/api/salescoordinator/profile/update/${id}`,
|
`/api/salescoordinator/profile/update/${id}`,
|
||||||
{
|
{
|
||||||
|
uniqueId:formData.uniqueId,
|
||||||
name: formData.name,
|
name: formData.name,
|
||||||
email: formData.email,
|
email: formData.email,
|
||||||
},
|
},
|
||||||
@ -221,6 +224,17 @@ const EditSalesCoOrdinator = () => {
|
|||||||
<div className="col-lg-12">
|
<div className="col-lg-12">
|
||||||
<div className="card">
|
<div className="card">
|
||||||
<div className="card-body">
|
<div className="card-body">
|
||||||
|
<div className="form-group">
|
||||||
|
<label>Employee Code</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="Employee code"
|
||||||
|
className="form-control"
|
||||||
|
value={formData.uniqueId}
|
||||||
|
onChange={handleChange}
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
<div className="form-group">
|
<div className="form-group">
|
||||||
<label>Name</label>
|
<label>Name</label>
|
||||||
<input
|
<input
|
||||||
|
@ -60,7 +60,10 @@ const AddMultipletm = () => {
|
|||||||
setNewlyCreated(data.newlyCreated);
|
setNewlyCreated(data.newlyCreated);
|
||||||
// console.log(data.newlyCreated);
|
// console.log(data.newlyCreated);
|
||||||
}
|
}
|
||||||
if (data.updatedtrritoryManagers && data.updatedtrritoryManagers.length > 0) {
|
if (
|
||||||
|
data.updatedtrritoryManagers &&
|
||||||
|
data.updatedtrritoryManagers.length > 0
|
||||||
|
) {
|
||||||
setupdatedtrritoryManagers(data.updatedtrritoryManagers);
|
setupdatedtrritoryManagers(data.updatedtrritoryManagers);
|
||||||
// console.log(data.updatedtrritoryManagers);
|
// console.log(data.updatedtrritoryManagers);
|
||||||
}
|
}
|
||||||
@ -145,14 +148,17 @@ const AddMultipletm = () => {
|
|||||||
<table className="table table-bordered">
|
<table className="table table-bordered">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
<th>Employee Code</th>
|
||||||
<th>Territory Manager Name</th>
|
<th>Territory Manager Name</th>
|
||||||
<th>Email</th>
|
<th>Email</th>
|
||||||
|
<th>Phone</th>
|
||||||
<th>Message</th>
|
<th>Message</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{errors.map((error, index) => (
|
{errors.map((error, index) => (
|
||||||
<tr key={index}>
|
<tr key={index}>
|
||||||
|
<td>{error.uniqueId || "N/A"}</td>
|
||||||
<td>{error.name || "N/A"}</td>
|
<td>{error.name || "N/A"}</td>
|
||||||
<td>{error.email || "N/A"}</td>
|
<td>{error.email || "N/A"}</td>
|
||||||
<td>{error.phone || "N/A"}</td>
|
<td>{error.phone || "N/A"}</td>
|
||||||
@ -169,6 +175,7 @@ const AddMultipletm = () => {
|
|||||||
<table className="table table-bordered">
|
<table className="table table-bordered">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
<th>Employee Code</th>
|
||||||
<th>Territory Manager Name</th>
|
<th>Territory Manager Name</th>
|
||||||
<th>Email</th>
|
<th>Email</th>
|
||||||
<th>Phone</th>
|
<th>Phone</th>
|
||||||
@ -178,6 +185,7 @@ const AddMultipletm = () => {
|
|||||||
<tbody>
|
<tbody>
|
||||||
{updatedtrritoryManagers.map((TM, index) => (
|
{updatedtrritoryManagers.map((TM, index) => (
|
||||||
<tr key={index}>
|
<tr key={index}>
|
||||||
|
<td>{TM.uniqueId || "N/A"}</td>
|
||||||
<td>{TM.name || "N/A"}</td>
|
<td>{TM.name || "N/A"}</td>
|
||||||
<td>{TM.email || "N/A"}</td>
|
<td>{TM.email || "N/A"}</td>
|
||||||
<td>{TM.mobileNumber || "N/A"}</td>
|
<td>{TM.mobileNumber || "N/A"}</td>
|
||||||
@ -194,6 +202,7 @@ const AddMultipletm = () => {
|
|||||||
<table className="table table-bordered">
|
<table className="table table-bordered">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
<th>Employee Code</th>
|
||||||
<th>Territory Manager Name</th>
|
<th>Territory Manager Name</th>
|
||||||
<th>Email</th>
|
<th>Email</th>
|
||||||
<th>Phone</th>
|
<th>Phone</th>
|
||||||
@ -202,6 +211,7 @@ const AddMultipletm = () => {
|
|||||||
<tbody>
|
<tbody>
|
||||||
{newlyCreated.map((TM, index) => (
|
{newlyCreated.map((TM, index) => (
|
||||||
<tr key={index}>
|
<tr key={index}>
|
||||||
|
<td>{TM?.territoryManager?.uniqueId || "N/A"}</td>
|
||||||
<td>{TM?.territoryManager?.name || "N/A"}</td>
|
<td>{TM?.territoryManager?.name || "N/A"}</td>
|
||||||
<td>{TM?.territoryManager?.email || "N/A"}</td>
|
<td>{TM?.territoryManager?.email || "N/A"}</td>
|
||||||
<td>{TM?.territoryManager?.mobileNumber || "N/A"}</td>
|
<td>{TM?.territoryManager?.mobileNumber || "N/A"}</td>
|
||||||
|
@ -12,6 +12,7 @@ const AddTerritoryManager = () => {
|
|||||||
const token = isAutheticated();
|
const token = isAutheticated();
|
||||||
|
|
||||||
const [formData, setFormData] = useState({
|
const [formData, setFormData] = useState({
|
||||||
|
uniqueId: "",
|
||||||
name: "",
|
name: "",
|
||||||
email: "",
|
email: "",
|
||||||
countryCode: "+91",
|
countryCode: "+91",
|
||||||
@ -24,9 +25,31 @@ const AddTerritoryManager = () => {
|
|||||||
const handleChange = (e) => {
|
const handleChange = (e) => {
|
||||||
setFormData({ ...formData, [e.target.name]: e.target.value });
|
setFormData({ ...formData, [e.target.name]: e.target.value });
|
||||||
};
|
};
|
||||||
|
const validateForm = () => {
|
||||||
|
const { uniqueId, name, email, mobileNumber } = formData;
|
||||||
|
if (!uniqueId || !name || !email || !mobileNumber) {
|
||||||
|
swal({
|
||||||
|
title: "Warning",
|
||||||
|
text: "All fields are required!",
|
||||||
|
icon: "warning",
|
||||||
|
button: "OK",
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!/^\d{10}$/.test(mobileNumber)) {
|
||||||
|
swal({
|
||||||
|
title: "Warning",
|
||||||
|
text: "Mobile number must be 10 digits!",
|
||||||
|
icon: "warning",
|
||||||
|
button: "OK",
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
const handleRegister = async (e) => {
|
const handleRegister = async (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
if (!validateForm()) return;
|
||||||
try {
|
try {
|
||||||
await axios.post("/api/territorymanager/register", formData, {
|
await axios.post("/api/territorymanager/register", formData, {
|
||||||
headers: {
|
headers: {
|
||||||
@ -105,8 +128,19 @@ const AddTerritoryManager = () => {
|
|||||||
<div className="card">
|
<div className="card">
|
||||||
<div className="card-body">
|
<div className="card-body">
|
||||||
<form onSubmit={handleRegister}>
|
<form onSubmit={handleRegister}>
|
||||||
|
<div className="form-group">
|
||||||
|
<label>Employee Code *</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="uniqueId"
|
||||||
|
className="form-control"
|
||||||
|
value={formData.uniqueId}
|
||||||
|
onChange={handleChange}
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
<div className="form-group">
|
<div className="form-group">
|
||||||
<label>Name</label>
|
<label>Name *</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
name="name"
|
name="name"
|
||||||
@ -117,7 +151,7 @@ const AddTerritoryManager = () => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="form-group">
|
<div className="form-group">
|
||||||
<label>Email</label>
|
<label>Email *</label>
|
||||||
<input
|
<input
|
||||||
type="email"
|
type="email"
|
||||||
name="email"
|
name="email"
|
||||||
@ -129,7 +163,7 @@ const AddTerritoryManager = () => {
|
|||||||
</div>
|
</div>
|
||||||
<div className="form-group d-flex">
|
<div className="form-group d-flex">
|
||||||
<div className="mr-2" style={{ flex: 1 }}>
|
<div className="mr-2" style={{ flex: 1 }}>
|
||||||
<label>Country Code</label>
|
<label>Country Code *</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
name="countryCode"
|
name="countryCode"
|
||||||
@ -141,7 +175,7 @@ const AddTerritoryManager = () => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div style={{ flex: 3 }}>
|
<div style={{ flex: 3 }}>
|
||||||
<label>Mobile Number</label>
|
<label>Mobile Number *</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
name="mobileNumber"
|
name="mobileNumber"
|
||||||
@ -166,11 +200,11 @@ const AddTerritoryManager = () => {
|
|||||||
{/* OTP Modal */}
|
{/* OTP Modal */}
|
||||||
<Modal show={showModal} onHide={() => setShowModal(false)}>
|
<Modal show={showModal} onHide={() => setShowModal(false)}>
|
||||||
<Modal.Header closeButton>
|
<Modal.Header closeButton>
|
||||||
<Modal.Title>Enter OTP</Modal.Title>
|
<Modal.Title>Verify OTP</Modal.Title>
|
||||||
</Modal.Header>
|
</Modal.Header>
|
||||||
<Modal.Body>
|
<Modal.Body>
|
||||||
<Form.Group>
|
<Form.Group controlId="otp">
|
||||||
<Form.Label>OTP</Form.Label>
|
<Form.Label>Enter OTP</Form.Label>
|
||||||
<Form.Control
|
<Form.Control
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="Enter OTP"
|
placeholder="Enter OTP"
|
||||||
@ -184,7 +218,7 @@ const AddTerritoryManager = () => {
|
|||||||
</Modal.Body>
|
</Modal.Body>
|
||||||
<Modal.Footer>
|
<Modal.Footer>
|
||||||
<Button variant="secondary" onClick={() => setShowModal(false)}>
|
<Button variant="secondary" onClick={() => setShowModal(false)}>
|
||||||
Cancel
|
Close
|
||||||
</Button>
|
</Button>
|
||||||
<Button variant="primary" onClick={handleVerifyOTP}>
|
<Button variant="primary" onClick={handleVerifyOTP}>
|
||||||
Verify OTP
|
Verify OTP
|
||||||
|
@ -13,6 +13,7 @@ const EditTerritoryManager = () => {
|
|||||||
const { id } = useParams();
|
const { id } = useParams();
|
||||||
|
|
||||||
const [formData, setFormData] = useState({
|
const [formData, setFormData] = useState({
|
||||||
|
uniqueId: "",
|
||||||
name: "",
|
name: "",
|
||||||
email: "",
|
email: "",
|
||||||
countryCode: "",
|
countryCode: "",
|
||||||
@ -42,10 +43,11 @@ const EditTerritoryManager = () => {
|
|||||||
// Assuming country code always starts with + and is followed by 1-3 digits
|
// Assuming country code always starts with + and is followed by 1-3 digits
|
||||||
const fullMobileNumber = data?.mobileNumber || "";
|
const fullMobileNumber = data?.mobileNumber || "";
|
||||||
const countryCodeMatch = fullMobileNumber.match(/^\+\d{1,2}/);
|
const countryCodeMatch = fullMobileNumber.match(/^\+\d{1,2}/);
|
||||||
const countryCode = countryCodeMatch ? countryCodeMatch[0] : "";
|
const countryCode = countryCodeMatch ? countryCodeMatch[0] : "+91";
|
||||||
const mobileNumber = fullMobileNumber.replace(countryCode, "");
|
const mobileNumber = fullMobileNumber.replace(countryCode, "");
|
||||||
|
|
||||||
setFormData({
|
setFormData({
|
||||||
|
uniqueId: data?.uniqueId || "",
|
||||||
name: data?.name || "",
|
name: data?.name || "",
|
||||||
email: data?.email || "",
|
email: data?.email || "",
|
||||||
countryCode: countryCode,
|
countryCode: countryCode,
|
||||||
@ -69,6 +71,7 @@ const EditTerritoryManager = () => {
|
|||||||
.patch(
|
.patch(
|
||||||
`/api/territorymanager/profile/update/${id}`,
|
`/api/territorymanager/profile/update/${id}`,
|
||||||
{
|
{
|
||||||
|
uniqueId: formData.uniqueId,
|
||||||
name: formData.name,
|
name: formData.name,
|
||||||
email: formData.email,
|
email: formData.email,
|
||||||
},
|
},
|
||||||
@ -221,6 +224,17 @@ const EditTerritoryManager = () => {
|
|||||||
<div className="col-lg-12">
|
<div className="col-lg-12">
|
||||||
<div className="card">
|
<div className="card">
|
||||||
<div className="card-body">
|
<div className="card-body">
|
||||||
|
<div className="form-group">
|
||||||
|
<label>Employee Code</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="Employee code"
|
||||||
|
className="form-control"
|
||||||
|
value={formData.uniqueId}
|
||||||
|
onChange={handleChange}
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
<div className="form-group">
|
<div className="form-group">
|
||||||
<label>Name</label>
|
<label>Name</label>
|
||||||
<input
|
<input
|
||||||
|
@ -340,8 +340,8 @@ const ViewOrders = () => {
|
|||||||
<TableRow key={index}>
|
<TableRow key={index}>
|
||||||
<TableCell>
|
<TableCell>
|
||||||
<img
|
<img
|
||||||
src={item.productId.image}
|
src={item?.image}
|
||||||
alt={item.productId.name}
|
// alt={item?.name}
|
||||||
style={{
|
style={{
|
||||||
width: 50,
|
width: 50,
|
||||||
height: 50,
|
height: 50,
|
||||||
@ -349,7 +349,7 @@ const ViewOrders = () => {
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<Typography variant="subtitle1">
|
<Typography variant="subtitle1">
|
||||||
{item.productId.name}
|
{item?.name}
|
||||||
</Typography>
|
</Typography>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
<TableCell align="right">₹{item.price}</TableCell>
|
<TableCell align="right">₹{item.price}</TableCell>
|
||||||
|
@ -74,12 +74,12 @@ const OrderDetailsDialog = ({ open, onClose, order, onSubmit }) => {
|
|||||||
<TableRow key={index}>
|
<TableRow key={index}>
|
||||||
<TableCell>
|
<TableCell>
|
||||||
<img
|
<img
|
||||||
src={item.productId.image}
|
src={item?.image}
|
||||||
alt={item.productId.name}
|
// alt={item?.name}
|
||||||
style={{ width: 50, height: 50, marginRight: 10 }}
|
style={{ width: 50, height: 50, marginRight: 10 }}
|
||||||
/>
|
/>
|
||||||
<Typography variant="subtitle1">
|
<Typography variant="subtitle1">
|
||||||
{item.productId.name}
|
{item?.name}
|
||||||
</Typography>
|
</Typography>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
<TableCell align="right">₹{item.price}</TableCell>
|
<TableCell align="right">₹{item.price}</TableCell>
|
||||||
|
@ -43,8 +43,8 @@ const PendingOrderTable = ({ order }) => {
|
|||||||
<TableRow key={index}>
|
<TableRow key={index}>
|
||||||
<TableCell>
|
<TableCell>
|
||||||
<img
|
<img
|
||||||
src={item.productId.image}
|
src={item?.image}
|
||||||
alt={item.productId.name}
|
// alt={item?.name}
|
||||||
style={{
|
style={{
|
||||||
width: 50,
|
width: 50,
|
||||||
height: 50,
|
height: 50,
|
||||||
@ -52,7 +52,7 @@ const PendingOrderTable = ({ order }) => {
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<Typography variant="subtitle1">
|
<Typography variant="subtitle1">
|
||||||
{item.productId.name}
|
{item?.name}
|
||||||
</Typography>
|
</Typography>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
<TableCell align="center">₹{item.price}</TableCell>
|
<TableCell align="center">₹{item.price}</TableCell>
|
||||||
|
Loading…
Reference in New Issue
Block a user