From 5940264ffdf1f3c46183e3541b6f207ecfa14d0c Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 4 Feb 2021 19:13:47 -0600 Subject: [PATCH] Server: paginate servers on admin page --- Cargo.toml | 1 + src/{admin.rs => admin/mod.rs} | 382 +++++++++++++++++++++++++------ src/admin/pagination.rs | 104 +++++++++ src/pagination.rs | 7 +- templates/admin/index.rs.html | 30 ++- translations/en-US/hyaenidae.ftl | 3 + 6 files changed, 447 insertions(+), 80 deletions(-) rename src/{admin.rs => admin/mod.rs} (81%) create mode 100644 src/admin/pagination.rs diff --git a/Cargo.toml b/Cargo.toml index 44e3a29..ddc4759 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,6 +38,7 @@ rsa-pem = "0.2.0" rust-embed = "5" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" +serde_urlencoded = "0.7" sha2 = "0.9" sled = { version = "0.34.6", features = ["compression"] } structopt = "0.3" diff --git a/src/admin.rs b/src/admin/mod.rs similarity index 81% rename from src/admin.rs rename to src/admin/mod.rs index f05444a..a3e8b05 100644 --- a/src/admin.rs +++ b/src/admin/mod.rs @@ -2,6 +2,7 @@ use crate::{ error::{Error, OptionExt}, extensions::{CommentExt, ProfileExt, SubmissionExt}, nav::NavState, + pagination::{PageNum, SearchPage}, views::{OwnedProfileView, OwnedSubmissionView}, ActixLoader, State, }; @@ -20,6 +21,11 @@ use uuid::Uuid; pub use hyaenidae_profiles::store::Report; +mod pagination; +use pagination::{ + BlockedPager, FederatedPager, InboundPager, KnownPager, OutboundPager, ServerPager, +}; + pub(super) fn scope() -> Scope { web::scope("/admin") .service(web::resource("").route(web::get().to(admin_page))) @@ -87,6 +93,7 @@ async fn discover_server( loader: ActixLoader, _: Admin, form: web::Form, + query: web::Query>, nav_state: NavState, client: web::Data, state: web::Data, @@ -117,7 +124,7 @@ async fn discover_server( }; if let Err(e) = (fallible)().await { - let mut federation_view = FederationView::build(&state2).await?; + let mut federation_view = FederationView::build(query.into_inner(), &state2).await?; federation_view .discover_error(e.to_string()) .discover_value(url2); @@ -384,13 +391,14 @@ async fn defederate( pub struct FederationView { servers: HashMap, - blocked: Vec, - federated: Vec, - inbound_requests: Vec, - outbound_requests: Vec, - known: Vec, + blocked: SearchPage, + federated: SearchPage, + inbound_requests: SearchPage, + outbound_requests: SearchPage, + known: SearchPage, discover_value: Option, discover_error: Option, + query: HashMap, } pub(crate) struct BlockView<'a> { @@ -514,13 +522,6 @@ impl FederationView { self } - pub(crate) fn blocked<'a>(&'a self) -> impl Iterator> + 'a { - self.blocked - .iter() - .filter_map(move |id| self.servers.get(id)) - .map(|server| BlockView { server }) - } - pub(crate) fn discover_input(&self, loader: &ActixLoader) -> TextInput { let input = TextInput::new("url") .title(&fl!(loader, "admin-discover-input")) @@ -538,107 +539,326 @@ impl FederationView { "/admin/discover" } + pub(crate) fn blocked<'a>(&'a self) -> impl Iterator> + 'a { + self.blocked + .items + .iter() + .filter_map(move |id| self.servers.get(id)) + .map(|server| BlockView { server }) + } + + pub(crate) fn has_blocked_nav(&self) -> bool { + self.blocked.next.is_some() || self.blocked.prev.is_some() + } + + fn blocked_next(&self, loader: &ActixLoader) -> Option