// file: crates/ksp-app-solprices-desk/frontend/ts/main.ts // version: 1 import "bootstrap"; import "simplebar"; import type { RuntimeStatusDto } from "./bindings/ksp_app_solprices_desk/dto_common/RuntimeStatusDto.ts"; import { frontendDebug, frontendInfo, frontendTrace, installFrontendConsoleBridge } from "./frontend_log"; import { invokeKsp } from "./invoke"; installFrontendConsoleBridge("main"); const viewTitles: Record = { prices: "Prices", diagnostics: "Diagnostics", }; function activateView(viewId: string): void { if (!(viewId in viewTitles)) { return; } document.querySelectorAll("[data-view-panel]").forEach(panel => { panel.hidden = panel.dataset.viewPanel !== viewId; }); document.querySelectorAll("[data-view]").forEach(button => { button.classList.toggle("active", button.dataset.view === viewId); }); const header = document.querySelector("#headerViewTitle"); if (header) { header.textContent = viewTitles[viewId]; } frontendDebug("main", "SOL Prices Desk view activated", { viewId }); } function renderRuntimeStatus(status: RuntimeStatusDto): void { const values: Record = { runtimeVersion: status.applicationVersion, runtimeShellPhase: status.shellPhase, runtimeConfigDocuments: status.configDocumentCount.toString(), runtimeLoggingProfile: status.activeLoggingProfile ?? "fallback", runtimeLoggingFallback: status.fallbackLoggingActive ? "oui" : "non", }; for (const [elementId, value] of Object.entries(values)) { const element = document.querySelector(`#${elementId}`); if (element) { element.textContent = value; } } const badge = document.querySelector("#runtimeVersionBadge"); if (badge) { badge.textContent = status.applicationVersion; } const diagnostic = document.querySelector("#runtimeDiagnostic"); if (diagnostic) { diagnostic.hidden = status.startupDiagnostic === null; diagnostic.textContent = status.startupDiagnostic === null ? "" : `${status.startupDiagnostic.domain}:${status.startupDiagnostic.code} — ${status.startupDiagnostic.message}`; } frontendTrace("main", "SOL Prices Desk scaffold runtime status rendered", { fallbackLoggingActive: status.fallbackLoggingActive, configDocumentCount: status.configDocumentCount, }); } async function initializeMain(): Promise { frontendInfo("main", "SOL Prices Desk scaffold frontend loaded"); document.querySelectorAll("[data-view]").forEach(button => { button.addEventListener("click", () => { const viewId = button.dataset.view; if (viewId) { activateView(viewId); } }); }); const status = await invokeKsp("main", "runtime_status"); renderRuntimeStatus(status); activateView("prices"); } document.addEventListener("DOMContentLoaded", () => { void initializeMain(); });