전략평가 화면 수정
This commit is contained in:
@@ -5,6 +5,9 @@ import { coerceFiniteNumber } from '../../utils/safeFormat';
|
||||
|
||||
interface Props {
|
||||
metrics: ConditionMetric[];
|
||||
/** 전략평가 등 — 고정 높이 컴팩트 목록 */
|
||||
listClassName?: string;
|
||||
scrollWrap?: boolean;
|
||||
}
|
||||
|
||||
const IconMismatch = () => (
|
||||
@@ -33,13 +36,16 @@ const IconMatch = () => (
|
||||
</svg>
|
||||
);
|
||||
|
||||
const VirtualConditionList: React.FC<Props> = ({ metrics }) => {
|
||||
const VirtualConditionList: React.FC<Props> = ({ metrics, listClassName = '', scrollWrap = false }) => {
|
||||
if (metrics.length === 0) {
|
||||
return <p className="vtd-heat-list-empty vtd-muted">조건 없음</p>;
|
||||
}
|
||||
|
||||
return (
|
||||
<ul className="vtd-heat-list" aria-label="전략 지표 매치율">
|
||||
const list = (
|
||||
<ul
|
||||
className={['vtd-heat-list', listClassName].filter(Boolean).join(' ')}
|
||||
aria-label="전략 지표 매치율"
|
||||
>
|
||||
{metrics.map(({ row, status, matchRate }) => {
|
||||
const tier = resolveHeatTier(matchRate, status);
|
||||
const pct = Math.min(100, Math.max(0, coerceFiniteNumber(matchRate) ?? 0));
|
||||
@@ -68,6 +74,12 @@ const VirtualConditionList: React.FC<Props> = ({ metrics }) => {
|
||||
})}
|
||||
</ul>
|
||||
);
|
||||
|
||||
if (scrollWrap) {
|
||||
return <div className="seval-heat-list-scroll">{list}</div>;
|
||||
}
|
||||
|
||||
return list;
|
||||
};
|
||||
|
||||
export default VirtualConditionList;
|
||||
|
||||
@@ -19,6 +19,8 @@ interface Props {
|
||||
backendMatchRate?: number | null;
|
||||
/** DSL 전체 Rule 충족 — 헤드라인 일치율·신호등 우선 */
|
||||
overallMet?: boolean | null;
|
||||
/** 전략평가 — 지표 목록 고정 높이·스크롤 */
|
||||
compactIndicatorList?: boolean;
|
||||
className?: string;
|
||||
panelClassName?: string;
|
||||
}
|
||||
@@ -28,6 +30,7 @@ const VirtualSignalMatchVisual: React.FC<Props> = ({
|
||||
title,
|
||||
backendMatchRate,
|
||||
overallMet,
|
||||
compactIndicatorList = false,
|
||||
className = '',
|
||||
panelClassName = '',
|
||||
}) => {
|
||||
@@ -60,7 +63,11 @@ const VirtualSignalMatchVisual: React.FC<Props> = ({
|
||||
<VirtualSignalEqualizer matchRate={matchRate} />
|
||||
</div>
|
||||
<div className="vtd-sig-visual-pane vtd-sig-visual-heat">
|
||||
<VirtualConditionList metrics={metrics} />
|
||||
<VirtualConditionList
|
||||
metrics={metrics}
|
||||
listClassName={compactIndicatorList ? 'vtd-heat-list--seval-compact' : ''}
|
||||
scrollWrap={compactIndicatorList}
|
||||
/>
|
||||
</div>
|
||||
<div className="vtd-sig-visual-pane vtd-sig-visual-light">
|
||||
<div ref={lightRef} className="vtd-sig-light-rail">
|
||||
|
||||
Reference in New Issue
Block a user