diff options
| author | metamuffin <metamuffin@disroot.org> | 2023-08-07 11:48:38 +0200 | 
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2023-08-07 11:59:59 +0200 | 
| commit | 6c1c53aa08eb1c3ae61b472ceb75265a180bd489 (patch) | |
| tree | c30d76e132e120981f0ef1872231ce231e5e837a /server | |
| parent | dc7ed1ccaa5e727b3ab0569fd7fe56a2d0084bd5 (diff) | |
| download | jellything-6c1c53aa08eb1c3ae61b472ceb75265a180bd489.tar jellything-6c1c53aa08eb1c3ae61b472ceb75265a180bd489.tar.bz2 jellything-6c1c53aa08eb1c3ae61b472ceb75265a180bd489.tar.zst | |
sort and pagination in browser
Diffstat (limited to 'server')
| -rw-r--r-- | server/src/main.rs | 1 | ||||
| -rw-r--r-- | server/src/routes/mod.rs | 4 | ||||
| -rw-r--r-- | server/src/routes/ui/browser.rs | 52 | ||||
| -rw-r--r-- | server/src/routes/ui/node.rs | 2 | ||||
| -rw-r--r-- | server/src/routes/ui/sort.rs | 2 | 
5 files changed, 48 insertions, 13 deletions
| diff --git a/server/src/main.rs b/server/src/main.rs index 8f26253..43b1db4 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -4,6 +4,7 @@      Copyright (C) 2023 metamuffin <metamuffin.org>  */  #![feature(lazy_cell)] +#![feature(int_roundings)]  use crate::routes::ui::admin::log::enable_logging;  use database::Database; 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>>, | 
