diff --git a/apps/app-frontend/src/locales/en-US/index.json b/apps/app-frontend/src/locales/en-US/index.json index 7371454d4b..9f30bc8269 100644 --- a/apps/app-frontend/src/locales/en-US/index.json +++ b/apps/app-frontend/src/locales/en-US/index.json @@ -431,6 +431,9 @@ "app.project.install-context.install-content-to-instance": { "message": "Install content to instance" }, + "app.project.install-context.world-fallback-name": { + "message": "Instance" + }, "app.settings.developer-mode-enabled": { "message": "Developer mode enabled." }, diff --git a/apps/app-frontend/src/pages/instance/Index.vue b/apps/app-frontend/src/pages/instance/Index.vue index 7b0534caed..9dc0052a04 100644 --- a/apps/app-frontend/src/pages/instance/Index.vue +++ b/apps/app-frontend/src/pages/instance/Index.vue @@ -127,7 +127,6 @@ import { ExternalIcon, EyeIcon, FolderOpenIcon, - TagCategoryGamepad2Icon as Gamepad2Icon, GlobeIcon, HashIcon, MoreVerticalIcon, @@ -136,6 +135,7 @@ import { PlusIcon, SettingsIcon, StopCircleIcon, + TagCategoryGamepad2Icon as Gamepad2Icon, TerminalSquareIcon, TimerIcon, UpdatedIcon, @@ -145,9 +145,9 @@ import { Avatar, formatLoaderLabel, injectNotificationManager, + LoaderIcon as ServerLoaderIcon, NavTabs, PageHeader, - LoaderIcon as ServerLoaderIcon, ServerOnlinePlayers, ServerPing, ServerRecentPlays, diff --git a/apps/frontend/src/locales/en-US/index.json b/apps/frontend/src/locales/en-US/index.json index ecd60ae709..58c6f2a9a2 100644 --- a/apps/frontend/src/locales/en-US/index.json +++ b/apps/frontend/src/locales/en-US/index.json @@ -3326,6 +3326,9 @@ "project.gallery.title": { "message": "Gallery" }, + "project.install-context.back-to-discover": { + "message": "Back to discover" + }, "project.license.error": { "message": "License text could not be retrieved." }, diff --git a/apps/frontend/src/pages/[type]/[project].vue b/apps/frontend/src/pages/[type]/[project].vue index a9eaf9699e..40d54f9257 100644 --- a/apps/frontend/src/pages/[type]/[project].vue +++ b/apps/frontend/src/pages/[type]/[project].vue @@ -427,7 +427,11 @@ class="sticky top-0 z-20 mx-auto max-w-[80rem] border-0 border-solid border-divider bg-surface-1 px-6 pt-4" :class="[isInstallHeaderStuck ? 'border-t' : '']" > - + { ? (project.value?.actualProjectType ?? project.value?.project_type ?? 'mod') : (routeProjectType.value ?? project.value?.actualProjectType ?? 'mod') - return `/discover/${discoverType}s${getInstallContextQueryString([ - 'sid', - 'wid', - 'from', - 'shi', - ])}` + return `/discover/${discoverType}s${getInstallContextQueryString(['sid', 'wid', 'from', 'shi'])}` }) const projectInstallContext = computed(() => { const context = serverBrowseInstallContext.value diff --git a/packages/api-client/src/modules/archon/servers/v0.ts b/packages/api-client/src/modules/archon/servers/v0.ts index 7cf2c3418b..8dee490de6 100644 --- a/packages/api-client/src/modules/archon/servers/v0.ts +++ b/packages/api-client/src/modules/archon/servers/v0.ts @@ -101,10 +101,7 @@ export class ArchonServersV0Module extends AbstractModule { * Send a power action to a server (Start, Stop, Restart, Kill) * POST /modrinth/v0/servers/:id/power */ - public async power( - serverId: string, - action: Archon.Servers.v0.PowerAction, - ): Promise { + public async power(serverId: string, action: Archon.Servers.v0.PowerAction): Promise { await this.client.request(`/servers/${serverId}/power`, { api: 'archon', method: 'POST', diff --git a/packages/ui/src/components/flows/creation-flow-modal/components/FinalConfigStage.vue b/packages/ui/src/components/flows/creation-flow-modal/components/FinalConfigStage.vue index d624cd40a4..2db0936bf2 100644 --- a/packages/ui/src/components/flows/creation-flow-modal/components/FinalConfigStage.vue +++ b/packages/ui/src/components/flows/creation-flow-modal/components/FinalConfigStage.vue @@ -285,7 +285,7 @@ const messages = defineMessages({ }, beforeResetServerBackupName: { id: 'creation-flow.modal.final-config.backup.before-reset-server.name', - defaultMessage: 'Before reset server', + defaultMessage: 'Before reset instance', }, }) diff --git a/packages/ui/src/components/flows/creation-flow-modal/creation-flow-context.ts b/packages/ui/src/components/flows/creation-flow-modal/creation-flow-context.ts index 9582c4df8a..d2d9860bcc 100644 --- a/packages/ui/src/components/flows/creation-flow-modal/creation-flow-context.ts +++ b/packages/ui/src/components/flows/creation-flow-modal/creation-flow-context.ts @@ -46,7 +46,7 @@ export const creationFlowMessages = defineMessages({ }, resetServerTitle: { id: 'creation-flow.title.reset-server', - defaultMessage: 'Reset server', + defaultMessage: 'Reset instance', }, createInstanceTitle: { id: 'creation-flow.title.create-instance', diff --git a/packages/ui/src/components/flows/creation-flow-modal/stages/final-config-stage.ts b/packages/ui/src/components/flows/creation-flow-modal/stages/final-config-stage.ts index 15884f6b1f..277f6cfa71 100644 --- a/packages/ui/src/components/flows/creation-flow-modal/stages/final-config-stage.ts +++ b/packages/ui/src/components/flows/creation-flow-modal/stages/final-config-stage.ts @@ -42,7 +42,7 @@ export const stageConfig: StageConfigInput = { const label = isWorld ? ctx.formatMessage(creationFlowMessages.createWorldButton) : isReset - ? ctx.formatMessage(commonMessages.resetServerButton) + ? ctx.formatMessage(creationFlowMessages.resetServerTitle) : isOnboarding ? ctx.formatMessage(creationFlowMessages.setupServerButton) : ctx.formatMessage(commonMessages.continueButton) diff --git a/packages/ui/src/components/servers/ServerInstanceSettingsModal.vue b/packages/ui/src/components/servers/ServerInstanceSettingsModal.vue new file mode 100644 index 0000000000..06c913461a --- /dev/null +++ b/packages/ui/src/components/servers/ServerInstanceSettingsModal.vue @@ -0,0 +1,246 @@ + + + diff --git a/packages/ui/src/components/servers/ServerSettingsModal.vue b/packages/ui/src/components/servers/ServerSettingsModal.vue index 31ead087ee..4c23baa0f1 100644 --- a/packages/ui/src/components/servers/ServerSettingsModal.vue +++ b/packages/ui/src/components/servers/ServerSettingsModal.vue @@ -10,9 +10,7 @@ import { defineMessage, defineMessages, useVIntl } from '#ui/composables/i18n' import { ServerSettingsAdvancedPage, ServerSettingsGeneralPage, - ServerSettingsInstallationPage, ServerSettingsNetworkPage, - ServerSettingsPropertiesPage, serverSettingsTabDefinitions, type ServerSettingsTabId, } from '#ui/layouts/shared/server-settings' @@ -53,7 +51,7 @@ const messages = defineMessages({ const modal = ref | null>(null) -const { serverId: currentServerId, worldId, server } = injectModrinthServerContext() +const { serverId: currentServerId, server } = injectModrinthServerContext() const currentUserId = ref(null) const currentUserRole = ref(null) @@ -72,9 +70,7 @@ useQuery({ const serverSettingsTabComponentMap = { general: ServerSettingsGeneralPage, - installation: ServerSettingsInstallationPage, network: ServerSettingsNetworkPage, - properties: ServerSettingsPropertiesPage, advanced: ServerSettingsAdvancedPage, } as const @@ -146,12 +142,6 @@ async function show({ serverId, tabIndex, tabId }: ShowOptions) { 'detail', targetServerId, ]) - const cachedFull = queryClient.getQueryData([ - 'servers', - 'v1', - 'detail', - targetServerId, - ]) modal.value?.show() const visibleTabs = tabs.value.filter((tab) => tab.shown !== false) @@ -179,34 +169,8 @@ async function show({ serverId, tabIndex, tabId }: ShowOptions) { ) } - if (!cachedFull) { - fetchPromises.push( - queryClient.fetchQuery({ - queryKey: ['servers', 'v1', 'detail', targetServerId], - queryFn: () => client.archon.servers_v1.get(targetServerId), - }), - ) - } - await Promise.all(fetchPromises) - if (worldId.value) { - queryClient.prefetchQuery({ - queryKey: ['servers', 'properties', 'v1', targetServerId, worldId.value], - queryFn: () => client.archon.properties_v1.getProperties(targetServerId, worldId.value!), - }) - queryClient.prefetchQuery({ - queryKey: ['content', 'list', 'v1', targetServerId, worldId.value], - queryFn: () => - client.archon.content_v1.getAddons(targetServerId, worldId.value!, { - from_modpack: false, - }), - }) - queryClient.prefetchQuery({ - queryKey: ['servers', 'startup', 'v1', targetServerId, worldId.value], - queryFn: () => client.archon.options_v1.getStartup(targetServerId, worldId.value!), - }) - } } catch (error) { console.error(error) addNotification({ diff --git a/packages/ui/src/components/servers/ServerSetupModal.vue b/packages/ui/src/components/servers/ServerSetupModal.vue index bdaba6afa2..f8f03bdb8b 100644 --- a/packages/ui/src/components/servers/ServerSetupModal.vue +++ b/packages/ui/src/components/servers/ServerSetupModal.vue @@ -41,7 +41,7 @@ const { formatMessage } = useVIntl() const messages = defineMessages({ rateLimitTitle: { id: 'servers.setup.rate-limit.title', - defaultMessage: 'Cannot reinstall server', + defaultMessage: 'Cannot reinstall instance', }, rateLimitText: { id: 'servers.setup.rate-limit.text', diff --git a/packages/ui/src/components/servers/admonitions/BackupAdmonition.vue b/packages/ui/src/components/servers/admonitions/BackupAdmonition.vue index beac824d1f..e17a7b8aca 100644 --- a/packages/ui/src/components/servers/admonitions/BackupAdmonition.vue +++ b/packages/ui/src/components/servers/admonitions/BackupAdmonition.vue @@ -118,7 +118,7 @@ const messages = defineMessages({ creatingBackupDescription: { id: 'servers.backups.admonition.creating-backup.description', defaultMessage: - 'Saving world data and server configuration for {backupName}. This can take a few minutes.', + 'Saving instance data and server configuration for {backupName}. This can take a few minutes.', }, backupFailedTitle: { id: 'servers.backups.admonition.backup-failed.title', diff --git a/packages/ui/src/components/servers/index.ts b/packages/ui/src/components/servers/index.ts index 2b3dd1cd54..ddc2b98dd2 100644 --- a/packages/ui/src/components/servers/index.ts +++ b/packages/ui/src/components/servers/index.ts @@ -11,6 +11,7 @@ export { default as ModrinthServersIcon } from './ModrinthServersIcon.vue' export { default as SaveBanner } from './SaveBanner.vue' export * from './server-header' export { default as ServerListEmpty } from './server-list-empty/ServerListEmpty.vue' +export { default as ServerInstanceSettingsModal } from './ServerInstanceSettingsModal.vue' export { type PendingChange, default as ServerListing } from './ServerListing.vue' export { default as ServerSettingsModal } from './ServerSettingsModal.vue' export { default as ServerSetupModal } from './ServerSetupModal.vue' diff --git a/packages/ui/src/components/servers/instances/InstanceCard.vue b/packages/ui/src/components/servers/instances/InstanceCard.vue index b3e0d6e7cf..42c79a0818 100644 --- a/packages/ui/src/components/servers/instances/InstanceCard.vue +++ b/packages/ui/src/components/servers/instances/InstanceCard.vue @@ -146,7 +146,9 @@ - {{ formatMessage(messages.noModpack) }} + {{ + formatMessage(messages.noModpack) + }}
{{ game[0].toUpperCase() + game.slice(1) }} @@ -46,7 +46,7 @@ defineProps<{ const settingsModal = injectServerSettingsModal(null) const settingsLinkTarget = computed(() => { if (settingsModal) { - return () => settingsModal.openServerSettings({ tabId: 'installation' }) + return () => settingsModal.openServerInstanceSettings({ tabId: 'installation' }) } return '' }) diff --git a/packages/ui/src/components/servers/labels/ServerLoaderLabel.vue b/packages/ui/src/components/servers/labels/ServerLoaderLabel.vue index 9478a89a9e..d7bea4f4c1 100644 --- a/packages/ui/src/components/servers/labels/ServerLoaderLabel.vue +++ b/packages/ui/src/components/servers/labels/ServerLoaderLabel.vue @@ -6,7 +6,7 @@
{ if (settingsModal) { - return () => settingsModal.openServerSettings({ tabId: 'installation' }) + return () => settingsModal.openServerInstanceSettings({ tabId: 'installation' }) } return '' }) diff --git a/packages/ui/src/layouts/shared/content-tab/components/modals/ConfirmBulkUpdateModal.vue b/packages/ui/src/layouts/shared/content-tab/components/modals/ConfirmBulkUpdateModal.vue index 92c2863ff7..3c08b4c33c 100644 --- a/packages/ui/src/layouts/shared/content-tab/components/modals/ConfirmBulkUpdateModal.vue +++ b/packages/ui/src/layouts/shared/content-tab/components/modals/ConfirmBulkUpdateModal.vue @@ -15,6 +15,7 @@ :backup-name=" visibleBackupTip ? `Before bulk update (${visibleBackupTip})` : 'Before bulk update' " + :target-type="props.targetType" :shift-click-hint-override="formatMessage(messages.shiftClickHint)" @update:buttons-disabled="buttonsDisabled = $event" /> @@ -88,6 +89,7 @@ const props = defineProps<{ backupTip?: string actionDisabled?: boolean actionDisabledTooltip?: string + targetType?: 'server' | 'instance' }>() const emit = defineEmits<{ diff --git a/packages/ui/src/layouts/shared/content-tab/components/modals/ConfirmDeletionModal.vue b/packages/ui/src/layouts/shared/content-tab/components/modals/ConfirmDeletionModal.vue index d3b6118eff..6fc76a0948 100644 --- a/packages/ui/src/layouts/shared/content-tab/components/modals/ConfirmDeletionModal.vue +++ b/packages/ui/src/layouts/shared/content-tab/components/modals/ConfirmDeletionModal.vue @@ -17,6 +17,7 @@
@@ -75,7 +76,7 @@ const messages = defineMessages({ admonitionBody: { id: 'content.confirm-deletion.admonition-body', defaultMessage: - 'Deleting a mod can permanently affect your world and may cause missing content or unexpected issues when it loads again.', + 'Deleting a mod can permanently affect your instance and may cause missing content or unexpected issues when it starts again.', }, deleteButton: { id: 'content.confirm-deletion.delete-button', @@ -91,12 +92,14 @@ const props = withDefaults( backupTip?: string actionDisabled?: boolean actionDisabledTooltip?: string + targetType?: 'server' | 'instance' }>(), { variant: 'instance', backupTip: undefined, actionDisabled: false, actionDisabledTooltip: undefined, + targetType: undefined, }, ) diff --git a/packages/ui/src/layouts/shared/content-tab/components/modals/ConfirmModpackUpdateModal.vue b/packages/ui/src/layouts/shared/content-tab/components/modals/ConfirmModpackUpdateModal.vue index ffe36eda55..987ae51382 100644 --- a/packages/ui/src/layouts/shared/content-tab/components/modals/ConfirmModpackUpdateModal.vue +++ b/packages/ui/src/layouts/shared/content-tab/components/modals/ConfirmModpackUpdateModal.vue @@ -22,6 +22,7 @@
@@ -68,6 +69,7 @@ const props = defineProps<{ backupTip?: string actionDisabled?: boolean actionDisabledTooltip?: string + targetType?: 'server' | 'instance' }>() const { formatMessage } = useVIntl() diff --git a/packages/ui/src/layouts/shared/content-tab/components/modals/ConfirmReinstallModal.vue b/packages/ui/src/layouts/shared/content-tab/components/modals/ConfirmReinstallModal.vue index d8946e3a5e..8737de50a5 100644 --- a/packages/ui/src/layouts/shared/content-tab/components/modals/ConfirmReinstallModal.vue +++ b/packages/ui/src/layouts/shared/content-tab/components/modals/ConfirmReinstallModal.vue @@ -13,6 +13,7 @@ @@ -75,6 +76,7 @@ const messages = defineMessages({ defineProps<{ server?: boolean backupTip?: string + targetType?: 'server' | 'instance' }>() const emit = defineEmits<{ diff --git a/packages/ui/src/layouts/shared/content-tab/components/modals/ConfirmUnlinkModal.vue b/packages/ui/src/layouts/shared/content-tab/components/modals/ConfirmUnlinkModal.vue index 6d31307e43..d3bd4d753b 100644 --- a/packages/ui/src/layouts/shared/content-tab/components/modals/ConfirmUnlinkModal.vue +++ b/packages/ui/src/layouts/shared/content-tab/components/modals/ConfirmUnlinkModal.vue @@ -13,6 +13,7 @@ @@ -58,6 +59,7 @@ const props = defineProps<{ backupTip?: string actionDisabled?: boolean actionDisabledTooltip?: string + targetType?: 'server' | 'instance' }>() const { formatMessage } = useVIntl() diff --git a/packages/ui/src/layouts/shared/content-tab/components/modals/InlineBackupCreator.vue b/packages/ui/src/layouts/shared/content-tab/components/modals/InlineBackupCreator.vue index f2cb95231f..c702b4fcb6 100644 --- a/packages/ui/src/layouts/shared/content-tab/components/modals/InlineBackupCreator.vue +++ b/packages/ui/src/layouts/shared/content-tab/components/modals/InlineBackupCreator.vue @@ -1,11 +1,7 @@ @@ -1009,13 +1025,7 @@ const messages = defineMessages({ - {{ - formatMessage( - ctx.isServer - ? messages.repairServerDescription - : messages.repairInstanceDescription, - ) - }} + {{ formatMessage(repairDescriptionMessage) }} @@ -1073,6 +1083,7 @@ const messages = defineMessages({ ref="incompatibleContentModal" :variant="form.incompatibleContentVariant.value" :loading="form.isVerifying.value || form.isSaving.value" + :server="ctx.isServer" @confirm-loader-change="form.confirmLoaderChange()" @auto-fix="form.confirmAutoFix()" @disable-conflicts="form.confirmDisableConflicts()" @@ -1087,6 +1098,7 @@ const messages = defineMessages({ :description=" formatMessage(messages.confirmVersionChangeDescription, { gameVersion: form.pendingPreview.value.newGameVersion, + type: ctx.isServer ? 'server' : 'instance', }) " :admonition-header="formatMessage(messages.confirmVersionChangeHeader)" @@ -1094,8 +1106,9 @@ const messages = defineMessages({ :has-unknown-content="form.pendingPreview.value.hasUnknownContent" :confirm-label="formatMessage(messages.confirmVersionChange)" :confirm-icon="SaveIcon" + :target-type="ctx.isServer ? 'server' : 'instance'" :removed-label="formatMessage(messages.removedIncompatible)" - :show-backup-creator="ctx.isServer" + :show-backup-creator="showBackupCreator" @confirm="form.confirmSave()" @cancel="form.cancelPreview()" /> diff --git a/packages/ui/src/layouts/shared/installation-settings/providers/installation-settings.ts b/packages/ui/src/layouts/shared/installation-settings/providers/installation-settings.ts index d411381774..095d27ceb5 100644 --- a/packages/ui/src/layouts/shared/installation-settings/providers/installation-settings.ts +++ b/packages/ui/src/layouts/shared/installation-settings/providers/installation-settings.ts @@ -63,6 +63,12 @@ export interface InstallationSettingsContext { /** True when the linked modpack was uploaded as a local file rather than from Modrinth */ isLocalFile?: boolean | ComputedRef + /** Controls whether destructive installation changes offer inline backups. Defaults to isServer. */ + showBackupCreator?: boolean | ComputedRef + + /** Controls repair description copy separately from the title target. */ + repairDescriptionKind?: 'server' | 'server-instance' | 'app-instance' + repairing?: Ref reinstalling?: Ref diff --git a/packages/ui/src/layouts/shared/server-settings/pages/advanced.vue b/packages/ui/src/layouts/shared/server-settings/pages/advanced.vue index 133342ce11..fe66f3f986 100644 --- a/packages/ui/src/layouts/shared/server-settings/pages/advanced.vue +++ b/packages/ui/src/layouts/shared/server-settings/pages/advanced.vue @@ -2,7 +2,6 @@
-
SFTP @@ -89,7 +88,6 @@ :disabled="!canWriteFiles" @click.stop="togglePasswordVisibility" > - @@ -100,156 +98,28 @@
- - -
-
- - - - -
-
- -
- -
-
- The command that runs when your server is started. -
- - -
-
- Java version -
-
- - - -
- -
-
- The Java version your server runs on. -
- - -
-
- Java runtime -
-
- -
- -
-
- The Java runtime your server will use. -
-