use anyhow::Result;
use std::sync::RwLock;
#[derive(Debug)]
pub(crate) struct TabService {
tabs: RwLock<Vec<String>>
}
impl TabService {
pub(crate) fn new() -> TabService {
TabService {
tabs: RwLock::new(vec![String::from("overview")])
}
}
pub(crate) fn get_tab(&self, k: &str) -> Option<usize> {
self.tabs.read().unwrap().iter().position(|s| s == k)
}
pub(crate) fn activate_tab(&self, idx: usize) -> Result<()> {
crate::js::activate_tab("tab-container", idx);
Ok(())
}
pub(crate) fn add_tab(
&self, k: &str, icon: Option<&str>, title: &str, template: Result<maud::Markup>, ctx: &crate::ctx::ClientContext
) -> Result<()> {
{
let mut t = self.tabs.write().unwrap();
t.push(String::from(k));
}
let _ = ctx.append_template("tab-container", "li", maud::html! {
a href="#" data-panel=(k) {
@if let Some(i) = icon {
span.icon data-uk-icon=(format!("icon: {}", i)) {}
" "
}
(title)
}
})?;
let _ = ctx.append_template("panel-container", "div", maud::html! {
li.panel#(format!("panel-{}", k)) data-panel=(k) {
div { (template?) }
}
})?;
self.activate_tab(self.tabs.read().unwrap().len() - 1)
}
}