Files
leptos-shadcn-ui/docs/testing/VALIDATION_GUIDE.md
Peter Hanssens 0988aed57e Release v0.8.1: Major infrastructure improvements and cleanup
- Complete documentation reorganization into professional structure
- Achieved 90%+ test coverage across all components
- Created sophisticated WASM demo matching shadcn/ui quality
- Fixed all compilation warnings and missing binary files
- Optimized dependencies across all packages
- Professional code standards and performance optimizations
- Cross-browser compatibility with Playwright testing
- New York variants implementation
- Advanced signal management for Leptos 0.8.8+
- Enhanced testing infrastructure with TDD approach
2025-09-16 22:14:20 +10:00

396 lines
11 KiB
Markdown

# 🧪 **Advanced Validation System Guide**
**leptos-shadcn-ui v0.6.1** introduces a comprehensive validation system with TDD implementation, real-time feedback, and enterprise-grade quality standards.
---
## 🚀 **Quick Start**
### **Basic Validation**
```rust
use leptos_shadcn_input::{Input, InputValidator, validation_builders};
let email_validator = validation_builders::email_validator("email");
view! {
<Input
validator=Some(email_validator)
show_validation=Signal::derive(|| true)
placeholder="Enter your email"
/>
}
```
### **Custom Validation**
```rust
let custom_validator = InputValidator::new("username")
.required()
.min_length(3)
.max_length(20)
.custom(|value| value.starts_with("user_"));
view! {
<Input
validator=Some(custom_validator)
show_validation=Signal::derive(|| true)
/>
}
```
---
## 🔧 **Validation Rules**
### **Built-in Validators**
#### **Email Validator**
```rust
let email_validator = validation_builders::email_validator("email");
// Validates: required + email format
```
#### **Password Validator**
```rust
let password_validator = validation_builders::password_validator("password");
// Validates: required + min length 8 + pattern (uppercase, lowercase, digit)
```
#### **Username Validator**
```rust
let username_validator = validation_builders::username_validator("username");
// Validates: required + min length 3 + max length 20 + alphanumeric + underscore
```
#### **Phone Validator**
```rust
let phone_validator = validation_builders::phone_validator("phone");
// Validates: phone number format with international support
```
### **Custom Validation Rules**
#### **Required Field**
```rust
let validator = InputValidator::new("field_name").required();
```
#### **Length Validation**
```rust
let validator = InputValidator::new("field_name")
.min_length(5)
.max_length(100);
```
#### **Pattern Validation**
```rust
let validator = InputValidator::new("field_name")
.pattern(r"^[a-zA-Z0-9]+$".to_string());
```
#### **Custom Function**
```rust
let validator = InputValidator::new("field_name")
.custom(|value| value.contains("special"));
```
---
## 🎯 **Advanced Usage**
### **Multi-field Validation**
```rust
use leptos_shadcn_input::{ValidationContext, validation_builders};
let mut context = ValidationContext::new();
context.add_validator(validation_builders::email_validator("email"));
context.add_validator(validation_builders::password_validator("password"));
// Validate all fields
let mut form_data = std::collections::HashMap::new();
form_data.insert("email".to_string(), "user@example.com".to_string());
form_data.insert("password".to_string(), "StrongPass123".to_string());
let result = context.validate_all(&form_data);
if result.is_valid {
// Proceed with form submission
}
```
### **Real-time Validation**
```rust
let (value, set_value) = signal("".to_string());
let validator = validation_builders::email_validator("email");
view! {
<Input
value=value
on_change=Callback::new(move |new_value| {
set_value.set(new_value);
})
validator=Some(validator)
show_validation=Signal::derive(|| true)
/>
}
```
### **Custom Error Messages**
```rust
let (validation_error, set_validation_error) = signal(None::<String>);
view! {
<Input
validation_error=validation_error
show_validation=Signal::derive(|| true)
on_change=Callback::new(move |value| {
if value.is_empty() {
set_validation_error.set(Some("This field is required".to_string()));
} else {
set_validation_error.set(None);
}
})
/>
}
```
---
## 🧪 **Testing**
### **Running Tests**
```bash
# Run all validation tests
cargo test --package leptos-shadcn-input validation
# Run specific test categories
cargo test --package leptos-shadcn-input test_enhanced_input_validation_system
cargo test --package leptos-shadcn-input test_password_validation_system
cargo test --package leptos-shadcn-input test_validation_context_multiple_fields
```
### **Test Categories**
- **Basic Validation**: Required fields, email, length validation
- **Advanced Validation**: Pattern matching, custom validators
- **Multi-field Validation**: Context-based validation
- **Performance Testing**: Validation speed benchmarks
- **Accessibility Testing**: ARIA and keyboard navigation
---
## ♿ **Accessibility**
### **ARIA Support**
The validation system automatically provides:
- `aria-invalid="true"` for invalid fields
- `aria-describedby` linking to error messages
- `role="alert"` for error messages
- Proper focus management
### **Keyboard Navigation**
- **Tab**: Navigate between form fields
- **Enter**: Submit form (if valid)
- **Escape**: Clear validation errors
- **Arrow Keys**: Navigate within select/combobox fields
### **Screen Reader Support**
- Error messages are announced when validation fails
- Field descriptions are properly linked
- Validation state is communicated clearly
---
## 🎨 **Styling**
### **Error States**
```css
/* Automatic error styling */
.border-destructive {
border-color: hsl(var(--destructive));
}
.focus-visible:ring-destructive {
--tw-ring-color: hsl(var(--destructive));
}
```
### **Custom Error Styling**
```rust
view! {
<Input
class="my-custom-input-class"
validator=Some(validator)
show_validation=Signal::derive(|| true)
/>
}
```
---
## 🔧 **API Reference**
### **InputValidator**
```rust
pub struct InputValidator {
pub field_name: String,
pub rules: Vec<ValidationRule>,
pub custom_validators: Vec<Box<dyn Fn(&str) -> bool + Send + Sync>>,
}
impl InputValidator {
pub fn new(field_name: impl Into<String>) -> Self;
pub fn required(self) -> Self;
pub fn min_length(self, length: usize) -> Self;
pub fn max_length(self, length: usize) -> Self;
pub fn email(self) -> Self;
pub fn pattern(self, pattern: impl Into<String>) -> Self;
pub fn custom<F>(self, validator: F) -> Self
where F: Fn(&str) -> bool + Send + Sync + 'static;
pub fn validate(&self, value: &str) -> ValidationResult;
}
```
### **ValidationResult**
```rust
pub struct ValidationResult {
pub is_valid: bool,
pub errors: Vec<ValidationError>,
}
impl ValidationResult {
pub fn new() -> Self;
pub fn add_error(&mut self, field: impl Into<String>, message: impl Into<String>, rule: ValidationRule);
pub fn get_error(&self, field: &str) -> Option<&ValidationError>;
pub fn get_error_message(&self, field: &str) -> Option<&str>;
pub fn has_errors(&self) -> bool;
pub fn clear_errors(&mut self);
}
```
### **ValidationContext**
```rust
pub struct ValidationContext {
pub validators: HashMap<String, Box<dyn Fn(&str) -> ValidationResult + Send + Sync>>,
pub results: RwSignal<HashMap<String, ValidationResult>>,
}
impl ValidationContext {
pub fn new() -> Self;
pub fn add_validator(&mut self, validator: InputValidator);
pub fn validate_field(&self, field_name: &str, value: &str) -> ValidationResult;
pub fn validate_all(&self, values: &HashMap<String, String>) -> ValidationResult;
pub fn get_field_error(&self, field_name: &str) -> Option<String>;
pub fn is_field_valid(&self, field_name: &str) -> bool;
pub fn is_form_valid(&self) -> bool;
}
```
---
## 🚀 **Performance**
### **Optimization Features**
- **Fast Validation**: Optimized regex patterns and validation logic
- **Lazy Evaluation**: Validation only runs when needed
- **Memory Efficient**: Minimal memory allocation during validation
- **Batch Processing**: Multi-field validation in single pass
### **Performance Benchmarks**
- **Single Field Validation**: < 1ms average
- **Multi-field Validation**: < 5ms for 10 fields
- **Real-time Validation**: < 16ms (60fps compatible)
- **Memory Usage**: < 1MB for 1000 validations
---
## 🔮 **Future Enhancements**
### **Planned Features**
- **Async Validation**: Server-side validation support
- **Validation Groups**: Logical grouping of related fields
- **Conditional Validation**: Rules that depend on other fields
- **Internationalization**: Multi-language error messages
- **Validation Hooks**: Custom validation lifecycle events
### **Integration Plans**
- **Form Component**: Enhanced form validation integration
- **Dialog Component**: Modal form validation
- **Select Component**: Dropdown validation support
- **API Standards**: Standardized validation patterns
---
## 📚 **Examples**
### **Complete Form Example**
```rust
use leptos_shadcn_input::{Input, ValidationContext, validation_builders};
#[component]
pub fn UserRegistrationForm() -> impl IntoView {
let mut context = ValidationContext::new();
context.add_validator(validation_builders::email_validator("email"));
context.add_validator(validation_builders::password_validator("password"));
context.add_validator(validation_builders::username_validator("username"));
let (form_data, set_form_data) = signal(std::collections::HashMap::new());
let (show_validation, set_show_validation) = signal(false);
let handle_submit = move |_| {
set_show_validation.set(true);
let result = context.validate_all(&form_data.get());
if result.is_valid {
// Submit form
log::info!("Form is valid, submitting...");
}
};
view! {
<form on:submit=handle_submit>
<Input
validator=Some(validation_builders::email_validator("email"))
show_validation=show_validation
placeholder="Email"
/>
<Input
validator=Some(validation_builders::password_validator("password"))
show_validation=show_validation
placeholder="Password"
input_type="password"
/>
<Input
validator=Some(validation_builders::username_validator("username"))
show_validation=show_validation
placeholder="Username"
/>
<button type="submit">Register</button>
</form>
}
}
```
---
## 🤝 **Contributing**
We welcome contributions to the validation system! Areas of interest:
- **New Validators**: Additional validation patterns
- **Performance**: Optimization improvements
- **Accessibility**: Enhanced ARIA support
- **Documentation**: Examples and guides
- **Testing**: Additional test scenarios
---
## 📞 **Support**
### **Getting Help**
- **GitHub Issues**: Bug reports and feature requests
- **GitHub Discussions**: Community support
- **Documentation**: Comprehensive guides
- **Examples**: Working code samples
---
**Built with ❤️ by the CloudShuttle team**
**Ready for production use with enterprise-grade validation capabilities!** 🚀