import { createDisabledInput, createLabel } from "./common"; import type { ProgressMessage } from "./worker"; export class ManoeuvresGui { parentDiv: HTMLElement; displayProgress: (progressMessage: ProgressMessage) => void; constructor(displayProgress?: boolean) { if (displayProgress === undefined) { displayProgress = true; } this.parentDiv = document.createElement("div"); let explanationParagraph = document.createElement("p"); this.parentDiv.appendChild(explanationParagraph); let manoeuvresContainer = document.createElement("div"); manoeuvresContainer.classList.add("flexContainer"); this.parentDiv.appendChild(manoeuvresContainer); let manoeuvreOneContainer = document.createElement("div"); let manoeuvreTwoContainer = document.createElement("div"); manoeuvreOneContainer.classList.add("orbitalParameter"); manoeuvreTwoContainer.classList.add("orbitalParameter"); manoeuvresContainer.appendChild(manoeuvreOneContainer); manoeuvresContainer.appendChild(manoeuvreTwoContainer); let manoeuvreOneHeader = document.createElement("h4"); manoeuvreOneHeader.appendChild(document.createTextNode("First manoeuvre:")); manoeuvreOneContainer.appendChild(manoeuvreOneHeader); const addTo = (container: HTMLElement, children: HTMLElement[]) => { children.forEach(child => { container.appendChild(child); }) container.appendChild(document.createElement("br")); }; let firstTimeId = crypto.randomUUID(); let firstTimeLabel = createLabel(firstTimeId, "Time:"); let firstManoeuvreTime = createDisabledInput(firstTimeId); addTo(manoeuvreOneContainer, [firstTimeLabel, firstManoeuvreTime]); let firstProgradeId = crypto.randomUUID(); let firstProgradeLabel = createLabel(firstProgradeId, "Prograde delta-v:"); let firstManoeuvrePrograde = createDisabledInput(firstProgradeId); addTo(manoeuvreOneContainer, [firstProgradeLabel, firstManoeuvrePrograde]); let firstNormalId = crypto.randomUUID(); let firstNormalLabel = createLabel(firstNormalId, "Normal delta-v:"); let firstManoeuvreNormal = createDisabledInput(firstNormalId); addTo(manoeuvreOneContainer, [firstNormalLabel, firstManoeuvreNormal]); let firstRadialId = crypto.randomUUID(); let firstRadialLabel = createLabel(firstRadialId, "Radial delta-v:"); let firstManoeuvreRadial = createDisabledInput(firstRadialId); addTo(manoeuvreOneContainer, [firstRadialLabel, firstManoeuvreRadial]); let firstTotalId = crypto.randomUUID(); let firstTotalLabel = createLabel(firstTotalId, "Total delta-v:"); let firstManoeuvreTotal = createDisabledInput(firstTotalId); addTo(manoeuvreOneContainer, [firstTotalLabel, firstManoeuvreTotal]); let manoeuvreTwoHeader = document.createElement("h4"); manoeuvreTwoHeader.appendChild(document.createTextNode("Second manoeuvre")); manoeuvreTwoContainer.appendChild(manoeuvreTwoHeader); let secondTimeId = crypto.randomUUID(); let secondTimeLabel = createLabel(secondTimeId, "Time:"); let secondManoeuvreTime = createDisabledInput(secondTimeId); addTo(manoeuvreTwoContainer, [secondTimeLabel, secondManoeuvreTime]); let secondProgradeId = crypto.randomUUID(); let secondProgradeLabel = createLabel(secondProgradeId, "Prograde delta-v:"); let secondManoeuvrePrograde = createDisabledInput(secondProgradeId); addTo(manoeuvreTwoContainer, [secondProgradeLabel, secondManoeuvrePrograde]); let secondNormalId = crypto.randomUUID(); let secondNormalLabel = createLabel(secondNormalId, "Normal delta-v:"); let secondManoeuvreNormal = createDisabledInput(secondNormalId); addTo(manoeuvreTwoContainer, [secondNormalLabel, secondManoeuvreNormal]); let secondRadialId = crypto.randomUUID(); let secondRadialLabel = createLabel(secondRadialId, "Radial delta-v:"); let secondManoeuvreRadial = createDisabledInput(secondRadialId); addTo(manoeuvreTwoContainer, [secondRadialLabel, secondManoeuvreRadial]); let secondTotalId = crypto.randomUUID(); let secondTotalLabel = createLabel(secondTotalId, "Total delta-v:"); let secondManoeuvreTotal = createDisabledInput(secondTotalId); addTo(manoeuvreTwoContainer, [secondTotalLabel, secondManoeuvreTotal]); this.displayProgress = (progressMessage) => { explanationParagraph.innerHTML = ""; if (displayProgress) { explanationParagraph.appendChild(document.createTextNode(`The search is ${progressMessage.percentDone.toFixed(2)}% complete.`)); if (progressMessage.bestDeltaV) { explanationParagraph.appendChild(document.createElement("br")); explanationParagraph.appendChild(document.createTextNode(`The best transfer costs ${progressMessage.bestDeltaV.toFixed(3)} m/s`)); } } firstManoeuvreTime.value = progressMessage.bestTransfer?.firstManoeuvre.time.toFixed(0) ?? ""; firstManoeuvrePrograde.value = progressMessage.bestTransfer?.firstManoeuvre.progradeDeltaV.toFixed(3) ?? ""; firstManoeuvreNormal.value = progressMessage.bestTransfer?.firstManoeuvre.normalDeltaV.toFixed(3) ?? ""; firstManoeuvreRadial.value = progressMessage.bestTransfer?.firstManoeuvre.radialDeltaV.toFixed(3) ?? ""; firstManoeuvreTotal.value = progressMessage.bestTransfer?.firstManoeuvre.totalDeltaV.toFixed(3) ?? ""; secondManoeuvreTime.value = progressMessage.bestTransfer?.secondManoeuvre.time.toFixed(0) ?? ""; secondManoeuvrePrograde.value = progressMessage.bestTransfer?.secondManoeuvre.progradeDeltaV.toFixed(3) ?? ""; secondManoeuvreNormal.value = progressMessage.bestTransfer?.secondManoeuvre.normalDeltaV.toFixed(3) ?? ""; secondManoeuvreRadial.value = progressMessage.bestTransfer?.secondManoeuvre.radialDeltaV.toFixed(3) ?? ""; secondManoeuvreTotal.value = progressMessage.bestTransfer?.secondManoeuvre.totalDeltaV.toFixed(3) ?? ""; }; } }