From 6e4abf6e26dd6ebb5d4aea94c665b4091757f645 Mon Sep 17 00:00:00 2001 From: tdgao Date: Thu, 15 Jan 2026 16:35:46 -0700 Subject: [PATCH 001/178] feat: add create server project in dropdown --- apps/frontend/src/layouts/default.vue | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/apps/frontend/src/layouts/default.vue b/apps/frontend/src/layouts/default.vue index 4b3d9ecb98..2990e1b0c0 100644 --- a/apps/frontend/src/layouts/default.vue +++ b/apps/frontend/src/layouts/default.vue @@ -378,7 +378,7 @@ $refs.modal_creation.show(event), }, + { + id: 'new-server-project', + action: (event) => $refs.modal_creation.show(event), + }, { id: 'new-collection', action: (event) => $refs.modal_collection_creation.show(event), @@ -400,10 +404,13 @@ ]" > @@ -112,18 +113,20 @@ const hasUpdateListener = computed(() => typeof instance?.vnode.props?.onUpdate - - + diff --git a/apps/frontend/src/components/ui/project-settings/ServerCompatibilityModal/ServerCompatibilityModal.vue b/apps/frontend/src/components/ui/project-settings/ServerCompatibilityModal/ServerCompatibilityModal.vue index 412c3093a6..d5b0900f40 100644 --- a/apps/frontend/src/components/ui/project-settings/ServerCompatibilityModal/ServerCompatibilityModal.vue +++ b/apps/frontend/src/components/ui/project-settings/ServerCompatibilityModal/ServerCompatibilityModal.vue @@ -3,8 +3,8 @@ ref="modal" :stages="ctx.stageConfigs" :context="ctx" - @hide="handleHide" :fade="ctx.isSwitchingCompatibilityType.value ? 'danger' : 'standard'" + @hide="handleHide" /> @@ -13,9 +13,9 @@ import { injectProjectPageContext, MultiStageModal } from '@modrinth/ui' import type { ComponentExposed } from 'vue-component-type-helpers' import { + type CompatibilityType, createServerCompatibilityContext, provideServerCompatibilityContext, - type CompatibilityType, } from '../../../../providers/manage-server-compatibility-modal' const modal = useTemplateRef>('modal') diff --git a/apps/frontend/src/components/ui/project-settings/ServerCompatibilityModal/stages/SelectCompatibilityType.vue b/apps/frontend/src/components/ui/project-settings/ServerCompatibilityModal/stages/SelectCompatibilityType.vue index 6ccadd6a97..93425e6254 100644 --- a/apps/frontend/src/components/ui/project-settings/ServerCompatibilityModal/stages/SelectCompatibilityType.vue +++ b/apps/frontend/src/components/ui/project-settings/ServerCompatibilityModal/stages/SelectCompatibilityType.vue @@ -35,6 +35,7 @@ import { type CompatibilityType, injectServerCompatibilityContext, } from '~/providers/manage-server-compatibility-modal' + import DataLossWarningBanner from '../DataLossWarningBanner.vue' const ctx = injectServerCompatibilityContext() diff --git a/apps/frontend/src/components/ui/project-settings/ServerCompatibilityModal/stages/SelectPublishedModpack.vue b/apps/frontend/src/components/ui/project-settings/ServerCompatibilityModal/stages/SelectPublishedModpack.vue index d8b4799896..771c5e9cde 100644 --- a/apps/frontend/src/components/ui/project-settings/ServerCompatibilityModal/stages/SelectPublishedModpack.vue +++ b/apps/frontend/src/components/ui/project-settings/ServerCompatibilityModal/stages/SelectPublishedModpack.vue @@ -74,6 +74,7 @@ import { useQuery } from '@tanstack/vue-query' import { computed, ref, watch } from 'vue' import { injectServerCompatibilityContext } from '~/providers/manage-server-compatibility-modal' + import DataLossWarningBanner from '../DataLossWarningBanner.vue' const { selectedProjectId, selectedVersionId } = injectServerCompatibilityContext() diff --git a/apps/frontend/src/components/ui/project-settings/ServerCompatibilityModal/stages/SelectVanillaVersions.vue b/apps/frontend/src/components/ui/project-settings/ServerCompatibilityModal/stages/SelectVanillaVersions.vue index 8044ab6616..3da6c93505 100644 --- a/apps/frontend/src/components/ui/project-settings/ServerCompatibilityModal/stages/SelectVanillaVersions.vue +++ b/apps/frontend/src/components/ui/project-settings/ServerCompatibilityModal/stages/SelectVanillaVersions.vue @@ -37,8 +37,8 @@ import { computed, watch } from 'vue' import McVersionPicker from '~/components/ui/create-project-version/components/McVersionPicker.vue' import { useGeneratedState } from '~/composables/generated' - import { injectServerCompatibilityContext } from '~/providers/manage-server-compatibility-modal' + import DataLossWarningBanner from '../DataLossWarningBanner.vue' const { supportedGameVersions, recommendedGameVersion } = injectServerCompatibilityContext() diff --git a/apps/frontend/src/components/ui/project-settings/ServerCompatibilityModal/stages/UploadCustomModpack.vue b/apps/frontend/src/components/ui/project-settings/ServerCompatibilityModal/stages/UploadCustomModpack.vue index 48dbe31ee1..c3f15a033b 100644 --- a/apps/frontend/src/components/ui/project-settings/ServerCompatibilityModal/stages/UploadCustomModpack.vue +++ b/apps/frontend/src/components/ui/project-settings/ServerCompatibilityModal/stages/UploadCustomModpack.vue @@ -68,6 +68,7 @@ import { ArrowLeftRightIcon, FileIcon } from '@modrinth/assets' import { ButtonStyled, Checkbox, DropzoneFileInput } from '@modrinth/ui' import { injectServerCompatibilityContext } from '~/providers/manage-server-compatibility-modal' + import DataLossWarningBanner from '../DataLossWarningBanner.vue' const ctx = injectServerCompatibilityContext() diff --git a/apps/frontend/src/pages/[type]/[id].vue b/apps/frontend/src/pages/[type]/[id].vue index d98ae0680a..a892e2781c 100644 --- a/apps/frontend/src/pages/[type]/[id].vue +++ b/apps/frontend/src/pages/[type]/[id].vue @@ -832,6 +832,7 @@ diff --git a/apps/frontend/src/pages/[type]/[id]/settings/links.vue b/apps/frontend/src/pages/[type]/[id]/settings/links.vue index beb2bc87c9..56830a103d 100644 --- a/apps/frontend/src/pages/[type]/[id]/settings/links.vue +++ b/apps/frontend/src/pages/[type]/[id]/settings/links.vue @@ -10,7 +10,7 @@ projectV3.value?.minecraft_server !== undefined) -const websiteUrl = ref(projectV3.value?.link_urls?.website?.url ?? '') // TODO_SERVER_PROJECTS, link might use "site" instead +const siteUrl = ref(projectV3.value?.link_urls?.site?.url ?? '') const storeUrl = ref(projectV3.value?.link_urls?.store?.url ?? '') const serverDiscordUrl = ref(projectV3.value?.link_urls?.discord?.url ?? '') +watch( + projectV3, + (newVal) => { + if (newVal) { + siteUrl.value = newVal.link_urls?.site?.url ?? '' + storeUrl.value = newVal.link_urls?.store?.url ?? '' + serverDiscordUrl.value = newVal.link_urls?.discord?.url ?? '' + } + }, + { immediate: true }, +) + const isIssuesUrlCommon = computed(() => { if (!issuesUrl.value || issuesUrl.value.trim().length === 0) return true return isCommonUrl(issuesUrl.value, commonLinkDomains.issues) @@ -363,18 +375,18 @@ const hasChanges = computed(() => { // Server project links const serverPatchData = computed(() => { const data = {} - const originalWebsite = projectV3.value?.link_urls?.website?.url ?? '' + const originalSite = projectV3.value?.link_urls?.site?.url ?? '' const originalStore = projectV3.value?.link_urls?.store?.url ?? '' const originalDiscord = projectV3.value?.link_urls?.discord?.url ?? '' - if (checkDifference(websiteUrl.value, originalWebsite)) { - data.website = websiteUrl.value?.trim() || null + if (siteUrl.value && checkDifference(siteUrl.value, originalSite)) { + data.site = siteUrl.value?.trim() } - if (checkDifference(storeUrl.value, originalStore)) { - data.store = storeUrl.value?.trim() || null + if (storeUrl.value && checkDifference(storeUrl.value, originalStore)) { + data.store = storeUrl.value?.trim() } - if (checkDifference(serverDiscordUrl.value, originalDiscord)) { - data.wiki = serverDiscordUrl.value?.trim() || null + if (serverDiscordUrl.value && checkDifference(serverDiscordUrl.value, originalDiscord)) { + data.discord = serverDiscordUrl.value?.trim() } return data }) @@ -391,7 +403,7 @@ async function saveServerChanges() { await labrinth.projects_v3.edit(project.value.id, { link_urls: linkUpdates, }) - await refreshProject() + await invalidate() addNotification({ title: 'Links updated', text: 'Your server links have been updated.', diff --git a/apps/frontend/src/providers/manage-server-compatibility-modal.ts b/apps/frontend/src/providers/manage-server-compatibility-modal.ts index 425620d653..07e718e3e5 100644 --- a/apps/frontend/src/providers/manage-server-compatibility-modal.ts +++ b/apps/frontend/src/providers/manage-server-compatibility-modal.ts @@ -12,6 +12,7 @@ import JSZip from 'jszip' import type { Ref, ShallowRef } from 'vue' import { markRaw, toRaw } from 'vue' import type { ComponentExposed } from 'vue-component-type-helpers' + import SelectCompatibilityType from '~/components/ui/project-settings/ServerCompatibilityModal/stages/SelectCompatibilityType.vue' import SelectPublishedModpack from '~/components/ui/project-settings/ServerCompatibilityModal/stages/SelectPublishedModpack.vue' import SelectVanillaVersions from '~/components/ui/project-settings/ServerCompatibilityModal/stages/SelectVanillaVersions.vue' diff --git a/packages/assets/generated-icons.ts b/packages/assets/generated-icons.ts index 22569d9b31..005d38e1b9 100644 --- a/packages/assets/generated-icons.ts +++ b/packages/assets/generated-icons.ts @@ -200,6 +200,7 @@ import _SparklesIcon from './icons/sparkles.svg?component' import _SpinnerIcon from './icons/spinner.svg?component' import _StarIcon from './icons/star.svg?component' import _StopCircleIcon from './icons/stop-circle.svg?component' +import _StoreIcon from './icons/store.svg?component' import _StrikethroughIcon from './icons/strikethrough.svg?component' import _SunIcon from './icons/sun.svg?component' import _SunriseIcon from './icons/sunrise.svg?component' @@ -522,6 +523,7 @@ export const SparklesIcon = _SparklesIcon export const SpinnerIcon = _SpinnerIcon export const StarIcon = _StarIcon export const StopCircleIcon = _StopCircleIcon +export const StoreIcon = _StoreIcon export const StrikethroughIcon = _StrikethroughIcon export const SunIcon = _SunIcon export const SunriseIcon = _SunriseIcon diff --git a/packages/assets/icons/store.svg b/packages/assets/icons/store.svg new file mode 100644 index 0000000000..eea90485a9 --- /dev/null +++ b/packages/assets/icons/store.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/packages/ui/src/components/project/ProjectSidebarLinks.vue b/packages/ui/src/components/project/ProjectSidebarLinks.vue index a8206dfa42..adc75ca5a3 100644 --- a/packages/ui/src/components/project/ProjectSidebarLinks.vue +++ b/packages/ui/src/components/project/ProjectSidebarLinks.vue @@ -5,6 +5,8 @@ project.source_url || project.wiki_url || project.discord_url || + project.site_url || + projectV3?.link_urls.store?.url || project.donation_urls.length > 0 " class="flex flex-col gap-3" @@ -53,9 +55,34 @@ {{ formatMessage(messages.discord) }}