Employee Validation

  • + 0 comments

    There are some issues with the test cases,

    import React, { useState } from "react";
    
    function EmployeeValidationForm() {
      const validators = {
        name: (val) =>
          val.length >= 4 && /^[A-Za-z\s]+$/.test(val)
            ? false
            : true,
    
        email: (val) =>
          /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(val)
            ? false
            : true,
    
        employeeId: (val) =>
          /^[0-9]{6}$/.test(val)
            ? false
            : true,
    
        joiningDate: (val) => {
          if (!val) return "Joining Date is required";
          const dateOfJoining = new Date(val);
          const today = new Date("2025-04-11"); // keep fixed for test consistency
          return today > dateOfJoining
            ? false
            : true
        },
      };
    
      const [form, setForm] = useState({
        name: "",
        email: "",
        employeeId: "",
        joiningDate: "",
      });
      const [errors, setErrors] = useState({
        name: validators.name(""),
        email: validators.email(""),
        employeeId: validators.employeeId(""),
        joiningDate: validators.joiningDate(""),
      });
    
      const handleChange = (e) => {
        const { name, value } = e.target;
        setForm((prev) => ({ ...prev, [name]: value }));
        setErrors((prev) => ({ ...prev, [name]: validators[name](value) }));
      };
    
      const handleSubmit = () => {
        setForm({ name: "", email: "", employeeId: "", joiningDate: "" });
        setErrors({
          name: validators.name(""),
          email: validators.email(""),
          employeeId: validators.employeeId(""),
          joiningDate: validators.joiningDate(""),
        });
      };
    
      const hasErrors = Object.values(errors).some((err) => err);
    
      return (
        <div className="layout-column align-items-center mt-20 ">
          <div className="layout-column align-items-start mb-10 w-50" data-testid="input-name">
            <input
              className="w-100"
              type="text"
              name="name"
              value={form.name}
              placeholder="Name"
              data-testid="input-name-test"
              onChange={handleChange}
            />
            {errors.name && (<p className="error mt-2">
              Name must be at least 4 characters long and only contain letters and spaces
            </p>)}
          </div>
          <div className="layout-column align-items-start mb-10 w-50" data-testid="input-email">
            <input
              className="w-100"
              type="text"
              name="email"
              value={form.email}
              placeholder="Email"
              onChange={handleChange}
            />
           {errors.email && (<p className="error mt-2">Email must be a valid email address</p>)}
          </div>
          <div className="layout-column align-items-start mb-10 w-50" data-testid="input-employee-id">
            <input
              className="w-100"
              type="text"
              name="employeeId"
              value={form.employeeId}
              placeholder="Employee ID"
              onChange={handleChange}
            />
            {errors.employeeId && (<p className="error mt-2">Employee ID must be exactly 6 digits</p>)}
          </div>
          <div className="layout-column align-items-start mb-10 w-50" data-testid="input-joining-date">
            <input
              className="w-100"
              type="date"
              name="joiningDate"
              value={form.joiningDate}
              placeholder="Joining Date"
              onChange={handleChange}
            />
            {errors.joiningDate && (<p className="error mt-2">Joining Date cannot be in the future</p>)}
          </div>
          <button data-testid="submit-btn" type="submit" 
            disabled={hasErrors}
            onClick={handleSubmit}
          >
            Submit
          </button>
        </div>
      );
    }
    
    export default EmployeeValidationForm;