flams_router_dashboard/
settings.rs

1use 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}