/* 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) 2025 metamuffin */ use super::{ account::session::Session, error::MyError, layout::{DynLayoutPage, LayoutPage}, node::NodeCard, sort::{filter_and_sort_nodes, NodeFilterSort, NodeFilterSortForm, SortOrder, SortProperty}, }; use crate::{database::Database, routes::api::AcceptJson, uri}; use jellycommon::{api::ApiItemsResponse, Visibility}; use rocket::{get, serde::json::Json, Either, 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, aj: AcceptJson, page: Option, filter: NodeFilterSort, ) -> Result, Json>, MyError> { let mut items = db.list_nodes_with_udata(sess.user.name.as_str())?; items.retain(|(n, _)| matches!(n.visibility, Visibility::Visible)); filter_and_sort_nodes( &filter, (SortProperty::Title, SortOrder::Ascending), &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(if *aj { Either::Right(Json(ApiItemsResponse { count: items.len(), pages: max_page, items: items[from..to].to_vec(), })) } else { Either::Left(LayoutPage { title: "All Items".to_owned(), content: markup::new! { .page.dir { h1 { "All Items" } @NodeFilterSortForm { f: &filter } ul.children { @for (node, udata) in &items[from..to] { li {@NodeCard { 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() }) }) }