diff options
Diffstat (limited to 'server/src/routes/node.rs')
| -rw-r--r-- | server/src/routes/node.rs | 77 |
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, |