diff --git a/app/pages/package/[[org]]/[name]/versions.vue b/app/pages/package/[[org]]/[name]/versions.vue index d8a317f604..b07f8aac92 100644 --- a/app/pages/package/[[org]]/[name]/versions.vue +++ b/app/pages/package/[[org]]/[name]/versions.vue @@ -49,7 +49,7 @@ const distTags = computed(() => versionSummary.value?.distTags ?? {}) const versionStrings = computed(() => versionSummary.value?.versions ?? []) const versionTimes = computed(() => versionSummary.value?.time ?? {}) -// ─── Phase 2: full metadata (loaded on first group expand) ──────────────────── +// ─── Phase 2: full metadata (fired automatically after phase 1 completes) ──── // Fetches deprecated status, provenance, and exact times needed for version rows. const fullVersionMap = shallowRef()) -const loadingGroup = ref(null) const versionGroups = computed(() => { const byKey = new Map() @@ -101,27 +100,42 @@ const versionGroups = computed(() => { })) }) -async function toggleGroup(groupKey: string) { +const deprecatedGroupKeys = computed(() => { + if (!fullVersionMap.value) return new Set() + const result = new Set() + for (const group of versionGroups.value) { + if (group.versions.every(v => !!fullVersionMap.value!.get(v)?.deprecated)) + result.add(group.groupKey) + } + return result +}) + +function toggleGroup(groupKey: string) { if (expandedGroups.value.has(groupKey)) { expandedGroups.value.delete(groupKey) - return + } else { + expandedGroups.value.add(groupKey) } - expandedGroups.value.add(groupKey) - if (!fullVersionMap.value) { - loadingGroup.value = groupKey - try { +} + +watch( + versionSummary, + async summary => { + if (summary) { await ensureFullDataLoaded() - } finally { - loadingGroup.value = null } - } -} + }, + { immediate: true }, +) // ─── Version filter ─────────────────────────────────────────────────────────── const versionFilterInput = ref('') const versionFilter = refDebounced(versionFilterInput, 100) const isFilterActive = computed(() => versionFilter.value.trim() !== '') +const isInvalidRange = computed( + () => isFilterActive.value && validRange(versionFilter.value.trim()) === null, +) const filteredVersionSet = computed(() => { const trimmed = versionFilter.value.trim() @@ -198,14 +212,40 @@ const flatItems = computed(() => { /

{{ $t('package.versions.page_title') }}

- +
+ + + + + + +
@@ -230,18 +270,26 @@ const flatItems = computed(() => { v-for="tag in latestTagRow!.tags.filter(t => t !== 'latest')" :key="tag" class="text-3xs font-semibold uppercase tracking-wide text-fg-subtle" + :title="tag" >{{ tag }} {{ latestTagRow!.version }} - +
+ deprecated (() => { v-for="tag in row.tags" :key="tag" class="text-3xs font-semibold uppercase tracking-wide text-fg-subtle" + :title="tag" >{{ tag }}
@@ -284,30 +333,36 @@ const flatItems = computed(() => { {{ row.version }} - -