aboutsummaryrefslogtreecommitdiff
path: root/server/src/ui/admin
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/ui/admin')
-rw-r--r--server/src/ui/admin/import.rs28
-rw-r--r--server/src/ui/admin/log.rs19
-rw-r--r--server/src/ui/admin/mod.rs37
-rw-r--r--server/src/ui/admin/users.rs46
4 files changed, 51 insertions, 79 deletions
diff --git a/server/src/ui/admin/import.rs b/server/src/ui/admin/import.rs
index 78db4a4..e199de4 100644
--- a/server/src/ui/admin/import.rs
+++ b/server/src/ui/admin/import.rs
@@ -4,27 +4,23 @@
Copyright (C) 2026 metamuffin <metamuffin.org>
*/
-use crate::{request_info::RequestInfo, ui::error::MyResult, ui_responder::UiResponse};
-use jellycommon::{
- jellyobject::{OBB, ObjectBuffer},
- routes::u_admin_import,
- *,
-};
+use crate::{request_info::RequestInfo, ui::error::MyResult};
+use jellycommon::routes::u_admin_import;
use jellyimport::{
ImportConfig, import_wrap, is_importing,
reporting::{IMPORT_ERRORS, IMPORT_PROGRESS},
};
-use jellyui::tr;
+use jellyui::{components::admin::AdminImport, tr};
use rocket::{
get, post,
- response::{Flash, Redirect},
+ response::{Flash, Redirect, content::RawHtml},
};
use rocket_ws::{Message, Stream, WebSocket};
use std::time::Duration;
use tokio::{spawn, time::sleep};
#[get("/admin/import", rank = 2)]
-pub async fn r_admin_import(ri: RequestInfo<'_>) -> MyResult<UiResponse> {
+pub async fn r_admin_import(ri: RequestInfo<'_>) -> MyResult<RawHtml<String>> {
ri.require_admin()?;
let last_import_err = IMPORT_ERRORS.read().await.clone();
@@ -33,15 +29,11 @@ pub async fn r_admin_import(ri: RequestInfo<'_>) -> MyResult<UiResponse> {
.map(|e| e.as_str())
.collect::<Vec<_>>();
- let mut data = ObjectBuffer::empty();
- if is_importing() {
- data = data.as_object().insert(ADMIN_IMPORT_BUSY, ());
- }
- data = data
- .as_object()
- .insert_multi(ADMIN_IMPORT_ERROR, &last_import_err);
-
- Ok(ri.respond_ui(OBB::new().with(VIEW_ADMIN_IMPORT, data.as_object())))
+ Ok(ri.respond_ui(&AdminImport {
+ busy: is_importing(),
+ errors: &last_import_err,
+ ri: &ri.render_info(),
+ }))
}
#[post("/admin/import?<incremental>")]
diff --git a/server/src/ui/admin/log.rs b/server/src/ui/admin/log.rs
index 0965a25..168ec6a 100644
--- a/server/src/ui/admin/log.rs
+++ b/server/src/ui/admin/log.rs
@@ -8,7 +8,7 @@ use crate::{
request_info::RequestInfo,
ui::error::MyResult,
};
-use jellyui::{Scaffold, ServerLogPage, render_log_line};
+use jellyui::components::admin_log::{ServerLogPage, render_log_line};
use rocket::{get, response::content::RawHtml};
use rocket_ws::{Message, Stream, WebSocket};
use serde_json::json;
@@ -21,18 +21,11 @@ pub fn r_admin_log(ri: RequestInfo, warnonly: bool) -> MyResult<RawHtml<String>>
.map(|l| render_log_line(&l))
.collect::<Vec<_>>();
- Ok(RawHtml(
- Scaffold {
- class: "theme-purple",
- main: ServerLogPage {
- messages: &messages,
- warnonly,
- },
- ri: &ri.render_info(),
- title: "Admin Log",
- }
- .to_string(),
- ))
+ Ok(ri.respond_ui(&ServerLogPage {
+ ri: &ri.render_info(),
+ messages: &messages,
+ warnonly,
+ }))
}
#[get("/admin/log?stream&<warnonly>&<html>", rank = 1)]
diff --git a/server/src/ui/admin/mod.rs b/server/src/ui/admin/mod.rs
index 10037b5..6119b74 100644
--- a/server/src/ui/admin/mod.rs
+++ b/server/src/ui/admin/mod.rs
@@ -9,34 +9,21 @@ pub mod log;
pub mod users;
use super::error::MyResult;
-use crate::{request_info::RequestInfo, ui_responder::UiResponse};
-use jellycommon::{
- jellyobject::{OBB, ObjectBuffer},
- *,
-};
-use jellyui::tr;
-use rocket::get;
+use crate::request_info::RequestInfo;
+use jellyui::components::admin::AdminDashboard;
+use rocket::{get, response::content::RawHtml};
#[get("/admin/dashboard")]
-pub async fn r_admin_dashboard(ri: RequestInfo<'_>) -> MyResult<UiResponse> {
+pub async fn r_admin_dashboard(ri: RequestInfo<'_>) -> MyResult<RawHtml<String>> {
ri.require_admin()?;
- let mut db_debug = String::new();
- ri.state.database.transaction(&mut |txn| {
- db_debug = txn.debug_info()?;
- Ok(())
- })?;
+ // let mut db_debug = String::new();
+ // ri.state.database.transaction(&mut |txn| {
+ // db_debug = txn.debug_info()?;
+ // Ok(())
+ // })?;
- let mut page = OBB::new();
- page.push(VIEW_TITLE, &*tr(ri.lang, "admin.dashboard.title"));
- page.push(VIEW_ADMIN_DASHBOARD, ());
- page.push(
- VIEW_ADMIN_INFO,
- ObjectBuffer::new(&mut [
- (ADMIN_INFO_TITLE.0, &"Database Debug"),
- (ADMIN_INFO_TEXT.0, &db_debug.as_str()),
- ])
- .as_object(),
- );
- Ok(ri.respond_ui(page))
+ Ok(ri.respond_ui(&AdminDashboard {
+ ri: &ri.render_info(),
+ }))
}
diff --git a/server/src/ui/admin/users.rs b/server/src/ui/admin/users.rs
index 172facc..85f241b 100644
--- a/server/src/ui/admin/users.rs
+++ b/server/src/ui/admin/users.rs
@@ -6,28 +6,29 @@
use std::str::FromStr;
+use crate::{auth::hash_password, request_info::RequestInfo, ui::error::MyResult};
+use anyhow::anyhow;
use base64::{Engine, prelude::BASE64_URL_SAFE};
use jellycommon::{
- jellyobject::{OBB, ObjectBufferBuilder, Path},
+ jellyobject::{ObjectBufferBuilder, Path},
routes::u_admin_users,
*,
};
use jellydb::{Filter, Query};
-use jellyui::tr;
+use jellyui::{
+ components::admin::{AdminUser, AdminUserList},
+ tr,
+};
use rand::random;
use rocket::{
FromForm,
form::Form,
get, post,
- response::{Flash, Redirect},
-};
-
-use crate::{
- auth::hash_password, request_info::RequestInfo, ui::error::MyResult, ui_responder::UiResponse,
+ response::{Flash, Redirect, content::RawHtml},
};
#[get("/admin/users")]
-pub fn r_admin_users(ri: RequestInfo) -> MyResult<UiResponse> {
+pub fn r_admin_users(ri: RequestInfo) -> MyResult<RawHtml<String>> {
ri.require_admin()?;
let mut users = Vec::new();
@@ -43,15 +44,10 @@ pub fn r_admin_users(ri: RequestInfo) -> MyResult<UiResponse> {
Ok(())
})?;
- let mut list = ObjectBufferBuilder::default();
- for u in users {
- list.push(ADMIN_USER_LIST_ITEM, u.as_object());
- }
-
- let mut page = ObjectBufferBuilder::default();
- page.push(VIEW_TITLE, &*tr(ri.lang, "admin.users"));
- page.push(VIEW_ADMIN_USER_LIST, list.finish().as_object());
- Ok(ri.respond_ui(page))
+ Ok(ri.respond_ui(&AdminUserList {
+ ri: &ri.render_info(),
+ users: &users.iter().map(|u| u.as_object()).collect::<Vec<_>>(),
+ }))
}
#[derive(FromForm)]
@@ -83,22 +79,26 @@ pub fn r_admin_new_user(ri: RequestInfo, form: Form<NewUser>) -> MyResult<Flash<
}
#[get("/admin/user/<name>")]
-pub fn r_admin_user(ri: RequestInfo<'_>, name: &str) -> MyResult<UiResponse> {
+pub fn r_admin_user(ri: RequestInfo<'_>, name: &str) -> MyResult<RawHtml<String>> {
ri.require_admin()?;
- let mut page = OBB::new();
+ let mut user = None;
ri.state.database.transaction(&mut |txn| {
if let Some(row) = txn.query_single(Query {
filter: Filter::Match(Path(vec![USER_LOGIN.0]), name.into()),
..Default::default()
})? {
- let user = txn.get(row)?.unwrap();
- page = OBB::new();
- page.push(VIEW_ADMIN_USER, user.as_object());
+ user = Some(txn.get(row)?.unwrap());
}
Ok(())
})?;
+ let Some(user) = user else {
+ Err(anyhow!("no such user"))?
+ };
- Ok(ri.respond_ui(page))
+ Ok(ri.respond_ui(&AdminUser {
+ ri: &ri.render_info(),
+ user: user.as_object(),
+ }))
}
#[post("/admin/user/<name>/remove")]