From c2ce006e6ec3c1d70e0cec0922d3450064b9a641 Mon Sep 17 00:00:00 2001 From: Kush Makkapati Date: Thu, 16 Apr 2026 20:41:04 +0100 Subject: [PATCH 1/4] Add distance and gradient between waypoint metrics on missions page --- .../components/missions/missionItemsTable.jsx | 20 ++- .../missions/missionItemsTableRow.jsx | 12 +- .../components/missions/missionStatistics.jsx | 103 ++++-------- gcs/src/helpers/missionWaypointMetrics.js | 157 ++++++++++++++++++ 4 files changed, 213 insertions(+), 79 deletions(-) create mode 100644 gcs/src/helpers/missionWaypointMetrics.js diff --git a/gcs/src/components/missions/missionItemsTable.jsx b/gcs/src/components/missions/missionItemsTable.jsx index ee0412648..a8719d5ab 100644 --- a/gcs/src/components/missions/missionItemsTable.jsx +++ b/gcs/src/components/missions/missionItemsTable.jsx @@ -3,16 +3,26 @@ */ import { Table } from "@mantine/core" -import React from "react" +import React, { useMemo } from "react" import { isGlobalFrameHomeCommand } from "../../helpers/filterMissions" +import { buildMissionWaypointLegMetrics } from "../../helpers/missionWaypointMetrics" import MissionItemsTableRow from "./missionItemsTableRow" // Redux import { useSelector } from "react-redux" -import { selectDrawingMissionItems } from "../../redux/slices/missionSlice" +import { + selectDrawingMissionItems, + selectPlannedHomePosition, +} from "../../redux/slices/missionSlice" function MissionItemsTableNonMemo({ tableSectionHeight }) { const missionItems = useSelector(selectDrawingMissionItems) + const plannedHomePosition = useSelector(selectPlannedHomePosition) + + const rowMetricsByIdx = useMemo( + () => buildMissionWaypointLegMetrics(missionItems, plannedHomePosition), + [missionItems, plannedHomePosition], + ) return ( @@ -28,20 +38,23 @@ function MissionItemsTableNonMemo({ tableSectionHeight }) { Lat Lng Alt + Distance + Gradient Frame {missionItems.map((missionItem, idx) => { - // Skip home location if (idx === 0 && isGlobalFrameHomeCommand(missionItem)) { return null } + return ( ) })} @@ -54,6 +67,7 @@ function MissionItemsTableNonMemo({ tableSectionHeight }) { function propsAreEqual(prev, next) { return JSON.stringify(prev) === JSON.stringify(next) } + const MissionItemsTable = React.memo(MissionItemsTableNonMemo, propsAreEqual) export default MissionItemsTable diff --git a/gcs/src/components/missions/missionItemsTableRow.jsx b/gcs/src/components/missions/missionItemsTableRow.jsx index 726ce89c9..505857ce6 100644 --- a/gcs/src/components/missions/missionItemsTableRow.jsx +++ b/gcs/src/components/missions/missionItemsTableRow.jsx @@ -30,7 +30,15 @@ import { const coordsFractionDigits = 9 -export default function MissionItemsTableRow({ missionItemIndex }) { +function formatMetric(value, suffix) { + if (!Number.isFinite(value)) { + return "-" + } + + return `${value.toFixed(2)}${suffix}` +} + +export default function MissionItemsTableRow({ missionItemIndex, rowMetrics }) { const dispatch = useDispatch() const aircraftType = useSelector(selectAircraftType) const missionItem = useSelector( @@ -166,6 +174,8 @@ export default function MissionItemsTableRow({ missionItemIndex }) { hideControls /> + {formatMetric(rowMetrics?.distanceMeters, "m")} + {formatMetric(rowMetrics?.gradientPercent, "%")}