forked from KABI/fedi.camp_Website
adding timetable
This commit is contained in:
parent
4078fce05f
commit
36a4877f05
4 changed files with 309 additions and 0 deletions
53
timetable/eventData.js
Normal file
53
timetable/eventData.js
Normal file
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
|
||||
This is the only file to be modified for adding your session at FediCamp.
|
||||
|
||||
Please follow the file structure as given in this example and commit your changes to the repo.
|
||||
That's it!
|
||||
|
||||
If you have any questions, ask in the Matrix-Room or ask Tobi.
|
||||
If you aren't sure what to do, ask someone to help!
|
||||
|
||||
You also can put the date & description about your session in the pad (Link in Matrix room).
|
||||
It will be merged, but maybe not in time.
|
||||
|
||||
As locations, please only use the following:
|
||||
'Camp ground', 'Fire place', 'Lunch table', 'Stage room', 'Mobile'
|
||||
|
||||
As start time please only use the following numbers:
|
||||
10, 12, 14, 16, 18, 20
|
||||
|
||||
As days please only use the following days:
|
||||
'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'
|
||||
|
||||
|
||||
*/
|
||||
|
||||
const eventData = {
|
||||
'Wednesday': {
|
||||
10: {
|
||||
'Camp ground': {
|
||||
'event': 'Workshop & Irgendwas hier text',
|
||||
'description': 'hier wird das Event genauer beschrieben!'
|
||||
},
|
||||
'Fire place': {
|
||||
'event': 'Event 2',
|
||||
'description': 'Description for Event 2'
|
||||
}
|
||||
/* other events */
|
||||
},
|
||||
12: {
|
||||
'Lunch table': {
|
||||
'event': 'Event 3',
|
||||
'description': 'Description for Event 3'
|
||||
},
|
||||
'Stage room': {
|
||||
'event': 'Event 4',
|
||||
'description': 'Description for Event 4'
|
||||
}
|
||||
/* other events */
|
||||
},
|
||||
/* other times */
|
||||
},
|
||||
/* other days */
|
||||
}
|
28
timetable/index.html
Normal file
28
timetable/index.html
Normal file
|
@ -0,0 +1,28 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Event Timetable</title>
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="timetable">
|
||||
<h1 id="headline">Headline Placeholder</h1>
|
||||
<h2 id="subheadline">Subheadline Placeholder</h2>
|
||||
|
||||
<div id="slider-container">
|
||||
<input type="range" min="0" max="4" value="0" id="slider" />
|
||||
<div id="slider-day"></div>
|
||||
<p id="slider-text">Slide to view other days</p>
|
||||
</div>
|
||||
|
||||
<div id="tables-container"></div>
|
||||
</div>
|
||||
|
||||
<div id="overlay"></div>
|
||||
|
||||
<script src="eventData.js"></script>
|
||||
<script src="scripts.js"></script>
|
||||
</body>
|
||||
</html>
|
95
timetable/scripts.js
Normal file
95
timetable/scripts.js
Normal file
|
@ -0,0 +1,95 @@
|
|||
const locations = ['Camp ground', 'Fire place', 'Lunch table', 'Stage room', 'Mobile'];
|
||||
const days = ['Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
|
||||
|
||||
function generateDayTable(day, events) {
|
||||
let table = `<table id="${day}" class="day-table"><tr><th>Time</th>`;
|
||||
|
||||
for (let location of locations) {
|
||||
table += `<th>${location}</th>`;
|
||||
}
|
||||
|
||||
table += '</tr>';
|
||||
|
||||
for (let hour = 10; hour <= 20; hour += 2) {
|
||||
table += '<tr><td>' + (hour < 10 ? '0' + hour : hour) + ':00' + '</td>';
|
||||
for (let location of locations) {
|
||||
// Check if there is an event at this location and time
|
||||
let event = events[day] && events[day][hour] && events[day][hour][location] ? events[day][hour][location] : '';
|
||||
table += '<td>';
|
||||
if (event) {
|
||||
table += `<button class="event-button" data-day="${day}" data-hour="${hour}" data-location="${location}">${event.event}</button>`;
|
||||
}
|
||||
table += '</td>';
|
||||
}
|
||||
table += '</tr>';
|
||||
}
|
||||
|
||||
table += '</table>';
|
||||
|
||||
return table;
|
||||
}
|
||||
|
||||
// Doing the overlay shit
|
||||
function showDescription(day, hour, location) {
|
||||
|
||||
let event = eventData[day][hour][location];
|
||||
let description = event.description;
|
||||
|
||||
let overlay = document.getElementById('overlay');
|
||||
overlay.style.display = 'block';
|
||||
|
||||
let content = document.createElement('div');
|
||||
content.id = 'overlay-content';
|
||||
|
||||
let descriptionElement = document.createElement('p');
|
||||
descriptionElement.innerText = description;
|
||||
|
||||
let closeButton = document.createElement('button');
|
||||
closeButton.innerText = 'Close';
|
||||
closeButton.addEventListener('click', hideOverlay);
|
||||
|
||||
content.appendChild(descriptionElement);
|
||||
content.appendChild(closeButton);
|
||||
overlay.appendChild(content);
|
||||
}
|
||||
|
||||
|
||||
function hideOverlay() {
|
||||
let overlay = document.getElementById('overlay');
|
||||
overlay.style.display = 'none';
|
||||
overlay.innerHTML = '';
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', (event) => {
|
||||
let tablesContainer = document.getElementById('tables-container');
|
||||
for (let day of days) {
|
||||
tablesContainer.innerHTML += generateDayTable(day, eventData);
|
||||
}
|
||||
|
||||
let slider = document.getElementById('slider');
|
||||
let sliderDay = document.getElementById('slider-day');
|
||||
|
||||
slider.addEventListener('input', (event) => {
|
||||
for (let day of days) {
|
||||
document.getElementById(day).style.display = 'none';
|
||||
}
|
||||
|
||||
document.getElementById(days[event.target.value]).style.display = 'table';
|
||||
|
||||
|
||||
sliderDay.innerText = days[event.target.value];
|
||||
});
|
||||
|
||||
|
||||
tablesContainer.addEventListener('click', (event) => {
|
||||
if (event.target.matches('.event-button')) {
|
||||
let day = event.target.getAttribute('data-day');
|
||||
let hour = event.target.getAttribute('data-hour');
|
||||
let location = event.target.getAttribute('data-location');
|
||||
showDescription(day, hour, location);
|
||||
}
|
||||
});
|
||||
|
||||
// show the first table initially
|
||||
slider.dispatchEvent(new Event('input'));
|
||||
});
|
133
timetable/styles.css
Normal file
133
timetable/styles.css
Normal file
|
@ -0,0 +1,133 @@
|
|||
body {
|
||||
background-color: #F6F6F6;
|
||||
font-family: Arial, sans-serif;
|
||||
}
|
||||
|
||||
#timetable {
|
||||
width: 90%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
#headline, #subheadline {
|
||||
text-align: center;
|
||||
color: #444;
|
||||
}
|
||||
|
||||
#slider-container {
|
||||
width: 60%;
|
||||
margin: 20px auto;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
#slider-text {
|
||||
color: #444;
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
#slider {
|
||||
display: block;
|
||||
width: 100%;
|
||||
margin: 20px 0;
|
||||
appearance: none;
|
||||
background: #D3D3D3;
|
||||
outline: none;
|
||||
height: 30px;
|
||||
border-radius: 20px;
|
||||
}
|
||||
|
||||
#slider::-webkit-slider-thumb {
|
||||
appearance: none;
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
background: #0066CC;
|
||||
cursor: pointer;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
#slider-day {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 50px;
|
||||
top: 0;
|
||||
left: 0;
|
||||
background: transparent;
|
||||
color: #000;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
transition: none;
|
||||
pointer-events: none;
|
||||
font-size: 1.2em;
|
||||
margin-top: -7px;
|
||||
}
|
||||
|
||||
.day-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
display: none;
|
||||
margin-bottom: 20px;
|
||||
table-layout: fixed;
|
||||
}
|
||||
|
||||
.day-table th, .day-table td {
|
||||
border: 1px solid #FFFFFF;
|
||||
padding: 10px;
|
||||
text-align: center;
|
||||
background-color: #ADD8E6;
|
||||
height: 60px;
|
||||
word-break: break-word;
|
||||
width: 20%;
|
||||
}
|
||||
|
||||
.day-table th {
|
||||
background-color: #ddd;
|
||||
color: #444;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.event-button {
|
||||
background: none;
|
||||
color: inherit;
|
||||
border: none;
|
||||
padding: 0;
|
||||
font: inherit;
|
||||
cursor: pointer;
|
||||
outline: inherit;
|
||||
}
|
||||
|
||||
#overlay {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
display: none;
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
#overlay-content {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
background-color: #fff;
|
||||
padding: 20px;
|
||||
border-radius: 5px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#overlay-content p {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
#overlay-content button {
|
||||
padding: 10px 20px;
|
||||
background-color: #0066CC;
|
||||
color: #fff;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
cursor: pointer;
|
||||
}
|
Loading…
Reference in a new issue