use crate::class::Class;
use dioxus::prelude::*;
use zino_core::SharedString;
pub fn FormFieldContainer(props: FormFieldContainerProps) -> Element {
let class = props.class;
let field_label_class = props.field_label_class;
let field_body_class = props.field_body_class;
let label_class = props.label_class;
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, default = "field is-horizontal".into())]
pub class: Class,
#[props(into, default = "field-label".into())]
pub field_label_class: Class,
#[props(into, default = "field-body".into())]
pub field_body_class: Class,
#[props(into, default = "label".into())]
pub label_class: Class,
#[props(into)]
pub label: SharedString,
children: Element,
}
pub fn FormField(props: FormFieldProps) -> Element {
let class = props.class;
let control_class = props.control_class;
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, default = "field".into())]
pub class: Class,
#[props(into, default = "control".into())]
pub control_class: Class,
#[props(default = false)]
pub expanded: bool,
children: Element,
}
pub fn FormGroup(props: FormGroupProps) -> Element {
let class = props.class;
let container_class = match props.align.as_ref() {
"center" => format!("{class} is-grouped-centered"),
"right" => format!("{class} is-grouped-right"),
_ => class.to_string(),
};
let control_class = props.control_class;
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, default = "field is-grouped".into())]
pub class: Class,
#[props(into, default = "control".into())]
pub control_class: Class,
#[props(into, default = "left".into())]
pub align: SharedString,
#[props(into)]
pub items: Vec<Element>,
}
pub fn FormAddons(props: FormAddonsProps) -> Element {
let class = props.class;
let control_class = props.control_class;
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, default = "field has-addons".into())]
pub class: Class,
#[props(into, default = "control".into())]
pub control_class: Class,
pub expand: usize,
#[props(into)]
pub items: Vec<Element>,
}