From a94e15e27859ce330a12c5e43a007792b86fb336 Mon Sep 17 00:00:00 2001 From: "Calum H. (IMB11)" Date: Mon, 27 Apr 2026 13:02:46 +0100 Subject: [PATCH] feat: world switching page implementation --- .../src/pages/hosting/manage/Worlds.vue | 7 + .../src/pages/hosting/manage/index.js | 3 +- apps/app-frontend/src/routes.js | 8 + .../src/pages/hosting/manage/[id]/worlds.vue | 30 ++ .../ui/src/components/servers/WorldCard.vue | 311 ++++++++++++++++++ .../layouts/wrapped/hosting/manage/root.vue | 122 ++++--- .../layouts/wrapped/hosting/manage/worlds.vue | 288 ++++++++++++++++ packages/ui/src/layouts/wrapped/index.ts | 1 + 8 files changed, 719 insertions(+), 51 deletions(-) create mode 100644 apps/app-frontend/src/pages/hosting/manage/Worlds.vue create mode 100644 apps/frontend/src/pages/hosting/manage/[id]/worlds.vue create mode 100644 packages/ui/src/components/servers/WorldCard.vue create mode 100644 packages/ui/src/layouts/wrapped/hosting/manage/worlds.vue diff --git a/apps/app-frontend/src/pages/hosting/manage/Worlds.vue b/apps/app-frontend/src/pages/hosting/manage/Worlds.vue new file mode 100644 index 0000000000..3df6f264ee --- /dev/null +++ b/apps/app-frontend/src/pages/hosting/manage/Worlds.vue @@ -0,0 +1,7 @@ + + + diff --git a/apps/app-frontend/src/pages/hosting/manage/index.js b/apps/app-frontend/src/pages/hosting/manage/index.js index 0c10b07133..18c803a863 100644 --- a/apps/app-frontend/src/pages/hosting/manage/index.js +++ b/apps/app-frontend/src/pages/hosting/manage/index.js @@ -4,5 +4,6 @@ import Content from './Content.vue' import Files from './Files.vue' import Index from './Index.vue' import Overview from './Overview.vue' +import Worlds from './Worlds.vue' -export { Access, Backups, Content, Files, Index, Overview } +export { Access, Backups, Content, Files, Index, Overview, Worlds } diff --git a/apps/app-frontend/src/routes.js b/apps/app-frontend/src/routes.js index 5764e6fdde..1c70b34d93 100644 --- a/apps/app-frontend/src/routes.js +++ b/apps/app-frontend/src/routes.js @@ -57,6 +57,14 @@ export default new createRouter({ breadcrumb: [{ name: '?Server' }], }, }, + { + path: 'worlds', + name: 'ServerManageWorlds', + component: Hosting.Worlds, + meta: { + breadcrumb: [{ name: '?Server' }], + }, + }, { path: 'files', name: 'ServerManageFiles', diff --git a/apps/frontend/src/pages/hosting/manage/[id]/worlds.vue b/apps/frontend/src/pages/hosting/manage/[id]/worlds.vue new file mode 100644 index 0000000000..5305138f0a --- /dev/null +++ b/apps/frontend/src/pages/hosting/manage/[id]/worlds.vue @@ -0,0 +1,30 @@ + + + diff --git a/packages/ui/src/components/servers/WorldCard.vue b/packages/ui/src/components/servers/WorldCard.vue new file mode 100644 index 0000000000..db1aacf0bf --- /dev/null +++ b/packages/ui/src/components/servers/WorldCard.vue @@ -0,0 +1,311 @@ + + + diff --git a/packages/ui/src/layouts/wrapped/hosting/manage/root.vue b/packages/ui/src/layouts/wrapped/hosting/manage/root.vue index 92f908ea63..4078d4724a 100644 --- a/packages/ui/src/layouts/wrapped/hosting/manage/root.vue +++ b/packages/ui/src/layouts/wrapped/hosting/manage/root.vue @@ -22,8 +22,8 @@ class="flex min-h-[calc(100vh-4rem)] items-center justify-center text-contrast" >

- Your server's node, where your Modrinth Server is physically hosted, is not accessible - at the moment. We are working to resolve the issue as quickly as possible. + {{ formatMessage(messages.nodeUnavailableDescription) }}

- Your data is safe and will not be lost, and your server will be back online as soon as - the issue is resolved. + {{ formatMessage(messages.nodeUnavailableDataDescription) }}

- If reloading does not work initially, please contact Modrinth Support via the chat - bubble in the bottom right corner and we'll be happy to help. + {{ formatMessage(messages.nodeUnavailableSupportDescription) }}

@@ -132,7 +129,7 @@ >
- An internal error occurred while installing your server. Don't fret — try - reinstalling your server, and if the problem persists, please contact Modrinth - support with your server's debug information. + {{ formatMessage(messages.installInternalErrorDescription) }}
- An error occurred while installing your server because Modrinth Hosting does not - support the version of Minecraft or the loader you specified. Try reinstalling - your server with a different version or loader, and if the problem persists, - please contact Modrinth Support with your server's debug information. + {{ formatMessage(messages.installUnsupportedVersionDescription) }}
-
+
- + @@ -271,7 +257,7 @@ @click="openServerSettingsModal('installation')" > - Change Loader + {{ formatMessage(messages.changeLoader) }}
@@ -295,7 +281,7 @@ class="mb-4 flex w-full flex-row items-center gap-4 rounded-2xl bg-bg-red p-4 text-contrast" > - Something went wrong... + {{ formatMessage(messages.websocketError) }}
- Hang on, we're reconnecting to your server. + {{ formatMessage(messages.websocketReconnecting) }}
-

Server data

+

+ {{ formatMessage(messages.serverDataTitle) }} +

{{
 			safeStringify(serverData)
 		}}
@@ -361,6 +349,7 @@ import { TransferIcon, TriangleAlertIcon, UsersIcon, + WorldIcon, XIcon, } from '@modrinth/assets' import { useQuery, useQueryClient } from '@tanstack/vue-query' @@ -493,6 +482,33 @@ const settingsHintMessages = defineMessages({ }, }) +const messages = defineMessages({ + serverSettings: { + id: 'servers.manage.server-settings', + defaultMessage: 'Server settings', + }, + overviewNav: { + id: 'servers.manage.nav.overview', + defaultMessage: 'Overview', + }, + contentNav: { + id: 'servers.manage.nav.content', + defaultMessage: 'Content', + }, + worldsNav: { + id: 'servers.manage.nav.worlds', + defaultMessage: 'Worlds', + }, + filesNav: { + id: 'servers.manage.nav.files', + defaultMessage: 'Files', + }, + backupsNav: { + id: 'servers.manage.nav.backups', + defaultMessage: 'Backups', + }, +}) + // disabled, keeping the animation logic cos it's really nice and we might want to re-enable in future const DISABLE_LOADING_ANIM = true @@ -815,25 +831,31 @@ watch(serverData, (data) => { const navLinks = computed(() => [ { - label: 'Overview', + label: formatMessage(messages.overviewNav), href: `/hosting/manage/${props.serverId}`, icon: LayoutTemplateIcon, subpages: [], }, { - label: 'Content', + label: formatMessage(messages.contentNav), href: `/hosting/manage/${props.serverId}/content`, icon: BoxesIcon, subpages: ['mods', 'datapacks'], }, { - label: 'Files', + label: formatMessage(messages.worldsNav), + href: `/hosting/manage/${props.serverId}/worlds`, + icon: WorldIcon, + subpages: [], + }, + { + label: formatMessage(messages.filesNav), href: `/hosting/manage/${props.serverId}/files`, icon: FolderOpenIcon, subpages: [], }, { - label: 'Backups', + label: formatMessage(messages.backupsNav), href: `/hosting/manage/${props.serverId}/backups`, icon: DatabaseBackupIcon, subpages: [], diff --git a/packages/ui/src/layouts/wrapped/hosting/manage/worlds.vue b/packages/ui/src/layouts/wrapped/hosting/manage/worlds.vue new file mode 100644 index 0000000000..9ec8be03a2 --- /dev/null +++ b/packages/ui/src/layouts/wrapped/hosting/manage/worlds.vue @@ -0,0 +1,288 @@ + + + diff --git a/packages/ui/src/layouts/wrapped/index.ts b/packages/ui/src/layouts/wrapped/index.ts index 0690e1a3c0..38994b8993 100644 --- a/packages/ui/src/layouts/wrapped/index.ts +++ b/packages/ui/src/layouts/wrapped/index.ts @@ -6,3 +6,4 @@ export { default as ServersManageFilesPage } from './hosting/manage/files.vue' export { default as ServersManagePageIndex } from './hosting/manage/index.vue' export { default as ServersManageOverviewPage } from './hosting/manage/overview.vue' export { default as ServersManageRootLayout } from './hosting/manage/root.vue' +export { default as ServersManageWorldsPage } from './hosting/manage/worlds.vue'