got rid of mock-frontend
This commit is contained in:
parent
e4ddcd9e49
commit
2dd58acb59
@ -1,181 +0,0 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>UniWorX | Kurse</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="src/css/main.css">
|
||||
<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,800,900" rel="stylesheet">
|
||||
<script src="lib/velocity.min.js"></script>
|
||||
<script data-main="src/js/main" src="lib/require.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="grid">
|
||||
<header class="header">
|
||||
<nav>
|
||||
<ul class="flat">
|
||||
<li><a href="/">Startseite</a></li>
|
||||
<li><a href="/courses.html">Kurse</a></li>
|
||||
<li><a href="/settings">Benutzerinstellungen</a></li>
|
||||
<li><a href="/logout">Abmelden</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<aside class="sidebar">
|
||||
<div class="box">
|
||||
<h3>Wintersemester 2017/2018</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<h4>Bachelor-Seminar "Web Technologies"</h4>
|
||||
<ul>
|
||||
<li>Übungsgruppen</li>
|
||||
<li>Abgaben</li>
|
||||
<li>Klausuren</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<h4>Blockpraktikum: "Concept Development"</h4>
|
||||
<ul>
|
||||
<li>Übungsgruppen</li>
|
||||
<li>Abgaben</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="box">
|
||||
<div class="box-title">Boxilein</div>
|
||||
<p>Kleines Boxilein am Randilein</p>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
|
||||
<section class="main-content">
|
||||
<h1>Kurse</h1>
|
||||
<h2>Wintersemester 2017/2018</h2>
|
||||
<div class="box course-box">
|
||||
<div class="course">
|
||||
<h4>Bachelor-Seminar "Web Technologies"</h4>
|
||||
<p>
|
||||
In diesem Seminar erstellen die Teilnehmer Lehrmaterialien zu ausgewählten aktuellen Web-Technologien. Im Zuge des Seminars werden dazu Folien erstellt, vorgetragen und eine wissenschaftliche Ausarbeitung über das Thema erstellt.
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
<h4 class="js-show-hide-toggle">Übungsgruppen</h4>
|
||||
|
||||
<div>
|
||||
<table class="sortable">
|
||||
<tr>
|
||||
<th>Name (Raum)</th>
|
||||
<th>Termin</th>
|
||||
<th>Studenten</th>
|
||||
<th>Tutor</th>
|
||||
<th>Anmeldezeitraum</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Gruppe 1<br>Leopoldstraße 13, Raum 1502</td>
|
||||
<td>Fr. 10:15</td>
|
||||
<td>35/35</td>
|
||||
<td><a href="#">Axel Hösl</a></td>
|
||||
<td>Fr. 09.02.18, 10:00</td>
|
||||
<td><a href="#">Verlassen</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Gruppe 2<br>Leopoldstraße 13, Raum 1502</td>
|
||||
<td>Fr. 12:15</td>
|
||||
<td>13/20</td>
|
||||
<td><a href="#">Sebastian Mader</a></td>
|
||||
<td>Fr. 09.02.18, 10:00</td>
|
||||
<td><a href="#">Verlassen</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Gruppe 3<br>Leopoldstraße 13, Raum 1502</td>
|
||||
<td>Fr. 14:15</td>
|
||||
<td>7/25</td>
|
||||
<td><a href="#">Max Mustermann</a></td>
|
||||
<td>Fr. 09.02.18, 10:00</td>
|
||||
<td><a href="#">Verlassen</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<h4 class="js-show-hide-toggle">Abgaben</h4>
|
||||
|
||||
<div>
|
||||
Arbitrary content
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<h4 class="js-show-hide-toggle">Klausuren</h4>
|
||||
|
||||
<div>
|
||||
Etwas anderes...
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="course">
|
||||
<h4>Blockpraktikum: "Concept Development"</h4>
|
||||
<ul>
|
||||
<li>
|
||||
<h4 class="js-show-hide-toggle">Übungsgruppen</h4>
|
||||
|
||||
<div>
|
||||
<table>
|
||||
<tr>
|
||||
<th>Name (Raum)</th>
|
||||
<th>Termin</th>
|
||||
<th>Studenten</th>
|
||||
<th>Tutor</th>
|
||||
<th>Anmeldezeitraum</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Gruppe 1<br>Leopoldstraße 13, Raum 1502</td>
|
||||
<td>Fr. 09.02.18, 10:00</td>
|
||||
<td>35/35</td>
|
||||
<td><a href="#">Axel Hösl</a></td>
|
||||
<td>Fr. 09.02.18, 10:00</td>
|
||||
<td><a href="#">Verlassen</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</li>
|
||||
<li>Abgaben</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<h2>Sommersemester 2017</h2>
|
||||
<div class="box course-box">
|
||||
<h4>Human Factors in Engineering</h4>
|
||||
<ul>
|
||||
<li>Klausuren</li>
|
||||
</ul>
|
||||
<h4>Vorlesung Multimedia Programmierung</h4>
|
||||
<ul>
|
||||
<li>
|
||||
<h4 class="js-show-hide-toggle">Übungsgruppen</h4>
|
||||
</li>
|
||||
<li>
|
||||
<h4 class="js-show-hide-toggle">Abgaben</h4>
|
||||
<div>
|
||||
Bisher keine Abgaben für <em>Vorlesung Multimedia Programmierung</em>.
|
||||
</div>
|
||||
</li>
|
||||
<li>Klausuren</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<footer class="footer">
|
||||
<nav>
|
||||
<ul class="flat">
|
||||
<li><a href="">Impressum</a></li>
|
||||
<li><a href="">Kontakt</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</footer>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@ -1,18 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>TITLE</title>
|
||||
<meta name="description" content="DESCRIPTION">
|
||||
<link rel="stylesheet" href="PATH">
|
||||
|
||||
<!--[if lt IE 9]>
|
||||
<script src = "http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@ -1,40 +0,0 @@
|
||||
{
|
||||
"events": [
|
||||
{
|
||||
"title": "Bachelor Seminar \"Räumliche Informationssysteme\"",
|
||||
"description": "Dieses Seminar dient der Hinführung zum wissenschatlichen Arbeiten in zweifacher Hinsicht. Esse incididunt dolore deserunt id non veniam.",
|
||||
"registrationUrl": "/app/www/events.html",
|
||||
"registrationLabel": "Zentralanmeldung"
|
||||
},
|
||||
{
|
||||
"title": "Bachelor Seminar \"Räumliche Informationssysteme\"",
|
||||
"description": "Dieses Seminar dient der Hinführung zum wissenschatlichen Arbeiten in zweifacher Hinsicht. Esse incididunt dolore deserunt id non veniam.",
|
||||
"registrationUrl": "/app/www/events.html",
|
||||
"registrationLabel": "Zentralanmeldung"
|
||||
},
|
||||
{
|
||||
"title": "Bachelor Seminar \"Räumliche Informationssysteme\"",
|
||||
"description": "Dieses Seminar dient der Hinführung zum wissenschatlichen Arbeiten in zweifacher Hinsicht. Esse incididunt dolore deserunt id non veniam.",
|
||||
"registrationUrl": "/app/www/events.html",
|
||||
"registrationLabel": "Zentralanmeldung"
|
||||
},
|
||||
{
|
||||
"title": "Bachelor Seminar \"Räumliche Informationssysteme\"",
|
||||
"description": "Dieses Seminar dient der Hinführung zum wissenschatlichen Arbeiten in zweifacher Hinsicht. Esse incididunt dolore deserunt id non veniam.",
|
||||
"registrationUrl": "/app/www/events.html",
|
||||
"registrationLabel": "Zentralanmeldung"
|
||||
},
|
||||
{
|
||||
"title": "Bachelor Seminar \"Räumliche Informationssysteme\"",
|
||||
"description": "Dieses Seminar dient der Hinführung zum wissenschatlichen Arbeiten in zweifacher Hinsicht. Esse incididunt dolore deserunt id non veniam.",
|
||||
"registrationUrl": "/app/www/events.html",
|
||||
"registrationLabel": "Zentralanmeldung"
|
||||
},
|
||||
{
|
||||
"title": "Bachelor Seminar \"Räumliche Informationssysteme\"",
|
||||
"description": "Dieses Seminar dient der Hinführung zum wissenschatlichen Arbeiten in zweifacher Hinsicht. Esse incididunt dolore deserunt id non veniam.",
|
||||
"registrationUrl": "/app/www/events.html",
|
||||
"registrationLabel": "Zentralanmeldung"
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -1,43 +0,0 @@
|
||||
var http = require('http');
|
||||
var fs = require('fs');
|
||||
|
||||
//create a server object:
|
||||
http.createServer(function (req, res) {
|
||||
res.setHeader('Access-Control-Allow-Origin', 'http://127.0.0.1:5500');
|
||||
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
|
||||
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
|
||||
res.setHeader('Access-Control-Allow-Credentials', true);
|
||||
|
||||
switch(req.url) {
|
||||
case "/events":
|
||||
fs.readFile('events.json', function(err, data) {
|
||||
if (err) {
|
||||
res.writeHead(404);
|
||||
res.write(err);
|
||||
} else {
|
||||
res.writeHead(200, {'Content-Type': 'application/json'});
|
||||
res.write(data);
|
||||
}
|
||||
res.end();
|
||||
});
|
||||
break;
|
||||
case '/home':
|
||||
fs.readFile('_home.html', function(err, data) {
|
||||
if (err) {
|
||||
res.writeHead(404);
|
||||
res.write(err);
|
||||
} else {
|
||||
res.writeHead(200, {'Content-Type': 'text/html'});
|
||||
res.write(data);
|
||||
}
|
||||
res.end();
|
||||
});
|
||||
break;
|
||||
default:
|
||||
res.writeHead(301, {'Location': '/home'});
|
||||
res.end();
|
||||
break;
|
||||
}
|
||||
}).listen(8080); //the server object listens on port 8080
|
||||
|
||||
// start with `supervisor server.js`
|
||||
@ -1,66 +0,0 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>UniWorX</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="src/css/main.css">
|
||||
<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,800,900" rel="stylesheet">
|
||||
<script src="lib/velocity.min.js"></script>
|
||||
<script data-main="src/js/main" src="lib/require.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="grid">
|
||||
<header class="header">
|
||||
<nav>
|
||||
<ul class="flat">
|
||||
<li><a href="/">Startseite</a></li>
|
||||
<li><a href="/courses.html">Kurse</a></li>
|
||||
<li><a href="/settings">Benutzerinstellungen</a></li>
|
||||
<li><a href="/logout">Abmelden</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<aside class="sidebar">
|
||||
<h2>Kalender</h2>
|
||||
<img src="https://icon-icons.com/icons2/317/PNG/512/calendar-icon_34471.png" width="100%" height="auto" alt="kalender">
|
||||
</aside>
|
||||
|
||||
<section class="main-content">
|
||||
<h1>Willkommen bei UniWorX</h1>
|
||||
<div class="box">
|
||||
<h2>Übungsblatt Deadlines</h2>
|
||||
<p>Keine kommenden Übungsblatt-Deadlines.</p>
|
||||
</div>
|
||||
<h2>Klausuren</h2>
|
||||
<div class="box">
|
||||
<table>
|
||||
<tr>
|
||||
<th>Veranstaltung</th>
|
||||
<th>Klausur</th>
|
||||
<th>Beginn</th>
|
||||
<th>Anmelde-Deadline</th>
|
||||
<th>Check</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Kurs Zeichnen und Skizzieren von Szenarien</td>
|
||||
<td>Abschlusspräsentation</td>
|
||||
<td>Fr. 09.02.18, 10:00</td>
|
||||
<td>Fr. 02.02.18, 10:00</td>
|
||||
<td>X</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<footer class="footer">
|
||||
<nav>
|
||||
<ul class="flat">
|
||||
<li><a href="#">Impressum</a></li>
|
||||
<li><a href="#">Kontakt</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</footer>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because one or more lines are too long
4
app/www/lib/velocity.min.js
vendored
4
app/www/lib/velocity.min.js
vendored
File diff suppressed because one or more lines are too long
@ -1,360 +0,0 @@
|
||||
.grid {
|
||||
display: grid;
|
||||
height: 100%;
|
||||
grid-template-columns: [grid-col-start] repeat(12, 1fr) [grid-col-end];
|
||||
grid-template-rows: var(--header-height) auto var(--footer-height);
|
||||
grid-gap: 20px;
|
||||
}
|
||||
|
||||
.grid > header {
|
||||
grid-column: span 12;
|
||||
}
|
||||
|
||||
.grid > .sidebar {
|
||||
grid-column: 2 / span 2;
|
||||
grid-row-start: 2;
|
||||
}
|
||||
|
||||
.grid > .sidebar-right {
|
||||
display: none;
|
||||
grid-column: span 2;
|
||||
grid-row-start: 2;
|
||||
}
|
||||
|
||||
.grid > section {
|
||||
grid-column: 4/span 8;
|
||||
grid-row-start: 2;
|
||||
}
|
||||
|
||||
.grid > footer {
|
||||
grid-column: span 12;
|
||||
grid-row-start: 3;
|
||||
}
|
||||
|
||||
@media (max-width: 1000px) {
|
||||
.grid {
|
||||
grid-template-columns: [grid-col-start] repeat(8, 1fr) [grid-col-end];
|
||||
grid-gap: 10px;
|
||||
}
|
||||
.grid > header {
|
||||
grid-column: span 8;
|
||||
}
|
||||
.grid > .sidebar {
|
||||
grid-column: grid-col-start / span 2;
|
||||
grid-row-start: 2;
|
||||
}
|
||||
.grid > section {
|
||||
grid-column: 3 / span 6;
|
||||
grid-row-start: 2;
|
||||
}
|
||||
.grid > footer {
|
||||
grid-column: span 8;
|
||||
grid-row-start: 3;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 800px) {
|
||||
.grid {
|
||||
grid-template-columns: [grid-col-start] repeat(4, 1fr) [grid-col-end];
|
||||
}
|
||||
.grid > header, .grid > .sidebar, .grid > section, .grid > footer {
|
||||
grid-column: span 4;
|
||||
}
|
||||
.grid > section {
|
||||
grid-row-start: 2;
|
||||
}
|
||||
.grid > .sidebar {
|
||||
grid-row-start: 3;
|
||||
}
|
||||
.grid > footer {
|
||||
grid-row-start: 4;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.grid {
|
||||
grid-template-columns: [grid-col-start] repeat(2, 1fr) [grid-col-end];
|
||||
}
|
||||
.grid > header, .grid > .sidebar, .grid > section, .grid > footer {
|
||||
grid-column: span 2;
|
||||
}
|
||||
}
|
||||
|
||||
.box {
|
||||
position: relative;
|
||||
padding: 13px 24px;
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-box-direction: normal;
|
||||
-ms-flex-direction: column;
|
||||
flex-direction: column;
|
||||
margin-bottom: 20px;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.box ul {
|
||||
margin-left: 10px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.box p {
|
||||
margin-bottom: 13px;
|
||||
}
|
||||
|
||||
.course-box {
|
||||
border-left: 1px solid #ccb3e6;
|
||||
padding: 0 20px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.course-box li {
|
||||
padding-left: 7px;
|
||||
padding-bottom: 13px;
|
||||
}
|
||||
|
||||
.course-box li h4::before {
|
||||
content: '>';
|
||||
position: absolute;
|
||||
margin-left: -13px;
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
.course-box li h4:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.course-box li h4:hover::before {
|
||||
content: 'v';
|
||||
}
|
||||
|
||||
.course-box li.collapsed {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.course-box li.collapsed > * {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.course-box li.collapsed h4 {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.course-box li.collapsed h4::before {
|
||||
content: '>';
|
||||
}
|
||||
|
||||
.course-box li.collapsed h4:hover::before {
|
||||
content: 'v';
|
||||
}
|
||||
|
||||
.course-box .course {
|
||||
margin-bottom: 7px;
|
||||
}
|
||||
|
||||
table.sortable th {
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
||||
table.sortable th.sorted-asc, table.sortable th.sorted-desc {
|
||||
color: rebeccapurple;
|
||||
}
|
||||
|
||||
table.sortable th.sorted-asc::after, table.sortable th.sorted-desc::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
right: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
top: 7px;
|
||||
border-left: 8px solid transparent;
|
||||
border-right: 8px solid transparent;
|
||||
}
|
||||
|
||||
table.sortable th.sorted-asc::after {
|
||||
border-top: 8px solid rebeccapurple;
|
||||
}
|
||||
|
||||
table.sortable th.sorted-desc::after {
|
||||
border-bottom: 8px solid rebeccapurple;
|
||||
}
|
||||
|
||||
* {
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: #ffffff;
|
||||
color: #353535;
|
||||
font-family: "Source Sans Pro", Helvetica, sans-serif;
|
||||
font-weight: 400;
|
||||
font-size: 18px;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
|
||||
a,
|
||||
a:visited,
|
||||
a:link {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
font-weight: 600;
|
||||
-webkit-transition: color .2s ease, background-color .2s ease;
|
||||
transition: color .2s ease, background-color .2s ease;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: rebeccapurple;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
ul.flat > li {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5 {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 32px;
|
||||
margin: 20px 0 10px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 24px;
|
||||
margin: 10px 0 5px;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 20px;
|
||||
margin: 5px 0 0;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 16px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
th, td {
|
||||
text-align: left;
|
||||
padding: 0 2px 0 4px;
|
||||
border-left: 1px solid rebeccapurple;
|
||||
}
|
||||
|
||||
th:first-of-type, td:first-of-type {
|
||||
border: none;
|
||||
}
|
||||
|
||||
.header {
|
||||
position: relative;
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-webkit-box-orient: horizontal;
|
||||
-webkit-box-direction: normal;
|
||||
-ms-flex-direction: row;
|
||||
flex-direction: row;
|
||||
-webkit-box-align: center;
|
||||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
-webkit-box-pack: justify;
|
||||
-ms-flex-pack: justify;
|
||||
justify-content: space-between;
|
||||
padding: 0 24px;
|
||||
height: 60px;
|
||||
line-height: 60px;
|
||||
background-color: rebeccapurple;
|
||||
width: 100%;
|
||||
text-align: right;
|
||||
overflow: hidden;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
.header > nav {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.has-sticky-nav {
|
||||
padding-top: 60px;
|
||||
}
|
||||
|
||||
.has-sticky-nav .header {
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
-webkit-transition: height .2s ease, line-height .2s ease;
|
||||
transition: height .2s ease, line-height .2s ease;
|
||||
}
|
||||
|
||||
.main-content {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
ul.flat > li > a {
|
||||
padding: 0 13px;
|
||||
position: relative;
|
||||
height: 100%;
|
||||
display: inline-block;
|
||||
color: #eaf2ff;
|
||||
}
|
||||
|
||||
ul.flat > li > a:hover {
|
||||
background-color: #542a7e;
|
||||
}
|
||||
|
||||
.footer {
|
||||
text-align: right;
|
||||
height: 50px;
|
||||
line-height: 50px;
|
||||
padding: 7px 24px;
|
||||
overflow: hidden;
|
||||
background-color: rebeccapurple;
|
||||
color: #eaf2ff;
|
||||
}
|
||||
|
||||
.event-desc {
|
||||
padding: 0 13px;
|
||||
}
|
||||
|
||||
.button, .event-registration {
|
||||
background-color: rebeccapurple;
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-webkit-box-align: center;
|
||||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
-webkit-box-pack: center;
|
||||
-ms-flex-pack: center;
|
||||
justify-content: center;
|
||||
padding: 3px 13px;
|
||||
cursor: pointer;
|
||||
font-weight: 600;
|
||||
-webkit-transition: background-color .2s ease, -webkit-transform .1s;
|
||||
transition: background-color .2s ease, -webkit-transform .1s;
|
||||
transition: transform .1s, background-color .2s ease;
|
||||
transition: transform .1s, background-color .2s ease, -webkit-transform .1s;
|
||||
}
|
||||
|
||||
.button:hover, .event-registration:hover {
|
||||
background-color: #4d2673;
|
||||
-webkit-transform: scale(1.01);
|
||||
transform: scale(1.01);
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none;
|
||||
visibility: hidden;
|
||||
}
|
||||
/*# sourceMappingURL=main.css.map */
|
||||
File diff suppressed because one or more lines are too long
@ -1,26 +0,0 @@
|
||||
define(function (require) {
|
||||
var serverUrl = "http://localhost:8080";
|
||||
|
||||
return {
|
||||
getEvents: function(cb) {
|
||||
this.getJson('events', cb);
|
||||
},
|
||||
getJson: function(req, cb) {
|
||||
console.log('requesting %s', req);
|
||||
// TODO: sanitize url
|
||||
fetch(serverUrl + req).then(function(res) {
|
||||
return res.json();
|
||||
}).then(function(res){
|
||||
cb(res);
|
||||
});
|
||||
},
|
||||
getHtml: function(req, cb) {
|
||||
fetch(serverUrl + req).then(function(res) {
|
||||
console.log(res);
|
||||
return res.text();
|
||||
}).then(function(res){
|
||||
cb(res);
|
||||
});
|
||||
}
|
||||
};
|
||||
});
|
||||
@ -1,8 +0,0 @@
|
||||
define(function (require) {
|
||||
|
||||
return {
|
||||
init: function() {
|
||||
console.log('Config.init()');
|
||||
}
|
||||
};
|
||||
});
|
||||
@ -1,99 +0,0 @@
|
||||
define(["../api"], function (api) {
|
||||
|
||||
var mainContentElement = document.querySelector('.main-content');
|
||||
|
||||
function replaceMainContent(elements) {
|
||||
var element = document.querySelector('.main-content');
|
||||
|
||||
Velocity(element, {
|
||||
opacity: 0
|
||||
}, {
|
||||
duration: 100,
|
||||
complete: function(animatedElements) {
|
||||
// actually remove content
|
||||
mainContentElement.innerHTML = "";
|
||||
elements.forEach(function(el) {
|
||||
// and add new one
|
||||
mainContentElement.appendChild(el);
|
||||
});
|
||||
Velocity(element, {
|
||||
opacity: 1
|
||||
}, {
|
||||
duration: 70
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function renderHtml(result) {
|
||||
console.log(result);
|
||||
var box = document.createElement('div');
|
||||
box.classList.add('box');
|
||||
box.innerHTML = result;
|
||||
|
||||
var boxTitleEl = document.createElement('div');
|
||||
boxTitleEl.classList.add('box-title');
|
||||
boxTitleEl.innerHTML = 'Wurst';
|
||||
box.appendChild(boxTitleEl);
|
||||
|
||||
replaceMainContent([box]);
|
||||
}
|
||||
|
||||
function renderEvents(result) {
|
||||
var els = [];
|
||||
var introBox = document.createElement('div');
|
||||
introBox.classList.add('box');
|
||||
introBox.innerHTML = '<div class="box-title">Aktuelle Veranstaltungen</div><div class="term text">Wintersemester 2017 / 2018 (<b>WS17/18</b>)</div>';
|
||||
els.push(introBox);
|
||||
for (var i = 0; i < result.events.length; i++) {
|
||||
var event = result.events[i];
|
||||
|
||||
var eventEl = document.createElement('div');
|
||||
eventEl.classList.add('box', 'event-box');
|
||||
|
||||
var eventTitleEl = document.createElement('div');
|
||||
eventTitleEl.classList.add('box-title');
|
||||
eventTitleEl.innerHTML = event.title;
|
||||
|
||||
var eventDescEl = document.createElement('div');
|
||||
eventDescEl.classList.add('event-desc');
|
||||
eventDescEl.innerHTML = event.description;
|
||||
|
||||
var eventRegistrationEl = document.createElement('div');
|
||||
eventRegistrationEl.classList.add('event-registration');
|
||||
eventRegistrationEl.innerHTML = event.registrationLabel;
|
||||
|
||||
eventEl.appendChild(eventTitleEl);
|
||||
eventEl.appendChild(eventDescEl);
|
||||
eventEl.appendChild(eventRegistrationEl);
|
||||
els.push(eventEl);
|
||||
}
|
||||
replaceMainContent(els);
|
||||
// TODO: reattach handlers, load js and stuff
|
||||
}
|
||||
|
||||
return {
|
||||
init: function() {
|
||||
var linkElements = document.querySelectorAll('a[async]');
|
||||
|
||||
[].slice.call(linkElements).forEach((el, i) => {
|
||||
var mainElement = document.querySelector('.main-content');
|
||||
|
||||
el.addEventListener('click', function(event) {
|
||||
var req = el.getAttribute('href');
|
||||
event.preventDefault();
|
||||
var type = el.dataset.type || 'html';
|
||||
switch(type) {
|
||||
case 'json':
|
||||
api.getJson(req, renderEvents);
|
||||
break;
|
||||
case 'html':
|
||||
default:
|
||||
api.getHtml(req, renderHtml);
|
||||
break;
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -1,38 +0,0 @@
|
||||
define(function (require) {
|
||||
|
||||
var elements = null,
|
||||
toggles = null,
|
||||
collapsed;
|
||||
|
||||
function addEventHandlers() {
|
||||
elements.forEach(function(el) {
|
||||
el.addEventListener('click', function elClickListener() {
|
||||
var index = el.dataset.index;
|
||||
var toggle = toggles[index];
|
||||
if (toggle.collapsed) {
|
||||
toggle.parent.classList.remove('collapsed');
|
||||
} else {
|
||||
toggle.parent.classList.add('collapsed');
|
||||
}
|
||||
toggle.collapsed = !toggle.collapsed;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
init: function(cllpsd) {
|
||||
elements = Array.from(document.querySelectorAll('.js-show-hide-toggle'));
|
||||
toggles = [];
|
||||
collapsed = !!cllpsd;
|
||||
|
||||
elements.forEach(function(el, i) {
|
||||
var target = el.nextElementSibling;
|
||||
el.dataset.index = i;
|
||||
var coll = el.parentElement.classList.contains('collapsed');
|
||||
toggles.push({index: i, target: target, collapsed: coll, parent: el.parentElement});
|
||||
});
|
||||
|
||||
addEventHandlers();
|
||||
}
|
||||
};
|
||||
});
|
||||
@ -1,82 +0,0 @@
|
||||
define(function(require) {
|
||||
|
||||
var tables = [];
|
||||
var ASC = 1;
|
||||
var DESC = -1;
|
||||
|
||||
function initTable(table, tableIndex) {
|
||||
var trs = table.querySelectorAll('tr');
|
||||
var ths = table.querySelectorAll('th');
|
||||
var trContents = [];
|
||||
|
||||
Array.from(trs).forEach(function(tr, rowIndex) {
|
||||
if (rowIndex === 0) {
|
||||
// register table headers as sort-listener
|
||||
Array.from(tr.querySelectorAll('th')).forEach(function(th, thIndex) {
|
||||
th.addEventListener('click', function(el) {
|
||||
sortTableBy(tableIndex, thIndex);
|
||||
});
|
||||
});
|
||||
} else {
|
||||
// register table rows
|
||||
trContents.push(Array.from(tr.querySelectorAll('td')).map(function(td) {
|
||||
return td.innerHTML;
|
||||
}));
|
||||
}
|
||||
});
|
||||
|
||||
tables.push({
|
||||
el: table,
|
||||
ths: ths,
|
||||
sortBy: 0,
|
||||
sortDir: ASC,
|
||||
trContents,
|
||||
});
|
||||
}
|
||||
|
||||
function updateThs(tableIndex, thIndex, sortOrder) {
|
||||
Array.from(tables[tableIndex].ths).forEach(function (th) {
|
||||
th.classList.remove('sorted-asc', 'sorted-desc');
|
||||
});
|
||||
var suffix = sortOrder > 0 ? 'asc' : 'desc';
|
||||
tables[tableIndex].ths[thIndex].classList.add('sorted-' + suffix);
|
||||
}
|
||||
|
||||
function sortTableBy(tableIndex, thIndex) {
|
||||
var table = tables[tableIndex];
|
||||
var sortKey = thIndex;
|
||||
var sortOrder = ASC;
|
||||
if (table.sortBy === sortKey) {
|
||||
sortOrder = table.sortDir === ASC ? DESC : ASC;
|
||||
}
|
||||
|
||||
table.trContents.sort(dynamicSort(sortKey, sortOrder));
|
||||
tables[tableIndex].sortBy = thIndex;
|
||||
tables[tableIndex].sortDir = sortOrder;
|
||||
updateThs(tableIndex, thIndex, sortOrder);
|
||||
|
||||
Array.from(table.el.querySelectorAll('tr')).forEach(function(tr, trIndex) {
|
||||
if (trIndex > 0) {
|
||||
Array.from(tr.querySelectorAll('td')).forEach(function (td, tdIndex) {
|
||||
td.innerHTML = table.trContents[trIndex - 1][tdIndex];
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function dynamicSort(key, order) {
|
||||
return function (a,b) {
|
||||
var result = (a[key] < b[key]) ? -1 : (a[key] > b[key]) ? 1 : 0;
|
||||
return result * order;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
init: function() {
|
||||
var tables = document.querySelectorAll('.sortable');
|
||||
Array.from(tables).forEach(function(table, i) {
|
||||
initTable(table, i);
|
||||
});
|
||||
},
|
||||
}
|
||||
});
|
||||
@ -1,31 +0,0 @@
|
||||
define(function (require) {
|
||||
|
||||
return {
|
||||
init: function() {
|
||||
var last_known_scroll_position = 0;
|
||||
var ticking = false;
|
||||
var grid = document.querySelector('.grid');
|
||||
var nav = document.querySelector('.header');
|
||||
|
||||
window.addEventListener('scroll', function(e) {
|
||||
if (!ticking) {
|
||||
window.requestAnimationFrame(function() {
|
||||
checkScroll();
|
||||
});
|
||||
ticking = true;
|
||||
}
|
||||
}, false);
|
||||
|
||||
// checks scroll direction and shows/hides navbar accordingly
|
||||
function checkScroll() {
|
||||
// var collapsed = (window.scrollY > 0 && last_known_scroll_position <= window.scrollY)
|
||||
var sticky = window.scrollY > 0;
|
||||
grid.classList.toggle('has-sticky-nav', sticky);
|
||||
// nav.classList.toggle('collapsed', collapsed);
|
||||
ticking = false;
|
||||
last_known_scroll_position = window.scrollY;
|
||||
}
|
||||
checkScroll();
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -1,5 +0,0 @@
|
||||
requirejs(["config", "api", "helper/sticky_menu", "helper/show_hide", "helper/sortable"], function(config, api, sticky_menu, show_hide, sortable) {
|
||||
sticky_menu.init();
|
||||
show_hide.init();
|
||||
sortable.init();
|
||||
});
|
||||
@ -1,14 +0,0 @@
|
||||
// THEME 1
|
||||
$base00: #72a85b;
|
||||
$base-bg-color: #1d1c1d;
|
||||
$base-font-color: #fff;
|
||||
$sec-font-color: #fff;
|
||||
$box-bg-color: #3c3c3c;
|
||||
// THEME 2
|
||||
$base00: #38428a;
|
||||
$base-bg-color: #ffffff;
|
||||
$base-font-color: rgb(53, 53, 53);
|
||||
$sec-font-color: #eaf2ff;
|
||||
$box-bg-color: #dddddd;
|
||||
// THEME 3
|
||||
$base00: rebeccapurple;
|
||||
@ -1,3 +0,0 @@
|
||||
$header-height: 60px;
|
||||
$header-height-collapsed: 40px;
|
||||
$footer-height: 50px;
|
||||
@ -1,106 +0,0 @@
|
||||
$l-cols: 12;
|
||||
$m-cols: 8;
|
||||
$s-cols: 4;
|
||||
$xs-cols: 2;
|
||||
|
||||
$l-grid: "[grid-col-start] repeat(#{$l-cols}, 1fr) [grid-col-end]";
|
||||
$m-grid: "[grid-col-start] repeat(#{$m-cols}, 1fr) [grid-col-end]";
|
||||
$s-grid: "[grid-col-start] repeat(#{$s-cols}, 1fr) [grid-col-end]";
|
||||
$xs-grid: "[grid-col-start] repeat(#{$xs-cols}, 1fr) [grid-col-end]";
|
||||
|
||||
$l-breakpoint: 1000px;
|
||||
$m-breakpoint: 800px;
|
||||
$s-breakpoint: 600px;
|
||||
$xs-breakpoint: 400px;
|
||||
|
||||
.grid {
|
||||
display: grid;
|
||||
height: 100%;
|
||||
grid-template-columns: #{$l-grid};
|
||||
grid-template-rows: var(--header-height) auto var(--footer-height);
|
||||
grid-gap: 20px;
|
||||
|
||||
> header {
|
||||
grid-column: span $l-cols;
|
||||
}
|
||||
|
||||
> .sidebar {
|
||||
grid-column: 2 / span 2;
|
||||
grid-row-start: 2;
|
||||
}
|
||||
|
||||
> .sidebar-right {
|
||||
display: none;
|
||||
grid-column: span 2;
|
||||
grid-row-start: 2;
|
||||
}
|
||||
|
||||
> section {
|
||||
grid-column: 4 / span ($l-cols - 4);
|
||||
grid-row-start: 2;
|
||||
}
|
||||
|
||||
> footer {
|
||||
grid-column: span $l-cols;
|
||||
grid-row-start: 3;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: $l-breakpoint) {
|
||||
.grid {
|
||||
grid-template-columns: #{$m-grid};
|
||||
grid-gap: 10px;
|
||||
|
||||
|
||||
> header {
|
||||
grid-column: span $m-cols;
|
||||
}
|
||||
|
||||
> .sidebar {
|
||||
grid-column: grid-col-start / span 2;
|
||||
grid-row-start: 2;
|
||||
}
|
||||
|
||||
> section {
|
||||
grid-column: 3 / span 6;
|
||||
grid-row-start: 2;
|
||||
}
|
||||
|
||||
> footer {
|
||||
grid-column: span $m-cols;
|
||||
grid-row-start: 3;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: $m-breakpoint) {
|
||||
.grid {
|
||||
grid-template-columns: #{$s-grid};
|
||||
|
||||
> header, > .sidebar, > section, > footer {
|
||||
grid-column: span $s-cols;
|
||||
}
|
||||
|
||||
> section {
|
||||
grid-row-start: 2;
|
||||
}
|
||||
|
||||
> .sidebar {
|
||||
grid-row-start: 3;
|
||||
}
|
||||
|
||||
> footer {
|
||||
grid-row-start: 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: $s-breakpoint) {
|
||||
.grid {
|
||||
grid-template-columns: #{$xs-grid};
|
||||
|
||||
> header, > .sidebar, > section, > footer {
|
||||
grid-column: span $xs-cols;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,165 +0,0 @@
|
||||
@import 'grid';
|
||||
@import 'colors';
|
||||
@import 'dimensions';
|
||||
|
||||
// modules
|
||||
@import 'modules/box';
|
||||
@import 'modules/sortable';
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: $base-bg-color;
|
||||
color: $base-font-color;
|
||||
font-family: "Source Sans Pro", Helvetica, sans-serif;
|
||||
font-weight: 400;
|
||||
font-size: 18px;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
|
||||
a,
|
||||
a:visited,
|
||||
a:link {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
font-weight: 600;
|
||||
transition: color .2s ease, background-color .2s ease;
|
||||
}
|
||||
a:hover {
|
||||
color: $base00;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style-type: none;
|
||||
|
||||
&.flat > li {
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5 {
|
||||
font-weight: 600;
|
||||
}
|
||||
h1 {
|
||||
font-size: 32px;
|
||||
margin: 20px 0 10px;
|
||||
}
|
||||
h2 {
|
||||
font-size: 24px;
|
||||
margin: 10px 0 5px;
|
||||
}
|
||||
h3 {
|
||||
font-size: 20px;
|
||||
margin: 5px 0 0;
|
||||
}
|
||||
h4 {
|
||||
font-size: 16px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
th, td {
|
||||
text-align: left;
|
||||
padding: 0 2px 0 4px;
|
||||
border-left: 1px solid $base00;
|
||||
|
||||
&:first-of-type {
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
|
||||
// END GLOBAL
|
||||
|
||||
.header {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 0 24px;
|
||||
height: $header-height;
|
||||
line-height: $header-height;
|
||||
background-color: $base00;
|
||||
width: 100%;
|
||||
text-align: right;
|
||||
overflow: hidden;
|
||||
z-index: 100;
|
||||
|
||||
> nav {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.has-sticky-nav {
|
||||
padding-top: $header-height;
|
||||
}
|
||||
|
||||
.has-sticky-nav .header {
|
||||
height: $header-height-collapsed;
|
||||
line-height: $header-height-collapsed;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
transition: height .2s ease, line-height .2s ease;
|
||||
}
|
||||
|
||||
.main-content {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
ul.flat {
|
||||
|
||||
> li > a {
|
||||
padding: 0 13px;
|
||||
position: relative;
|
||||
height: 100%;
|
||||
display: inline-block;
|
||||
color: $sec-font-color;
|
||||
|
||||
&:hover {
|
||||
background-color: darken($base00, 7%);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.footer {
|
||||
text-align: right;
|
||||
height: $footer-height;
|
||||
line-height: $footer-height;
|
||||
padding: 7px 24px;
|
||||
overflow: hidden;
|
||||
background-color: $base00;
|
||||
color: $sec-font-color;
|
||||
}
|
||||
|
||||
.event-registration {
|
||||
@extend .button;
|
||||
}
|
||||
.event-desc {
|
||||
padding: 0 13px;
|
||||
}
|
||||
|
||||
// HELPERS
|
||||
.button {
|
||||
background-color: $base00;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 3px 13px;
|
||||
cursor: pointer;
|
||||
font-weight: 600;
|
||||
transition: transform .1s, background-color .2s ease;
|
||||
|
||||
&:hover {
|
||||
background-color: darken($base00, 10%);
|
||||
transform: scale(1.01);
|
||||
}
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none;
|
||||
visibility: hidden;
|
||||
}
|
||||
@ -1,68 +0,0 @@
|
||||
@import '../colors';
|
||||
|
||||
.box {
|
||||
position: relative;
|
||||
padding: 13px 24px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
margin-bottom: 20px;
|
||||
font-size: 16px;
|
||||
|
||||
ul {
|
||||
margin-left: 10px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-bottom: 13px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// COURSE BOX
|
||||
.course-box {
|
||||
border-left: 1px solid lighten($base00, 40%);
|
||||
padding: 0 20px;
|
||||
position: relative;
|
||||
|
||||
li {
|
||||
padding-left: 7px;
|
||||
padding-bottom: 13px;
|
||||
|
||||
h4::before {
|
||||
content: '>';
|
||||
position: absolute;
|
||||
margin-left: -13px;
|
||||
font-weight: 800;
|
||||
}
|
||||
h4:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
h4:hover::before {
|
||||
content: 'v';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
li.collapsed {
|
||||
padding-bottom: 0;
|
||||
|
||||
> * {
|
||||
display: none;
|
||||
}
|
||||
h4 {
|
||||
display: block;
|
||||
}
|
||||
|
||||
h4::before {
|
||||
content: '>';
|
||||
}
|
||||
h4:hover::before {
|
||||
content: 'v';
|
||||
}
|
||||
}
|
||||
|
||||
.course {
|
||||
margin-bottom: 7px;
|
||||
}
|
||||
}
|
||||
@ -1,29 +0,0 @@
|
||||
table.sortable {
|
||||
th {
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
padding-right: 20px;
|
||||
|
||||
&.sorted-asc,
|
||||
&.sorted-desc {
|
||||
color: $base00;
|
||||
&::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
right: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
top: 7px;
|
||||
border-left: 8px solid transparent;
|
||||
border-right: 8px solid transparent;
|
||||
}
|
||||
}
|
||||
|
||||
&.sorted-asc::after {
|
||||
border-top: 8px solid $base00;
|
||||
}
|
||||
&.sorted-desc::after {
|
||||
border-bottom: 8px solid $base00;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -5,5 +5,5 @@ $case formLayout
|
||||
$forall view <- views
|
||||
<div .form-group :fvRequired view:.form-group--required :not $ fvRequired view:.form-group--optional :isJust $ fvErrors view:.form-group--has-error>
|
||||
$if not (Blaze.null $ fvLabel view)
|
||||
<label form-group__label .reactive-label for=#{fvId view}>#{fvLabel view}
|
||||
<label .form-group__label .reactive-label for=#{fvId view}>#{fvLabel view}
|
||||
^{fvInput view}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user