From ffa71250c5a09c45f6d16074e3f38256453f5b7b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andris=20Borb=C3=A1s?= <andris.borbas@gmail.com>
Date: Tue, 2 Mar 2021 05:24:56 +0100
Subject: [PATCH] Implement event adding

---
 css/dark.css      | 79 ++++++++++++++++++--------------------
 css/overrides.css | 52 +++++++++++++++++++++++++
 css/portal.css    | 66 +++++++++++++++++++++++++++++++
 index.html        | 87 ++++++++++++++++++++++++++++++++++++-----
 js/index.js       | 98 +++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 330 insertions(+), 52 deletions(-)
 create mode 100644 css/overrides.css
 create mode 100644 css/portal.css

diff --git a/css/dark.css b/css/dark.css
index a6fc552..7ddb6ce 100644
--- a/css/dark.css
+++ b/css/dark.css
@@ -1,43 +1,38 @@
-main {
-	position: relative;
-}
-
-body {
-	background: none;
-}
-
-body::before {
-	content: "";
-	position: absolute;
-	top: 0;
-	left: 0;
-	width: 100%;
-	height: 100%;
-	background-image: url("../img/rough_bg.jpg");
-}
-
-body.dark {
-	color: #fff;
-}
-
-body.dark::before {
-	filter: invert(1);
-}
-
-.dark main {
-	background: #222227;
-}
-
-.dark .dayName {
-	color: #ddd;
-	background-color: #444;
-}
-
-.dark .dayTime {
-	color: #ccc;
-	background-color: #333;
-}
-
-.dark .day {
-	border-left-color: #111;
+@media (prefers-color-scheme: dark) {
+	:root {
+		color-scheme: dark light;
+	}
+
+	body.dark {
+		color: #fff;
+	}
+
+	body.dark::before {
+		filter: invert(1);
+	}
+
+	.dark main {
+		background: #222227;
+	}
+
+	.dark .dayName {
+		color: #ddd;
+		background-color: #444;
+	}
+
+	.dark .dayTime {
+		color: #ccc;
+		background-color: #333;
+	}
+
+	.dark .day {
+		border-left-color: #111;
+	}
+
+	.dialogBox {
+		background-color: #222;
+	}
+	.dialogBox::before {
+		background-color: #333;
+	}
 }
diff --git a/css/overrides.css b/css/overrides.css
new file mode 100644
index 0000000..68a8fa8
--- /dev/null
+++ b/css/overrides.css
@@ -0,0 +1,52 @@
+:root {
+	color-scheme: light dark;
+}
+
+main {
+	position: relative;
+	max-height: 90vh;
+	overflow-y: scroll;
+}
+
+body {
+	background: none;
+}
+
+body::before {
+	content: "";
+	position: absolute;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	background-image: url("../img/rough_bg.jpg");
+}
+
+.day {
+	height: 100%;
+}
+
+.dayEvents {
+	max-width: 95%;
+	grid-template-rows: repeat(24, 60px);
+}
+
+.dayName {
+	position: sticky;
+	top: 0;
+}
+
+.dayTimes {
+	grid-template-rows: repeat(24, 60px);
+}
+
+.event {
+	cursor: pointer;
+}
+
+.eventTitle {
+	text-overflow: ellipsis;
+	-webkit-box-orient: vertical;
+	display: -webkit-box;
+	overflow: hidden;
+}
diff --git a/css/portal.css b/css/portal.css
new file mode 100644
index 0000000..2740a92
--- /dev/null
+++ b/css/portal.css
@@ -0,0 +1,66 @@
+#portal {
+	position: absolute;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+}
+
+#portal > div {
+	background-color: rgba(0, 0, 0, 0.3);
+	backdrop-filter: blur(5px);
+	width: 100%;
+	height: 100%;
+	padding: 0.5rem;
+	padding-top: 2rem;
+	display: flex;
+	align-items: center;
+}
+
+.dialogBox {
+	position: relative;
+	max-width: 400px;
+	width: 100%;
+	margin-right: auto;
+	margin-left: auto;
+	padding: 1rem;
+	padding-top: 44px;
+	background-color: #ddd;
+	border-radius: 1rem;
+}
+
+.dialogBox::before {
+	position: absolute;
+	top: 0;
+	left: 0;
+	border-radius: 1rem 1rem 0 0;
+	content: "";
+	height: 38px;
+	width: 100%;
+	background-color: #aaa;
+}
+
+.dialogBox > button {
+	position: absolute;
+	top: 8px;
+	right: 1rem;
+	font-size: 1.25rem;
+	line-height: 1;
+}
+
+.dialogBox h3 {
+	text-align: center;
+	font-size: 1.25rem;
+	margin-bottom: 1rem;
+}
+
+.dialogBox > form {
+	display: grid;
+	grid-template-columns: auto 1fr;
+	gap: 0.5rem;
+	align-items: center;
+}
+
+.dialogBox input {
+	padding: 0.25rem;
+}
diff --git a/index.html b/index.html
index dcfd26e..cde107b 100644
--- a/index.html
+++ b/index.html
@@ -4,9 +4,12 @@
 		<meta charset="UTF-8" />
 		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
 		<title>Naptár</title>
+
 		<link rel="stylesheet" href="css/layout.css" />
 		<link rel="stylesheet" href="css/style.css" />
 		<link rel="stylesheet" href="css/responsive.css" />
+		<link rel="stylesheet" href="css/portal.css" />
+		<link rel="stylesheet" href="css/overrides.css" />
 		<link rel="stylesheet" href="css/dark.css" />
 	</head>
 	<body class="dark">
@@ -14,6 +17,13 @@
 			<div class="time">
 				<div class="dayName"></div>
 				<div class="dayTimes">
+					<div class="dayTime">00:00</div>
+					<div class="dayTime">01:00</div>
+					<div class="dayTime">02:00</div>
+					<div class="dayTime">03:00</div>
+					<div class="dayTime">04:00</div>
+					<div class="dayTime">05:00</div>
+					<div class="dayTime">06:00</div>
 					<div class="dayTime">07:00</div>
 					<div class="dayTime">08:00</div>
 					<div class="dayTime">09:00</div>
@@ -28,25 +38,34 @@
 					<div class="dayTime">18:00</div>
 					<div class="dayTime">19:00</div>
 					<div class="dayTime">20:00</div>
+					<div class="dayTime">21:00</div>
+					<div class="dayTime">22:00</div>
+					<div class="dayTime">23:00</div>
 				</div>
 			</div>
 			<div class="day">
 				<div class="dayName">Hétfő</div>
-				<div class="dayEvents">
-					<div class="event length--4" style="grid-row-start: 4">
+				<div class="dayEvents" id="hétfő">
+					<div class="event length--4" style="grid-row-start: 4; display: none">
 						<div class="eventTitle">Kommunikációs hálózatok 2</div>
 						<div class="eventDetails">
 							<div class="eventTime">10:00-14:00</div>
 						</div>
 					</div>
-					<div class="eventSubdivide length--2" style="grid-row-start: 8">
+					<div
+						class="eventSubdivide length--2"
+						style="grid-row-start: 8; display: none"
+					>
 						<div class="event length--2" style="grid-row-start: 1">
 							<div class="eventTitle">Algoritmus elmélet</div>
 							<div class="eventDetails">
 								<div class="eventTime">12:00-14:00</div>
 							</div>
 						</div>
-						<div class="event length--2" style="grid-row-start: 1">
+						<div
+							class="event length--2"
+							style="grid-row-start: 1; display: none"
+						>
 							<div class="eventTitle">Kotlin alapú szoftverfejlesztés</div>
 							<div class="eventDetails">
 								<div class="eventTime">12:00-14:00</div>
@@ -57,29 +76,77 @@
 			</div>
 			<div class="day">
 				<div class="dayName">Kedd</div>
-				<div class="dayEvents"></div>
+				<div class="dayEvents" id="kedd"></div>
 			</div>
 			<div class="day">
 				<div class="dayName">Szerda</div>
-				<div class="dayEvents"></div>
+				<div class="dayEvents" id="szerda"></div>
 			</div>
 			<div class="day">
 				<div class="dayName">Csütörtök</div>
-				<div class="dayEvents"></div>
+				<div class="dayEvents" id="csütörtök"></div>
 			</div>
 			<div class="day">
 				<div class="dayName">Péntek</div>
-				<div class="dayEvents"></div>
+				<div class="dayEvents" id="péntek"></div>
 			</div>
 			<div class="day">
 				<div class="dayName">Szombat</div>
-				<div class="dayEvents"></div>
+				<div class="dayEvents" id="szombat"></div>
 			</div>
 			<div class="day">
 				<div class="dayName">Vasárnap</div>
-				<div class="dayEvents"></div>
+				<div class="dayEvents" id="vasárnap"></div>
 			</div>
 		</main>
+		<div id="portal" style="display: none">
+			<div>
+				<div class="dialogBox" id="addEventDialogBox" style="display: none">
+					<button id="addEventDialogBoxCloseButton" onclick="closePortal()">
+						&nbsp;X&nbsp;
+					</button>
+					<h3>Esemény hozzáadása</h3>
+					<form id="addEventForm">
+						<label for="addEventName">Esemény:</label>
+						<input
+							type="text"
+							name="addEventName"
+							id="addEventName"
+							placeholder="Esemény neve"
+						/>
+						<label for="addEventDay">Napja:</label>
+						<input
+							type="day"
+							name="addEventDay"
+							id="addEventDay"
+							placeholder="nap"
+						/>
+						<label for="addEventStartTime">Kezdete:</label>
+						<input
+							type="time"
+							name="addEventStartTime"
+							id="addEventStartTime"
+						/>
+						<label for="addEventLength">Hossza:</label>
+						<input
+							type="number"
+							name="addEventLength"
+							id="addEventLength"
+							min="1"
+							max="12"
+							placeholder="óra"
+						/>
+						<input type="submit" value="Hozzáad" />
+					</form>
+				</div>
+				<div class="dialogBox" id="editEventDialogBox" style="display: none">
+					<button id="editEventDialogBoxCloseButton" onclick="closePortal()">
+						&nbsp;X&nbsp;
+					</button>
+					<h3>Esemény szerkesztése</h3>
+				</div>
+			</div>
+		</div>
 		<script type="text/javascript" src="js/index.js"></script>
 	</body>
 </html>
diff --git a/js/index.js b/js/index.js
index e69de29..6965dd5 100644
--- a/js/index.js
+++ b/js/index.js
@@ -0,0 +1,98 @@
+const events = JSON.parse(window.localStorage.getItem("events")) ?? [];
+console.log(events);
+events.forEach((event) => addEventToDom(event));
+
+const portal = document.getElementById("portal");
+const addEventDialogBox = document.getElementById("addEventDialogBox");
+const editEventDialogBox = document.getElementById("editEventDialogBox");
+const addEventForm = document.getElementById("addEventForm");
+
+function openPortal(type, id) {
+	portal.style.display = "block";
+	if (type == "add") {
+		addEventDialogBox.style.display = "block";
+		document.getElementById("addEventDay").value =
+			id.charAt(0).toUpperCase() + id.slice(1);
+	}
+	if (type == "edit") {
+		editEventDialogBox.style.display = "block";
+	}
+}
+
+function closePortal() {
+	portal.style.display = "none";
+	addEventDialogBox.style.display = "none";
+	editEventDialogBox.style.display = "none";
+}
+
+function dayEventListener(e) {
+	console.log(e);
+	openPortal("add", e.target.id);
+}
+
+function addEventToDom(event) {
+	const container = document.createElement("div");
+	container.classList.add("event");
+	container.style.gridRowEnd = `span ${event.length}`;
+	container.style.gridRowStart = `${event.startTime - 6}`;
+
+	const title = document.createElement("h4");
+	title.innerHTML = event.name;
+	title.classList.add("eventTitle");
+	title.style.webkitLineClamp = `${event.length == 1 ? 1 : 4}`;
+	container.appendChild(title);
+
+	const time = document.createElement("p");
+	time.innerHTML = `${event.startTime}:00-${event.startTime + event.length}:00`;
+	time.classList.add("eventTime");
+	container.appendChild(time);
+
+	document.getElementById(event.day).appendChild(container);
+
+	container.addEventListener("click", (e) => {
+		e.stopPropagation();
+	});
+}
+
+function submitAddEventForm(e) {
+	e.preventDefault();
+	console.log(e);
+	console.log(addEventForm.elements.addEventStartTime.value);
+
+	const event = {
+		name: addEventForm.elements.addEventName.value,
+		day: addEventForm.elements.addEventDay.value.toLowerCase(),
+		startTime: parseInt(
+			addEventForm.elements.addEventStartTime.value.split(":")[0]
+		),
+		length: parseInt(addEventForm.elements.addEventLength.value),
+	};
+	events.push(event);
+	window.localStorage.setItem("events", JSON.stringify(events));
+
+	addEventToDom(event);
+
+	closePortal();
+}
+
+function addClickListeners() {
+	const days = document.getElementsByClassName("dayEvents");
+	console.log(days);
+	Array.from(days).forEach((day) => {
+		day.addEventListener("click", dayEventListener);
+	});
+
+	portal.addEventListener("click", () => {
+		closePortal();
+	});
+	addEventDialogBox.addEventListener("click", (e) => {
+		e.stopPropagation();
+	});
+	editEventDialogBox.addEventListener("click", (e) => {
+		e.stopPropagation();
+	});
+
+	addEventForm.addEventListener("submit", submitAddEventForm);
+}
+
+addClickListeners();
-- 
GitLab