mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Improve issue history dialog and make poster can delete their own history (#27323)
Fix #27313 (see the comment) And some UI improvements: ### Before   ### After   
This commit is contained in:
		@@ -11,7 +11,6 @@ import (
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/avatars"
 | 
			
		||||
	issues_model "code.gitea.io/gitea/models/issues"
 | 
			
		||||
	"code.gitea.io/gitea/models/unit"
 | 
			
		||||
	"code.gitea.io/gitea/modules/context"
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
@@ -91,11 +90,16 @@ func GetContentHistoryList(ctx *context.Context) {
 | 
			
		||||
// Admins or owners can always delete history revisions. Normal users can only delete own history revisions.
 | 
			
		||||
func canSoftDeleteContentHistory(ctx *context.Context, issue *issues_model.Issue, comment *issues_model.Comment,
 | 
			
		||||
	history *issues_model.ContentHistory,
 | 
			
		||||
) bool {
 | 
			
		||||
	canSoftDelete := false
 | 
			
		||||
	if ctx.Repo.IsOwner() {
 | 
			
		||||
) (canSoftDelete bool) {
 | 
			
		||||
	// CanWrite means the doer can manage the issue/PR list
 | 
			
		||||
	if ctx.Repo.IsOwner() || ctx.Repo.CanWriteIssuesOrPulls(issue.IsPull) {
 | 
			
		||||
		canSoftDelete = true
 | 
			
		||||
	} else if ctx.Repo.CanWrite(unit.TypeIssues) {
 | 
			
		||||
	} else {
 | 
			
		||||
		// for read-only users, they could still post issues or comments,
 | 
			
		||||
		// they should be able to delete the history related to their own issue/comment, a case is:
 | 
			
		||||
		// 1. the user posts some sensitive data
 | 
			
		||||
		// 2. then the repo owner edits the post but didn't remove the sensitive data
 | 
			
		||||
		// 3. the poster wants to delete the edited history revision
 | 
			
		||||
		if comment == nil {
 | 
			
		||||
			// the issue poster or the history poster can soft-delete
 | 
			
		||||
			canSoftDelete = ctx.Doer.ID == issue.PosterID || ctx.Doer.ID == history.PosterID
 | 
			
		||||
 
 | 
			
		||||
@@ -3,13 +3,18 @@
 | 
			
		||||
  width: fit-content;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ui.modal.g-modal-confirm > .inside.close {
 | 
			
		||||
.ui.modal.g-modal-confirm > .inside.close.icon {
 | 
			
		||||
  padding: 0;
 | 
			
		||||
  width: 1em;
 | 
			
		||||
  height: 1em;
 | 
			
		||||
  top: 1.2em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ui.modal > .close.icon[height="16"] {
 | 
			
		||||
  top: 0.7em; /* fomantic uses absolute layout, so if we have special icon size, it needs this trick to align vertically */
 | 
			
		||||
  color: var(--color-text-dark);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.ui.modal > .header {
 | 
			
		||||
  /* can't use display:flex, because some headers have space-separated elements, eg: delete branch modal */
 | 
			
		||||
  color: var(--color-text-dark);
 | 
			
		||||
 
 | 
			
		||||
@@ -2578,12 +2578,14 @@ tbody.commit-list {
 | 
			
		||||
 | 
			
		||||
.comment-diff-data {
 | 
			
		||||
  background: var(--color-code-bg);
 | 
			
		||||
  min-height: 12em;
 | 
			
		||||
  max-height: calc(100vh - 10.5rem);
 | 
			
		||||
  overflow-y: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.comment-diff-data pre {
 | 
			
		||||
  line-height: 18px;
 | 
			
		||||
  margin: 1em;
 | 
			
		||||
  white-space: pre-wrap;
 | 
			
		||||
  word-break: break-all;
 | 
			
		||||
  overflow-wrap: break-word;
 | 
			
		||||
 
 | 
			
		||||
@@ -17,14 +17,15 @@ function showContentHistoryDetail(issueBaseUrl, commentId, historyId, itemTitleH
 | 
			
		||||
  ${svg('octicon-x', 16, 'close icon inside')}
 | 
			
		||||
  <div class="header gt-df gt-ac gt-sb">
 | 
			
		||||
    <div>${itemTitleHtml}</div>
 | 
			
		||||
    <div class="ui dropdown dialog-header-options gt-df gt-ac gt-mr-5 gt-hidden">
 | 
			
		||||
      ${i18nTextOptions}${svg('octicon-triangle-down', 14, 'dropdown icon')}
 | 
			
		||||
    <div class="ui dropdown dialog-header-options gt-mr-5 gt-hidden">
 | 
			
		||||
      ${i18nTextOptions}
 | 
			
		||||
      ${svg('octicon-triangle-down', 14, 'dropdown icon')}
 | 
			
		||||
      <div class="menu">
 | 
			
		||||
        <div class="item red text" data-option-item="delete">${i18nTextDeleteFromHistory}</div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div class="comment-diff-data gt-text-left gt-p-3 is-loading"></div>
 | 
			
		||||
  <div class="comment-diff-data is-loading"></div>
 | 
			
		||||
</div>`);
 | 
			
		||||
  $dialog.appendTo($('body'));
 | 
			
		||||
  $dialog.find('.dialog-header-options').dropdown({
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user