Begin work on login form

master
Tait Hoyem 10 months ago
parent a47c68eb5a
commit 3857adcdc6

@ -8,7 +8,7 @@ edition = "2021"
[dependencies]
askama = { git = "https://github.com/TTWNO/askama/", features = ["with-axum", "i18n"] }
askama_axum = { git = "https://github.com/TTWNO/askama/" }
axum = { version = "0.6.15" }
axum = { version = "0.6.15", features = ["form"] }
chrono = { version = "0.4.24", features = ["serde"] }
serde = "1.0.158"
static_assertions = "1.1.0"
@ -21,6 +21,7 @@ strum_macros = "0.24.3"
hashmap_macro = "0.1.0"
ibihf-macros = { version = "0.1.0", path = "ibihf-macros" }
rename-item = "0.1.1"
bcrypt = "0.15.0"
[dev-dependencies]
tokio-test = "0.4.2"

@ -0,0 +1,26 @@
use crate::{SupportedLanguage, Locale, VERSION};
use axum::Form;
use askama_axum::Template;
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize, Debug, Default)]
pub struct Login {
username: String,
password: String,
}
impl std::fmt::Display for Login {
fn fmt(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(formatter, r#"
<form method="POST">
<label for="uname">Username</label>
<input id="uname" type="text" name="username"/>
<br/>
<label for="pass">Password</label>
<input id="pass" type="password" name="password"/>
<input type="submit"/>
</forn>
"#);
Ok(())
}
}

@ -1,6 +1,7 @@
#![warn(clippy::all, clippy::pedantic, unsafe_code)]
mod db;
mod forms;
mod filters;
mod languages;
mod model;
@ -86,6 +87,7 @@ use views::{GoalDetails, IihfStatsI64, PlayerStats, ShotDetails, TeamStats};
use askama::Template;
use axum::{
Form,
extract::{Path, State},
http::StatusCode,
response::IntoResponse,
@ -155,6 +157,19 @@ struct DivisionListTemplate<'a> {
impl_url_gen!(DivisionListTemplate, id: i32);
assert_impl_all!(DivisionListTemplate: TemplateUrl);
#[derive(Template, TemplateUrl)]
#[urls(url_key = "login_url", url_key_template = "login_url_tmpl")]
#[template(path = "form.html")]
struct LoginFormTemplate<'a> {
#[locale]
locale: Locale<'a>,
lang_links: Vec<LangLink>,
lang: SupportedLanguage,
form: forms::Login,
}
impl_url_gen!(LoginFormTemplate, id: i32);
assert_impl_all!(LoginFormTemplate: TemplateUrl);
#[derive(Template, TemplateUrl)]
#[urls(url_key = "root_url", url_key_template = "root_url_tmpl")]
#[template(path = "league_list.html")]
@ -247,6 +262,10 @@ async fn main() {
let router = Router::new()
.route("/", get(language_list))
.route("/:lang/", get(league_html))
.route(
&SupportedLanguage::English.lookup(LoginFormTemplate::URL_KEY),
get(login_form),
)
.route(
&SupportedLanguage::English.lookup(PlayerPageTemplate::URL_KEY),
get(player_html),
@ -276,6 +295,17 @@ async fn main() {
.unwrap();
}
async fn login_form(
Path(lang): Path<SupportedLanguage>,
) -> impl IntoResponse {
(StatusCode::OK, LoginFormTemplate {
locale: lang.into(),
lang_links: other_lang_urls!(lang, LeagueListTemplate),
lang,
form: forms::Login::default(),
})
}
async fn player_html(
State(server_config): State<ServerState>,
Path((lang,id)): Path<(SupportedLanguage, i32)>,

@ -0,0 +1,5 @@
{% extends "master.html" %}
{% block content %}
{{ form|safe }}
{% endblock %}

@ -6,7 +6,11 @@
{% block head %}{% endblock %}
</head>
<body>
<header></header>
<header>
<nav>
<a href="{{ localize("login_url_tmpl", lang: lang) }}">Login</a>
</nav>
</header>
<main>
{% block content %}{% endblock %}
</main>

@ -0,0 +1,22 @@
{% extends "master.html" %}
{% block content %}
<table>
<thead>
<tr>
<th>{{ localize("league_name") }}</th>
<th>{{ localize("start_date") }}</th>
<th>{{ localize("end_date") }}</th>
</tr>
</thead>
<tbody>
{% for league in leagues %}
<tr>
<td>{{ league.name|nullable }}</td>
<td>{{ league.start_date }}</td>
<td>{{ league.end_date }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}

@ -0,0 +1,8 @@
{% extends "master.html" %}
{% block content %}
<form method="POST" enctype="multipart/form-data">
{% block form %}{% endblock %}
<input type="submit" value="{% block submit_text %}{% endblock %}"/>
</form>
{% endblock %}

@ -1,5 +1,7 @@
root_url = /:lang/
root_url_tmpl = /{ $lang }/
login_url = /:lang/login/
login_url_tmpl = /{ $lang }/login/
player_url = /:lang/player/:id/
player_url_tmpl = /{ $lang }/player/{ $id }/
game_url = /:lang/game/:id/

Loading…
Cancel
Save