Employee Validation

Sort by

recency

|

59 Discussions

|

  • + 1 comment

    import React,{useEffect, useState} from "react";

    function EmployeeValidationForm() { const [user, setUser] = useState({name:"",email:"",employeeId:"",joiningDate:""}); const [error, setError] = useState({name:"",email:"",employeeId:"",joiningDate:""}); const [isFormValid, setIsFormValid] = useState(true);

    useEffect(()=>{ if(validation()){ setIsFormValid(false); } },[user]);

    const validation =()=>{ let isValid=true; let newError = {name:"",email:"",employeeId:"",joiningDate:""};

    if(!user.name.trim() || user.name.trim().length < 4){ newError.name="Name must be at least 4 characters long and only contain letters and spaces"; isValid=false; } const emailRegex = /^[^\s@]+@[^\s@]+.[^\s@]+Undefined control sequence \d/; if(!empIdRegex.test(user.employeeId)){ newError.employeeId = "Employee ID must be exactly 6 digits" isValid=false; } if(!user.joiningDate.trim() || user.joiningDate > "2024-12-31"){ newError.joiningDate = "Joining Date cannot be in the future" isValid=false; } setError(newError); return isValid; }

    const handleChange=(e)=>{ e.preventDefault(); const {name, value}=e.target; setUser((prev)=>({ ...prev, }));

    };

    const handleSubmit =()=>{ if(validation()){ setUser({name:"",email:"",employeeId:"",joiningDate:""}); setError({name:"",email:"",employeeId:"",joiningDate:""}); setIsFormValid(false); }else{ console.log("Validation Failed."); } }; return ( {error.name && {error.name}

    } {error.email && {error.email}

    } {error.employeeId && {error.employeeId}

    } {error.joiningDate && {error.joiningDate}

    } Submit ); }

    export default EmployeeValidationForm;

  • + 0 comments

    There are some error in the test cases for date. Until somebody from HackerRank fix it use the below code for your purpose.

    All test cases passed ✅.

    import React,{useEffect, useState} from "react";
    
    function EmployeeValidationForm() {
    const [user, setUser] = useState({name:"",email:"",employeeId:"",joiningDate:""});
    const [error, setError] = useState({name:"",email:"",employeeId:"",joiningDate:""});
    const [isFormValid, setIsFormValid] = useState(true);
    
    useEffect(()=>{
    if(validation()){
      setIsFormValid(false);
    }
    },[user]);
    
    const validation =()=>{
      let isValid=true;
      let newError = {name:"",email:"",employeeId:"",joiningDate:""};
    
      if(!user.name.trim() || user.name.trim().length < 4){
        newError.name="Name must be at least 4 characters long and only contain letters and spaces";
        isValid=false;
      }
      const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
      if(!user.email.trim() || !emailRegex.test(user.email)){
        newError.email = "Email must be a valid email address";
        isValid=false;
      }
      const empIdRegex = /^\d{6}$/;
      if(!empIdRegex.test(user.employeeId)){
        newError.employeeId = "Employee ID must be exactly 6 digits"
        isValid=false;
      }
      if(!user.joiningDate.trim() || user.joiningDate > "2024-12-31"){
       newError.joiningDate = "Joining Date cannot be in the future"
       isValid=false;
      }
      setError(newError);
      return isValid;
    }
    
    const handleChange=(e)=>{
      e.preventDefault();
      const {name, value}=e.target;
    setUser((prev)=>({
      ...prev,
      [name]:value
    }));
    
    };
    
    const handleSubmit =()=>{
      if(validation()){
        setUser({name:"",email:"",employeeId:"",joiningDate:""});
        setError({name:"",email:"",employeeId:"",joiningDate:""});
        setIsFormValid(false);
      }else{
       console.log("Validation Failed.");
      }
    };
      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={user.name}
              placeholder="Name"
              data-testid="input-name-test"
              onChange={handleChange}
            />
            {error.name && 
            <p className="error mt-2">
              {error.name}
            </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={user.email}
              placeholder="Email"
              onChange={handleChange}
            />
            {error.email &&
            <p className="error mt-2">{error.email}</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={user.employeeId}
              placeholder="Employee ID"
              onChange={handleChange}
            />
            {error.employeeId &&
            <p className="error mt-2">{error.employeeId}</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={user.joiningDate}
              placeholder="Joining Date"
              onChange={handleChange}
            />
            {error.joiningDate &&
            <p className="error mt-2">{error.joiningDate}</p>
            }
          </div>
          <button data-testid="submit-btn" type="submit" onClick={handleSubmit} disabled={isFormValid}>
            Submit
          </button>
        </div>
      );
    }
    
    export default EmployeeValidationForm;
    
  • + 1 comment

    The test case is failing because it hardcodes a fixed date ("2025-04-12"). This is not a best practice.

    describe("Input fields functionality", () => {
      it("should display no error for name input field's if criteria is met", () => {
        changeInputFields("UserA", "user-email.com", 123, "2025-04-12");
        expect(inputName.children).toHaveLength(1);
        expect(inputEmail.children).toHaveLength(2);
        expect(inputEmployeeId.children).toHaveLength(2);
        expect(inputJoiningDate.children).toHaveLength(2);
        expect(inputEmail.children[1]).toHaveTextContent("Email must be a valid email address");
        expect(inputEmployeeId.children[1]).toHaveTextContent("Employee ID must be exactly 6 digits");
        expect(inputJoiningDate.children[1]).toHaveTextContent("Joining Date cannot be in the future");
      });
    
      it("should display no error for email input field's if criteria is met", () => {
        changeInputFields("UserA", "user@email.com", 123, "2025-04-12");
        expect(inputName.children).toHaveLength(1);
        expect(inputEmail.children).toHaveLength(1);
        expect(inputEmployeeId.children).toHaveLength(2);
        expect(inputJoiningDate.children).toHaveLength(2);
        expect(inputEmployeeId.children[1]).toHaveTextContent("Employee ID must be exactly 6 digits");
        expect(inputJoiningDate.children[1]).toHaveTextContent("Joining Date cannot be in the future");
      });
    
      it("should display no error for employee ID input field's if criteria is met", () => {
        changeInputFields("Use", "user@email.com", 123456, "2025-04-12");
        expect(inputName.children).toHaveLength(2);
        expect(inputEmail.children).toHaveLength(1);
        expect(inputEmployeeId.children).toHaveLength(1);
        expect(inputJoiningDate.children).toHaveLength(2);
        expect(inputName.children[1]).toHaveTextContent(
          "Name must be at least 4 characters long and only contain letters and spaces"
        );
    		});
        expect(inputJoiningDate.children[1]).toHaveTextContent("Joining Date cannot be in the future");
      });
    
  • + 0 comments

    Hardcoding a fixed date in the test case is not the best practice lol.

  • + 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;