From 003c8305a27afd56662bdd8c887f621e31f758c3 Mon Sep 17 00:00:00 2001 From: "Calum H. (IMB11)" Date: Mon, 27 Apr 2026 14:28:06 +0100 Subject: [PATCH] chore: clean up wrapped layout folder structure --- .../admonitions/ServerPanelAdmonitions.vue | 2 +- .../servers/{ => worlds}/WorldCard.vue | 0 packages/ui/src/composables/index.ts | 10 +++++----- .../{hosting => servers}/backups-selection.ts | 0 .../{ => servers}/server-backup.ts | 4 ++-- .../{ => servers}/server-backups-queue.ts | 2 +- .../{ => servers}/server-console.ts | 4 ++-- .../server-manage-core-runtime.ts | 8 ++++---- .../{ => servers}/use-server-image.ts | 18 ++++++++++++----- .../src/layouts/shared/browse-tab/header.vue | 2 +- .../composables/use-inline-backup.ts | 2 +- .../manage/{root.vue => [id]/index.vue} | 6 +++--- .../hosting/manage/{ => [id]}/overview.vue | 0 .../{ => [id]/worlds/[world-id]}/backups.vue | 4 ++-- .../{ => [id]/worlds/[world-id]}/content.vue | 20 +++++++++---------- .../{ => [id]/worlds/[world-id]}/files.vue | 5 ++--- .../worlds/[world-id]/index.vue} | 0 .../{worlds.vue => [id]/worlds/index.vue} | 2 +- packages/ui/src/layouts/wrapped/index.ts | 14 ++++++------- 19 files changed, 55 insertions(+), 48 deletions(-) rename packages/ui/src/components/servers/{ => worlds}/WorldCard.vue (100%) rename packages/ui/src/composables/{hosting => servers}/backups-selection.ts (100%) rename packages/ui/src/composables/{ => servers}/server-backup.ts (91%) rename packages/ui/src/composables/{ => servers}/server-backups-queue.ts (98%) rename packages/ui/src/composables/{ => servers}/server-console.ts (98%) rename packages/ui/src/composables/{ => servers}/server-manage-core-runtime.ts (98%) rename packages/ui/src/composables/{ => servers}/use-server-image.ts (86%) rename packages/ui/src/layouts/wrapped/hosting/manage/{root.vue => [id]/index.vue} (99%) rename packages/ui/src/layouts/wrapped/hosting/manage/{ => [id]}/overview.vue (100%) rename packages/ui/src/layouts/wrapped/hosting/manage/{ => [id]/worlds/[world-id]}/backups.vue (99%) rename packages/ui/src/layouts/wrapped/hosting/manage/{ => [id]/worlds/[world-id]}/content.vue (97%) rename packages/ui/src/layouts/wrapped/hosting/manage/{ => [id]/worlds/[world-id]}/files.vue (98%) rename packages/ui/src/layouts/wrapped/hosting/manage/{world-root.vue => [id]/worlds/[world-id]/index.vue} (100%) rename packages/ui/src/layouts/wrapped/hosting/manage/{worlds.vue => [id]/worlds/index.vue} (99%) diff --git a/packages/ui/src/components/servers/admonitions/ServerPanelAdmonitions.vue b/packages/ui/src/components/servers/admonitions/ServerPanelAdmonitions.vue index 408d97930e..749d77d615 100644 --- a/packages/ui/src/components/servers/admonitions/ServerPanelAdmonitions.vue +++ b/packages/ui/src/components/servers/admonitions/ServerPanelAdmonitions.vue @@ -11,8 +11,8 @@ import InstallingBanner, { type SyncProgress, } from '#ui/components/servers/InstallingBanner.vue' import { defineMessages, useVIntl } from '#ui/composables/i18n' -import { useServerBackupsQueue } from '#ui/composables/server-backups-queue' import { useServerPermissions } from '#ui/composables/server-permissions' +import { useServerBackupsQueue } from '#ui/composables/servers/server-backups-queue.ts' import type { FileOperation } from '#ui/layouts/shared/files-tab/types' import { injectModrinthClient, injectModrinthServerContext } from '#ui/providers' diff --git a/packages/ui/src/components/servers/WorldCard.vue b/packages/ui/src/components/servers/worlds/WorldCard.vue similarity index 100% rename from packages/ui/src/components/servers/WorldCard.vue rename to packages/ui/src/components/servers/worlds/WorldCard.vue diff --git a/packages/ui/src/composables/index.ts b/packages/ui/src/composables/index.ts index 284130a27d..6df5a8b5b4 100644 --- a/packages/ui/src/composables/index.ts +++ b/packages/ui/src/composables/index.ts @@ -11,16 +11,16 @@ export * from './i18n' export * from './i18n-debug' export * from './page-leave-safety' export * from './scroll-indicator' -export * from './server-backup' -export * from './server-backups-queue' -export * from './server-console' -export * from './server-manage-core-runtime' export * from './server-permissions' +export * from './servers/server-backup' +export * from './servers/server-backups-queue' +export * from './servers/server-console' +export * from './servers/server-manage-core-runtime' +export * from './servers/use-server-image' export * from './sticky-observer' export * from './terminal' export * from './use-loading-bar-token' export * from './use-loading-state-core' export * from './use-ready-state' -export * from './use-server-image' export * from './use-server-project' export * from './virtual-scroll' diff --git a/packages/ui/src/composables/hosting/backups-selection.ts b/packages/ui/src/composables/servers/backups-selection.ts similarity index 100% rename from packages/ui/src/composables/hosting/backups-selection.ts rename to packages/ui/src/composables/servers/backups-selection.ts diff --git a/packages/ui/src/composables/server-backup.ts b/packages/ui/src/composables/servers/server-backup.ts similarity index 91% rename from packages/ui/src/composables/server-backup.ts rename to packages/ui/src/composables/servers/server-backup.ts index 4dd75a5467..fe986568a6 100644 --- a/packages/ui/src/composables/server-backup.ts +++ b/packages/ui/src/composables/servers/server-backup.ts @@ -1,7 +1,7 @@ import type { Archon } from '@modrinth/api-client' -import { injectModrinthClient } from '../providers/api-client' -import { injectNotificationManager } from '../providers/web-notifications' +import { injectModrinthClient } from '../../providers/api-client' +import { injectNotificationManager } from '../../providers/web-notifications' export function useServerBackupDownload() { const client = injectModrinthClient() diff --git a/packages/ui/src/composables/server-backups-queue.ts b/packages/ui/src/composables/servers/server-backups-queue.ts similarity index 98% rename from packages/ui/src/composables/server-backups-queue.ts rename to packages/ui/src/composables/servers/server-backups-queue.ts index db1071b8b4..6940f937a3 100644 --- a/packages/ui/src/composables/server-backups-queue.ts +++ b/packages/ui/src/composables/servers/server-backups-queue.ts @@ -4,7 +4,7 @@ import { computed, reactive, type Ref } from 'vue' import { type BusyReason, injectModrinthClient } from '#ui/providers' -import { defineMessage } from './i18n' +import { defineMessage } from '../i18n' type ProgressKey = `${string}:${'create' | 'restore'}` diff --git a/packages/ui/src/composables/server-console.ts b/packages/ui/src/composables/servers/server-console.ts similarity index 98% rename from packages/ui/src/composables/server-console.ts rename to packages/ui/src/composables/servers/server-console.ts index f2675d89d2..45014b646f 100644 --- a/packages/ui/src/composables/server-console.ts +++ b/packages/ui/src/composables/servers/server-console.ts @@ -1,8 +1,8 @@ import { createGlobalState } from '@vueuse/core' import { type Ref, ref, shallowRef, triggerRef } from 'vue' -import { detectLogLevel } from '../layouts/shared/console/composables/log-level' -import type { Log4jEvent, LogLevel, LogLine } from '../layouts/shared/console/types' +import { detectLogLevel } from '../../layouts/shared/console/composables/log-level' +import type { Log4jEvent, LogLevel, LogLine } from '../../layouts/shared/console/types' // Flip to true during development to enable console perf logging. // Uses a plain constant to avoid turbo env-var declarations. diff --git a/packages/ui/src/composables/server-manage-core-runtime.ts b/packages/ui/src/composables/servers/server-manage-core-runtime.ts similarity index 98% rename from packages/ui/src/composables/server-manage-core-runtime.ts rename to packages/ui/src/composables/servers/server-manage-core-runtime.ts index e74799361a..663db01f81 100644 --- a/packages/ui/src/composables/server-manage-core-runtime.ts +++ b/packages/ui/src/composables/servers/server-manage-core-runtime.ts @@ -7,10 +7,10 @@ import { import type { ComputedRef, Ref } from 'vue' import { computed, ref } from 'vue' -import type { FileOperation } from '../layouts/shared/files-tab/types' -import { injectModrinthClient, provideModrinthServerContext } from '../providers' -import type { BusyReason, CancelUploadHandler, ServerStats } from '../providers/server-context' -import { defineMessage } from './i18n' +import type { FileOperation } from '../../layouts/shared/files-tab/types' +import { injectModrinthClient, provideModrinthServerContext } from '../../providers' +import type { BusyReason, CancelUploadHandler, ServerStats } from '../../providers/server-context' +import { defineMessage } from '../i18n' import { useModrinthServersConsole } from './server-console' type ReadableRef = Ref | ComputedRef diff --git a/packages/ui/src/composables/use-server-image.ts b/packages/ui/src/composables/servers/use-server-image.ts similarity index 86% rename from packages/ui/src/composables/use-server-image.ts rename to packages/ui/src/composables/servers/use-server-image.ts index c33018ff5e..40cc38a020 100644 --- a/packages/ui/src/composables/use-server-image.ts +++ b/packages/ui/src/composables/servers/use-server-image.ts @@ -5,6 +5,7 @@ import { computed, type ComputedRef, ref } from 'vue' import { injectModrinthClient } from '#ui/providers' type UpstreamRef = ComputedRef +type ServerIdSource = string | { readonly value: string } type UseServerImageOptions = { enabled?: ComputedRef | boolean @@ -39,7 +40,7 @@ function isNotFound(error: unknown): boolean { } export function useServerImage( - serverId: string, + serverId: ServerIdSource, upstream: UpstreamRef, options: UseServerImageOptions = {}, ) { @@ -47,24 +48,27 @@ export function useServerImage( const localImage = ref(undefined) const iconSize = options.size ?? 512 const includeProjectFallback = options.includeProjectFallback ?? false + const resolvedServerId = computed(() => resolveServerId(serverId)) const queryKey = computed( - () => ['servers', 'detail', serverId, 'icon', upstream.value?.project_id ?? null] as const, + () => + ['servers', 'detail', resolvedServerId.value, 'icon', upstream.value?.project_id ?? null] as const, ) const isEnabled = computed(() => { const explicitEnabled = typeof options.enabled === 'boolean' ? options.enabled : options.enabled?.value - return !!serverId && (explicitEnabled ?? true) + return !!resolvedServerId.value && (explicitEnabled ?? true) }) const { data: remoteImage, refetch } = useQuery({ queryKey, queryFn: async (): Promise => { - if (!serverId) return null + const id = resolvedServerId.value + if (!id) return null try { - const fsAuth = await client.archon.servers_v0.getFilesystemAuth(serverId) + const fsAuth = await client.archon.servers_v0.getFilesystemAuth(id) try { const blob = await client.kyros.files_v0.downloadFileWithAuth(fsAuth, '/server-icon.png') @@ -132,3 +136,7 @@ export function useServerImage( resetLocalOverride, } } + +function resolveServerId(serverId: ServerIdSource): string { + return typeof serverId === 'string' ? serverId : serverId.value +} diff --git a/packages/ui/src/layouts/shared/browse-tab/header.vue b/packages/ui/src/layouts/shared/browse-tab/header.vue index bb976c861a..e933bbdf7f 100644 --- a/packages/ui/src/layouts/shared/browse-tab/header.vue +++ b/packages/ui/src/layouts/shared/browse-tab/header.vue @@ -6,7 +6,7 @@ import { useRouter } from 'vue-router' import Admonition from '#ui/components/base/Admonition.vue' import Avatar from '#ui/components/base/Avatar.vue' import ButtonStyled from '#ui/components/base/ButtonStyled.vue' -import { useServerImage } from '#ui/composables/use-server-image' +import { useServerImage } from '#ui/composables/servers/use-server-image.ts' import { formatLoaderLabel } from '#ui/utils/loaders' import SelectedProjectsLeaveModal from './components/SelectedProjectsLeaveModal.vue' diff --git a/packages/ui/src/layouts/shared/content-tab/composables/use-inline-backup.ts b/packages/ui/src/layouts/shared/content-tab/composables/use-inline-backup.ts index 552a5a61ef..3c473d4859 100644 --- a/packages/ui/src/layouts/shared/content-tab/composables/use-inline-backup.ts +++ b/packages/ui/src/layouts/shared/content-tab/composables/use-inline-backup.ts @@ -1,7 +1,7 @@ import { computed, onBeforeUnmount, ref, watch } from 'vue' import { onBeforeRouteLeave } from 'vue-router' -import { useServerBackupsQueue } from '#ui/composables/server-backups-queue' +import { useServerBackupsQueue } from '#ui/composables/servers/server-backups-queue.ts' import { injectAppBackup, injectModrinthClient, diff --git a/packages/ui/src/layouts/wrapped/hosting/manage/root.vue b/packages/ui/src/layouts/wrapped/hosting/manage/[id]/index.vue similarity index 99% rename from packages/ui/src/layouts/wrapped/hosting/manage/root.vue rename to packages/ui/src/layouts/wrapped/hosting/manage/[id]/index.vue index f3de11aa2b..a0432aef9f 100644 --- a/packages/ui/src/layouts/wrapped/hosting/manage/root.vue +++ b/packages/ui/src/layouts/wrapped/hosting/manage/[id]/index.vue @@ -390,9 +390,9 @@ import { useServerProject, } from '#ui/composables' import { defineMessages, useVIntl } from '#ui/composables/i18n' -import { useServerBackupsQueue } from '#ui/composables/server-backups-queue' -import { useServerManageCoreRuntime } from '#ui/composables/server-manage-core-runtime' import { useServerPanelSync } from '#ui/composables/server-panel-sync' +import { useServerBackupsQueue } from '#ui/composables/servers/server-backups-queue.ts' +import { useServerManageCoreRuntime } from '#ui/composables/servers/server-manage-core-runtime.ts' import type { LogLine } from '#ui/layouts/shared/console' import type { ServerSettingsTabId } from '#ui/layouts/shared/server-settings' import { @@ -409,7 +409,7 @@ import { writePendingServerContentInstalls, } from '#ui/utils/server-content-installing' -import ServerOnboardingPanelPage from './[id]/onboarding.vue' +import ServerOnboardingPanelPage from './onboarding.vue' interface Tab { label: string diff --git a/packages/ui/src/layouts/wrapped/hosting/manage/overview.vue b/packages/ui/src/layouts/wrapped/hosting/manage/[id]/overview.vue similarity index 100% rename from packages/ui/src/layouts/wrapped/hosting/manage/overview.vue rename to packages/ui/src/layouts/wrapped/hosting/manage/[id]/overview.vue diff --git a/packages/ui/src/layouts/wrapped/hosting/manage/backups.vue b/packages/ui/src/layouts/wrapped/hosting/manage/[id]/worlds/[world-id]/backups.vue similarity index 99% rename from packages/ui/src/layouts/wrapped/hosting/manage/backups.vue rename to packages/ui/src/layouts/wrapped/hosting/manage/[id]/worlds/[world-id]/backups.vue index a1279db3e8..d6381322f7 100644 --- a/packages/ui/src/layouts/wrapped/hosting/manage/backups.vue +++ b/packages/ui/src/layouts/wrapped/hosting/manage/[id]/worlds/[world-id]/backups.vue @@ -284,10 +284,10 @@ import BackupDeleteModal from '#ui/components/servers/backups/BackupDeleteModal. import BackupItem from '#ui/components/servers/backups/BackupItem.vue' import BackupRenameModal from '#ui/components/servers/backups/BackupRenameModal.vue' import BackupRestoreModal from '#ui/components/servers/backups/BackupRestoreModal.vue' -import { useBackupsSelection } from '#ui/composables/hosting/backups-selection' +import { useBackupsSelection } from '#ui/composables/servers/backups-selection' import { defineMessages, useVIntl } from '#ui/composables/i18n' -import { useServerBackupsQueue } from '#ui/composables/server-backups-queue' import { useServerPermissions } from '#ui/composables/server-permissions' +import { useServerBackupsQueue } from '#ui/composables/servers/server-backups-queue.ts' import { useBulkOperation } from '#ui/layouts/shared/content-tab/composables/bulk-operations' import { injectModrinthClient, diff --git a/packages/ui/src/layouts/wrapped/hosting/manage/content.vue b/packages/ui/src/layouts/wrapped/hosting/manage/[id]/worlds/[world-id]/content.vue similarity index 97% rename from packages/ui/src/layouts/wrapped/hosting/manage/content.vue rename to packages/ui/src/layouts/wrapped/hosting/manage/[id]/worlds/[world-id]/content.vue index 0c8dd1c03e..bc57431bc7 100644 --- a/packages/ui/src/layouts/wrapped/hosting/manage/content.vue +++ b/packages/ui/src/layouts/wrapped/hosting/manage/[id]/worlds/[world-id]/content.vue @@ -26,25 +26,25 @@ import { } from '#ui/utils/server-content-installing' import { versionChangesGameVersion } from '#ui/utils/version-compatibility' -import type { BrowseInstallPlan } from '../../../shared/browse-tab/composables/install-logic' +import type { BrowseInstallPlan } from '#ui/layouts/shared/browse-tab/composables/install-logic' import { flushStoredServerAddonInstallQueue, getStoredServerAddonInstallQueue, getTargetInstallPreferences, -} from '../../../shared/browse-tab/composables/install-logic' -import ConfirmModpackUpdateModal from '../../../shared/content-tab/components/modals/ConfirmModpackUpdateModal.vue' -import ConfirmUnlinkModal from '../../../shared/content-tab/components/modals/ConfirmUnlinkModal.vue' -import ContentUpdaterModal from '../../../shared/content-tab/components/modals/content-updater-modal/index.vue' -import ModpackContentModal from '../../../shared/content-tab/components/modals/ModpackContentModal.vue' -import ContentPageLayout from '../../../shared/content-tab/layout.vue' -import type { ContentModpackData } from '../../../shared/content-tab/providers/content-manager' -import { provideContentManager } from '../../../shared/content-tab/providers/content-manager' +} from '#ui/layouts/shared/browse-tab/composables/install-logic' +import ConfirmModpackUpdateModal from '#ui/layouts/shared/content-tab/components/modals/ConfirmModpackUpdateModal.vue' +import ConfirmUnlinkModal from '#ui/layouts/shared/content-tab/components/modals/ConfirmUnlinkModal.vue' +import ContentUpdaterModal from '#ui/layouts/shared/content-tab/components/modals/content-updater-modal/index.vue' +import ModpackContentModal from '#ui/layouts/shared/content-tab/components/modals/ModpackContentModal.vue' +import ContentPageLayout from '#ui/layouts/shared/content-tab/layout.vue' +import type { ContentModpackData } from '#ui/layouts/shared/content-tab/providers/content-manager' +import { provideContentManager } from '#ui/layouts/shared/content-tab/providers/content-manager' import type { ContentItem, ContentModpackCardCategory, ContentModpackCardProject, ContentModpackCardVersion, -} from '../../../shared/content-tab/types' +} from '#ui/layouts/shared/content-tab/types' type AddonWithUiState = Archon.Content.v1.Addon & { installing?: boolean } type ContentOwnerAvatarSource = { diff --git a/packages/ui/src/layouts/wrapped/hosting/manage/files.vue b/packages/ui/src/layouts/wrapped/hosting/manage/[id]/worlds/[world-id]/files.vue similarity index 98% rename from packages/ui/src/layouts/wrapped/hosting/manage/files.vue rename to packages/ui/src/layouts/wrapped/hosting/manage/[id]/worlds/[world-id]/files.vue index b62fe58237..c517f247ea 100644 --- a/packages/ui/src/layouts/wrapped/hosting/manage/files.vue +++ b/packages/ui/src/layouts/wrapped/hosting/manage/[id]/worlds/[world-id]/files.vue @@ -16,9 +16,8 @@ import { } from '#ui/providers' import { commonMessages } from '#ui/utils/common-messages' -import FilePageLayout from '../../../shared/files-tab/layout.vue' -import { provideFileManager } from '../../../shared/files-tab/providers/file-manager' -import type { EditingFile, FileItem } from '../../../shared/files-tab/types' +import type { EditingFile, FileItem } from '#ui/layouts/shared/files-tab/index.ts' +import { FilePageLayout, provideFileManager } from '#ui/layouts/shared/files-tab/index.ts' const props = defineProps<{ showDebugInfo?: boolean diff --git a/packages/ui/src/layouts/wrapped/hosting/manage/world-root.vue b/packages/ui/src/layouts/wrapped/hosting/manage/[id]/worlds/[world-id]/index.vue similarity index 100% rename from packages/ui/src/layouts/wrapped/hosting/manage/world-root.vue rename to packages/ui/src/layouts/wrapped/hosting/manage/[id]/worlds/[world-id]/index.vue diff --git a/packages/ui/src/layouts/wrapped/hosting/manage/worlds.vue b/packages/ui/src/layouts/wrapped/hosting/manage/[id]/worlds/index.vue similarity index 99% rename from packages/ui/src/layouts/wrapped/hosting/manage/worlds.vue rename to packages/ui/src/layouts/wrapped/hosting/manage/[id]/worlds/index.vue index 102a97e9d1..4991d1778b 100644 --- a/packages/ui/src/layouts/wrapped/hosting/manage/worlds.vue +++ b/packages/ui/src/layouts/wrapped/hosting/manage/[id]/worlds/index.vue @@ -37,7 +37,7 @@ import { } from '#ui/providers' import { formatLoaderLabel } from '#ui/utils/loaders' -import WorldCard from '#ui/components/servers/WorldCard.vue' +import WorldCard from '#ui/components/servers/worlds/WorldCard.vue' const messages = defineMessages({ worldSlotName: { diff --git a/packages/ui/src/layouts/wrapped/index.ts b/packages/ui/src/layouts/wrapped/index.ts index b8b9ae3c45..f740a010e0 100644 --- a/packages/ui/src/layouts/wrapped/index.ts +++ b/packages/ui/src/layouts/wrapped/index.ts @@ -1,10 +1,10 @@ export { default as ServersManageAccessPage } from './hosting/manage/[id]/access/access.vue' +export { default as ServersManageRootLayout } from './hosting/manage/[id]/index.vue' export { default as ServerOnboardingPanelPage } from './hosting/manage/[id]/onboarding.vue' -export { default as ServersManageBackupsPage } from './hosting/manage/backups.vue' -export { default as ServersManageContentPage } from './hosting/manage/content.vue' -export { default as ServersManageFilesPage } from './hosting/manage/files.vue' +export { default as ServersManageOverviewPage } from './hosting/manage/[id]/overview.vue' +export { default as ServersManageBackupsPage } from './hosting/manage/[id]/worlds/[world-id]/backups.vue' +export { default as ServersManageContentPage } from './hosting/manage/[id]/worlds/[world-id]/content.vue' +export { default as ServersManageFilesPage } from './hosting/manage/[id]/worlds/[world-id]/files.vue' +export { default as ServersManageWorldRootLayout } from './hosting/manage/[id]/worlds/[world-id]/index.vue' +export { default as ServersManageWorldsPage } from './hosting/manage/[id]/worlds/index.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 ServersManageWorldRootLayout } from './hosting/manage/world-root.vue' -export { default as ServersManageWorldsPage } from './hosting/manage/worlds.vue'