aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/node.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/routes/node.rs')
-rw-r--r--server/src/routes/node.rs77
1 files changed, 61 insertions, 16 deletions
diff --git a/server/src/routes/node.rs b/server/src/routes/node.rs
index 506d771..240486e 100644
--- a/server/src/routes/node.rs
+++ b/server/src/routes/node.rs
@@ -12,7 +12,10 @@ use jellycommon::{
*,
};
use jellydb::{Filter, MultiBehaviour, Query, Sort, SortOrder, Transaction, ValueSort};
-use jellyui::components::node_page::NodePage;
+use jellyui::components::{
+ node_list::{NodeFilterInfo, NodeListData},
+ node_page::NodePage,
+};
use rocket::{get, response::content::RawHtml};
use std::{borrow::Cow, collections::BTreeMap};
@@ -20,8 +23,10 @@ use std::{borrow::Cow, collections::BTreeMap};
pub fn r_node(ri: RequestInfo<'_>, slug: &str) -> MyResult<RawHtml<String>> {
ri.require_user()?;
+ let filter = NodeFilter { kind: None };
+
let mut nku = None;
- let mut children = Vec::new();
+ let mut children = None;
let mut credits = Vec::new();
let mut credited = Vec::new();
ri.state.database.transaction(&mut |txn| {
@@ -31,13 +36,13 @@ pub fn r_node(ri: RequestInfo<'_>, slug: &str) -> MyResult<RawHtml<String>> {
})? {
let n = txn.get(row)?.unwrap();
nku = Some(create_nku(txn, row)?);
- children = c_children(txn, row, &n)?;
+ children = Some(c_children(txn, filter.clone(), row, &n)?);
credits = c_credits(txn, &n)?;
credited = c_credited(txn, row)?;
}
Ok(())
})?;
- let Some(nku) = nku else {
+ let (Some(nku), Some(children)) = (nku, children) else {
Err(anyhow!("no such node"))?
};
@@ -50,7 +55,25 @@ pub fn r_node(ri: RequestInfo<'_>, slug: &str) -> MyResult<RawHtml<String>> {
}))
}
-fn c_children(txn: &mut dyn Transaction, row: u64, node: &Object) -> Result<Vec<Nku<'static>>> {
+const KINDS_TAB_ORDER: &[Tag] = &[
+ KIND_COLLECTION,
+ KIND_MOVIE,
+ KIND_SHOW,
+ KIND_SERIES,
+ KIND_SEASON,
+ KIND_EPISODE,
+ KIND_CHANNEL,
+ KIND_VIDEO,
+ KIND_SHORTFORMVIDEO,
+ KIND_MUSIC,
+];
+
+fn c_children(
+ txn: &mut dyn Transaction,
+ mut filter: NodeFilter,
+ row: u64,
+ node: &Object,
+) -> Result<NodeListData<'static>> {
let kind = node.get(NO_KIND).unwrap_or(KIND_COLLECTION);
let (order, path) = match kind {
KIND_CHANNEL => (SortOrder::Descending, Path(vec![NO_RELEASEDATE.0])),
@@ -58,6 +81,28 @@ fn c_children(txn: &mut dyn Transaction, row: u64, node: &Object) -> Result<Vec<
_ => (SortOrder::Ascending, Path(vec![NO_TITLE.0])),
};
+ let mut filter_kinds = Vec::new();
+ for &kind in KINDS_TAB_ORDER {
+ let count = txn.count(Filter::All(vec![
+ Filter::Match(Path(vec![NO_VISIBILITY.0]), VISI_VISIBLE.into()),
+ Filter::Match(Path(vec![NO_PARENT.0]), row.into()),
+ Filter::Match(Path(vec![NO_KIND.0]), kind.into()),
+ ]))?;
+ if count > 0 {
+ filter_kinds.push((kind, count));
+ }
+ }
+ if filter.kind.is_none() {
+ filter.kind = filter_kinds.first().map(|(t, _)| *t);
+ }
+
+ let mut filters = vec![
+ Filter::Match(Path(vec![NO_VISIBILITY.0]), VISI_VISIBLE.into()),
+ Filter::Match(Path(vec![NO_PARENT.0]), row.into()),
+ ];
+ if let Some(kind) = filter.kind {
+ filters.push(Filter::Match(Path(vec![NO_KIND.0]), kind.into()))
+ }
let children_rows = txn
.query(Query {
sort: Sort::Value(ValueSort {
@@ -66,19 +111,22 @@ fn c_children(txn: &mut dyn Transaction, row: u64, node: &Object) -> Result<Vec<
order,
path,
}),
- filter: Filter::All(vec![
- Filter::Match(Path(vec![NO_VISIBILITY.0]), VISI_VISIBLE.into()),
- Filter::Match(Path(vec![NO_PARENT.0]), row.into()),
- ]),
+ filter: Filter::All(filters),
..Default::default()
})?
.collect::<Result<Vec<_>>>()?;
- let mut list = Vec::new();
+ let mut items = Vec::new();
for (row, _) in children_rows {
- list.push(create_nku(txn, row)?);
+ items.push(create_nku(txn, row)?);
}
- Ok(list)
+ Ok(NodeListData {
+ filter_info: NodeFilterInfo {
+ cur: filter,
+ kinds: filter_kinds,
+ },
+ items,
+ })
}
fn c_credits(txn: &mut dyn Transaction, node: &Object) -> Result<Vec<(Tag, Vec<Nku<'static>>)>> {
@@ -136,10 +184,7 @@ fn c_credited(txn: &mut dyn Transaction, row: u64) -> Result<Vec<Nku<'static>>>
}
pub fn create_nku(txn: &mut dyn Transaction, row: u64) -> Result<Nku<'static>> {
- let child_count = txn.count(Query {
- filter: Filter::Match(Path(vec![NO_PARENT.0]), row.into()),
- ..Default::default()
- })?;
+ let child_count = txn.count(Filter::Match(Path(vec![NO_PARENT.0]), row.into()))?;
Ok(Nku {
node: Cow::Owned(txn.get(row)?.unwrap()),
role: None,