/* This file is part of jellything (https://codeberg.org/metamuffin/jellything) which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2023 metamuffin */ 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::{user::NodeUserData, 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() {} #[get("/items?&")] pub fn r_all_items_filter( sess: Session, db: &State, page: Option, filter: NodeFilterSort, ) -> Result, MyError> { let mut items = db .node .iter() .map(|e| { let (i, n) = e.context("listing")?; let u = db .user_node .get(&(sess.user.name.clone(), i.clone()))? .unwrap_or_default(); Ok((i, n, u)) }) .collect::>>()? .into_iter() .map(|(k, n, u)| (k, n.public, u)) .collect::>(); 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" } @NodeFilterSortForm { f: &filter } ul.children { @for (id, node, udata) in &items[from..to] { li {@NodeCard { id, node, udata }} }} p.pagecontrols { span.current { "Page " @{page + 1} " of " @max_page " " } @if page > 0 { a.prev[href=uri!(r_all_items_filter(Some(page - 1), filter.clone()))] { "Previous page" } " " } @if page + 1 < max_page { a.next[href=uri!(r_all_items_filter(Some(page + 1), filter.clone()))] { "Next page" } } } } }, ..Default::default() }) }