From 6affc3f26ab75ce3e83c6d355fd7a3e170991882 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tony=20=E3=83=84?= Date: Sun, 24 Nov 2024 20:38:01 -0500 Subject: [PATCH 1/2] first commit --- backend/server.js | 58 ++++++++++++ src/api/class-wrapper.js | 14 ++- src/components/CreateClassForm.jsx | 137 +++++++++++++++++++++++++++++ src/pages/Classes.jsx | 6 ++ 4 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 src/components/CreateClassForm.jsx diff --git a/backend/server.js b/backend/server.js index 368843f..56e82fb 100644 --- a/backend/server.js +++ b/backend/server.js @@ -228,6 +228,64 @@ app.get('/api/classes', async (req, res) => { } }) +// Create or Edit Class +app.post('/api/classes', async (req, res) => { + try { + const { title, level, ageGroup, instructor, schedule } = req.body; + + // Validate required fields + if (!title || !level || !ageGroup || !instructor || !schedule) { + return res.status(400).json({ message: 'Missing required fields' }); + } + + // Check if class already exists by title (assuming title is unique) + const existingClass = await Class.findOne({ title }); + + if (existingClass) { + // If class exists, update it while preserving the roster + const updatedClass = await Class.findOneAndUpdate( + { title }, + { + $set: { + level, + ageGroup, + instructor, + schedule + } + }, + { + new: true, // Return the updated document + runValidators: true // Run schema validators + } + ); + + return res.status(200).json({ + message: 'Class updated successfully', + class: updatedClass + }); + } else { + // If class doesn't exist, create a new one with empty roster + const newClass = new Class({ + title, + level, + ageGroup, + instructor, + schedule, + roster: [] // Initialize with empty roster + }); + + await newClass.save(); + return res.status(201).json({ + message: 'Class created successfully', + class: newClass + }); + } + } catch (error) { + console.error('Error creating/updating class:', error); + return res.status(500).json({ message: 'Error creating/updating class' }); + } +}); + // Levels app.get("/api/levels", async (req, res) => { try { diff --git a/src/api/class-wrapper.js b/src/api/class-wrapper.js index 5319b6a..09fa1d1 100644 --- a/src/api/class-wrapper.js +++ b/src/api/class-wrapper.js @@ -22,7 +22,19 @@ const getLevels = async (query) => { } } +// classData should be an object containing title, level, ageGroup, instructor, and schedule +const createOrUpdateClass = async (classData) => { + try { + const response = await axios.post(apiUrl('/api/classes'), classData); + return response.data; + } catch (error) { + console.error('Error creating/updating class:', error); + throw error; + } +} + export { getClasses, - getLevels + getLevels, + createOrUpdateClass } \ No newline at end of file diff --git a/src/components/CreateClassForm.jsx b/src/components/CreateClassForm.jsx new file mode 100644 index 0000000..a1ecbd1 --- /dev/null +++ b/src/components/CreateClassForm.jsx @@ -0,0 +1,137 @@ +import { useState } from 'react'; +import { createOrUpdateClass } from '../api/class-wrapper'; + +const CreateClassForm = () => { + const [formData, setFormData] = useState({ + title: '', + level: '', + ageGroup: '', + instructor: '', + schedule: [{ day: '', time: '' }] + }); + + const handleSubmit = async (e) => { + e.preventDefault(); + try { + const response = await createOrUpdateClass(formData); + alert(response.message); // Show success message + // Reset form + setFormData({ + title: '', + level: '', + ageGroup: '', + instructor: '', + schedule: [{ day: '', time: '' }] + }); + } catch (error) { + alert('Error creating/updating class: ' + error.message); + } + }; + + const handleChange = (e) => { + setFormData({ + ...formData, + [e.target.name]: e.target.value + }); + }; + + const handleScheduleChange = (index, field, value) => { + const newSchedule = [...formData.schedule]; + newSchedule[index] = { + ...newSchedule[index], + [field]: value + }; + setFormData({ + ...formData, + schedule: newSchedule + }); + }; + + return ( +
+

Create/Edit Class

+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + {formData.schedule.map((scheduleItem, index) => ( +
+

Schedule {index + 1}

+
+ handleScheduleChange(index, 'day', e.target.value)} + className="rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500" + required + /> + handleScheduleChange(index, 'time', e.target.value)} + className="rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500" + required + /> +
+
+ ))} + + +
+
+ ); +}; + +export default CreateClassForm; diff --git a/src/pages/Classes.jsx b/src/pages/Classes.jsx index 500bd4e..6928ec4 100644 --- a/src/pages/Classes.jsx +++ b/src/pages/Classes.jsx @@ -2,6 +2,7 @@ import { useState, useEffect } from 'react'; import { useSearch, useLocation } from 'wouter'; import Class from '../components/Class'; import Level from '../components/Level'; +import CreateClassForm from '../components/CreateClassForm'; import { getClasses, getLevels } from '../api/class-wrapper'; const Classes = () => { @@ -66,6 +67,11 @@ const Classes = () => { {/* Content Section */}
+ {/* Create/Edit Class Form */} +
+ +
+ {/* Open Classes */}

Open Classes

From ffc8ffd177a6a7b651d4375612d0472ffb73d9a4 Mon Sep 17 00:00:00 2001 From: myix765 Date: Wed, 11 Dec 2024 18:17:46 -0500 Subject: [PATCH 2/2] some fixes --- backend/server.js | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/backend/server.js b/backend/server.js index 56e82fb..bc9e52f 100644 --- a/backend/server.js +++ b/backend/server.js @@ -233,27 +233,23 @@ app.post('/api/classes', async (req, res) => { try { const { title, level, ageGroup, instructor, schedule } = req.body; - // Validate required fields - if (!title || !level || !ageGroup || !instructor || !schedule) { - return res.status(400).json({ message: 'Missing required fields' }); - } - // Check if class already exists by title (assuming title is unique) const existingClass = await Class.findOne({ title }); if (existingClass) { // If class exists, update it while preserving the roster - const updatedClass = await Class.findOneAndUpdate( - { title }, + const updatedClass = await Class.findByIdAndUpdate( + existingClass._id, { $set: { + title, level, ageGroup, instructor, schedule } }, - { + { new: true, // Return the updated document runValidators: true // Run schema validators } @@ -271,7 +267,6 @@ app.post('/api/classes', async (req, res) => { ageGroup, instructor, schedule, - roster: [] // Initialize with empty roster }); await newClass.save();