|
207 | 207 | class="version-page__dependencies universal-card" |
208 | 208 | > |
209 | 209 | <h3>Dependencies</h3> |
210 | | - <div |
211 | | - v-for="(dependency, index) in sortedDeps.filter((x) => !x.file_name)" |
212 | | - :key="index" |
213 | | - class="dependency" |
214 | | - :class="{ 'button-transparent': !isEditing }" |
215 | | - @click="!isEditing ? router.push(dependency.link) : {}" |
216 | | - > |
217 | | - <Avatar |
218 | | - :src="dependency.project ? dependency.project.icon_url : null" |
219 | | - alt="dependency-icon" |
220 | | - size="sm" |
221 | | - /> |
222 | | - <nuxt-link v-if="!isEditing" :to="dependency.link" class="info"> |
223 | | - <span class="project-title"> |
224 | | - {{ dependency.project ? dependency.project.title : 'Unknown Project' }} |
225 | | - </span> |
226 | | - <span v-if="dependency.version" class="dep-type" :class="dependency.dependency_type"> |
227 | | - Version {{ dependency.version.version_number }} is |
228 | | - {{ dependency.dependency_type }} |
229 | | - </span> |
230 | | - <span v-else class="dep-type" :class="dependency.dependency_type"> |
231 | | - {{ dependency.dependency_type }} |
232 | | - </span> |
233 | | - </nuxt-link> |
234 | | - <div v-else class="info"> |
235 | | - <span class="project-title"> |
236 | | - {{ dependency.project ? dependency.project.title : 'Unknown Project' }} |
237 | | - </span> |
238 | | - <span v-if="dependency.version" class="dep-type" :class="dependency.dependency_type"> |
239 | | - Version {{ dependency.version.version_number }} is |
240 | | - {{ dependency.dependency_type }} |
241 | | - </span> |
242 | | - <span v-else class="dep-type" :class="dependency.dependency_type"> |
243 | | - {{ dependency.dependency_type }} |
244 | | - </span> |
| 210 | + |
| 211 | + <div v-if="dependenciesLoading"><SpinnerIcon /> Loading dependencies...</div> |
| 212 | + |
| 213 | + <template v-if="!dependenciesLoading"> |
| 214 | + <div |
| 215 | + v-for="(dependency, index) in sortedDeps.filter((x) => !x.file_name)" |
| 216 | + :key="index" |
| 217 | + class="dependency" |
| 218 | + :class="{ 'button-transparent': !isEditing }" |
| 219 | + @click="!isEditing ? router.push(dependency.link) : {}" |
| 220 | + > |
| 221 | + <Avatar |
| 222 | + :src="dependency.project ? dependency.project.icon_url : null" |
| 223 | + alt="dependency-icon" |
| 224 | + size="sm" |
| 225 | + /> |
| 226 | + <nuxt-link v-if="!isEditing" :to="dependency.link" class="info"> |
| 227 | + <span class="project-title"> |
| 228 | + {{ dependency.project ? dependency.project.title : 'Unknown Project' }} |
| 229 | + </span> |
| 230 | + <span v-if="dependency.version" class="dep-type" :class="dependency.dependency_type"> |
| 231 | + Version {{ dependency.version.version_number }} is |
| 232 | + {{ dependency.dependency_type }} |
| 233 | + </span> |
| 234 | + <span v-else class="dep-type" :class="dependency.dependency_type"> |
| 235 | + {{ dependency.dependency_type }} |
| 236 | + </span> |
| 237 | + </nuxt-link> |
| 238 | + <div v-else class="info"> |
| 239 | + <span class="project-title"> |
| 240 | + {{ dependency.project ? dependency.project.title : 'Unknown Project' }} |
| 241 | + </span> |
| 242 | + <span v-if="dependency.version" class="dep-type" :class="dependency.dependency_type"> |
| 243 | + Version {{ dependency.version.version_number }} is |
| 244 | + {{ dependency.dependency_type }} |
| 245 | + </span> |
| 246 | + <span v-else class="dep-type" :class="dependency.dependency_type"> |
| 247 | + {{ dependency.dependency_type }} |
| 248 | + </span> |
| 249 | + </div> |
| 250 | + <ButtonStyled v-if="isEditing && project.project_type !== 'modpack'"> |
| 251 | + <button @click="version.dependencies.splice(index, 1)"> |
| 252 | + <TrashIcon aria-hidden="true" /> |
| 253 | + Remove |
| 254 | + </button> |
| 255 | + </ButtonStyled> |
245 | 256 | </div> |
246 | | - <ButtonStyled v-if="isEditing && project.project_type !== 'modpack'"> |
247 | | - <button @click="version.dependencies.splice(index, 1)"> |
248 | | - <TrashIcon aria-hidden="true" /> |
249 | | - Remove |
250 | | - </button> |
251 | | - </ButtonStyled> |
252 | | - </div> |
253 | | - <div |
254 | | - v-for="(dependency, index) in sortedDeps.filter((x) => x.file_name)" |
255 | | - :key="index" |
256 | | - class="dependency" |
257 | | - > |
258 | | - <Avatar alt="dependency-icon" size="sm" /> |
259 | | - <div class="info"> |
260 | | - <span class="project-title"> |
261 | | - {{ dependency.file_name }} |
262 | | - </span> |
263 | | - <span class="dep-type" :class="dependency.dependency_type">Added via overrides</span> |
| 257 | + |
| 258 | + <div |
| 259 | + v-for="(dependency, index) in sortedDeps.filter((x) => x.file_name)" |
| 260 | + :key="index" |
| 261 | + class="dependency" |
| 262 | + > |
| 263 | + <Avatar alt="dependency-icon" size="sm" /> |
| 264 | + <div class="info"> |
| 265 | + <span class="project-title"> |
| 266 | + {{ dependency.file_name }} |
| 267 | + </span> |
| 268 | + <span class="dep-type" :class="dependency.dependency_type">Added via overrides</span> |
| 269 | + </div> |
264 | 270 | </div> |
265 | | - </div> |
| 271 | + </template> |
266 | 272 | </div> |
267 | 273 | <div class="version-page__files universal-card"> |
268 | 274 | <h3>Files</h3> |
@@ -415,6 +421,7 @@ import { |
415 | 421 | ReportIcon, |
416 | 422 | RightArrowIcon, |
417 | 423 | SaveIcon, |
| 424 | + SpinnerIcon, |
418 | 425 | StarIcon, |
419 | 426 | TrashIcon, |
420 | 427 | XIcon, |
@@ -465,6 +472,7 @@ const { |
465 | 472 | versions: contextVersions, |
466 | 473 | loadVersions, |
467 | 474 | dependencies: contextDependencies, |
| 475 | + dependenciesLoading: contextDependenciesLoading, |
468 | 476 | loadDependencies, |
469 | 477 | invalidate, |
470 | 478 | } = injectProjectPageContext() |
@@ -494,6 +502,11 @@ const showKnownErrors = ref(false) |
494 | 502 | const shouldPreventActions = ref(false) |
495 | 503 | const uploadedImageIds = ref<string[]>([]) |
496 | 504 |
|
| 505 | +const dependenciesMetaLoading = ref(true) |
| 506 | +const dependenciesLoading = computed( |
| 507 | + () => contextDependenciesLoading.value || dependenciesMetaLoading.value, |
| 508 | +) |
| 509 | +
|
497 | 510 | // File types constant |
498 | 511 | const fileTypes = ref([ |
499 | 512 | { |
@@ -640,24 +653,32 @@ alternateFile.value = version.value.files?.find( |
640 | 653 | ) |
641 | 654 |
|
642 | 655 | // Process dependencies |
643 | | -const deps = contextDependencies.value ?? { projects: [], versions: [] } |
644 | | -for (const dependency of version.value.dependencies ?? []) { |
645 | | - dependency.version = deps.versions.find((x: any) => x.id === dependency.version_id) |
| 656 | +watch( |
| 657 | + [contextDependencies], |
| 658 | + () => { |
| 659 | + const deps = contextDependencies.value ?? { projects: [], versions: [] } |
646 | 660 |
|
647 | | - if (dependency.version) { |
648 | | - dependency.project = deps.projects.find((x: any) => x.id === dependency.version.project_id) |
649 | | - } |
| 661 | + for (const dependency of version.value.dependencies ?? []) { |
| 662 | + dependency.version = deps.versions.find((x: any) => x.id === dependency.version_id) |
650 | 663 |
|
651 | | - if (!dependency.project) { |
652 | | - dependency.project = deps.projects.find((x: any) => x.id === dependency.project_id) |
653 | | - } |
| 664 | + if (dependency.version) { |
| 665 | + dependency.project = deps.projects.find((x: any) => x.id === dependency.version.project_id) |
| 666 | + } |
654 | 667 |
|
655 | | - dependency.link = dependency.project |
656 | | - ? `/${dependency.project.project_type}/${dependency.project.slug ?? dependency.project.id}${ |
657 | | - dependency.version ? `/version/${encodeURI(dependency.version.version_number)}` : '' |
658 | | - }` |
659 | | - : '' |
660 | | -} |
| 668 | + if (!dependency.project) { |
| 669 | + dependency.project = deps.projects.find((x: any) => x.id === dependency.project_id) |
| 670 | + } |
| 671 | +
|
| 672 | + dependency.link = dependency.project |
| 673 | + ? `/${dependency.project.project_type}/${dependency.project.slug ?? dependency.project.id}${ |
| 674 | + dependency.version ? `/version/${encodeURI(dependency.version.version_number)}` : '' |
| 675 | + }` |
| 676 | + : '' |
| 677 | + } |
| 678 | + dependenciesMetaLoading.value = false |
| 679 | + }, |
| 680 | + { deep: true, immediate: true }, |
| 681 | +) |
661 | 682 |
|
662 | 683 | oldFileTypes.value = (version.value.files ?? []).map( |
663 | 684 | (x: any) => fileTypes.value.find((y) => y.value === x.file_type) ?? null, |
|
0 commit comments