Add homepage to show all events
This commit is contained in:
51
public/index.html
Normal file
51
public/index.html
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang='en'>
|
||||||
|
<head>
|
||||||
|
<meta charset='UTF-8'>
|
||||||
|
<meta name='viewport' content='width=device-width, initial-scale=1'>
|
||||||
|
|
||||||
|
<title>Trip Schedule</title>
|
||||||
|
|
||||||
|
<link href='output.css' rel='stylesheet'>
|
||||||
|
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/qs/6.11.0/qs.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header class='fixed flex justify-between p-4 shadow-sm w-screen bg-white z-10'>
|
||||||
|
<h1 class='text-3xl'>Trip Schedule</h1>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div id='container' class='min-h-screen z-0 p-8 pt-20 bg-gray-100'>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<template id='events-container'>
|
||||||
|
<div class='my-8'>
|
||||||
|
<h2 class='events-container-title text-2xl mb-4'></h2>
|
||||||
|
<div class='grid md:grid-cols-3 lg:grid-cols-4 grid-cols-1 gap-4'>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template id='event-card'>
|
||||||
|
<div class='shadow-xl rounded-md text-center p-4 bg-white relative'>
|
||||||
|
<h3 class='event-name text-2xl'></h3>
|
||||||
|
|
||||||
|
<span class='event-type py-0.5 px-3 rounded my-2 inline-block'></span>
|
||||||
|
|
||||||
|
<div class='event-date text-red-600 text-l'>
|
||||||
|
<span class='event-start'></span>
|
||||||
|
<span class='event-time-seperator hidden'> - </span>
|
||||||
|
<span class='event-end'></span>
|
||||||
|
</div>
|
||||||
|
<div class='event-time text-red-600 text-l'>
|
||||||
|
<span class='event-start'></span>
|
||||||
|
<span class='event-time-seperator hidden'> - </span>
|
||||||
|
<span class='event-end'></span>
|
||||||
|
</div>
|
||||||
|
<a class='event-link absolute inset-0 block' href=''></a>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script src='script.js' type='module'></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
66
public/script.js
Normal file
66
public/script.js
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
const cardTemplate = document.getElementById('event-card');
|
||||||
|
const eventsContainer = document.getElementById('events-container');
|
||||||
|
const mainContainer = document.getElementById('container');
|
||||||
|
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
const query = {
|
||||||
|
sort: 'start',
|
||||||
|
};
|
||||||
|
|
||||||
|
const stringifiedQuery = Qs.stringify({
|
||||||
|
...query
|
||||||
|
},
|
||||||
|
{
|
||||||
|
addQueryPrefix: true
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const events = await (await fetch(`/api/events${stringifiedQuery}`)).json();
|
||||||
|
|
||||||
|
let currentDate;
|
||||||
|
let currentContainer;
|
||||||
|
|
||||||
|
for (const event of events.docs) {
|
||||||
|
if (currentDate !== event.startDate) {
|
||||||
|
currentContainer && mainContainer.append(currentContainer);
|
||||||
|
|
||||||
|
const c = eventsContainer.content.cloneNode(true);
|
||||||
|
|
||||||
|
c.querySelector('.events-container-title').innerText = event.startDate;
|
||||||
|
|
||||||
|
currentContainer = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
currentDate = event.startDate;
|
||||||
|
|
||||||
|
const card = cardTemplate.content.cloneNode(true);
|
||||||
|
|
||||||
|
card.querySelector('.event-name').innerText = event.name;
|
||||||
|
|
||||||
|
const typeElem = card.querySelector('.event-type');
|
||||||
|
typeElem.innerText = event.type.value.name;
|
||||||
|
typeElem.style.backgroundColor = event.type.value.backgroundColour;
|
||||||
|
|
||||||
|
card.querySelector('.event-date .event-start').innerText = event.startDate;
|
||||||
|
card.querySelector('.event-time .event-start').innerText = event.startTime;
|
||||||
|
|
||||||
|
if (event.end) {
|
||||||
|
if (event.endDate !== event.startDate) {
|
||||||
|
card.querySelector('.event-date .event-end').innerText = event.endDate;
|
||||||
|
card.querySelector('.event-date .event-time-seperator').style.display = 'inline';
|
||||||
|
}
|
||||||
|
|
||||||
|
card.querySelector('.event-time .event-end').innerText = event.endTime;
|
||||||
|
card.querySelector('.event-time .event-time-seperator').style.display = 'inline';
|
||||||
|
}
|
||||||
|
|
||||||
|
card.querySelector('a.event-link').setAttribute('href', event.id);
|
||||||
|
|
||||||
|
currentContainer.querySelector('.grid').append(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
currentContainer && mainContainer.append(currentContainer);
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
import * as dotenv from 'dotenv';
|
import * as dotenv from 'dotenv';
|
||||||
|
|
||||||
import express from 'express';
|
import express from 'express';
|
||||||
|
import path from 'path';
|
||||||
import payload from 'payload';
|
import payload from 'payload';
|
||||||
|
|
||||||
import findEventsOnDay from './helpers/findEventsOnDay';
|
// import findEventsOnDay from './helpers/findEventsOnDay';
|
||||||
|
|
||||||
dotenv.config();
|
dotenv.config();
|
||||||
|
|
||||||
@@ -30,18 +31,6 @@ payload.init({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get('/', async (req, res) => {
|
app.use(express.static(path.join(__dirname, '../public')));
|
||||||
const docs = await payload.find({
|
|
||||||
collection: 'events',
|
|
||||||
sort: 'startTime',
|
|
||||||
pagination: false
|
|
||||||
});
|
|
||||||
|
|
||||||
res.json(docs);
|
|
||||||
});
|
|
||||||
|
|
||||||
app.get('/day/:day', async (req, res) => {
|
|
||||||
res.json(await findEventsOnDay(payload, req.params.day));
|
|
||||||
});
|
|
||||||
|
|
||||||
app.listen(process.env.LISTEN_PORT);
|
app.listen(process.env.LISTEN_PORT);
|
||||||
|
|||||||
Reference in New Issue
Block a user