fix: 토글 패널 위치 재생 컨트롤러 정렬 + 일치율 필터 전역 적용

패널 위치:
- left: 10 → left: calc(50% - 210px) (재생 컨트롤러 중앙 정렬 근처)

일치율 드롭다운 전역 적용:
- 기존: 현재 ON인 모델의 대상만 필터
- 수정: 모든 모델의 모든 대상에 전역 적용 (모델 on/off 무관)
- 동일 MMSI가 여러 모델에 있을 때 최고 score 기준 판단

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
htlee 2026-03-31 09:44:15 +09:00
부모 6789f82e3b
커밋 e8187b3a6c
2개의 변경된 파일10개의 추가작업 그리고 5개의 파일을 삭제

파일 보기

@ -203,7 +203,7 @@ const CorrelationPanel = ({
<div style={{ <div style={{
position: 'absolute', position: 'absolute',
bottom: historyActive ? 100 : 20, bottom: historyActive ? 100 : 20,
left: 10, left: 'calc(50% - 210px)',
display: 'flex', display: 'flex',
gap: 6, gap: 6,
alignItems: 'flex-start', alignItems: 'flex-start',
@ -212,7 +212,7 @@ const CorrelationPanel = ({
fontSize: 10, fontSize: 10,
color: '#e2e8f0', color: '#e2e8f0',
pointerEvents: 'auto', pointerEvents: 'auto',
maxWidth: 'calc(100vw - 340px)', maxWidth: 'calc(100vw - 40px)',
overflowX: 'auto', overflowX: 'auto',
overflowY: 'visible', overflowY: 'visible',
}}> }}>

파일 보기

@ -469,15 +469,20 @@ export function FleetClusterLayer({ ships, analysisMap: analysisMapProp, onShipS
<HistoryReplayController <HistoryReplayController
onClose={closeHistory} onClose={closeHistory}
onFilterByScore={(minPct) => { onFilterByScore={(minPct) => {
// 전역: 모든 모델의 모든 대상에 적용 (모델 on/off 무관)
if (minPct === null) { if (minPct === null) {
// 전체: 모든 연관 선박 ON
setEnabledVessels(new Set(correlationTracks.map(v => v.mmsi))); setEnabledVessels(new Set(correlationTracks.map(v => v.mmsi)));
} else { } else {
// 해당 퍼센트 이상만 ON
const threshold = minPct / 100; const threshold = minPct / 100;
const filtered = new Set<string>(); const filtered = new Set<string>();
// correlationData에서 모든 모델의 모든 대상 중 최고 score 기준
const maxScores = new Map<string, number>();
for (const c of correlationData) { for (const c of correlationData) {
if (c.score >= threshold) filtered.add(c.targetMmsi); const prev = maxScores.get(c.targetMmsi) ?? 0;
if (c.score > prev) maxScores.set(c.targetMmsi, c.score);
}
for (const [mmsi, score] of maxScores) {
if (score >= threshold) filtered.add(mmsi);
} }
setEnabledVessels(filtered); setEnabledVessels(filtered);
} }