Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
96cde3ca0d | ||
|
|
6ba0124779 |
File diff suppressed because it is too large
Load Diff
1089
canvas/examples/validation_5.rs
Normal file
1089
canvas/examples/validation_5.rs
Normal file
File diff suppressed because it is too large
Load Diff
@@ -134,6 +134,24 @@ impl<D: DataProvider> FormEditor<D> {
|
|||||||
&self.ui_state
|
&self.ui_state
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set external validation state for a field (Feature 5)
|
||||||
|
#[cfg(feature = "validation")]
|
||||||
|
pub fn set_external_validation(
|
||||||
|
&mut self,
|
||||||
|
field_index: usize,
|
||||||
|
state: crate::validation::ExternalValidationState,
|
||||||
|
) {
|
||||||
|
self.ui_state
|
||||||
|
.validation
|
||||||
|
.set_external_validation(field_index, state);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Clear external validation state for a field (Feature 5)
|
||||||
|
#[cfg(feature = "validation")]
|
||||||
|
pub fn clear_external_validation(&mut self, field_index: usize) {
|
||||||
|
self.ui_state.validation.clear_external_validation(field_index);
|
||||||
|
}
|
||||||
|
|
||||||
/// Get effective display text for any field index.
|
/// Get effective display text for any field index.
|
||||||
///
|
///
|
||||||
/// Policies:
|
/// Policies:
|
||||||
|
|||||||
@@ -22,6 +22,9 @@ pub struct ValidationConfig {
|
|||||||
#[cfg(feature = "validation")]
|
#[cfg(feature = "validation")]
|
||||||
pub custom_formatter: Option<Arc<dyn CustomFormatter + Send + Sync>>,
|
pub custom_formatter: Option<Arc<dyn CustomFormatter + Send + Sync>>,
|
||||||
|
|
||||||
|
/// Enable external validation indicator UI (feature 5)
|
||||||
|
pub external_validation_enabled: bool,
|
||||||
|
|
||||||
/// Future: External validation
|
/// Future: External validation
|
||||||
pub external_validation: Option<()>, // Placeholder for future implementation
|
pub external_validation: Option<()>, // Placeholder for future implementation
|
||||||
}
|
}
|
||||||
@@ -47,6 +50,7 @@ impl std::fmt::Debug for ValidationConfig {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
.field("external_validation_enabled", &self.external_validation_enabled)
|
||||||
.field("external_validation", &self.external_validation)
|
.field("external_validation", &self.external_validation)
|
||||||
.finish()
|
.finish()
|
||||||
}
|
}
|
||||||
@@ -285,6 +289,12 @@ impl ValidationConfigBuilder {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Enable or disable external validation indicator UI (feature 5)
|
||||||
|
pub fn with_external_validation_enabled(mut self, enabled: bool) -> Self {
|
||||||
|
self.config.external_validation_enabled = enabled;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Build the final validation configuration
|
/// Build the final validation configuration
|
||||||
pub fn build(self) -> ValidationConfig {
|
pub fn build(self) -> ValidationConfig {
|
||||||
self.config
|
self.config
|
||||||
|
|||||||
@@ -16,6 +16,16 @@ pub use patterns::{PatternFilters, PositionFilter, PositionRange, CharacterFilte
|
|||||||
pub use mask::DisplayMask; // Simple mask instead of ReservedCharacters
|
pub use mask::DisplayMask; // Simple mask instead of ReservedCharacters
|
||||||
pub use formatting::{CustomFormatter, FormattingResult, PositionMapper, DefaultPositionMapper};
|
pub use formatting::{CustomFormatter, FormattingResult, PositionMapper, DefaultPositionMapper};
|
||||||
|
|
||||||
|
/// External validation UI state (Feature 5)
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
pub enum ExternalValidationState {
|
||||||
|
NotValidated,
|
||||||
|
Validating,
|
||||||
|
Valid(Option<String>),
|
||||||
|
Invalid { message: String, suggestion: Option<String> },
|
||||||
|
Warning { message: String },
|
||||||
|
}
|
||||||
|
|
||||||
/// Validation error types
|
/// Validation error types
|
||||||
#[derive(Debug, Clone, thiserror::Error)]
|
#[derive(Debug, Clone, thiserror::Error)]
|
||||||
pub enum ValidationError {
|
pub enum ValidationError {
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
// src/validation/state.rs
|
// src/validation/state.rs
|
||||||
//! Validation state management
|
//! Validation state management
|
||||||
|
|
||||||
use crate::validation::{ValidationConfig, ValidationResult};
|
use crate::validation::{ValidationConfig, ValidationResult, ExternalValidationState};
|
||||||
#[cfg(feature = "validation")]
|
|
||||||
use crate::validation::{PositionMapper};
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
/// Validation state for all fields in a form
|
/// Validation state for all fields in a form
|
||||||
@@ -20,6 +18,9 @@ pub struct ValidationState {
|
|||||||
|
|
||||||
/// Global validation enabled/disabled
|
/// Global validation enabled/disabled
|
||||||
enabled: bool,
|
enabled: bool,
|
||||||
|
|
||||||
|
/// External validation results per field (Feature 5)
|
||||||
|
external_results: HashMap<usize, ExternalValidationState>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ValidationState {
|
impl ValidationState {
|
||||||
@@ -30,6 +31,7 @@ impl ValidationState {
|
|||||||
field_results: HashMap::new(),
|
field_results: HashMap::new(),
|
||||||
validated_fields: std::collections::HashSet::new(),
|
validated_fields: std::collections::HashSet::new(),
|
||||||
enabled: true,
|
enabled: true,
|
||||||
|
external_results: HashMap::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,6 +42,7 @@ impl ValidationState {
|
|||||||
// Clear all validation results when disabled
|
// Clear all validation results when disabled
|
||||||
self.field_results.clear();
|
self.field_results.clear();
|
||||||
self.validated_fields.clear();
|
self.validated_fields.clear();
|
||||||
|
self.external_results.clear(); // Also clear external results
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,12 +53,13 @@ impl ValidationState {
|
|||||||
|
|
||||||
/// Set validation configuration for a field
|
/// Set validation configuration for a field
|
||||||
pub fn set_field_config(&mut self, field_index: usize, config: ValidationConfig) {
|
pub fn set_field_config(&mut self, field_index: usize, config: ValidationConfig) {
|
||||||
if config.has_validation() {
|
if config.has_validation() || config.external_validation_enabled {
|
||||||
self.field_configs.insert(field_index, config);
|
self.field_configs.insert(field_index, config);
|
||||||
} else {
|
} else {
|
||||||
self.field_configs.remove(&field_index);
|
self.field_configs.remove(&field_index);
|
||||||
self.field_results.remove(&field_index);
|
self.field_results.remove(&field_index);
|
||||||
self.validated_fields.remove(&field_index);
|
self.validated_fields.remove(&field_index);
|
||||||
|
self.external_results.remove(&field_index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,6 +73,30 @@ impl ValidationState {
|
|||||||
self.field_configs.remove(&field_index);
|
self.field_configs.remove(&field_index);
|
||||||
self.field_results.remove(&field_index);
|
self.field_results.remove(&field_index);
|
||||||
self.validated_fields.remove(&field_index);
|
self.validated_fields.remove(&field_index);
|
||||||
|
self.external_results.remove(&field_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Set external validation state for a field (Feature 5)
|
||||||
|
pub fn set_external_validation(&mut self, field_index: usize, state: ExternalValidationState) {
|
||||||
|
self.external_results.insert(field_index, state);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get current external validation state for a field
|
||||||
|
pub fn get_external_validation(&self, field_index: usize) -> ExternalValidationState {
|
||||||
|
self.external_results
|
||||||
|
.get(&field_index)
|
||||||
|
.cloned()
|
||||||
|
.unwrap_or(ExternalValidationState::NotValidated)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Clear external validation state for a field
|
||||||
|
pub fn clear_external_validation(&mut self, field_index: usize) {
|
||||||
|
self.external_results.remove(&field_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Clear all external validation states
|
||||||
|
pub fn clear_all_external_validation(&mut self) {
|
||||||
|
self.external_results.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Validate character insertion for a field
|
/// Validate character insertion for a field
|
||||||
@@ -131,7 +159,7 @@ impl ValidationState {
|
|||||||
&self,
|
&self,
|
||||||
field_index: usize,
|
field_index: usize,
|
||||||
raw: &str,
|
raw: &str,
|
||||||
) -> Option<(String, std::sync::Arc<dyn PositionMapper>, Option<String>)> {
|
) -> Option<(String, std::sync::Arc<dyn crate::validation::PositionMapper>, Option<String>)> {
|
||||||
let config = self.field_configs.get(&field_index)?;
|
let config = self.field_configs.get(&field_index)?;
|
||||||
config.run_custom_formatter(raw)
|
config.run_custom_formatter(raw)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user