aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/ui/browser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/routes/ui/browser.rs')
-rw-r--r--server/src/routes/ui/browser.rs52
1 files changed, 43 insertions, 9 deletions
diff --git a/server/src/routes/ui/browser.rs b/server/src/routes/ui/browser.rs
index 6e772d0..14d32ba 100644
--- a/server/src/routes/ui/browser.rs
+++ b/server/src/routes/ui/browser.rs
@@ -3,31 +3,65 @@
which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
Copyright (C) 2023 metamuffin <metamuffin.org>
*/
-use super::{account::session::Session, error::MyError, layout::DynLayoutPage, node::NodeCard};
-use crate::database::Database;
+use super::{
+ account::session::Session,
+ error::MyError,
+ layout::DynLayoutPage,
+ node::NodeCard,
+ sort::{filter_and_sort_nodes, NodeFilterSort, NodeFilterSortForm},
+};
+use crate::{database::Database, uri};
use anyhow::Context;
-use jellycommon::{Node, NodeKind};
+use jellycommon::NodePublic;
use rocket::{get, State};
+/// This function is a stub and only useful for use in the uri! macro.
#[get("/items")]
-pub fn r_all_items(_sess: Session, db: &State<Database>) -> Result<DynLayoutPage<'_>, MyError> {
- let items = db
+pub fn r_all_items() {}
+
+#[get("/items?<page>&<filter..>")]
+pub fn r_all_items_filter(
+ _sess: Session,
+ db: &State<Database>,
+ page: Option<usize>,
+ filter: NodeFilterSort,
+) -> Result<DynLayoutPage<'_>, MyError> {
+ let mut items = db
.node
.iter()
.map(|e| e.context("listing"))
.collect::<anyhow::Result<Vec<_>>>()?
.into_iter()
- .filter(|(_, n)| matches!(n.public.kind, NodeKind::Movie | NodeKind::Series))
- .collect::<Vec<(String, Node)>>();
+ .map(|(k, n)| (k, n.public))
+ .collect::<Vec<(String, NodePublic)>>();
+
+ filter_and_sort_nodes(&filter, &mut items);
+
+ let page_size = 100;
+ let page = page.unwrap_or(0);
+ let offset = page * page_size;
+ let from = offset.min(items.len());
+ let to = (offset + page_size).min(items.len());
+ let max_page = items.len().div_ceil(page_size);
Ok(super::layout::LayoutPage {
title: "All Items".to_owned(),
content: markup::new! {
.page.dir {
h1 { "All Items" }
- ul.children { @for (id, node) in &items {
- li {@NodeCard { id, node: &node.public }}
+ @NodeFilterSortForm { f: &filter }
+ ul.children { @for (id, node) in &items[from..to] {
+ li {@NodeCard { id, node: &node }}
}}
+ p.pagecontrols {
+ "Page " @page " of "
+ @if page > 0 {
+ a.prev[href=uri!(r_all_items_filter(Some(page - 1), filter.clone()))] { "Previous page" } " "
+ }
+ @if page < max_page {
+ a.next[href=uri!(r_all_items_filter(Some(page + 1), filter.clone()))] { "Next page" }
+ }
+ }
}
},
..Default::default()