Verified Commit e09eb033 authored by Jakob Moser's avatar Jakob Moser
Browse files

Add rudimentary (but working) login UI

parent a09d9fd0
Loading
Loading
Loading
Loading
+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" }),
                    ],
                ),
            ]),
        )
    },
}
+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() {
@@ -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",
+2 −0
Changes for portal/static/js/portal.mjs: 2 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -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
@@ -11,4 +12,5 @@ m.route(document.body, "/", {
    "/all-services": All,
    "/unlock": Unlock,
    "/fachschaftssitzung": Fachschaftssitzung,
    "/login": Login,
})