mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	#1601 support delete issue comment
This commit is contained in:
		
							
								
								
									
										4
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								Makefile
									
									
									
									
									
								
							@@ -24,6 +24,10 @@ govet:
 | 
			
		||||
	go tool vet -composites=false -methods=false -structtags=false .
 | 
			
		||||
 | 
			
		||||
build-dev: $(GENERATED) govet
 | 
			
		||||
	go install $(BUILD_FLAGS) -tags '$(TAGS)'
 | 
			
		||||
	cp '$(GOPATH)/bin/gogs' .
 | 
			
		||||
 | 
			
		||||
build-dev-race: $(GENERATED) govet
 | 
			
		||||
	go install $(BUILD_FLAGS) -race -tags '$(TAGS)'
 | 
			
		||||
	cp '$(GOPATH)/bin/gogs' .
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ Gogs - Go Git Service [
 | 
			
		||||
 | 
			
		||||
##### Current tip version: 0.9.54 (see [Releases](https://github.com/gogits/gogs/releases) for binary versions)
 | 
			
		||||
##### Current tip version: 0.9.55 (see [Releases](https://github.com/gogits/gogs/releases) for binary versions)
 | 
			
		||||
 | 
			
		||||
| Web | UI  | Preview  |
 | 
			
		||||
|:-------------:|:-------:|:-------:|
 | 
			
		||||
 
 | 
			
		||||
@@ -464,7 +464,10 @@ func runWeb(ctx *cli.Context) error {
 | 
			
		||||
				m.Post("/content", repo.UpdateIssueContent)
 | 
			
		||||
			})
 | 
			
		||||
		})
 | 
			
		||||
		m.Post("/comments/:id", repo.UpdateCommentContent)
 | 
			
		||||
		m.Group("/comments/:id", func() {
 | 
			
		||||
			m.Post("", repo.UpdateCommentContent)
 | 
			
		||||
			m.Post("/delete", repo.DeleteComment)
 | 
			
		||||
		})
 | 
			
		||||
		m.Group("/labels", func() {
 | 
			
		||||
			m.Post("/new", bindIgnErr(auth.CreateLabelForm{}), repo.NewLabel)
 | 
			
		||||
			m.Post("/edit", bindIgnErr(auth.CreateLabelForm{}), repo.UpdateLabel)
 | 
			
		||||
 
 | 
			
		||||
@@ -466,7 +466,8 @@ issues.next = Next
 | 
			
		||||
issues.open_title = Open
 | 
			
		||||
issues.closed_title = Closed
 | 
			
		||||
issues.num_comments = %d comments
 | 
			
		||||
issues.commented_at = `commented <a id="%[1]s" href="#%[1]s">%[2]s</a>`
 | 
			
		||||
issues.commented_at = `commented <a href="#%s">%s</a>`
 | 
			
		||||
issues.delete_comment_confirm = Are you sure you want to delete this comment?
 | 
			
		||||
issues.no_content = There is no content yet.
 | 
			
		||||
issues.close_issue = Close
 | 
			
		||||
issues.close_comment_issue = Comment and close
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								gogs.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								gogs.go
									
									
									
									
									
								
							@@ -17,7 +17,7 @@ import (
 | 
			
		||||
	"github.com/gogits/gogs/modules/setting"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const APP_VER = "0.9.54.0724"
 | 
			
		||||
const APP_VER = "0.9.55.0726"
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	runtime.GOMAXPROCS(runtime.NumCPU())
 | 
			
		||||
 
 | 
			
		||||
@@ -345,3 +345,29 @@ func UpdateComment(c *Comment) error {
 | 
			
		||||
	_, err := x.Id(c.ID).AllCols().Update(c)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeleteCommentByID deletes a comment by given ID.
 | 
			
		||||
func DeleteCommentByID(id int64) error {
 | 
			
		||||
	comment, err := GetCommentByID(id)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sess := x.NewSession()
 | 
			
		||||
	defer sessionRelease(sess)
 | 
			
		||||
	if err = sess.Begin(); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if _, err = sess.Id(comment.ID).Delete(new(Comment)); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if comment.Type == COMMENT_TYPE_COMMENT {
 | 
			
		||||
		if _, err = sess.Exec("UPDATE `issue` SET num_comments = num_comments - 1 WHERE id = ?", comment.IssueID); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return sess.Commit()
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -105,6 +105,19 @@ func (ctx *Context) Handle(status int, title string, err error) {
 | 
			
		||||
	ctx.HTML(status, base.TplName(fmt.Sprintf("status/%d", status)))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HandleError use error check function to determine if server should
 | 
			
		||||
// response as client input error or server internal error.
 | 
			
		||||
// It responses with given status code for client error,
 | 
			
		||||
// or error context description for logging purpose of server error.
 | 
			
		||||
func (ctx *Context) HandleError(title string, errck func(error) bool, err error, status int) {
 | 
			
		||||
	if errck(err) {
 | 
			
		||||
		ctx.Error(status, err.Error())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ctx.Handle(500, title, err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ctx *Context) HandleText(status int, title string) {
 | 
			
		||||
	if (status/100 == 4) || (status/100 == 5) {
 | 
			
		||||
		log.Error(4, "%s", title)
 | 
			
		||||
 
 | 
			
		||||
@@ -1452,7 +1452,10 @@ footer .ui.language .menu {
 | 
			
		||||
.repository.view.issue .comment-list .comment .actions .item {
 | 
			
		||||
  float: left;
 | 
			
		||||
}
 | 
			
		||||
.repository.view.issue .comment-list .comment .actions a.item {
 | 
			
		||||
.repository.view.issue .comment-list .comment .actions .item.tag {
 | 
			
		||||
  margin-right: 5px;
 | 
			
		||||
}
 | 
			
		||||
.repository.view.issue .comment-list .comment .actions .item.action {
 | 
			
		||||
  margin-top: 6px;
 | 
			
		||||
  margin-left: 10px;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -342,7 +342,7 @@ function initRepository() {
 | 
			
		||||
 | 
			
		||||
        // Edit issue or comment content
 | 
			
		||||
        $('.edit-content').click(function () {
 | 
			
		||||
            var $segment = $(this).parent().parent().next();
 | 
			
		||||
            var $segment = $(this).parent().parent().parent().next();
 | 
			
		||||
            var $edit_content_zone = $segment.find('.edit-content-zone');
 | 
			
		||||
            var $render_content = $segment.find('.render-content');
 | 
			
		||||
            var $raw_content = $segment.find('.raw-content');
 | 
			
		||||
@@ -404,6 +404,19 @@ function initRepository() {
 | 
			
		||||
            return false;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Delete comment
 | 
			
		||||
        $('.delete-comment').click(function () {
 | 
			
		||||
            var $this = $(this);
 | 
			
		||||
            if (confirm($this.data('locale'))) {
 | 
			
		||||
                $.post($this.data('url'), {
 | 
			
		||||
                    "_csrf": csrf
 | 
			
		||||
                }).success(function() {
 | 
			
		||||
                    $('#' + $this.data('comment-id')).remove();
 | 
			
		||||
                })
 | 
			
		||||
            }
 | 
			
		||||
            return false;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Change status
 | 
			
		||||
        var $status_btn = $('#status-button');
 | 
			
		||||
        $('#content').keyup(function () {
 | 
			
		||||
 
 | 
			
		||||
@@ -393,12 +393,15 @@
 | 
			
		||||
				.actions {
 | 
			
		||||
					.item {
 | 
			
		||||
						float: left;
 | 
			
		||||
						&.tag {
 | 
			
		||||
							margin-right: 5px;
 | 
			
		||||
						}
 | 
			
		||||
					a.item {
 | 
			
		||||
						&.action {
 | 
			
		||||
							margin-top: 6px;
 | 
			
		||||
							margin-left: 10px;
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				.content {
 | 
			
		||||
					margin-left: 4em;
 | 
			
		||||
					.header {
 | 
			
		||||
 
 | 
			
		||||
@@ -803,11 +803,7 @@ func UpdateIssueAssignee(ctx *context.Context) {
 | 
			
		||||
func NewComment(ctx *context.Context, form auth.CreateCommentForm) {
 | 
			
		||||
	issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if models.IsErrIssueNotExist(err) {
 | 
			
		||||
			ctx.Handle(404, "GetIssueByIndex", err)
 | 
			
		||||
		} else {
 | 
			
		||||
			ctx.Handle(500, "GetIssueByIndex", err)
 | 
			
		||||
		}
 | 
			
		||||
		ctx.HandleError("GetIssueByIndex", models.IsErrIssueNotExist, err, 404)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if issue.IsPull {
 | 
			
		||||
@@ -899,11 +895,7 @@ func NewComment(ctx *context.Context, form auth.CreateCommentForm) {
 | 
			
		||||
func UpdateCommentContent(ctx *context.Context) {
 | 
			
		||||
	comment, err := models.GetCommentByID(ctx.ParamsInt64(":id"))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if models.IsErrCommentNotExist(err) {
 | 
			
		||||
			ctx.Error(404, "GetCommentByID")
 | 
			
		||||
		} else {
 | 
			
		||||
			ctx.Handle(500, "GetCommentByID", err)
 | 
			
		||||
		}
 | 
			
		||||
		ctx.HandleError("GetCommentByID", models.IsErrCommentNotExist, err, 404)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -922,7 +914,7 @@ func UpdateCommentContent(ctx *context.Context) {
 | 
			
		||||
		})
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if err := models.UpdateComment(comment); err != nil {
 | 
			
		||||
	if err = models.UpdateComment(comment); err != nil {
 | 
			
		||||
		ctx.Handle(500, "UpdateComment", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
@@ -932,6 +924,29 @@ func UpdateCommentContent(ctx *context.Context) {
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func DeleteComment(ctx *context.Context) {
 | 
			
		||||
	comment, err := models.GetCommentByID(ctx.ParamsInt64(":id"))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.HandleError("GetCommentByID", models.IsErrCommentNotExist, err, 404)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !ctx.IsSigned || (ctx.User.ID != comment.PosterID && !ctx.Repo.IsAdmin()) {
 | 
			
		||||
		ctx.Error(403)
 | 
			
		||||
		return
 | 
			
		||||
	} else if comment.Type != models.COMMENT_TYPE_COMMENT {
 | 
			
		||||
		ctx.Error(204)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err = models.DeleteCommentByID(comment.ID); err != nil {
 | 
			
		||||
		ctx.Handle(500, "DeleteCommentByID", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ctx.Status(200)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Labels(ctx *context.Context) {
 | 
			
		||||
	ctx.Data["Title"] = ctx.Tr("repo.labels")
 | 
			
		||||
	ctx.Data["PageIsIssueList"] = true
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +1 @@
 | 
			
		||||
0.9.54.0724
 | 
			
		||||
0.9.55.0726
 | 
			
		||||
@@ -20,7 +20,9 @@
 | 
			
		||||
						<span class="text grey"><a {{if gt .Issue.Poster.ID 0}}href="{{.Issue.Poster.HomeLink}}"{{end}}>{{.Issue.Poster.Name}}</a> {{.i18n.Tr "repo.issues.commented_at" .Issue.HashTag $createdStr | Safe}}</span>
 | 
			
		||||
						<div class="ui right actions">
 | 
			
		||||
							{{if .IsIssueOwner}}
 | 
			
		||||
								<a class="edit-content item" href="#"><i class="octicon octicon-pencil"></i></a>
 | 
			
		||||
								<div class="item action">
 | 
			
		||||
									<a class="edit-content" href="#"><i class="octicon octicon-pencil"></i></a>
 | 
			
		||||
								</div>
 | 
			
		||||
							{{end}}
 | 
			
		||||
						</div>
 | 
			
		||||
					</div>
 | 
			
		||||
@@ -52,7 +54,7 @@
 | 
			
		||||
 | 
			
		||||
				<!-- 0 = COMMENT, 1 = REOPEN, 2 = CLOSE, 3 = ISSUE_REF, 4 = COMMIT_REF, 5 = COMMENT_REF, 6 = PULL_REF -->
 | 
			
		||||
				{{if eq .Type 0}}
 | 
			
		||||
					<div class="comment">
 | 
			
		||||
					<div class="comment" id="{{.HashTag}}">
 | 
			
		||||
						<a class="avatar" {{if gt .Poster.ID 0}}href="{{.Poster.HomeLink}}"{{end}}>
 | 
			
		||||
							<img src="{{.Poster.AvatarLink}}">
 | 
			
		||||
						</a>
 | 
			
		||||
@@ -72,7 +74,10 @@
 | 
			
		||||
										</div>
 | 
			
		||||
									{{end}}
 | 
			
		||||
									{{if or $.IsRepositoryAdmin (eq .Poster.ID $.SignedUserID)}}
 | 
			
		||||
										<a class="edit-content item" href="#"><i class="octicon octicon-pencil"></i></a>
 | 
			
		||||
										<div class="item action">
 | 
			
		||||
											<a class="edit-content" href="#"><i class="octicon octicon-pencil"></i></a>
 | 
			
		||||
											<a class="delete-comment" href="#" data-comment-id={{.HashTag}} data-url="{{$.RepoLink}}/comments/{{.ID}}/delete" data-locale="{{$.i18n.Tr "repo.issues.delete_comment_confirm"}}"><i class="octicon octicon-x"></i></a>
 | 
			
		||||
										</div>
 | 
			
		||||
									{{end}}
 | 
			
		||||
								</div>
 | 
			
		||||
							</div>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user