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