From 574c2ab104624cb3e60f519f1d48965420c081e3 Mon Sep 17 00:00:00 2001
From: Mohammed Mamdouh <59239026+mmamdouh4370@users.noreply.github.com>
Date: Mon, 1 Apr 2024 22:16:48 -0400
Subject: [PATCH 01/13] delete test
---
public/js/editScript.js | 4 +++-
public/js/eventParse.js | 4 ++--
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/public/js/editScript.js b/public/js/editScript.js
index 9a328f9..2d8bd36 100644
--- a/public/js/editScript.js
+++ b/public/js/editScript.js
@@ -8,12 +8,14 @@ let deleteSpan = document.getElementById("deleteClose");
// Function to open the modals
-function openModal(modalType) {
+function openModal(modalType, elementId) {
if(modalType === 'edit') {
console.log("Edit Button clicked!");
+ console.log(elementId);
editModal.style.display = "block";
} else if(modalType === 'delete') {
console.log("Delete button clicked!");
+ console.log(elementId);
deleteModal.style.display = "block";
}
}
diff --git a/public/js/eventParse.js b/public/js/eventParse.js
index 9d1196d..84b480c 100644
--- a/public/js/eventParse.js
+++ b/public/js/eventParse.js
@@ -28,8 +28,8 @@ function addElement(element) {
-

+
${element.name}
${element.description}
From e623c2dd49b383a8c688748daf94180fbd5d1349 Mon Sep 17 00:00:00 2001
From: must108 <136145181+must108@users.noreply.github.com>
Date: Tue, 2 Apr 2024 00:59:55 -0400
Subject: [PATCH 05/13] push images update
---
public/js/editScript.js | 6 ++----
public/js/eventParse.js | 2 +-
views/admin.html | 2 +-
3 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/public/js/editScript.js b/public/js/editScript.js
index ea74e0a..6d2f04f 100644
--- a/public/js/editScript.js
+++ b/public/js/editScript.js
@@ -7,7 +7,7 @@ let editSpan = document.getElementById("editClose");
let deleteSpan = document.getElementById("deleteClose");
let currentEventId;
-let currentEventId = null;
+currentEventId = null;
// Function to open the modals
function openModal(modalType, eventId) {
@@ -103,6 +103,4 @@ function toggleDiv() {
}
}
-window.onload = () => {
- toggleDiv();
-}
+window.onload = toggleDiv;
diff --git a/public/js/eventParse.js b/public/js/eventParse.js
index 67e26f2..6a321a1 100644
--- a/public/js/eventParse.js
+++ b/public/js/eventParse.js
@@ -1,4 +1,4 @@
-window.onload = displayEvents;
+window.onload = displayEvents();
let editContainer = document.getElementById('itemContainer');
function displayEvents() {
diff --git a/views/admin.html b/views/admin.html
index db87296..eeb6a1d 100644
--- a/views/admin.html
+++ b/views/admin.html
@@ -16,7 +16,7 @@
Admin Panel
-
`;
diff --git a/routes/adminRouter.js b/routes/adminRouter.js
index 2f870f7..ed73a05 100644
--- a/routes/adminRouter.js
+++ b/routes/adminRouter.js
@@ -10,6 +10,6 @@ router.use('/submit', file_utils.upload.single('image'));
router.get('/', render);
router.post('/submit', create);
-router.post('/delete', deleteEvent);
+router.delete('/delete', deleteEvent);
module.exports = router;
\ No newline at end of file
diff --git a/views/admin.html b/views/admin.html
index 25ed595..e81c951 100644
--- a/views/admin.html
+++ b/views/admin.html
@@ -53,7 +53,7 @@
Are you sure you want to delete this event?
Do you still want to proceed?
-
+
From ec527261b72f5f8251ce4010cdbb9899e79bdbcb Mon Sep 17 00:00:00 2001
From: Mohammed Mamdouh <59239026+mmamdouh4370@users.noreply.github.com>
Date: Tue, 2 Apr 2024 02:23:08 -0400
Subject: [PATCH 09/13] Image delete "handling"
---
controllers/adminController.js | 15 ++++++++++++---
public/js/editScript.js | 6 ++++--
public/js/eventParse.js | 4 ++--
3 files changed, 18 insertions(+), 7 deletions(-)
diff --git a/controllers/adminController.js b/controllers/adminController.js
index b7ea3d8..7ea638c 100644
--- a/controllers/adminController.js
+++ b/controllers/adminController.js
@@ -65,18 +65,27 @@ exports.create = async (req, res)=>{
exports.deleteEvent = async (req,res)=>{
const eventName = req.query.eventName; // Specify the name of the event to delete
+ const currentEventImgName = req.query.imgName;
console.log(req.query.eventName);
+ console.log(req.query.imgName);
console.log(`Deleting event with name: ${eventName}`);
try {
const db = mongo_utils.get_client().db();
- const collection = db.collection('events');
- // Delete the event by name
+ const imgCollection = db.collection('images.files')
+ const imgId = await imgCollection.findOne({filename : currentEventImgName})._id;
+ const imgResult = await imgCollection.deleteOne({ filename : currentEventImgName });
+
+ const chunksCollection = db.collection('images.chunks')
+ const chunksResult = await chunksCollection.deleteMany({ files_id : imgId });
+
+ const collection = db.collection('events');
const result = await collection.deleteOne({ name : eventName });
+
console.log(result);
- if (result.deletedCount === 1) {
+ if (result.deletedCount === 1 && imgResult.deletedCount == 1) {
// Event successfully deleted
res.status(200).json({ message: 'Event deleted successfully' });
} else {
diff --git a/public/js/editScript.js b/public/js/editScript.js
index ef3784a..faf3486 100644
--- a/public/js/editScript.js
+++ b/public/js/editScript.js
@@ -8,9 +8,10 @@ let deleteSpan = document.getElementById("deleteClose");
let currentEventId = null;
let currentEventName = null;
+let currentEventImgName = null;
// Function to open the modals
-function openModal(modalType, elementName) {
+function openModal(modalType, elementName, elementImgName) {
if(modalType === 'edit') {
console.log("Edit Button clicked!");
@@ -19,6 +20,7 @@ function openModal(modalType, elementName) {
console.log("Delete button clicked!");
console.log(elementName);
currentEventName = elementName;
+ currentEventImgName = elementImgName;
deleteModal.style.display = "block";
}
}
@@ -31,7 +33,7 @@ function delEvent() {
}
console.log(currentEventName);
- fetch(`http://localhost:3009/admin/delete?eventName=${currentEventName}`, {
+ fetch(`http://localhost:3009/admin/delete?eventName=${currentEventName}&imgName=${currentEventImgName}`, {
method: 'DELETE',
//body: {name : currentEventName}
})
diff --git a/public/js/eventParse.js b/public/js/eventParse.js
index 2510348..738d11c 100644
--- a/public/js/eventParse.js
+++ b/public/js/eventParse.js
@@ -29,8 +29,8 @@ function addElement(element) {
${element.name}
${element.description}
${element.date}
-
-
+
+
`;
From 12de0e35098dd518c70fc4d09c9dfa8aab8bb750 Mon Sep 17 00:00:00 2001
From: Mohammed Mamdouh <59239026+mmamdouh4370@users.noreply.github.com>
Date: Tue, 2 Apr 2024 02:52:24 -0400
Subject: [PATCH 10/13] Current version: Search, delete, modals
Search, delete event, and modals for both delete and edit are now done. Delete handles image deletion perfectly fine. Search has the issues of not showing images and not updating properly once an element is deleted. Implement these issues, comment and clean up code, finish edit, add filtering :DDDDDDDDDD
---
controllers/adminController.js | 25 ++++++++++++++-----------
1 file changed, 14 insertions(+), 11 deletions(-)
diff --git a/controllers/adminController.js b/controllers/adminController.js
index 7ea638c..9b07570 100644
--- a/controllers/adminController.js
+++ b/controllers/adminController.js
@@ -1,7 +1,6 @@
const mongo_utils = require('../utils/mongo_utils');
const path = require('path');
-//const ObjectId = require('mongodb').ObjectID;
// Stuff for gridfsbucket, also set up multer as to use req.file.originalname
const multer = require("multer");
@@ -66,34 +65,38 @@ exports.deleteEvent = async (req,res)=>{
const eventName = req.query.eventName; // Specify the name of the event to delete
const currentEventImgName = req.query.imgName;
- console.log(req.query.eventName);
- console.log(req.query.imgName);
- console.log(`Deleting event with name: ${eventName}`);
+ //console.log(req.query.eventName);
+ //console.log(req.query.imgName);
+ //console.log(`Deleting event with name: ${eventName}`);
try {
const db = mongo_utils.get_client().db();
const imgCollection = db.collection('images.files')
- const imgId = await imgCollection.findOne({filename : currentEventImgName})._id;
+ const imgId = await imgCollection.findOne({filename : currentEventImgName});
const imgResult = await imgCollection.deleteOne({ filename : currentEventImgName });
const chunksCollection = db.collection('images.chunks')
- const chunksResult = await chunksCollection.deleteMany({ files_id : imgId });
+ const chunksResult = await chunksCollection.deleteMany({ files_id : imgId._id });
const collection = db.collection('events');
const result = await collection.deleteOne({ name : eventName });
console.log(result);
+ console.log(imgResult);
+ console.log(chunksResult);
- if (result.deletedCount === 1 && imgResult.deletedCount == 1) {
- // Event successfully deleted
+ if (result.deletedCount >= 1 && imgResult.deletedCount >= 1 && chunksResult.deletedCount >= 1){
res.status(200).json({ message: 'Event deleted successfully' });
+ return;
} else {
- // Event not found
- res.status(404).json({ message: 'Event not found' });
+ res.status(404).json({ message: ':(' });
+ return;
}
} catch (err) {
- // Error handling
res.status(500).json({ message: err.message });
+ return;
}
+
+ return;
}
\ No newline at end of file
From 96da42bde43d40666082ebf76cd70861b2e3af05 Mon Sep 17 00:00:00 2001
From: must108 <136145181+must108@users.noreply.github.com>
Date: Tue, 2 Apr 2024 10:50:43 -0400
Subject: [PATCH 11/13] finished delete optimization
---
controllers/adminController.js | 4 +++-
public/css/adminPanel.css | 2 +-
public/js/editScript.js | 10 +++++-----
public/js/eventParse.js | 22 ++++++++++++++++++----
public/js/script.js | 4 +++-
views/admin.html | 2 +-
6 files changed, 31 insertions(+), 13 deletions(-)
diff --git a/controllers/adminController.js b/controllers/adminController.js
index b7ea3d8..044fd8c 100644
--- a/controllers/adminController.js
+++ b/controllers/adminController.js
@@ -24,9 +24,10 @@ exports.create = async (req, res)=>{
const name = req.body.name.trim();
const date = req.body.date;
const desc = req.body.description.trim();
+ const time = req.body.time;
const imageName = req.file.originalname;
- if (!req.body.name || !req.body.date || !req.body.description) {
+ if (!req.body.name || !req.body.date || !req.body.description || !req.body.time) {
res.status(400).redirect("/admin");
return;
}
@@ -35,6 +36,7 @@ exports.create = async (req, res)=>{
name:name,
date:date,
description:desc,
+ time:time,
imageName: imageName
};
diff --git a/public/css/adminPanel.css b/public/css/adminPanel.css
index 811d7d9..09581d7 100644
--- a/public/css/adminPanel.css
+++ b/public/css/adminPanel.css
@@ -73,7 +73,7 @@ main {
}
/* bg color for input */
-#name, #date, #description, #time {
+#name, #date, #description, #timeInput {
background-color: #595959;
color: white;
}
diff --git a/public/js/editScript.js b/public/js/editScript.js
index ef3784a..08ca79d 100644
--- a/public/js/editScript.js
+++ b/public/js/editScript.js
@@ -6,11 +6,11 @@ let deleteModal = document.getElementById('deleteModal');
let editSpan = document.getElementById("editClose");
let deleteSpan = document.getElementById("deleteClose");
let currentEventId = null;
-
let currentEventName = null;
+let currentEventDelId = null;
// Function to open the modals
-function openModal(modalType, elementName) {
+function openModal(modalType, elementName, elementDelId) {
if(modalType === 'edit') {
console.log("Edit Button clicked!");
@@ -19,6 +19,7 @@ function openModal(modalType, elementName) {
console.log("Delete button clicked!");
console.log(elementName);
currentEventName = elementName;
+ currentEventDelId = elementDelId;
deleteModal.style.display = "block";
}
}
@@ -31,14 +32,13 @@ function delEvent() {
}
console.log(currentEventName);
- fetch(`http://localhost:3009/admin/delete?eventName=${currentEventName}`, {
+ fetch(`http://localhost:3000/admin/delete?eventName=${currentEventName}`, {
method: 'DELETE',
- //body: {name : currentEventName}
})
.then((res) => {
if (res.ok) {
// Remove the event card from UI
- const eventCard = document.querySelector(`.editItem[data-id="${currentEventName}"]`);
+ const eventCard = document.getElementById(currentEventDelId);
if (eventCard) {
eventCard.remove();
}
diff --git a/public/js/eventParse.js b/public/js/eventParse.js
index 2510348..f17ad0c 100644
--- a/public/js/eventParse.js
+++ b/public/js/eventParse.js
@@ -21,21 +21,35 @@ function searchElement() {
});
}
+function randNum(max) {
+ return Math.floor(Math.random() * max) + 1;
+}
+
function addElement(element) {
+ let time = convertTime(element.time);
+ let id = randNum(100000);
let container = `
-
+
${element.name}
${element.description}
-
${element.date}
-
-
+
${element.date} at ${time}
+
+
`;
editContainer.innerHTML += container;
}
+function convertTime(time24) {
+ const [hours, minutes] = time24.split(':').map(Number);
+ const period = hours < 12 ? 'AM' : 'PM';
+ const hours12 = hours % 12 || 12;
+
+ return `${hours12}:${minutes.toString().padStart(2, '0')} ${period}`;
+}
+
const search = document.getElementById('search');
search.addEventListener('input', searchElement);
diff --git a/public/js/script.js b/public/js/script.js
index a332c5f..f75c520 100644
--- a/public/js/script.js
+++ b/public/js/script.js
@@ -8,11 +8,12 @@ function submitEvent(e) {
let name = document.getElementById("name").value.trim();
let date = document.getElementById("date").value;
let description = document.getElementById("description").value.trim();
+ let time = document.getElementById("timeInput").value;
let imageInput = document.getElementById("image");
let imageFile = imageInput.files[0]; // Get the selected image file
// Check for empty fields
- if (!name || !date || !description) {
+ if (!name || !date || !description || !time) {
alert("Please fill out all fields before submitting!");
return;
}
@@ -21,6 +22,7 @@ function submitEvent(e) {
formData.append("name", name);
formData.append("date", date);
formData.append("description", description);
+ formData.append("time", time);
formData.append("image", imageFile);
alert("Event Added!");
diff --git a/views/admin.html b/views/admin.html
index e0cfeee..db97e52 100644
--- a/views/admin.html
+++ b/views/admin.html
@@ -23,7 +23,7 @@
Admin Panel
-
+
From 0eac3f1ac3bcd1db1f8813b69d38f278bc067a67 Mon Sep 17 00:00:00 2001
From: must108 <136145181+must108@users.noreply.github.com>
Date: Tue, 2 Apr 2024 11:21:05 -0400
Subject: [PATCH 12/13] reformatting and merge
---
controllers/adminController.js | 2 +-
routes/adminRouter.js | 8 ++++----
routes/rootRouter.js | 14 +++++++-------
3 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/controllers/adminController.js b/controllers/adminController.js
index fde5fb2..350464b 100644
--- a/controllers/adminController.js
+++ b/controllers/adminController.js
@@ -36,7 +36,7 @@ exports.login = async (req,res)=>{
// Encrypt cookie
const auth = cookieCrypt.encrypt((new Date()).toString());
// Set cookie
- res.cookie('auth',auth,{httpOnly:true});
+ res.cookie('auth', auth, { httpOnly: true });
return res.redirect('/admin');
}
diff --git a/routes/adminRouter.js b/routes/adminRouter.js
index e7736f9..e77ced6 100644
--- a/routes/adminRouter.js
+++ b/routes/adminRouter.js
@@ -1,7 +1,7 @@
const express = require("express");
const router = express.Router();
const { cookieAuthCheck } = require("../utils/secureCookie.js");
-const { render, create, deleteEvent,login,loginRender } = require('../controllers/adminController.js');
+const { render, create, deleteEvent, login, loginRender } = require('../controllers/adminController.js');
const bodyParser = require("body-parser");
const file_utils = require("../utils/file_utils.js");
@@ -10,9 +10,9 @@ console.log(__dirname);
router.use('/submit', file_utils.upload.single('image'));
-router.get('/', cookieAuthCheck,render);
-router.get('/login',loginRender)
-router.post('/login',login)
+router.get('/', cookieAuthCheck, render);
+router.get('/login', loginRender)
+router.post('/login', login)
router.post('/submit', cookieAuthCheck, create);
router.post('/delete', /*cookieAuthCheck,*/ deleteEvent);
diff --git a/routes/rootRouter.js b/routes/rootRouter.js
index acaad4e..ac0ee18 100644
--- a/routes/rootRouter.js
+++ b/routes/rootRouter.js
@@ -5,13 +5,13 @@ const router = express.Router();
const routes = require('../controllers/rootController');
-router.get('/',routes.homePage);
-router.get('/workshops',routes.workshopPage);
+router.get('/', routes.homePage);
+router.get('/workshops', routes.workshopPage);
router.get('/events', routes.eventPage);
-router.get('/calendar',routes.calenderPage);
-router.get('/important-links',routes.importantLinkPage);
-router.get('/leadership',routes.leadershipPage);
-router.get('/merchandise',routes.merchandisePage);
-router.get('/projects',routes.projectPage);
+router.get('/calendar', routes.calenderPage);
+router.get('/important-links', routes.importantLinkPage);
+router.get('/leadership', routes.leadershipPage);
+router.get('/merchandise', routes.merchandisePage);
+router.get('/projects', routes.projectPage);
module.exports = router;
\ No newline at end of file
From af4a358c1f5157e1e4b1afdaa3db376d90b42657 Mon Sep 17 00:00:00 2001
From: must108 <136145181+must108@users.noreply.github.com>
Date: Tue, 2 Apr 2024 11:30:40 -0400
Subject: [PATCH 13/13] small formatting
---
controllers/adminController.js | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/controllers/adminController.js b/controllers/adminController.js
index 350464b..99375c0 100644
--- a/controllers/adminController.js
+++ b/controllers/adminController.js
@@ -92,9 +92,9 @@ exports.deleteEvent = async (req,res)=>{
const eventName = req.query.eventName; // Specify the name of the event to delete
const currentEventImgName = req.query.imgName;
- //console.log(req.query.eventName);
- //console.log(req.query.imgName);
- //console.log(`Deleting event with name: ${eventName}`);
+ // console.log(req.query.eventName);
+ // console.log(req.query.imgName);
+ // console.log(`Deleting event with name: ${eventName}`);
try {
const db = mongo_utils.get_client().db();
@@ -124,6 +124,4 @@ exports.deleteEvent = async (req,res)=>{
res.status(500).json({ message: err.message });
return;
}
-
- return;
}
\ No newline at end of file