orbital_base_components/form/rules/
select.rs1use std::ops::Deref;
2
3use leptos::prelude::*;
4
5use super::{FieldValidationState, Rule};
6
7#[derive(Debug, Default, PartialEq, Clone, Copy)]
8pub enum SelectRuleTrigger {
9 #[default]
10 Change,
11}
12
13pub struct SelectRule(Rule<String, SelectRuleTrigger>);
14
15impl SelectRule {
16 pub fn required(required: Signal<bool>) -> Self {
17 Self::validator(move |value, name| {
18 if required.get_untracked() && value.is_empty() {
19 let message = name.get_untracked().map_or_else(
20 || String::from("Please select!"),
21 |name| format!("Please select {name}!"),
22 );
23 Err(FieldValidationState::Error(message))
24 } else {
25 Ok(())
26 }
27 })
28 }
29
30 pub fn required_with_message(required: Signal<bool>, message: Signal<String>) -> Self {
31 Self::validator(move |value, _| {
32 if required.get_untracked() && value.is_empty() {
33 Err(FieldValidationState::Error(message.get_untracked()))
34 } else {
35 Ok(())
36 }
37 })
38 }
39
40 pub fn validator(
41 f: impl Fn(&String, Signal<Option<String>>) -> Result<(), FieldValidationState>
42 + Send
43 + Sync
44 + 'static,
45 ) -> Self {
46 Self(Rule::validator(f))
47 }
48
49 pub fn with_trigger(self, trigger: SelectRuleTrigger) -> Self {
50 Self(Rule::with_trigger(self.0, trigger))
51 }
52}
53
54impl Deref for SelectRule {
55 type Target = Rule<String, SelectRuleTrigger>;
56
57 fn deref(&self) -> &Self::Target {
58 &self.0
59 }
60}