use std::collections::HashMap;
use topcoat::{
context::Cx,
runtime::{Signal, signal},
};
use crate::{
panel::input::TableTarget,
table::{TableState, request_query},
};
#[derive(Clone)]
pub(crate) struct TableSignals {
pub(crate) query: Signal<String>,
pub(crate) bulk: Signal<String>,
pub(crate) confirm: ConfirmSignals,
pub(crate) inputs: HashMap<&'static str, TableTarget>,
key: (String, String),
}
#[derive(Clone)]
pub(crate) struct ConfirmSignals {
pub(crate) action: Signal<String>,
pub(crate) title: Signal<String>,
pub(crate) label: Signal<String>,
pub(crate) bulk: Signal<bool>,
}
impl TableSignals {
pub(crate) fn new(cx: &Cx, prefix: Option<&str>) -> Self {
let path = topcoat::context::try_request_context::<http::request::Parts>(cx)
.map(|parts| parts.uri.path().to_string())
.unwrap_or_default();
let key = (path, prefix.unwrap_or_default().to_string());
let cx = cx.keyed(("tablo-table", key.0.as_str(), key.1.as_str()));
let query = request_query(&cx);
Self {
query: signal(&cx, move || query),
bulk: signal(&cx, String::new),
confirm: ConfirmSignals {
action: signal(&cx, String::new),
title: signal(&cx, String::new),
label: signal(&cx, String::new),
bulk: signal(&cx, || false),
},
inputs: HashMap::new(),
key,
}
}
pub(crate) fn with_inputs(
mut self,
cx: &Cx,
names: impl Iterator<Item = &'static str>,
) -> Self {
for name in names {
let cx = cx.keyed((
"tablo-table-input",
self.key.0.as_str(),
self.key.1.as_str(),
name,
));
let target = TableTarget {
action: signal(&cx, String::new),
bulk: signal(&cx, || false),
};
self.inputs.insert(name, target);
}
self
}
pub(crate) fn state(&self, prefix: Option<&str>) -> TableState {
let query = self.query.get();
match prefix {
Some(prefix) => TableState::from_query_prefixed(&query, prefix),
None => TableState::from_query(&query),
}
}
}