From 37cf8bb75a1dea670eb170bf92202c2f05db7006 Mon Sep 17 00:00:00 2001 From: imeepos Date: Tue, 15 Jul 2025 14:23:26 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=BA=E7=B4=A0=E6=9D=90=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=E9=A1=B5=E9=9D=A2=E6=B7=BB=E5=8A=A0=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E7=AD=9B=E9=80=89=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加项目筛选下拉框,支持按项目过滤素材 - 集成useProjectStore获取项目列表 - 修改loadMaterials函数支持项目ID筛选参数 - 在搜索条件变化时包含项目筛选条件 - 优化筛选UI布局,项目筛选位于绑定状态筛选之前 - 支持全部项目和特定项目的素材筛选功能 --- .../src/pages/MaterialModelBinding.tsx | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/apps/desktop/src/pages/MaterialModelBinding.tsx b/apps/desktop/src/pages/MaterialModelBinding.tsx index 168db18..d28e2c5 100644 --- a/apps/desktop/src/pages/MaterialModelBinding.tsx +++ b/apps/desktop/src/pages/MaterialModelBinding.tsx @@ -26,17 +26,20 @@ import { MaterialModelBindingService, MaterialModelBindingStats } from '../services/materialModelBindingService'; +import { useProjectStore } from '../store/projectStore'; export const MaterialModelBinding: React.FC = () => { const navigate = useNavigate(); const { success, error } = useNotifications(); - + const { projects, loadProjects } = useProjectStore(); + const [materials, setMaterials] = useState([]); const [models, setModels] = useState([]); const [stats, setStats] = useState(null); const [selectedModel, setSelectedModel] = useState(''); + const [selectedProject, setSelectedProject] = useState(''); const [searchQuery, setSearchQuery] = useState(''); const [filterType, setFilterType] = useState<'all' | 'bound' | 'unbound'>('all'); const [loading, setLoading] = useState(true); @@ -52,10 +55,10 @@ export const MaterialModelBinding: React.FC = () => { // 当搜索条件变化时重新加载素材 useEffect(() => { - if (searchQuery !== '' || filterType !== 'all' || selectedModel !== '') { + if (searchQuery !== '' || filterType !== 'all' || selectedModel !== '' || selectedProject !== '') { loadMaterials(); } - }, [searchQuery, filterType, selectedModel]); + }, [searchQuery, filterType, selectedModel, selectedProject]); const loadData = async () => { setLoading(true); @@ -63,6 +66,7 @@ export const MaterialModelBinding: React.FC = () => { await Promise.all([ loadMaterials(), loadModels(), + loadProjects(), loadStats(), ]); } catch (err) { @@ -75,6 +79,7 @@ export const MaterialModelBinding: React.FC = () => { const loadMaterials = async () => { try { const materialsData = await MaterialModelBindingService.getMaterialsByFilter({ + projectId: selectedProject || undefined, modelId: filterType === 'bound' ? selectedModel : undefined, bound: filterType === 'bound' ? true : filterType === 'unbound' ? false : undefined, search: searchQuery, @@ -187,6 +192,15 @@ export const MaterialModelBinding: React.FC = () => { })), ]; + // 获取项目选项 + const getProjectOptions = () => [ + { value: '', label: '全部项目' }, + ...projects.map(project => ({ + value: project.id, + label: project.name, + })), + ]; + const getFilterOptions = () => [ { value: 'all', label: '全部素材' }, { value: 'bound', label: '已绑定' }, @@ -302,6 +316,12 @@ export const MaterialModelBinding: React.FC = () => {
+ setFilterType(value as any)}