전략평가 화면 수정

This commit is contained in:
Macbook
2026-06-12 19:12:47 +09:00
parent a3f0584e72
commit d54dc6e2ff
4 changed files with 70 additions and 38 deletions
@@ -20,6 +20,7 @@ interface Props {
appliedParams: EvalIndicatorParams | null;
onSave: (params: EvalIndicatorParams) => void;
onReset: () => void;
applying?: boolean;
}
function getEditableParamKeys(
@@ -47,6 +48,7 @@ const StrategyEvaluationSettingsTab: React.FC<Props> = ({
appliedParams,
onSave,
onReset,
applying = false,
}) => {
const [draft, setDraft] = useState<EvalIndicatorParams>({});
const [expanded, setExpanded] = useState<string | null>(null);
@@ -56,23 +58,31 @@ const StrategyEvaluationSettingsTab: React.FC<Props> = ({
[strategy],
);
const resolveBaseline = useCallback((): EvalIndicatorParams => {
if (!strategy) return {};
return appliedParams ?? buildEvalParamsFromStrategy(strategy, getParams);
}, [strategy, appliedParams, getParams]);
useEffect(() => {
if (!strategy) {
setDraft({});
setExpanded(null);
return;
}
const baseline = appliedParams ?? buildEvalParamsFromStrategy(strategy, getParams);
setDraft(JSON.parse(JSON.stringify(baseline)) as EvalIndicatorParams);
setDraft(JSON.parse(JSON.stringify(resolveBaseline())) as EvalIndicatorParams);
setExpanded(indicatorTypes[0] ?? null);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [strategy?.id, appliedParams, indicatorTypes.join(',')]);
const dirty = useMemo(
() => hasEvalParamsDiff(draft, appliedParams),
[draft, appliedParams],
() => hasEvalParamsDiff(draft, resolveBaseline()),
[draft, resolveBaseline],
);
const handleApply = useCallback(() => {
onSave(JSON.parse(JSON.stringify(draft)) as EvalIndicatorParams);
}, [draft, onSave]);
const patchParam = useCallback((type: string, key: string, raw: string | boolean) => {
setDraft(prev => {
const current = prev[type] ?? {};
@@ -115,8 +125,19 @@ const StrategyEvaluationSettingsTab: React.FC<Props> = ({
return (
<div className="seval-settings-tab">
<div className="seval-settings-head">
<p className="seval-settings-strategy">{strategyName}</p>
<p className="seval-settings-hint"> · </p>
<div className="seval-settings-head-row">
<p className="seval-settings-strategy">{strategyName}</p>
<button
type="button"
className="seval-settings-apply"
disabled={!dirty || applying}
onClick={handleApply}
title="변경된 지표 값을 차트·일치율에 반영"
>
{applying ? '적용 중…' : '적용'}
</button>
</div>
<p className="seval-settings-hint"> · </p>
</div>
<div className="seval-settings-list">
@@ -163,18 +184,10 @@ const StrategyEvaluationSettingsTab: React.FC<Props> = ({
</div>
<div className="seval-settings-actions">
<button
type="button"
className="seval-settings-save"
disabled={!dirty}
onClick={() => onSave(JSON.parse(JSON.stringify(draft)) as EvalIndicatorParams)}
>
·
</button>
<button
type="button"
className="seval-settings-reset"
disabled={!appliedParams && !dirty}
disabled={(!appliedParams && !dirty) || applying}
onClick={onReset}
>