viewy 2.0.0

A web UI toolkit that combine the advantages of a design system and an ui library.
use crate::DefaultModifiers;
use crate::Renderable;
use crate::components::*;
use crate::engine::IntoPopover;
use crate::node::Node;

#[derive(Debug, Clone)]
pub enum Placement {
    Auto,
    TopStart,
    Top,
    TopEnd,
    RightStart,
    Right,
    RightEnd,
    BottomStart,
    Bottom,
    BottomEnd,
    LeftStart,
    Left,
    LeftEnd,
}

#[derive(Debug, Clone)]
pub struct Popover {
    node: Node,
    hide_arrow: bool,
    pub el_to_attach_to: String,
    pub placement: Placement,
}

impl DefaultModifiers for Popover {}

impl Popover {
    pub fn new() -> Self {
        Popover {
            node: Default::default(),
            hide_arrow: false,
            el_to_attach_to: "".to_string(),
            placement: Placement::Auto,
        }
    }

    pub fn hide_arrow(&mut self) -> &mut Self {
        self.hide_arrow = true;
        self
    }

    pub fn placement(&mut self, placement: Placement) -> &mut Self {
        self.placement = placement;
        self
    }
}
impl std::ops::Deref for Popover {
    type Target = Node;

    fn deref(&self) -> &Self::Target {
        &self.node
    }
}

impl std::ops::DerefMut for Popover {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.node
    }
}

impl IntoPopover for Popover {
    fn render(self) -> Node {
        Renderable::render(self)
    }

    fn attach_to(&mut self, el: &str) -> &mut Self {
        self.el_to_attach_to = el.to_string();
        self
    }
}

impl Appendable for Popover {}

impl Renderable for Popover {
    fn component_name(&self) -> &str {
        "Popover"
    }
    fn render(mut self) -> Node {
        let self_values = self.clone();
        let placement = match self.placement {
            Placement::Auto => "auto",
            Placement::TopStart => "top-start",
            Placement::Top => "top",
            Placement::TopEnd => "top-end",
            Placement::RightStart => "right-start",
            Placement::Right => "right",
            Placement::RightEnd => "right-end",
            Placement::BottomStart => "bottom-start",
            Placement::Bottom => "bottom",
            Placement::BottomEnd => "bottom-end",
            Placement::LeftStart => "left-start",
            Placement::Left => "left",
            Placement::LeftEnd => "left-end",
        };
        self.add_class("popover")
            .set_attr("data-attach-to", self_values.el_to_attach_to.as_str())
            .set_attr("data-placement", placement);

        if !self.hide_arrow {
            self.node.children.push({
                let mut view = View::new();
                view.add_class("arrow")
                    .set_attr("data-popper-arrow", "true");
                view.render()
            });
        }

        self.node
    }
}