From 318e95ec2ebea412ba6aa9a1803ddc09c18c6304 Mon Sep 17 00:00:00 2001 From: Akif9748 <akif9748@gmail.com> Date: Tue, 27 Sep 2022 21:34:13 +0300 Subject: [PATCH] Modal.js --- README.md | 2 ++ index.js | 2 +- public/css/thread.css | 14 ++++++-------- public/js/modal.js | 3 +++ routes/api/routes/messages.js | 2 +- routes/api/routes/users.js | 2 +- views/thread.ejs | 32 ++++++++++++-------------------- 7 files changed, 26 insertions(+), 31 deletions(-) create mode 100644 public/js/modal.js diff --git a/README.md b/README.md index 72ffbca..1232251 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,8 @@ Akf-forum has got an API for AJAX (fetch), other clients etc. And, you can learn - edit config from web admin panel. - user.state for ban, delete, etc. - Add a feature list to README.md +- delete admin??? +- MODALS'S CSS & JS ## Major Version History - V4: Caching - V3: New Theme diff --git a/index.js b/index.js index 86494bb..fcd42be 100644 --- a/index.js +++ b/index.js @@ -35,7 +35,7 @@ app.use(express.static("public"), express.json(), express.urlencoded({ extended: res.error = (type, error) => res.reply("error", { type, error }, type); - if (req.user && !req.user.approved && !req.url.startsWith("/auth/email")) return res.error(403, "Your account is not approved yet."); + if (req.user && !req.user.approved&& !req.user.admin && !req.url.startsWith("/auth/email")) return res.error(403, "Your account is not approved yet."); if (req.user?.deleted) { req.session.destroy(); diff --git a/public/css/thread.css b/public/css/thread.css index c27a5d4..753a4f7 100644 --- a/public/css/thread.css +++ b/public/css/thread.css @@ -86,10 +86,14 @@ display: none; } -.dots-menu.active { +.active { display: block; } +.no-display { + display: none; +} + .dots-menu a { display: block; margin: 8px; @@ -105,12 +109,6 @@ } -.send>textarea{ - font-family:inherit; - width: 100%; - margin: 10px; - border: 2px solid #e3e3e3; -} /* Media Query */ @media(max-width:980px) { @@ -170,7 +168,7 @@ width: 120px; } - .dots-menu.active { + .active { display: flex; } diff --git a/public/js/modal.js b/public/js/modal.js new file mode 100644 index 0000000..4ace875 --- /dev/null +++ b/public/js/modal.js @@ -0,0 +1,3 @@ +for (const modal of document.querySelectorAll("[modal]")) + modal.onclick = () => { + document.querySelector(modal.getAttribute("modal")).classList.toggle('active')}; \ No newline at end of file diff --git a/routes/api/routes/messages.js b/routes/api/routes/messages.js index 8c90043..192bb1f 100644 --- a/routes/api/routes/messages.js +++ b/routes/api/routes/messages.js @@ -39,7 +39,7 @@ app.patch("/:id/", async (req, res) => { const { message, user } = req; if (user.id !== message.authorID && !user.admin) return res.error(403, "You have not got permission for this."); - if (!Object.values(req.body).some(Boolean)) return res.error(400, "Missing message informations for update in request body."); + if (!Object.keys(req.body).some(Boolean)) return res.error(400, "Missing message informations for update in request body."); const { content, deleted } = req.body; const limits = req.app.get("limits"); diff --git a/routes/api/routes/users.js b/routes/api/routes/users.js index 8f686ed..0fcd2bf 100644 --- a/routes/api/routes/users.js +++ b/routes/api/routes/users.js @@ -36,7 +36,7 @@ app.patch("/:id", async (req, res) => { const { user, member } = req; if (req.user.id !== member.id && !user.admin) return res.error(403, "You have not got permission for this."); - if (!Object.values(req.body).some(Boolean)) return res.error(400, "Missing member informations in request body."); + if (!Object.keys(req.body).some(Boolean)) return res.error(400, "Missing member informations in request body."); const { name, about, theme, admin, deleted } = req.body; diff --git a/views/thread.ejs b/views/thread.ejs index 1bb41b8..7f40045 100644 --- a/views/thread.ejs +++ b/views/thread.ejs @@ -24,16 +24,16 @@ <div class="date"> <a style="color: var(--anti);" href="/users/<%= thread.author.id %>"><%= thread.author.name %></a> <%= "• "+(thread.edited ? "Edited" : "Not edited")%> </div> + </div> + <div style="text-align:center;padding:8px"> <% if ((user.id === thread.authorID || user.admin ) && thread.state !== "DELETED"){ %> - <a onclick="delete_thread('<%= thread.id %>')" class="btn-outline-primary">DELETE</a> <a onclick="edit_thread('<%= thread.id %>')" class="btn-outline-primary">EDIT</a> <% } else if (thread.state == "DELETED") { %> - <h3 style="display:inline;">This thread has been deleted</h3> + <h4 class="title" style="display:inline; font-size: 20px;">This thread has been deleted</h3> <a onclick="undelete_thread('<%= thread.id %>')" class="btn-primary">UNDELETE</a> - <% }; %> </div> @@ -44,7 +44,7 @@ <div class="message" id="message-<%= message.id %>"> <div class="left"> <img src="<%= message.author.avatar %>" /> - <div class="username"><a href="/users/<%=message.authorID %>"><%=message.author.name %></a></div> + <div class="username"><a href="/users/<%=message.author.id %>"><%=message.author.name %></a></div> <div class="date"> <%= new Date(message.time).toLocaleDateString() %> </div> @@ -57,7 +57,7 @@ <% if(user){ %> <% if(user.id === message.authorID || user.admin){ %> - <div class="dots" onclick="dots('<%=message.id %>')"> + <div class="dots" modal="#modal-<%=message.id %>"> <% if (message.deleted){ %> <i class='bx bx-trash bx-sm' id="deleted" style="color: var(--important);"></i> <% } %> @@ -67,7 +67,7 @@ <i class='bx bx-dots-horizontal-rounded'></i> </div> - <div class="dots-menu"> + <div class="dots-menu" id="modal-<%=message.id %>"> <% if (!message.deleted){ %> <a onclick="delete_message('<%=message.id %>');">Delete</a> <a onclick="edit_message('<%=message.id %>');">Edit</a> @@ -78,15 +78,11 @@ <% } %> <div class="reactions"> - <div <% if (message.react.like.includes(user?.id)) { %> - style="color: var(--main)" - <% } %> > + <div <% if (message.react.like.includes(user?.id)) { %> style="color: var(--main)" <% } %>> <i onclick='react("<%= message.id %>","like");' class='bx bx-like'></i> <div id="like"><%=message.react.like.length %></div> </div> - <div <% if (message.react.dislike.includes(user?.id)) { %> - style="color: var(--main)" - <% } %>> + <div <% if (message.react.dislike.includes(user?.id)) { %> style="color: var(--main)" <% } %>> <i onclick='react("<%= message.id %>","dislike");' class='bx bx-dislike'></i> <div id="dislike"><%=message.react.dislike.length %></div> </div> @@ -104,18 +100,14 @@ const content = message.querySelector(".content"); content.innerHTML = converter.makeHtml(content.rawText = content.innerHTML); } - - function dots(id) { - document.getElementById('message-' + id).querySelector(".dots-menu").classList.toggle('active') - } </script> - + <script src="/js/modal.js"></script> <% if (user){ %> <script type="module" src="/js/thread.js"></script> <div class="message" id="send-div"> - <form id="send" style="width:100%"> + <form id="send" style="width:100%"> <textarea rows="4" id="textarea"></textarea> <input name="page" type="hidden" value="<%= page %>"></input> <button class="btn-primary">Send!</button> @@ -131,7 +123,7 @@ delay: 1000, }, element: textarea, - spellChecker: false + spellChecker: false }); import request from "../../js/request.js"; @@ -143,7 +135,7 @@ threadID: "<%= thread.id %>", content: simplemde.value() }) - simplemde.clearAutosavedValue(); + simplemde.clearAutosavedValue(); let tp = Number("<%= thread.pages %>") let tm = Number("<%= thread.count %>") if (tp * 10 === tm) tp++;