diff --git a/src/admin/mod.rs b/src/admin/mod.rs index a3e8b05..162b509 100644 --- a/src/admin/mod.rs +++ b/src/admin/mod.rs @@ -2,7 +2,7 @@ use crate::{ error::{Error, OptionExt}, extensions::{CommentExt, ProfileExt, SubmissionExt}, nav::NavState, - pagination::{PageNum, SearchPage}, + pagination::{Page, PageNum, PageSource, SearchPage}, views::{OwnedProfileView, OwnedSubmissionView}, ActixLoader, State, }; @@ -23,7 +23,8 @@ pub use hyaenidae_profiles::store::Report; mod pagination; use pagination::{ - BlockedPager, FederatedPager, InboundPager, KnownPager, OutboundPager, ServerPager, + BlockedPager, ClosedPager, FederatedPager, InboundPager, KnownPager, OpenPager, OutboundPager, + ReportPager, ServerPager, }; pub(super) fn scope() -> Scope { @@ -123,20 +124,21 @@ async fn discover_server( Ok(()) as Result<(), Error> }; + let query = query.into_inner(); if let Err(e) = (fallible)().await { - let mut federation_view = FederationView::build(query.into_inner(), &state2).await?; + let mut federation_view = FederationView::build(query.clone(), &state2).await?; federation_view .discover_error(e.to_string()) .discover_value(url2); let server_view = ServerView::build(&state2).await?; - let open_reports = ReportsView::new(state2).await?; + let reports_vew = ReportsView::new(query, state2).await?; return crate::rendered(HttpResponse::Ok(), |cursor| { crate::templates::admin::index( cursor, &loader, - &open_reports, + &reports_vew, &server_view, &federation_view, &nav_state, @@ -878,6 +880,17 @@ impl FederationView { } } +fn page_source(query: &HashMap, prefix: &str) -> Option { + query + .get(&format!("{}_min", prefix)) + .and_then(|min_str| Some(PageSource::NewerThan(min_str.parse().ok()?))) + .or_else(|| { + query + .get(&format!("{}_max", prefix)) + .and_then(|max_str| Some(PageSource::OlderThan(max_str.parse().ok()?))) + }) +} + fn page_num(query: &HashMap, name: &str) -> Option { query.get(name).and_then(|page_str| { Some(PageNum { @@ -923,7 +936,7 @@ async fn view_report( ) -> Result { let report_id = report.into_inner(); let report_store = state.profiles.store.reports.clone(); - let report = web::block(move || Ok(report_store.by_id(report_id)?)).await?; + let report = web::block(move || report_store.by_id(report_id)?.req()).await?; let report_view = ReportView::new(report, state).await?; @@ -966,7 +979,7 @@ async fn close_report( ) -> Result { let report_id = report.into_inner(); let report_store = state.profiles.store.reports.clone(); - let report = web::block(move || Ok(report_store.by_id(report_id)?)).await?; + let report = web::block(move || report_store.by_id(report_id)?.req()).await?; let form = form.into_inner(); @@ -1110,15 +1123,16 @@ async fn admin_page( nav_state: NavState, state: web::Data, ) -> Result { - let federation_view = FederationView::build(query.into_inner(), &state).await?; + let query = query.into_inner(); + let federation_view = FederationView::build(query.clone(), &state).await?; let server_view = ServerView::build(&state).await?; - let open_reports = ReportsView::new(state).await?; + let reports_vew = ReportsView::new(query, state).await?; crate::rendered(HttpResponse::Ok(), |cursor| { crate::templates::admin::index( cursor, &loader, - &open_reports, + &reports_vew, &server_view, &federation_view, &nav_state, @@ -1417,7 +1431,10 @@ impl ServerView { } pub struct ReportsView { - reports: Vec, + query: HashMap, + open_reports: Page, + closed_reports: Page, + reports: HashMap, profiles: HashMap, submissions: HashMap, comments: HashMap, @@ -1511,8 +1528,94 @@ impl<'a> SubmissionView<'a> { } impl ReportsView { - pub(crate) fn reports(&self) -> &[Report] { - &self.reports + pub(crate) fn open_reports<'a>(&'a self) -> impl Iterator + 'a { + self.open_reports + .items + .iter() + .filter_map(move |report_id| self.reports.get(report_id)) + } + + pub(crate) fn has_open_reports_nav(&self) -> bool { + self.open_reports.prev.is_some() || self.open_reports.next.is_some() + } + + pub(crate) fn open_reports_nav(&self, loader: &ActixLoader) -> Vec