feat: virtualize media server dashboard grids

This commit is contained in:
jxxghp
2026-05-13 21:08:59 +08:00
parent 99665c7d79
commit 2e22f6ae86
3 changed files with 39 additions and 9 deletions
+13 -3
View File
@@ -3,6 +3,7 @@ import { ref, onMounted } from 'vue'
import api from '@/api' import api from '@/api'
import type { MediaServerConf, MediaServerPlayItem } from '@/api/types' import type { MediaServerConf, MediaServerPlayItem } from '@/api/types'
import PosterCard from '@/components/cards/PosterCard.vue' import PosterCard from '@/components/cards/PosterCard.vue'
import ProgressiveCardGrid from '@/components/misc/ProgressiveCardGrid.vue'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
// 国际化 // 国际化
@@ -67,9 +68,18 @@ onActivated(() => {
<VCardTitle>{{ t('dashboard.latest') }} - {{ name }}</VCardTitle> <VCardTitle>{{ t('dashboard.latest') }} - {{ name }}</VCardTitle>
</VCardItem> </VCardItem>
<div class="grid gap-4 grid-media-card mx-3 mb-3" tabindex="0"> <ProgressiveCardGrid
<PosterCard v-for="item in data" :key="item.id" :media="item" /> :items="data"
</div> :get-item-key="item => item.id || item.link || item.title"
:min-item-width="144"
:item-aspect-ratio="1.5"
class="mx-3 mb-3"
tabindex="0"
>
<template #default="{ item }">
<PosterCard :media="item" />
</template>
</ProgressiveCardGrid>
</VCard> </VCard>
</template> </template>
</VHover> </VHover>
+13 -3
View File
@@ -2,6 +2,7 @@
import api from '@/api' import api from '@/api'
import type { MediaServerConf, MediaServerLibrary } from '@/api/types' import type { MediaServerConf, MediaServerLibrary } from '@/api/types'
import LibraryCard from '@/components/cards/LibraryCard.vue' import LibraryCard from '@/components/cards/LibraryCard.vue'
import ProgressiveCardGrid from '@/components/misc/ProgressiveCardGrid.vue'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
// 国际化 // 国际化
@@ -69,9 +70,18 @@ onActivated(() => {
</template> </template>
<VCardTitle>{{ t('dashboard.library') }}</VCardTitle> <VCardTitle>{{ t('dashboard.library') }}</VCardTitle>
</VCardItem> </VCardItem>
<div class="grid gap-4 grid-backdrop-card mx-3 mb-3" tabindex="0"> <ProgressiveCardGrid
<LibraryCard v-for="item in libraryList" :key="item.id" :media="item" height="10rem" /> :items="libraryList"
</div> :get-item-key="item => item.id || item.name"
:min-item-width="240"
:estimated-item-height="160"
class="mx-3 mb-3"
tabindex="0"
>
<template #default="{ item }">
<LibraryCard :media="item" height="10rem" />
</template>
</ProgressiveCardGrid>
</VCard> </VCard>
</template> </template>
</VHover> </VHover>
+13 -3
View File
@@ -2,6 +2,7 @@
import api from '@/api' import api from '@/api'
import type { MediaServerConf, MediaServerPlayItem } from '@/api/types' import type { MediaServerConf, MediaServerPlayItem } from '@/api/types'
import BackdropCard from '@/components/cards/BackdropCard.vue' import BackdropCard from '@/components/cards/BackdropCard.vue'
import ProgressiveCardGrid from '@/components/misc/ProgressiveCardGrid.vue'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
// 国际化 // 国际化
@@ -70,9 +71,18 @@ onActivated(() => {
<VCardTitle>{{ t('dashboard.playing') }}</VCardTitle> <VCardTitle>{{ t('dashboard.playing') }}</VCardTitle>
</VCardItem> </VCardItem>
<div class="grid gap-4 grid-backdrop-card mx-3 mb-3" tabindex="0"> <ProgressiveCardGrid
<BackdropCard v-for="item in playingList" :key="item.id" :media="item" height="10rem" /> :items="playingList"
</div> :get-item-key="item => item.id || item.link || item.title"
:min-item-width="240"
:estimated-item-height="160"
class="mx-3 mb-3"
tabindex="0"
>
<template #default="{ item }">
<BackdropCard :media="item" height="10rem" />
</template>
</ProgressiveCardGrid>
</VCard> </VCard>
</template> </template>
</VHover> </VHover>