diff --git a/frontend/Trunk.toml b/frontend/Trunk.toml
index 873c674..a981fdf 100644
--- a/frontend/Trunk.toml
+++ b/frontend/Trunk.toml
@@ -1,6 +1,6 @@
[serve]
# The address to serve on LAN.
-addresses = ["127.0.0.1", "Brick"]
+addresses = ["127.0.0.1"]
# The address to serve on WAN.
# address = "0.0.0.0"
# The port to serve on.
diff --git a/frontend/src/lib.rs b/frontend/src/lib.rs
index 83c6a12..330ad82 100644
--- a/frontend/src/lib.rs
+++ b/frontend/src/lib.rs
@@ -13,6 +13,8 @@ enum Route {
TicketById { id: i32 },
#[at("/tickets")]
AllTickets,
+ #[at("/register")]
+ Register,
#[not_found]
#[at("/404")]
NotFound,
@@ -25,6 +27,7 @@ fn switch(route: Route) -> Html {
Route::Ticket => html! { },
Route::TicketById { id } => html! { },
Route::AllTickets => html! { },
+ Route::Register => html! { },
}
}
diff --git a/frontend/src/pages/mod.rs b/frontend/src/pages/mod.rs
index 01340f0..6545e54 100644
--- a/frontend/src/pages/mod.rs
+++ b/frontend/src/pages/mod.rs
@@ -1,2 +1,3 @@
pub mod basic_pages;
pub mod ticket;
+pub mod user;
diff --git a/frontend/src/pages/ticket.rs b/frontend/src/pages/ticket.rs
index 5a21f5f..fac1faa 100644
--- a/frontend/src/pages/ticket.rs
+++ b/frontend/src/pages/ticket.rs
@@ -1,6 +1,5 @@
use gloo_net::http::Request;
use serde::{Deserialize, Serialize};
-use serde_json::json;
use wasm_bindgen::JsCast;
use wasm_bindgen_futures::spawn_local;
use web_sys::HtmlSelectElement;
diff --git a/frontend/src/pages/user.rs b/frontend/src/pages/user.rs
new file mode 100644
index 0000000..3e3743d
--- /dev/null
+++ b/frontend/src/pages/user.rs
@@ -0,0 +1,148 @@
+use gloo_net::http::Request;
+use serde::{Deserialize, Serialize};
+use wasm_bindgen_futures::spawn_local;
+use yew::prelude::*;
+
+#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
+pub struct User {
+ pub id: i16,
+ pub last_name: String,
+ pub first_name: String,
+ pub username: String,
+ pub is_admin: bool,
+ pub pwd: String,
+}
+
+#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
+pub struct UserCreateScheme {
+ pub first_name: String,
+ pub last_name: String,
+ pub username: String,
+ pub is_admin: bool,
+ pub pwd: String,
+}
+
+#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
+pub struct LoginScheme {
+ pub username: String,
+ pub pwd: String,
+}
+
+#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
+pub struct FilteredUser {
+ pub id: i16,
+ pub first_name: String,
+ pub last_name: String,
+ pub username: String,
+ pub is_admin: bool,
+}
+
+#[component(Register)]
+pub fn register_component() -> Html {
+ let first_name = use_state(|| "".to_string());
+ let last_name = use_state(|| "".to_string());
+ let username = use_state(|| "".to_string());
+ let is_admin = use_state(|| false);
+ let pwd = use_state(|| "".to_string());
+ let status = use_state(|| None::);
+
+ let onsubmit = {
+ let first_name = first_name.clone();
+ let last_name = last_name.clone();
+ let username = username.clone();
+ let is_admin = is_admin.clone();
+ let pwd = pwd.clone();
+ let status = status.clone();
+
+ Callback::from(move |e: SubmitEvent| {
+ e.prevent_default();
+ let first_name = (*first_name).clone();
+ let last_name = (*last_name).clone();
+ let username = (*username).clone();
+ let is_admin = *is_admin;
+ let pwd = (*pwd).clone();
+ let status = status.clone();
+
+ spawn_local(async move {
+ let payload = UserCreateScheme {
+ first_name,
+ last_name,
+ username,
+ is_admin,
+ pwd,
+ };
+
+ let request = Request::post("/api/register")
+ .json(&payload)
+ .expect("Error building request");
+
+ match request.send().await {
+ Ok(response) if response.status() == 200 => status.set(Some("Success".into())),
+ Ok(response) => status.set(Some(format!("Error: {}", response.status()))),
+ Err(err) => status.set(Some(format!("Network error: {}", err))),
+ }
+ });
+ })
+ };
+
+ let fn_change = {
+ let first_name = first_name.clone();
+ Callback::from(move |e: InputEvent| {
+ let input: web_sys::HtmlInputElement = e.target_unchecked_into();
+ first_name.set(input.value());
+ })
+ };
+
+ let ln_change = {
+ let last_name = last_name.clone();
+ Callback::from(move |e: InputEvent| {
+ let input: web_sys::HtmlInputElement = e.target_unchecked_into();
+ last_name.set(input.value());
+ })
+ };
+
+ let un_change = {
+ let username = username.clone();
+ Callback::from(move |e: InputEvent| {
+ let input: web_sys::HtmlInputElement = e.target_unchecked_into();
+ username.set(input.value());
+ })
+ };
+
+ let admin_change = {
+ let is_admin = is_admin.clone();
+ Callback::from(move |e: Event| {
+ let input: web_sys::HtmlInputElement = e.target_unchecked_into();
+ is_admin.set(input.checked());
+ })
+ };
+
+ let pwd_change = {
+ let pwd = pwd.clone();
+ Callback::from(move |e: InputEvent| {
+ let input: web_sys::HtmlInputElement = e.target_unchecked_into();
+ pwd.set(input.value());
+ })
+ };
+
+ html! {
+
+ }
+}