mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 11:28:24 +00:00 
			
		
		
		
	Fix links for the menus in the view file page (#22795)
This commit is contained in:
		| @@ -110,8 +110,7 @@ | |||||||
| 				</table> | 				</table> | ||||||
| 				<div class="code-line-menu ui vertical pointing menu tippy-target"> | 				<div class="code-line-menu ui vertical pointing menu tippy-target"> | ||||||
| 					{{if $.Permission.CanRead $.UnitTypeIssues}} | 					{{if $.Permission.CanRead $.UnitTypeIssues}} | ||||||
| 						{{/* FIXME: Here we use HTMLURL but not link, see https://github.com/go-gitea/gitea/pull/21986/files#r1096532186*/}} | 						<a class="item ref-in-new-issue" data-url-issue-new="{{.RepoLink}}/issues/new" data-url-param-body-link="{{.Repository.Link}}/src/commit/{{PathEscape .CommitID}}/{{PathEscapeSegments .TreePath}}" rel="nofollow noindex">{{.locale.Tr "repo.issues.context.reference_issue"}}</a> | ||||||
| 						<a class="item ref-in-new-issue" href="{{.RepoLink}}/issues/new?body={{.Repository.HTMLURL}}{{printf "/src/commit/"}}{{PathEscape .CommitID}}/{{PathEscapeSegments .TreePath}}" rel="nofollow noindex">{{.locale.Tr "repo.issues.context.reference_issue"}}</a> |  | ||||||
| 					{{end}} | 					{{end}} | ||||||
| 					<a class="item view_git_blame" href="{{.Repository.Link}}/blame/commit/{{PathEscape .CommitID}}/{{PathEscapeSegments .TreePath}}">{{.locale.Tr "repo.view_git_blame"}}</a> | 					<a class="item view_git_blame" href="{{.Repository.Link}}/blame/commit/{{PathEscape .CommitID}}/{{PathEscapeSegments .TreePath}}">{{.locale.Tr "repo.view_git_blame"}}</a> | ||||||
| 					<a class="item copy-line-permalink" data-url="{{.Repository.Link}}/src/commit/{{PathEscape .CommitID}}/{{PathEscapeSegments .TreePath}}">{{.locale.Tr "repo.file_copy_permalink"}}</a> | 					<a class="item copy-line-permalink" data-url="{{.Repository.Link}}/src/commit/{{PathEscape .CommitID}}/{{PathEscapeSegments .TreePath}}">{{.locale.Tr "repo.file_copy_permalink"}}</a> | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ import {svg} from '../svg.js'; | |||||||
| import {invertFileFolding} from './file-fold.js'; | import {invertFileFolding} from './file-fold.js'; | ||||||
| import {createTippy} from '../modules/tippy.js'; | import {createTippy} from '../modules/tippy.js'; | ||||||
| import {copyToClipboard} from './clipboard.js'; | import {copyToClipboard} from './clipboard.js'; | ||||||
|  | import {toAbsoluteUrl} from '../utils.js'; | ||||||
|  |  | ||||||
| export const singleAnchorRegex = /^#(L|n)([1-9][0-9]*)$/; | export const singleAnchorRegex = /^#(L|n)([1-9][0-9]*)$/; | ||||||
| export const rangeAnchorRegex = /^#(L[1-9][0-9]*)-(L[1-9][0-9]*)$/; | export const rangeAnchorRegex = /^#(L[1-9][0-9]*)-(L[1-9][0-9]*)$/; | ||||||
| @@ -19,17 +20,18 @@ function selectRange($list, $select, $from) { | |||||||
|   $list.removeClass('active'); |   $list.removeClass('active'); | ||||||
|  |  | ||||||
|   // add hashchange to permalink |   // add hashchange to permalink | ||||||
|   const $issue = $('a.ref-in-new-issue'); |   const $refInNewIssue = $('a.ref-in-new-issue'); | ||||||
|   const $copyPermalink = $('a.copy-line-permalink'); |   const $copyPermalink = $('a.copy-line-permalink'); | ||||||
|   const $viewGitBlame = $('a.view_git_blame'); |   const $viewGitBlame = $('a.view_git_blame'); | ||||||
|  |  | ||||||
|   const updateIssueHref = function (anchor) { |   const updateIssueHref = function (anchor) { | ||||||
|     if ($issue.length === 0) { |     if ($refInNewIssue.length === 0) { | ||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|     let href = $issue.attr('href'); |     const urlIssueNew = $refInNewIssue.attr('data-url-issue-new'); | ||||||
|     href = `${href.replace(/%23L\d+$|%23L\d+-L\d+$/, '')}%23${anchor}`; |     const urlParamBodyLink = $refInNewIssue.attr('data-url-param-body-link'); | ||||||
|     $issue.attr('href', href); |     const issueContent = `${toAbsoluteUrl(urlParamBodyLink)}#${anchor}`; // the default content for issue body | ||||||
|  |     $refInNewIssue.attr('href', `${urlIssueNew}?body=${encodeURIComponent(issueContent)}`); | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   const updateViewGitBlameFragment = function (anchor) { |   const updateViewGitBlameFragment = function (anchor) { | ||||||
| @@ -188,7 +190,7 @@ export function initRepoCodeView() { | |||||||
|     currentTarget.closest('tr').outerHTML = blob; |     currentTarget.closest('tr').outerHTML = blob; | ||||||
|   }); |   }); | ||||||
|   $(document).on('click', '.copy-line-permalink', async (e) => { |   $(document).on('click', '.copy-line-permalink', async (e) => { | ||||||
|     const success = await copyToClipboard(e.currentTarget.getAttribute('data-url')); |     const success = await copyToClipboard(toAbsoluteUrl(e.currentTarget.getAttribute('data-url'))); | ||||||
|     if (!success) return; |     if (!success) return; | ||||||
|     document.querySelector('.code-line-button')?._tippy?.hide(); |     document.querySelector('.code-line-button')?._tippy?.hide(); | ||||||
|   }); |   }); | ||||||
|   | |||||||
| @@ -134,9 +134,15 @@ export function convertImage(blob, mime) { | |||||||
|   }); |   }); | ||||||
| } | } | ||||||
|  |  | ||||||
| export function toAbsoluteUrl(relUrl) { | export function toAbsoluteUrl(url) { | ||||||
|   if (relUrl.startsWith('http://') || relUrl.startsWith('https://')) { |   if (url.startsWith('http://') || url.startsWith('https://')) { | ||||||
|     return relUrl; |     return url; | ||||||
|   } |   } | ||||||
|   return `${window.location.origin}${relUrl}`; |   if (url.startsWith('//')) { | ||||||
|  |     return `${window.location.protocol}${url}`; // it's also a somewhat absolute URL (with the current scheme) | ||||||
|  |   } | ||||||
|  |   if (url && !url.startsWith('/')) { | ||||||
|  |     throw new Error('unsupported url, it should either start with / or http(s)://'); | ||||||
|  |   } | ||||||
|  |   return `${window.location.origin}${url}`; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -139,6 +139,11 @@ test('blobToDataURI', async () => { | |||||||
| }); | }); | ||||||
|  |  | ||||||
| test('toAbsoluteUrl', () => { | test('toAbsoluteUrl', () => { | ||||||
|  |   expect(toAbsoluteUrl('//host/dir')).toEqual('http://host/dir'); | ||||||
|  |   expect(toAbsoluteUrl('https://host/dir')).toEqual('https://host/dir'); | ||||||
|  |  | ||||||
|   expect(toAbsoluteUrl('')).toEqual('http://localhost:3000'); |   expect(toAbsoluteUrl('')).toEqual('http://localhost:3000'); | ||||||
|   expect(toAbsoluteUrl('/user/repo')).toEqual('http://localhost:3000/user/repo'); |   expect(toAbsoluteUrl('/user/repo')).toEqual('http://localhost:3000/user/repo'); | ||||||
|  |  | ||||||
|  |   expect(() => toAbsoluteUrl('path')).toThrowError('unsupported'); | ||||||
| }); | }); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user