training_data/apps/web/src/components/models/trainContent/train-content-tree-select.tsx

60 lines
2.0 KiB
TypeScript

import { api } from "@nice/client"
import { TrainContent } from "@nice/common"
import { useAuth } from "@web/src/providers/auth-provider"
import { TreeSelect } from "antd"
import { useMemo } from "react"
interface Props {
value?: string | null
onChange?: (value: string | null) => void
}
export default function TrainContentTreeSelect({ value, onChange }: Props) {
const { user, isAuthenticated } = useAuth()
const { data: trainContents, isLoading: trainContentsLoading }
: { data: TrainContent[], isLoading: boolean }
= isAuthenticated ? api.trainContent.findMany.useQuery({
select: {
children: true,
id: true,
title: true,
parentId: true,
type: true,
parent: {
select: {
id: true,
title: true
}
}
}
}) : { data: null, isLoading: false }
const treeData = useMemo(() => {
if (!trainContents) return [];
const buildTreeData = (contents: any[], parentId: string | null = null): any[] => {
return contents
.filter(item => item.parentId === parentId)
.map(item => ({
title: item.title,
value: item.id,
key: item.id,
type: item.type,
children: buildTreeData(contents, item.id)
}))
.filter(Boolean);
};
return buildTreeData(trainContents);
}, [trainContents]);
return (
<TreeSelect
style={{ width: '100%' }}
dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
treeData={treeData}
placeholder="请选择学科或课程"
treeDefaultExpandAll={false}
value={value}
onChange={onChange}
//onChange={onChange}
/>
)
}