Hone logo
Hone
Problems

Angular Reactive Forms: Building a Dynamic User Registration Form

This challenge focuses on implementing Angular's ReactiveFormsModule to create a dynamic and robust user registration form. You'll learn how to manage form state, validate user input, and handle form submissions programmatically, which is crucial for building interactive and user-friendly web applications.

Problem Description

Your task is to create a multi-step user registration form in an Angular application using ReactiveFormsModule. The form should guide the user through different stages of registration, with validation applied at each step.

Key Requirements:

  1. Component Setup: Create a new Angular component, e.g., UserRegistrationComponent.
  2. Reactive Forms Module: Import ReactiveFormsModule into your AppModule (or the relevant feature module) and make it available to your UserRegistrationComponent.
  3. Form Group and Controls: Define a FormGroup within UserRegistrationComponent to manage the form's state. This FormGroup should contain individual FormControl instances for each input field.
  4. Input Fields: The form should include the following fields:
    • First Name (required, min length 2)
    • Last Name (required, min length 2)
    • Email (required, valid email format)
    • Password (required, min length 6, must contain at least one uppercase letter and one number)
    • Confirm Password (required, must match the password field)
  5. Validation: Implement both synchronous (e.g., Validators.required, Validators.minLength, Validators.email) and asynchronous validation (for password complexity) for the fields.
  6. Error Display: Display appropriate error messages to the user for each validation failure. The error messages should be specific to the validation rule that failed.
  7. Form Submission: Handle the form submission event. When the form is valid and submitted, log the form's value to the console and reset the form.
  8. Password Confirmation: Implement a custom validator to ensure the "Confirm Password" field matches the "Password" field.

Expected Behavior:

  • When the user types into an input field, the FormControl's state should update.
  • Validation errors should appear immediately after a user interacts with a field and it becomes invalid (e.g., after blur or on submit).
  • The submit button should be disabled if the form is invalid.
  • Upon successful submission of a valid form, the form data should be logged, and the form should be cleared.

Edge Cases:

  • What happens if the user tries to submit an empty form?
  • How are errors displayed for fields that haven't been interacted with yet? (Consider only showing errors after the field has been touched).
  • Ensure the asynchronous password complexity check doesn't block the UI.

Examples

Example 1: Basic Input and Validation

Input:
User types "Jo" into the First Name field.

Output:
The "First Name" input field displays no error message.

Explanation:
"Jo" meets the minimum length requirement of 2 characters.

Example 2: Validation Failure and Error Display

Input:
User types "j" into the First Name field and then blurs the field.

Output:
The "First Name" input field displays an error message like "First name must be at least 2 characters long."

Explanation:
"j" does not meet the minimum length requirement, and the error is displayed because the field has been touched.

Example 3: Password Complexity and Confirmation Mismatch

Input:
1. User enters "password123" in the Password field.
2. User enters "pass123" in the Confirm Password field.

Output:
- Under the Password field: An error message like "Password must contain at least one uppercase letter and one number."
- Under the Confirm Password field: An error message like "Passwords do not match."

Explanation:
The password "password123" fails the complexity requirement. The confirm password "pass123" does not match the (invalid) password. Both errors are displayed.

Example 4: Successful Form Submission

Input:
User correctly fills out all fields with valid data:
- First Name: "Jane"
- Last Name: "Doe"
- Email: "jane.doe@example.com"
- Password: "StrongP@ssword1"
- Confirm Password: "StrongP@ssword1"
User clicks the submit button.

Output:
- The console logs:
  { firstName: "Jane", lastName: "Doe", email: "jane.doe@example.com", password: "StrongP@ssword1", confirmPassword: "StrongP@ssword1" }
- The form is reset to its initial empty state.

Explanation:
All fields are valid, the password meets complexity requirements, and the confirmation matches. The form data is logged, and the form is cleared.

Constraints

  • Angular version: Latest stable version (e.g., Angular 16+).
  • TypeScript version: Latest stable version.
  • All validation logic must be implemented within the Angular component and its associated form setup.
  • Avoid using any third-party libraries specifically for form handling or validation.

Notes

  • Consider using Validators.pattern() for custom regular expression-based validation.
  • For asynchronous validation (like password complexity), you'll need to create a custom validator function that returns an Observable or a Promise.
  • Think about how to structure your HTML template to conditionally display error messages based on the form control's touched, dirty, and invalid states.
  • The password complexity check is a good place to practice asynchronous validation. You could simulate an asynchronous check by using setTimeout.
Loading editor...
typescript