diff --git a/.vscode/settings.json b/.vscode/settings.json index 243953fd4e..d4d338f6dc 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -11,21 +11,21 @@ "source.fixAll.eslint": "explicit", "source.organizeImports": "always" }, - "editor.defaultFormatter": "rvest.vs-code-prettier-eslint", + "editor.defaultFormatter": "esbenp.prettier-vscode", "[vue]": { - "editor.defaultFormatter": "rvest.vs-code-prettier-eslint" + "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[typescript]": { - "editor.defaultFormatter": "rvest.vs-code-prettier-eslint" + "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[javascript]": { - "editor.defaultFormatter": "rvest.vs-code-prettier-eslint" + "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[scss]": { - "editor.defaultFormatter": "rvest.vs-code-prettier-eslint" + "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[css]": { - "editor.defaultFormatter": "rvest.vs-code-prettier-eslint" + "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[rust]": { "editor.defaultFormatter": "rust-lang.rust-analyzer" diff --git a/apps/frontend/.prettierignore b/apps/frontend/.prettierignore index b16cc9509d..3e5316e292 100644 --- a/apps/frontend/.prettierignore +++ b/apps/frontend/.prettierignore @@ -2,6 +2,7 @@ **/dist **/.output **/.data +**/.wrangler src/generated/** src/locales/** src/public/news/feed diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 29173f4a3b..fe4430f078 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -21,7 +21,9 @@ "@nuxtjs/i18n": "^9.0.0", "@types/dompurify": "^3.0.5", "@types/iso-3166-2": "^1.0.4", + "@types/js-yaml": "^4.0.9", "@types/node": "^20.1.0", + "@types/semver": "^7.7.1", "autoprefixer": "^10.4.19", "glob": "^10.2.7", "nuxt": "^3.20.2", diff --git a/apps/frontend/src/components/ui/create-project-version/CreateProjectVersionModal.vue b/apps/frontend/src/components/ui/create-project-version/CreateProjectVersionModal.vue index 98fa4f8632..c918fe974a 100644 --- a/apps/frontend/src/components/ui/create-project-version/CreateProjectVersionModal.vue +++ b/apps/frontend/src/components/ui/create-project-version/CreateProjectVersionModal.vue @@ -1,15 +1,28 @@ diff --git a/apps/frontend/src/components/ui/create-project-version/components/LoaderPicker.vue b/apps/frontend/src/components/ui/create-project-version/components/LoaderPicker.vue index d20af86444..7a037fd12d 100644 --- a/apps/frontend/src/components/ui/create-project-version/components/LoaderPicker.vue +++ b/apps/frontend/src/components/ui/create-project-version/components/LoaderPicker.vue @@ -118,4 +118,17 @@ function groupLoaders(loaders: Labrinth.Tags.v2.Loader[]) { } const groupedLoaders = computed(() => groupLoaders(loaders)) + +onMounted(() => { + if (selectedLoaders.value.length === 0) return + + // Find the first group that contains any of the selected loaders + const groups = groupedLoaders.value + for (const [groupName, loadersInGroup] of Object.entries(groups)) { + if (loadersInGroup.some((loader) => selectedLoaders.value.includes(loader.name))) { + loaderGroup.value = groupName as GroupLabels + break + } + } +}) diff --git a/apps/frontend/src/components/ui/create-project-version/components/McVersionPicker.vue b/apps/frontend/src/components/ui/create-project-version/components/McVersionPicker.vue index 575617a68d..8387f72363 100644 --- a/apps/frontend/src/components/ui/create-project-version/components/McVersionPicker.vue +++ b/apps/frontend/src/components/ui/create-project-version/components/McVersionPicker.vue @@ -66,7 +66,7 @@ import type { Labrinth } from '@modrinth/api-client' import { SearchIcon } from '@modrinth/assets' import { ButtonStyled, Chips } from '@modrinth/ui' import { useMagicKeys } from '@vueuse/core' -import { computed, ref } from 'vue' +import { computed, nextTick, onMounted, ref } from 'vue' type GameVersion = Labrinth.Tags.v2.GameVersion @@ -147,9 +147,15 @@ function groupVersions(gameVersions: GameVersion[]) { ) const getGroupKey = (v: string) => v.split('.').slice(0, 2).join('.') + + const getSnapshotGroupKey = (v: string) => { + const cleanVersion = v.split('-')[0] + return cleanVersion.split('.').slice(0, 2).join('.') + } + const groups: Record = {} - let currentGroupKey = getGroupKey(gameVersions.find((v) => v.major)?.version || '') + let currentGroupKey = getSnapshotGroupKey(gameVersions.find((v) => v.major)?.version || '') gameVersions.forEach((gameVersion) => { if (gameVersion.version_type === 'release') { @@ -157,6 +163,8 @@ function groupVersions(gameVersions: GameVersion[]) { if (!groups[currentGroupKey]) groups[currentGroupKey] = [] groups[currentGroupKey].push(gameVersion.version) } else { + if (!currentGroupKey) currentGroupKey = getSnapshotGroupKey(gameVersion.version) + const key = `${currentGroupKey} ${DEV_RELEASE_KEY}` if (!groups[key]) groups[key] = [] groups[key].push(gameVersion.version) @@ -205,4 +213,27 @@ function compareGroupKeys(a: string, b: string) { function searchFilter(gameVersion: Labrinth.Tags.v2.GameVersion) { return gameVersion.version.toLowerCase().includes(searchQuery.value.toLowerCase()) } + +onMounted(async () => { + if (props.modelValue.length === 0) return + + // Open non-release tab if any non-release versions are selected + const hasNonReleaseVersions = props.gameVersions.some( + (v) => props.modelValue.includes(v.version) && v.version_type !== 'release', + ) + + if (hasNonReleaseVersions) { + versionType.value = 'all' + } + + await nextTick() + const firstSelectedVersion = allVersionsFlat.value.find((v) => props.modelValue.includes(v)) + if (firstSelectedVersion) { + const buttons = Array.from(document.querySelectorAll('button')) + const element = buttons.find((btn) => btn.textContent?.trim() === firstSelectedVersion) + if (element) { + element.scrollIntoView({ behavior: 'smooth', block: 'center' }) + } + } +}) diff --git a/apps/frontend/src/components/ui/create-project-version/components/SuggestedDependencies/SuggestedDependencies.vue b/apps/frontend/src/components/ui/create-project-version/components/SuggestedDependencies/SuggestedDependencies.vue index f92ed38347..0220e2c6a2 100644 --- a/apps/frontend/src/components/ui/create-project-version/components/SuggestedDependencies/SuggestedDependencies.vue +++ b/apps/frontend/src/components/ui/create-project-version/components/SuggestedDependencies/SuggestedDependencies.vue @@ -1,27 +1,24 @@ @@ -32,28 +29,7 @@ import { injectManageVersionContext } from '~/providers/version/manage-version-m import SuggestedDependency from './SuggestedDependency.vue' -export interface SuggestedDependency extends Labrinth.Versions.v3.Dependency { - icon?: string - name?: string - versionName?: string -} - -const props = defineProps<{ - suggestedDependencies: SuggestedDependency[] -}>() - -const { draftVersion } = injectManageVersionContext() - -const visibleDependencies = computed(() => - props.suggestedDependencies - .filter( - (dep) => - !draftVersion.value.dependencies?.some( - (d) => d.project_id === dep.project_id && d.version_id === dep.version_id, - ), - ) - .sort((a, b) => (a.name || '').localeCompare(b.name || '')), -) +const { visibleSuggestedDependencies } = injectManageVersionContext() const emit = defineEmits<{ (e: 'onAddSuggestion', dependency: Labrinth.Versions.v3.Dependency): void diff --git a/apps/frontend/src/components/ui/create-project-version/components/SuggestedDependencies/SuggestedDependency.vue b/apps/frontend/src/components/ui/create-project-version/components/SuggestedDependencies/SuggestedDependency.vue index c3e21f1c3e..bf4a3db4b2 100644 --- a/apps/frontend/src/components/ui/create-project-version/components/SuggestedDependencies/SuggestedDependency.vue +++ b/apps/frontend/src/components/ui/create-project-version/components/SuggestedDependencies/SuggestedDependency.vue @@ -1,6 +1,6 @@