changeset 16:bff178656073

delete function
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 06 Jul 2022 22:42:42 -0600
parents 0edde02b908c
children a602a5735a37
files src/delete.js.luan src/lib/Post.luan src/save_edit.js.luan src/site.css src/thread.html.luan
diffstat 5 files changed, 63 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/delete.js.luan	Wed Jul 06 22:42:42 2022 -0600
@@ -0,0 +1,22 @@
+local Luan = require "luan:Luan.luan"
+local error = Luan.error
+local Io = require "luan:Io.luan"
+local Http = require "luan:http/Http.luan"
+local Post = require "site:/lib/Post.luan"
+local Db = require "site:/lib/Db.luan"
+
+
+return function()
+	local post = Http.request.parameters.post or error()
+	Db.run_in_transaction( function()
+		post = Post.get_by_id(post) or error()
+		post.author_is_current() or error()
+		post.is_deleted = true
+		post.save()
+	end )
+	Io.stdout = Http.response.text_writer()
+%>
+let postDiv = document.querySelector('[post="<%=post.id%>"]');
+postDiv.querySelector('[output]').innerHTML = 'deleted';
+<%
+end
--- a/src/lib/Post.luan	Tue Jul 05 23:27:54 2022 -0600
+++ b/src/lib/Post.luan	Wed Jul 06 22:42:42 2022 -0600
@@ -19,6 +19,7 @@
 		date = doc.date
 		author_name = doc.post_author_name
 		root_id = doc.post_root_id
+		is_deleted = doc.is_deleted == "true"
 
 		-- root only
 		subject = doc.subject
@@ -37,6 +38,7 @@
 		date = post.date or time_now()
 		post_author_name = post.author_name or error()
 		post_root_id = post.root_id
+		is_deleted = post.is_deleted and "true" or nil
 
 		-- root only
 		subject = post.subject
@@ -83,6 +85,12 @@
 		end )
 	end
 
+	function post.author_is_current()
+		local User = require "site:/lib/User.luan"
+		local user = User.current()
+		return user ~= nil and user.name == post.author_name
+	end
+
 	set_metatable(post,metatable)
 	return post
 end
--- a/src/save_edit.js.luan	Tue Jul 05 23:27:54 2022 -0600
+++ b/src/save_edit.js.luan	Wed Jul 06 22:42:42 2022 -0600
@@ -10,7 +10,6 @@
 local bbcode_preprocess = Bbcode.preprocess or error()
 local bbcode_to_html = Bbcode.to_html or error()
 local Db = require "site:/lib/Db.luan"
-local User = require "site:/lib/User.luan"
 
 
 return function()
@@ -19,8 +18,7 @@
 	text = bbcode_preprocess(text)
 	Db.run_in_transaction( function()
 		post = Post.get_by_id(post) or error()
-		local user = User.current() or error()
-		user.name = post.author_name or error()
+		post.author_is_current() or error()
 		post.content = text
 		post.save()
 	end )
--- a/src/site.css	Tue Jul 05 23:27:54 2022 -0600
+++ b/src/site.css	Wed Jul 06 22:42:42 2022 -0600
@@ -27,3 +27,7 @@
 	margin-right: 3%;
 	margin-bottom: 2em;
 }
+
+[hidden] {
+	display: none;
+}
--- a/src/thread.html.luan	Tue Jul 05 23:27:54 2022 -0600
+++ b/src/thread.html.luan	Wed Jul 06 22:42:42 2022 -0600
@@ -13,13 +13,20 @@
 local Post = require "site:/lib/Post.luan"
 local Bbcode = require "site:/lib/Bbcode.luan"
 local bbcode_to_html = Bbcode.to_html or error()
+local User = require "site:/lib/User.luan"
 
 
+local function deletePost()
+	%><a href="javascript:" onclick="deletePost(parentNode)">delete</a><%
+end
+
 return function()
 	local root_id = Http.request.parameters.root or error()
 	local docs, total_hits = Db.search("post_root_id:"..root_id,1,1000,{sort="id"})
 	local posts = Post.from_docs(docs)
 	local subject_html = posts[1].subject_html
+	local user = User.current()
+	local user_name = user and user.name
 	Io.stdout = Http.response.text_writer()
 %>
 <!doctype html>
@@ -38,27 +45,44 @@
 				postDiv.querySelector('[output]').style.display = 'block';
 				postDiv.querySelector('[edit]').innerHTML = '';
 			}
-
 			function saveEdit(post) {
 				let postDiv = document.querySelector('[post="'+post+'"]');
 				let text = postDiv.querySelector('textarea').value;
 				let postData = 'post=' + post + '&text=' + encodeURIComponent(text);
 				ajax("save_edit.js",postData);
 			}
+
+			function deletePost(span) {
+				span.innerHTML = document.querySelector('[hidden][delete]').innerHTML;
+			}
+			function deleteNo(span) {
+				span.innerHTML = document.querySelector('[hidden][undelete]').innerHTML;
+			}
+			function deleteYes(span) {
+				let post = span.getAttribute('delete');
+				ajax( '/delete.js?post=' + post );
+			}
 		</script>
 	</head>
 	<body>
 <%		header() %>
 		<div content>
 			<h1><%=subject_html%></h1>
-<%	for _, post in ipairs(posts) do %>
+<%	for _, post in ipairs(posts) do
+		if post.is_deleted then
+			continue
+		end
+%>
 			<hr>
 			<div post="<%=post.id%>">
 				<div output>
 					<% bbcode_to_html(post.content) %>
 					<p>
 						<a href="/reply.html?parent=<%=post.id%>">reply</a>
+<%	if post.author_name == user_name then %>
 						- <a href="javascript:ajax('/edit.js?post=<%=post.id%>')">edit</a>
+						- <span delete="<%=post.id%>"><%deletePost()%></span>
+<%	end %>
 					</p>
 				</div>
 				<div edit></div>
@@ -66,6 +90,8 @@
 <%	end %>
 		</div>
 <%		footer() %>
+		<span hidden delete>Delete? <a href="javascript:" onclick="deleteYes(parentNode)">yes</a> / <a href="javascript:" onclick="deleteNo(parentNode)">no</a></span>
+		<span hidden undelete><%deletePost()%></span>
 	</body>
 </html>
 <%