From 06fa8ab5f32061ae1d06abbe1cc502883f3884da Mon Sep 17 00:00:00 2001
From: Jelle van der Waa <jelle@archlinux.org>
Date: Mon, 14 Jun 2021 22:13:07 +0200
Subject: [PATCH] Convert comment editing to vanilla JavaScript

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
---
 web/template/pkg_comments.php | 90 ++++++++++++++++++++++++-----------
 1 file changed, 62 insertions(+), 28 deletions(-)

diff --git a/web/template/pkg_comments.php b/web/template/pkg_comments.php
index 3bcf1a38c..ffa9e137c 100644
--- a/web/template/pkg_comments.php
+++ b/web/template/pkg_comments.php
@@ -169,37 +169,71 @@ if ($comment_section == "package") {
 </div>
 
 <script>
-$(document).ready(function() {
-	$('.edit-comment').click(function () {
-		var parent_element = this.parentElement,
-			parent_id = parent_element.id,
-			comment_id = parent_id.substr(parent_id.indexOf('-') + 1),
-			edit_form = $(parent_element).next(),
-			_this = $(this);
-		add_busy_indicator(_this);
-		$.getJSON('<?= get_uri('/rpc') ?>', {
-			type: 'get-comment-form',
-			arg: comment_id,
-			base_id: <?= intval($row["PackageBaseID"]) ?>,
-			pkgbase_name: <?= json_encode($pkgbase_name) ?>
-		}, function (data) {
-			remove_busy_indicator(_this);
-			if (data.success) {
-				edit_form.html(data.form);
-				edit_form.find('textarea').focus();
-			} else {
-				alert(data.error);
-			}
-		});
-		return false;
-	});
+function add_busy_indicator(sibling) {
+	const img = document.createElement('img');
+	img.src = "/images/ajax-loader.gif";
+	img.classList.add('ajax-loader');
+	img.style.height = 11;
+	img.style.width = 16;
+	img.alt = "Busy…";
+
+	sibling.insertAdjacentElement('afterend', img);
+}
 
-	function add_busy_indicator(sibling) {
-		sibling.after('<img src="/images/ajax-loader.gif" class="ajax-loader" width="16" height="11" alt="Busy…" />');
+function remove_busy_indicator(sibling) {
+	const elem = sibling.nextElementSibling;
+	elem.parentNode.removeChild(elem);
+}
+
+function getParentsUntil(elem, className) {
+	// Limit to 10 depth
+	for ( ; elem && elem !== document; elem = elem.parentNode) {
+		if (elem.matches(className)) {
+			break;
+		}
 	}
 
-	function remove_busy_indicator(sibling) {
-		sibling.next().remove();
+	return elem;
+}
+
+function handleEditCommentClick(event) {
+	event.preventDefault();
+	const parent_element = getParentsUntil(event.target, '.comment-header');
+	const parent_id = parent_element.id;
+	const comment_id = parent_id.substr(parent_id.indexOf('-') + 1);
+	// The div class="article-content" which contains the comment
+	const edit_form = parent_element.nextElementSibling;
+
+	const params = new URLSearchParams({
+		type: "get-comment-form",
+		arg: comment_id,
+		base_id: <?= intval($row["PackageBaseID"]) ?>,
+		pkgbase_name: <?= json_encode($pkgbase_name) ?>
+	});
+
+	const url = '<?= get_uri('/rpc') ?>' + '?' + params.toString();
+
+	add_busy_indicator(event.target);
+
+	fetch(url, {
+		method: 'GET'
+	})
+	.then(function(response) { return response.json(); })
+	.then(function(data) {
+		remove_busy_indicator(event.target);
+		if (data.success) {
+			edit_form.innerHTML = data.form;
+			edit_form.querySelector('textarea').focus();
+		} else {
+			alert(data.error);
+		}
+	});
+}
+
+document.addEventListener('DOMContentLoaded', function() {
+	const divs = document.querySelectorAll('.edit-comment');;
+	for (let div of divs) {
+		div.addEventListener('click', handleEditCommentClick);
 	}
 });
 </script>
-- 
GitLab