81 lines
3.1 KiB
TypeScript
81 lines
3.1 KiB
TypeScript
// 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<string, string> = {
|
|
prices: "Prices",
|
|
diagnostics: "Diagnostics",
|
|
};
|
|
|
|
function activateView(viewId: string): void {
|
|
if (!(viewId in viewTitles)) {
|
|
return;
|
|
}
|
|
document.querySelectorAll<HTMLElement>("[data-view-panel]").forEach(panel => {
|
|
panel.hidden = panel.dataset.viewPanel !== viewId;
|
|
});
|
|
document.querySelectorAll<HTMLButtonElement>("[data-view]").forEach(button => {
|
|
button.classList.toggle("active", button.dataset.view === viewId);
|
|
});
|
|
const header = document.querySelector<HTMLElement>("#headerViewTitle");
|
|
if (header) {
|
|
header.textContent = viewTitles[viewId];
|
|
}
|
|
frontendDebug("main", "SOL Prices Desk view activated", { viewId });
|
|
}
|
|
|
|
function renderRuntimeStatus(status: RuntimeStatusDto): void {
|
|
const values: Record<string, string> = {
|
|
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<HTMLElement>(`#${elementId}`);
|
|
if (element) {
|
|
element.textContent = value;
|
|
}
|
|
}
|
|
const badge = document.querySelector<HTMLElement>("#runtimeVersionBadge");
|
|
if (badge) {
|
|
badge.textContent = status.applicationVersion;
|
|
}
|
|
const diagnostic = document.querySelector<HTMLElement>("#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<void> {
|
|
frontendInfo("main", "SOL Prices Desk scaffold frontend loaded");
|
|
document.querySelectorAll<HTMLButtonElement>("[data-view]").forEach(button => {
|
|
button.addEventListener("click", () => {
|
|
const viewId = button.dataset.view;
|
|
if (viewId) {
|
|
activateView(viewId);
|
|
}
|
|
});
|
|
});
|
|
const status = await invokeKsp<RuntimeStatusDto>("main", "runtime_status");
|
|
renderRuntimeStatus(status);
|
|
activateView("prices");
|
|
}
|
|
|
|
document.addEventListener("DOMContentLoaded", () => {
|
|
void initializeMain();
|
|
});
|