Skip to content

Commit 5c2d7ff

Browse files
tanmayc07sahilambrerutu363
authored
🚀 Release 1.1 - Fix UI bugs and add tag feature (#70)
* Test commit for sahildev * test commit for rutudev * Initial test commit for tanmaydev * Test commit * 💩 add authentication * 🗃️ Add scripts for /create and /list of blogs * 🗃️ Add scripts for /update and /delete of blogs * ➕ Add body-parser dependency * added landing login reg pages * 💄 Add create view * 🚧 Add create and landing view and backend code * 💫 Add logo * Merge rutudev * 🎨 Structure blog routes * 🚚 Restructure auth routes #4 * 🚚 Restructure auth routes #4 * 🚚 Restructure auth routes #4 * 👽 Add auth middleware for every blog crud operation #6 * 🗃️ Resolve deprecation warning * ✅ correct auth middleware * 💄 Change in Register and login page #5 * 🗃️ Generalize database name #10 * 🐛 Login bug resolve * 💄 Add tui editor in create view #3 * 🔧 password validate * 💩 Add script for create blog * 🚧 validations * ✨ Update create blog script * 🚧 validations * 🍻 Done validations #15 #12 * ✨ Render Blog on seperate route * ✨ Implement back button #18 * 📱 Login view and validations * 🔥 Remove a temporary file * 🐛 Fix UI bugs #18 #21 * 🐛 Fix footer in log and reg #21 * commit * 💄 Connect landing to auth pages * 💄 Error message styling in auth pages #28 * ✨ Add partial views for blog cards #2 * 🐛 Fix route and changed file name #30 * ✨ Add explore page * Changes Logout #32 * ⚡ redirects * 💩 Connect user and blog * Connect user and blog schemas * Iss33 (#36) * 📝 Add cover image and badges #33 * 📝 Add steps to run locally #33 * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * ♻️ Remove typo * 🐛 Fix login and redirect page bug * ⚡ Secret in .env * ♻️ Remove comments and extra code #37 * 🗃️ Add author field in blogSchema * 💄 Add author name on card #42 * ♻️ Redirect to explore after login * ✨ Explore page patch * ✨ Add functionality to create button * ✅ myblogs #45 * 🔨 removes myblog test #45 * ✨ Frontend my blogs #50 * 💄 update ui for frontend myblogs #50 * ✨ Add edit and delete functionality to blogs * 👽 Integrate mailchimp * ⚡ adds 404 page * ✨ Add navbar dropdown and avatar #55 * ➕ Add migrate-mongo dependency * 📝 Update documentation * 🐛 Patch * ♻️ Refactor API to get latest blogs first * 🔒 Add DB_URI in env * 💄 Add Date in Cards UI * ✨ Fix footer in landing * 💄 Render tags on explore and myblogs * 💄 Add chips input in update and render blogs categorized by tags * 💄 Fix UI bugs in update view Co-authored-by: sahilambre <[email protected]> Co-authored-by: Rutu <[email protected]> Co-authored-by: Rutu <[email protected]> Co-authored-by: Sahil Ambre <[email protected]>
1 parent 4f9042b commit 5c2d7ff

File tree

13 files changed

+651
-371
lines changed

13 files changed

+651
-371
lines changed

controllers/blogcrud.controllers.js

+32-17
Original file line numberDiff line numberDiff line change
@@ -5,48 +5,63 @@ const userModel = require("../models/user/User");
55
module.exports = {
66
createForm: function (req, res) {
77
let user = {
8-
id: req.userid
9-
}
10-
res.render("create", {user:user});
8+
9+
id: req.userid,
10+
};
11+
res.render("create", { user: user });
1112
},
1213
createData: function (req, res) {
1314
const inputData = req.body;
1415
const userid = req.userid;
15-
userModel.getOneUser(userid, function(username){
16-
inputData.author = username
16+
userModel.getOneUser(userid, function (username) {
17+
inputData.author = username;
18+
1719
blogModel.createBlog(req, inputData, function (data) {
1820
userModel.updateBlog(req, data, function (data) {
1921
res.json(data);
2022
});
2123
});
22-
})
24+
25+
});
2326
},
2427
listMine: function (req, res) {
2528
const inputData = req.body;
26-
const userid = req.userid;
27-
userModel.getOneUser(userid, function(author){
28-
inputData.author = author
29-
blogModel.listMine(author,function (data) {
29+
const userid = req.userid;
30+
userModel.getOneUser(userid, function (author) {
31+
inputData.author = author;
32+
blogModel.listMine(author, function (data) {
3033
res.render("myBlogs", { data });
3134
});
32-
})
35+
});
36+
3337
},
3438
listAll: function (req, res) {
3539
blogModel.listAll(function (data) {
3640
res.render("explore", { data });
3741
});
3842
},
3943
listData: function (req, res) {
40-
const id = req.params.id
44+
const id = req.params.id;
45+
4146
blogModel.listBlog(id, function (data) {
4247
res.render("blog", { data });
4348
});
4449
},
45-
getUpdate: function(req, res){
46-
const id = req.params.id
47-
blogModel.listBlog(id, function(data){
48-
res.render("update", { data: JSON.stringify(data), blogid:req.params.id })
49-
})
50+
filterTags: function (req, res) {
51+
const tag = req.params.tag;
52+
blogModel.filterList(tag, function (data, tag) {
53+
res.render("tagBlogs", { data, tag });
54+
});
55+
},
56+
getUpdate: function (req, res) {
57+
const id = req.params.id;
58+
blogModel.listBlog(id, function (data) {
59+
res.render("update", {
60+
data: JSON.stringify(data),
61+
blogid: req.params.id,
62+
});
63+
});
64+
5065
},
5166
updateData: function (req, res) {
5267
var inputData = req.body;

models/blogapi/crud.js

+5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ var blogSchema = new mongoose.Schema({
55
author: { type: String, required: true, ref: "user" },
66
noOfLikes: { type: Number, required: false, default: 0 },
77
content: { type: String, required: true },
8+
tags: [{ type: String, required: true }],
89
createdAt: { type: Date, default: Date.now },
910
updatedAt: { type: Date, default: Date.now },
1011
});
@@ -35,6 +36,10 @@ module.exports = {
3536
data = await blogTable.findOne({ _id: id });
3637
return callback(data);
3738
},
39+
filterList: async function (tag, callback) {
40+
data = await blogTable.find({ tags: tag });
41+
return callback(data, tag);
42+
},
3843
updateBlog: function (inputData, blogID, callback) {
3944
blogData = blogTable.findByIdAndUpdate(blogID, inputData);
4045
blogData.exec(function (err, data) {

routes/blogs/blogRoutes.js

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ routes.route("/create").post(blogController.createData);
1010
routes.route("/explore").get(blogController.listAll);
1111
routes.route("/myblogs").get(blogController.listMine);
1212

13+
routes.route("/filter/:tag").get(blogController.filterTags);
1314
routes.route("/update/:id").get(blogController.getUpdate);
1415
routes.route("/update/:id").post(blogController.updateData);
1516
routes.route("/:id").delete(blogController.deleteData);

views/blog.ejs

+45-26
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,32 @@
2121
<title><%= data.title %></title>
2222
<link rel="icon" href="/img/book.svg" />
2323
<style>
24+
25+
::-moz-selection {
26+
/* Code for Firefox */
27+
color: white;
28+
background: rgb(173, 182, 255);
29+
}
30+
31+
::selection {
32+
color: white;
33+
background: rgb(173, 182, 255);
34+
}
35+
2436
#more {
25-
position: absolute;
26-
right: 15px;
27-
top: 7px;
28-
margin-top: 9px;
29-
}
37+
position: absolute;
38+
right: 15px;
39+
top: 7px;
40+
margin-top: 9px;
41+
}
42+
43+
ul.dropdown-content {
44+
width: 10% !important;
45+
}
3046
31-
ul.dropdown-content{
32-
width:10% !important;
33-
}
47+
code {
48+
color: rgb(169, 102, 245);
49+
}
3450
</style>
3551
</head>
3652

@@ -49,28 +65,31 @@
4965
</div>
5066
<ul class="right hide-on-med-and-down">
5167
<li>
52-
<!-- <a id="more" class="dropdown-trigger btn black" href="#" data-target="dropdown1" class="right-align"><i class="material-icons">more_vert</i></a> -->
53-
<a id="more" class="dropdown-trigger btn black" href="#" data-target="dropdown1" class="right-align"><img src="/img/avatars/21_avatar_outline.gif" alt="avataar" style="position: absolute; right: 15px; top: -7px; border-radius: 50%;" width="50px"></a>
54-
55-
56-
<!-- Dropdown Structure -->
57-
<ul id='dropdown1' class='dropdown-content'>
58-
<li><a href="/blogs/create">Write Blogs</a></li>
59-
<li><a href="/blogs/myBlogs">My Blogs</a></li>
60-
<li><a href="/blogs/explore">Explore</a></li>
61-
<li class="divider" tabindex="-1"></li>
62-
<li><a href="/auth/logout">Logout</a></li>
63-
</ul>
68+
<!-- <a id="more" class="dropdown-trigger btn black" href="#" data-target="dropdown1" class="right-align"><i class="material-icons">more_vert</i></a> -->
69+
<a id="more" class="dropdown-trigger btn black" href="#" data-target="dropdown1"
70+
class="right-align"><img src="/img/avatars/21_avatar_outline.gif" alt="avataar"
71+
style="position: absolute; right: 15px; top: -7px; border-radius: 50%;" width="50px"></a>
72+
73+
74+
<!-- Dropdown Structure -->
75+
<ul id='dropdown1' class='dropdown-content'>
76+
<li><a href="/blogs/create">Write Blogs</a></li>
77+
<li><a href="/blogs/myBlogs">My Blogs</a></li>
78+
<li><a href="/blogs/explore">Explore</a></li>
79+
<li class="divider" tabindex="-1"></li>
80+
<li><a href="/auth/logout">Logout</a></li>
81+
</ul>
6482
</li>
65-
</ul>
83+
</ul>
6684
</nav>
6785
<ul class="sidenav" id="mobile-links">
6886
<li><a href="/blogs/create">Write Blog</a></li>
6987
<li><a href="/blogs/myBlogs">My Blogs</a></li>
7088
<li><a href="/blogs/explore">Explore</a></li>
7189
<li class="divider" tabindex="-1"></li>
7290
<li><a href="#">Logout</a></li>
73-
</ul>
91+
</ul>
92+
7493
</header>
7594
<div class="container">
7695
<h1><%= data.title %></h1>
@@ -83,10 +102,10 @@
83102
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
84103
<script>
85104
$(document).ready(function () {
86-
$('.dropdown-trigger').dropdown();
87-
$(".sidenav").sidenav();
88-
});
89-
</script>
105+
$('.dropdown-trigger').dropdown();
106+
$(".sidenav").sidenav();
107+
});
108+
</script>
90109
</body>
91110

92111
</html>

views/create.ejs

+40-21
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@
2121
<link rel="icon" href="/img/book.svg" />
2222
<style>
2323
#more {
24-
position: absolute;
25-
right: 15px;
24+
position: absolute;
25+
right: 15px;
2626
top: 7px;
2727
margin-top: 9px;
2828
}
2929
30-
ul.dropdown-content{
31-
width:10% !important;
30+
ul.dropdown-content {
31+
width: 10% !important;
3232
}
3333
</style>
3434
</head>
@@ -43,7 +43,8 @@
4343
</li>
4444
</ul>
4545
<div class="container">
46-
<a href="/blogs/explore" class="brand-logo left-align" style="font-family: 'Dancing Script', cursive">Write.it</a>
46+
<a href="/blogs/explore" class="brand-logo left-align"
47+
style="font-family: 'Dancing Script', cursive">Write.it</a>
4748
<a href="#" class="sidenav-trigger right" data-target="mobile-links">
4849
<i class="material-icons">menu</i>
4950
</a>
@@ -57,18 +58,20 @@
5758
</ul>
5859
<ul class="right hide-on-med-and-down">
5960
<li>
60-
<!-- <a id="more" class="dropdown-trigger btn black" href="#" data-target="dropdown1" class="right-align"><i class="material-icons">more_vert</i></a> -->
61-
<a id="more" class="dropdown-trigger btn black" href="#" data-target="dropdown1" class="right-align"><img src="/img/avatars/21_avatar_outline.gif" alt="avataar" style="position: absolute; right: 15px; top: -7px; border-radius: 50%;" width="50px"></a>
62-
63-
64-
<!-- Dropdown Structure -->
65-
<ul id='dropdown1' class='dropdown-content'>
66-
<!-- <li><a href="/blogs/create">Write Blogs</a></li> -->
67-
<li><a href="/blogs/myBlogs">My Blogs</a></li>
68-
<li><a href="/blogs/explore">Explore</a></li>
69-
<li class="divider" tabindex="-1"></li>
70-
<li><a href="/auth/logout">Logout</a></li>
71-
</ul>
61+
<!-- <a id="more" class="dropdown-trigger btn black" href="#" data-target="dropdown1" class="right-align"><i class="material-icons">more_vert</i></a> -->
62+
<a id="more" class="dropdown-trigger btn black" href="#" data-target="dropdown1" class="right-align"><img
63+
src="/img/avatars/21_avatar_outline.gif" alt="avataar"
64+
style="position: absolute; right: 15px; top: -7px; border-radius: 50%;" width="50px"></a>
65+
66+
67+
<!-- Dropdown Structure -->
68+
<ul id='dropdown1' class='dropdown-content'>
69+
<!-- <li><a href="/blogs/create">Write Blogs</a></li> -->
70+
<li><a href="/blogs/myBlogs">My Blogs</a></li>
71+
<li><a href="/blogs/explore">Explore</a></li>
72+
<li class="divider" tabindex="-1"></li>
73+
<li><a href="/auth/logout">Logout</a></li>
74+
</ul>
7275
</li>
7376
</ul>
7477
</div>
@@ -88,6 +91,8 @@
8891
<div class="input-field">
8992
<input id="title-inp" type="text" name="title" />
9093
<label for="title-inp">Title</label>
94+
<div class="chips chips-placeholder"></div>
95+
9196
</div>
9297
<div id="editor"></div>
9398
</form>
@@ -104,15 +109,23 @@
104109
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
105110
<script src="https://uicdn.toast.com/editor/latest/toastui-editor-all.min.js"></script>
106111
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
107-
<!-- Compiled and minified JavaScript -->
108-
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
112+
<!-- Compiled and minified JavaScript -->
113+
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
109114
<script>
110115
$(document).ready(function () {
111116
$('.dropdown-trigger').dropdown();
112117
$(".sidenav").sidenav();
113-
});
118+
});
114119
</script>
115120
<script>
121+
122+
$('.chips-placeholder').chips({
123+
placeholder: 'Enter a tag',
124+
secondaryPlaceholder: '+Tag',
125+
limit: Infinity,
126+
minLength: 1
127+
});
128+
116129
const Editor = toastui.Editor;
117130
118131
const editor = new Editor({
@@ -124,11 +137,17 @@
124137
125138
function getEditorValue() {
126139
var title = document.getElementById("title-inp").value;
140+
let chipdata = M.Chips.getInstance($('.chips')).chipsData
141+
let chipArray = []
142+
for (let i = 0; i < chipdata.length; i++) {
143+
chipArray.push(chipdata[i].tag.toLowerCase())
144+
}
127145
var content = editor.getHtml();
128146
const url = "/blogs/create"
129147
const data = {
130148
title: title,
131-
content: content
149+
content: content,
150+
tags: chipArray
132151
}
133152
var stringified = JSON.stringify(data);
134153
const otherparams = {

0 commit comments

Comments
 (0)