Sfoglia il codice sorgente

Create page to display a gallery.

Lee Morgan 5 anni fa
parent
commit
084cb453e2
4 ha cambiato i file con 205 aggiunte e 0 eliminazioni
  1. 15 0
      controllers/gallery.js
  2. 3 0
      routes.js
  3. 90 0
      views/gallery/index.css
  4. 97 0
      views/gallery/index.html

+ 15 - 0
controllers/gallery.js

@@ -53,5 +53,20 @@ module.exports = {
             .catch((err)=>{
                 return res.json("ERROR: could not fetch galleries");
             });
+    },
+
+    /*
+    GET: fetch the data for a single gallery
+    req.params.id = String (gallery id)
+    response = Gallery
+    */
+    getGallery: function(req, res){
+        Gallery.findOne({_id: req.params.id})
+            .then((gallery)=>{
+                return res.json(gallery);
+            })
+            .catch((err)=>{
+                return res.json("ERROR: could not fetch gallery");
+            });
     }
 }

+ 3 - 0
routes.js

@@ -43,9 +43,12 @@ module.exports = function(app){
     app.get("/travel/*", (req, res)=>res.sendFile(`${views}/travel/index.html`));
 
     //GALLERY
+    app.get("/gallery/style", (req, res)=>{res.sendFile(`${views}/gallery/index.css`)});
     app.get("/gallery/new", (req, res)=>{res.sendFile(`${views}/gallery/new.html`)});
     app.post("/gallery/new", gallery.create);
     app.get("/gallery/retrieve", gallery.getGalleries);
+    app.get("/gallery/json/:id", gallery.getGallery);
+    app.get("/gallery/:id", (req, res)=>{res.sendFile(`${views}/gallery/index.html`)});
 
     //LEARN
     app.get("/learn/style", (req, res)=>{res.sendFile(`${views}/learn/index.css`)});

+ 90 - 0
views/gallery/index.css

@@ -0,0 +1,90 @@
+*{margin:0;padding:0;}
+
+body{
+    background: rgb(196, 198, 192);
+}
+
+h1{
+    margin: 25px 0;
+    text-align: center;
+    border-bottom: 2px solid black;
+}
+
+#tags{
+    display: flex;
+    justify-content: center;
+    width: 75%;
+    margin: auto;
+}
+
+    #tags > *{
+        background: #152730;
+        color: #5FECE0;
+        border-radius: 25px;
+        padding: 2px 10px;
+        margin: 0 5px;
+    }
+
+#images{
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: space-around;
+    width: 100%;
+}
+
+    #images img{
+        max-height: 250px;
+        margin: 25px;
+        cursor: pointer;
+        box-shadow: 0 0 5px black;
+    }
+
+        #images img:hover{
+            box-shadow: 0 0 10px black;
+        }
+
+#fullPage{
+    position: fixed;
+    top: 0;
+    left: 0;
+    justify-content: center;
+    align-items: center;
+    height: 100vh;
+    width: 100vw;
+    background: rgba(0, 0, 0, 0.85);
+    z-index: 1;
+}
+
+    #fullPage img{
+        max-height: 90%;
+        max-width: 90%;
+        cursor: default;
+        box-shadow: none;
+    }
+
+    #fullPage svg{
+        position: absolute;
+        color: white;
+        cursor: pointer;
+        border-radius: 50%;
+        padding: 5px;
+        z-index: 2;
+    }
+
+        #fullPage svg:hover{
+            background: white;
+            color: black;
+        }
+
+    #closeImg{
+        top: 25px;
+        right: 25px;
+    }
+
+    #nextImg{
+        right: 50px;
+    }
+
+    #previousImg{
+        left: 50px;
+    }

+ 97 - 0
views/gallery/index.html

@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<html lang="en">
+    <head>
+        <meta charset="utf-8">
+        <title>Lee Morgan -gallery-</title>
+        <link rel="stylesheet" href="/gallery/style">
+    </head>
+    <body>
+        <h1 id="title"></h1>
+
+        <div id="tags"></div>
+
+        <div id="images"></div>
+
+        <div id="fullPage" style="display:none">
+            <svg id="closeImg" width="50" height="50" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round">
+                <line x1="18" y1="6" x2="6" y2="18"></line>
+                <line x1="6" y1="6" x2="18" y2="18"></line>
+            </svg>
+
+            <svg id="nextImg" width="50" height="50" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round">
+                <line x1="5" y1="12" x2="19" y2="12"></line>
+                <polyline points="12 5 19 12 12 19"></polyline>
+            </svg>
+
+            <svg id="previousImg" width="50" height="50" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round">
+                <line x1="19" y1="12" x2="5" y2="12"></line>
+                <polyline points="12 19 5 12 12 5"></polyline>
+            </svg>
+        </div>
+
+        <script>
+            let id = window.location.pathname.split("/");
+            id = id[id.length-1];
+            window.imageIndex = 0;
+            let fullPage = document.getElementById("fullPage");
+            let container = document.getElementById("images");
+
+            fetch(`/gallery/json/${id}`)
+                .then(response => response.json())
+                .then((response)=>{
+                    document.getElementById("title").innerText = response.title;
+                    let tags = document.getElementById("tags");
+
+                    for(let i = 0; i < response.tags.length; i++){
+                        let tag = document.createElement("p");
+                        tag.innerText = response.tags[i];
+                        tag.classList.add("tag");
+                        tags.appendChild(tag);
+                    }
+
+                    for(let i = 0; i < response.images.length; i++){
+                        let img = document.createElement("img");
+                        img.src = response.images[i];
+                        img.alt = "Missing image";
+                        img.onclick = ()=>{
+                            imageIndex = i;
+
+                            let newImg = img.cloneNode(true);
+                            fullPage.appendChild(newImg);
+                            fullPage.style.display = "flex";
+                            newImg.onclick = ()=>{event.stopPropagation()};
+                        }
+                        container.appendChild(img);
+                    }
+                })
+                .catch((err)=>{});
+
+            document.getElementById("fullPage").onclick = ()=>{
+                fullPage.removeChild(document.querySelector("#fullPage img"));
+                fullPage.style.display = "none";
+            };
+
+            document.getElementById("nextImg").onclick = ()=>{
+                event.stopPropagation();
+                if(imageIndex >= container.children.length - 1) return;
+                imageIndex++;
+                let newImg = container.children[imageIndex].cloneNode(true);
+                newImg.onclick = ()=>{event.stopPropagation()};
+
+                fullPage.removeChild(document.querySelector("#fullPage img"));
+                fullPage.appendChild(newImg);
+            }
+
+            document.getElementById("previousImg").onclick = ()=>{
+                event.stopPropagation();
+                if(imageIndex <= 0) return;
+                imageIndex--;
+                let newImg = container.children[imageIndex].cloneNode(true);
+                newImg.onclick = ()=>{event.stopPropagation()};
+
+                fullPage.removeChild(document.querySelector("#fullPage img"));
+                fullPage.appendChild(newImg);
+            }
+        </script>
+    </body>
+</html>