2026-04-05 17:14:13 +08:00
|
|
|
<script setup lang="ts">
|
2026-05-01 20:39:09 +08:00
|
|
|
import type { KnowledgeGroup } from '@geo/shared-types'
|
|
|
|
|
import { useQuery } from '@tanstack/vue-query'
|
|
|
|
|
import { computed } from 'vue'
|
2026-04-05 17:14:13 +08:00
|
|
|
|
2026-05-01 20:39:09 +08:00
|
|
|
import { knowledgeApi } from '@/lib/api'
|
2026-04-05 17:14:13 +08:00
|
|
|
|
|
|
|
|
interface TreeNode {
|
2026-05-01 20:39:09 +08:00
|
|
|
title: string
|
|
|
|
|
value: number
|
|
|
|
|
key: number
|
|
|
|
|
children?: TreeNode[]
|
2026-04-05 17:14:13 +08:00
|
|
|
}
|
|
|
|
|
|
2026-05-01 20:39:09 +08:00
|
|
|
withDefaults(
|
2026-04-05 17:14:13 +08:00
|
|
|
defineProps<{
|
2026-05-01 20:39:09 +08:00
|
|
|
modelValue?: number[]
|
|
|
|
|
placeholder?: string
|
|
|
|
|
disabled?: boolean
|
2026-04-05 17:14:13 +08:00
|
|
|
}>(),
|
|
|
|
|
{
|
|
|
|
|
modelValue: () => [],
|
2026-05-01 20:39:09 +08:00
|
|
|
placeholder: '请选择知识库分组',
|
2026-04-05 17:14:13 +08:00
|
|
|
disabled: false,
|
|
|
|
|
},
|
2026-05-01 20:39:09 +08:00
|
|
|
)
|
2026-04-05 17:14:13 +08:00
|
|
|
|
|
|
|
|
const emit = defineEmits<{
|
2026-05-01 20:39:09 +08:00
|
|
|
'update:modelValue': [value: number[]]
|
|
|
|
|
}>()
|
2026-04-05 17:14:13 +08:00
|
|
|
|
|
|
|
|
const groupsQuery = useQuery({
|
2026-05-01 20:39:09 +08:00
|
|
|
queryKey: ['knowledge', 'groups', 'selector'],
|
2026-04-05 17:14:13 +08:00
|
|
|
queryFn: () => knowledgeApi.listGroups(),
|
2026-05-01 20:39:09 +08:00
|
|
|
})
|
2026-04-05 17:14:13 +08:00
|
|
|
|
2026-05-01 20:39:09 +08:00
|
|
|
const treeData = computed(() => (groupsQuery.data.value ?? []).map((item) => toTreeNode(item)))
|
2026-04-05 17:14:13 +08:00
|
|
|
|
|
|
|
|
function toTreeNode(group: KnowledgeGroup): TreeNode {
|
|
|
|
|
return {
|
2026-05-01 20:39:09 +08:00
|
|
|
title: `${group.name}${group.item_count > 0 ? ` (${group.item_count})` : ''}`,
|
2026-04-05 17:14:13 +08:00
|
|
|
value: group.id,
|
|
|
|
|
key: group.id,
|
|
|
|
|
children: (group.children ?? []).map((item) => toTreeNode(item)),
|
2026-05-01 20:39:09 +08:00
|
|
|
}
|
2026-04-05 17:14:13 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function handleChange(values: Array<string | number>): void {
|
|
|
|
|
emit(
|
2026-05-01 20:39:09 +08:00
|
|
|
'update:modelValue',
|
|
|
|
|
values.map((item) => Number(item)).filter((item) => Number.isFinite(item) && item > 0),
|
|
|
|
|
)
|
2026-04-05 17:14:13 +08:00
|
|
|
}
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<template>
|
|
|
|
|
<a-tree-select
|
|
|
|
|
:value="modelValue"
|
|
|
|
|
:tree-data="treeData"
|
|
|
|
|
tree-checkable
|
|
|
|
|
tree-default-expand-all
|
|
|
|
|
multiple
|
|
|
|
|
show-search
|
|
|
|
|
allow-clear
|
|
|
|
|
size="large"
|
|
|
|
|
style="width: 100%"
|
|
|
|
|
:placeholder="placeholder"
|
|
|
|
|
:disabled="disabled"
|
|
|
|
|
:loading="groupsQuery.isPending.value"
|
|
|
|
|
:max-tag-count="3"
|
|
|
|
|
@update:value="handleChange"
|
|
|
|
|
/>
|
|
|
|
|
</template>
|