백테스팅 목록 아이템 삭제 기능추가
This commit is contained in:
@@ -5,6 +5,8 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
||||
import type { Theme, Timeframe } from '../../types';
|
||||
import {
|
||||
loadBacktestResults,
|
||||
deleteBacktestResult,
|
||||
deletePaperTradesBatch,
|
||||
loadPaperTrades,
|
||||
loadPaperSummary,
|
||||
loadStrategies,
|
||||
@@ -16,7 +18,7 @@ import {
|
||||
buildContextFromLive,
|
||||
} from '../../utils/analysisReportContext';
|
||||
import { buildLiveExecutionItems, type LiveExecutionItem } from '../../utils/liveExecutionGroups';
|
||||
import { PAPER_TRADES_CHANGED_EVENT } from '../../utils/paperTradeEvents';
|
||||
import { PAPER_TRADES_CHANGED_EVENT, notifyPaperTradesChanged } from '../../utils/paperTradeEvents';
|
||||
import BacktestExecutionList, { type ExecutionListTab } from '../backtest/BacktestExecutionList';
|
||||
import BuilderPageShell from '../layout/BuilderPageShell';
|
||||
import AnalysisReportCenterPanel from './AnalysisReportCenterPanel';
|
||||
@@ -108,6 +110,38 @@ export function AnalysisReportPage({ theme = 'dark' }: Props) {
|
||||
return () => window.removeEventListener(PAPER_TRADES_CHANGED_EVENT, onPaper);
|
||||
}, [refreshLive, records]);
|
||||
|
||||
const handleDeleteBacktest = useCallback(async (record: BacktestResultRecord) => {
|
||||
if (record.id == null) return;
|
||||
if (!window.confirm('이 백테스팅 결과를 삭제하시겠습니까?')) return;
|
||||
try {
|
||||
await deleteBacktestResult(record.id);
|
||||
setRecords(prev => {
|
||||
const next = prev.filter(r => r.id !== record.id);
|
||||
setSelectedBacktest(sel => (sel?.id === record.id ? next[0] ?? null : sel));
|
||||
return next;
|
||||
});
|
||||
} catch (e) {
|
||||
window.alert(e instanceof Error ? e.message : '삭제에 실패했습니다.');
|
||||
}
|
||||
}, []);
|
||||
|
||||
const handleDeleteLive = useCallback(async (item: LiveExecutionItem) => {
|
||||
const ids = item.trades.map(t => t.id).filter(id => id > 0);
|
||||
if (ids.length === 0) return;
|
||||
if (!window.confirm(`실시간 매매 이력 ${ids.length}건을 삭제하시겠습니까?`)) return;
|
||||
try {
|
||||
const deleted = await deletePaperTradesBatch(ids);
|
||||
if (deleted <= 0) {
|
||||
window.alert('삭제할 체결 이력을 찾지 못했습니다.');
|
||||
return;
|
||||
}
|
||||
await refreshLive(records);
|
||||
notifyPaperTradesChanged();
|
||||
} catch (e) {
|
||||
window.alert(e instanceof Error ? e.message : '삭제에 실패했습니다.');
|
||||
}
|
||||
}, [refreshLive, records]);
|
||||
|
||||
const compareBacktest = useMemo(() => {
|
||||
if (!selectedBacktest) return null;
|
||||
return pickCompareBacktest(selectedBacktest, records);
|
||||
@@ -228,6 +262,8 @@ export function AnalysisReportPage({ theme = 'dark' }: Props) {
|
||||
setSelectedLive(item);
|
||||
setSourceTab('live');
|
||||
}}
|
||||
onDeleteBacktest={r => void handleDeleteBacktest(r)}
|
||||
onDeleteLive={item => void handleDeleteLive(item)}
|
||||
/>
|
||||
)}
|
||||
center={(
|
||||
|
||||
Reference in New Issue
Block a user