将 StyleSelector 和 TextGeneratePopup 中的 Select 组件替换为 Combobox 组件,添加搜索过滤功能。 - StyleSelector.vue: 将 Select 组件替换为 Combobox,添加搜索关键词过滤和显示值处理 - TextGeneratePopup.vue: 将智能体选择器从 Select 升级为 Combobox,支持按名称搜索智能体 - 两个组件都添加了搜索输入框、过滤逻辑和空状态显示
This commit is contained in:
@@ -1,11 +1,18 @@
|
||||
<template>
|
||||
<Select v-model="selectedId" @update:model-value="handleChange">
|
||||
<SelectTrigger class="w-full">
|
||||
<SelectValue :placeholder="placeholder" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectItem
|
||||
v-for="item in allList"
|
||||
<Combobox v-model="selectedId" @update:model-value="handleChange">
|
||||
<ComboboxAnchor class="w-full">
|
||||
<ComboboxTrigger as-child>
|
||||
<ComboboxInput
|
||||
:placeholder="placeholder"
|
||||
v-model="searchKeyword"
|
||||
:display-value="displayValue"
|
||||
/>
|
||||
</ComboboxTrigger>
|
||||
</ComboboxAnchor>
|
||||
<ComboboxList>
|
||||
<ComboboxEmpty>未找到匹配项</ComboboxEmpty>
|
||||
<ComboboxItem
|
||||
v-for="item in filteredList"
|
||||
:key="item.id"
|
||||
:value="item.id"
|
||||
>
|
||||
@@ -14,14 +21,9 @@
|
||||
<span class="option-name">{{ item.name }}</span>
|
||||
<span class="option-tag">{{ item.category || '其他' }}</span>
|
||||
</div>
|
||||
</SelectItem>
|
||||
|
||||
<!-- 空状态 -->
|
||||
<div v-if="!loading && allList.length === 0" class="empty-text">
|
||||
暂无可选项
|
||||
</div>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</ComboboxItem>
|
||||
</ComboboxList>
|
||||
</Combobox>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
@@ -29,7 +31,15 @@ import { ref, computed, watch, onMounted } from 'vue'
|
||||
import { usePromptStore } from '@/stores/prompt'
|
||||
import { getJSON, setJSON } from '@/utils/storage'
|
||||
|
||||
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'
|
||||
import {
|
||||
Combobox,
|
||||
ComboboxAnchor,
|
||||
ComboboxEmpty,
|
||||
ComboboxInput,
|
||||
ComboboxItem,
|
||||
ComboboxList,
|
||||
ComboboxTrigger
|
||||
} from '@/components/ui/combobox'
|
||||
|
||||
const props = defineProps({
|
||||
modelValue: {
|
||||
@@ -52,10 +62,30 @@ const promptStore = usePromptStore()
|
||||
|
||||
const loading = ref(false)
|
||||
const selectedId = ref(null)
|
||||
const searchKeyword = ref('')
|
||||
|
||||
// 全部列表(来自 /ai/user-prompt/my-list)
|
||||
const allList = computed(() => promptStore.promptList || [])
|
||||
|
||||
// 过滤后的列表
|
||||
const filteredList = computed(() => {
|
||||
if (!searchKeyword.value.trim()) {
|
||||
return allList.value
|
||||
}
|
||||
const keyword = searchKeyword.value.toLowerCase()
|
||||
return allList.value.filter(item =>
|
||||
item.name?.toLowerCase().includes(keyword) ||
|
||||
item.category?.toLowerCase().includes(keyword)
|
||||
)
|
||||
})
|
||||
|
||||
// 显示选中项名称
|
||||
const displayValue = (val) => {
|
||||
if (!val) return ''
|
||||
const item = allList.value.find(p => p.id === val)
|
||||
return item?.name || ''
|
||||
}
|
||||
|
||||
// 处理选择变化
|
||||
function handleChange(value) {
|
||||
if (!value) {
|
||||
|
||||
Reference in New Issue
Block a user