v0.1.4-pre.015-fix.002

This commit is contained in:
2026-08-16 18:20:32 +02:00
parent 05c65a12f4
commit 9ad61b40e1
25 changed files with 776 additions and 210 deletions

View File

@@ -1,7 +1,7 @@
// file: crates/ksp-app-config-desk/frontend/ts/logging.ts
// version: 3
// version: 4
//! Typed Logging editor backed exclusively by ConfigManagement validation and persistence.
//! Typed Logging editor backed by ConfigManagement persistence and KSP-owned runtime hot reload.
import { Modal } from "bootstrap";
import type { LoggingDocumentCandidateDto } from "./bindings/ksp_app_config_desk/logging/LoggingDocumentCandidateDto";
@@ -503,8 +503,8 @@ async function saveLoggingDocument(): Promise<void> {
draft.logsDirectory = inputValue("#loggingLogsDirectoryInput");
draft.defaultProfile = selectedValue("#loggingDefaultProfileSelect");
setEditorEnabled(false);
setLoggingStatus("Validation et sauvegarde atomique du document Logging...");
frontendDebug("main", "Typed Logging document persistence requested", {
setLoggingStatus("Validation, sauvegarde atomique et application hot reload du Logging...");
frontendDebug("main", "Typed Logging document persistence and runtime apply requested", {
profileCount: draft.profiles.length,
defaultProfile: draft.defaultProfile,
fileCount: draft.profiles.reduce((count, profile) => count + profile.files.length, 0),
@@ -512,21 +512,28 @@ async function saveLoggingDocument(): Promise<void> {
try {
const result = await invokeKsp<LoggingDocumentSaveResultDto>("main", "save_logging_document", { candidate: draft });
renderDocument(result.document);
setText("#loggingSaveReport", `source_changed=${result.sourceChanged} · reload_required=${result.reloadRequired} · document persisté · runtime actif inchangé`);
setText(
"#loggingSaveReport",
`source_changed=${result.sourceChanged} · reload_required=${result.reloadRequired} · runtime_applied=${result.runtimeApplied} · generation=${result.loggingGeneration} · active_profile=${result.activeProfile}`,
);
setLoggingStatus(
result.sourceChanged
? "Document Logging validé et persisté. Le subscriber actif conserve la configuration du démarrage jusqu'au redémarrage de l'application ou au hot reload de pre.016."
: "Document Logging valide mais source inchangée. Le runtime actif n'a pas été reconfiguré.",
`Document Logging validé, persisté et appliqué sans redémarrage. Runtime génération ${result.loggingGeneration}, profil ${result.activeProfile}.`,
"success",
);
frontendDebug("main", "Typed Logging document persistence completed", {
frontendDebug("main", "Typed Logging document persistence and runtime apply completed", {
sourceChanged: result.sourceChanged,
reloadRequired: result.reloadRequired,
runtimeApplied: result.runtimeApplied,
loggingGeneration: result.loggingGeneration,
activeProfile: result.activeProfile,
profileCount: result.document.profiles.length,
});
} catch {
setEditorEnabled(true);
setLoggingStatus("Candidat Logging refusé. std.logging.json reste inchangé ; corrige le brouillon puis réessaie.", "danger");
setLoggingStatus(
"Sauvegarde/application Logging refusée. Le runtime précédent est conservé ; si la persistence avait commencé, la transaction restaure la source précédente ou remonte une erreur de rollback.",
"danger",
);
}
}
@@ -562,7 +569,7 @@ async function refreshLoggingDocument(source: "startup" | "user"): Promise<void>
const documentDto = await invokeKsp<LoggingDocumentDto>("main", "get_logging_document");
renderDocument(documentDto);
setLoggingStatus(
`${documentDto.profiles.length} profil(s) Logging chargé(s). Le brouillon est synchronisé avec la source persistée ; le runtime actif reste celui du démarrage.`,
`${documentDto.profiles.length} profil(s) Logging chargé(s). Le brouillon est synchronisé avec la source persistée ; cette action ne modifie pas le runtime actif.`,
"success",
);
frontendDebug("main", "Logging document reload completed", {