From e20c0895c0e6b53a8a8d3d8d10ed60c1ab941bdf Mon Sep 17 00:00:00 2001 From: Thanos Apollo Date: Sat, 25 Apr 2026 16:41:41 +0300 Subject: view: Add delete at point (D) for comments and issues --- lisp/forgejo-issue.el | 1 + lisp/forgejo-pull.el | 1 + lisp/forgejo-transient.el | 7 +++++-- lisp/forgejo-view.el | 34 ++++++++++++++++++++++++++++++++++ 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 -- cgit v1.0