diff --git a/apps/frontend/src/components/ui/ProjectDownloadModal/DownloadProject.vue b/apps/frontend/src/components/ui/ProjectDownloadModal/DownloadProject.vue index f18558539e..a2be1e610f 100644 --- a/apps/frontend/src/components/ui/ProjectDownloadModal/DownloadProject.vue +++ b/apps/frontend/src/components/ui/ProjectDownloadModal/DownloadProject.vue @@ -209,6 +209,11 @@ const userSelectedPlatform = ref(props.initialPlatform) const userSelectedCompatibleVersionId = ref(null) const showAllVersions = ref(defaultShowAllVersions()) const versionFilter = ref('') +const preferredPlatformRanks = new Map([ + ['fabric', 0], + ['forge', 1], + ['neoforge', 2], +]) const incompatibleGameVersionsSet = computed(() => new Set(props.incompatibleGameVersions)) const incompatibleLoadersSet = computed(() => new Set(props.incompatibleLoaders)) @@ -336,13 +341,12 @@ const gameVersionOptions = computed[]>(() => { const platformOptions = computed[]>(() => { return props.project.loaders - .slice() - .reverse() .map((platform) => ({ value: platform, label: loaderLabel(platform), class: '!px-0 !py-1', })) + .sort(comparePlatformOptions) }) const filteredVersions = computed(() => { @@ -503,6 +507,18 @@ function loaderLabel(loader: string) { return formatMessage(getTagMessage(loader, 'loader') ?? messages.unknownLoader) } +function comparePlatformOptions( + a: ComboboxOption, + b: ComboboxOption, +) { + const aRank = preferredPlatformRanks.get(a.value) ?? Number.MAX_SAFE_INTEGER + const bRank = preferredPlatformRanks.get(b.value) ?? Number.MAX_SAFE_INTEGER + + if (aRank !== bRank) return aRank - bRank + + return a.label.localeCompare(b.label) +} + function isReleaseGameVersion(version: string) { if (releaseVersions.value.has(version)) return true if (nonReleaseVersions.value.has(version)) return false