v0.1.0-pre.061

This commit is contained in:
2026-07-28 18:41:30 +02:00
parent c7bad46f50
commit f40fb78817
527 changed files with 4598 additions and 4114 deletions

View File

@@ -1,11 +1,12 @@
// file: kb-app-demo-desktop/frontend/ts/demo_http.ts
// version: 5
// version: 7
import * as bootstrap from "bootstrap";
import "simplebar";
import ResizeObserver from "resize-observer-polyfill";
import { invoke } from "@tauri-apps/api/core";
import { frontendDebug, frontendError, installFrontendConsoleBridge } from "./frontend_log.ts";
import { renderJsonViewer } from "./json_viewer.ts";
import type { DemoHttpExecutionPayload } from "./bindings/kb_app_demo_desktop/demo_http/DemoHttpExecutionPayload.ts";
import type { DemoHttpMethodOption } from "./bindings/kb_app_demo_desktop/demo_http/DemoHttpMethodOption.ts";
import type { DemoHttpOptionsPayload } from "./bindings/kb_app_demo_desktop/demo_http/DemoHttpOptionsPayload.ts";
@@ -17,35 +18,27 @@ import type { DemoHttpRoleOption } from "./bindings/kb_app_demo_desktop/demo_htt
let roleOptions: DemoHttpRoleOption[] = [];
let methodOptions: DemoHttpMethodOption[] = [];
let httpResultBuffer = "Aucune requête exécutée.";
function textInputValue(selector: string): string {
const element = document.querySelector<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>(selector);
return element ? element.value.trim() : "";
}
function writeTextarea(selector: string, value: string): void {
const element = document.querySelector<HTMLTextAreaElement>(selector);
if (element) {
element.value = value;
function parseJsonValue(value: string): unknown {
try {
return JSON.parse(value) as unknown;
} catch {
return { raw: value };
}
}
function writeHttpResult(value: string): void {
httpResultBuffer = value;
writeTextarea("#httpResultOutput", httpResultBuffer);
function writeHttpResult(value: unknown): void {
renderJsonViewer("#httpResultOutput", value);
}
function clearHttpResult(): void {
httpResultBuffer = "";
writeTextarea("#httpResultOutput", httpResultBuffer);
}
function jsonText(value: unknown): string {
if (typeof value === "string") {
return value;
}
return JSON.stringify(value, null, 2);
writeHttpResult({ status: "idle", message: "Aucune requête exécutée." });
}
function roleSupportsMethod(role: DemoHttpRoleOption, method: DemoHttpMethodOption): boolean {
@@ -99,8 +92,8 @@ function refreshMethodFields(): void {
}
}
function formatHttpExecutionPayload(payload: DemoHttpExecutionPayload): string {
const header = {
function formatHttpExecutionPayload(payload: DemoHttpExecutionPayload): unknown {
return {
endpointName: payload.endpointName,
provider: payload.provider,
endpointUrl: payload.endpointUrl,
@@ -108,16 +101,8 @@ function formatHttpExecutionPayload(payload: DemoHttpExecutionPayload): string {
method: payload.method,
requestKind: payload.requestKind,
methodClass: payload.methodClass,
response: parseJsonValue(payload.responseJson),
};
return `${JSON.stringify(header, null, 2)}\n\n--- response ---\n${payload.responseJson}`;
}
async function copyTextarea(selector: string): Promise<void> {
const element = document.querySelector<HTMLTextAreaElement>(selector);
if (!element) {
return;
}
await navigator.clipboard.writeText(element.value);
}
async function refreshHttpOptions(): Promise<void> {
@@ -132,7 +117,7 @@ async function refreshHttpOptions(): Promise<void> {
refreshMethodList();
} catch (caughtError) {
const message = caughtError instanceof Error ? caughtError.message : String(caughtError);
writeHttpResult(`Erreur options HTTP : ${message}`);
writeHttpResult({ status: "error", stage: "options", message });
frontendError("kb-app-demo-desktop.frontend.demo_http", `HTTP options loading failed: ${message}`);
}
}
@@ -140,10 +125,10 @@ async function refreshHttpOptions(): Promise<void> {
async function refreshHttpPool(): Promise<void> {
try {
const snapshots = await invoke("demo_http_list_pool_clients");
writeTextarea("#httpPoolOutput", jsonText(snapshots));
renderJsonViewer("#httpPoolOutput", snapshots);
} catch (caughtError) {
const message = caughtError instanceof Error ? caughtError.message : String(caughtError);
writeTextarea("#httpPoolOutput", `Erreur : ${message}`);
renderJsonViewer("#httpPoolOutput", { status: "error", message });
frontendError("kb-app-demo-desktop.frontend.demo_http", `HTTP pool refresh failed: ${message}`);
}
}
@@ -156,14 +141,14 @@ async function executeHttpRequest(): Promise<void> {
configJson: textInputValue("#httpConfigInput") || null,
paramsJson: textInputValue("#httpParamsInput") || null,
};
writeHttpResult("Exécution en cours...");
writeHttpResult({ status: "running", message: "Exécution HTTP en cours." });
try {
const response = await invoke<DemoHttpExecutionPayload>("demo_http_execute_request", { request });
writeHttpResult(formatHttpExecutionPayload(response));
frontendDebug("kb-app-demo-desktop.frontend.demo_http", `HTTP request completed: ${response.method}`);
} catch (caughtError) {
const message = caughtError instanceof Error ? caughtError.message : String(caughtError);
writeHttpResult(`Erreur : ${message}`);
writeHttpResult({ status: "error", message });
frontendError("kb-app-demo-desktop.frontend.demo_http", `HTTP request failed: ${message}`);
}
}
@@ -171,6 +156,8 @@ async function executeHttpRequest(): Promise<void> {
document.addEventListener("DOMContentLoaded", () => {
installFrontendConsoleBridge("kb-app-demo-desktop.frontend.demo_http");
frontendDebug("kb-app-demo-desktop.frontend.demo_http", "HTTP demo window loaded");
renderJsonViewer("#httpPoolOutput", { status: "loading", message: "Chargement des endpoints HTTP." });
clearHttpResult();
const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]');
Array.from(tooltipTriggerList).map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl));
document.querySelector<HTMLSelectElement>("#httpRoleSelect")?.addEventListener("change", refreshMethodList);
@@ -181,12 +168,6 @@ document.addEventListener("DOMContentLoaded", () => {
document.querySelector<HTMLButtonElement>("#refreshHttpPoolButton")?.addEventListener("click", () => {
void refreshHttpPool();
});
document.querySelector<HTMLButtonElement>("#copyHttpPoolButton")?.addEventListener("click", () => {
void copyTextarea("#httpPoolOutput");
});
document.querySelector<HTMLButtonElement>("#copyHttpResultButton")?.addEventListener("click", () => {
void copyTextarea("#httpResultOutput");
});
document.querySelector<HTMLButtonElement>("#clearHttpResultButton")?.addEventListener("click", clearHttpResult);
void refreshHttpOptions();
void refreshHttpPool();