309 lines
10 KiB
Markdown
309 lines
10 KiB
Markdown
<!-- file: deltas/0.1.4/pre.008.md -->
|
|
<!-- version: 1 -->
|
|
|
|
# `0.1.4-pre.008` — Shell principal et lifecycle splash de référence
|
|
|
|
## 1. Base validée
|
|
|
|
La base `0.1.4-pre.7` a été validée localement avec :
|
|
|
|
```bash
|
|
cargo fmt --all
|
|
cargo check --workspace
|
|
cargo clippy --workspace --all-targets
|
|
cargo test -p ksp-app-config-desk
|
|
cargo test -p ksp-config-lib
|
|
cargo tree -p ksp-app-config-desk
|
|
cargo tauri dev -c crates/ksp-app-config-desk/tauri.conf.json
|
|
```
|
|
|
|
Le bridge frontend Logging est observable sous les targets `ksp-app-config-desk.frontend.splash` et `ksp-app-config-desk.frontend.main`. La fenêtre `main` est chargée mais reste volontairement invisible dans cette base, car la transition réelle appartient à `pre.008`.
|
|
|
|
## 2. Objectif
|
|
|
|
Cette tranche transforme le squelette à deux WebViews en lifecycle desktop réel et pose le shell de navigation monofenêtre de référence.
|
|
|
|
Elle introduit :
|
|
|
|
- `tw_splash.rs` et `tw_main.rs` conformément à `KSP-APP-014` ;
|
|
- un module `splash.rs` pour les timings et le DTO d'ordres frontend ;
|
|
- `splash_frontend_ready` comme commande Tauri centralisée ;
|
|
- une transition one-shot `splash -> main` ;
|
|
- affichage + focus de `main`, puis destruction de `splash` ;
|
|
- les variables Config/.env communes du splash ;
|
|
- le premier shell de navigation `Vue d'ensemble / Documents / Profils / Environnement / Logging` ;
|
|
- le wrapper frontend `invoke.ts` ;
|
|
- la règle normative de traçabilité frontend `debug`/`trace`.
|
|
|
|
Les panneaux Config fonctionnels restent hors scope jusqu'à leurs prereleases dédiées.
|
|
|
|
## 3. Version technique
|
|
|
|
La tranche modifie Rust, TypeScript, SCSS, HTML, environnement et dépendances/features :
|
|
|
|
```text
|
|
workspace.package.version = "0.1.4-pre.8"
|
|
```
|
|
|
|
## 4. Modules Tauri window
|
|
|
|
Les responsabilités sont désormais séparées :
|
|
|
|
```text
|
|
src/tw_splash.rs
|
|
- résolution/validation de la fenêtre splash
|
|
- readiness frontend
|
|
- émission des ordres frontend
|
|
- séquence de transition
|
|
- destruction du splash
|
|
|
|
src/tw_main.rs
|
|
- résolution/validation de la fenêtre main
|
|
- show + focus
|
|
|
|
src/splash.rs
|
|
- SplashSettings
|
|
- SplashOrderDto
|
|
- validation des timings
|
|
```
|
|
|
|
`tauri.rs` conserve seulement les wrappers `#[tauri::command]`, l'assemblage du Builder et le setup commun.
|
|
|
|
## 5. Origine réelle de la readiness
|
|
|
|
Le wrapper `splash_frontend_ready` reçoit directement la `tauri::WebviewWindow` injectée par Tauri. Le backend vérifie :
|
|
|
|
```text
|
|
webview_window.label() == "splash"
|
|
```
|
|
|
|
La commande ne fait donc pas confiance à un label fourni par le payload JavaScript.
|
|
|
|
Un `AtomicBool` dans `AppState` rend la séquence one-shot. Une readiness supplémentaire — notamment lors d'un reload Vite — est ignorée et journalisée au niveau `trace`.
|
|
|
|
## 6. Timings Config/.env
|
|
|
|
Deux variables communes au gabarit desk sont figées :
|
|
|
|
```text
|
|
KSP_DESK_SPLASH_MINIMUM_MS=1200
|
|
KSP_DESK_SPLASH_FADE_MS=300
|
|
```
|
|
|
|
Elles sont ajoutées à `.env.example` dans cette tranche et lues exclusivement via `ksp_config_lib::ConfigEnvironment`.
|
|
|
|
Priorité :
|
|
|
|
```text
|
|
process > .env > fallback
|
|
```
|
|
|
|
Bornes applicatives :
|
|
|
|
```text
|
|
minimum : 0 .. 60_000 ms
|
|
fade : 0 .. 10_000 ms
|
|
```
|
|
|
|
Une valeur invalide ne bloque pas Config Desk : le runtime journalise uniquement le domaine/code et utilise en mémoire les defaults `1200/300`. Rien n'est réécrit automatiquement dans `.env`.
|
|
|
|
## 7. Séquence runtime
|
|
|
|
Après installation de son listener, `splash.ts` invoque :
|
|
|
|
```text
|
|
splash_frontend_ready
|
|
```
|
|
|
|
Le backend :
|
|
|
|
1. vérifie l'origine `splash` ;
|
|
2. verrouille la séquence one-shot ;
|
|
3. émet `fade_in` avec la durée configurée ;
|
|
4. attend `KSP_DESK_SPLASH_MINIMUM_MS` ;
|
|
5. émet `fade_out` ;
|
|
6. attend la durée de fade-out ;
|
|
7. appelle `tw_main::show_and_focus` ;
|
|
8. détruit la fenêtre splash.
|
|
|
|
Aucun troisième `close delay` n'est nécessaire.
|
|
|
|
## 8. Contrat splash TS-RS
|
|
|
|
`SplashOrderDto` est exporté sous :
|
|
|
|
```text
|
|
frontend/ts/bindings/ksp_app_config_desk/splash/SplashOrderDto.ts
|
|
```
|
|
|
|
Champs :
|
|
|
|
```text
|
|
action
|
|
message
|
|
durationMs
|
|
```
|
|
|
|
Actions actuelles :
|
|
|
|
```text
|
|
fade_in
|
|
fade_out
|
|
```
|
|
|
|
Le frontend ne reçoit pas la durée minimale : elle reste une décision backend.
|
|
|
|
## 9. Shell principal
|
|
|
|
`main.html` expose les cinq routes de référence :
|
|
|
|
```text
|
|
Vue d'ensemble
|
|
Documents
|
|
Profils
|
|
Environnement / .env
|
|
Logging
|
|
```
|
|
|
|
`Vue d'ensemble` charge déjà `get_app_snapshot` et affiche :
|
|
|
|
- version de l'application ;
|
|
- nombre de descripteurs Config ;
|
|
- profil Logging actif ou fallback ;
|
|
- génération Logging ;
|
|
- état fallback Logging.
|
|
|
|
Les quatre autres routes restent des placeholders explicites jusqu'à leur tranche fonctionnelle. Aucune logique Config n'est simulée dans le frontend.
|
|
|
|
## 10. Wrapper IPC frontend
|
|
|
|
`frontend/ts/invoke.ts` centralise les appels Tauri ordinaires et trace :
|
|
|
|
```text
|
|
debug : commande demandée
|
|
trace : commande terminée
|
|
error : commande échouée
|
|
```
|
|
|
|
Le wrapper ne journalise jamais les arguments/payloads. Cette contrainte est importante avant l'arrivée des commandes `.env` et Secret.
|
|
|
|
`emit_frontend_log` continue volontairement à utiliser `invoke` directement afin de ne pas créer une récursion du bridge.
|
|
|
|
## 11. Traçabilité frontend normative
|
|
|
|
`KSP-APP-027` est ajouté :
|
|
|
|
- action utilisateur / transition significative -> `debug` ;
|
|
- rendu, remplacement DOM, étape technique fréquente -> `trace` ;
|
|
- chargement/refresh -> début + fin tracés sans payload sensible.
|
|
|
|
`main.ts` applique déjà cette règle aux clics de navigation, remplacements de vue, snapshot et statut du shell.
|
|
|
|
`splash.ts` l'applique aux listeners, ordres reçus, changements de statut et animations d'opacité.
|
|
|
|
Cette règle doit être réutilisée dans les futures applications Tauri KSP.
|
|
|
|
## 12. Tokio
|
|
|
|
Le lifecycle nécessite maintenant une temporisation async réelle. La dépendance workspace `tokio` conserve ses features existantes et ajoute seulement :
|
|
|
|
```text
|
|
time
|
|
```
|
|
|
|
`ksp-app-config-desk` consomme `tokio.workspace = true`. Aucun feature `full` n'est activé.
|
|
|
|
## 13. Erreurs applicatives
|
|
|
|
Les nouveaux codes bornés sont :
|
|
|
|
```text
|
|
config_desk.splash_setting_invalid
|
|
config_desk.splash_origin_invalid
|
|
config_desk.tauri_window_missing
|
|
config_desk.tauri_window_operation_failed
|
|
```
|
|
|
|
Les wrappers Tauri continuent de retourner uniquement `CommandErrorDto { domain, code, message }` au frontend.
|
|
|
|
## 14. Fichiers
|
|
|
|
| Fichier | Action |
|
|
|--------------------------------------------------------|--------:|
|
|
| `.env.example` | modifié |
|
|
| `Cargo.toml` | modifié |
|
|
| `crates/ksp-app-config-desk/Cargo.toml` | modifié |
|
|
| `crates/ksp-app-config-desk/src/app_state.rs` | modifié |
|
|
| `crates/ksp-app-config-desk/src/constants.rs` | modifié |
|
|
| `crates/ksp-app-config-desk/src/errors.rs` | modifié |
|
|
| `crates/ksp-app-config-desk/src/lib.rs` | modifié |
|
|
| `crates/ksp-app-config-desk/src/splash.rs` | ajouté |
|
|
| `crates/ksp-app-config-desk/src/tauri.rs` | modifié |
|
|
| `crates/ksp-app-config-desk/src/tw_main.rs` | ajouté |
|
|
| `crates/ksp-app-config-desk/src/tw_splash.rs` | ajouté |
|
|
| `crates/ksp-app-config-desk/unit_tests/splash.rs` | ajouté |
|
|
| `crates/ksp-app-config-desk/frontend/main.html` | modifié |
|
|
| `crates/ksp-app-config-desk/frontend/sass/_app.scss` | modifié |
|
|
| `crates/ksp-app-config-desk/frontend/sass/splash.scss` | modifié |
|
|
| `crates/ksp-app-config-desk/frontend/ts/invoke.ts` | ajouté |
|
|
| `crates/ksp-app-config-desk/frontend/ts/main.ts` | modifié |
|
|
| `crates/ksp-app-config-desk/frontend/ts/splash.ts` | modifié |
|
|
| `crates/ksp-app-config-desk/README.md` | modifié |
|
|
| `crates/ksp-app-config-desk/USAGE.md` | modifié |
|
|
| `crates/ksp-app-config-desk/TODO.md` | modifié |
|
|
| `docs/plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md` | modifié |
|
|
| `docs/rules/RULES_KSP.md` | modifié |
|
|
| `deltas/0.1.4/pre.008.md` | ajouté |
|
|
|
|
## 15. Validations à exécuter
|
|
|
|
Depuis la racine du workspace :
|
|
|
|
```bash
|
|
cargo fmt --all
|
|
cargo check --workspace
|
|
cargo clippy --workspace --all-targets
|
|
cargo test -p ksp-app-config-desk
|
|
cargo test -p ksp-config-lib
|
|
cargo tree -p ksp-app-config-desk
|
|
grep -n 'tokio v' <(cargo tree -p ksp-app-config-desk -e features)
|
|
cargo tauri dev -c crates/ksp-app-config-desk/tauri.conf.json
|
|
```
|
|
|
|
Vérifier ensuite :
|
|
|
|
1. le splash apparaît avec la police `Dos Amazigh` ;
|
|
2. après environ 1,2 s plus fade, `main` devient visible et reçoit le focus ;
|
|
3. `splash` est détruite ;
|
|
4. la navigation change le titre/placeholder sans recharger la WebView ;
|
|
5. avec un niveau Logging `Debug`/`Trace`, les clics et mutations du shell sont observables ;
|
|
6. une readiness splash dupliquée ne lance pas une deuxième transition ;
|
|
7. les bindings TS-RS incluent `SplashOrderDto.ts`.
|
|
|
|
Pour vérifier les variables :
|
|
|
|
```bash
|
|
KSP_DESK_SPLASH_MINIMUM_MS=3000 cargo tauri dev -c crates/ksp-app-config-desk/tauri.conf.json
|
|
```
|
|
|
|
Le splash doit rester visible sensiblement plus longtemps sans changement de code.
|
|
|
|
## 16. Contrôles réalisés dans l'environnement de préparation
|
|
|
|
L'environnement de préparation ne possède pas `cargo`/`rustc`; les commandes Rust ci-dessus restent donc à exécuter localement avant commit.
|
|
|
|
Ont été vérifiés statiquement :
|
|
|
|
- syntaxe/transpilation TypeScript des sources modifiées ;
|
|
- absence de `?`, `unwrap`, `expect`, `panic` explicite et `unsafe` dans le Rust applicatif ;
|
|
- absence de lecture directe `std::env::var*` ;
|
|
- absence d'import direct `tracing` dans l'application ;
|
|
- lignes Rust <= 160 colonnes ;
|
|
- présence commentée des deux variables dans `.env.example` ;
|
|
- structure `tw_splash` / `tw_main` ;
|
|
- ordre one-shot du lifecycle.
|
|
|
|
## 17. Suite
|
|
|
|
Après validation, `pre.009` introduira **Documents + diagnostics** à partir de l'inventaire public du registre et de la réparation raw Config déjà disponibles. DataTables sera ajouté dans cette tranche si le premier tableau Documents requiert effectivement tri, filtrage ou sélection.
|