2025-12-18 01:11:17 +00:00
|
|
|
# Form Fragments & Composition
|
|
|
|
|
|
2025-12-21 14:04:24 +00:00
|
|
|
Reusable form components, modular form building, and constraint management.
|
2025-12-18 01:11:17 +00:00
|
|
|
|
|
|
|
|
## Files
|
|
|
|
|
|
|
|
|
|
### Fragments (Reusable Components)
|
|
|
|
|
- **header.toml** - Header/intro section
|
|
|
|
|
- **custom_border_section.toml** - Styled section template
|
|
|
|
|
- **fancy_border_section.toml** - Advanced border styling
|
|
|
|
|
- **employee_info_section.toml** - Employee data fields
|
|
|
|
|
- **agreement_section.toml** - Legal/policy acceptance
|
|
|
|
|
- **support_section.toml** - Support tier selection
|
|
|
|
|
- **premium_section.toml** - Premium features section
|
|
|
|
|
- **enterprise_section.toml** - Enterprise tier section
|
|
|
|
|
|
|
|
|
|
### Examples Using Fragments
|
|
|
|
|
- **form_with_groups_includes.toml** - Demonstrates fragment inclusion
|
2025-12-21 14:04:24 +00:00
|
|
|
- **array-trackers.toml** - RepeatingGroup arrays with constraint interpolation
|
|
|
|
|
|
|
|
|
|
### Constraint Configuration
|
|
|
|
|
- **constraints.toml** - Single source of truth for array validation limits
|
2025-12-18 01:11:17 +00:00
|
|
|
|
|
|
|
|
## Usage Pattern
|
|
|
|
|
|
|
|
|
|
### Include Fragments in Your Forms
|
|
|
|
|
|
|
|
|
|
```toml
|
|
|
|
|
# main_form.toml
|
|
|
|
|
[includes]
|
|
|
|
|
header = "fragments/header.toml"
|
|
|
|
|
employee = "fragments/employee_info_section.toml"
|
|
|
|
|
agreement = "fragments/agreement_section.toml"
|
|
|
|
|
|
|
|
|
|
[sections.main]
|
|
|
|
|
title = "Employee Onboarding"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Build Complex Forms from Reusable Parts
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Each fragment can be tested independently
|
|
|
|
|
cargo run --example form_with_groups_includes
|
|
|
|
|
```
|
|
|
|
|
|
2025-12-21 14:04:24 +00:00
|
|
|
## Constraint Interpolation Example
|
|
|
|
|
|
|
|
|
|
### What is Constraint Interpolation?
|
|
|
|
|
|
|
|
|
|
Instead of hardcoding validation limits in forms, you can use constraint variables:
|
|
|
|
|
|
|
|
|
|
```toml
|
|
|
|
|
# array-trackers.toml
|
|
|
|
|
[[elements]]
|
|
|
|
|
name = "udp_trackers"
|
|
|
|
|
type = "repeatinggroup"
|
|
|
|
|
max_items = "${constraint.tracker.udp.max_items}" # ← Dynamic constraint reference
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Single Source of Truth
|
|
|
|
|
|
|
|
|
|
All validation limits are defined in **one file**:
|
|
|
|
|
|
|
|
|
|
```toml
|
|
|
|
|
# constraints.toml
|
|
|
|
|
[tracker.udp]
|
|
|
|
|
max_items = 4 # Change this value, form auto-updates!
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### How It Works
|
|
|
|
|
|
|
|
|
|
1. **Form loads** - `array-trackers.toml` contains `"${constraint.tracker.udp.max_items}"`
|
|
|
|
|
2. **Parser resolves** - Form parser finds `constraints.toml` in same directory
|
|
|
|
|
3. **Value injected** - The constraint value (4) replaces the placeholder
|
|
|
|
|
4. **Form validates** - User can add up to 4 UDP trackers
|
|
|
|
|
|
|
|
|
|
### Try It
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Run the example
|
|
|
|
|
cargo run --example array-trackers
|
|
|
|
|
|
|
|
|
|
# The form will allow:
|
|
|
|
|
# - 0-4 UDP trackers (from constraints.tracker.udp.max_items)
|
|
|
|
|
# - 0-4 HTTP trackers (from constraints.tracker.http.max_items)
|
|
|
|
|
|
|
|
|
|
# Change constraints.toml:
|
|
|
|
|
# [tracker.udp]
|
|
|
|
|
# max_items = 6 # ← Change from 4 to 6
|
|
|
|
|
#
|
|
|
|
|
# Re-run the example - form now allows 0-6 UDP trackers!
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Key Files
|
|
|
|
|
|
|
|
|
|
- **constraints.toml** - Defines validation limits
|
|
|
|
|
- **array-trackers.toml** - References constraints via `${constraint.path}`
|
|
|
|
|
- Form parser automatically resolves interpolations at load time
|
|
|
|
|
|
|
|
|
|
## Benefits of Constraints
|
2025-12-18 01:11:17 +00:00
|
|
|
|
|
|
|
|
- **DRY** - Write common sections once
|
|
|
|
|
- **Maintainability** - Update fragments in one place
|
|
|
|
|
- **Reusability** - Share across multiple forms
|
|
|
|
|
- **Modularity** - Compose complex forms from simple parts
|
|
|
|
|
- **Consistency** - Unified styling and structure
|
2025-12-21 14:04:24 +00:00
|
|
|
- **Constraint Sync** - Single place to change validation limits (all layers auto-sync)
|
2025-12-18 01:11:17 +00:00
|
|
|
|
|
|
|
|
## Fragment Library
|
|
|
|
|
|
|
|
|
|
Use these as templates for your own fragments:
|
|
|
|
|
|
|
|
|
|
| Fragment | Purpose | Fields |
|
|
|
|
|
|----------|---------|--------|
|
|
|
|
|
| header | Form introduction | Title, description |
|
|
|
|
|
| employee_info | Standard employee data | Name, email, phone |
|
|
|
|
|
| agreement | Policy acceptance | Checkbox, text |
|
|
|
|
|
| support | Tier selection | Radio buttons |
|
|
|
|
|
| border_section | Custom styled container | Any fields |
|