Skip to content

Commit b08064e

Browse files
committed
2 parents 49a7be5 + 7f2a3da commit b08064e

10 files changed

Lines changed: 29 additions & 10 deletions

File tree

frontend/src/elements/Sidebar.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import CloseButton from '@/elements/CloseButton.tsx';
2626
import MantineDivider from '@/elements/Divider.tsx';
2727
import Drawer from '@/elements/Drawer.tsx';
2828
import { isAdmin } from '@/lib/permissions.ts';
29+
import { openUrl } from '@/lib/url.ts';
2930
import { useAuth } from '@/providers/AuthProvider.tsx';
3031
import { useTranslations } from '@/providers/TranslationProvider.tsx';
3132
import { useWindows } from '@/providers/WindowProvider.tsx';
@@ -138,7 +139,7 @@ function Link({ to, end, icon, name, title = name, className, activeMatches }: L
138139
type: 'action',
139140
icon: faWindowRestore,
140141
label: t('elements.sidebar.button.openInNewTab', {}),
141-
onClick: () => window.open(to, '_blank'),
142+
onClick: () => openUrl(to),
142143
color: 'gray',
143144
},
144145
]}

frontend/src/lib/url.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
export const openUrl = (url: string, target = '_blank') => {
2+
const anchor = document.createElement('a');
3+
anchor.href = url;
4+
anchor.target = target;
5+
anchor.rel = 'noopener noreferrer';
6+
document.body.appendChild(anchor);
7+
anchor.click();
8+
document.body.removeChild(anchor);
9+
};
10+
111
export const urlIsMissingPort = (url: string) => {
212
try {
313
const parsed = new URL(url);

frontend/src/pages/admin/backupConfigurations/backups/AdminBackupConfigurationBackupRow.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { streamingArchiveFormatLabelMapping } from '@/lib/enums.ts';
1616
import { adminNodeServerBackupSchema } from '@/lib/schemas/admin/nodes.ts';
1717
import { streamingArchiveFormat } from '@/lib/schemas/generic.ts';
1818
import { bytesToString } from '@/lib/size.ts';
19+
import { openUrl } from '@/lib/url.ts';
1920
import { useAdminCan } from '@/plugins/usePermissions.ts';
2021
import { useToast } from '@/providers/ToastProvider.tsx';
2122
import { useTranslations } from '@/providers/TranslationProvider.tsx';
@@ -37,7 +38,7 @@ export default function AdminBackupConfigurationBackupRow({
3738
downloadNodeBackup(backup.node.uuid, backup.uuid, archiveFormat)
3839
.then(({ url }) => {
3940
addToast(t('pages.admin.backupConfigurations.tabs.backups.page.toast.downloadStarted', {}), 'success');
40-
window.open(url, '_blank');
41+
openUrl(url);
4142
})
4243
.catch((msg) => {
4344
addToast(httpErrorToHuman(msg), 'error');

frontend/src/pages/admin/nodes/backups/NodeBackupRow.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import { adminNodeSchema } from '@/lib/schemas/admin/nodes.ts';
3030
import { adminServerBackupSchema } from '@/lib/schemas/admin/servers.ts';
3131
import { streamingArchiveFormat } from '@/lib/schemas/generic.ts';
3232
import { bytesToString } from '@/lib/size.ts';
33+
import { openUrl } from '@/lib/url.ts';
3334
import { useAdminCan } from '@/plugins/usePermissions.ts';
3435
import { useToast } from '@/providers/ToastProvider.tsx';
3536
import { useTranslations } from '@/providers/TranslationProvider.tsx';
@@ -58,7 +59,7 @@ export default function NodeBackupRow({
5859
downloadNodeBackup(node.uuid, backup.uuid, archiveFormat)
5960
.then(({ url }) => {
6061
addToast(t('pages.admin.nodes.tabs.backups.page.toast.downloadStarted', {}), 'success');
61-
window.open(url, '_blank');
62+
openUrl(url);
6263
})
6364
.catch((msg) => {
6465
addToast(httpErrorToHuman(msg), 'error');

frontend/src/pages/admin/servers/backups/AdminServerBackupRow.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import { adminNodeServerBackupSchema } from '@/lib/schemas/admin/nodes.ts';
2727
import { adminServerSchema } from '@/lib/schemas/admin/servers.ts';
2828
import { streamingArchiveFormat } from '@/lib/schemas/generic.ts';
2929
import { bytesToString } from '@/lib/size.ts';
30+
import { openUrl } from '@/lib/url.ts';
3031
import { useAdminCan } from '@/plugins/usePermissions.ts';
3132
import { useToast } from '@/providers/ToastProvider.tsx';
3233
import { useTranslations } from '@/providers/TranslationProvider.tsx';
@@ -52,7 +53,7 @@ export default function AdminServerBackupRow({
5253
downloadNodeBackup(backup.node.uuid, backup.uuid, archiveFormat)
5354
.then(({ url }) => {
5455
addToast(t('pages.admin.nodes.tabs.backups.page.toast.downloadStarted', {}), 'success');
55-
window.open(url, '_blank');
56+
openUrl(url);
5657
})
5758
.catch((msg) => {
5859
addToast(httpErrorToHuman(msg), 'error');

frontend/src/pages/server/backups/BackupRow.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import { queryKeys } from '@/lib/queryKeys.ts';
3333
import { streamingArchiveFormat } from '@/lib/schemas/generic.ts';
3434
import { serverBackupSchema } from '@/lib/schemas/server/backups.ts';
3535
import { bytesProgressString, bytesToString } from '@/lib/size.ts';
36+
import { openUrl } from '@/lib/url.ts';
3637
import { useServerCan } from '@/plugins/usePermissions.ts';
3738
import { SocketEvent } from '@/plugins/useWebsocketEvent.ts';
3839
import { useToast } from '@/providers/ToastProvider.tsx';
@@ -61,7 +62,7 @@ export default function BackupRow({ backup }: { backup: z.infer<typeof serverBac
6162
downloadBackup(server.uuid, backup.uuid, archiveFormat)
6263
.then(({ url }) => {
6364
addToast(t('pages.server.backups.toast.downloadStarted', {}), 'success');
64-
window.open(url, '_blank');
65+
openUrl(url);
6566
})
6667
.catch((msg) => {
6768
addToast(httpErrorToHuman(msg), 'error');

frontend/src/pages/server/files/FileActionBar.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import ActionBar from '@/elements/ActionBar.tsx';
2121
import Button from '@/elements/Button.tsx';
2222
import { ServerCan } from '@/elements/Can.tsx';
2323
import Tooltip from '@/elements/Tooltip.tsx';
24+
import { openUrl } from '@/lib/url.ts';
2425
import FileCopyConflictModal, {
2526
ConflictResolutions,
2627
FileConflict,
@@ -167,7 +168,7 @@ function FileActionBar() {
167168
)
168169
.then(({ url }) => {
169170
addToast(t('pages.server.files.toast.downloadStarted', {}), 'success');
170-
window.open(url);
171+
openUrl(url);
171172
})
172173
.catch((msg) => {
173174
addToast(httpErrorToHuman(msg), 'error');

frontend/src/pages/server/files/FileConnectButton.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { useState } from 'react';
44
import Button from '@/elements/Button.tsx';
55
import { ServerCan } from '@/elements/Can.tsx';
66
import ContextMenu from '@/elements/ContextMenu.tsx';
7+
import { openUrl } from '@/lib/url.ts';
78
import { useAuth } from '@/providers/AuthProvider.tsx';
89
import { useFileManager } from '@/providers/FileManagerProvider.tsx';
910
import { useTranslations } from '@/providers/TranslationProvider.tsx';
@@ -38,7 +39,7 @@ export default function FileConnectButton({ file }: { file?: string }) {
3839
label: t('pages.server.files.button.connectSftp', {}),
3940
onClick: (e) => {
4041
if (e.shiftKey) {
41-
window.open(sftpUrl);
42+
openUrl(sftpUrl);
4243
} else {
4344
setSftpDetailsOpen(true);
4445
}
@@ -49,7 +50,7 @@ export default function FileConnectButton({ file }: { file?: string }) {
4950
type: 'action',
5051
icon: faCode,
5152
label: t('pages.server.files.button.connectVscode', {}),
52-
onClick: () => window.open(vscodeUrl),
53+
onClick: () => openUrl(vscodeUrl),
5354
color: 'gray',
5455
},
5556
]}

frontend/src/pages/server/files/FileMassContextMenu.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import downloadFiles from '@/api/server/files/downloadFiles.ts';
1414
import ContextMenu, { ContextMenuItem } from '@/elements/ContextMenu.tsx';
1515
import { streamingArchiveFormatLabelMapping } from '@/lib/enums.ts';
1616
import { streamingArchiveFormat } from '@/lib/schemas/generic.ts';
17+
import { openUrl } from '@/lib/url.ts';
1718
import { useServerCan } from '@/plugins/usePermissions.ts';
1819
import { useToast } from '@/providers/ToastProvider.tsx';
1920
import { useTranslations } from '@/providers/TranslationProvider.tsx';
@@ -51,7 +52,7 @@ export default function FileMassContextMenu({ children }: FileMassContextMenuPro
5152
)
5253
.then(({ url }) => {
5354
addToast(t('pages.server.files.toast.downloadStarted', {}), 'success');
54-
window.open(url);
55+
openUrl(url);
5556
})
5657
.catch((msg) => {
5758
addToast(httpErrorToHuman(msg), 'error');

frontend/src/pages/server/files/FileRowContextMenu.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { streamingArchiveFormatLabelMapping } from '@/lib/enums.ts';
2424
import { isArchiveType } from '@/lib/files.ts';
2525
import { streamingArchiveFormat } from '@/lib/schemas/generic.ts';
2626
import { serverDirectoryEntrySchema } from '@/lib/schemas/server/files.ts';
27+
import { openUrl } from '@/lib/url.ts';
2728
import { useServerCan } from '@/plugins/usePermissions.ts';
2829
import { useToast } from '@/providers/contexts/toastContext.ts';
2930
import { useWindows } from '@/providers/contexts/windowContext.ts';
@@ -57,7 +58,7 @@ export default function FileRowContextMenu({ file, openMode, children }: FileRow
5758
downloadFiles(server.uuid, store.getState().browsingDirectory, [file.name], file.directory, archiveFormat)
5859
.then(({ url }) => {
5960
addToast(t('pages.server.files.toast.downloadStarted', {}), 'success');
60-
window.open(url);
61+
openUrl(url);
6162
})
6263
.catch((msg) => {
6364
addToast(httpErrorToHuman(msg), 'error');

0 commit comments

Comments
 (0)