From e8fe64e7dd1034619727a678ac476bde4a0bb60d Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Sat, 29 Jun 2024 21:28:28 -0700 Subject: [PATCH 1/7] Add character limit to newsletter title & description --- frontend/src/components/NewsletterSidebar.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/NewsletterSidebar.tsx b/frontend/src/components/NewsletterSidebar.tsx index 24fd266..3ce8303 100644 --- a/frontend/src/components/NewsletterSidebar.tsx +++ b/frontend/src/components/NewsletterSidebar.tsx @@ -12,6 +12,8 @@ import { WarningModule } from "./WarningModule"; import SimpleImageDropzone from "./admin/storage/SimpleImageDropzone"; import { deleteFile } from "@/app/admin/util/pageeditUtil"; +import { TextFieldCharLimit } from "./TextFieldCharLimit"; +import { TextAreaCharLimit } from "./TextAreaCharLimit"; type newsletterSidebarProps = { newsletter: null | Newsletter; @@ -243,23 +245,28 @@ const NewsletterSidebar = ({
- ) => { setTitle(event.target.value); }} error={errors.title} + maxCount={35} /> - ) => { + onChange={(event) => { setDescription(event.target.value); }} error={errors.description} + maxCount={200} /> Date: Sat, 29 Jun 2024 21:45:19 -0700 Subject: [PATCH 2/7] Enforce character limit on text fields --- frontend/src/components/EventSidebar.tsx | 53 ++++++++++++------- frontend/src/components/NewsletterSidebar.tsx | 26 ++++++--- 2 files changed, 52 insertions(+), 27 deletions(-) diff --git a/frontend/src/components/EventSidebar.tsx b/frontend/src/components/EventSidebar.tsx index 701698b..abf8c00 100644 --- a/frontend/src/components/EventSidebar.tsx +++ b/frontend/src/components/EventSidebar.tsx @@ -15,6 +15,10 @@ import AlertBanner from "@/components/AlertBanner"; import { TextField } from "@/components/TextField"; import { WarningModule } from "@/components/WarningModule"; +const EVENT_TITLE_CHAR_LIMIT = 35; +const EVENT_DESCRIPTION_SHORT_CHAR_LIMIT = 200; +const EVENT_DESCRIPTION_LONG_CHAR_LIMIT = 275; + type eventSidebarProps = { eventDetails: null | EventDetails; setSidebarOpen: (open: boolean) => void; @@ -71,25 +75,36 @@ const EventSidebar = ({ }; const handleSave = async () => { + const nameError = name === "" || name.length > EVENT_TITLE_CHAR_LIMIT; + const descriptionError = + description === "" || description.length > EVENT_DESCRIPTION_LONG_CHAR_LIMIT; + const descriptionShortError = + description_short === "" || description_short.length > EVENT_DESCRIPTION_SHORT_CHAR_LIMIT; + const dateError = !date; + const startTimeError = startTime === ""; + const endTimeError = endTime === ""; + const locationError = location === ""; + const guidelinesError = guidelines === ""; + if ( - name === "" || - description === "" || - description_short === "" || - !date || - startTime === "" || - endTime === "" || - location === "" || - guidelines === "" + nameError || + descriptionError || + descriptionShortError || + dateError || + startTimeError || + endTimeError || + locationError || + guidelinesError ) { setErrors({ - name: name === "", - description: description === "", - description_short: description_short === "", - date: !date, - startTime: startTime === "", - endTime: endTime === "", - location: location === "", - guidelines: guidelines === "", + name: nameError, + description: descriptionError, + description_short: descriptionShortError, + date: dateError, + startTime: startTimeError, + endTime: endTimeError, + location: locationError, + guidelines: guidelinesError, }); } else { setIsEditing(false); @@ -247,7 +262,7 @@ const EventSidebar = ({ setName(event.target.value); }} error={errors.name} - maxCount={35} + maxCount={EVENT_TITLE_CHAR_LIMIT} />
void; @@ -59,13 +62,20 @@ const NewsletterSidebar = ({ }; const handleSave = async () => { - if (title === "" || description === "" || date === "" || image === "" || content.length === 0) { + const titleError = title === "" || title.length > NEWSLETTER_TITLE_CHAR_LIMIT; + const descriptionError = + description === "" || description.length > NEWSLETTER_DESCRIPTION_CHAR_LIMIT; + const dateError = !date; + const imageError = image === ""; + const contentError = content === ""; + + if (titleError || descriptionError || dateError || imageError || contentError) { setErrors({ - title: title === "", - description: description === "", - date: date === "", - image: image === "", - content: content.length === 0, + title: titleError, + description: descriptionError, + date: dateError, + image: imageError, + content: contentError, }); } else { setIsEditing(false); @@ -254,7 +264,7 @@ const NewsletterSidebar = ({ setTitle(event.target.value); }} error={errors.title} - maxCount={35} + maxCount={NEWSLETTER_TITLE_CHAR_LIMIT} /> Date: Sat, 29 Jun 2024 22:24:05 -0700 Subject: [PATCH 3/7] Add image upload to event creator --- frontend/src/components/EventSidebar.tsx | 108 ++++++++++++++++++++--- 1 file changed, 95 insertions(+), 13 deletions(-) diff --git a/frontend/src/components/EventSidebar.tsx b/frontend/src/components/EventSidebar.tsx index abf8c00..241ee10 100644 --- a/frontend/src/components/EventSidebar.tsx +++ b/frontend/src/components/EventSidebar.tsx @@ -4,7 +4,7 @@ import React, { useState } from "react"; import DatePicker from "react-datepicker"; import "react-datepicker/dist/react-datepicker.css"; -import { CreateEventDetailsRequest, EventDetails } from "../api/eventDetails"; +import { CreateEventDetailsRequest, EventDetails, deleteEventDetails } from "../api/eventDetails"; import styles from "./EventSidebar.module.css"; import { TextArea } from "./TextArea"; @@ -14,6 +14,8 @@ import { TextFieldCharLimit } from "./TextFieldCharLimit"; import AlertBanner from "@/components/AlertBanner"; import { TextField } from "@/components/TextField"; import { WarningModule } from "@/components/WarningModule"; +import SimpleImageDropzone from "./admin/storage/SimpleImageDropzone"; +import { deleteFile } from "@/app/admin/util/pageeditUtil"; const EVENT_TITLE_CHAR_LIMIT = 35; const EVENT_DESCRIPTION_SHORT_CHAR_LIMIT = 200; @@ -35,6 +37,7 @@ type formErrors = { startTime?: boolean; endTime?: boolean; location?: boolean; + image?: boolean; }; const EventSidebar = ({ @@ -54,6 +57,7 @@ const EventSidebar = ({ const [location, setLocation] = useState(eventDetails ? eventDetails.location : ""); const [guidelines, setGuidelines] = useState(eventDetails ? eventDetails.guidelines : ""); + const [image, setImage] = useState(eventDetails ? eventDetails.imageURI : ""); const [isEditing, setIsEditing] = useState(!eventDetails); const [isDeleting, setIsDeleting] = useState(false); const [errors, setErrors] = useState({}); @@ -68,6 +72,7 @@ const EventSidebar = ({ setEndTime(eventDetails ? eventDetails.endTime : ""); setLocation(eventDetails ? eventDetails.location : ""); setGuidelines(eventDetails ? eventDetails.guidelines : ""); + setImage(eventDetails ? eventDetails.imageURI : ""); setIsEditing(false); setIsDeleting(false); setErrors({}); @@ -85,6 +90,7 @@ const EventSidebar = ({ const endTimeError = endTime === ""; const locationError = location === ""; const guidelinesError = guidelines === ""; + const imageError = image === ""; if ( nameError || @@ -94,7 +100,8 @@ const EventSidebar = ({ startTimeError || endTimeError || locationError || - guidelinesError + guidelinesError || + imageError ) { setErrors({ name: nameError, @@ -105,6 +112,7 @@ const EventSidebar = ({ endTime: endTimeError, location: locationError, guidelines: guidelinesError, + image: imageError, }); } else { setIsEditing(false); @@ -119,7 +127,7 @@ const EventSidebar = ({ startTime, endTime, location, - imageURI: eventDetails.imageURI, + imageURI: image, description_short, }); console.log("after updating event"); @@ -132,8 +140,7 @@ const EventSidebar = ({ startTime, endTime, location, - imageURI: - "https://images.unsplash.com/photo-1559027615-cd4628902d4a?q=80&w=2674&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", + imageURI: image, description_short, }); console.log("after creating event"); @@ -147,8 +154,48 @@ const EventSidebar = ({ } }; + // handle changing image url on event to "" if user deletes image + const onImageDelete = async () => { + setImage(""); + // immediately update event, can't undo image delete + if (eventDetails) { + await updateEvent({ + ...eventDetails, + imageURI: "", + }); + } + }; + + // handle updating image on image dropzone upload + const onImageUpload = async (url: string) => { + // can't undo image upload, save immediately + if (eventDetails) { + await updateEvent({ + ...eventDetails, + imageURI: url, + }); + } + }; + const handleDelete = () => { - setIsDeleting(true); + if (eventDetails) { + // delete image from firebase + deleteFile(image).catch(console.error); + // delete newsletter + deleteEventDetails(eventDetails._id) + .then((result) => { + if (result.success) { + console.log("successful deletion"); + } else { + console.error("ERROR:", result.error); + } + }) + .catch((error) => { + alert(error); + }); + setSidebarOpen(false); + window.location.reload(); + } }; const alertContent = { @@ -202,7 +249,13 @@ const EventSidebar = ({

Guidelines

{guidelines}

Image

-

Placeholder - to be replaced with image

+ +

Image

+
@@ -446,14 +507,35 @@ const EventSidebar = ({

Guidelines

{guidelines}

Image

-

Placeholder - to be replaced with image

+ {/* Delete button */} -
- -
+ + +
+ +
+
); From fda0388b4e6673742c7846ed17a6696fe4d7c7aa Mon Sep 17 00:00:00 2001 From: benjaminjohnson2204 Date: Sat, 29 Jun 2024 22:36:49 -0700 Subject: [PATCH 4/7] Remove console.logs and commented-out code --- backend/dist/controllers/eventDetails.js | 1 - backend/dist/controllers/pageeditor.js | 18 +- backend/dist/controllers/testimonial.js | 2 - backend/dist/models/pageeditor.js | 11 +- backend/dist/models/testimonial.js | 4 +- backend/dist/routes/pageeditor.js | 6 +- backend/dist/services/paypal.js | 14 +- backend/dist/validators/pageeditor.js | 46 +-- backend/dist/validators/testimonial.js | 13 +- backend/src/controllers/eventDetails.ts | 3 - backend/src/services/paypal.ts | 1 - frontend/src/api/requests.ts | 1 - frontend/src/app/(web app)/team/page.tsx | 1 - .../src/app/(web app)/testimonials/page.tsx | 1 - frontend/src/app/admin/event-creator/page.tsx | 5 - frontend/src/app/admin/mailing-list/page.tsx | 3 - .../src/app/admin/newsletter-creator/page.tsx | 1 - .../admin/page-editor/testimonials/page.tsx | 367 ------------------ frontend/src/components/ContactForm.tsx | 4 +- frontend/src/components/EventSidebar.tsx | 5 - frontend/src/components/NewsletterForm.tsx | 4 +- frontend/src/components/NewsletterSidebar.tsx | 4 - frontend/src/components/VolunteerForm.tsx | 6 +- frontend/src/components/admin/LoginForm.tsx | 4 +- frontend/src/components/admin/PrivatePage.tsx | 1 - .../admin/storage/GalleryDropzone.tsx | 3 +- .../admin/storage/ImageDropzone.tsx | 3 +- .../admin/storage/SimpleImageDropzone.tsx | 3 +- 28 files changed, 54 insertions(+), 481 deletions(-) diff --git a/backend/dist/controllers/eventDetails.js b/backend/dist/controllers/eventDetails.js index abf3812..c81ff01 100644 --- a/backend/dist/controllers/eventDetails.js +++ b/backend/dist/controllers/eventDetails.js @@ -83,7 +83,6 @@ const updateEventDetails = (req, res, next) => __awaiter(void 0, void 0, void 0, const updatedEventDetails = yield eventDetails_1.default.findById(id); if (updatedEventDetails === null) { // No event found, something went wrong - console.log("updatedEventDetails is null"); res.status(404); } res.status(200).json(updatedEventDetails); diff --git a/backend/dist/controllers/pageeditor.js b/backend/dist/controllers/pageeditor.js index b66044d..5f8cf0c 100644 --- a/backend/dist/controllers/pageeditor.js +++ b/backend/dist/controllers/pageeditor.js @@ -18,13 +18,13 @@ const http_errors_1 = __importDefault(require("http-errors")); const pageeditor_1 = __importDefault(require("../models/pageeditor")); const validationErrorParser_1 = __importDefault(require("../util/validationErrorParser")); const getPage = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () { - const { page } = req.params; + const { name } = req.params; try { - const pageText = yield pageeditor_1.default.findOne({ page: page }); - if (!pageText) { + const page = yield pageeditor_1.default.findOne({ name: name }); + if (!page) { throw (0, http_errors_1.default)(404, "Page not found."); } - res.status(200).json(pageText); + res.status(200).json(page); } catch (error) { next(error); @@ -33,19 +33,19 @@ const getPage = (req, res, next) => __awaiter(void 0, void 0, void 0, function* exports.getPage = getPage; const updatePageEditor = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () { const errors = (0, express_validator_1.validationResult)(req); - const { page } = req.params; - if (page !== req.body.page) { + const { name } = req.params; + if (name !== req.body.name) { // If the page in the URL does not match the page in the body, bad request res.status(400); } try { (0, validationErrorParser_1.default)(errors); - const pageText = yield pageeditor_1.default.findOneAndUpdate({ page }, req.body); - if (pageText === null) { + const page = yield pageeditor_1.default.findOneAndUpdate({ name: name }, { $set: req.body }); + if (page === null) { // No page found res.status(404); } - const updatedPage = yield pageeditor_1.default.findOne({ page }); + const updatedPage = yield pageeditor_1.default.findOne({ name: name }); if (updatedPage === null) { // No page found after updating, something went wrong res.status(404); diff --git a/backend/dist/controllers/testimonial.js b/backend/dist/controllers/testimonial.js index 9a8ce79..e9681c1 100644 --- a/backend/dist/controllers/testimonial.js +++ b/backend/dist/controllers/testimonial.js @@ -26,11 +26,9 @@ const createTestimonial = (req, res, next) => __awaiter(void 0, void 0, void 0, image: image, type: type, }); - console.log("testimonial: ", testimonial); res.status(201).json(testimonial); } catch (error) { - console.log("erroring here"); next(error); } }); diff --git a/backend/dist/models/pageeditor.js b/backend/dist/models/pageeditor.js index 6d270bd..d29f1c1 100644 --- a/backend/dist/models/pageeditor.js +++ b/backend/dist/models/pageeditor.js @@ -2,7 +2,14 @@ Object.defineProperty(exports, "__esModule", { value: true }); const mongoose_1 = require("mongoose"); const pageEditorSchema = new mongoose_1.Schema({ - page: { type: String, required: true }, - pageSections: [{ type: mongoose_1.Schema.Types.Mixed, required: true }], + name: { type: String, required: true }, + isEdited: { type: Boolean, required: true }, + fields: [ + { + name: { type: String, required: true }, + type: { type: String, required: true }, + data: { type: mongoose_1.Schema.Types.Mixed, required: true }, + }, + ], }); exports.default = (0, mongoose_1.model)("PageEditor", pageEditorSchema); diff --git a/backend/dist/models/testimonial.js b/backend/dist/models/testimonial.js index 3bff24f..71c893b 100644 --- a/backend/dist/models/testimonial.js +++ b/backend/dist/models/testimonial.js @@ -4,7 +4,7 @@ const mongoose_1 = require("mongoose"); const testimonialSchema = new mongoose_1.Schema({ title: { type: String, required: true }, description: { type: String, required: true }, - image: { type: String, required: true }, + image: { type: String, required: false }, type: { type: String, required: true }, }); -exports.default = (0, mongoose_1.model)("testimonial", testimonialSchema); +exports.default = (0, mongoose_1.model)("Testimonial", testimonialSchema); diff --git a/backend/dist/routes/pageeditor.js b/backend/dist/routes/pageeditor.js index 7a7e138..3912e22 100644 --- a/backend/dist/routes/pageeditor.js +++ b/backend/dist/routes/pageeditor.js @@ -30,8 +30,6 @@ const express_1 = __importDefault(require("express")); const PageEditorController = __importStar(require("../controllers/pageeditor")); const PageEditorValidator = __importStar(require("../validators/pageeditor")); const router = express_1.default.Router(); -router.get("/:page", PageEditorValidator.getPageEditor, PageEditorController.getPage); -router.put("/:page", // getPageEditor validator works to just check page -// PageEditorValidator.getPageEditor, -PageEditorController.updatePageEditor); +router.get("/:name", PageEditorValidator.getPageEditor, PageEditorController.getPage); +router.put("/:name", PageEditorValidator.updatePageEditor, PageEditorController.updatePageEditor); exports.default = router; diff --git a/backend/dist/services/paypal.js b/backend/dist/services/paypal.js index 527e590..d3cc95a 100644 --- a/backend/dist/services/paypal.js +++ b/backend/dist/services/paypal.js @@ -12,7 +12,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.captureOrder = exports.createOrder = void 0; const PAYPAL_CLIENT_ID = process.env.PAYPAL_CLIENT_ID; const PAYPAL_CLIENT_SECRET = process.env.PAYPAL_CLIENT_SECRET; -const base = "https://api-m.sandbox.paypal.com"; +const ORIGIN_URL = process.env.FRONTEND_ORIGIN; +const base = "https://api-m.paypal.com"; /** * Generate an OAuth 2.0 token to authenticate with PayPal REST APIs * @see https://developer.paypal.com/api/rest/authentication/ @@ -23,12 +24,16 @@ const generateAccessToken = () => __awaiter(void 0, void 0, void 0, function* () throw new Error("MISSING_PAYPAL_API_CREDENTIALS"); } const auth = Buffer.from(PAYPAL_CLIENT_ID + ":" + PAYPAL_CLIENT_SECRET).toString("base64"); + const headersList = { + Accept: "*/*", + "User-Agent": `4 Future Leaders Of Tomorrow Web App (${ORIGIN_URL})`, + "Content-Type": "application/x-www-form-urlencoded", + Authorization: `Basic ${auth}`, + }; const response = yield fetch(`${base}/v1/oauth2/token`, { method: "POST", body: "grant_type=client_credentials", - headers: { - Authorization: `Basic ${auth}`, - }, + headers: headersList, }); const data = yield response.json(); return data.access_token; @@ -56,7 +61,6 @@ function createOrder(cart) { return __awaiter(this, void 0, void 0, function* () { const accessToken = yield generateAccessToken(); const url = `${base}/v2/checkout/orders`; - console.log("shopping cart info", cart); const payload = { intent: "CAPTURE", purchase_units: [ diff --git a/backend/dist/validators/pageeditor.js b/backend/dist/validators/pageeditor.js index 553f234..4dbaf89 100644 --- a/backend/dist/validators/pageeditor.js +++ b/backend/dist/validators/pageeditor.js @@ -1,42 +1,24 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.createPageEditor = exports.getPageEditor = void 0; +exports.updatePageEditor = exports.getPageEditor = void 0; const express_validator_1 = require("express-validator"); -const makeIDValidator = () => (0, express_validator_1.body)("_id") +const makeNameValidator = () => (0, express_validator_1.body)("name") .exists() - .withMessage("_id is required") + .withMessage("name is required") .bail() .isString() - .withMessage("_id must be a number"); -const makePageValidator = () => (0, express_validator_1.body)("page") + .withMessage("name must be a string"); +const makeEditedValidator = () => (0, express_validator_1.body)("isEdited") .exists() - .withMessage("image is required") + .withMessage("isEdited is required") .bail() - .isString() - .withMessage("image must be a string"); -const makeSubtitleValidator = () => (0, express_validator_1.body)("ph_subtitle") - .exists() - .withMessage("subtitle is required") - .bail() - .isString() - .withMessage("subtitle must be a string"); -const makeTitleValidator = () => (0, express_validator_1.body)("s1_title") + .isBoolean() + .withMessage("isEdited must be a boolean"); +const makeFieldsValidator = () => (0, express_validator_1.body)("fields") .exists() - .withMessage("date is required") + .withMessage("fields is required") .bail() - .isString() - .withMessage("date must be a string"); -const makeTextValidator = () => (0, express_validator_1.body)("s1_text") - .exists() - .withMessage("content is required") - .bail() - .isString() - .withMessage("content must be a string"); -exports.getPageEditor = [makePageValidator()]; -exports.createPageEditor = [ - makeIDValidator(), - makePageValidator(), - makeSubtitleValidator(), - makeTitleValidator(), - makeTextValidator(), -]; + .isArray() + .withMessage("fields must be an array"); +exports.getPageEditor = [makeNameValidator(), makeEditedValidator(), makeFieldsValidator()]; +exports.updatePageEditor = [makeNameValidator(), makeEditedValidator(), makeFieldsValidator()]; diff --git a/backend/dist/validators/testimonial.js b/backend/dist/validators/testimonial.js index 95fc600..b7fdf84 100644 --- a/backend/dist/validators/testimonial.js +++ b/backend/dist/validators/testimonial.js @@ -32,18 +32,7 @@ const makeDescriptionValidator = () => (0, express_validator_1.body)("descriptio .bail() .notEmpty() .withMessage("description cannot be empty"); -const makeImageValidator = () => (0, express_validator_1.body)("image") - // title must exist, if not this message will be displayed - .exists() - .withMessage("image is required") - // bail prevents the remainder of the validation chain for this field from being executed if - // there was an error - .bail() - .isString() - .withMessage("image must be a string") - .bail() - .notEmpty() - .withMessage("image cannot be empty"); +const makeImageValidator = () => (0, express_validator_1.body)("image").optional().isString().withMessage("image must be a string"); exports.createTestimonial = [ makeTitleValidator(), makeImageValidator(), diff --git a/backend/src/controllers/eventDetails.ts b/backend/src/controllers/eventDetails.ts index ea0b580..f21e57b 100644 --- a/backend/src/controllers/eventDetails.ts +++ b/backend/src/controllers/eventDetails.ts @@ -34,7 +34,6 @@ export const getEventDetails: RequestHandler = async (req, res, next) => { }; export const createEventDetails: RequestHandler = async (req, res, next) => { - console.log("backend createEventDetails. req.body: ", req.body); const errors = validationResult(req); const { name, @@ -63,7 +62,6 @@ export const createEventDetails: RequestHandler = async (req, res, next) => { description_short, }); - // console.log("added eventDetails: ", eventDetails); res.status(201).json(eventDetails); } catch (error) { next(error); @@ -89,7 +87,6 @@ export const updateEventDetails: RequestHandler = async (req, res, next) => { const updatedEventDetails = await EventDetails.findById(id); if (updatedEventDetails === null) { // No event found, something went wrong - console.log("updatedEventDetails is null"); res.status(404); } res.status(200).json(updatedEventDetails); diff --git a/backend/src/services/paypal.ts b/backend/src/services/paypal.ts index 93d734e..1740eb2 100644 --- a/backend/src/services/paypal.ts +++ b/backend/src/services/paypal.ts @@ -61,7 +61,6 @@ async function handleResponse(response: Response) { export async function createOrder(cart: Cart) { const accessToken = await generateAccessToken(); - console.log("creating order with ", accessToken); const url = `${base}/v2/checkout/orders`; const payload = { diff --git a/frontend/src/api/requests.ts b/frontend/src/api/requests.ts index c4ae06b..247cb25 100644 --- a/frontend/src/api/requests.ts +++ b/frontend/src/api/requests.ts @@ -108,7 +108,6 @@ export async function post( headers: Record = {}, ): Promise { const response = await fetchRequest("POST", API_BASE_URL + url, body, headers); - console.log("fetch response: ", response); await assertOk(response); return response; } diff --git a/frontend/src/app/(web app)/team/page.tsx b/frontend/src/app/(web app)/team/page.tsx index 2988600..771a925 100644 --- a/frontend/src/app/(web app)/team/page.tsx +++ b/frontend/src/app/(web app)/team/page.tsx @@ -21,7 +21,6 @@ export default function Team() { getAllMembers() .then((result) => { if (result.success) { - console.log(result.data); setMembers(result.data); } else { alert(result.error); diff --git a/frontend/src/app/(web app)/testimonials/page.tsx b/frontend/src/app/(web app)/testimonials/page.tsx index b996bbf..a49d7b5 100644 --- a/frontend/src/app/(web app)/testimonials/page.tsx +++ b/frontend/src/app/(web app)/testimonials/page.tsx @@ -30,7 +30,6 @@ export default function Impact() { const [loading, setLoading] = useState(false); const loadTestimonials = () => { - console.log("getting from loadTestimonials"); getAllTestimonials() .then((result) => { if (result.success) { diff --git a/frontend/src/app/admin/event-creator/page.tsx b/frontend/src/app/admin/event-creator/page.tsx index a6c0066..3fc605c 100644 --- a/frontend/src/app/admin/event-creator/page.tsx +++ b/frontend/src/app/admin/event-creator/page.tsx @@ -109,7 +109,6 @@ export default function EventCreator() { getAllEventDetails() .then((result) => { if (result.success) { - console.log(result.data); const now = new Date(); const utcDateCurrent = now; @@ -129,7 +128,6 @@ export default function EventCreator() { id: item._id.toString(), })); - console.log("current: ", formattedCurrentRows); setCurrentEvents(formattedCurrentRows); const filteredPast = result.data.filter((item) => { @@ -147,7 +145,6 @@ export default function EventCreator() { id: item._id.toString(), })); - console.log("past: ", formattedPastRows); setPastEvents(formattedPastRows); setRow(formattedCurrentRows); @@ -209,7 +206,6 @@ export default function EventCreator() { useEffect(() => { // Update total pages when rows change setTotalPages(Math.ceil(rows.length / 14)); - console.log("rows.length: ", rows.length); }, [rows]); const handleCellClick: GridEventListener<"rowClick"> = (params) => { @@ -228,7 +224,6 @@ export default function EventCreator() { const handleUpdateEvent = async (eventData: EventDetails) => { const result = await updateEventDetails(eventData); if (!result.success) { - console.log("result was not a success"); alert(result.error); console.error("ERROR:", result.error); } diff --git a/frontend/src/app/admin/mailing-list/page.tsx b/frontend/src/app/admin/mailing-list/page.tsx index aa5bde0..c70fd87 100644 --- a/frontend/src/app/admin/mailing-list/page.tsx +++ b/frontend/src/app/admin/mailing-list/page.tsx @@ -39,8 +39,6 @@ export default function MailingList() { getAllSubscribers() .then((result) => { if (result.success) { - console.log("Data:", result.data); - const formattedRows = result.data.map((item) => ({ ...item, id: item._id.toString(), @@ -158,7 +156,6 @@ export default function MailingList() { if (selectedRowData) { setDeletedRow(selectedRowData); - console.log("selectedRowData:", selectedRowData._id); deleteSubscriber(selectedRowData._id) .then((response) => { if (response.success) { diff --git a/frontend/src/app/admin/newsletter-creator/page.tsx b/frontend/src/app/admin/newsletter-creator/page.tsx index 51fc921..8207df1 100644 --- a/frontend/src/app/admin/newsletter-creator/page.tsx +++ b/frontend/src/app/admin/newsletter-creator/page.tsx @@ -177,7 +177,6 @@ export default function NewsletterCreator() { const handleUpdateNewsletter = async (newsletterData: Newsletter) => { const result = await updateNewsletter(newsletterData); if (!result.success) { - console.log("result was not a success"); alert(result.error); console.error("ERROR:", result.error); } diff --git a/frontend/src/app/admin/page-editor/testimonials/page.tsx b/frontend/src/app/admin/page-editor/testimonials/page.tsx index 597677f..e63d545 100644 --- a/frontend/src/app/admin/page-editor/testimonials/page.tsx +++ b/frontend/src/app/admin/page-editor/testimonials/page.tsx @@ -1,370 +1,3 @@ -// "use client"; -// import React, { useEffect, useState } from "react"; - -// import { getPageText, updatePage } from "../../../../api/pageeditor"; -// import { -// Testimonial, -// createTestimonial, -// deleteTestimonial, -// getAllQuotes, -// updateTestimonial, -// } from "../../../../api/testimonial"; - -// import styles from "./page.module.css"; - -// import { updateRecord } from "@/api/records"; -// import AlertBanner from "@/components/AlertBanner"; -// import Button from "@/components/Button"; -// import CancelButton from "@/components/CancelButton"; -// import Collapsable from "@/components/Collapsable"; -// import PageToggle from "@/components/PageToggle"; -// import { WarningModule } from "@/components/WarningModule"; - -// export default function TestimonialsEditor() { -// const [isEdited, setIsEdited] = useState(false); -// const [phSubtitle, setPhSubtitle] = useState(""); -// const [s1Subtitle, setS1Subtitle] = useState(""); -// const [s1Text, setS1Text] = useState(""); -// const [s2Title, setS2Title] = useState(""); -// const [s2Subtitle, setS2Subtitle] = useState(""); - -// const [testimonialData, setTestimonialData] = useState([]); //Holds all testimonials as Testimonials -// const [testimonialArray, setTestimonialArray] = useState([]); //Holds all testimonials as strings -// const [editedTestimonials, setEdited] = useState>(new Set()); //Indices of edited testimonials - -// const [showAlert, setShowAlert] = useState(false); -// const [warningOpen, setWarningOpen] = useState(false); - -// /* Get page data from MongoDB */ -// let pageText; -// useEffect(() => { -// getAllQuotes() -// .then((response2) => { -// if (response2.success) { -// setTestimonialData(response2.data); -// const newArray: string[][] = []; -// for (const elem of response2.data) { -// newArray.push([elem.title, elem.description]); // and one new item at the end -// } -// setTestimonialArray(newArray); -// } else { -// alert(response2.error); -// } -// }) -// .catch((error) => { -// alert(error); -// }); -// getPageText("Testimonials") -// .then((response) => { -// if (response.success) { -// pageText = response.data; -// setPhSubtitle(pageText.pageSections[0].subtitle ?? ""); -// setS1Subtitle(pageText.pageSections[1].sectionTitle ?? ""); -// setS1Text(pageText.pageSections[1].sectionSubtitle ?? ""); -// setS2Title(pageText.pageSections[2].sectionTitle ?? ""); -// setS2Subtitle(pageText.pageSections[2].sectionSubtitle ?? ""); -// } else { -// alert(response.error); -// } -// }) -// .catch((error) => { -// alert(error); -// }); -// }, []); - -// /* Handle Fields upon edit */ -// const handleEdit = (event: React.ChangeEvent) => { -// setIsEdited(true); -// if (event.target.id === "Page Header: Subtitle") { -// setPhSubtitle(event.target.value); -// } else if (event.target.id === "Section 1: Section Title") { -// setS1Subtitle(event.target.value); -// } else if (event.target.id === "Section 1: Subtitle") { -// setS1Text(event.target.value); -// } else if (event.target.id === "Section 2: Section Title") { -// setS2Title(event.target.value); -// } else if (event.target.id === "Section 2: Subtitle") { -// setS2Subtitle(event.target.value); -// } else if (event.target.id.startsWith("Testimonial Header")) { -// const testimonialIndex = Number(event.target.id.slice(event.target.id.indexOf(":") + 2)); -// //Update textarea by changing testimonialArray element -// const updateArray = testimonialArray.map((elem, index) => { -// if (index === testimonialIndex) { -// return [event.target.value, elem[1]]; -// } else { -// return elem; -// } -// }); -// setTestimonialArray(updateArray); -// editedTestimonials.add(testimonialIndex); //Add index to list of edited indices -// } else if (event.target.id.startsWith("Testimonial Description")) { -// const testimonialIndex = Number(event.target.id.slice(event.target.id.indexOf(":") + 2)); -// //Update textarea by changing testimonialArray element -// const updateArray = testimonialArray.map((elem, index) => { -// if (index === testimonialIndex) { -// return [elem[0], event.target.value]; -// } else { -// return elem; -// } -// }); -// setTestimonialArray(updateArray); -// editedTestimonials.add(testimonialIndex); //Add index to list of edited indices -// } -// }; - -// const handleSave = () => { -// // Implement save logic -// if (isEdited) { -// console.log("Save Testimonials Page"); -// updatePage({ -// //Pass edited text to MongoDB -// page: "Testimonials", -// pageSections: [ -// { -// subtitle: phSubtitle, -// }, -// { -// sectionTitle: s1Subtitle, -// sectionSubtitle: s1Text, -// }, -// { -// sectionTitle: s2Title, -// sectionSubtitle: s2Subtitle, -// }, -// ], -// }) -// .then((response) => { -// if (response.success) { -// setShowAlert(true); -// } else { -// alert(response.error); -// } -// }) -// .catch((error) => { -// alert(error); -// }); -// if (editedTestimonials.size > 0) { -// //Pass edited testimonials to MongoDB -// for (const index of Array.from(editedTestimonials)) { -// //If creating new testimonial -// if (index >= testimonialData.length) { -// //Check title & description aren't empty -// if (testimonialArray[index][0] !== "" && testimonialArray[index][1] !== "") { -// createTestimonial({ -// title: testimonialArray[index][0], -// description: testimonialArray[index][1], -// image: "/impact1.png", -// type: "quote", -// }) -// .then((response) => { -// if (response.success) { -// setTestimonialData([ -// ...testimonialData, -// response.data, // add one new Testimonial to the array -// ]); -// setShowAlert(true); - -// getAllQuotes() -// .then((response2) => { -// if (response2.success) { -// setTestimonialData(response2.data); -// const newArray: string[][] = []; -// for (const elem of response2.data) { -// newArray.push([elem.title, elem.description]); // and one new item at the end -// } -// setTestimonialArray(newArray); -// } else { -// alert(response2.error); -// } -// }) -// .catch((error) => { -// alert(error); -// }); -// } else { -// // If adding and missing title/desc -// alert(response.error); -// setTestimonialArray( -// testimonialArray.filter((elem, elemIndex) => elemIndex !== index), -// ); -// } -// }) -// .catch((error) => { -// alert(error); -// }); -// } -// } else { -// //If editing testimonial -// //Update testimonial with edited values stored in testimonialArray -// testimonialData[index].title = testimonialArray[index][0]; -// testimonialData[index].description = testimonialArray[index][1]; - -// //If deleting testimonial -// if (testimonialData[index].title === "" || testimonialData[index].description === "") { -// deleteTestimonial(testimonialData[index]._id) -// .then((response) => { -// if (response.success) { -// setShowAlert(true); -// } else { -// alert(response.error); -// } -// }) -// .catch((error) => { -// alert(error); -// }); -// testimonialData.splice(index, 1); -// } else { -// //If updating testimonial -// updateTestimonial(testimonialData[index]) -// .then((response) => { -// if (response.success) { -// setShowAlert(true); -// } else { -// alert(response.error); -// } -// }) -// .catch((error) => { -// alert(error); -// }); -// } -// } -// } -// setTestimonialArray(testimonialArray.filter((elem) => elem[0] !== "" && elem[1] !== "")); -// setEdited(new Set()); -// } - -// updateRecord("impact") -// .then() -// .catch((error) => { -// alert(error); -// }); -// setIsEdited(false); -// } -// setWarningOpen(false); -// }; - -// const handleCancel = () => { -// // Show cancel warning -// if (isEdited) { -// setWarningOpen(true); -// } -// }; - -// const confirmCancel = () => { -// // Implement cancel logic -// setWarningOpen(false); -// console.log("Cancel changes"); -// getPageText("Testimonials") -// .then((response) => { -// if (response.success) { -// pageText = response.data; -// setPhSubtitle(pageText.pageSections[0].subtitle ?? ""); -// setS1Subtitle(pageText.pageSections[1].sectionTitle ?? ""); -// setS1Text(pageText.pageSections[1].sectionSubtitle ?? ""); -// setS2Title(pageText.pageSections[2].sectionTitle ?? ""); -// setS2Subtitle(pageText.pageSections[2].sectionSubtitle ?? ""); -// } else { -// alert(response.error); -// } -// }) -// .catch((error) => { -// alert(error); -// }); -// if (editedTestimonials.size > 0) { -// const updateArray: string[][] = []; -// for (const elem of testimonialData) { -// updateArray.push([elem.title, elem.description]); -// } -// setTestimonialArray(updateArray); -// } -// setIsEdited(false); -// }; - -// const handleAdd = () => { -// console.log("Add Testimonial"); -// setTestimonialArray([ -// ...testimonialArray, -// ["", ""], // add one new item at the end -// ]); -// editedTestimonials.add(testimonialArray.length); //Add index to list of edited indices -// setIsEdited(true); -// }; - -// const handleCloseAlert = () => { -// setShowAlert(false); -// }; - -// return ( -//
-//
-// {showAlert && } -//
-//
-// {warningOpen &&
} -//
-// {warningOpen && ( -// { -// setWarningOpen(false); -// }} -// /> -// )} -//
-//
-// -//
-// -// -// -// {/* -// */} - -//
-// -//
-//
-//
-// ); -// } - "use client"; import PageToggle from "../../../../components/PageToggle"; diff --git a/frontend/src/components/ContactForm.tsx b/frontend/src/components/ContactForm.tsx index bbff7de..1386b3d 100644 --- a/frontend/src/components/ContactForm.tsx +++ b/frontend/src/components/ContactForm.tsx @@ -100,9 +100,7 @@ const ContactForm: React.FC = () => { message, question: questionType, }).then( - () => { - console.log("Email sent!"); - }, + () => {}, (error) => { // If the .then() request fails, show the error message alert(error); diff --git a/frontend/src/components/EventSidebar.tsx b/frontend/src/components/EventSidebar.tsx index 241ee10..e1030e8 100644 --- a/frontend/src/components/EventSidebar.tsx +++ b/frontend/src/components/EventSidebar.tsx @@ -117,7 +117,6 @@ const EventSidebar = ({ } else { setIsEditing(false); if (eventDetails) { - console.log("eventDetails exist"); await updateEvent({ _id: eventDetails._id, name, @@ -130,7 +129,6 @@ const EventSidebar = ({ imageURI: image, description_short, }); - console.log("after updating event"); } else { await createEvent({ name, @@ -143,14 +141,12 @@ const EventSidebar = ({ imageURI: image, description_short, }); - console.log("after creating event"); } setIsEditing(false); setErrors({}); setShowAlert(true); window.location.reload(); - console.log("last line in save"); } }; @@ -185,7 +181,6 @@ const EventSidebar = ({ deleteEventDetails(eventDetails._id) .then((result) => { if (result.success) { - console.log("successful deletion"); } else { console.error("ERROR:", result.error); } diff --git a/frontend/src/components/NewsletterForm.tsx b/frontend/src/components/NewsletterForm.tsx index bce30cf..0adf6ed 100644 --- a/frontend/src/components/NewsletterForm.tsx +++ b/frontend/src/components/NewsletterForm.tsx @@ -82,9 +82,7 @@ const NewsletterForm: React.FC = ({ quarterlyUpdates, specialUpdates, }).then( - () => { - console.log("Email sent!"); - }, + () => {}, (error) => { alert(error); }, diff --git a/frontend/src/components/NewsletterSidebar.tsx b/frontend/src/components/NewsletterSidebar.tsx index bd5891a..847d97d 100644 --- a/frontend/src/components/NewsletterSidebar.tsx +++ b/frontend/src/components/NewsletterSidebar.tsx @@ -135,7 +135,6 @@ const NewsletterSidebar = ({ deleteNewsletter(newsletter._id) .then((result) => { if (result.success) { - console.log("successful deletion"); } else { console.error("ERROR:", result.error); } @@ -179,7 +178,6 @@ const NewsletterSidebar = ({