Adding validation in Contact number and adding trim functioanlity.

This commit is contained in:
Kartik Sharma 2025-11-15 15:32:32 +05:30
parent 2252a9c489
commit 031201ea56
3 changed files with 57 additions and 20 deletions

View File

@ -59,7 +59,7 @@ const ManageServiceProject = ({ serviceProjectId, onClose }) => {
const onSubmit = (formData) => { const onSubmit = (formData) => {
if (serviceProjectId) { if (serviceProjectId) {
let existingServiceIds = projectdata?.services?.map((s) => s.id) || []; let existingServiceIds = projectdata?.services?.map((s) => s.id) || [];
const oldServices = projectdata.services.map((service) => ({ const oldServices = projectdata.services.map((service) => ({
serviceId: service.id, serviceId: service.id,
@ -110,10 +110,10 @@ const ManageServiceProject = ({ serviceProjectId, onClose }) => {
<FormProvider {...methods}> <FormProvider {...methods}>
<form className="px-3 py-2" onSubmit={handleSubmit(onSubmit)}> <form className="px-3 py-2" onSubmit={handleSubmit(onSubmit)}>
<div className=" text-center"> <div className=" text-center">
<h5>{serviceProjectId ? "Update Project":"Create Project"}</h5> <h5>{serviceProjectId ? "Update Project" : "Create Project"}</h5>
</div> </div>
<div className="row text-start"> <div className="row text-start">
<div className="col-12 mb-2"> <div className="col-12 mb-2">
<Label htmlFor="name" required> <Label htmlFor="name" required>
Client Client
</Label> </Label>
@ -150,6 +150,7 @@ const ManageServiceProject = ({ serviceProjectId, onClose }) => {
type="text" type="text"
className="form-control form-control-sm" className="form-control form-control-sm"
{...register("name")} {...register("name")}
placeholder="Enter Project Name.."
/> />
{errors?.name && ( {errors?.name && (
<span className="danger-text">{errors.name.message}</span> <span className="danger-text">{errors.name.message}</span>
@ -163,6 +164,7 @@ const ManageServiceProject = ({ serviceProjectId, onClose }) => {
type="text" type="text"
className="form-control form-control-sm" className="form-control form-control-sm"
{...register("shortName")} {...register("shortName")}
placeholder="Enter Project Short Name.."
/> />
{errors?.shortName && ( {errors?.shortName && (
<span className="danger-text">{errors.shortName.message}</span> <span className="danger-text">{errors.shortName.message}</span>
@ -194,11 +196,11 @@ const ManageServiceProject = ({ serviceProjectId, onClose }) => {
valueKey="id" valueKey="id"
label="Select Service" label="Select Service"
/> />
{errors?.services && ( {errors?.services && (
<span className="danger-text">{errors.services.message}</span> <span className="danger-text">{errors.services.message}</span>
)} )}
</div> </div>
<div className="col-12 col-md-6 mb-2"> <div className="col-12 col-md-6 mb-2">
<Label htmlFor="name" required> <Label htmlFor="name" required>
Contact Person Contact Person
@ -207,6 +209,10 @@ const ManageServiceProject = ({ serviceProjectId, onClose }) => {
type="text" type="text"
className="form-control form-control-sm" className="form-control form-control-sm"
{...register("contactName")} {...register("contactName")}
placeholder="Enter Employee name.."
onInput={(e) => {
e.target.value = e.target.value.replace(/[^A-Za-z ]/g, "");
}}
/> />
{errors?.contactName && ( {errors?.contactName && (
<span className="danger-text">{errors.contactName.message}</span> <span className="danger-text">{errors.contactName.message}</span>
@ -220,6 +226,7 @@ const ManageServiceProject = ({ serviceProjectId, onClose }) => {
type="text" type="text"
className="form-control form-control-sm" className="form-control form-control-sm"
{...register("contactEmail")} {...register("contactEmail")}
placeholder="Enter Employee Email.."
/> />
{errors?.contactEmail && ( {errors?.contactEmail && (
<span className="danger-text">{errors.contactEmail.message}</span> <span className="danger-text">{errors.contactEmail.message}</span>
@ -231,8 +238,13 @@ const ManageServiceProject = ({ serviceProjectId, onClose }) => {
</Label> </Label>
<input <input
type="text" type="text"
maxLength={10}
className="form-control form-control-sm" className="form-control form-control-sm"
{...register("contactPhone")} {...register("contactPhone")}
placeholder="Enter Employee Contact.."
onInput={(e) => {
e.target.value = e.target.value.replace(/[^0-9]/g, "");
}}
/> />
{errors?.contactPhone && ( {errors?.contactPhone && (
<span className="danger-text">{errors.contactPhone.message}</span> <span className="danger-text">{errors.contactPhone.message}</span>
@ -244,7 +256,7 @@ const ManageServiceProject = ({ serviceProjectId, onClose }) => {
</Label> </Label>
<DatePicker <DatePicker
name="assignedDate" name="assignedDate"
className="w-full" className="w-100"
control={control} control={control}
/> />
</div> </div>
@ -258,9 +270,10 @@ const ManageServiceProject = ({ serviceProjectId, onClose }) => {
className="form-control" className="form-control"
// maxLength={maxAddressLength} // maxLength={maxAddressLength}
{...register("address")} {...register("address")}
// onChange={(e) => { placeholder="Enter Project Address.."
// setAddressLength(e.target.value.length); // onChange={(e) => {
// }} // setAddressLength(e.target.value.length);
// }}
/> />
</div> </div>
@ -290,8 +303,8 @@ const ManageServiceProject = ({ serviceProjectId, onClose }) => {
{isPending || isUpdating {isPending || isUpdating
? "Please wait..." ? "Please wait..."
: serviceProjectId : serviceProjectId
? "Update" ? "Update"
: "Submit"} : "Submit"}
</button> </button>
</div> </div>
</form> </form>

View File

@ -3,21 +3,45 @@ import { PROJECT_STATUS } from "../../utils/constants";
//#region Service Project //#region Service Project
export const projectSchema = z.object({ export const projectSchema = z.object({
name: z.string().min(1, "Name is required"), name: z
shortName: z.string().min(1, "Short name is required"), .string()
clientId: z.string().min(1, { message: "Client is required" }), .trim()
.min(1, "Name is required"),
shortName: z
.string()
.trim()
.min(1, "Short name is required"),
clientId: z.string().trim().min(1, { message: "Client is required" }),
services: z services: z
.array(z.string()) .array(z.string())
.min(1, { message: "At least one service required" }), .min(1, { message: "At least one service required" }),
address: z.string().min(1, "Address is required"),
assignedDate: z.string().min(1, { message: "Date is required" }), address: z.string().trim().min(1, "Address is required"),
statusId: z.string().min(1, "Status is required"),
contactName: z.string().min(1, "Contact name is required"), assignedDate: z.string().trim().min(1, { message: "Date is required" }),
statusId: z.string().trim().min(1, "Status is required"),
contactName: z
.string()
.trim()
.min(1, "Contact name is required")
.regex(/^[A-Za-z\s]+$/, "Contact name can contain only letters"),
contactPhone: z contactPhone: z
.string() .string()
.trim()
.regex(/^\d+$/, "Phone number must contain only digits")
.min(7, "Invalid phone number") .min(7, "Invalid phone number")
.max(15, "Phone number too long"), .max(15, "Phone number too long"),
contactEmail: z.string().email("Invalid email address"),
contactEmail: z
.string()
.trim()
.email("Invalid email address"),
}); });
export const defaultProjectValues = { export const defaultProjectValues = {

View File

@ -51,7 +51,7 @@ const DatePicker = ({
<div className={`position-relative ${className} w-max `}> <div className={`position-relative ${className} w-max `}>
<input <input
type="text" type="text"
className="form-control form-control" className="form-control form-control form-control-sm"
placeholder={placeholder} placeholder={placeholder}
value={displayValue} value={displayValue}
onChange={(e) => { onChange={(e) => {