Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add option to copy line permalink #17145

Merged
merged 10 commits into from
Oct 2, 2021
1 change: 1 addition & 0 deletions options/locale/locale_en-US.ini
Original file line number Diff line number Diff line change
Expand Up @@ -969,6 +969,7 @@ file_view_rendered = View Rendered
file_view_raw = View Raw
file_permalink = Permalink
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.
audio_not_supported_in_browser = Your browser does not support the HTML5 'audio' tag.
stored_lfs = Stored with Git LFS
Expand Down
23 changes: 15 additions & 8 deletions templates/repo/view_file.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -112,17 +112,20 @@
{{end}}
</tbody>
</table>
{{if $.Permission.CanRead $.UnitTypeIssues}}
<div class="code-line-menu ui fluid popup transition hidden">
<div class="ui column relaxed equal height">
<div class="column">
<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>
</div>
<div class="code-line-menu ui fluid popup transition hidden">
<div class="ui column relaxed equal height">
<div class="column">
{{if $.Permission.CanRead $.UnitTypeIssues}}
<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>
</div>
{{end}}
<div class="ui link list">
<a class="item copy-line-permalink" href="{{URLJoin AppUrl .RepoLink}}/src/commit/{{.CommitID}}/{{EscapePound .TreePath}}" onClick="return copyLinkHref(this);">{{.i18n.Tr "repo.file_copy_permalink"}}</a>
</div>
</div>
{{end}}
</div>
</div>
{{end}}
{{end}}
</div>
Expand All @@ -137,4 +140,8 @@ function submitDeleteForm() {
$("#delete-file-form").submit()
}
}
function copyLinkHref(link) {
qwerty287 marked this conversation as resolved.
Show resolved Hide resolved
navigator.clipboard.writeText(link.href);
return false;
}
</script>
57 changes: 31 additions & 26 deletions web_src/js/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2908,6 +2908,33 @@ function deSelect() {

function selectRange($list, $select, $from) {
$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;
}

let updateIssueHref = function(anchor) {
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${anchor}`));
} else {
$issue.attr('href', `${$issue.attr('href')}%23${anchor}`);
}
}

let updateCopyPermalinkHref = function(anchor) {
const matchedPermalink = $copyPermalink.attr('href').match(/#L\d+$|#L\d+-L\d+$/);
if (matchedPermalink) {
$copyPermalink.attr('href', $copyPermalink.attr('href').replace($copyPermalink.attr('href').substr(matchedPermalink.index), `#${anchor}`));
qwerty287 marked this conversation as resolved.
Show resolved Hide resolved
} else {
$copyPermalink.attr('href', `${$copyPermalink.attr('href')}#${anchor}`);
}
}

if ($from) {
let a = parseInt($select.attr('rel').substr(1));
let b = parseInt($from.attr('rel').substr(1));
Expand All @@ -2925,38 +2952,16 @@ function selectRange($list, $select, $from) {
$list.filter(classes.join(',')).addClass('active');
changeHash(`#L${a}-L${b}`);

// add hashchange to permalink
const $issue = $('a.ref-in-new-issue');

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}`);
}
updateIssueHref(`L${a}-L${b}`);
updateCopyPermalinkHref(`L${a}-L${b}`);
return;
}
}
$select.addClass('active');
changeHash(`#${$select.attr('rel')}`);

// add hashchange to permalink
const $issue = $('a.ref-in-new-issue');

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')}`);
}
updateIssueHref($select.attr('rel'));
updateCopyPermalinkHref($select.attr('rel'));
}

$(() => {
Expand Down