dbui-client 0.0.64

WASM web client sources for dbui
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)
  }
}