From 2fc7d3f439ee5320cba8d3b8a792e868c5d78457 Mon Sep 17 00:00:00 2001 From: shy3130 <415333856@qq.com> Date: Mon, 31 Aug 2026 22:30:44 +0800 Subject: [PATCH] =?UTF-8?q?feat(screener):=20=E7=AD=96=E7=95=A5=E6=B1=A0?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=B8=80=E9=94=AE=E6=B8=85=E7=A9=BA=E4=B8=8E?= =?UTF-8?q?=E6=9C=AC=E7=BB=84=E5=85=A8=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../screener/StrategyPoolDialog.tsx | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/screener/StrategyPoolDialog.tsx b/frontend/src/components/screener/StrategyPoolDialog.tsx index 31f6b47..4b6277c 100644 --- a/frontend/src/components/screener/StrategyPoolDialog.tsx +++ b/frontend/src/components/screener/StrategyPoolDialog.tsx @@ -1,6 +1,6 @@ import { useState, useMemo, useEffect, useCallback, useRef } from 'react' import { motion, AnimatePresence, Reorder } from 'framer-motion' -import { X, Plus, GripVertical, Upload, Loader2 } from 'lucide-react' +import { X, Plus, GripVertical, Upload, Loader2, Trash2, ListPlus } from 'lucide-react' import { api, type StrategyDetail } from '@/lib/api' import { useDialogBackdrop } from '@/lib/useDialogBackdrop' @@ -108,6 +108,22 @@ export function StrategyPoolDialog({ pool, onConfirm, onClose }: Props) { setDraftPool(newOrder) }, []) + // 一键清空已选池 (草稿态, 误点可用「取消」恢复) + const handleClearAll = useCallback(() => { + setDraftPool([]) + }, []) + + // 一键加入当前 Tab 分组的全部待选策略 + const handleAddGroup = useCallback(() => { + setDraftPool(prev => { + const next = [...prev] + for (const s of filteredAvailable) { + if (!next.includes(s.id)) next.push(s.id) + } + return next + }) + }, [filteredAvailable]) + const handleImportFile = useCallback(async (file: File) => { setImporting(true); setImportError(''); setImportMsg('') try { @@ -217,6 +233,15 @@ export function StrategyPoolDialog({ pool, onConfirm, onClose }: Props) { ) })} +