finish close/reopen issue
This commit is contained in:
parent
0ec7d1539b
commit
1fb53067f4
12 changed files with 115 additions and 27 deletions
|
@ -409,7 +409,10 @@ issues.commented_at = `commented at <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
issues.no_content = There is no content yet.
|
issues.no_content = There is no content yet.
|
||||||
issues.close_issue = Close
|
issues.close_issue = Close
|
||||||
issues.close_comment_issue = Close and comment
|
issues.close_comment_issue = Close and comment
|
||||||
|
issues.reopen_issue = Reopen
|
||||||
|
issues.reopen_comment_issue = Reopen and comment
|
||||||
issues.create_comment = Comment
|
issues.create_comment = Comment
|
||||||
|
issues.closed_at = `closed at <a id="%[1]s" href="#%[1]s">%[2]s</a>`
|
||||||
issues.label_title = Label name
|
issues.label_title = Label name
|
||||||
issues.label_color = Label color
|
issues.label_color = Label color
|
||||||
issues.label_count = %d labels
|
issues.label_count = %d labels
|
||||||
|
|
|
@ -153,7 +153,7 @@ func updateIssuesCommit(u *User, repo *Repository, repoUserName, repoName string
|
||||||
|
|
||||||
url := fmt.Sprintf("%s/%s/%s/commit/%s", setting.AppSubUrl, repoUserName, repoName, c.Sha1)
|
url := fmt.Sprintf("%s/%s/%s/commit/%s", setting.AppSubUrl, repoUserName, repoName, c.Sha1)
|
||||||
message := fmt.Sprintf(`<a href="%s">%s</a>`, url, c.Message)
|
message := fmt.Sprintf(`<a href="%s">%s</a>`, url, c.Message)
|
||||||
if _, err = CreateComment(u, repo, issue, 0, 0, COMMENT_TYPE_COMMIT, message, nil); err != nil {
|
if _, err = CreateComment(u, repo, issue, 0, 0, COMMENT_TYPE_COMMIT_REF, message, nil); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -798,7 +798,7 @@ func GetLabelsByIssueID(issueID int64) ([]*Label, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateLabel(e Engine, l *Label) error {
|
func updateLabel(e Engine, l *Label) error {
|
||||||
_, err := x.Id(l.ID).AllCols().Update(l)
|
_, err := e.Id(l.ID).AllCols().Update(l)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1222,11 +1222,13 @@ const (
|
||||||
COMMENT_TYPE_CLOSE
|
COMMENT_TYPE_CLOSE
|
||||||
|
|
||||||
// References.
|
// References.
|
||||||
COMMENT_TYPE_ISSUE
|
COMMENT_TYPE_ISSUE_REF
|
||||||
// Reference from some commit (not part of a pull request)
|
// Reference from a commit (not part of a pull request)
|
||||||
COMMENT_TYPE_COMMIT
|
COMMENT_TYPE_COMMIT_REF
|
||||||
// Reference from some pull request
|
// Reference from a comment
|
||||||
COMMENT_TYPE_PULL
|
COMMENT_TYPE_COMMENT_REF
|
||||||
|
// Reference from a pull request
|
||||||
|
COMMENT_TYPE_PULL_REF
|
||||||
)
|
)
|
||||||
|
|
||||||
// Comment represents a comment in commit and issue page.
|
// Comment represents a comment in commit and issue page.
|
||||||
|
@ -1245,11 +1247,16 @@ type Comment struct {
|
||||||
Attachments []*Attachment `xorm:"-"`
|
Attachments []*Attachment `xorm:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// HashTag returns unique hash tag for issue.
|
// HashTag returns unique hash tag for comment.
|
||||||
func (c *Comment) HashTag() string {
|
func (c *Comment) HashTag() string {
|
||||||
return "issuecomment-" + com.ToStr(c.ID)
|
return "issuecomment-" + com.ToStr(c.ID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EventTag returns unique event hash tag for comment.
|
||||||
|
func (c *Comment) EventTag() string {
|
||||||
|
return "event-" + com.ToStr(c.ID)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Comment) AfterSet(colName string, _ xorm.Cell) {
|
func (c *Comment) AfterSet(colName string, _ xorm.Cell) {
|
||||||
var err error
|
var err error
|
||||||
switch colName {
|
switch colName {
|
||||||
|
|
|
@ -112,7 +112,7 @@ func (f *CreateIssueForm) Validate(ctx *macaron.Context, errs binding.Errors) bi
|
||||||
|
|
||||||
type CreateCommentForm struct {
|
type CreateCommentForm struct {
|
||||||
Content string
|
Content string
|
||||||
NewStatus string `binding:"OmitEmpty;In(reopen,close)"`
|
Status string `binding:"OmitEmpty;In(reopen,close)"`
|
||||||
Attachments []string
|
Attachments []string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
2
public/css/gogs.min.css
vendored
2
public/css/gogs.min.css
vendored
File diff suppressed because one or more lines are too long
|
@ -203,6 +203,22 @@ function initRepository() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Issues
|
||||||
|
if ($('.repository.view.issue').length > 0) {
|
||||||
|
var $status_btn = $('#status-button');
|
||||||
|
$('#content').keyup(function () {
|
||||||
|
if ($(this).val().length == 0) {
|
||||||
|
$status_btn.text($status_btn.data('status'))
|
||||||
|
} else {
|
||||||
|
$status_btn.text($status_btn.data('status-and-comment'))
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$status_btn.click(function () {
|
||||||
|
$('#status').val($status_btn.data('status-val'));
|
||||||
|
$('#comment-form').submit();
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// Pull request
|
// Pull request
|
||||||
if ($('.repository.compare.pull').length > 0) {
|
if ($('.repository.compare.pull').length > 0) {
|
||||||
var $branch_dropdown = $('.choose.branch .dropdown')
|
var $branch_dropdown = $('.choose.branch .dropdown')
|
||||||
|
|
|
@ -74,6 +74,15 @@ img {
|
||||||
&.red {
|
&.red {
|
||||||
color: #d95c5c!important;
|
color: #d95c5c!important;
|
||||||
}
|
}
|
||||||
|
&.grey {
|
||||||
|
color: #767676!important;
|
||||||
|
a {
|
||||||
|
color: #444!important;
|
||||||
|
&:hover {
|
||||||
|
color: #000!important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
&.right {
|
&.right {
|
||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
|
|
@ -163,6 +163,19 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.comment-list {
|
.comment-list {
|
||||||
|
&:before {
|
||||||
|
display: block;
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
margin-top: 12px;
|
||||||
|
margin-bottom: 14px;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 96px;
|
||||||
|
width: 2px;
|
||||||
|
background-color: #f3f3f3;
|
||||||
|
z-index: -1;
|
||||||
|
}
|
||||||
.comment {
|
.comment {
|
||||||
.avatar {
|
.avatar {
|
||||||
width: @comment-avatar-width;
|
width: @comment-avatar-width;
|
||||||
|
@ -181,13 +194,6 @@
|
||||||
max-width: 78%;
|
max-width: 78%;
|
||||||
padding-top: 10px;
|
padding-top: 10px;
|
||||||
padding-bottom: 10px;
|
padding-bottom: 10px;
|
||||||
color: #767676;
|
|
||||||
a {
|
|
||||||
color: #444;
|
|
||||||
&:hover {
|
|
||||||
color: #000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.markdown {
|
.markdown {
|
||||||
|
@ -219,6 +225,25 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.event {
|
||||||
|
position: relative;
|
||||||
|
margin: 15px 0 15px 79px;
|
||||||
|
padding-left: 25px;
|
||||||
|
.octicon {
|
||||||
|
width: 30px;
|
||||||
|
float: left;
|
||||||
|
margin-left: -36px;
|
||||||
|
text-align: center;
|
||||||
|
&.octicon-circle-slash {
|
||||||
|
font-size: 30px;
|
||||||
|
color: #bd2c00;
|
||||||
|
}
|
||||||
|
&.octicon-primitive-dot {
|
||||||
|
font-size: 35px;
|
||||||
|
color: #6cc644;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.ui.segment.metas {
|
.ui.segment.metas {
|
||||||
margin-top: -3px;
|
margin-top: -3px;
|
||||||
|
|
|
@ -720,9 +720,9 @@ func NewComment(ctx *middleware.Context, form auth.CreateCommentForm) {
|
||||||
|
|
||||||
// Check if issue owner/poster changes the status of issue.
|
// Check if issue owner/poster changes the status of issue.
|
||||||
if (ctx.Repo.IsOwner() || issue.IsPoster(ctx.User.Id)) &&
|
if (ctx.Repo.IsOwner() || issue.IsPoster(ctx.User.Id)) &&
|
||||||
(form.NewStatus == "reopen" || form.NewStatus == "close") {
|
(form.Status == "reopen" || form.Status == "close") {
|
||||||
issue.Repo = ctx.Repo.Repository
|
issue.Repo = ctx.Repo.Repository
|
||||||
if err = issue.ChangeStatus(ctx.User, form.NewStatus == "close"); err != nil {
|
if err = issue.ChangeStatus(ctx.User, form.Status == "close"); err != nil {
|
||||||
ctx.Handle(500, "ChangeStatus", err)
|
ctx.Handle(500, "ChangeStatus", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<a class="item" data-tab="preview" data-url="/api/v1/markdown" data-context="{{.RepoLink}}">{{.i18n.Tr "repo.release.preview"}}</a>
|
<a class="item" data-tab="preview" data-url="/api/v1/markdown" data-context="{{.RepoLink}}">{{.i18n.Tr "repo.release.preview"}}</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="ui bottom attached active tab segment" data-tab="write">
|
<div class="ui bottom attached active tab segment" data-tab="write">
|
||||||
<textarea name="content"></textarea>
|
<textarea id="content" name="content"></textarea>
|
||||||
</div>
|
</div>
|
||||||
<div class="ui bottom attached tab segment markdown" data-tab="preview">
|
<div class="ui bottom attached tab segment markdown" data-tab="preview">
|
||||||
{{.i18n.Tr "repo.release.loading"}}
|
{{.i18n.Tr "repo.release.loading"}}
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
</a>
|
</a>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<div class="ui top attached header">
|
<div class="ui top attached header">
|
||||||
<span class="text"><a href="{{.Issue.Poster.HomeLink}}">{{.Issue.Poster.Name}}</a> {{.i18n.Tr "repo.issues.commented_at" .Issue.HashTag $createdStr | Safe}}</span>
|
<span class="text grey"><a href="{{.Issue.Poster.HomeLink}}">{{.Issue.Poster.Name}}</a> {{.i18n.Tr "repo.issues.commented_at" .Issue.HashTag $createdStr | Safe}}</span>
|
||||||
<div class="ui right actions">
|
<div class="ui right actions">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -52,13 +52,16 @@
|
||||||
|
|
||||||
{{range .Issue.Comments}}
|
{{range .Issue.Comments}}
|
||||||
{{ $createdStr:= TimeSince .Created $.Lang }}
|
{{ $createdStr:= TimeSince .Created $.Lang }}
|
||||||
|
|
||||||
|
<!-- 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">
|
||||||
<a class="avatar" href="{{.Poster.HomeLink}}">
|
<a class="avatar" href="{{.Poster.HomeLink}}">
|
||||||
<img src="{{.Poster.AvatarLink}}">
|
<img src="{{.Poster.AvatarLink}}">
|
||||||
</a>
|
</a>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<div class="ui top attached header">
|
<div class="ui top attached header">
|
||||||
<span class="text"><a href="{{.Poster.HomeLink}}">{{.Poster.Name}}</a> {{$.i18n.Tr "repo.issues.commented_at" .HashTag $createdStr | Safe}}</span>
|
<span class="text grey"><a href="{{.Poster.HomeLink}}">{{.Poster.Name}}</a> {{$.i18n.Tr "repo.issues.commented_at" .HashTag $createdStr | Safe}}</span>
|
||||||
<div class="ui right actions">
|
<div class="ui right actions">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -80,6 +83,24 @@
|
||||||
{{end}}
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{{else if eq .Type 1}}
|
||||||
|
<div class="event">
|
||||||
|
<span class="octicon octicon-primitive-dot"></span>
|
||||||
|
<a class="ui avatar image" href="{{.Poster.HomeLink}}">
|
||||||
|
<img src="{{.Poster.AvatarLink}}">
|
||||||
|
</a>
|
||||||
|
<span class="text grey"><a href="{{.Poster.HomeLink}}">{{.Poster.Name}}</a> {{$.i18n.Tr "repo.issues.closed_at" .EventTag $createdStr | Safe}}</span>
|
||||||
|
</div>
|
||||||
|
{{else if eq .Type 2}}
|
||||||
|
<div class="event">
|
||||||
|
<span class="octicon octicon-circle-slash"></span>
|
||||||
|
<a class="ui avatar image" href="{{.Poster.HomeLink}}">
|
||||||
|
<img src="{{.Poster.AvatarLink}}">
|
||||||
|
</a>
|
||||||
|
<span class="text grey"><a href="{{.Poster.HomeLink}}">{{.Poster.Name}}</a> {{$.i18n.Tr "repo.issues.closed_at" .EventTag $createdStr | Safe}}</span>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
||||||
<div class="comment form">
|
<div class="comment form">
|
||||||
|
@ -87,13 +108,20 @@
|
||||||
<img src="{{.SignedUser.AvatarLink}}">
|
<img src="{{.SignedUser.AvatarLink}}">
|
||||||
</a>
|
</a>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<form class="ui segment form" action="{{.Link}}/comments" method="post">
|
<form class="ui segment form" id="comment-form" action="{{.Link}}/comments" method="post">
|
||||||
{{template "repo/issue/comment_tab" .}}
|
{{template "repo/issue/comment_tab" .}}
|
||||||
{{.CsrfTokenHtml}}
|
{{.CsrfTokenHtml}}
|
||||||
|
<input id="status" name="status" type="hidden">
|
||||||
<div class="text right">
|
<div class="text right">
|
||||||
<div class="ui red basic button" data-close="{{.i18n.Tr "repo.issues.close_issue"}}" data-close-and-comment="{{.i18n.Tr "repo.issues.close_comment_issue"}}">
|
{{if .Issue.IsClosed}}
|
||||||
|
<div id="status-button" class="ui green basic button" data-status="{{.i18n.Tr "repo.issues.reopen_issue"}}" data-status-and-comment="{{.i18n.Tr "repo.issues.reopen_comment_issue"}}" data-status-val="reopen">
|
||||||
|
{{.i18n.Tr "repo.issues.reopen_issue"}}
|
||||||
|
</div>
|
||||||
|
{{else}}
|
||||||
|
<div id="status-button" class="ui red basic button" data-status="{{.i18n.Tr "repo.issues.close_issue"}}" data-status-and-comment="{{.i18n.Tr "repo.issues.close_comment_issue"}}" data-status-val="close">
|
||||||
{{.i18n.Tr "repo.issues.close_issue"}}
|
{{.i18n.Tr "repo.issues.close_issue"}}
|
||||||
</div>
|
</div>
|
||||||
|
{{end}}
|
||||||
<button class="ui green button">
|
<button class="ui green button">
|
||||||
{{.i18n.Tr "repo.issues.create_comment"}}
|
{{.i18n.Tr "repo.issues.create_comment"}}
|
||||||
</button>
|
</button>
|
||||||
|
|
Reference in a new issue