diff --git a/src/api/types.ts b/src/api/types.ts index d1bcb11d..d1c16f69 100644 --- a/src/api/types.ts +++ b/src/api/types.ts @@ -858,7 +858,7 @@ export interface DownloaderConf { // 是否默认 default: boolean // 配置 - config?: { [key: string]: any } + config: { [key: string]: any } // 是否启用 enabled: boolean } @@ -902,7 +902,7 @@ export interface MediaServerConf { // 类型 emby/jellyfin/plex type: string // 配置 - config?: { [key: string]: any } + config: { [key: string]: any } // 是否启用 enabled: boolean // 同步媒体体库列表 diff --git a/src/components/cards/CustomRuleCard.vue b/src/components/cards/CustomRuleCard.vue index ca80bcce..93eb9a4a 100644 --- a/src/components/cards/CustomRuleCard.vue +++ b/src/components/cards/CustomRuleCard.vue @@ -10,7 +10,33 @@ const props = defineProps({ }) // 定义触发的自定义事件 -const emit = defineEmits(['close']) +const emit = defineEmits(['close', 'change']) + +// 规则详情弹窗 +const ruleInfoDialog = ref(false) + +// 规则详情 +const ruleInfo = ref({ + id: '', + name: '', + include: '', + exclude: '', + size_range: '', + seeders: '', + publish_time: '', +}) + +// 打开详情弹窗 +function openRuleInfoDialog() { + ruleInfo.value = props.rule + ruleInfoDialog.value = true +} + +// 保存详情数据 +function saveRuleInfo() { + ruleInfoDialog.value = false + emit('change', ruleInfo.value) +} // 按钮点击 function onClose() { @@ -19,64 +45,48 @@ function onClose() { diff --git a/src/components/cards/DownloaderCard.vue b/src/components/cards/DownloaderCard.vue index b876486d..253e64a6 100644 --- a/src/components/cards/DownloaderCard.vue +++ b/src/components/cards/DownloaderCard.vue @@ -12,12 +12,39 @@ const props = defineProps({ }, }) +// 定义触发的自定义事件 +const emit = defineEmits(['close', 'change']) + // 上传速率 const upload_rate = ref(0) // 下载速度 const download_rate = ref(0) +// 下载器详情弹窗 +const downloaderInfoDialog = ref(false) + +// 下载器详情 +const downloaderInfo = ref({ + name: '', + type: '', + default: false, + enabled: false, + config: {}, +}) + +// 打开详情弹窗 +function openDownloaderInfoDialog() { + downloaderInfo.value = props.downloader + downloaderInfoDialog.value = true +} + +// 保存详情数据 +function saveDownloaderInfo() { + downloaderInfoDialog.value = false + emit('change', downloaderInfo.value) +} + // 速度 const getSpeedText = computed(() => { return `↑ ${upload_rate.value}/s ↓ ${download_rate.value}/s` @@ -35,28 +62,153 @@ const getIcon = computed(() => { } }) -// 定义触发的自定义事件 -const emit = defineEmits(['close']) - // 按钮点击 function onClose() { emit('close') } diff --git a/src/components/cards/MediaServerCard.vue b/src/components/cards/MediaServerCard.vue index 295c679a..b97faacd 100644 --- a/src/components/cards/MediaServerCard.vue +++ b/src/components/cards/MediaServerCard.vue @@ -12,6 +12,32 @@ const props = defineProps({ }, }) +// 定义触发的自定义事件 +const emit = defineEmits(['close', 'change']) + +// 媒体服务器详情弹窗 +const mediaServerInfoDialog = ref(false) + +// 媒体服务器详情 +const mediaServerInfo = ref({ + name: '', + type: '', + enabled: false, + config: {}, +}) + +// 打开详情弹窗 +function openMediaServerInfoDialog() { + mediaServerInfo.value = props.mediaserver + mediaServerInfoDialog.value = true +} + +// 保存详情数据 +function saveMediaServerInfo() { + mediaServerInfoDialog.value = false + emit('change', mediaServerInfo.value) +} + // 根据存储类型选择图标 const getIcon = computed(() => { switch (props.mediaserver.type) { @@ -24,23 +50,153 @@ const getIcon = computed(() => { } }) -// 定义触发的自定义事件 -const emit = defineEmits(['close']) - // 按钮点击 function onClose() { emit('close') } diff --git a/src/styles/styles.scss b/src/styles/styles.scss index fb747d8f..37ddc4b6 100644 --- a/src/styles/styles.scss +++ b/src/styles/styles.scss @@ -176,6 +176,11 @@ padding-block-end: 1rem; } +.grid-customrule-card { + grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr)); + padding-block-end: 1rem; +} + .grid-subscribe-card { grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr)); padding-block-end: 1rem; diff --git a/src/views/setting/AccountSettingRule.vue b/src/views/setting/AccountSettingRule.vue index 9fddb054..1365b639 100644 --- a/src/views/setting/AccountSettingRule.vue +++ b/src/views/setting/AccountSettingRule.vue @@ -93,6 +93,12 @@ function addFilterRuleGroup() { }) } +// 规则变化时赋值 +function onRuleChange(rule: CustomRule) { + const index = customRules.value.findIndex(item => item.id === rule.id) + if (index !== -1) customRules.value[index] = rule +} + // 移除规则组 function removeFilterRuleGroup(rule: FilterRuleGroup) { const index = filterRuleGroups.value.findIndex(item => item.name === rule.name) @@ -148,10 +154,10 @@ onMounted(() => { handle=".cursor-move" item-key="name" tag="div" - :component-data="{ 'class': 'grid gap-3 grid-filterrule-card' }" + :component-data="{ 'class': 'grid gap-3 grid-customrule-card' }" > diff --git a/src/views/setting/AccountSettingSystem.vue b/src/views/setting/AccountSettingSystem.vue index c9ff2f64..b0c1a4f8 100644 --- a/src/views/setting/AccountSettingSystem.vue +++ b/src/views/setting/AccountSettingSystem.vue @@ -98,6 +98,7 @@ function addDownloader(downloader: string) { type: downloader, default: false, enabled: false, + config: {}, }) } @@ -113,6 +114,7 @@ function addMediaServer(mediaserver: string) { name: `服务器${mediaServers.value.length + 1}`, type: mediaserver, enabled: false, + config: {}, }) } @@ -188,7 +190,7 @@ onMounted(() => { - + Qbittorrent