feat: Automatically generate optional transferType

- 自动结合两个储存方式,生成出可选的整理方式,降低使用门槛
This commit is contained in:
Aqr-K
2024-09-26 20:27:42 +08:00
parent a547e5c34b
commit 81a670d608
+80 -7
View File
@@ -1,6 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { TransferDirectoryConf } from '@/api/types' import type { TransferDirectoryConf } from '@/api/types'
import { VTextField } from 'vuetify/lib/components/index.mjs' import { VTextField } from 'vuetify/lib/components/index.mjs'
import { useToast } from 'vue-toast-notification'
import api from "@/api";
import { nextTick } from 'vue'
// 输入参数 // 输入参数
const props = defineProps({ const props = defineProps({
@@ -17,6 +20,9 @@ const props = defineProps({
height: String, height: String,
}) })
// 提示框
const $toast = useToast();
// 下载路径 // 下载路径
const downloadPath = ref<string>('') const downloadPath = ref<string>('')
@@ -46,12 +52,66 @@ const transferSourceItems = [
] ]
// 整理方式下拉字典 // 整理方式下拉字典
const transferTypeItems = [ const transferTypeItems = ref<{ title: string; value: string }[]>([])
{ title: '复制', value: 'copy' },
{ title: '移动', value: 'move' }, // 调用API查询支持的整理方式
{ title: '硬链接', value: 'link' }, async function loadTransferTypeItems() {
{ title: '软链接', value: 'softlink' }, // 参数不全时不查询
] if (!props.directory.library_storage || !props.directory.storage) return
try {
// 下载器储存整理方法
const storage_res = await api.get(`storage/transtype/${props.directory.storage}`)
const storage_transtype = (storage_res as any).transtype;
// 媒体库储存整理方法
const library_storage_res = await api.get(`storage/transtype/${props.directory.library_storage}`)
const library_storage_transtype = (library_storage_res as any).transtype;
// 为空终止
if (!library_storage_transtype || !storage_transtype) return
// 取并集
const transtype: { [key: string]: string } = {};
Object.keys(storage_transtype).forEach(key => {
if (key in library_storage_transtype) {
transtype[key] = storage_transtype[key];
}
})
// 非空时设置整理方式下拉字典
if (transtype && Object.keys(transtype).length > 0) {
transferTypeItems.value = Object.keys(transtype).map(key => ({
title: transtype[key],
value: key,
}))
// 如果整理方式下拉字典不为空,且当前值不在新的transferTypeItems里,则设置整理方式为第一个
if (transferTypeItems.value.length > 0 && !transferTypeItems.value.find(item => item.value === props.directory.transfer_type)) {
nextTick(() => {
props.directory.transfer_type = transferTypeItems.value[0].value
})
}
// 如果整理方式下拉字典为空,清空整理方式
if (transferTypeItems.value.length === 0) {
props.directory.transfer_type = ''
}
} else {
// 无可用整理方式,清除已选值
transferTypeItems.value = []
props.directory.transfer_type = ''
}
} catch (e) {
console.log(e)
}
}
// 整理方式无数据提示
const computedNoDataText = computed(() => {
if (!props.directory.library_storage && !props.directory.storage) {
return '无可用整理方式!请先选择下载器储存与媒体库储存!'
} else if (!props.directory.library_storage) {
return '无可用整理方式!请先选择媒体库储存!'
} else if (!props.directory.storage) {
return '无可用整理方式!请先选择下载器储存!'
} else {
return '选择的存储没有支持的整理方法!'
}
})
// 覆盖模式下拉字典 // 覆盖模式下拉字典
const overwriteModeItems = [ const overwriteModeItems = [
@@ -93,6 +153,15 @@ const getCategories = computed(() => {
if (!props.categories || !props.categories[props.directory?.media_type ?? '']) return default_value if (!props.categories || !props.categories[props.directory?.media_type ?? '']) return default_value
return default_value.concat(props.categories[props.directory.media_type ?? '']) return default_value.concat(props.categories[props.directory.media_type ?? ''])
}) })
// 监听 下载储存与媒体库储存 变化,重新加载整理方式下拉字典
watch([() => props.directory.library_storage, () => props.directory.storage],
([newLibraryStorage, newStorage], [oldLibraryStorage, oldStorage]) => {
if (newLibraryStorage !== oldLibraryStorage || newStorage !== oldStorage) {
loadTransferTypeItems();
}
}, { immediate: true });
</script> </script>
<template> <template>
@@ -132,7 +201,10 @@ const getCategories = computed(() => {
/> />
</VCol> </VCol>
<VCol cols="4"> <VCol cols="4">
<VSelect v-model="props.directory.storage" variant="underlined" :items="storageItems" label="下载存储" /> <VSelect v-model="props.directory.storage"
variant="underlined"
:items="storageItems"
label="下载存储" />
</VCol> </VCol>
<VCol cols="8"> <VCol cols="8">
<VPathField @update:modelValue="updateDownloadPath"> <VPathField @update:modelValue="updateDownloadPath">
@@ -171,6 +243,7 @@ const getCategories = computed(() => {
variant="underlined" variant="underlined"
:items="transferTypeItems" :items="transferTypeItems"
label="整理方式" label="整理方式"
:no-data-text="computedNoDataText"
/> />
</VCol> </VCol>
<VCol cols="8"> <VCol cols="8">