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) { ) })} +
{filteredAvailable.length === 0 ? ( @@ -253,6 +278,15 @@ export function StrategyPoolDialog({ pool, onConfirm, onClose }: Props) {
已选 · 上下拖拽排序 +
{draftPool.length === 0 ? (