Amélioration du feedback pendant les imports sur les PDF
All checks were successful
Build & Push Images / build (brain) (push) Successful in 1m38s
Build & Push Images / build (core) (push) Successful in 1m59s
Build & Push Images / build-switcher (push) Successful in 17s
Build & Push Images / build (web) (push) Successful in 1m54s

passage en 0.12.4-beta
This commit is contained in:
2026-06-12 14:35:10 +02:00
parent 14fc1c28fe
commit 8cc90bd24d
28 changed files with 364 additions and 115 deletions

View File

@@ -63,10 +63,13 @@ export interface CampaignImportApplyResult {
/**
* Évènements du flux SSE d'import streamé.
* - progress : avancement (total=0 ⇒ extraction en cours).
* - status : message d'attente lisible (fournisseur saturé → retry, morceau
* re-découpé, morceau ignoré…) — feedback live pour l'utilisateur.
* - done : arbre proposé (à réviser).
* - error : message d'erreur côté serveur.
*/
export type CampaignImportStreamEvent =
| { type: 'status'; message: string }
| {
type: 'progress';
current: number;

View File

@@ -74,6 +74,12 @@ export class CampaignImportService {
try { message = (JSON.parse(currentData) as { message?: string }).message ?? message; } catch { /* défaut */ }
terminated = true;
subscriber.error(new Error(message));
} else if (name === 'status') {
// Message d'attente lisible (fournisseur saturé, morceau re-découpé…).
try {
const obj = JSON.parse(currentData) as { message?: string };
if (obj.message) subscriber.next({ type: 'status', message: obj.message });
} catch { /* bloc malformé ignoré */ }
} else if (name === 'progress' || name === 'done') {
try {
const obj = JSON.parse(currentData);

View File

@@ -32,11 +32,14 @@ export interface RulesImportResponse {
/**
* Évènements du flux SSE d'import streamé.
* - progress : avancement (total=0 ⇒ phase d'extraction en cours).
* - status : message d'attente lisible (fournisseur saturé → retry, morceau
* re-découpé, morceau ignoré…) — feedback live pour l'utilisateur.
* - done : résultat final (sections proposées).
* - error : message d'erreur côté serveur.
*/
export type RulesImportStreamEvent =
| { type: 'progress'; current: number; total: number; pageCount: number; ocrPageCount: number; newSectionTitles: string[] }
| { type: 'status'; message: string }
| { type: 'done'; sections: Record<string, string>; pageCount: number; ocrPageCount: number }
| { type: 'error'; message: string };

View File

@@ -105,6 +105,12 @@ export class GameSystemService {
try { message = (JSON.parse(currentData) as { message?: string }).message ?? message; } catch { /* garde le défaut */ }
terminated = true;
subscriber.error(new Error(message));
} else if (name === 'status') {
// Message d'attente lisible (fournisseur saturé, morceau re-découpé…).
try {
const obj = JSON.parse(currentData) as { message?: string };
if (obj.message) subscriber.next({ type: 'status', message: obj.message });
} catch { /* bloc malformé ignoré */ }
} else if (name === 'progress' || name === 'done') {
try {
const obj = JSON.parse(currentData);