From be4af57d75cc1e233b4714b18198fb7bde49464d Mon Sep 17 00:00:00 2001 From: metamuffin Date: Mon, 16 Feb 2026 17:50:57 +0100 Subject: refactor ui responder; add admin import pages --- ui/src/components/admin.rs | 52 +++++++++++++++++++++++++++++++++++++ ui/src/components/mod.rs | 8 ++++++ ui/src/lib.rs | 2 ++ ui/src/old/admin/import.rs | 46 --------------------------------- ui/src/old/admin/mod.rs | 64 ---------------------------------------------- 5 files changed, 62 insertions(+), 110 deletions(-) create mode 100644 ui/src/components/admin.rs delete mode 100644 ui/src/old/admin/import.rs delete mode 100644 ui/src/old/admin/mod.rs (limited to 'ui/src') diff --git a/ui/src/components/admin.rs b/ui/src/components/admin.rs new file mode 100644 index 0000000..831c746 --- /dev/null +++ b/ui/src/components/admin.rs @@ -0,0 +1,52 @@ +/* + 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) 2026 metamuffin +*/ + +use crate::RenderInfo; +use jellycommon::{ + ADMIN_IMPORT_BUSY, ADMIN_IMPORT_ERROR, + jellyobject::Object, + routes::{u_admin_import, u_admin_import_post, u_admin_log}, +}; +use jellyui_locale::tr; + +markup::define!( + AdminDashboard<'a>(ri: &'a RenderInfo<'a>) { + h1 { @tr(ri.lang, "admin.dashboard.title") } + ul { + li{a[href=u_admin_log(true)] { @tr(ri.lang, "admin.log.warnonly") }} + li{a[href=u_admin_log(false)] { @tr(ri.lang, "admin.log.full") }} + } + + a[href=u_admin_import()] { h2 { @tr(ri.lang, "admin.import.title") }} + } + + AdminImport<'a>(ri: &'a RenderInfo<'a>, data: Object<'a>) { + @if data.has(ADMIN_IMPORT_BUSY.0) { + h1 { @tr(ri.lang, "admin.import.running") } + noscript { "Live import progress needs javascript." } + div[id="admin_import"] {} + } else { + h1 { @tr(ri.lang, "admin.import.title") } + @if data.has(ADMIN_IMPORT_ERROR.0) { + section.message.error { + details { + summary { p.error { @tr(ri.lang, "admin.import_errors").replace("{n}", "1") } } + ol { @for e in data.iter(ADMIN_IMPORT_ERROR) { + li.error { pre.error { @e } } + }} + } + } + } + form[method="POST", action=u_admin_import_post(true)] { + input[type="submit", value=tr(ri.lang, "admin.dashboard.import.inc").to_string()]; + } + form[method="POST", action=u_admin_import_post(false)] { + input[type="submit", value=tr(ri.lang, "admin.dashboard.import.full").to_string()]; + } + } + } + +); diff --git a/ui/src/components/mod.rs b/ui/src/components/mod.rs index 792894e..cb9ec1b 100644 --- a/ui/src/components/mod.rs +++ b/ui/src/components/mod.rs @@ -4,6 +4,7 @@ Copyright (C) 2026 metamuffin */ +pub mod admin; pub mod login; pub mod message; pub mod node_page; @@ -13,6 +14,7 @@ pub mod stats; use crate::{ RenderInfo, components::{ + admin::{AdminDashboard, AdminImport}, login::{AccountLogin, AccountLogout, AccountSetPassword}, message::Message, node_page::NodePage, @@ -38,5 +40,11 @@ define! { @if let Some(session) = view.get(VIEW_ACCOUNT_SET_PASSWORD) { @AccountSetPassword { ri, session } } + @if let Some(()) = view.get(VIEW_ADMIN_DASHBOARD) { + @AdminDashboard { ri } + } + @if let Some(data) = view.get(VIEW_ADMIN_IMPORT) { + @AdminImport { ri, data } + } } } diff --git a/ui/src/lib.rs b/ui/src/lib.rs index 9509129..5b23ee2 100644 --- a/ui/src/lib.rs +++ b/ui/src/lib.rs @@ -10,6 +10,8 @@ mod scaffold; pub use jellyui_client_scripts::*; pub use jellyui_client_style::*; +pub use jellyui_locale::tr; + use crate::{components::View, scaffold::Scaffold}; use jellycommon::{jellyobject::Object, *}; use serde::{Deserialize, Serialize}; diff --git a/ui/src/old/admin/import.rs b/ui/src/old/admin/import.rs deleted file mode 100644 index 805d787..0000000 --- a/ui/src/old/admin/import.rs +++ /dev/null @@ -1,46 +0,0 @@ -/* - 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) 2026 metamuffin -*/ - -use crate::{FlashM, Page, locale::tr, scaffold::{FlashDisplay, RenderInfo}}; -use jellycommon::routes::u_admin_import_post; - -impl Page for AdminImportPage<'_> { - fn title(&self) -> String { - "Import".to_string() - } - fn to_render(&self) -> markup::DynRender<'_> { - markup::new!(@self) - } -} - -markup::define!( - AdminImportPage<'a>(ri: &'a RenderInfo<'a>, busy: bool, last_import_err: &'a [String], flash: &'a FlashM) { - @FlashDisplay { flash } - @if *busy { - h1 { @tr(ri.lang, "admin.import.running") } - noscript { "Live import progress needs javascript." } - div[id="admin_import"] {} - } else { - h1 { @tr(ri.lang, "admin.import.title") } - @if !last_import_err.is_empty() { - section.message.error { - details { - summary { p.error { @tr(ri.lang, "admin.import_errors").replace("{n}", &last_import_err.len().to_string()) } } - ol { @for e in *last_import_err { - li.error { pre.error { @e } } - }} - } - } - } - form[method="POST", action=u_admin_import_post(true)] { - input[type="submit", value=tr(ri.lang, "admin.dashboard.import.inc").to_string()]; - } - form[method="POST", action=u_admin_import_post(false)] { - input[type="submit", value=tr(ri.lang, "admin.dashboard.import.full").to_string()]; - } - } - } -); diff --git a/ui/src/old/admin/mod.rs b/ui/src/old/admin/mod.rs deleted file mode 100644 index f42ba76..0000000 --- a/ui/src/old/admin/mod.rs +++ /dev/null @@ -1,64 +0,0 @@ -/* - 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) 2026 metamuffin -*/ - -pub mod import; -pub mod log; -pub mod user; - -use crate::{FlashM, Page, locale::tr, scaffold::{FlashDisplay, RenderInfo}}; -use jellycommon::routes::{ - u_admin_import, u_admin_invite_create, u_admin_invite_remove, u_admin_log, - u_admin_update_search, u_admin_users, -}; - -impl Page for AdminDashboardPage<'_> { - fn title(&self) -> String { - "Admin Dashboard".to_string() - } - fn to_render(&self) -> markup::DynRender<'_> { - markup::new!(@self) - } -} - -markup::define!( - AdminDashboardPage<'a>(ri: &'a RenderInfo<'a>, busy: Option<&'static str>, flash: &'a FlashM, invites: &'a [String]) { - h1 { @tr(ri.lang, "admin.dashboard.title") } - @FlashDisplay { flash } - ul { - li{a[href=u_admin_log(true)] { @tr(ri.lang, "admin.log.warnonly") }} - li{a[href=u_admin_log(false)] { @tr(ri.lang, "admin.log.full") }} - } - - a[href=u_admin_import()] { h2 { @tr(ri.lang, "admin.import.title") }} - @if let Some(text) = busy { - section.message { p.warn { @text } } - } - form[method="POST", action=u_admin_update_search()] { - input[type="submit", value=tr(ri.lang, "admin.dashboard.update_search").to_string()]; - } - h2 { @tr(ri.lang, "admin.dashboard.users") } - p { a[href=u_admin_users()] { @tr(ri.lang, "admin.dashboard.manage_users") } } - h2 { @tr(ri.lang, "admin.dashboard.invites") } - form[method="POST", action=u_admin_invite_create()] { - input[type="submit", value=tr(ri.lang, "admin.dashboard.create_invite").to_string()]; - } - ul { @for t in *invites { - li { - form[method="POST", action=u_admin_invite_remove()] { - span { @t } - input[type="text", name="invite", value=&t, hidden]; - input[type="submit", value=tr(ri.lang, "admin.dashboard.create_invite").to_string()]; - } - } - }} - - // h2 { "Database" } - // @match db_stats(&database) { - // Ok(s) => { @s } - // Err(e) => { pre.error { @format!("{e:?}") } } - // } - } -); -- cgit v1.3