- ) : (
- fleetList.map(({ id, mmsiList, label, color, members }) => {
- const company = companies.get(id);
- const companyName = company?.nameCn ?? label ?? `선단 #${id}`;
- const isOpen = expandedFleet === id;
- const isHovered = hoveredFleetId === id;
-
- const mainMembers = members.filter(m => {
- const dto = analysisMap.get(m.mmsi);
- return dto?.algorithms.fleetRole.role === 'LEADER' || dto?.algorithms.fleetRole.role === 'MEMBER';
- });
- const displayMembers = mainMembers.length > 0 ? mainMembers : members;
-
- return (
-
- {/* 선단 행 */}
-
setHoveredFleetId(id)}
- onMouseLeave={() => setHoveredFleetId(null)}
- style={{
- display: 'flex',
- alignItems: 'center',
- gap: 4,
- padding: '4px 10px',
- cursor: 'pointer',
- backgroundColor: isHovered ? 'rgba(255,255,255,0.06)' : 'transparent',
- borderLeft: isOpen ? `2px solid ${color}` : '2px solid transparent',
- transition: 'background-color 0.1s',
- }}
- >
- {/* 펼침 토글 */}
- setExpandedFleet(prev => (prev === id ? null : id))}
- style={{ color: '#94a3b8', fontSize: 9, flexShrink: 0, cursor: 'pointer' }}
- >
- {isOpen ? '▾' : '▸'}
-
- {/* 색상 인디케이터 */}
-
- {/* 회사명 */}
- setExpandedFleet(prev => (prev === id ? null : id))}
- style={{
- flex: 1,
- color: '#e2e8f0',
- overflow: 'hidden',
- textOverflow: 'ellipsis',
- whiteSpace: 'nowrap',
- cursor: 'pointer',
- }}
- title={company ? `${company.nameCn} / ${company.nameEn}` : companyName}
- >
- {companyName}
-
- {/* 선박 수 */}
-
- ({mmsiList.length}척)
-
- {/* zoom 버튼 */}
-
-
-
- {/* 선단 상세 */}
- {isOpen && (
-
- {/* 선박 목록 */}
-
선박:
- {displayMembers.map(m => {
- const dto = analysisMap.get(m.mmsi);
- const role = dto?.algorithms.fleetRole.role ?? m.role;
- const displayName = m.name || m.mmsi;
- return (
-
-
- {displayName}
-
-
- ({role === 'LEADER' ? 'MAIN' : 'SUB'})
-
-
-
- );
- })}
-
- )}
-