mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-05-15 12:28:34 +08:00
增强配置向导功能
This commit is contained in:
@@ -32,6 +32,7 @@ export interface WizardData {
|
||||
name: string
|
||||
config: any
|
||||
sync_libraries: any[]
|
||||
switchs: any[]
|
||||
}
|
||||
notification: {
|
||||
type: string
|
||||
@@ -110,6 +111,7 @@ const wizardData = ref<WizardData>({
|
||||
name: '',
|
||||
config: {},
|
||||
sync_libraries: [],
|
||||
switchs: [],
|
||||
},
|
||||
notification: {
|
||||
type: '',
|
||||
@@ -410,6 +412,7 @@ export function useSetupWizard() {
|
||||
|
||||
// 根据通知类型验证必输项
|
||||
const config = wizardData.value.notification.config || {}
|
||||
alert(wizardData.value.notification.type)
|
||||
switch (wizardData.value.notification.type) {
|
||||
case 'wechat':
|
||||
if (!config.WECHAT_CORPID?.trim()) {
|
||||
|
||||
@@ -117,15 +117,6 @@ const { wizardData, selectDownloader, validationErrors } = useSetupWizard()
|
||||
required
|
||||
/>
|
||||
</VCol>
|
||||
<VCol cols="12" md="6">
|
||||
<VSwitch
|
||||
v-model="wizardData.downloader.config.category"
|
||||
:label="t('downloader.category')"
|
||||
:hint="t('downloader.category')"
|
||||
persistent-hint
|
||||
active
|
||||
/>
|
||||
</VCol>
|
||||
<VCol cols="12" md="6">
|
||||
<VSwitch
|
||||
v-model="wizardData.downloader.config.sequentail"
|
||||
|
||||
@@ -1,9 +1,71 @@
|
||||
<script lang="ts" setup>
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { useSetupWizard } from '@/composables/useSetupWizard'
|
||||
import api from '@/api'
|
||||
|
||||
const { t } = useI18n()
|
||||
const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
||||
|
||||
// 同步媒体库选项
|
||||
const librariesOptions = ref<{ title: string; value: string | undefined }[]>([
|
||||
{
|
||||
title: t('common.all'),
|
||||
value: 'all',
|
||||
},
|
||||
])
|
||||
|
||||
// 调用API查询媒体库
|
||||
async function loadLibrary(server: string) {
|
||||
try {
|
||||
console.log('Loading library for server:', server)
|
||||
const result: any[] = await api.get('mediaserver/library', { params: { server } })
|
||||
if (result && result.length > 0) {
|
||||
librariesOptions.value = result.map(item => ({
|
||||
title: item.name,
|
||||
value: item.id?.toString(),
|
||||
}))
|
||||
console.log('Loaded libraries:', librariesOptions.value)
|
||||
} else {
|
||||
librariesOptions.value = []
|
||||
console.log('No libraries found')
|
||||
}
|
||||
librariesOptions.value.unshift({
|
||||
title: t('common.all'),
|
||||
value: 'all',
|
||||
})
|
||||
} catch (e) {
|
||||
console.log('Error loading library:', e)
|
||||
}
|
||||
}
|
||||
|
||||
// 选择媒体服务器并自动加载媒体库
|
||||
async function selectMediaServerWithLibrary(type: string) {
|
||||
selectMediaServer(type)
|
||||
// 如果选择了媒体服务器类型,自动加载媒体库
|
||||
if (type && wizardData.value.mediaServer.name) {
|
||||
await loadLibrary(wizardData.value.mediaServer.name)
|
||||
}
|
||||
}
|
||||
|
||||
// 组件挂载时检查是否需要加载媒体库
|
||||
onMounted(async () => {
|
||||
// 如果已经有媒体服务器配置,自动加载媒体库
|
||||
if (wizardData.value.mediaServer.type && wizardData.value.mediaServer.name) {
|
||||
await loadLibrary(wizardData.value.mediaServer.name)
|
||||
}
|
||||
})
|
||||
|
||||
// 监听媒体服务器配置变化,自动加载媒体库
|
||||
watch(
|
||||
() => [wizardData.value.mediaServer.type, wizardData.value.mediaServer.name],
|
||||
async ([type, name]) => {
|
||||
console.log('Media server changed:', { type, name })
|
||||
if (type && name) {
|
||||
await loadLibrary(name)
|
||||
}
|
||||
},
|
||||
{ immediate: true },
|
||||
)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -31,7 +93,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
||||
:color="wizardData.mediaServer.type === 'emby' ? 'primary' : 'default'"
|
||||
:variant="wizardData.mediaServer.type === 'emby' ? 'tonal' : 'outlined'"
|
||||
class="cursor-pointer"
|
||||
@click="selectMediaServer('emby')"
|
||||
@click="selectMediaServerWithLibrary('emby')"
|
||||
>
|
||||
<VCardText class="text-center">
|
||||
<VImg src="/src/assets/images/logos/emby.png" height="48" width="48" class="mx-auto mb-2" />
|
||||
@@ -44,7 +106,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
||||
:color="wizardData.mediaServer.type === 'jellyfin' ? 'primary' : 'default'"
|
||||
:variant="wizardData.mediaServer.type === 'jellyfin' ? 'tonal' : 'outlined'"
|
||||
class="cursor-pointer"
|
||||
@click="selectMediaServer('jellyfin')"
|
||||
@click="selectMediaServerWithLibrary('jellyfin')"
|
||||
>
|
||||
<VCardText class="text-center">
|
||||
<VImg src="/src/assets/images/logos/jellyfin.png" height="48" width="48" class="mx-auto mb-2" />
|
||||
@@ -57,7 +119,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
||||
:color="wizardData.mediaServer.type === 'plex' ? 'primary' : 'default'"
|
||||
:variant="wizardData.mediaServer.type === 'plex' ? 'tonal' : 'outlined'"
|
||||
class="cursor-pointer"
|
||||
@click="selectMediaServer('plex')"
|
||||
@click="selectMediaServerWithLibrary('plex')"
|
||||
>
|
||||
<VCardText class="text-center">
|
||||
<VImg src="/src/assets/images/logos/plex.png" height="48" width="48" class="mx-auto mb-2" />
|
||||
@@ -70,7 +132,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
||||
:color="wizardData.mediaServer.type === 'trimemedia' ? 'primary' : 'default'"
|
||||
:variant="wizardData.mediaServer.type === 'trimemedia' ? 'tonal' : 'outlined'"
|
||||
class="cursor-pointer"
|
||||
@click="selectMediaServer('trimemedia')"
|
||||
@click="selectMediaServerWithLibrary('trimemedia')"
|
||||
>
|
||||
<VCardText class="text-center">
|
||||
<VImg src="/src/assets/images/logos/trimemedia.png" height="48" width="48" class="mx-auto mb-2" />
|
||||
@@ -144,7 +206,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
||||
<VAutocomplete
|
||||
v-model="wizardData.mediaServer.sync_libraries"
|
||||
:label="t('mediaserver.syncLibraries')"
|
||||
:items="[]"
|
||||
:items="librariesOptions"
|
||||
chips
|
||||
multiple
|
||||
clearable
|
||||
@@ -153,6 +215,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
||||
active
|
||||
append-inner-icon="mdi-refresh"
|
||||
prepend-inner-icon="mdi-library"
|
||||
@click:append-inner="loadLibrary(wizardData.mediaServer.name)"
|
||||
/>
|
||||
</VCol>
|
||||
</VRow>
|
||||
@@ -213,7 +276,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
||||
<VAutocomplete
|
||||
v-model="wizardData.mediaServer.sync_libraries"
|
||||
:label="t('mediaserver.syncLibraries')"
|
||||
:items="[]"
|
||||
:items="librariesOptions"
|
||||
chips
|
||||
multiple
|
||||
clearable
|
||||
@@ -222,6 +285,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
||||
active
|
||||
append-inner-icon="mdi-refresh"
|
||||
prepend-inner-icon="mdi-library"
|
||||
@click:append-inner="loadLibrary(wizardData.mediaServer.name)"
|
||||
/>
|
||||
</VCol>
|
||||
</VRow>
|
||||
@@ -292,7 +356,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
||||
<VAutocomplete
|
||||
v-model="wizardData.mediaServer.sync_libraries"
|
||||
:label="t('mediaserver.syncLibraries')"
|
||||
:items="[]"
|
||||
:items="librariesOptions"
|
||||
chips
|
||||
multiple
|
||||
clearable
|
||||
@@ -301,6 +365,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
||||
active
|
||||
append-inner-icon="mdi-refresh"
|
||||
prepend-inner-icon="mdi-library"
|
||||
@click:append-inner="loadLibrary(wizardData.mediaServer.name)"
|
||||
/>
|
||||
</VCol>
|
||||
</VRow>
|
||||
@@ -361,7 +426,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
||||
<VAutocomplete
|
||||
v-model="wizardData.mediaServer.sync_libraries"
|
||||
:label="t('mediaserver.syncLibraries')"
|
||||
:items="[]"
|
||||
:items="librariesOptions"
|
||||
chips
|
||||
multiple
|
||||
clearable
|
||||
@@ -370,6 +435,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
||||
active
|
||||
append-inner-icon="mdi-refresh"
|
||||
prepend-inner-icon="mdi-library"
|
||||
@click:append-inner="loadLibrary(wizardData.mediaServer.name)"
|
||||
/>
|
||||
</VCol>
|
||||
</VRow>
|
||||
|
||||
@@ -4,6 +4,18 @@ import { useSetupWizard } from '@/composables/useSetupWizard'
|
||||
|
||||
const { t } = useI18n()
|
||||
const { wizardData, selectNotification, validationErrors } = useSetupWizard()
|
||||
|
||||
// 消息类型下拉字典
|
||||
const notificationTypes = [
|
||||
{ value: '资源下载', title: t('notificationSwitch.resourceDownload') },
|
||||
{ value: '整理入库', title: t('notificationSwitch.organize') },
|
||||
{ value: '订阅', title: t('notificationSwitch.subscribe') },
|
||||
{ value: '站点', title: t('notificationSwitch.site') },
|
||||
{ value: '媒体服务器', title: t('notificationSwitch.mediaServer') },
|
||||
{ value: '手动处理', title: t('notificationSwitch.manual') },
|
||||
{ value: '插件', title: t('notificationSwitch.plugin') },
|
||||
{ value: '其它', title: t('notificationSwitch.other') },
|
||||
]
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -117,7 +129,7 @@ const { wizardData, selectNotification, validationErrors } = useSetupWizard()
|
||||
<VCol cols="12">
|
||||
<VAutocomplete
|
||||
v-model="wizardData.notification.switchs"
|
||||
:items="[] as string[]"
|
||||
:items="notificationTypes"
|
||||
:label="t('notification.type')"
|
||||
:hint="t('notification.typeHint')"
|
||||
multiple
|
||||
|
||||
Reference in New Issue
Block a user