learnlytics-go/components/components.templ

241 lines
7.5 KiB
Plaintext
Raw Permalink Normal View History

2025-03-20 12:35:13 +01:00
package components
import (
"time"
"strconv"
"math/rand/v2"
)
func getCurrentTime() string {
loc, err := time.LoadLocation("Europe/Berlin")
if err != nil {
}
t := time.Now().In(loc)
layout := "02.01.2006 15:04"
return t.Format(layout)
}
func genRandomData(count int) []float64 {
data := make([]float64, count)
for i := 0; i < count; i++ {
data[i] = rand.NormFloat64() * 30 + 50
}
return data
}
templ base(title string) {
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta
name="description"
content="Learnlytics: WebApp to manage classrooms"
/>
<meta name="google" content="notranslate"/>
<link rel="icon" href="assets/img/icon/favicon.ico" type="image/x-icon"/>
<link rel="apple-touch-icon" sizes="180x180" href="assets/img/icon/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="assets/img/icon/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="assets/img/icon/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="stylesheet" href="assets/css/colors.css" />
<link rel="stylesheet" href="assets/css/style.css" />
<link rel="stylesheet" href="assets/css/grid_layout.css" />
<title>Learnlytics - { title }</title>
<script src="assets/js/utils.js"></script>
<script src="assets/js/chartUtils.js"></script>
<script src="assets/js/htmx.min.js"></script>
<script src="assets/js/chart.js"></script>
<script>
Chart.defaults.color = "#E0E1DD";
Chart.defaults.backgroundColor = "#2ec4b6";
Chart.defaults.borderColor = "#00000000";
Chart.defaults.font.family = "'lato-regular', sans-serif";
Chart.defaults.plugins.align = 'center';
Chart.defaults.plugins.display = true;
Chart.defaults.plugins.padding = 10;
</script>
</head>
<body>
@navbar()
<div class="content_container">
{ children... }
</div>
</body>
</html>
}
templ footer() {
<footer>
<p>Author: @DerGrumpf</p>
</footer>
}
templ navbar() {
<div class="navbar">
<ul>
<li><img src="assets/img/learnlytics.svg" alt="Learnlytics Logo"></li>
<li><a href="/">Dashboard</a></li>
<li><a href="/">Dashboard</a></li>
<li><a href="/">Dashboard</a></li>
<li><a href="/">Dashboard</a></li>
<li><a href="/">About</a></li>
</ul>
</div>
}
templ selectList(labels []string) {
<div class="select_list">
<form>
<fieldset>
<legend>Students:</legend>
for index, label := range labels {
<label for={ strconv.Itoa(index) }>{ label }</label>
<input type="radio" id={ strconv.Itoa(index) }><br><br>
}
</fieldset>
</form>
</div>
}
templ usercard(username string) {
<div class="usercard">
<img src="assets/img/user.jpeg" alt="Avatar">
<h1>{ username }</h1>
<div class="two-split">
<div class="grid-item-left">
<p>Insitution:</p>
</div>
<div class="grid-item-left">
<p>IFN @ TU BS</p>
</div>
<div class="grid-item-left">
<p>Mail:</p>
</div>
<div class="grid-item-left">
<p>p.keier@beyerstedt-it.de</p>
</div>
<div class="grid-item-left">
<p>Created:</p>
</div>
<div class="grid-item-left">
<p>{ getCurrentTime() }</p>
</div>
</div>
</div>
}
templ NotFound() {
@base("Error") {
<div class="error">
<h1>404 - Not Found</h1>
<div class="side_by_side">
<img src="assets/img/smiley-x.svg" alt="Dead Smiley">
<img src="assets/img/failed-exam.svg" alt="Failed Exam">
</div>
<h2>This Page Didn't Pass the Exam</h2>
<p>It tried, but it didnt make the cut.</p>
<p>Better check the <a href="/">Dashboard</a> instead!</p>
</div>
}
}
templ Test() {
@base("Test") {
<div class="two-split two-row">
<div class="grid-item-center">
Test
</div>
<div class="grid-item-center">
@polarChart(
"1",
genRandomData(6),
[]string{"Klasse 8a", "Klasse 5b", "Klasse 6c", "Klasse 10d", "Englisch LK 12", "Geschickte GK 11"},
"Points scored",
"Classes",
"Classes",
"",
)
</div>
<div class="grid-item-center">
Test
</div>
<div class="grid-item-center">
@doughnutChart(
"1",
genRandomData(6),
[]string{"Klasse 8a", "Klasse 5b", "Klasse 6c", "Klasse 10d", "Englisch LK 12", "Geschickte GK 11"},
"Points scored",
"Classes",
"Classes",
"",
)
</div>
</div>
}
}
templ Dashboard(username string) {
@base("Dashboard") {
<div class="two-split three-row">
<div class="grid-item-center">
@usercard(username)
</div>
<div class="grid-item-center">
@barChart(
"2",
genRandomData(6),
[]string{"Klasse 8a", "Klasse 5b", "Klasse 6c", "Klasse 10d", "Englisch LK 12", "Geschickte GK 11"},
"Points scored",
"Classes",
"Classes",
"",
)
</div>
<div class="grid-item-center">
@selectList([]string{"Phil Keier", "Calvin Brandt", "Nova Eib"})
</div>
<div class="grid-item-center">
@barLineChart(
"1",
[]float64{31, 15, 18, 35, 20, 20, 22, 27, 24, 30},
[]string{"Tutorial 1", "Tutorial 2", "Extended Applications", "Numpy & MatPlotLib", "SciPy", "MonteCarlo", "Pandas & Seaborn", "Folium", "Statistical Test Methods", "Data Analysis"},
"Points scored",
"Lectures",
"Lectures",
"Points",
)
</div>
</div>
}
}
templ Login() {
@base("Login") {
<div class="login">
<img src="assets/img/learnlytics.svg" alt="Learnlytics Logo">
<h1>Learnlytics</h1>
<form action="/" method="POST">
<input type="text" id="username" name="username" placeholder="Username" required><br><br>
<input type="password" id="password" name="password" placeholder="Password" required><br><br>
<input type="submit" value="Login">
</form>
</div>
}
}