Loading portal/static/js/components/pages/Login.mjs 0 → 100644 +74 −0 Changes for portal/static/js/components/pages/Login.mjs: 74 added lines, 0 removed lines. Original line number Diff line number Diff line import { Base } from "./Base.mjs" import { isLoggedIn, login } from "../../account.mjs" function redirectBack() { const next = m.route.param("next") try { if (!next.startsWith("/")) { throw new Error("Invalid next path.") } m.route.set(next) } catch (e) { m.route.set("/") } } function onLoginClicked() { document .querySelectorAll("form input") .forEach(element => (element.disabled = true)) login( document.querySelector("#username").value, document.querySelector("#password").value, ) .then(redirectBack) .catch(error => { document .querySelectorAll("form input") .forEach(element => (element.disabled = false)) document .getElementById(error.response.invalid) .parentElement.classList.add("error") }) } export const Login = { oncreate() { document.title = "Anmelden · FS Coli Portal" }, view() { return m( Base, m("article.box", [ m("h1", "Anmelden"), m( "form", { onsubmit: function (event) { onLoginClicked() event.preventDefault() // don't let the browser send GET or POST requests... }, }, [ m("input", { id: "username", required: "true", label: "Benutzername", errorText: "Es gibt keinen Benutzer mit diesem Namen.", }), m("input", { id: "password", type: "password", required: true, label: "Passwort", errorText: "Das Passwort ist falsch.", }), m("input", { type: "submit", value: "Anmelden" }), ], ), ]), ) }, } portal/static/js/components/pieces/Nav.mjs +17 −1 Changes for portal/static/js/components/pieces/Nav.mjs: 17 added lines, 1 removed line. Original line number Diff line number Diff line import { NavPageLink } from "./NavPageLink.mjs" import { logout, isLoggedIn } from "../../account.mjs" export const Nav = { view() { Loading Loading @@ -28,7 +29,22 @@ export const Nav = { m("ul", [ m( "li", m(NavPageLink, { isLoggedIn() ? m( "a", { href: "#", onclick: function (event) { logout() event.preventDefault() }, }, [ m("i.fa-solid.fa-right-from-bracket"), " Abmelden", ], ) : m(NavPageLink, { href: `/login?next=${m.route.get() || "/"}`, label: " Anmelden", icon: "fa-regular fa-user", Loading portal/static/js/portal.mjs +2 −0 Changes for portal/static/js/portal.mjs: 2 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ import { All } from "./components/pages/AllServices.mjs" import { Start } from "./components/pages/Start.mjs" import { Unlock } from "./components/pages/Unlock.mjs" import { Fachschaftssitzung } from "./components/pages/Fachschaftssitzung.mjs" import { Login } from "./components/pages/Login.mjs" import "/static/lib/mithril/mithril.min.js" // See https://mithril.js.org/route.html#routing-strategies Loading @@ -11,4 +12,5 @@ m.route(document.body, "/", { "/all-services": All, "/unlock": Unlock, "/fachschaftssitzung": Fachschaftssitzung, "/login": Login, }) Loading
portal/static/js/components/pages/Login.mjs 0 → 100644 +74 −0 Changes for portal/static/js/components/pages/Login.mjs: 74 added lines, 0 removed lines. Original line number Diff line number Diff line import { Base } from "./Base.mjs" import { isLoggedIn, login } from "../../account.mjs" function redirectBack() { const next = m.route.param("next") try { if (!next.startsWith("/")) { throw new Error("Invalid next path.") } m.route.set(next) } catch (e) { m.route.set("/") } } function onLoginClicked() { document .querySelectorAll("form input") .forEach(element => (element.disabled = true)) login( document.querySelector("#username").value, document.querySelector("#password").value, ) .then(redirectBack) .catch(error => { document .querySelectorAll("form input") .forEach(element => (element.disabled = false)) document .getElementById(error.response.invalid) .parentElement.classList.add("error") }) } export const Login = { oncreate() { document.title = "Anmelden · FS Coli Portal" }, view() { return m( Base, m("article.box", [ m("h1", "Anmelden"), m( "form", { onsubmit: function (event) { onLoginClicked() event.preventDefault() // don't let the browser send GET or POST requests... }, }, [ m("input", { id: "username", required: "true", label: "Benutzername", errorText: "Es gibt keinen Benutzer mit diesem Namen.", }), m("input", { id: "password", type: "password", required: true, label: "Passwort", errorText: "Das Passwort ist falsch.", }), m("input", { type: "submit", value: "Anmelden" }), ], ), ]), ) }, }
portal/static/js/components/pieces/Nav.mjs +17 −1 Changes for portal/static/js/components/pieces/Nav.mjs: 17 added lines, 1 removed line. Original line number Diff line number Diff line import { NavPageLink } from "./NavPageLink.mjs" import { logout, isLoggedIn } from "../../account.mjs" export const Nav = { view() { Loading Loading @@ -28,7 +29,22 @@ export const Nav = { m("ul", [ m( "li", m(NavPageLink, { isLoggedIn() ? m( "a", { href: "#", onclick: function (event) { logout() event.preventDefault() }, }, [ m("i.fa-solid.fa-right-from-bracket"), " Abmelden", ], ) : m(NavPageLink, { href: `/login?next=${m.route.get() || "/"}`, label: " Anmelden", icon: "fa-regular fa-user", Loading
portal/static/js/portal.mjs +2 −0 Changes for portal/static/js/portal.mjs: 2 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ import { All } from "./components/pages/AllServices.mjs" import { Start } from "./components/pages/Start.mjs" import { Unlock } from "./components/pages/Unlock.mjs" import { Fachschaftssitzung } from "./components/pages/Fachschaftssitzung.mjs" import { Login } from "./components/pages/Login.mjs" import "/static/lib/mithril/mithril.min.js" // See https://mithril.js.org/route.html#routing-strategies Loading @@ -11,4 +12,5 @@ m.route(document.body, "/", { "/all-services": All, "/unlock": Unlock, "/fachschaftssitzung": Fachschaftssitzung, "/login": Login, })