fix: expand bgp pipeline and stabilize backend tests
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "planet-frontend",
|
||||
"version": "0.21.8",
|
||||
"version": "0.21.9",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@ant-design/icons": "^5.2.6",
|
||||
|
||||
@@ -134,6 +134,10 @@ let isLongDrag = false;
|
||||
let lastSatClickTime = 0;
|
||||
let lastSatClickIndex = 0;
|
||||
let lastSatClickPos = { x: 0, y: 0 };
|
||||
let lastBGPClickTime = 0;
|
||||
let lastBGPClickCollector = null;
|
||||
let lastBGPClickType = null;
|
||||
let lastBGPClickPos = { x: 0, y: 0 };
|
||||
let earthTexture = null;
|
||||
let animationFrameId = null;
|
||||
let initialized = false;
|
||||
@@ -241,6 +245,98 @@ function isSameCable(cable1, cable2) {
|
||||
return id1 === id2;
|
||||
}
|
||||
|
||||
function isSameBGPMarker(marker1, marker2) {
|
||||
if (!marker1 || !marker2) return false;
|
||||
const type1 = marker1.userData?.type;
|
||||
const type2 = marker2.userData?.type;
|
||||
if (type1 !== type2) return false;
|
||||
|
||||
if (type1 === "bgp") {
|
||||
return marker1.userData?.id === marker2.userData?.id;
|
||||
}
|
||||
if (type1 === "bgp_collector") {
|
||||
return marker1.userData?.collector === marker2.userData?.collector;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function getBGPCollectorMarkerByName(collector) {
|
||||
return getBGPCollectorMarkers().find(
|
||||
(marker) => marker.userData?.collector === collector,
|
||||
);
|
||||
}
|
||||
|
||||
function resetTransientBGPStates() {
|
||||
getBGPCollectorMarkers().forEach((marker) => {
|
||||
if (marker !== lockedObject) {
|
||||
setBGPMarkerState(marker, "normal");
|
||||
}
|
||||
});
|
||||
getBGPAnomalyMarkers().forEach((marker) => {
|
||||
if (marker !== lockedObject) {
|
||||
setBGPMarkerState(marker, "normal");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function applyBGPHoverState(marker) {
|
||||
resetTransientBGPStates();
|
||||
if (!marker) {
|
||||
hoveredBGP = null;
|
||||
return;
|
||||
}
|
||||
|
||||
hoveredBGP = marker;
|
||||
if (marker !== lockedObject) {
|
||||
setBGPMarkerState(marker, "hover");
|
||||
}
|
||||
|
||||
const relatedCollector =
|
||||
marker.userData?.type === "bgp_collector"
|
||||
? marker
|
||||
: getBGPCollectorMarkerByName(marker.userData?.collector);
|
||||
|
||||
if (relatedCollector && relatedCollector !== lockedObject && relatedCollector !== marker) {
|
||||
setBGPMarkerState(relatedCollector, "linked");
|
||||
}
|
||||
}
|
||||
|
||||
function getPrimaryBGPHoverTarget(bgpAnomalyIntersects, bgpCollectorIntersects) {
|
||||
if (bgpAnomalyIntersects.length > 0) {
|
||||
return bgpAnomalyIntersects[0].object;
|
||||
}
|
||||
if (bgpCollectorIntersects.length > 0) {
|
||||
return bgpCollectorIntersects[0].object;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function getPrimaryBGPClickTarget(
|
||||
event,
|
||||
bgpAnomalyIntersects,
|
||||
bgpCollectorIntersects,
|
||||
) {
|
||||
const anomalyMarker = bgpAnomalyIntersects[0]?.object || null;
|
||||
const collectorMarker = bgpCollectorIntersects[0]?.object || null;
|
||||
if (!anomalyMarker && !collectorMarker) return null;
|
||||
if (!anomalyMarker) return collectorMarker;
|
||||
if (!collectorMarker) return anomalyMarker;
|
||||
|
||||
const clickCollector = anomalyMarker.userData?.collector || collectorMarker.userData?.collector;
|
||||
const isRepeatedClick =
|
||||
clickCollector &&
|
||||
clickCollector === lastBGPClickCollector &&
|
||||
Date.now() - lastBGPClickTime < 650 &&
|
||||
Math.abs(event.clientX - lastBGPClickPos.x) < 28 &&
|
||||
Math.abs(event.clientY - lastBGPClickPos.y) < 28;
|
||||
|
||||
if (isRepeatedClick) {
|
||||
return lastBGPClickType === "bgp" ? collectorMarker : anomalyMarker;
|
||||
}
|
||||
|
||||
return anomalyMarker;
|
||||
}
|
||||
|
||||
function showCableInfo(cable) {
|
||||
setLegendMode("cables");
|
||||
showInfoCard("cable", {
|
||||
@@ -390,7 +486,7 @@ function updateSatelliteToggleUi(enabled, satelliteCount = getSatelliteCount())
|
||||
|
||||
const satelliteCountEl = document.getElementById("satellite-count");
|
||||
if (satelliteCountEl) {
|
||||
satelliteCountEl.textContent = `${enabled ? satelliteCount : 0} 颗`;
|
||||
satelliteCountEl.textContent = `${satelliteCount} 颗`;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -404,17 +500,12 @@ function updateCableToggleUi(enabled) {
|
||||
|
||||
const cableCountEl = document.getElementById("cable-count");
|
||||
if (cableCountEl) {
|
||||
cableCountEl.textContent = `${enabled ? getCableLines().length : 0}个`;
|
||||
cableCountEl.textContent = `${getCableLines().length}个`;
|
||||
}
|
||||
|
||||
const landingPointCountEl = document.getElementById("landing-point-count");
|
||||
if (landingPointCountEl) {
|
||||
landingPointCountEl.textContent = `${enabled ? getLandingPoints().length : 0}个`;
|
||||
}
|
||||
|
||||
const statusEl = document.getElementById("cable-status-summary");
|
||||
if (statusEl && !enabled) {
|
||||
statusEl.textContent = "0/0 运行中";
|
||||
landingPointCountEl.textContent = `${getLandingPoints().length}个`;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -427,6 +518,14 @@ async function ensureCablesEnabled() {
|
||||
if (!earth) return 0;
|
||||
|
||||
cablesEnabled = true;
|
||||
if (getCableLines().length > 0 || getLandingPoints().length > 0) {
|
||||
toggleCables(true);
|
||||
updateCableToggleUi(true);
|
||||
setLegendItems("cables", getCableLegendItems());
|
||||
refreshLegend();
|
||||
return getCableLines().length;
|
||||
}
|
||||
|
||||
const requestToken = ++cableToggleToken;
|
||||
|
||||
clearCableData(earth);
|
||||
@@ -450,7 +549,7 @@ async function ensureCablesEnabled() {
|
||||
function disableCables() {
|
||||
cablesEnabled = false;
|
||||
cableToggleToken += 1;
|
||||
clearCableData(getEarth());
|
||||
toggleCables(false);
|
||||
updateCableToggleUi(false);
|
||||
setLegendItems("cables", getCableLegendItems());
|
||||
refreshLegend();
|
||||
@@ -888,16 +987,16 @@ function onMouseMove(event) {
|
||||
}
|
||||
}
|
||||
|
||||
const hoveredBGPMarker = getPrimaryBGPHoverTarget(
|
||||
bgpAnomalyIntersects,
|
||||
bgpCollectorIntersects,
|
||||
);
|
||||
|
||||
if (
|
||||
hoveredBGP &&
|
||||
(!bgpAnomalyIntersects.length ||
|
||||
bgpAnomalyIntersects[0]?.object !== hoveredBGP) &&
|
||||
(!bgpCollectorIntersects.length ||
|
||||
bgpCollectorIntersects[0]?.object !== hoveredBGP)
|
||||
!isSameBGPMarker(hoveredBGP, hoveredBGPMarker)
|
||||
) {
|
||||
if (hoveredBGP !== lockedObject) {
|
||||
setBGPMarkerState(hoveredBGP, "normal");
|
||||
}
|
||||
resetTransientBGPStates();
|
||||
hoveredBGP = null;
|
||||
}
|
||||
|
||||
@@ -922,22 +1021,18 @@ function onMouseMove(event) {
|
||||
hoveredSatelliteIndex = null;
|
||||
}
|
||||
|
||||
if (bgpAnomalyIntersects.length > 0 && getShowBGP()) {
|
||||
const marker = bgpAnomalyIntersects[0].object;
|
||||
hoveredBGP = marker;
|
||||
if (marker !== lockedObject) {
|
||||
setBGPMarkerState(marker, "hover");
|
||||
if (
|
||||
hoveredBGPMarker &&
|
||||
getShowBGP() &&
|
||||
lockedObjectType !== "bgp" &&
|
||||
lockedObjectType !== "bgp_collector"
|
||||
) {
|
||||
applyBGPHoverState(hoveredBGPMarker);
|
||||
if (hoveredBGPMarker.userData?.type === "bgp") {
|
||||
showBGPInfo(hoveredBGPMarker);
|
||||
} else {
|
||||
showBGPCollectorInfo(hoveredBGPMarker);
|
||||
}
|
||||
showBGPInfo(marker);
|
||||
setInfoCardNoBorder(true);
|
||||
hideTooltip();
|
||||
} else if (bgpCollectorIntersects.length > 0 && getShowBGP()) {
|
||||
const marker = bgpCollectorIntersects[0].object;
|
||||
hoveredBGP = marker;
|
||||
if (marker !== lockedObject) {
|
||||
setBGPMarkerState(marker, "hover");
|
||||
}
|
||||
showBGPCollectorInfo(marker);
|
||||
setInfoCardNoBorder(true);
|
||||
hideTooltip();
|
||||
} else if (cableIntersects.length > 0 && getShowCables()) {
|
||||
@@ -965,8 +1060,10 @@ function onMouseMove(event) {
|
||||
showSatelliteInfo(hoveredSat.properties);
|
||||
setInfoCardNoBorder(true);
|
||||
} else if (lockedObjectType === "bgp" && lockedObject) {
|
||||
applyBGPHoverState(lockedObject);
|
||||
showBGPInfo(lockedObject);
|
||||
} else if (lockedObjectType === "bgp_collector" && lockedObject) {
|
||||
applyBGPHoverState(lockedObject);
|
||||
showBGPCollectorInfo(lockedObject);
|
||||
} else if (lockedObjectType === "cable" && lockedObject) {
|
||||
showCableInfo(lockedObject);
|
||||
@@ -981,6 +1078,7 @@ function onMouseMove(event) {
|
||||
}
|
||||
showSatelliteInfo(lockedSatellite.properties);
|
||||
} else {
|
||||
resetTransientBGPStates();
|
||||
hideInfoCard();
|
||||
}
|
||||
|
||||
@@ -1057,14 +1155,22 @@ function onClick(event) {
|
||||
? interactionRaycaster.intersectObject(getSatellitePoints())
|
||||
: [];
|
||||
|
||||
if (bgpAnomalyIntersects.length > 0 && getShowBGP()) {
|
||||
const clickedBGPMarker = getShowBGP()
|
||||
? getPrimaryBGPClickTarget(event, bgpAnomalyIntersects, bgpCollectorIntersects)
|
||||
: null;
|
||||
|
||||
if (clickedBGPMarker?.userData?.type === "bgp") {
|
||||
clearLockedObject();
|
||||
|
||||
const clickedMarker = bgpAnomalyIntersects[0].object;
|
||||
const clickedMarker = clickedBGPMarker;
|
||||
setBGPMarkerState(clickedMarker, "locked");
|
||||
|
||||
lockedObject = clickedMarker;
|
||||
lockedObjectType = "bgp";
|
||||
lastBGPClickTime = Date.now();
|
||||
lastBGPClickCollector = clickedMarker.userData?.collector || null;
|
||||
lastBGPClickType = "bgp";
|
||||
lastBGPClickPos = { x: event.clientX, y: event.clientY };
|
||||
setAutoRotate(false);
|
||||
showBGPEventOverlay(clickedMarker, earth);
|
||||
showBGPInfo(clickedMarker);
|
||||
@@ -1075,14 +1181,18 @@ function onClick(event) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (bgpCollectorIntersects.length > 0 && getShowBGP()) {
|
||||
if (clickedBGPMarker?.userData?.type === "bgp_collector") {
|
||||
clearLockedObject();
|
||||
|
||||
const clickedMarker = bgpCollectorIntersects[0].object;
|
||||
const clickedMarker = clickedBGPMarker;
|
||||
setBGPMarkerState(clickedMarker, "locked");
|
||||
|
||||
lockedObject = clickedMarker;
|
||||
lockedObjectType = "bgp_collector";
|
||||
lastBGPClickTime = Date.now();
|
||||
lastBGPClickCollector = clickedMarker.userData?.collector || null;
|
||||
lastBGPClickType = "bgp_collector";
|
||||
lastBGPClickPos = { x: event.clientX, y: event.clientY };
|
||||
setAutoRotate(false);
|
||||
showBGPCollectorInfo(clickedMarker);
|
||||
showStatusMessage(
|
||||
|
||||
Reference in New Issue
Block a user