diff options
author | metamuffin <metamuffin@disroot.org> | 2023-01-18 16:16:03 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-01-18 16:16:03 +0100 |
commit | 46ef75431e1d34c63a690726a8ef584d175ddd30 (patch) | |
tree | df36a2bfb9fe3e19ce9f76665b4770063a089423 /server/src/routes/ui/node.rs | |
parent | 5aa557e864bd2cf940e7164b7568e7e545817306 (diff) | |
download | jellything-46ef75431e1d34c63a690726a8ef584d175ddd30.tar jellything-46ef75431e1d34c63a690726a8ef584d175ddd30.tar.bz2 jellything-46ef75431e1d34c63a690726a8ef584d175ddd30.tar.zst |
restructure pages slightly
Diffstat (limited to 'server/src/routes/ui/node.rs')
-rw-r--r-- | server/src/routes/ui/node.rs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/server/src/routes/ui/node.rs b/server/src/routes/ui/node.rs new file mode 100644 index 0000000..b6d0d30 --- /dev/null +++ b/server/src/routes/ui/node.rs @@ -0,0 +1,61 @@ +use super::super::stream::rocket_uri_macro_r_stream; +use super::error::MyError; +use crate::{ + library::{Directory, Item, Node}, + routes::ui::HtmlTemplate, + AppState, +}; +use anyhow::Context; +use rocket::{get, uri, State}; +use std::{ops::Deref, path::PathBuf, sync::Arc}; + +#[get("/library/<path..>")] +pub async fn r_library_node( + path: PathBuf, + state: &State<AppState>, +) -> Result<HtmlTemplate<markup::DynRender>, MyError> { + let path = path.to_str().unwrap().to_string(); + let node = state + .library + .nested(&path) + .context("retrieving library node")? + .clone(); + Ok(HtmlTemplate( + format!("{}", node.title()), + markup::new! { + @NodePage { node: node.clone() } + }, + )) +} + +markup::define! { + NodePage(node: Arc<Node>) { + @match node.deref() { + Node::Directory(dir) => { @DirectoryPage { dir: dir.clone() } } + Node::Item(item) => { @ItemPage { item: item.clone() } } + } + } + DirectoryCard(dir: Arc<Directory>) { + span { a[href=&uri!(r_library_node(&dir.lib_path)).to_string()] { @dir.data.name } } + } + DirectoryPage(dir: Arc<Directory>) { + h1 { @dir.data.name } + ul.directorylisting { + @for el in &dir.children { + li { + span.title { @match el.deref().to_owned() { + Node::Directory(dir) => { @DirectoryCard { dir } } + Node::Item(item) => { @ItemCard { item } } + }} + } + } + } + } + ItemCard(item: Arc<Item>) { + span { a[href=&uri!(r_library_node(&item.lib_path)).to_string()] { @item.data.title } } + } + ItemPage(item: Arc<Item>) { + h1 { @item.data.title } + video[src=&uri!(r_stream(&item.lib_path, "1,2")).to_string(), controls] {} + } +} |