use std::collections::HashMap;
use topcoat::{
context::Cx,
runtime::{Signal, signal},
};
use crate::{
panel::input::{Selection, TableTarget},
table::{TableState, request_query},
};
#[derive(Clone)]
pub(crate) struct TableSignals {
pub(crate) query: Signal<String>,
pub(crate) bulk: Signal<String>,
pub(crate) all: Signal<bool>,
pub(crate) collapsed: 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 url = topcoat::context::try_context::<http::request::Parts>(cx)
.and_then(|parts| parts.uri.path_and_query())
.map(ToString::to_string)
.unwrap_or_default();
let key = (url, 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),
all: signal(&cx, || false),
collapsed: 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 selection(&self) -> Selection {
Selection {
keys: self.bulk.clone(),
all: self.all.clone(),
query: self.query.clone(),
}
}
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),
}
}
}