fix: onboarding phase 1 follow-ups: pins, Transactions card, Import messages, docs (#384) #474
2 changed files with 6 additions and 5 deletions
|
|
@ -352,7 +352,7 @@ Phase 1 de l'accueil des nouveaux profils (#351-#357 ; analyse d'origine dans `d
|
||||||
| Transactions `/transactions` | `showsEmptyState(state)` = `totalInDb === 0`, `totalInDb` via `getTransactionCount`, lu au montage : la carte vient dès que le compte est lu, sans attendre la première page (#384, D1) | `EmptyState` dans la page | « Importer des transactions » → `/import` |
|
| Transactions `/transactions` | `showsEmptyState(state)` = `totalInDb === 0`, `totalInDb` via `getTransactionCount`, lu au montage : la carte vient dès que le compte est lu, sans attendre la première page (#384, D1) | `EmptyState` dans la page | « Importer des transactions » → `/import` |
|
||||||
| Budget `/budget` | `showsEmptyState(state)` = `totalInDb === 0`, même compteur | `EmptyState` dans la page | « Importer des transactions » → `/import` |
|
| Budget `/budget` | `showsEmptyState(state)` = `totalInDb === 0`, même compteur | `EmptyState` dans la page | « Importer des transactions » → `/import` |
|
||||||
|
|
||||||
Sur ces deux pages, le compte se lit au montage à côté des autres lectures de la page (catégories et sources de Transactions, comptes du filtre de Budget), chacune pour son compte (`Promise.allSettled`, #384) : un compte en échec laisse `totalInDb` à `null`, donc la mise en page normale, jamais l'état vide, sans priver la page de ses filtres ; le premier échec devient l'erreur de la page. Le compte n'est relu qu'au montage, aucun abonnement au canal d'événements de données : un import se fait sur `/import`, et revenir sur la page la remonte (un changement de profil remonte toutes les routes, `BrowserRouter key={refreshKey}`).
|
Sur ces deux pages, le compte se lit au montage à côté des autres lectures de la page (catégories et sources de Transactions, comptes du filtre de Budget), chaque lecture indépendante des autres (`Promise.allSettled`, #384) : un compte en échec laisse `totalInDb` à `null`, donc la mise en page normale, jamais l'état vide, sans priver la page de ses filtres ; le premier échec devient l'erreur de la page. Le compte n'est relu qu'au montage, aucun abonnement au canal d'événements de données : un import se fait sur `/import`, et revenir sur la page la remonte (un changement de profil remonte toutes les routes, `BrowserRouter key={refreshKey}`).
|
||||||
|
|
||||||
**La liste de démarrage** (`OnboardingChecklist`, dans la carte d'accueil du tableau de bord vide, et dépliée en place par « Voir la liste » du bandeau de démarrage `OnboardingBanner`, que `AppShell` pose en haut de chaque page, #397) a huit lignes dans un ordre fixe (#425). Les six étapes de données se cochent par une **donnée**, jamais par un clic ; les deux étapes de visite par « J'ai compris » (et, pour Rapports, l'ouverture de la carte Tendances mise en évidence). La source de vérité est `computeChecklist(counters, { importFolderSet, budgetAllowed, skipped, acknowledged, visitStepsInitialized })` (`utils/onboardingChecklist.ts`, pur) :
|
**La liste de démarrage** (`OnboardingChecklist`, dans la carte d'accueil du tableau de bord vide, et dépliée en place par « Voir la liste » du bandeau de démarrage `OnboardingBanner`, que `AppShell` pose en haut de chaque page, #397) a huit lignes dans un ordre fixe (#425). Les six étapes de données se cochent par une **donnée**, jamais par un clic ; les deux étapes de visite par « J'ai compris » (et, pour Rapports, l'ouverture de la carte Tendances mise en évidence). La source de vérité est `computeChecklist(counters, { importFolderSet, budgetAllowed, skipped, acknowledged, visitStepsInitialized })` (`utils/onboardingChecklist.ts`, pur) :
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -244,10 +244,11 @@ const SAMPLE_ERROR_INVALID_DATE: &str = "invalid_date";
|
||||||
/// `import_folder` is not a directory (`import_folder_missing`, without the
|
/// `import_folder` is not a directory (`import_folder_missing`, without the
|
||||||
/// path), and when either sample folder already exists
|
/// path), and when either sample folder already exists
|
||||||
/// (`sample_folder_exists:<name>`) — checked BEFORE anything is written, so an
|
/// (`sample_folder_exists:<name>`) — checked BEFORE anything is written, so an
|
||||||
/// existing folder is never touched. A write error keeps its text: the sample
|
/// existing folder is never touched. A write error keeps its English text: the
|
||||||
/// folder's name, the file name and the OS error, never a path. The command
|
/// sample folder's name (with the file's for a write) and the OS error, never
|
||||||
/// only ever receives the import folder and a date: the names of what it
|
/// the import folder's path. The command only ever receives the import folder
|
||||||
/// writes are fixed here. Returns the two folder NAMES (not paths).
|
/// and a date: the names of what it writes are fixed here. Returns the two
|
||||||
|
/// folder NAMES (not paths).
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
pub fn create_sample_import_folders(
|
pub fn create_sample_import_folders(
|
||||||
import_folder: String,
|
import_folder: String,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue