zino_dioxus/form/
field.rs1use crate::class::Class;
2use dioxus::prelude::*;
3use zino_core::SharedString;
4
5pub fn FieldContainer(props: FieldContainerProps) -> Element {
7 let required_mark = props.required_mark;
8 rsx! {
9 div {
10 class: props.class,
11 label {
12 class: props.label_class,
13 { props.label.into_owned() }
14 if !required_mark.is_empty() {
15 span {
16 class: props.mark_class,
17 { required_mark.into_owned() }
18 }
19 }
20 }
21 div {
22 class: props.control_class,
23 { props.children }
24 }
25 if let Some(help_text) = props.help_text {
26 p {
27 class: props.help_class,
28 { help_text }
29 }
30 }
31 }
32 }
33}
34
35#[derive(Clone, PartialEq, Props)]
37pub struct FieldContainerProps {
38 #[props(into, default = "field")]
40 pub class: Class,
41 #[props(into, default = "label")]
43 pub label_class: Class,
44 #[props(into, default = "control")]
46 pub control_class: Class,
47 #[props(into, default = "has-text-danger")]
49 pub mark_class: Class,
50 #[props(into, default = "help")]
52 pub help_class: Class,
53 #[props(into)]
55 pub label: SharedString,
56 #[props(into, default)]
58 pub required_mark: SharedString,
59 pub help_text: Option<Element>,
61 children: Element,
63}
64
65pub fn HorizontalFieldContainer(props: HorizontalFieldContainerProps) -> Element {
67 let required_mark = props.required_mark;
68 rsx! {
69 div {
70 class: props.class,
71 div {
72 class: props.field_label_class,
73 label {
74 class: props.label_class,
75 { props.label.into_owned() }
76 if !required_mark.is_empty() {
77 span {
78 class: props.mark_class,
79 { required_mark.into_owned() }
80 }
81 }
82 }
83 }
84 div {
85 class: props.field_body_class,
86 { props.children }
87 }
88 }
89 }
90}
91
92#[derive(Clone, PartialEq, Props)]
94pub struct HorizontalFieldContainerProps {
95 #[props(into, default = "field is-horizontal")]
97 pub class: Class,
98 #[props(into, default = "field-label")]
100 pub field_label_class: Class,
101 #[props(into, default = "field-body")]
103 pub field_body_class: Class,
104 #[props(into, default = "label")]
106 pub label_class: Class,
107 #[props(into, default = "has-text-danger")]
109 pub mark_class: Class,
110 #[props(into)]
112 pub label: SharedString,
113 #[props(into, default)]
115 pub required_mark: SharedString,
116 children: Element,
118}
119
120pub fn FormField(props: FormFieldProps) -> Element {
122 rsx! {
123 div {
124 class: props.class,
125 div {
126 class: "{props.control_class}",
127 class: if props.expanded { "is-expanded" },
128 { props.children }
129 }
130 if let Some(help_text) = props.help_text {
131 p {
132 class: props.help_class,
133 { help_text }
134 }
135 }
136 }
137 }
138}
139
140#[derive(Clone, PartialEq, Props)]
142pub struct FormFieldProps {
143 #[props(into, default = "field")]
145 pub class: Class,
146 #[props(into, default = "control")]
148 pub control_class: Class,
149 #[props(into, default = "help")]
151 pub help_class: Class,
152 #[props(default)]
154 pub expanded: bool,
155 pub help_text: Option<Element>,
157 children: Element,
159}
160
161pub fn FormGroup(props: FormGroupProps) -> Element {
163 rsx! {
164 div {
165 class: "{props.class}",
166 class: if props.align == "center" { "is-grouped-centered" },
167 class: if props.align == "right" { "is-grouped-right" },
168 for item in props.items.iter() {
169 div {
170 class: props.control_class.clone(),
171 { item }
172 }
173 }
174 }
175 }
176}
177
178#[derive(Clone, PartialEq, Props)]
180pub struct FormGroupProps {
181 #[props(into, default = "field is-grouped")]
183 pub class: Class,
184 #[props(into, default = "control")]
186 pub control_class: Class,
187 #[props(into, default)]
189 pub align: SharedString,
190 #[props(into)]
192 pub items: Vec<Element>,
193}
194
195pub fn FormAddons(props: FormAddonsProps) -> Element {
197 rsx! {
198 div {
199 class: props.class,
200 for (index, item) in props.items.iter().enumerate() {
201 div {
202 class: "{props.control_class}",
203 class: if props.expand == index + 1 { "is-expanded" },
204 { item }
205 }
206 }
207 }
208 }
209}
210
211#[derive(Clone, PartialEq, Props)]
213pub struct FormAddonsProps {
214 #[props(into, default = "field has-addons")]
216 pub class: Class,
217 #[props(into, default = "control")]
219 pub control_class: Class,
220 #[props(default = 0)]
222 pub expand: usize,
223 #[props(into)]
225 pub items: Vec<Element>,
226}