mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	add comment form UI
This commit is contained in:
		@@ -406,6 +406,10 @@ issues.open_title = Open
 | 
				
			|||||||
issues.closed_title = Closed
 | 
					issues.closed_title = Closed
 | 
				
			||||||
issues.num_comments = %d comments
 | 
					issues.num_comments = %d comments
 | 
				
			||||||
issues.commented_at = commented at <a href="%s">%s</a>
 | 
					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_title = Label name
 | 
				
			||||||
issues.label_color = Label color
 | 
					issues.label_color = Label color
 | 
				
			||||||
issues.label_count = %d labels
 | 
					issues.label_count = %d labels
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -160,12 +160,9 @@ func (i *Issue) GetAssignee() (err error) {
 | 
				
			|||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (i *Issue) AfterDelete() {
 | 
					// ReadBy sets issue to be read by given user.
 | 
				
			||||||
	_, err := DeleteAttachmentsByIssue(i.ID, true)
 | 
					func (i *Issue) ReadBy(uid int64) error {
 | 
				
			||||||
 | 
						return UpdateIssueUserByRead(uid, i.ID)
 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		log.Info("Could not delete files for issue #%d: %s", i.ID, err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CreateIssue creates new issue with labels for repository.
 | 
					// CreateIssue creates new issue with labels for repository.
 | 
				
			||||||
@@ -625,10 +622,9 @@ func UpdateIssueUserByAssignee(issueID, assigneeID int64) (err error) {
 | 
				
			|||||||
	return sess.Commit()
 | 
						return sess.Commit()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// UpdateIssueUserPairByRead updates issue-user pair for reading.
 | 
					// UpdateIssueUserByRead updates issue-user relation for reading.
 | 
				
			||||||
func UpdateIssueUserPairByRead(uid, iid int64) error {
 | 
					func UpdateIssueUserByRead(uid, issueID int64) error {
 | 
				
			||||||
	rawSql := "UPDATE `issue_user` SET is_read = ? WHERE uid = ? AND issue_id = ?"
 | 
						_, err := x.Exec("UPDATE `issue_user` SET is_read=? WHERE uid=? AND issue_id=?", true, uid, issueID)
 | 
				
			||||||
	_, err := x.Exec(rawSql, true, uid, iid)
 | 
					 | 
				
			||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												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
											
										
									
								
							@@ -121,8 +121,10 @@
 | 
				
			|||||||
	@comment-avatar-width: 3em;
 | 
						@comment-avatar-width: 3em;
 | 
				
			||||||
	&.new.issue {
 | 
						&.new.issue {
 | 
				
			||||||
		.comment.form {
 | 
							.comment.form {
 | 
				
			||||||
			.comment .avatar {
 | 
								.comment {
 | 
				
			||||||
				width: @comment-avatar-width;
 | 
									.avatar {
 | 
				
			||||||
 | 
										width: @comment-avatar-width;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			.content {
 | 
								.content {
 | 
				
			||||||
				margin-left: 4em;
 | 
									margin-left: 4em;
 | 
				
			||||||
@@ -137,6 +139,7 @@
 | 
				
			|||||||
					overflow-x: auto;
 | 
										overflow-x: auto;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	&.view.issue {
 | 
						&.view.issue {
 | 
				
			||||||
@@ -187,13 +190,31 @@
 | 
				
			|||||||
					.markdown {
 | 
										.markdown {
 | 
				
			||||||
						font-size: 14px;
 | 
											font-size: 14px;
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					.bottom.segment {
 | 
										.no-content {
 | 
				
			||||||
 | 
											color: #767676;
 | 
				
			||||||
 | 
											font-style: italic;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										> .bottom.segment {
 | 
				
			||||||
						background: #f3f4f5;
 | 
											background: #f3f4f5;
 | 
				
			||||||
						.ui.image {
 | 
											.ui.image {
 | 
				
			||||||
							max-height: 150px;
 | 
												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 {
 | 
							.ui.segment.metas {
 | 
				
			||||||
@@ -203,7 +224,7 @@
 | 
				
			|||||||
	.comment.form {
 | 
						.comment.form {
 | 
				
			||||||
		.ui.comments {
 | 
							.ui.comments {
 | 
				
			||||||
			margin-top: -12px;
 | 
								margin-top: -12px;
 | 
				
			||||||
			max-width: 750px!important;
 | 
								max-width: 100%;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		.content {
 | 
							.content {
 | 
				
			||||||
			.field:first-child {
 | 
								.field:first-child {
 | 
				
			||||||
@@ -218,15 +239,6 @@
 | 
				
			|||||||
				height: 200px;
 | 
									height: 200px;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		.dropzone {
 | 
					 | 
				
			||||||
			width: 100%; 
 | 
					 | 
				
			||||||
			margin-bottom: 10px;
 | 
					 | 
				
			||||||
			border: 2px dashed #0087F7;
 | 
					 | 
				
			||||||
			box-shadow: none;
 | 
					 | 
				
			||||||
			.dz-error-message {
 | 
					 | 
				
			||||||
				top: 140px;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	.label.list {
 | 
						.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 {
 | 
					.settings .key.list {
 | 
				
			||||||
	.item:not(:first-child) {
 | 
						.item:not(:first-child) {
 | 
				
			||||||
		border-top: 1px solid #eaeaea;
 | 
							border-top: 1px solid #eaeaea;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -441,11 +441,11 @@ func ViewIssue(ctx *middleware.Context) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ctx.IsSigned {
 | 
						if ctx.IsSigned {
 | 
				
			||||||
		// 	// Update issue-user.
 | 
							// Update issue-user.
 | 
				
			||||||
		// 	if err = models.UpdateIssueUserPairByRead(ctx.User.Id, issue.ID); err != nil {
 | 
							if err = issue.ReadBy(ctx.User.Id); err != nil {
 | 
				
			||||||
		// 		ctx.Handle(500, "UpdateIssueUserPairByRead: %v", err)
 | 
								ctx.Handle(500, "ReadBy: %v", err)
 | 
				
			||||||
		// 		return
 | 
								return
 | 
				
			||||||
		// 	}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if ctx.User.IsAdmin {
 | 
							if ctx.User.IsAdmin {
 | 
				
			||||||
			// labels, err := models.GetLabelsByRepoID(ctx.Repo.Repository.ID)
 | 
								// labels, err := models.GetLabelsByRepoID(ctx.Repo.Repository.ID)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								templates/repo/issue/comment_tab.tmpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								templates/repo/issue/comment_tab.tmpl
									
									
									
									
									
										Normal file
									
								
							@@ -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">
 | 
							      <div class="field">
 | 
				
			||||||
		      	<input name="title" placeholder="{{.i18n.Tr "repo.milestones.title"}}" value="{{.title}}" autofocus required>
 | 
							      	<input name="title" placeholder="{{.i18n.Tr "repo.milestones.title"}}" value="{{.title}}" autofocus required>
 | 
				
			||||||
		      </div>
 | 
							      </div>
 | 
				
			||||||
		      <div class="field">
 | 
										{{template "repo/issue/comment_tab" .}}
 | 
				
			||||||
			      <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}}
 | 
					 | 
				
			||||||
		      <div class="text right">
 | 
							      <div class="text right">
 | 
				
			||||||
						<button class="ui green button">
 | 
											<button class="ui green button">
 | 
				
			||||||
							{{.i18n.Tr "repo.issues.create"}}
 | 
												{{.i18n.Tr "repo.issues.create"}}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,19 +32,42 @@
 | 
				
			|||||||
					  </div>
 | 
										  </div>
 | 
				
			||||||
					</div>
 | 
										</div>
 | 
				
			||||||
			    <div class="ui attached segment markdown">
 | 
								    <div class="ui attached segment markdown">
 | 
				
			||||||
 | 
								    	{{if .Issue.RenderedContent}}
 | 
				
			||||||
						{{.Issue.RenderedContent|Str2html}}
 | 
											{{.Issue.RenderedContent|Str2html}}
 | 
				
			||||||
 | 
								    	{{else}}
 | 
				
			||||||
 | 
											<span class="no-content">{{.i18n.Tr "repo.issues.no_content"}}</span>
 | 
				
			||||||
 | 
								    	{{end}}
 | 
				
			||||||
	  			</div>
 | 
						  			</div>
 | 
				
			||||||
	  			{{if .Issue.Attachments}}
 | 
						  			{{if .Issue.Attachments}}
 | 
				
			||||||
					<div class="ui bottom attached segment">
 | 
										<div class="ui bottom attached segment">
 | 
				
			||||||
						<div class="ui small images">
 | 
											<div class="ui small images">
 | 
				
			||||||
							{{range .Issue.Attachments}}
 | 
												{{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}}
 | 
											  {{end}}
 | 
				
			||||||
						</div>
 | 
											</div>
 | 
				
			||||||
					</div>
 | 
										</div>
 | 
				
			||||||
	  			{{end}}
 | 
						  			{{end}}
 | 
				
			||||||
		    </div>
 | 
							    </div>
 | 
				
			||||||
  		</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>
 | 
					  	</ui>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user