flams_router_dashboard/
settings.rs1use flams_router_base::require_login;
2use flams_utils::settings::SettingsSpec;
3use flams_web_utils::{components::wait_and_then_fn, inject_css};
4use leptos::prelude::*;
5
6#[server(
7 prefix="/api",
8 endpoint="settings",
9 output=server_fn::codec::Json
10)]
11#[allow(clippy::unused_async)]
12pub async fn get_settings() -> Result<(SettingsSpec, usize, bool), ServerFnError<String>> {
13 use flams_router_base::LoginState;
14 use flams_system::backend::GlobalBackend;
15 use flams_system::settings::Settings;
16 match LoginState::get_server() {
17 LoginState::Admin | LoginState::NoAccounts | LoginState::User { is_admin: true, .. } => {
18 let mut spec = Settings::get().as_spec();
19 if let Some(pw) = spec.server.admin_pwd.as_mut() {
20 *pw = "********".to_string();
21 }
22 if let Some(tk) = spec.gitlab.token.as_mut() {
23 *tk = "********".to_string().into_boxed_str();
24 }
25 if let Some(secret) = spec.gitlab.app_secret.as_mut() {
26 *secret = "********".to_string().into_boxed_str();
27 }
28 let rels = GlobalBackend::get().triple_store().num_relations();
29 Ok((spec, rels, flams_git::gl::GLInstance::global().has_loaded()))
30 }
31 _ => Err("Not logged in".to_string().into()),
32 }
33}
34#[server(
35 prefix="/api",
36 endpoint="reload",
37 output=server_fn::codec::Json
38)]
39pub async fn reload() -> Result<(), ServerFnError<String>> {
40 use flams_router_base::LoginState;
41 use flams_system::backend::GlobalBackend;
42 match LoginState::get_server() {
43 LoginState::Admin | LoginState::NoAccounts | LoginState::User { is_admin: true, .. } => {
44 let _ = tokio::task::spawn_blocking(move || GlobalBackend::get().reset()).await;
45 Ok(())
46 }
47 _ => Err("Not logged in".to_string().into()),
48 }
49}
50
51#[component]
52pub(super) fn Settings() -> impl IntoView {
53 use thaw::Table;
54 inject_css("flams-settings", include_str!("settings.css"));
55 require_login(|| {
56 wait_and_then_fn(get_settings, |(settings, mem, gl)| {
57 let loading = RwSignal::new(false);
58 let reload_act = flams_web_utils::components::message_action(
59 move |()| {
60 loading.set(true);
61 reload()
62 },
63 move |()| {
64 loading.set(false);
65 format!("success")
66 },
67 );
68 view!(
69 <Table class="flams-settings-table"><thead/><tbody>
70 <tr><td><h2>"Status"</h2></td><td/></tr>
71 <tr>
72 <td class="flams-settings-col"><b>"Relations"</b></td>
73 <td class="flams-settings-col">{mem.to_string()}</td>
74 </tr>
75 <tr>
76 <td></td>
77 <td>{move || if loading.get() {
78 leptos::either::Either::Left(view!(<flams_web_utils::components::Spinner/>))
79 } else {
80 leptos::either::Either::Right(view!(<button on:click=move |_| {reload_act.dispatch(());}>"Reload"</button>))
81 }
82 }</td>
83 </tr>
84 <tr><td><h2>"Settings"</h2></td><td/></tr>
85 <tr><td><h3>"General"</h3></td><td/></tr>
86 <tr>
87 <td class="flams-settings-col"><b>"MathHub"</b></td>
88 <td class="flams-settings-col">{settings.mathhubs.into_iter().map(|m| m.display().to_string() + " ").collect::<Vec<_>>()}</td>
89 </tr>
90 <tr>
91 <td class="flams-settings-col"><b>"Debug Mode"</b></td>
92 <td class="flams-settings-col">{settings.debug}</td>
93 </tr>
94 <tr>
95 <td class="flams-settings-col"><b>"Log Directory"</b></td>
96 <td class="flams-settings-col">{settings.log_dir.unwrap_or_else(|| unreachable!()).display().to_string()}</td>
97 </tr>
98 <tr>
99 <td class="flams-settings-col"><b>"Database Path"</b></td>
100 <td class="flams-settings-col">{settings.database.unwrap_or_else(|| unreachable!()).display().to_string()}</td>
101 </tr>
102 <tr>
103 <td class="flams-settings-col"><b>"Temp Directory"</b></td>
104 <td class="flams-settings-col">{settings.temp_dir.unwrap_or_else(|| unreachable!()).display().to_string()}</td>
105 </tr>
106 <tr><td><h3>"Server"</h3></td><td/></tr>
107 <tr>
108 <td class="flams-settings-col"><b>"IP/Port"</b></td>
109 <td class="flams-settings-col">{settings.server.ip.unwrap_or_else(|| unreachable!())}":"{settings.server.port}</td>
110 </tr>
111 <tr>
112 <td class="flams-settings-col"><b>"Gitlab URL"</b></td>
113 <td class="flams-settings-col">{settings.gitlab.url.map_or_else(|| leptos::either::Either::Left("(None)".to_string()),|s|
114 leptos::either::Either::Right(view!({s.to_string()}{
115 if gl {
116 leptos::either::Either::Left(view!(" "<div style="color:green;display:inline;"><thaw::Icon icon=icondata_ai::AiCheckOutlined/></div>))
117 } else {
118 leptos::either::Either::Right(view!(" "<div style="color:red;display:inline;"><thaw::Icon icon=icondata_ai::AiCloseOutlined/></div>))
119 }
120 })
121 ))}</td>
122 </tr>
123 <tr><td><h3>"Build Queue"</h3></td><td/></tr>
124 <tr>
125 <td class="flams-settings-col"><b>"Threads:"</b></td>
126 <td class="flams-settings-col">{settings.buildqueue.num_threads}</td>
127 </tr>
128 </tbody></Table>
129 )
130 })
131 })
132}