use crate::prelude::{Divider, DividerType, OuiaComponentType};
use crate::utils::{Ouia, OuiaSafe};
use yew::prelude::*;
const OUIA: Ouia = ouia!("Card");
mod actions;
mod body;
mod expandable_content;
mod footer;
mod header;
mod selectable_actions;
mod title;
use crate::ouia;
pub use actions::*;
pub use body::*;
pub use expandable_content::*;
pub use footer::*;
pub use header::*;
pub use selectable_actions::*;
pub use title::*;
#[derive(Debug, Clone, Copy, Default, PartialEq)]
pub enum CardSize {
#[default]
Default,
Compact,
Large,
}
#[derive(Clone, PartialEq, Properties)]
pub struct CardProperties {
#[prop_or_default]
pub children: Html,
#[prop_or_default]
pub id: AttrValue,
#[prop_or_default]
pub class: Classes,
#[prop_or(String::from("div"))]
pub component: String,
#[prop_or_default]
pub size: CardSize,
#[prop_or_default]
pub selectable: bool,
#[prop_or_default]
pub selected: bool,
#[prop_or_default]
pub clickable: bool,
#[prop_or_default]
pub disabled: bool,
#[prop_or_default]
pub flat: bool,
#[prop_or_default]
pub full_height: bool,
#[prop_or_default]
pub plain: bool,
#[prop_or_default]
pub expanded: bool,
#[prop_or_default]
pub style: Option<AttrValue>,
#[prop_or_default]
pub ouia_id: Option<String>,
#[prop_or(OUIA.component_type())]
pub ouia_type: OuiaComponentType,
#[prop_or(OuiaSafe::TRUE)]
pub ouia_safe: OuiaSafe,
}
#[derive(Debug, Clone, PartialEq)]
struct CardContext {
card_id: AttrValue,
expanded: bool,
clickable: bool,
selectable: bool,
disabled: bool,
}
#[function_component(Card)]
pub fn card(props: &CardProperties) -> Html {
let ouia_id = use_memo(props.ouia_id.clone(), |id| {
id.clone().unwrap_or(OUIA.generated_id())
});
let mut class = classes!("pf-v6-c-card");
if props.size == CardSize::Compact {
class.push("pf-m-compact");
}
if props.size == CardSize::Large {
class.push("pf-m-display-lg");
}
if props.disabled {
class.push("pf-m-disabled");
}
if props.expanded {
class.push("pf-m-expanded");
}
if props.flat {
class.push("pf-m-flat");
}
if props.selectable {
class.push("pf-m-selectable")
}
if props.selected {
class.push("pf-m-selected")
}
if props.full_height {
class.push("pf-m-full-height");
}
if props.plain {
class.push("pf-m-plain");
}
if props.selectable && props.clickable {
class.push("pf-m-selectable");
class.push("pf-m-clickable");
if props.selected {
class.push("pf-m-current");
}
} else if props.selectable {
class.push("pf-m-selectable");
if props.selected {
class.push("pf-m-selected");
}
} else if props.clickable {
class.push("pf-m-clickable");
if props.selected {
class.push("pf-m-selected");
}
}
class.extend(props.class.clone());
let context = CardContext {
card_id: props.id.clone(),
expanded: props.expanded,
clickable: props.clickable,
selectable: props.selectable,
disabled: props.disabled,
};
html! (
<ContextProvider<CardContext> {context}>
<@{props.component.clone()}
id={props.id.clone()}
{class}
style={props.style.clone()}
data-ouia-component-id={(*ouia_id).clone()}
data-ouia-component-type={props.ouia_type}
data-ouia-safe={props.ouia_safe}
>
{ props.children.clone() }
</@>
</ContextProvider<CardContext>>
)
}
#[function_component(CardDivider)]
pub fn card_divider() -> Html {
html!(<Divider r#type={DividerType::Hr} />)
}