diff --git a/app.js b/app.js index 5e6c58cfad9bdcaf6b13f1ddafda52d07f82e205..a4becbf518cc2c6fa9fa6dac653d12d3bf685541 100644 --- a/app.js +++ b/app.js @@ -5,6 +5,10 @@ const bodyParser = require('body-parser'); app.use(bodyParser.urlencoded()); app.use(bodyParser.json()); +app.set('view engine', 'ejs'); + +app.use(express.static('public')); + app.use((req, res, next) => { res.error = []; res.tpl = {}; diff --git a/package-lock.json b/package-lock.json index d2c865bd86bed7a32739a71a93be6cd1d9ea7379..8799c66703739554d68b1b1d02b5c6f9745af958 100644 --- a/package-lock.json +++ b/package-lock.json @@ -83,6 +83,11 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "ejs": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", + "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=" + }, "encodeurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", diff --git a/package.json b/package.json index bf33f154ac8a364147e09171777c3a6ac25e5abb..e0961f65b8d38b5250f0d75359fd31c38a05eccc 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "homepage": "https://szakitom.github.io/node_homework/", "dependencies": { "body-parser": "^1.18.2", + "ejs": "^2.5.7", "express": "^4.16.0" } } diff --git a/views/episode.ejs b/views/episode.ejs new file mode 100644 index 0000000000000000000000000000000000000000..da525cd9de072ba659fd646cc90c985656ef913f --- /dev/null +++ b/views/episode.ejs @@ -0,0 +1,33 @@ +<%- include('header') %> + + <%- include('menu', { title: episode.title }) %> + <div class="ui padded text container"> + <div class="ui form"> + <div class="inline field"> + <label>Rating</label> + <div class="ui rating" data-rating="<%= episode.rating %>" max-rating="5"></div> + </div> + <div class="inline fields"> + <div class="field"> + <label>Seen?</label> + </div> + <div class="inline field"> + <div class="ui toggle checkbox <% episode.seen ? checked : '' %>"> + <input type="checkbox" checked="<% episode.seen %>" class="hidden"> + <label></label> + </div> + </div> + </div> + </div> + </div> +<script> + $('.rating') + .rating({ + initialRating: 2, + maxRating: 5 + }); + $('.checkbox') + .checkbox('attach events', '.toggle.button'); +</script> + +<%- include('footer') %> diff --git a/views/episodeEdit.ejs b/views/episodeEdit.ejs new file mode 100644 index 0000000000000000000000000000000000000000..f7ddd310b73b9c1930a147964fce798b1e23a3fa --- /dev/null +++ b/views/episodeEdit.ejs @@ -0,0 +1,38 @@ +<%- include('header') %> + + <%- include('menu', { title: episode.title }) %> + <div class="ui padded text container"> + <div class="ui form"> + <div class="inline field"> + <label>Rating</label> + <div class="ui rating" data-rating="<%= episode.rating %>" max-rating="5"></div> + </div> + <div class="inline fields"> + <div class="field"> + <label>Seen?</label> + </div> + <div class="inline field"> + <div class="ui toggle checkbox <% episode.seen ? checked : '' %>"> + <input type="checkbox" checked="<% episode.seen %>" class="hidden"> + <label></label> + </div> + </div> + </div> + <div class="ui buttons right floated"> + <button class="ui negative button submit">Delete</button> + <div class="or"></div> + <button class="ui positive button submit">Save</button> + </div> + </div> + </div> +<script> + $('.rating') + .rating({ + initialRating: 2, + maxRating: 5 + }); + $('.checkbox') + .checkbox('attach events', '.toggle.button'); +</script> + +<%- include('footer') %> diff --git a/views/footer.ejs b/views/footer.ejs new file mode 100644 index 0000000000000000000000000000000000000000..15b90110a000585213e88fccf3e466de2b773b63 --- /dev/null +++ b/views/footer.ejs @@ -0,0 +1,3 @@ +</body> + +</html> diff --git a/views/header.ejs b/views/header.ejs new file mode 100644 index 0000000000000000000000000000000000000000..780b5b109a0cff67a0dc9507d135596054b1a0df --- /dev/null +++ b/views/header.ejs @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html> + +<head> + <meta charset="utf-8"> + <title>Series</title> + <script src="/js/jquery-3.2.1.min.js"></script> + <link rel="stylesheet" href="/semantic/semantic.min.css"> + <script src="/semantic/semantic.min.js"></script> + <meta name="viewport" content="width=device-width, initial-scale=1"> +</head> + +<body> diff --git a/views/menu.ejs b/views/menu.ejs new file mode 100644 index 0000000000000000000000000000000000000000..e931124c732fe12008ddbda3e0e65188cfd85480 --- /dev/null +++ b/views/menu.ejs @@ -0,0 +1,7 @@ +<div class="ui item menu"> + <% if (title === undefined) { %> + <a class="item active" href="">Back</a> + <% } else { %> + <a class="item active" href=""><%= title %></a> + <% } %> +</div> diff --git a/views/serie.ejs b/views/serie.ejs new file mode 100644 index 0000000000000000000000000000000000000000..b0446dc55d8a300efd645e2a3713aecdb82d7b0a --- /dev/null +++ b/views/serie.ejs @@ -0,0 +1,56 @@ +<%- include('header') %> + + <%- include('menu', { title: serie.title }) %> + + <div class="ui padded text container"> + <div class="ui progress success active" data-percent="<%= serie.progress %>"> + <div class="bar" style="width: <%= serie.progress %>%;"> + <div class="progress"><%= serie.progress %>%</div> + </div> + </div> + <div class="ui segment"> + <img class="ui small left floated image" src="<%= serie.image %>"> + <p> + <%= serie.description %> + </p> + + <div class="three column doubling ui grid"> + <% serie.episodes.forEach(episode => { %> + + <div class="column"> + <div class="ui card"> + <div class="content"> + <div class="right floated meta"><i class="eye icon"></i></div> + <div class="header"> + <a href="/series/<%= serie.id %>/episode/<%= episode.id %>"> + <%= episode.title %> + </a> + </div> + <div class="description"> + <% stars.forEach(star => { + <% if (star.isFull) { %> + <i class="star icon"></i> + <% } else { %> + <i class="empty star icon"></i> + <% } %> + <% }) %> + </div> + </div> + <div class="extra content"> + <a href="/series/<%= serie.id %>/episode/<%= episode.id %>/edit"><i class="pencil icon"></i> Edit</a> + </div> + </div> + </div> + + <% }) %> + </div> + </div> + </div> + + <div style="bottom: 10px;position:fixed;right:20px;z-index:1000;"> + <button onclick="document.location='/series/<%= serie.id %>/episode/new'" class="circular ui icon button blue"> + <i class="icon plus"></i> + </button> + </div> + +<%- include('footer') %> diff --git a/views/serieEdit.ejs b/views/serieEdit.ejs new file mode 100644 index 0000000000000000000000000000000000000000..e16da4734a47356f4b905fa26dab519a84a52905 --- /dev/null +++ b/views/serieEdit.ejs @@ -0,0 +1,41 @@ +<%- include('header') %> + + <%- include('menu', { title: serie.title }) %> + <div class="ui padded text container"> + <div class="ui form"> + <div class="inline fields"> + <div class="sixteen wide field"> + <label>Title</label> + <% if (serie.title !== undefined) { %> + <input type="text" placeholder="<%= serie.title %>"> + <% } else { %> + <input type="text" placeholder="Title"> + <% } %> + </div> + </div> + <div class="inline field"> + <label>Cover image</label> + <% if (serie.image !== undefined) { %> + <img class="ui medium centered image" src="<%= serie.image %>"> + <% } else { %> + <img class="ui medium centered image" src="/images/placeholder.png"> + <% } %> + </div> + <div class="inline fields"> + <div class="sixteen wide field"> + <label>Description</label> + <textarea rows="2"> + <% if (serie.description !== undefined) { %> + <%= serie.description %> + <% } %> + </textarea> + </div> + </div> + <div class="ui buttons right floated"> + <button class="ui negative button submit">Delete</button> + <div class="or"></div> + <button class="ui positive button submit">Save</button> + </div> + </div> + </div> + <%- include('footer') %> diff --git a/views/series.ejs b/views/series.ejs new file mode 100644 index 0000000000000000000000000000000000000000..29cf9c297260b2909d64feedecd740d4f0dad4a1 --- /dev/null +++ b/views/series.ejs @@ -0,0 +1,41 @@ +<%- include('header') %> + + <%- include('menu', { title: 'Series Tracker' }) %> + + <div class="five column doubling padded ui grid"> + <% series.forEach(serie => { %> + <div class="column"> + <div class="ui card"> + <a class="image" href="/series/<%= serie.id %>"> + <div class="ui slide masked reveal image"> + <img src="<% serie.image %>" class="visible content"> + </div> + </a> + <div class="content"> + <a class="header" href="/series/<%= serie.id %>"><%= serie.title %></a> + <div class="meta"> + <span class="date">Added on <% serie._createdAt %></span> + </div> + </div> + <div class="extra content"> + <div class="ui progress success active" data-percent="<%= serie.progress %>"> + <div class="bar" style="width: <%= serie.progress %>%;"></div> + </div> + </div> + <a href="/series/<%= serie.id %>/edit"> + <div class="ui bottom attached button"> + <i class="pencil icon"></i> Edit + </div> + </a> + </div> + </div> + <% }) %> + </div> + + <div style="bottom: 10px;position:fixed;right:20px;z-index:1000;"> + <button onclick="document.location='/series/new'" class="circular ui icon button blue"> + <i class="icon plus"></i> + </button> + </div> + +<%- include('footer') %>