summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThanos Apollo <public@thanosapollo.org>2026-04-25 16:41:41 +0300
committerThanos Apollo <public@thanosapollo.org>2026-04-25 16:41:41 +0300
commite20c0895c0e6b53a8a8d3d8d10ed60c1ab941bdf (patch)
tree5f2477f9d0bfd5590223db1a649427f79e5cda3f
parentbab0e422a1af142106d89ed84bb11fa94f83bf22 (diff)
view: Add delete at point (D) for comments and issues
-rw-r--r--lisp/forgejo-issue.el1
-rw-r--r--lisp/forgejo-pull.el1
-rw-r--r--lisp/forgejo-transient.el7
-rw-r--r--lisp/forgejo-view.el34
4 files changed, 41 insertions, 2 deletions
diff --git a/lisp/forgejo-issue.el b/lisp/forgejo-issue.el
index 90ec527..aee7e32 100644
--- a/lisp/forgejo-issue.el
+++ b/lisp/forgejo-issue.el
@@ -308,6 +308,7 @@ Empty input clears all filters."
(define-key map (kbd "L") #'forgejo-view-add-label)
(define-key map (kbd "A") #'forgejo-view-add-assignee)
(define-key map (kbd "M") #'forgejo-view-set-milestone)
+ (define-key map (kbd "D") #'forgejo-view-delete-at-point)
(define-key map (kbd "h") #'forgejo-issue-actions)
(define-key map (kbd "n") #'ewoc-goto-next)
(define-key map (kbd "p") #'ewoc-goto-prev)
diff --git a/lisp/forgejo-pull.el b/lisp/forgejo-pull.el
index 01f40f1..a18eaf8 100644
--- a/lisp/forgejo-pull.el
+++ b/lisp/forgejo-pull.el
@@ -275,6 +275,7 @@ Shows cached data immediately, then syncs from the API in the background."
(define-key map (kbd "L") #'forgejo-view-add-label)
(define-key map (kbd "A") #'forgejo-view-add-assignee)
(define-key map (kbd "M") #'forgejo-view-set-milestone)
+ (define-key map (kbd "D") #'forgejo-view-delete-at-point)
(define-key map (kbd "h") #'forgejo-pull-actions)
(define-key map (kbd "n") #'ewoc-goto-next)
(define-key map (kbd "p") #'ewoc-goto-prev)
diff --git a/lisp/forgejo-transient.el b/lisp/forgejo-transient.el
index 0acecad..088e0f3 100644
--- a/lisp/forgejo-transient.el
+++ b/lisp/forgejo-transient.el
@@ -115,6 +115,7 @@
(declare-function forgejo-view-add-assignee "forgejo-view.el" ())
(declare-function forgejo-view-remove-assignee "forgejo-view.el" ())
(declare-function forgejo-view-set-milestone "forgejo-view.el" ())
+(declare-function forgejo-view-delete-at-point "forgejo-view.el" ())
;;; Issue detail actions
@@ -142,7 +143,8 @@
("c" "Comment" forgejo-view-comment)
("r" "Reply at point" forgejo-issue-reply)
("e" "Edit at point" forgejo-view-edit)
- ("x" "Toggle open/close" forgejo-view-toggle-state)]
+ ("x" "Toggle open/close" forgejo-view-toggle-state)
+ ("D" "Delete at point" forgejo-view-delete-at-point)]
["Metadata"
("a" "Add metadata" forgejo-issue-add-metadata)
("d" "Remove metadata" forgejo-issue-remove-metadata)]
@@ -180,7 +182,8 @@
("r" "Reply at point" forgejo-pull-reply)
("e" "Edit at point" forgejo-view-edit)
("R" "Submit review" forgejo-review-submit)
- ("x" "Toggle open/close" forgejo-view-toggle-state)]
+ ("x" "Toggle open/close" forgejo-view-toggle-state)
+ ("D" "Delete at point" forgejo-view-delete-at-point)]
["Metadata"
("a" "Add metadata" forgejo-pull-add-metadata)
("d" "Remove metadata" forgejo-pull-remove-metadata)]
diff --git a/lisp/forgejo-view.el b/lisp/forgejo-view.el
index 562e05b..5123626 100644
--- a/lisp/forgejo-view.el
+++ b/lisp/forgejo-view.el
@@ -302,5 +302,39 @@ Restores point to RESTORE-LINE if given."
(funcall browse-fn forgejo-repo--host forgejo-repo--owner
forgejo-repo--name number))))
+;;; Delete
+
+(defun forgejo-view-delete-at-point ()
+ "Delete the item at point.
+On a comment, deletes the comment. On the header, deletes the issue/PR."
+ (interactive)
+ (when-let* ((node (forgejo-view--node-at-point))
+ (type (plist-get node :type)))
+ (pcase type
+ ('comment
+ (forgejo-view--delete
+ (format "repos/%s/%s/issues/comments/%d"
+ forgejo-repo--owner forgejo-repo--name (plist-get node :id))
+ (format "comment %d" (plist-get node :id))
+ (forgejo--post-action-callback)))
+ ('header
+ (forgejo-view--delete
+ (format "repos/%s/%s/issues/%d"
+ forgejo-repo--owner forgejo-repo--name
+ (alist-get 'number forgejo-view--data))
+ (format "%s/%s#%d" forgejo-repo--owner forgejo-repo--name
+ (alist-get 'number forgejo-view--data))
+ (lambda () (quit-window 'kill))))
+ (_ (user-error "No deletable item at point")))))
+
+(defun forgejo-view--delete (endpoint description callback)
+ "Delete ENDPOINT after confirming with DESCRIPTION. Call CALLBACK on success."
+ (when (y-or-n-p (format "Delete %s? " description))
+ (forgejo-api-delete
+ forgejo-repo--host endpoint nil
+ (lambda (_data _headers)
+ (message "Deleted %s" description)
+ (when callback (funcall callback))))))
+
(provide 'forgejo-view)
;;; forgejo-view.el ends here