| @@ -406,6 +406,10 @@ issues.open_title = Open | |||
| issues.closed_title = Closed | |||
| issues.num_comments = %d comments | |||
| issues.commented_at = commented at <a href="%s">%s</a> | |||
| issues.no_content = There is no content if this issue. | |||
| issues.close_issue = Close | |||
| issues.close_comment_issue = Close and comment | |||
| issues.create_comment = Comment | |||
| issues.label_title = Label name | |||
| issues.label_color = Label color | |||
| issues.label_count = %d labels | |||
| @@ -160,12 +160,9 @@ func (i *Issue) GetAssignee() (err error) { | |||
| return err | |||
| } | |||
| func (i *Issue) AfterDelete() { | |||
| _, err := DeleteAttachmentsByIssue(i.ID, true) | |||
| if err != nil { | |||
| log.Info("Could not delete files for issue #%d: %s", i.ID, err) | |||
| } | |||
| // ReadBy sets issue to be read by given user. | |||
| func (i *Issue) ReadBy(uid int64) error { | |||
| return UpdateIssueUserByRead(uid, i.ID) | |||
| } | |||
| // CreateIssue creates new issue with labels for repository. | |||
| @@ -625,10 +622,9 @@ func UpdateIssueUserByAssignee(issueID, assigneeID int64) (err error) { | |||
| return sess.Commit() | |||
| } | |||
| // UpdateIssueUserPairByRead updates issue-user pair for reading. | |||
| func UpdateIssueUserPairByRead(uid, iid int64) error { | |||
| rawSql := "UPDATE `issue_user` SET is_read = ? WHERE uid = ? AND issue_id = ?" | |||
| _, err := x.Exec(rawSql, true, uid, iid) | |||
| // UpdateIssueUserByRead updates issue-user relation for reading. | |||
| func UpdateIssueUserByRead(uid, issueID int64) error { | |||
| _, err := x.Exec("UPDATE `issue_user` SET is_read=? WHERE uid=? AND issue_id=?", true, uid, issueID) | |||
| return err | |||
| } | |||
| @@ -121,8 +121,10 @@ | |||
| @comment-avatar-width: 3em; | |||
| &.new.issue { | |||
| .comment.form { | |||
| .comment .avatar { | |||
| width: @comment-avatar-width; | |||
| .comment { | |||
| .avatar { | |||
| width: @comment-avatar-width; | |||
| } | |||
| } | |||
| .content { | |||
| margin-left: 4em; | |||
| @@ -137,6 +139,7 @@ | |||
| overflow-x: auto; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| &.view.issue { | |||
| @@ -187,13 +190,31 @@ | |||
| .markdown { | |||
| font-size: 14px; | |||
| } | |||
| .bottom.segment { | |||
| .no-content { | |||
| color: #767676; | |||
| font-style: italic; | |||
| } | |||
| > .bottom.segment { | |||
| background: #f3f4f5; | |||
| .ui.image { | |||
| max-height: 150px; | |||
| } | |||
| } | |||
| } | |||
| .ui.form { | |||
| .field:first-child { | |||
| clear: none; | |||
| } | |||
| .tab.segment { | |||
| border: none; | |||
| padding: 0; | |||
| padding-top: 10px; | |||
| } | |||
| textarea { | |||
| height: 200px; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| .ui.segment.metas { | |||
| @@ -203,7 +224,7 @@ | |||
| .comment.form { | |||
| .ui.comments { | |||
| margin-top: -12px; | |||
| max-width: 750px!important; | |||
| max-width: 100%; | |||
| } | |||
| .content { | |||
| .field:first-child { | |||
| @@ -218,15 +239,6 @@ | |||
| height: 200px; | |||
| } | |||
| } | |||
| .dropzone { | |||
| width: 100%; | |||
| margin-bottom: 10px; | |||
| border: 2px dashed #0087F7; | |||
| box-shadow: none; | |||
| .dz-error-message { | |||
| top: 140px; | |||
| } | |||
| } | |||
| } | |||
| .label.list { | |||
| @@ -352,6 +364,18 @@ | |||
| } | |||
| } | |||
| .ui.comments { | |||
| .dropzone { | |||
| width: 100%; | |||
| margin-bottom: 10px; | |||
| border: 2px dashed #0087F7; | |||
| box-shadow: none!important; | |||
| .dz-error-message { | |||
| top: 140px; | |||
| } | |||
| } | |||
| } | |||
| .settings .key.list { | |||
| .item:not(:first-child) { | |||
| border-top: 1px solid #eaeaea; | |||
| @@ -441,11 +441,11 @@ func ViewIssue(ctx *middleware.Context) { | |||
| } | |||
| if ctx.IsSigned { | |||
| // // Update issue-user. | |||
| // if err = models.UpdateIssueUserPairByRead(ctx.User.Id, issue.ID); err != nil { | |||
| // ctx.Handle(500, "UpdateIssueUserPairByRead: %v", err) | |||
| // return | |||
| // } | |||
| // Update issue-user. | |||
| if err = issue.ReadBy(ctx.User.Id); err != nil { | |||
| ctx.Handle(500, "ReadBy: %v", err) | |||
| return | |||
| } | |||
| if ctx.User.IsAdmin { | |||
| // labels, err := models.GetLabelsByRepoID(ctx.Repo.Repository.ID) | |||
| @@ -0,0 +1,16 @@ | |||
| <div class="field"> | |||
| <div class="ui top attached tabular menu"> | |||
| <a class="active item" data-tab="write">{{.i18n.Tr "repo.release.write"}}</a> | |||
| <a class="item" data-tab="preview" data-url="/api/v1/markdown" data-context="{{.RepoLink}}">{{.i18n.Tr "repo.release.preview"}}</a> | |||
| </div> | |||
| <div class="ui bottom attached active tab segment" data-tab="write"> | |||
| <textarea name="content"></textarea> | |||
| </div> | |||
| <div class="ui bottom attached tab segment markdown" data-tab="preview"> | |||
| {{.i18n.Tr "repo.release.loading"}} | |||
| </div> | |||
| </div> | |||
| {{if .IsAttachmentEnabled}} | |||
| <div class="attachments"></div> | |||
| <div class="ui basic button dropzone" id="dropzone" data-upload-url="/issues/attachments" data-accepts="{{.AttachmentAllowedTypes}}" data-max-file="{{.AttachmentMaxFiles}}" data-max-size="2" data-default-message="{{.i18n.Tr "dropzone.default_message"}}" data-invalid-input-type="{{.i18n.Tr "dropzone.invalid_input_type"}}" data-file-too-big="{{.i18n.Tr "dropzone.file_too_big"}}" data-remove-file="{{.i18n.Tr "dropzone.remove_file"}}"></div> | |||
| {{end}} | |||
| @@ -15,22 +15,7 @@ | |||
| <div class="field"> | |||
| <input name="title" placeholder="{{.i18n.Tr "repo.milestones.title"}}" value="{{.title}}" autofocus required> | |||
| </div> | |||
| <div class="field"> | |||
| <div class="ui top attached tabular menu"> | |||
| <a class="active item" data-tab="write">{{.i18n.Tr "repo.release.write"}}</a> | |||
| <a class="item" data-tab="preview" data-url="/api/v1/markdown" data-context="{{.RepoLink}}">{{.i18n.Tr "repo.release.preview"}}</a> | |||
| </div> | |||
| <div class="ui bottom attached active tab segment" data-tab="write"> | |||
| <textarea name="content"></textarea> | |||
| </div> | |||
| <div class="ui bottom attached tab segment markdown" data-tab="preview"> | |||
| {{.i18n.Tr "repo.release.loading"}} | |||
| </div> | |||
| </div> | |||
| {{if .IsAttachmentEnabled}} | |||
| <div class="attachments"></div> | |||
| <div class="ui basic button dropzone" id="dropzone" data-upload-url="/issues/attachments" data-accepts="{{.AttachmentAllowedTypes}}" data-max-file="{{.AttachmentMaxFiles}}" data-max-size="2" data-default-message="{{.i18n.Tr "dropzone.default_message"}}" data-invalid-input-type="{{.i18n.Tr "dropzone.invalid_input_type"}}" data-file-too-big="{{.i18n.Tr "dropzone.file_too_big"}}" data-remove-file="{{.i18n.Tr "dropzone.remove_file"}}"></div> | |||
| {{end}} | |||
| {{template "repo/issue/comment_tab" .}} | |||
| <div class="text right"> | |||
| <button class="ui green button"> | |||
| {{.i18n.Tr "repo.issues.create"}} | |||
| @@ -32,19 +32,42 @@ | |||
| </div> | |||
| </div> | |||
| <div class="ui attached segment markdown"> | |||
| {{if .Issue.RenderedContent}} | |||
| {{.Issue.RenderedContent|Str2html}} | |||
| {{else}} | |||
| <span class="no-content">{{.i18n.Tr "repo.issues.no_content"}}</span> | |||
| {{end}} | |||
| </div> | |||
| {{if .Issue.Attachments}} | |||
| <div class="ui bottom attached segment"> | |||
| <div class="ui small images"> | |||
| {{range .Issue.Attachments}} | |||
| <a href="/attachments/{{.UUID}}"><img class="ui image" src="/attachments/{{.UUID}}"></a> | |||
| <a target="_blank" href="/attachments/{{.UUID}}"><img class="ui image" src="/attachments/{{.UUID}}"></a> | |||
| {{end}} | |||
| </div> | |||
| </div> | |||
| {{end}} | |||
| </div> | |||
| </div> | |||
| <div class="comment form"> | |||
| <a class="avatar" href="{{.SignedUser.HomeLink}}"> | |||
| <img src="{{.SignedUser.AvatarLink}}"> | |||
| </a> | |||
| <div class="content"> | |||
| <form class="ui segment form" action="{{.Link}}" method="post"> | |||
| {{template "repo/issue/comment_tab" .}} | |||
| <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"}}"> | |||
| {{.i18n.Tr "repo.issues.close_issue"}} | |||
| </div> | |||
| <div class="ui green button"> | |||
| {{.i18n.Tr "repo.issues.create_comment"}} | |||
| </div> | |||
| </div> | |||
| </form> | |||
| </div> | |||
| </div> | |||
| </ui> | |||
| </div> | |||