aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-08-07 11:48:38 +0200
committermetamuffin <metamuffin@disroot.org>2023-08-07 11:59:59 +0200
commit6c1c53aa08eb1c3ae61b472ceb75265a180bd489 (patch)
treec30d76e132e120981f0ef1872231ce231e5e837a /server/src/routes
parentdc7ed1ccaa5e727b3ab0569fd7fe56a2d0084bd5 (diff)
downloadjellything-6c1c53aa08eb1c3ae61b472ceb75265a180bd489.tar
jellything-6c1c53aa08eb1c3ae61b472ceb75265a180bd489.tar.bz2
jellything-6c1c53aa08eb1c3ae61b472ceb75265a180bd489.tar.zst
sort and pagination in browser
Diffstat (limited to 'server/src/routes')
-rw-r--r--server/src/routes/mod.rs4
-rw-r--r--server/src/routes/ui/browser.rs52
-rw-r--r--server/src/routes/ui/node.rs2
-rw-r--r--server/src/routes/ui/sort.rs2
4 files changed, 47 insertions, 13 deletions
diff --git a/server/src/routes/mod.rs b/server/src/routes/mod.rs
index fe9ef39..6ebde33 100644
--- a/server/src/routes/mod.rs
+++ b/server/src/routes/mod.rs
@@ -27,7 +27,7 @@ use ui::{
r_admin_remove_invite, r_admin_remove_user,
},
assets::r_item_assets,
- browser::r_all_items,
+ browser::r_all_items_filter,
error::{r_api_catch, r_catch},
home::{r_home, r_home_unpriv},
node::r_library_node_filter,
@@ -87,7 +87,7 @@ pub fn build_rocket(
r_home_unpriv,
r_favicon,
r_item_assets,
- r_all_items,
+ r_all_items_filter,
r_library_node_filter,
r_assets_style,
r_assets_font,
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()
diff --git a/server/src/routes/ui/node.rs b/server/src/routes/ui/node.rs
index ba16c73..13afbbe 100644
--- a/server/src/routes/ui/node.rs
+++ b/server/src/routes/ui/node.rs
@@ -27,7 +27,7 @@ use rocket::{get, serde::json::Json, Either, State};
/// This function is a stub and only useful for use in the uri! macro.
#[get("/n/<id>")]
-pub fn r_library_node(id: String) -> () {
+pub fn r_library_node(id: String) {
drop(id)
}
diff --git a/server/src/routes/ui/sort.rs b/server/src/routes/ui/sort.rs
index 3ab6cef..ccc3529 100644
--- a/server/src/routes/ui/sort.rs
+++ b/server/src/routes/ui/sort.rs
@@ -4,7 +4,7 @@ use rocket::{
FromForm, FromFormField, UriDisplayQuery,
};
-#[derive(FromForm, UriDisplayQuery)]
+#[derive(FromForm, UriDisplayQuery, Default, Clone)]
pub struct NodeFilterSort {
sort_by: Option<SortProperty>,
filter_kind: Option<Vec<NodeKind>>,