aboutsummaryrefslogtreecommitdiffstats
path: root/web_src/js
diff options
context:
space:
mode:
Diffstat (limited to 'web_src/js')
-rw-r--r--web_src/js/features/clipboard.js7
-rw-r--r--web_src/js/test/setup.js1
-rw-r--r--web_src/js/utils.js7
-rw-r--r--web_src/js/utils.test.js6
4 files changed, 20 insertions, 1 deletions
diff --git a/web_src/js/features/clipboard.js b/web_src/js/features/clipboard.js
index f8486cdc6c..07c439504e 100644
--- a/web_src/js/features/clipboard.js
+++ b/web_src/js/features/clipboard.js
@@ -1,4 +1,5 @@
import {showTemporaryTooltip} from '../modules/tippy.js';
+import {toAbsoluteUrl} from '../utils.js';
const {copy_success, copy_error} = window.config.i18n;
@@ -50,7 +51,11 @@ export function initGlobalCopyToClipboardListener() {
// in case <button data-clipboard-text><svg></button>, so we just search
// up to 3 levels for performance
for (let i = 0; i < 3 && target; i++) {
- const text = target.getAttribute('data-clipboard-text') || document.querySelector(target.getAttribute('data-clipboard-target'))?.value;
+ let txt = target.getAttribute('data-clipboard-text');
+ if (txt && target.getAttribute('data-clipboard-text-type') === 'url') {
+ txt = toAbsoluteUrl(txt);
+ }
+ const text = txt || document.querySelector(target.getAttribute('data-clipboard-target'))?.value;
if (text) {
e.preventDefault();
diff --git a/web_src/js/test/setup.js b/web_src/js/test/setup.js
index 7c208eb0d2..e0e2c71e29 100644
--- a/web_src/js/test/setup.js
+++ b/web_src/js/test/setup.js
@@ -2,4 +2,5 @@ window.config = {
csrfToken: 'test-csrf-token-123456',
pageData: {},
i18n: {},
+ appSubUrl: '',
};
diff --git a/web_src/js/utils.js b/web_src/js/utils.js
index 01c076aeba..b9cd69e15a 100644
--- a/web_src/js/utils.js
+++ b/web_src/js/utils.js
@@ -133,3 +133,10 @@ export function convertImage(blob, mime) {
}
});
}
+
+export function toAbsoluteUrl(relUrl) {
+ if (relUrl.startsWith('http://') || relUrl.startsWith('https://')) {
+ return relUrl;
+ }
+ return `${window.location.origin}${relUrl}`;
+}
diff --git a/web_src/js/utils.test.js b/web_src/js/utils.test.js
index 1df0caa211..4efe916231 100644
--- a/web_src/js/utils.test.js
+++ b/web_src/js/utils.test.js
@@ -2,6 +2,7 @@ import {expect, test} from 'vitest';
import {
basename, extname, isObject, uniq, stripTags, joinPaths, parseIssueHref,
prettyNumber, parseUrl, translateMonth, translateDay, blobToDataURI,
+ toAbsoluteUrl,
} from './utils.js';
test('basename', () => {
@@ -136,3 +137,8 @@ test('blobToDataURI', async () => {
const blob = new Blob([JSON.stringify({test: true})], {type: 'application/json'});
expect(await blobToDataURI(blob)).toEqual('data:application/json;base64,eyJ0ZXN0Ijp0cnVlfQ==');
});
+
+test('toAbsoluteUrl', () => {
+ expect(toAbsoluteUrl('')).toEqual('http://localhost:3000');
+ expect(toAbsoluteUrl('/user/repo')).toEqual('http://localhost:3000/user/repo');
+});