mirror of
https://github.com/modrinth/code.git
synced 2026-08-31 12:05:53 +00:00
feat: polish loading state and tooltip
This commit is contained in:
@@ -119,6 +119,7 @@ const dependencyVersionIds = computed<string[]>(() => {
|
|||||||
return [
|
return [
|
||||||
...new Set(
|
...new Set(
|
||||||
visibleResolvedDependencies.value
|
visibleResolvedDependencies.value
|
||||||
|
.filter((dependency) => !('reason' in dependency))
|
||||||
.map((dependency) => dependency.version_id)
|
.map((dependency) => dependency.version_id)
|
||||||
.filter((versionId): versionId is string => !!versionId),
|
.filter((versionId): versionId is string => !!versionId),
|
||||||
),
|
),
|
||||||
@@ -186,14 +187,41 @@ const dependenciesByParentVersionId = computed(() => {
|
|||||||
return map
|
return map
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const dependenciesLoaded = computed(() => {
|
||||||
|
if (!shouldResolveDependencies.value) return false
|
||||||
|
if (!dependencyResolution.value) return false
|
||||||
|
if (
|
||||||
|
dependencyResolution.value.primary.version_id &&
|
||||||
|
dependencyResolution.value.primary.version_id !== props.selectedVersion?.id
|
||||||
|
) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
!dependencyVersionIds.value.every((versionId) => dependencyVersionById.value.has(versionId))
|
||||||
|
) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
!dependencyProjectIds.value.every((projectId) => dependencyProjectById.value.has(projectId))
|
||||||
|
) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
|
||||||
const resolvedDependencyRows = computed<DownloadDependencyRow[]>(() => {
|
const resolvedDependencyRows = computed<DownloadDependencyRow[]>(() => {
|
||||||
|
if (!dependenciesLoaded.value) return []
|
||||||
|
|
||||||
const primaryVersionId =
|
const primaryVersionId =
|
||||||
dependencyResolution.value?.primary.version_id || props.selectedVersion?.id
|
dependencyResolution.value?.primary.version_id || props.selectedVersion?.id
|
||||||
if (!primaryVersionId) return []
|
if (!primaryVersionId) return []
|
||||||
|
|
||||||
const dependencies = dependenciesByParentVersionId.value.get(primaryVersionId) || []
|
const dependencies = dependenciesByParentVersionId.value.get(primaryVersionId) || []
|
||||||
|
|
||||||
return dependencies.map((dependency) => createDependencyRow(dependency))
|
return dependencies.flatMap((dependency) => {
|
||||||
|
const row = createDependencyRow(dependency)
|
||||||
|
return row ? [row] : []
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
const dependencyRows = computed<DownloadDependencyRow[]>(
|
const dependencyRows = computed<DownloadDependencyRow[]>(
|
||||||
@@ -208,25 +236,26 @@ function shouldShowDependency(dependency: ResolvedContent) {
|
|||||||
return !('reason' in dependency && dependency.reason === 'quilt_fabric_api')
|
return !('reason' in dependency && dependency.reason === 'quilt_fabric_api')
|
||||||
}
|
}
|
||||||
|
|
||||||
function createDependencyRow(dependency: ResolvedContent): DownloadDependencyRow {
|
function createDependencyRow(dependency: ResolvedContent): DownloadDependencyRow | null {
|
||||||
const versionId = dependency.version_id ?? undefined
|
const versionId = dependency.version_id ?? undefined
|
||||||
const version = versionId ? dependencyVersionById.value.get(versionId) : undefined
|
const version = versionId ? dependencyVersionById.value.get(versionId) : undefined
|
||||||
const project = dependencyProjectById.value.get(dependency.project_id)
|
const project = dependencyProjectById.value.get(dependency.project_id)
|
||||||
|
if (!project) return null
|
||||||
|
|
||||||
const primaryFile = primaryFileForVersion(version)
|
const primaryFile = primaryFileForVersion(version)
|
||||||
const unavailableTooltip =
|
const unavailableTooltip =
|
||||||
'reason' in dependency && dependency.reason
|
'reason' in dependency && dependency.reason
|
||||||
? skippedReasonLabel(dependency.reason)
|
? skippedReasonLabel(dependency.reason)
|
||||||
: formatMessage(messages.unavailableDependency)
|
: formatMessage(messages.unavailableDependency)
|
||||||
const name =
|
const name = project.title
|
||||||
project?.title || version?.name || version?.version_number || versionId || dependency.project_id
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
key: `${dependency.project_id}-${versionId ?? 'unresolved'}-${
|
key: `${dependency.project_id}-${versionId ?? 'unresolved'}-${
|
||||||
'reason' in dependency ? dependency.reason : 'resolved'
|
'reason' in dependency ? dependency.reason : 'resolved'
|
||||||
}`,
|
}`,
|
||||||
name,
|
name,
|
||||||
icon: project?.icon_url,
|
icon: project.icon_url ?? undefined,
|
||||||
projectHref: project ? `/${project.project_type}/${project.slug || project.id}` : undefined,
|
projectHref: `/${project.project_type}/${project.slug || project.id}`,
|
||||||
downloadHref:
|
downloadHref:
|
||||||
'reason' in dependency || !primaryFile ? undefined : getDownloadUrl(primaryFile.url),
|
'reason' in dependency || !primaryFile ? undefined : getDownloadUrl(primaryFile.url),
|
||||||
filename: primaryFile?.filename,
|
filename: primaryFile?.filename,
|
||||||
@@ -235,7 +264,10 @@ function createDependencyRow(dependency: ResolvedContent): DownloadDependencyRow
|
|||||||
dependencies: (versionId && dependenciesByParentVersionId.value.get(versionId)
|
dependencies: (versionId && dependenciesByParentVersionId.value.get(versionId)
|
||||||
? dependenciesByParentVersionId.value.get(versionId)!
|
? dependenciesByParentVersionId.value.get(versionId)!
|
||||||
: []
|
: []
|
||||||
).map((subDependency) => createDependencyRow(subDependency)),
|
).flatMap((subDependency) => {
|
||||||
|
const row = createDependencyRow(subDependency)
|
||||||
|
return row ? [row] : []
|
||||||
|
}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="grid w-full grid-cols-1 gap-2 sm:grid-cols-2">
|
<div class="flex w-full gap-2">
|
||||||
<Combobox
|
<Combobox
|
||||||
:model-value="currentGameVersion || undefined"
|
:model-value="currentGameVersion || undefined"
|
||||||
class="w-full"
|
class="w-full"
|
||||||
|
|||||||
@@ -4788,7 +4788,7 @@
|
|||||||
"message": "View version"
|
"message": "View version"
|
||||||
},
|
},
|
||||||
"version.download.download-dependency": {
|
"version.download.download-dependency": {
|
||||||
"message": "Select a dependency to download"
|
"message": "Select a version to download"
|
||||||
},
|
},
|
||||||
"version.download.no-primary-file": {
|
"version.download.no-primary-file": {
|
||||||
"message": "Error: No primary file found"
|
"message": "Error: No primary file found"
|
||||||
|
|||||||
@@ -993,7 +993,7 @@ const messages = defineMessages({
|
|||||||
},
|
},
|
||||||
downloadProject: {
|
downloadProject: {
|
||||||
id: 'version.download.download-dependency',
|
id: 'version.download.download-dependency',
|
||||||
defaultMessage: 'Select a dependency to download',
|
defaultMessage: 'Select a version to download',
|
||||||
},
|
},
|
||||||
requiredResourcePack: {
|
requiredResourcePack: {
|
||||||
id: 'version.download.required-resource-pack',
|
id: 'version.download.required-resource-pack',
|
||||||
|
|||||||
Reference in New Issue
Block a user