use crate::{class::Class, format_class};
use dioxus::prelude::*;
use zino_core::SharedString;
pub fn FormFieldContainer(props: FormFieldContainerProps) -> Element {
let class = format_class!(props, "field is-horizontal");
let field_label_class = format_class!(props, field_label_class, "field-label");
let field_body_class = format_class!(props, field_body_class, "field-body");
let label_class = format_class!(props, label_class, "label");
rsx! {
div {
class: "{class}",
div {
class: "{field_label_class}",
label {
class: "{label_class}",
"{props.label}"
}
}
div {
class: "{field_body_class}",
{ props.children }
}
}
}
}
#[derive(Clone, PartialEq, Props)]
pub struct FormFieldContainerProps {
#[props(into)]
pub class: Option<Class>,
#[props(into)]
pub field_label_class: Option<Class>,
#[props(into)]
pub field_body_class: Option<Class>,
#[props(into)]
pub label_class: Option<Class>,
#[props(into)]
pub label: SharedString,
children: Element,
}
pub fn FormField(props: FormFieldProps) -> Element {
let class = format_class!(props, "field");
let control_class = format_class!(props, control_class, "control");
let expanded_class = Class::check("is-expanded", props.expanded);
rsx! {
div {
class: "{class}",
div {
class: "{control_class} {expanded_class}",
{ props.children }
}
}
}
}
#[derive(Clone, PartialEq, Props)]
pub struct FormFieldProps {
#[props(into)]
pub class: Option<Class>,
#[props(into)]
pub control_class: Option<Class>,
#[props(default = false)]
pub expanded: bool,
children: Element,
}
pub fn FormGroup(props: FormGroupProps) -> Element {
let class = format_class!(props, "field is-grouped");
let container_class = if let Some(prop) = props.float {
match prop.as_ref() {
"left" => format!("{class} is-pulled-left").into(),
"right" => format!("{class} is-pulled-right").into(),
_ => class,
}
} else {
class
};
let control_class = format_class!(props, control_class, "control");
rsx! {
div {
class: "{container_class}",
for item in props.items.iter() {
div {
class: "{control_class}",
{ item }
}
}
}
}
}
#[derive(Clone, PartialEq, Props)]
pub struct FormGroupProps {
#[props(into)]
pub class: Option<Class>,
#[props(into)]
pub control_class: Option<Class>,
pub float: Option<SharedString>,
#[props(into)]
pub items: Vec<Element>,
}
pub fn FormAddons(props: FormAddonsProps) -> Element {
let class = format_class!(props, "field has-addons");
let control_class = format_class!(props, control_class, "control");
let expand = props.expand;
let items = props.items.iter().enumerate().map(|(index, item)| {
let expand_class = Class::check("is-expanded", expand == index + 1);
(expand_class, item)
});
rsx! {
div {
class: "{class}",
for (expand_class, item) in items {
div {
class: "{control_class} {expand_class}",
{ item }
}
}
}
}
}
#[derive(Clone, PartialEq, Props)]
pub struct FormAddonsProps {
#[props(into)]
pub class: Option<Class>,
#[props(into)]
pub control_class: Option<Class>,
pub expand: usize,
#[props(into)]
pub items: Vec<Element>,
}