mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-09-05 23:56:42 +08:00
调整存储添加逻辑
This commit is contained in:
@@ -15,7 +15,6 @@ import AlistConfigDialog from '../dialog/AlistConfigDialog.vue'
|
|||||||
import { useToast } from 'vue-toastification'
|
import { useToast } from 'vue-toastification'
|
||||||
import { isNullOrEmptyObject } from '@/@core/utils'
|
import { isNullOrEmptyObject } from '@/@core/utils'
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
import { storageIconDict } from '@/api/constants'
|
|
||||||
import { useDisplay } from 'vuetify'
|
import { useDisplay } from 'vuetify'
|
||||||
|
|
||||||
// 显示器宽度
|
// 显示器宽度
|
||||||
@@ -163,7 +162,7 @@ function onClose() {
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<VCard variant="tonal" @click="openStorageDialog">
|
<VCard variant="tonal" @click="openStorageDialog">
|
||||||
<VDialogCloseBtn v-if="!storageIconDict[storage.type]" @click="onClose" />
|
<VDialogCloseBtn @click="onClose" class="absolute top-0 right-0" />
|
||||||
<VCardText class="flex justify-space-between align-center gap-3">
|
<VCardText class="flex justify-space-between align-center gap-3">
|
||||||
<div class="align-self-start flex-1">
|
<div class="align-self-start flex-1">
|
||||||
<h5 class="text-h6 mb-1">{{ storage.name }}</h5>
|
<h5 class="text-h6 mb-1">{{ storage.name }}</h5>
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import DirectoryCard from '@/components/cards/DirectoryCard.vue'
|
|||||||
import StorageCard from '@/components/cards/StorageCard.vue'
|
import StorageCard from '@/components/cards/StorageCard.vue'
|
||||||
import ProgressDialog from '@/components/dialog/ProgressDialog.vue'
|
import ProgressDialog from '@/components/dialog/ProgressDialog.vue'
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
|
import { storageAttributes } from '@/api/constants'
|
||||||
|
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
|
|
||||||
@@ -33,6 +34,17 @@ const sourceItems = [
|
|||||||
{ 'title': '豆瓣', 'value': 'douban' },
|
{ 'title': '豆瓣', 'value': 'douban' },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
// 存储选项(排除已添加的)
|
||||||
|
const storageOptions = computed(() => {
|
||||||
|
const existingTypes = storages.value.map(storage => storage.type)
|
||||||
|
return storageAttributes
|
||||||
|
.filter(item => !existingTypes.includes(item.type))
|
||||||
|
.map(item => ({
|
||||||
|
title: t(`storage.${item.type}`),
|
||||||
|
value: item.type,
|
||||||
|
}))
|
||||||
|
})
|
||||||
|
|
||||||
// 系统设置
|
// 系统设置
|
||||||
const SystemSettings = ref<any>({
|
const SystemSettings = ref<any>({
|
||||||
Basic: {
|
Basic: {
|
||||||
@@ -156,10 +168,27 @@ async function loadMediaCategories() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 添加存储
|
// 添加存储
|
||||||
function addStorage() {
|
function addStorage(storageType = 'custom') {
|
||||||
|
let name: string
|
||||||
|
let type: string
|
||||||
|
|
||||||
|
if (storageType === 'custom') {
|
||||||
|
// 自定义存储需要数字序号
|
||||||
|
name = `${t(`storage.${storageType}`)} ${storages.value.length + 1}`
|
||||||
|
while (storages.value.some(item => item.name === name)) {
|
||||||
|
const num = parseInt(name.match(/\d+$/)?.[0] || '1') + 1
|
||||||
|
name = `${t(`storage.${storageType}`)} ${num}`
|
||||||
|
}
|
||||||
|
type = `custom${storages.value.length + 1}`
|
||||||
|
} else {
|
||||||
|
// 预定义存储类型直接使用类型名称
|
||||||
|
name = t(`storage.${storageType}`)
|
||||||
|
type = storageType
|
||||||
|
}
|
||||||
|
|
||||||
storages.value.push({
|
storages.value.push({
|
||||||
name: `${t('storage.custom')} ${storages.value.length + 1}`,
|
name: name,
|
||||||
type: `custom${storages.value.length + 1}`,
|
type: type,
|
||||||
config: {},
|
config: {},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -228,8 +257,18 @@ onMounted(() => {
|
|||||||
<VBtn type="submit" class="me-2" @click="saveStorages" prepend-icon="mdi-content-save">
|
<VBtn type="submit" class="me-2" @click="saveStorages" prepend-icon="mdi-content-save">
|
||||||
{{ t('common.save') }}
|
{{ t('common.save') }}
|
||||||
</VBtn>
|
</VBtn>
|
||||||
<VBtn color="success" variant="tonal" @click="addStorage">
|
<VBtn color="success" variant="tonal">
|
||||||
<VIcon icon="mdi-plus" />
|
<VIcon icon="mdi-plus" />
|
||||||
|
<VMenu activator="parent" close-on-content-click>
|
||||||
|
<VList>
|
||||||
|
<VListItem v-for="item in storageOptions" :key="item.value" @click="addStorage(item.value)">
|
||||||
|
<VListItemTitle>{{ item.title }}</VListItemTitle>
|
||||||
|
</VListItem>
|
||||||
|
<VListItem @click="addStorage('custom')">
|
||||||
|
<VListItemTitle>{{ t('storage.custom') }}</VListItemTitle>
|
||||||
|
</VListItem>
|
||||||
|
</VList>
|
||||||
|
</VMenu>
|
||||||
</VBtn>
|
</VBtn>
|
||||||
</div>
|
</div>
|
||||||
</VForm>
|
</VForm>
|
||||||
|
|||||||
Reference in New Issue
Block a user