Quellcode durchsuchen

Add frontend to update lectures.
Fix all bugs.

Lee Morgan vor 5 Jahren
Ursprung
Commit
f863f2637b
5 geänderte Dateien mit 155 neuen und 10 gelöschten Zeilen
  1. 9 6
      controllers/learn.js
  2. 7 2
      models/lecture.js
  3. 3 1
      routes.js
  4. 133 0
      views/learn/editLecture.html
  5. 3 1
      views/learn/newLecture.html

+ 9 - 6
controllers/learn.js

@@ -59,9 +59,10 @@ module.exports = {
         documents: [{
             title: String
             link: String
-        }]
+        }],
+        date: Date
     }
-    redirects to home
+    redirects to edited lecture
     */
     createLecture: function(req, res){
         Course.findOne({_id: req.body.course})
@@ -92,7 +93,8 @@ module.exports = {
                     description: req.body.description,
                     furtherReading: readings,
                     exercises: exercises,
-                    documents: []
+                    documents: [],
+                    createdDate: new Date(req.body.date)
                 });
 
                 
@@ -137,7 +139,8 @@ module.exports = {
     /*
     POST: updates a lecture
     req.body = {
-        course: String (id)
+        uploader: String,
+        password: String
         title: String
         video: String
         description: String
@@ -146,6 +149,7 @@ module.exports = {
         date: Date
     }
     req.params.id = String (lecture id)
+    redirects to updated lecture
     */
     updateLecture: function(req, res){
         Lecture.findOne({_id: req.params.id})
@@ -165,13 +169,12 @@ module.exports = {
                 let exercises = req.body.exercises.split("\r\n");
                 exercises.splice(exercises.length - 1, 1);
 
-                lecture.course = req.body.course;
                 lecture.title = req.body.title;
                 lecture.video = req.body.video;
                 lecture.description = req.body.description;
                 lecture.furtherReading = readings;
                 lecture.exercises = exercises;
-                lecture.date = new Date(req.body.date);
+                lecture.updatedDate = new Date(req.body.date);
 
                 return lecture.save();
             })

+ 7 - 2
models/lecture.js

@@ -27,9 +27,14 @@ const LectureSchema = new mongoose.Schema({
         link: String
     }],
     exercises: [String],
-    date: {
+    createdDate: {
         type: Date,
-        default: new Date()
+        default: new Date(),
+        required: true
+    },
+    updatedDate: {
+        type: Date,
+        required: false
     }
 });
 

+ 3 - 1
routes.js

@@ -65,8 +65,10 @@ module.exports = function(app){
 
     app.get("/learn/lectures/new", (req, res)=>{res.sendFile(`${views}/learn/newLecture.html`)});
     app.post("/learn/lectures/new", learn.createLecture);
+    app.get("/learn/lectures/edit/:id", (req, res)=>{res.sendFile(`${views}/learn/editLecture.html`)});
+    app.post("/learn/lectures/edit/:id", learn.updateLecture);
     app.get("/learn/lectures/json/:id", learn.getLectures);
-    app.get("/learn/lectures/:id", (req, res)=>(res.sendFile(`${views}/learn/lecture.html`)));
+    app.get("/learn/lectures/:id", (req, res)=>{res.sendFile(`${views}/learn/lecture.html`)});
     app.get("/learn/lectures/json/one/:id", learn.getLecture);
 
     app.post("/htmltest", (req, res)=>{res.send(`Hi ${req.body.name} from ${req.body.place}`)});

+ 133 - 0
views/learn/editLecture.html

@@ -0,0 +1,133 @@
+<!DOCTYPE html>
+<html lang="en">
+    <head>
+        <meta charset="utf-8">
+        <title>Lee Morgan</title>
+        <style>
+            form{
+                display: flex;
+                flex-direction: column;
+            }
+        </style>
+    </head>
+    <body>
+        <form id="form" method="post" enctype="multipart/form-data">
+            <label>Uploader
+                <input name="uploader" type="text" required>
+            </label>
+
+            <label>Password
+                <input name="password" type="password" required>
+            </label>
+
+            <label>Title
+                <input id="titleInput" name="title" type="text" required>
+            </label>
+
+            <label>Video
+                <input id="videoInput" name="video" type="text" required>
+            </label>
+
+            <label>Description
+                <textarea id="descriptionInput" name="description"></textarea>
+            </label>
+
+            <h2>Further Reading</h2>
+            <button id="readingButton" type="button">Add Link</button>
+            <div id="reading">
+                <template id="readingItem">
+                    <div class="readingItem">
+                        <input type="text">
+                        <input type="text">
+                        <button type="button">remove</button>
+                    </div>
+                </template>
+            </div>
+
+            <h2>Exercises</h2>
+            <button id="exercisesButton" type="button">Add Exercise</button>
+            <div id="exercises">
+                <template id="exercisesItem">
+                    <div class="exercisesItem">
+                        <textarea></textarea>
+                        <button type="button">remove</button>
+                    </div>
+                </template>
+            </div>
+
+            <input id="readingHidden" name="furtherReading" type="hidden">
+            <input id="exerciseHidden" name="exercises" type="hidden">
+            <input id="dateInput" name="date" type="hidden">
+
+            <input type="submit" value="Submit">
+        </form>
+
+        <script>
+            let id = window.location.href.split("/");
+            id = id[id.length-1];
+
+            fetch(`/learn/lectures/json/one/${id}`)
+                .then(response => response.json())
+                .then((response)=>{
+                    document.getElementById("titleInput").value = response.title;
+                    document.getElementById("videoInput").value = response.video;
+                    document.getElementById("descriptionInput").innerText = response.description;
+
+                    let readingDiv = document.getElementById("reading");
+                    let readingTemplate = document.getElementById("readingItem").content.children[0];
+                    for(let i = 0; i < response.furtherReading.length; i++){
+                        let div = readingTemplate.cloneNode(true);
+                        div.children[0].value = response.furtherReading[i].text;
+                        div.children[1].value = response.furtherReading[i].link;
+                        div.children[2].onclick = ()=>{div.parentElement.removeChild(div)};
+                        readingDiv.appendChild(div);
+                    }
+
+                    let exerciseDiv = document.getElementById("exercises");
+                    let exerciseTemplate = document.getElementById("exercisesItem").content.children[0];
+                    for(let i = 0; i < response.exercises.length; i++){
+                        let div = exerciseTemplate.cloneNode(true);
+                        div.children[0].innerText = response.exercises[i];
+                        div.children[1].onclick = ()=>{div.parentElement.removeChild(div)};
+                        exerciseDiv.appendChild(div);
+                    }
+
+                    document.getElementById("readingButton").onclick = ()=>{
+                        let div = readingTemplate.cloneNode(true);
+                        div.children[2].onclick = ()=>{div.parentElement.removeChild(div)};
+                        readingDiv.appendChild(div);
+                    };
+
+                    document.getElementById("exercisesButton").onclick = ()=>{
+                        let div = exerciseTemplate.cloneNode(true);
+                        div.children[1].onclick = ()=>{div.parentElement.removeChild(div)};
+                        exerciseDiv.appendChild(div);
+                    };
+                })
+                .catch((err)=>{});
+
+                let form = document.getElementById("form");
+                form.onsubmit = ()=>{
+                    event.preventDefault();
+
+                    let readingDiv = document.getElementById("reading").children;
+                    let readingText = "";
+                    for(let i = 1; i < readingDiv.length; i++){
+                        readingText += `${readingDiv[i].children[0].value}\n${readingDiv[i].children[1].value}\n`;
+                    }
+                    document.getElementById("readingHidden").value = readingText;
+
+                    let exerciseDivs = document.getElementById("exercises").children;
+                    let exerciseText = "";
+                    for(let i = 1; i < exerciseDivs.length; i++){
+                        exerciseText += `${exerciseDivs[i].children[0].value}\n`;
+                    }
+                    document.getElementById("exerciseHidden").value = exerciseText;
+
+                    document.getElementById("dateInput").value = new Date();
+
+                    form.submit();
+                }
+        </script>
+    </body>
+</html>

+ 3 - 1
views/learn/newLecture.html

@@ -82,6 +82,7 @@
 
             <input id="hidden" name="exercises" type="hidden">
             <input id="readingsHidden" name="furtherReading" type="hidden">
+            <input id="date" name="date" type="hidden">
 
             <input type="submit" value="Submit">
         </form>
@@ -151,7 +152,8 @@
 
                 document.getElementById("hidden").value = exercises;
                 document.getElementById("readingsHidden").value = readings;
-
+                document.getElementById("date").value = new Date();
+                
                 form.submit();
             }
         </script>