241 lines
7.5 KiB
Plaintext
241 lines
7.5 KiB
Plaintext
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 didn’t 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>
|
||
}
|
||
}
|