From b7944391dbb37b72cf56d4234950c441efcbac0d Mon Sep 17 00:00:00 2001 From: chase Date: Wed, 31 Dec 2025 14:24:10 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=B8=85=E6=B4=97=E7=AD=9B=E9=80=89=E9=80=BB=E8=BE=91-?= =?UTF-8?q?=E7=AD=9B=E9=80=89=E4=BF=AE=E6=94=B9=E4=B8=BA=E5=A4=9A=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Create/components/OperatorLibrary.tsx | 124 +++++++----------- 1 file changed, 48 insertions(+), 76 deletions(-) diff --git a/frontend/src/pages/DataCleansing/Create/components/OperatorLibrary.tsx b/frontend/src/pages/DataCleansing/Create/components/OperatorLibrary.tsx index 0792e9a8a..7611fb092 100644 --- a/frontend/src/pages/DataCleansing/Create/components/OperatorLibrary.tsx +++ b/frontend/src/pages/DataCleansing/Create/components/OperatorLibrary.tsx @@ -100,52 +100,43 @@ const OperatorLibrary: React.FC = ({ const [searchTerm, setSearchTerm] = useState(""); const [showFavorites, setShowFavorites] = useState(false); const [favorites, setFavorites] = useState>(new Set()); - const [selectedCategory, setSelectedCategory] = useState("all"); - const [expandedCategories, setExpandedCategories] = useState>( - new Set([]) - ); + const [selectedCategory, setSelectedCategory] = useState([]); + + const [operatorListFiltered, setOperatorListFiltered] = useState([]); + + const hasCommon = (arr1: string[], arr2: string[]) => { + const set1 = new Set(arr1); + return arr2.some(item => set1.has(item)); + } // 按分类分组 const groupedOperators = useMemo(() => { const groups: { [key: string]: OperatorI[] } = {}; + let operatorFilteredList = []; categoryOptions.forEach((cat: any) => { groups[cat.name] = { ...cat, operators: operatorList.filter((op) => op.categories?.includes(cat.id)), }; }); - - if (selectedCategory && selectedCategory !== "all") { - Object.keys(groups).forEach((key) => { - if (groups[key].id !== selectedCategory) { - delete groups[key]; - } - }); + if (selectedCategory.length) { + operatorFilteredList = operatorList.filter((op) => hasCommon(op.categories || [], selectedCategory)); + } else { + operatorFilteredList = [...operatorList]; } if (searchTerm) { - Object.keys(groups).forEach((key) => { - groups[key].operators = groups[key].operators.filter((operator) => - operator.name.toLowerCase().includes(searchTerm.toLowerCase()) - ); - if (groups[key].operators.length === 0) { - delete groups[key]; - } - }); + operatorFilteredList = operatorFilteredList.filter(operator => + operator.name.toLowerCase().includes(searchTerm.toLowerCase()) + ); } if (showFavorites) { - Object.keys(groups).forEach((key) => { - groups[key].operators = groups[key].operators.filter((operator) => - favorites.has(operator.id) - ); - if (groups[key].operators.length === 0) { - delete groups[key]; - } - }); + operatorFilteredList = operatorFilteredList.filter((operator) => + favorites.has(operator.id) + ); } - - setExpandedCategories(new Set(Object.keys(groups))); + setOperatorListFiltered([...operatorFilteredList]); return groups; }, [categoryOptions, selectedCategory, searchTerm, showFavorites]); @@ -195,12 +186,12 @@ const OperatorLibrary: React.FC = ({
- 算子库({filteredOperators.length}) + 算子库({operatorList.length})
{/* 过滤器 */} -
+
} placeholder="搜索算子名称..." @@ -210,8 +201,10 @@ const OperatorLibrary: React.FC = ({ /> @@ -227,53 +220,32 @@ const OperatorLibrary: React.FC = ({ )} +
+ +
{/* 算子列表 */}
- {/* 分类算子 */} - - setExpandedCategories( - new Set(Array.isArray(keys) ? keys : [keys]) - ) - } - > - {Object.entries(groupedOperators).map(([key, category]) => ( - - - {category.name} - {category.operators.length} - - -
- } - > - - - ))} - - {filteredOperators.length === 0 && ( + + + {operatorListFiltered.length === 0 && (
未找到匹配的算子
From 4dca1c1f95c84841351b9387ee29885ea68a2d76 Mon Sep 17 00:00:00 2001 From: chase Date: Wed, 31 Dec 2025 15:33:18 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=B8=85=E6=B4=97=E7=AD=9B=E9=80=89=E9=80=BB=E8=BE=91-?= =?UTF-8?q?=E7=AD=9B=E9=80=89=E4=BF=AE=E6=94=B9=E4=B8=BA=E5=A4=9A=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/DataCleansing/Create/components/OperatorLibrary.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/pages/DataCleansing/Create/components/OperatorLibrary.tsx b/frontend/src/pages/DataCleansing/Create/components/OperatorLibrary.tsx index 7611fb092..800c784fb 100644 --- a/frontend/src/pages/DataCleansing/Create/components/OperatorLibrary.tsx +++ b/frontend/src/pages/DataCleansing/Create/components/OperatorLibrary.tsx @@ -201,7 +201,7 @@ const OperatorLibrary: React.FC = ({ /> item.name !== '已收藏')]} + options={handleSelectCategory(categoryOptions)} onChange={setSelectedCategory} mode="multiple" allowClear From eeaaced7ec8fb774b28d4c178bf966bdc7c5da56 Mon Sep 17 00:00:00 2001 From: hhhhsc <1710496817@qq.com> Date: Tue, 6 Jan 2026 17:52:39 +0800 Subject: [PATCH 7/7] =?UTF-8?q?fix:=20=E6=B8=85=E6=B4=97=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E7=AD=9B=E9=80=89=E9=80=BB=E8=BE=91=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Create/components/OperatorLibrary.tsx | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/frontend/src/pages/DataCleansing/Create/components/OperatorLibrary.tsx b/frontend/src/pages/DataCleansing/Create/components/OperatorLibrary.tsx index bfa51fc00..f71c81ec5 100644 --- a/frontend/src/pages/DataCleansing/Create/components/OperatorLibrary.tsx +++ b/frontend/src/pages/DataCleansing/Create/components/OperatorLibrary.tsx @@ -103,16 +103,10 @@ const OperatorLibrary: React.FC = ({ const [selectedCategory, setSelectedCategory] = useState([]); const [operatorListFiltered, setOperatorListFiltered] = useState([]); - - const hasCommon = (arr1: string[], arr2: string[]) => { - const set1 = new Set(arr1); - return arr2.some(item => set1.has(item)); - } - - // 按分类分组 +// 按分类分组 const groupedOperators = useMemo(() => { const groups: { [key: string]: any[] } = {}; - let operatorFilteredList: OperatorI[] = []; + let operatorFilteredList: OperatorI[]; categoryOptions.forEach((cat: any) => { groups[cat.id] = { ...cat,