Skip to content

ibrahimkhalnimrawi/angular-dynamic-validation

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

2 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Dynamic Form Validation POC

A comprehensive Angular application demonstrating advanced reactive form validation with custom validators and dynamic error message handling.

Personal Project by Ibrahim Alnimrawi
πŸ“§ Contact: ibrahim.alnimrawi@hotmail.com

πŸš€ Features

βœ… Comprehensive Validation System

  • Basic Validators: Required fields, email validation, min/max length
  • File Upload Validators: File extension and size validation
  • Phone/Mobile Validators: Saudi Arabia phone number formats
  • Financial Validators: IBAN validation for Saudi Arabia
  • Password Validators: Complex password requirements and confirmation matching
  • Text Validators: Alphabetic, Arabic, and numeric-only validation
  • ID Validators: National ID validation for Saudi Arabia
  • URL Validators: HTTP/HTTPS URL validation

βœ… Dynamic Error Handling

  • Real-time Validation: Instant feedback as users type
  • Custom Error Messages: Localized error messages with dynamic parameters
  • Visual Feedback: Error borders and styling for invalid fields
  • State Management: Smart error display based on field state (dirty, touched, submitted)

βœ… Modern UI/UX

  • Bootstrap Integration: Responsive design with Bootstrap 5
  • Clean Interface: Organized sections with clear labels and placeholders
  • Form Status: Real-time form validation status display
  • Interactive Elements: Submit/Reset functionality with proper state handling

πŸ—οΈ Architecture

Project Structure

src/app/
β”œβ”€β”€ components/
β”‚   └── input-error.component.ts          # Error message display component
β”œβ”€β”€ directives/
β”‚   β”œβ”€β”€ dynamic-validator-message.directive.ts  # Dynamic validation directive
β”‚   └── validator-container.directive.ts         # Message container directive
β”œβ”€β”€ pipes/
β”‚   └── message.pipe.ts                  # Error message transformation pipe
β”œβ”€β”€ services/
β”‚   └── state-matcher.service.ts        # Validation state management
β”œβ”€β”€ validators/
β”‚   β”œβ”€β”€ _index.ts                       # Validator exports
β”‚   β”œβ”€β”€ alphabetic-with-special.validator.ts
β”‚   β”œβ”€β”€ arabic-alphabetic.validator.ts
β”‚   β”œβ”€β”€ arabic-alphabetic-with-spaces.validator.ts
β”‚   β”œβ”€β”€ complex-password.validator.ts
β”‚   β”œβ”€β”€ email-address.validator.ts
β”‚   β”œβ”€β”€ file.validator.ts
β”‚   β”œβ”€β”€ iban.validator.ts
β”‚   β”œβ”€β”€ mobile-number.validator.ts
β”‚   β”œβ”€β”€ mobile-or-phone-number.validator.ts
β”‚   β”œβ”€β”€ national-id.validator.ts
β”‚   β”œβ”€β”€ numbers-only.validator.ts
β”‚   β”œβ”€β”€ password-match.validator.ts
β”‚   β”œβ”€β”€ phone-number.validator.ts
β”‚   └── url.validator.ts
└── value-objects/
    └── validation-error-messages.token.ts  # Error message definitions

πŸ› οΈ Technology Stack

  • Angular 20: Latest Angular framework with standalone components
  • Reactive Forms: Advanced form handling with FormBuilder
  • TypeScript: Type-safe development
  • Bootstrap 5: Modern CSS framework for responsive design
  • RxJS: Reactive programming for form state management

πŸ“‹ Validators Overview

Basic Validators

Validator Description Example
required Field is mandatory Any non-empty value
email Valid email format user@example.com
minlength Minimum character count 5+ characters
maxlength Maximum character count ≀10 characters

File Validators

Validator Description Parameters
fileValidator File extension & size validation allowedExtensions: string[], maxFileSizeMB: number

Phone/Mobile Validators

Validator Description Format
phoneNumberValidator Saudi landline numbers 01xxxxxxxx
mobileNumberValidator Saudi mobile numbers 05xxxxxxxx
mobileOrPhoneNumberValidator Either mobile or landline 01xxxxxxxx or 05xxxxxxxx

Financial Validators

Validator Description Format
ibanValidator Saudi Arabia IBAN validation SA + 22 digits

Password Validators

Validator Description Requirements
complexPasswordValidator Strong password validation 8+ chars, uppercase, lowercase, number, special char
passwordMatchValidator Password confirmation Must match password field

Text Validators

Validator Description Allowed Characters
alphabeticWithSpecialValidator Letters, numbers, symbols a-zA-Z0-9\s\-_.,!@#$%^&*()
arabicAlphabeticValidator Arabic letters only \u0600-\u06FF
arabicAlphabeticWithSpacesValidator Arabic letters + spaces \u0600-\u06FF\s
numbersOnlyValidator Numeric input only 0-9

ID Validators

Validator Description Format
nationalIdValidator Saudi National ID 1 + 9 digits

URL Validators

Validator Description Format
urlValidator HTTP/HTTPS URLs https:// or http://

πŸš€ Getting Started

Prerequisites

  • Node.js (v18 or higher)
  • npm or yarn
  • Angular CLI

Installation

# Clone the repository
git clone <repository-url>
cd dynamic-form-validation

# Install dependencies
npm install

# Start development server
npm start

Build for Production

npm run build

🎯 Usage Examples

Basic Form Setup

import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { phoneNumberValidator, emailAddressValidator } from './validators/_index';

export class MyComponent {
  form: FormGroup;

  constructor(private fb: FormBuilder) {
    this.form = this.fb.group({
      email: ['', [Validators.required, emailAddressValidator]],
      phone: ['', phoneNumberValidator],
      password: ['', complexPasswordValidator],
      confirmPassword: ['', Validators.required]
    }, { validators: passwordMatchValidator });
  }
}

Template Integration

<form [formGroup]="form" MessageContainer>
  <div class="mb-3">
    <label for="email" class="form-label">Email</label>
    <input 
      type="email" 
      id="email"
      class="form-control" 
      formControlName="email"
      placeholder="Enter your email">
  </div>
  
  <button type="submit" [disabled]="form.invalid">
    Submit
  </button>
</form>

πŸ”§ Customization

Adding New Validators

  1. Create validator file in src/app/validators/
  2. Export validator from _index.ts
  3. Add error message to validation-error-messages.token.ts
  4. Use in form definition

Custom Error Messages

// In validation-error-messages.token.ts
export const ERROR_MESSAGES = {
  customValidator: ({ minValue }) => `Value must be at least ${minValue}`,
  // ... other messages
};

Styling Customization

/* Custom error styling */
.text-danger {
  color: #dc3545;
  font-size: 0.875rem;
  margin-top: 0.25rem;
}

.form-control.text-danger {
  border-color: #dc3545;
  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
}

πŸ§ͺ Testing

Manual Testing Scenarios

  1. Required Fields: Leave empty and verify error messages
  2. Email Validation: Test invalid email formats
  3. Phone Numbers: Test various phone number formats
  4. File Upload: Test file size and extension restrictions
  5. Password Strength: Test password complexity requirements
  6. Password Matching: Test password confirmation validation

Test Data Examples

// Valid test data
const validData = {
  requiredField: 'Test Value',
  emailField: 'test@example.com',
  phoneNumber: '0123456789',
  mobileNumber: '0512345678',
  ibanField: 'SA0380000000608010167519',
  password: 'MySecure123!',
  confirmPassword: 'MySecure123!',
  nationalId: '1234567890',
  websiteUrl: 'https://example.com'
};

πŸ“š API Reference

DynamicValidatorMessage Directive

  • Selector: [formControl]:not([withoutValidation])
  • Purpose: Automatically handles validation display for form controls
  • Features: Error borders, dynamic error messages, state management

MessageContainer Directive

  • Selector: [MessageContainer]
  • Purpose: Provides container for error message components
  • Usage: Applied to form element

StateMatcher Service

  • Purpose: Determines when to show validation errors
  • Methods: isErrorVisible(control, form)
  • Behavior: Shows errors when field is dirty/touched and form is submitted

πŸ“„ License

This is a personal project created for demonstration and learning purposes.

πŸ™ Acknowledgments

  • Angular Team for the excellent framework
  • Bootstrap Team for the CSS framework
  • Open source community for inspiration and resources

πŸ“ž Contact & Support

Project Author: Ibrahim Alnimrawi
πŸ“§ Email: ibrahim.alnimrawi@hotmail.com

For questions, feedback, or collaboration opportunities, feel free to reach out!


Built with ❀️ by Ibrahim Alnimrawi using Angular 20

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published