mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Add option to copy line permalink (#17145)
* Add option to copy line permalink * Fix lint * Apply review suggestions * Update code and fix lint * Use features/clipboard.js framework
This commit is contained in:
		@@ -970,6 +970,7 @@ file_view_rendered = View Rendered
 | 
				
			|||||||
file_view_raw = View Raw
 | 
					file_view_raw = View Raw
 | 
				
			||||||
file_permalink = Permalink
 | 
					file_permalink = Permalink
 | 
				
			||||||
file_too_large = The file is too large to be shown.
 | 
					file_too_large = The file is too large to be shown.
 | 
				
			||||||
 | 
					file_copy_permalink = Copy Permalink
 | 
				
			||||||
video_not_supported_in_browser = Your browser does not support the HTML5 'video' tag.
 | 
					video_not_supported_in_browser = Your browser does not support the HTML5 'video' tag.
 | 
				
			||||||
audio_not_supported_in_browser = Your browser does not support the HTML5 'audio' tag.
 | 
					audio_not_supported_in_browser = Your browser does not support the HTML5 'audio' tag.
 | 
				
			||||||
stored_lfs = Stored with Git LFS
 | 
					stored_lfs = Stored with Git LFS
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -112,17 +112,20 @@
 | 
				
			|||||||
						{{end}}
 | 
											{{end}}
 | 
				
			||||||
					</tbody>
 | 
										</tbody>
 | 
				
			||||||
				</table>
 | 
									</table>
 | 
				
			||||||
					{{if $.Permission.CanRead $.UnitTypeIssues}}
 | 
									<div class="code-line-menu ui fluid popup transition hidden">
 | 
				
			||||||
						<div class="code-line-menu ui fluid popup transition hidden">
 | 
										<div class="ui column relaxed equal height">
 | 
				
			||||||
							<div class="ui column relaxed equal height">
 | 
											<div class="column">
 | 
				
			||||||
								<div class="column">
 | 
												{{if $.Permission.CanRead $.UnitTypeIssues}}
 | 
				
			||||||
									<div class="ui link list">
 | 
													<div class="ui link list">
 | 
				
			||||||
										<a class="item ref-in-new-issue" href="{{.RepoLink}}/issues/new?body={{URLJoin AppUrl .RepoLink}}/src/commit/{{.CommitID}}/{{EscapePound .TreePath}}">{{.i18n.Tr "repo.issues.context.reference_issue"}}</a>
 | 
														<a class="item ref-in-new-issue" href="{{.RepoLink}}/issues/new?body={{URLJoin AppUrl .RepoLink}}/src/commit/{{.CommitID}}/{{EscapePound .TreePath}}">{{.i18n.Tr "repo.issues.context.reference_issue"}}</a>
 | 
				
			||||||
									</div>
 | 
					 | 
				
			||||||
								</div>
 | 
													</div>
 | 
				
			||||||
 | 
												{{end}}
 | 
				
			||||||
 | 
												<div class="ui link list">
 | 
				
			||||||
 | 
													<a data-clipboard-text="{{URLJoin AppUrl .RepoLink}}/src/commit/{{.CommitID}}/{{EscapePound .TreePath}}" class="item copy-line-permalink">{{.i18n.Tr "repo.file_copy_permalink"}}</a>
 | 
				
			||||||
							</div>
 | 
												</div>
 | 
				
			||||||
						</div>
 | 
											</div>
 | 
				
			||||||
					{{end}}
 | 
										</div>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
				{{end}}
 | 
									{{end}}
 | 
				
			||||||
			{{end}}
 | 
								{{end}}
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2917,6 +2917,27 @@ function deSelect() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function selectRange($list, $select, $from) {
 | 
					function selectRange($list, $select, $from) {
 | 
				
			||||||
  $list.removeClass('active');
 | 
					  $list.removeClass('active');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // add hashchange to permalink
 | 
				
			||||||
 | 
					  const $issue = $('a.ref-in-new-issue');
 | 
				
			||||||
 | 
					  const $copyPermalink = $('a.copy-line-permalink');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ($issue.length === 0 || $copyPermalink.length === 0) {
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const updateIssueHref = function(anchor) {
 | 
				
			||||||
 | 
					    let href = $issue.attr('href');
 | 
				
			||||||
 | 
					    href = `${href.replace(/%23L\d+$|%23L\d+-L\d+$/, '')}%23${anchor}`;
 | 
				
			||||||
 | 
					    $issue.attr('href', href);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const updateCopyPermalinkHref = function(anchor) {
 | 
				
			||||||
 | 
					    let link = $copyPermalink.attr('data-clipboard-text');
 | 
				
			||||||
 | 
					    link = `${link.replace(/#L\d+$|#L\d+-L\d+$/, '')}#${anchor}`;
 | 
				
			||||||
 | 
					    $copyPermalink.attr('data-clipboard-text', link);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ($from) {
 | 
					  if ($from) {
 | 
				
			||||||
    let a = parseInt($select.attr('rel').substr(1));
 | 
					    let a = parseInt($select.attr('rel').substr(1));
 | 
				
			||||||
    let b = parseInt($from.attr('rel').substr(1));
 | 
					    let b = parseInt($from.attr('rel').substr(1));
 | 
				
			||||||
@@ -2934,38 +2955,16 @@ function selectRange($list, $select, $from) {
 | 
				
			|||||||
      $list.filter(classes.join(',')).addClass('active');
 | 
					      $list.filter(classes.join(',')).addClass('active');
 | 
				
			||||||
      changeHash(`#L${a}-L${b}`);
 | 
					      changeHash(`#L${a}-L${b}`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // add hashchange to permalink
 | 
					      updateIssueHref(`L${a}-L${b}`);
 | 
				
			||||||
      const $issue = $('a.ref-in-new-issue');
 | 
					      updateCopyPermalinkHref(`L${a}-L${b}`);
 | 
				
			||||||
 | 
					 | 
				
			||||||
      if ($issue.length === 0) {
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      const matched = $issue.attr('href').match(/%23L\d+$|%23L\d+-L\d+$/);
 | 
					 | 
				
			||||||
      if (matched) {
 | 
					 | 
				
			||||||
        $issue.attr('href', $issue.attr('href').replace($issue.attr('href').substr(matched.index), `%23L${a}-L${b}`));
 | 
					 | 
				
			||||||
      } else {
 | 
					 | 
				
			||||||
        $issue.attr('href', `${$issue.attr('href')}%23L${a}-L${b}`);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  $select.addClass('active');
 | 
					  $select.addClass('active');
 | 
				
			||||||
  changeHash(`#${$select.attr('rel')}`);
 | 
					  changeHash(`#${$select.attr('rel')}`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // add hashchange to permalink
 | 
					  updateIssueHref($select.attr('rel'));
 | 
				
			||||||
  const $issue = $('a.ref-in-new-issue');
 | 
					  updateCopyPermalinkHref($select.attr('rel'));
 | 
				
			||||||
 | 
					 | 
				
			||||||
  if ($issue.length === 0) {
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const matched = $issue.attr('href').match(/%23L\d+$|%23L\d+-L\d+$/);
 | 
					 | 
				
			||||||
  if (matched) {
 | 
					 | 
				
			||||||
    $issue.attr('href', $issue.attr('href').replace($issue.attr('href').substr(matched.index), `%23${$select.attr('rel')}`));
 | 
					 | 
				
			||||||
  } else {
 | 
					 | 
				
			||||||
    $issue.attr('href', `${$issue.attr('href')}%23${$select.attr('rel')}`);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(() => {
 | 
					$(() => {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user